dsh-island-overlay
DSH 的 Windows 顶部「灵动岛」:切换页面后仍然置顶显示当前会话状态(思考 / 审批 / 完成 / 失败)。

| 需要审批(常驻展开) | 完成(绿色勾) |
|---|---|
![]() |
![]() |
| 失败(红色抖动) | 平时缩成小圆点 |
|---|---|
![]() |
![]() |
多个会话同时有事时只显示优先级最高的一个,其余折成 +N:

动效(转圈、脉冲、勾线、抖动、宽度过渡)在 island-demo.html 里可以直接看,浏览器打开即可。
原理
两条腿,互不依赖第三方包:
宿主插件
lib/index.js:挂在 DSH 主进程里,监听session/event(turn/start、turn/end、approval/asked、approval/decided、tool/call),把各会话状态写进%USERPROFILE%\.dsh\dsh-island-state.json,每 3 秒心跳一次。浮层
overlay/:一个透明的置顶 Electron 窗口,每 400ms 读那个 JSON 渲染胶囊。 它复用 DSH 安装目录里的 Electron(process.execPath),所以不用另外下载 Electron; 宿主 30 秒没有心跳就先隐藏(不显示过期状态),心跳回来后自动重新显示,5 分钟都没恢复才退出。复用有个前提:安装目录里带着
resources/app.asar,Electron 会优先加载它、无视命令行给的 app 目录。所以首次启动时会把运行时硬链接一份到%LOCALAPPDATA%\dsh-island-runtime(同盘不占空间,已存在就复用),跳过app.asar、 只保留default_app.asar,浮层才跑得起来。
装到新电脑
- 把整个
dsh-island文件夹拷过去(约 40 KB,不需要node_modules)。 - 确认那台机器装了 DeepSeek Harness。
- 在文件夹里跑:
powershell -ExecutionPolicy Bypass -File install.ps1
脚本会自动找 dsh.cmd(默认在 %LOCALAPPDATA%\Programs\DeepSeek Harness\resources\runtime\cli\bin\),
然后执行 dsh plugin --profile desktop add link:<这个目录>——这会把这个目录登记成插件,
并在 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 里加上 dsh-island-overlay。
DSH 装在非默认路径时自己指定:
powershell -ExecutionPolicy Bypass -File install.ps1 -Cli "D:\...\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd"
- 重启 DSH(托盘退出后再打开)才生效。
装的是
link:,即 DSH 直接指向这个文件夹。装完别删/别移动这个文件夹,否则插件失效。
从 npm 装
已发布到 npm(dsh-island-overlay),不用拷文件夹:
dsh plugin --profile desktop add dsh-island-overlay
或者在 DSH 的「插件市场」里搜 dsh-island-overlay 安装。装完同样要重启 DSH。
设置
装好后打开 DSH 的「插件」页 → 点开 dsh-island-overlay → 页面下方就是设置卡片,改完即时生效。
可调:胶囊缩放、迷你态直径、位置(顶部居中 / 右上角 / 记住拖拽位置)、显示时机(始终 / 仅 DSH 不在前台)、 各状态收起时间、动效开关(小鲸鱼 / 脉冲 / 抖动 / 减少动效)、显示哪些状态、全屏应用时自动隐藏。
配置写在 %USERPROFILE%\.dsh\dsh-island-config.json,删掉它就回到默认值。
设置卡片走插件自己的两条同源路由(/dsh-island/config.json),带 Host/Origin/Sec-Fetch-Site 校验。
状态规则
| 事件 | 显示 |
|---|---|
turn/start |
思考(小鲸鱼 + 计时,2.5s 后缩成小图标) |
approval/asked |
等待审批(琥珀脉冲,常驻展开) |
tool/call = ask_user_question |
等待回答(同上) |
turn/end = completed |
完成(绿勾,3s 后消失) |
turn/end = error / blocked / max-tokens |
失败(红色抖动,6s 后消失) |
turn/end = aborted / interrupted / forked |
不显示,直接消失 |
多个会话同时有事时只显示优先级最高的一个(审批/回答 > 失败 > 完成 > 思考),其余用 +N 角标;最多并列显示 3 个会话,每段各自计时。
交互:拖动可移动位置(记在 ~/.dsh/dsh-island-pos.json);点一下把 DSH 拉到前台;
鼠标划过展开全文;检测到前台是全屏程序(视频/游戏)时自动隐藏。
卸载
& "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop remove dsh-island-overlay
然后重启 DSH,再把文件夹和 %LOCALAPPDATA%\dsh-island-runtime 删掉。
常见问题
安装
dsh 命令找不到 / 'dsh' 不是内部或外部命令
DSH 不会把 dsh 加进 PATH,得用完整路径:
& "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add dsh-island-overlay
装在非默认目录(比如 D:\)时,把上面路径换成你的实际位置。
install.ps1 报 dsh.cmd not found
脚本只在 %LOCALAPPDATA%\Programs、Program Files、Program Files (x86) 三个位置找 DSH。装在别处就手动指定:
powershell -ExecutionPolicy Bypass -File install.ps1 -Cli "D:\...\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd"
无法加载文件 install.ps1,因为在此系统上禁止运行脚本
Windows 默认执行策略拦脚本。加 -ExecutionPolicy Bypass(上面的命令已经带了),不要改全局策略。
需要自己装 pnpm / node 吗
不需要。DSH 自带一份 pnpm(resources\runtime\primary-runtime\dependencies\pnpm\bin\pnpm.mjs),
dsh plugin 内部用 DSH 自己的 Electron 跑它,跟系统的 node/pnpm 无关。系统里有别的 pnpm 也不会冲突。
pnpm 报 ERR_PNPM_... / 网络超时
dsh plugin 用的是你 npm 配置里的 registry。国内网络建议:
npm config get registry # 一般是 https://registry.npmmirror.com
本包在 npmmirror 已同步。若公司网络拦 npm,可临时指定源:
dsh plugin --profile desktop add dsh-island-overlay --registry=https://registry.npmmirror.com。
装完没反应
装完必须重启 DSH(托盘右键退出,再打开)。热重载不会拉起浮层。
确认 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 里有 dsh-island-overlay。
已经用 link: 装过本地目录,又想换成 npm 版
先卸再装,否则 pnpm 会把 link 改写成 npm 版本、你本地的改动就不再生效:
& "<dsh.cmd 完整路径>" plugin --profile desktop remove dsh-island-overlay
& "<dsh.cmd 完整路径>" plugin --profile desktop add dsh-island-overlay
反过来(npm 版换成本地开发)把 add dsh-island-overlay 换成 add link:<本目录绝对路径>。
运行时
状态文件在变,但屏幕上看不到胶囊
先看日志,两个文件都在 %USERPROFILE%\.dsh\:
dsh-island-plugin.log:runtime prepared+spawn ...说明浮层被拉起过; 只有skip: isElectron=false说明插件没跑在 DSH 主进程里。dsh-island-overlay.log:每次启动写start v0.2.x,之后每 60 秒一条alive。 没有start→ 浮层根本没起来。
手动起浮层验证:
& "$env:LOCALAPPDATA\dsh-island-runtime\DeepSeek Harness.exe" "<本目录>\overlay"
正常会弹出一条黑色胶囊(控制台里的 disk_cache 报错可以忽略)。
浮层起不来,日志里连 start 都没有
多半是运行时镜像不完整。删掉 %LOCALAPPDATA%\dsh-island-runtime 再重启 DSH,插件会自动重建
(同盘用硬链接,不额外占空间)。镜像里必须有 resources\default_app.asar,缺它 Electron 就不认命令行给的 app 目录。
跑一阵子自己消失了
已修(0.2.0+)。旧版在心跳短暂中断后不会恢复显示,看起来就是「消失了」。升级后:心跳断 30 秒先隐藏,
恢复后自动重新显示,连续 5 分钟没恢复才退出进程。仍复现的话看 dsh-island-overlay.log 最后几行。
点胶囊后 DSH 变成窗口化 / 反应慢
已修(0.2.0+)。旧版用 SW_RESTORE 会把最大化窗口还原;现在只在窗口最小化时才还原。
慢是因为旧版每次点击都新起一个 PowerShell,现在复用常驻的 watch.ps1(约 150–250ms)。
胶囊挡到浏览器标签页
鼠标事件是穿透的(只挡视觉,不挡点击)。想少挡:设置里把「迷你态」调小,或改用「顶部居中 → 右上角」,
或开「仅 DSH 不在前台时显示」。拖动可以直接改位置(记在 ~/.dsh/dsh-island-pos.json)。
换了显示器 / 拔了副屏后胶囊不见了
位置会被夹回最近的屏幕工作区,理论上不会跑到屏幕外。真丢了就删 ~/.dsh/dsh-island-pos.json 重启 DSH。
改了 overlay/index.html 没生效
浮层是 DSH 启动时拉起的独立进程,不热重载。改完重启 DSH,或手动 taskkill 掉浮层进程(插件 3 秒内会重拉)。
全屏看视频 / 打游戏时胶囊还在 设置里开「全屏应用时自动隐藏」。注意它只认「窗口铺满整块屏幕」,最大化窗口不算全屏。 少数独占全屏的游戏连置顶窗口都能盖住,这是 Windows 的限制,插件绕不过去。
多个 DSH 实例会不会叠出两个胶囊 不会,浮层有单实例锁,第二个实例直接退出。




No comments yet. Be the first to write one.