🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话刘海 iArxic/dsh-agents-notch

DeepSeek Harness
iArxic3 天前有提交已提供中文文档扫描:含敏感能力

常驻置顶的 DeepSeek Harness 刘海条,显示哪些会话正在运行、哪些需要你处理、哪些已完成。支持 Windows。

33.6/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add iArxic/dsh-agents-notch
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · other
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 42 处,展示前 38 条)
  • 读取本地文件
    lib/host-0.1.9.js:285
    const info = statSync(panePath);
  • 写入本地文件
    lib/host-0.1.9.js:402
    mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    lib/host-0.1.9.js:403
    appendFileSync(reportPath, `${JSON.stringify({ at: new Date().toISOString(), event, ...extra })}\n`);
  • 读取本地文件
    lib/host-0.1.9.js:436
    if (!existsSync(manualPath)) return new Map();
  • 读取本地文件
    lib/host-0.1.9.js:437
    const parsed = JSON.parse(readFileSync(manualPath, "utf8"));
  • 发起网络请求
    lib/host-0.1.9.js:491
    response = await fetch(url, { signal: AbortSignal.timeout(2000) });
  • 写入本地文件
    lib/host-0.1.9.js:701
    mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    lib/host-0.1.9.js:703
    writeFileSync(temp, JSON.stringify(state));
  • 写入本地文件
    lib/host-0.1.9.js:707
    renameSync(temp, statePath);
  • 发起网络请求
    lib/host-0.1.9.js:774
    const response = await fetch(base, {
  • 读取本地文件
    lib/host-0.1.9.js:1016
    if (!existsSync(quitPath)) return null;
  • 读取本地文件
    lib/host-0.1.9.js:1017
    const parsed = JSON.parse(readFileSync(quitPath, "utf8"));
  • 读取本地文件
    lib/host-0.1.9.js:1034
    if (!existsSync(file)) return false;
  • 写入本地文件
    lib/host-0.1.9.js:1209
    mkdirSync(bundleDir, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/host-0.1.9.js:1214
    const spawned = spawn(found.path, ["--state", statePath, "--parent-pid", String(process.pid)], {
  • 发起网络请求
    lib/client.js:128
    fetch(ROUTE, { headers: { accept: "application/json" } })
  • 发起网络请求
    lib/client.js:149
    fetch(ROUTE, {
  • 发起网络请求
    lib/client.js:168
    fetch(ROUTE, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ reset: true }) })
  • 发起网络请求
    lib/client.js:252
    fetch(OPEN_ROUTE, {
  • 发起网络请求
    lib/client.js:261
    fetch(OPEN_ROUTE, { headers: { accept: "application/json" }, cache: "no-store" })
  • 读取本地文件
    lib/exe.js:80
    const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
  • 读取本地文件
    lib/exe.js:97
    const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
  • 写入本地文件
    lib/fetch-exe.js:99
    await mkdir(dirname(dest), { recursive: true });
  • 写入本地文件
    lib/fetch-exe.js:102
    await pipeline(Readable.fromWeb(response.body), createWriteStream(part));
  • 删除本地文件
    lib/fetch-exe.js:117
    await rm(part, { force: true });
  • 删除本地文件
    lib/fetch-exe.js:123
    await rm(part, { force: true });
  • 删除本地文件
    lib/fetch-exe.js:129
    await rm(part, { force: true });
  • 删除本地文件
    lib/fetch-exe.js:136
    await rm(part, { force: true });
  • 写入本地文件
    lib/fetch-exe.js:142
    await rename(part, dest);
  • 读取本地文件
    lib/fetch-exe.js:143
    const { size } = await stat(dest);
  • 删除本地文件
    lib/fetch-exe.js:146
    await rm(part, { force: true }).catch(() => {});
  • 读取本地文件
    lib/settings-store.js:150
    if (!existsSync(file)) return {};
  • 读取本地文件
    lib/settings-store.js:151
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    lib/settings-store.js:242
    writeFileSync(tmp, `${JSON.stringify(normalised, null, "\t")}\n`, "utf8");
  • 写入本地文件
    lib/settings-store.js:243
    renameSync(tmp, file);
  • 读取本地文件
    lib/settings-store.js:258
    if (!existsSync(file)) return true;
  • 写入本地文件
    lib/settings-store.js:259
    writeFileSync(`${file}.tmp`, "{}\n", "utf8");
  • 写入本地文件
    lib/settings-store.js:260
    renameSync(`${file}.tmp`, file);
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
Agents Notch:屏幕顶部垂下一个深色刘海,展开后变成一块面板——一个大机器人戴着琥珀色圆环,因为它的会话需要你,旁边是原因和一个 Open 按钮,下面列出其他会话 一个常驻置顶的刘海,为 DeepSeek Harness 而生,只回答一个问题:我的哪个会话现在需要我? 安装 · 显示什么 · 配置 · 限制 · 开发 · 中文 三个机器人在干活,光沿着标签流动;其中一个停在你身上,标签长成一条提醒,带上原因和 Open 按钮;面板在它上面展开;它回去干活,面板收起,然后它完成——标签显示一条简短的「done」提示 从窗口本身录制(--record),逐帧录下——不是模拟图。 为什么 如果你同时跑好几个会话,想知道有没有东西在等你,每次都得切换一次上下文: | 你现在怎么做 | 代价是什么 | | 在窗口之间 alt-tab,逐个读侧边栏 | 你手头正在做的事,每次都丢 | | 等桌面通知 | 每个会话一条,而且没一条说清哪个卡住了 | | 让侧边栏一直可见 | 只有应用在前台时才可见——而那正是你不需要它的时候 | 刘海是一个小小的置顶标签,从不抢焦点,在全屏应用下会隐藏,并且显示侧边栏在你身处别的窗口时做不到的一件事:某个会话卡在你身上。
展开完整文档(README 剩余 1 节)
Agents Notch:屏幕顶部垂下一个深色刘海,展开后变成一块面板——一个大机器人戴着琥珀色圆环,因为它的会话需要你,旁边是原因和一个 Open 按钮,下面列出其他会话

一个常驻置顶的刘海,为 DeepSeek Harness 而生,只回答一个问题:我的哪个会话现在需要我?

安装 · 显示什么 · 配置 · 限制 · 开发 · 中文

三个机器人在干活,光沿着标签流动;其中一个停在你身上,标签长成一条提醒,带上原因和 Open 按钮;面板在它上面展开;它回去干活,面板收起,然后它完成——标签显示一条简短的「done」提示

从窗口本身录制(--record),逐帧录下——不是模拟图。

为什么

如果你同时跑好几个会话,想知道有没有东西在等你,每次都得切换一次上下文:

| 你现在怎么做 | 代价是什么 |
| 在窗口之间 alt-tab,逐个读侧边栏 | 你手头正在做的事,每次都丢 |
| 等桌面通知 | 每个会话一条,而且没一条说清哪个卡住了 |
| 让侧边栏一直可见 | 只有应用在前台时才可见——而那正是你不需要它的时候 |

刘海是一个小小的置顶标签,从不抢焦点,在全屏应用下会隐藏,并且显示侧边栏在你身处别的窗口时做不到的一件事:某个会话卡在你身上。一旦有会话卡住,标签就长成一条提醒,说明原因,并带一个 Open 按钮,把应用切到那个会话——不管它在哪,最小化了还是在托盘里。而且它从不挡路:鼠标划过,它淡出并让你的点击穿透;停在上面,面板就展开。

显示什么

四张卡片,对应折叠标签的四种状态:工作中(蓝色弧线转动)、需要你(琥珀色圆环)、完成(绿色圆环和 ^^ 表情)、失败(红色圆环和 x x 表情)

这一条就是全部视觉语言。工作中只戴一条缓慢转动的蓝色弧线,别的什么都没有,因为工作状态是安静的默认值——只要有会话正在运行工具,标签页下沿就会亮起一道光。需要你 是琥珀色,完成 是绿色,失败 是红色。每个会话在机器人边缘都保留自己的颜色,所以三个会话读起来就是三个会话,而不是同一个会话的三份拷贝。

它从不挡路

两张卡片:指针掠过标签页时,它淡成幽灵,点击直接落到下面的应用上;指针停在上面时,面板展开

标签页待在你伸手去够标签页和标题栏的位置,所以它会主动让开。指针掠过它时,它变成淡淡的幽灵,点击直接穿过去——落到下面的浏览器标签页或菜单上。只有指针停留在那里 1.6 秒,面板才会展开;把指针推到屏幕顶边,它会立刻打开。这三项都是设置(hoverMode、holdMs、topEdgeOpens);open 会恢复悬停展开。

标签页会开口说话

标签页长成的三种提醒:需要你(原因和一个琥珀色的 Open 按钮)、失败(会话和它最后运行的工具,带 Open)、完成(一条简短通知,带会话标题)

有新情况发生时——会话找你、失败或完成——标签页会长成一条提醒,几秒后再折回去。Open 直接带你到那个会话。只播报新鲜事件:等了一小时的问题留在面板上,不会怼到你脸上。

面板

展开的面板:顶部是大机器人和它所在会话的标题、项目、时长和上下文,以及它当前的工具和步骤;下方是可滚动的列表,列出其他每个会话,各带一个小机器人、正在做什么和多久之前

把指针停在标签页上,或推到屏幕顶部,面板就会展开。最上面是最近发生变化的会话,所以完成或提问会最先映入眼帘:它的标题、项目、时长、上下文有多满,以及一行它正在做什么——正在运行的工具和步骤、完整展示它正在问的问题,或者它是怎么结束的。下面用一张列表列出其他每个会话:一句话说它在做什么,以及多久之前。会话多到放不下?列表可以滚动。

单击某一行,把那个会话放到大机器人上。双击某一行,或按 Open ↗,应用就切换到它。已完成或失败的行带一个 ✕,可以把它关掉——和在应用里勾掉它一样。

十六张脸

大机器人各种表情的网格,每张都处在佩戴它的状态:专注、思考、坚定、疲惫、瞥视、困惑、眩晕、爱心、恳求、偷看、^^、星星眼、眨眼、x x 和睡着——每张都标注了它出现的时机

机器人的脸就是状态,凑近看。工作中的机器人专注在某个工具上,在工具之间思考,长时间忙碌时坚定,半小时后疲惫;工具刚失败时困惑,接连失败时晕头转向。需要你时它会恳求,干完活会眯起 ^^,宿主安静下来就睡着。它会眨眼,眼睛跟着你的指针转,每次状态变化播放一小段动作——只播一次,然后歇着。一块板子要是老在庆祝一小时前就结束的事,那就是噪音。

🫥 从不挡路 从不抢焦点,你划过时它让到一边:淡出,你的点击直接穿过去。桌面上没有阴影。全屏应用下自动隐藏。

↗️ 打开就跳过去 打开或双击,DeepSeek Harness 切到那个会话并带到前台——从任务栏或托盘里出来。

📏 数字不糊弄 没有真实预算就不显示上下文百分比,没有时间戳就不写「2m ago」,宿主停止响应时标签变灰。

🎛️ 有自己的设置面板 设置 → Agents Notch:大小、锚点、显示、行数、不透明度、动效、对指针的反应,以及弹出哪些提醒。改动下一个 tick 生效——什么都不用重启。

🧘 尊重减少动效 motion: auto 跟随 Windows。关掉后只显示各状态的静止表情,别的没有。

📦 一条命令,无需运行时 约 30 KB 的 JavaScript。窗口自己从对应的 GitHub release 拉取,校验哈希——单个自包含文件,不用装 .NET。

环境要求

- Windows 10/11,x64。 窗口是 WPF 和 Win32(置顶、不激活、全屏检测):没有 macOS 或 Linux 版本。package.json 声明了 "os": ["win32"]。
- DeepSeek Harness。 在 0.2.1-rc.2 上构建并验证。宿主那一半读取 session/event({ global: true })、ctx.webServer、ctx.agents 和 sessionQuery,应用内那一半使用 uiWorkspace;旧版本可能缺其中某个。挂载前不做任何检查——见限制。
- 插件需要 Node ≥ 22。无需 .NET 运行时:发布的窗口是自包含的。
- 可选:session-finished 插件,它负责让完成的行退场(什么能挣到一行)。

安装

dsh plugin --profile web add dsh-agents-notch

在别的配置档下运行 harness?把 web 换成它的名字。

插件约 30 KB。首次运行时,它从本仓库的 GitHub release 下载窗口(一个 65 MB 的文件,不需要 .NET 运行时),并对照公布的 SHA-256 校验。几秒后刘海在屏幕顶部。

没有刘海? 看 $DSH_HOME\state\agents-notch\host-report.jsonl 的最后一行:那里写明了宿主在哪儿找窗口、下载是否成功,以及修复用的命令。

配置

刘海有自己的设置面板:Settings → Agents Notch。 尺寸、锚点、显示器、行数、不透明度、动效和文字开关都在那儿,改动立刻生效——窗口在下一个 tick 重新读取状态,不用重启。

三层决定一个值,每层都压过上一层:

1. 内置默认值;
2. 插件行的 config:——你编辑的文件,没人会覆盖它;
3. $DSH_HOME/state/agents-notch/settings.json,由面板写入,一次点击改一项。

两个入口受同一套规则约束,所以滑块和 YAML 行效果完全一样。面板里的 Reset 清掉第三层,又由插件行说了算。面板单独存一个文件,因为浏览器没法安全地改写其他会话也在编辑的 YAML。

所有键,以及如何在 YAML 里设置

默认值在包自带的 cordis.patch.yml 里。要改某一项,就在配置档的补丁层($DSH_HOME/profiles/web/cordis.patch.yml)放一行相同 id 的行——不带 insert: 的行就是对已有行的覆盖:

- id: agents-notch
config:
contextBudget: 1000000 # your route's context window, in tokens
anchor: top-right
scale: 1.25

| 键 | 默认值 | 含义 |
| spawnWindow | true | false 让宿主不带窗口运行——测试时有用 |
| pollMs | 340 | 多久重建一次状态文件 |
| maxRows | 6 | 3–10,看板在列表滚动前显示多少个会话 |
| contextBudget | null | 你这条路由的上下文窗口,单位 token;null = 未知(见下文) |
| contextHotAt | 0.5 | 进度条变琥珀色的比例——路由的压缩触发点 |
| anchor | top-center | top-center · top-left · top-right |
| screen | primary | primary · cursor · 1 · 2 …(按 Windows 的编号) |
| scale | 1 | 0.75–2 |
| hideFullscreen | true | 全屏应用下隐藏 |
| opacity | 1 | 0.35–1,刘海挡在桌面前面的程度 |
| motion | auto | auto 跟随 Windows 的减少动效设置;on 强制动画,off 只画每个状态的静止画面,别的都不画 |
| showProject | true | 标题副行里的项目名 |
| showDone | true | false 让已完成的会话完全不上看板(也不计入数量) |
| hoverMode | ghost | ghost:标签淡出、点击穿透,直到指针停在上面;open:悬停立刻展开看板 |
| holdMs | 1600 | 500–4000,指针在标签上停多久看板才展开 |
| topEdgeOpens | true | 把指针顶到标签上方的屏幕边缘,就能打开它,不用等 |
| ghostOpacity | 0.18 | 0.05–0.6,标签让开时淡到什么程度 |
| alerts | all | 标签上的弹窗:all、needs-you(只提示提问和失败)或 off |
| finishedFallbackMs | 900000 | 没有 session-finished 时,已结束的行能保留多久 |
| stateDir | $DSH_HOME/state/agents-notch | 状态文件、日志和窗口存放的位置 |
| exePath | — | 强制指定某个窗口二进制 |
| autoDownload | true | 窗口缺失时从 release 下载 |
| downloadUrl | — | 改从镜像下载,不走 release |

实话实说的数字

contextBudget 不是猜出来的。上下文窗口属于模型路由,会话数据流里没有任何字段携带它,所以这个插件默认把它设为 null——设为 null 时,你只看到 token 数,没有百分比、没有进度条、也没有琥珀色。拿一个编出来的分母算百分比,是伪装成信息的谎言,比带单位的数字更糟。

同一块面板,没有预算:副行只写多少 token,没有进度条

把它设成你路由的真实窗口(这个构建的 DeepSeek V4 路由是 1000000),百分比和进度条就会出现。

什么才配占一行

会话能上面板,是因为它身上出了事:它在干活、卡在审批或提问上、失败了,或者已经结束但你还没收尾。光开着永远不配占一行,挂了多少会话都一样。

已结束和已失败的行不按计时器过期。它们什么时候走,由 harness 自己的收尾判定说了算——就是 session-finished 插件放在侧边栏里的那个 ✓,通过该插件的 HTTP 路由读取;或者你点行上的 ✕。没装那个插件的话,这个插件探测失败三次后就会察觉,改为 15 分钟后清掉已结束的行,并在报告(host-report.jsonl)里说明。

宿主不再应答时,面板也不装了——标签变灰,机器人睡着,副行标出最后一次心跳的时间,而不是重复一段没人更新的摘要:

宿主离线:标签变灰,机器人睡着,面板写明上次收到宿主消息是什么时候

局限,直说

- 仅限 Windows,x64。没有 macOS 或 Linux 构建,也没有半成品。
- manifest 里没声明 DSH 版本,所以装错了也没东西拦着。它是在 0.2.1-rc.2 上构建和测试的;如果你的构建缺了某个字段,宿主会继续服务,日志会写明哪里失败了,而不是让标签撒谎。
- 打开需要应用自己的窗口。 它通过插件的应用内那一半来切换会话,所以应用必须处于运行状态;刘海能把窗口从任务栏或托盘调回来,但没法启动应用。
- session-finished 可选,但建议加上 —— 不加的话,已结束的会话会一直留到 15 分钟兜底超时才消失。
- 窗口不能拖动,这是有意为之:它是固定在屏幕顶部的一块面板,可拖动的版本曾被人误拖走。要挪位置,用 anchor 和 screen。
- 两个窗口不能共存 —— 命名互斥量会让第二个实例直接退出。
- 二进制没有签名,所以第一次运行时 SmartScreen 会警告。
- 从托盘退出只是一小时内的关闭,不是永久退出:宿主会把刘海重新拉回来,因为一块可能被误关掉的状态板,比一块会自动回来的更糟。

卸载

dsh plugin --profile web remove dsh-agents-notch
Remove-Item -Recurse "$env:DSH_HOME\state\agents-notch" # state, logs, window binary, unpack cache

开发

npm test # 65 tests, node --test, no harness, no window, no network
npm run window:build # dotnet build desktop/AgentsNotch.csproj -c Release
npm run window:publish # self-contained single file + SHA256 into dist/win-x64

a still of the board, from a fixture, without a harness:
desktop/bin/Release/net9.0-windows/AgentsNotch.exe --state desktop/fixtures/working.json --open --shot dist/shots/working.png

窗口支持 --shot、--record、--open、--freeze、--face <name>、--island x1|x4|d1、--log、--fps、--no-effects 和 --probe-rect,desktop/fixtures/ 里放着 schema-4 状态文件,所以不用跑宿主,也能把每种状态、表情和提醒拍下来。这份 README 里的每张图都由窗口自己绘制:python tools/readme-media.py shots|record|art 负责渲染静帧、按窗口自己的时钟逐帧录制演示,再把它们排版。

手动安装窗口(离线,或用自己的构建):在插件行里设 autoDownload: false 关掉下载,用 downloadUrl: <url> 指向镜像,再用 tools/install-window.ps1 -Url <release asset> 或 -FromPath dist\win-x64 把窗口放到宿主查找的位置。

- docs/CONTRACT.md —— 两半之间的接口;已冻结,两半代码和测试都按它编写。
- docs/INTERNALS.md —— 工程记录:每个决定了形态的测量,以及每个都花掉一天的坑。你要改东西的话,这是这里最有用的文件。
- CHANGELOG.md —— 每个版本改了什么。
- docs/PUBLISHING.md —— 发版检查清单。

Agents Notch 是一个 DeepSeek Harness 插件:在屏幕顶部挂一个始终置顶的“刘海”,每个会话一个小机器人,一眼就能看出 哪个会话正在等你。

- 工作中是缓慢转动的蓝色弧线,正在调用工具时标签底边会有光流过;需要你是琥珀色光圈;完成是绿色光圈和 ^^ 表情;失败是红色光圈和 x x 表情。
- 有会话需要你、失败或完成时,标签会短暂展开成提示,显示原因和 Open 按钮——一键切换到该会话,即使应用最小化或在托盘里。
- 从不挡路:鼠标经过时标签变成半透明,点击直接穿透到下面的窗口;停留 1.6 秒(或把鼠标推到屏幕顶边)才展开面板:最新变化的会话在顶部(标题、项目、上下文用量、正在运行的工具或等待的问题),其余会话列在下方,超出时可滚动。单击一行在大机器人上查看,双击或 Open ↗ 切换到该会话。
- 机器人有十六种表情:思考、专注、疲惫、困惑、恳求、完成、睡着……
- 从不抢焦点,全屏应用下自动隐藏;没有真实的上下文预算就不显示百分比,宿主断开时标签变灰并注明最后心跳时间。
- 设置 → Agents Notch 有独立设置页:大小、位置、显示器、行数、不透明度、动效、悬停方式、提示类型,修改即时生效。

dsh plugin --profile web add dsh-agents-notch

仅支持 Windows 10/11 x64。插件本体约 30 KB,首次运行时会从对应版本的 GitHub Release 自动下载窗口程序并校验 SHA256,无需安装 .NET 运行时。

MIT — see LICENSE · made for DeepSeek Harness by iArxic
预览分享卡片长什么样 ↓iArxic/dsh-agents-notch
分享 · DeepSeek Harness Hub
iArxic/dsh-agents-notch

常驻置顶的 DeepSeek Harness 刘海条,显示哪些会话正在运行、哪些需要你处理、哪些已完成。支持 Windows。

这是你的仓库?认领条目

回到顶部