悬浮球常驻显示 AI 会话的任务清单进度:六种皮肤(星云流光/宝石/顶弧、石墨、蓝宝石、玻璃)、外环进度环、多会话固定监控、面板内改名,数据实时同步。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-todo-float-ball
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:loyalchiiina/dsh-todo-float-ball
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
把 AI 干活的任务清单常驻挂在一个悬浮球上 —— DeepSeek Harness(DSH)进度悬浮球插件。
English | 简体中文
这是什么?
DSH 里的 AI 在推进多步骤任务时,会用内置的 todo_write 工具记录任务清单。官方界面把这份清单渲染成输入框上方的一条进度条——但它很容易被忽略、会随着对话滚动走远、而且 AI 还在干活时它默认是折叠的。
dsh-todo-float-ball 把这份清单镜像到一个小的、常驻的、可拖动的悬浮球上:
- 悬浮球始终固定在窗口角落(默认右下角);
- 球面实时显示进度:
完成数/总数,下方滚动显示当前进行中的任务名; - 点击展开完整任务面板,再点一下(或按
Esc)收起; - 颜色一眼看状态:橙色脉动 = 正在干活,绿色 = 全部完成,蓝色 = 只有待办,灰色 = 暂无清单。
它是一个纯只读的伴生插件:不修改官方面板、不改对话流、不碰任何其他插件的实现。
功能清单
| 功能 | 说明 |
|---|---|
| 常驻悬浮球 | 始终在视口内可见,可拖到任意位置,位置存 localStorage 重启后恢复(保存了越界旧位置会自动拉回视口内,防"球丢了") |
| 实时进度 | 球面显示 完成数/总数 + 当前第一个进行中任务的内容(超长截断),随 todo_write 实时刷新 |
| 折叠/展开 | 点球切换任务面板;面板在球旁边弹出,靠边时自动翻到另一侧 |
| 状态颜色 | 每项带状态图标与配色:✓ 已完成(绿色+删除线)、▶ 进行中(橙色)、○ 待办(灰色虚线圈);球本身:橙色脉动/绿/蓝/灰 |
| 数据双路同步 | 主路:MutationObserver 监听官方 todo 面板 DOM;辅路:包装 fetch 与 WebSocket.onmessage,被动捕获会话投影帧 {type:"projection", key:"todos", ...}——官方面板折叠时也能拿到完整清单 |
| Shadow DOM 样式隔离 | 全部 UI 在 open Shadow DOM 内并加 all:initial——样式不进不出,主题/皮肤插件互不干扰 |
| 双端可用 | DSH Desktop 桌面端(Electron 窗口)与网页端(浏览器)同一份代码通用;UI 挂载在 <html> 根节点,规避 transform 导致的 position:fixed 失效 |
| 隐私友好 | 零遥测、零数据上传。宿主端只注册一个仅限本机回环访问的健康检查路由(/dsh-todo-float-ball/health) |
| 纪律注入(v0.9.0) | 宿主端向每次会话的系统提示注入 5 条最硬的 todo 纪律(约 340 字,order=190)——装上插件即生效,无需加载任何技能;可用 injectDiscipline: false 关闭 |
| 历史归档与面板管理(v0.10.0) | 快照合并不再冲掉旧任务——旧任务进入可折叠的历史归档;行级 ✕ 隐藏、两个独立折叠行、🧹 批量清理、♻️ 一键恢复、📋 整行复制;球面计数只反映最新快照 |
历史归档与面板管理(v0.10.0)
一个长任务里计划会被反复重写。v0.10.0 起面板把最新快照作为当前清单, 更早的条目不再被丢弃,而是归档进历史:
- 合并而非替换——新快照更新会话桶开头
snapLen行,旧记录里不属于新快照的条目追加在其后,旧任务永不消失。 - 统计口径 = 当前计划——球面
完成数/总数、进度环、头部汇总、「还有 N 项未完成」提示全部只统计最新快照(snapshotList());历史是纯档案,不进任何计数。 - 行级隐藏(✕)——悬停历史行点 ✕ 即隐藏。隐藏记录按会话存在
localStorage(dsh-todo-float-ball-hidden-v1),数据层零改动。固定会话(📌)的行独立隐藏——会话 A 的隐藏记录绝不会隐藏会话 B 的行(data-ownsid归属过滤)。 - 两个折叠行——
▾ 已完成历史(N 条)与▸ 被抛弃的历史任务(M 条)是独立折叠行(默认收起);最新快照始终完整平铺。 - 批量清理(🧹)——每个折叠行带 🧹 清本区按钮,另有
🧹 一键清理全部历史(X 条)一行同时清两区。 - 一键恢复(♻️)——
♻️ 一键恢复全部隐藏的历史(X 条)仅在有隐藏条目时出现,一次恢复本会话全部隐藏行。 - 整行复制(📋)——复制完整任务文本(非 80 字显示截断),带真实 ✓/⚠ 反馈。
纪律注入(v0.9.0)
DSH 的技能是按需加载的:一个会话若从未加载 todo-show-discipline 技能,就完全不带 todo 纪律。v0.9.0 起,宿主端会向每次会话的系统提示注入一段稳定的「todo 纪律」段落,因此装上插件就等于纪律常驻——与技能是否加载、用哪个预设、桌面端还是网页端都无关。
- 默认开启(不写
config即为开)。 - 关闭:在
cordis.patch.yml(或 profile 的 patch 层)给本插件加config: { injectDiscipline: false },重启 DSH 生效。 - 只有显式布尔
false才关闭;"false"/0/ 拼错 / 缺config一律保持开启(防误关)。 - 注入文本刻意精简(系统提示每会话都占 token),完整规则仍留在
todo-show-discipline技能里;该技能在装了本插件后默认不再随会话加载(disable-model-invocation: true)以避免重复占 token,未装本插件时可恢复启用。
安装
本插件是标准 DSH npm 包(自带 dsh.bundle 声明)。两种方式:
从 npm 安装(发布后)
npm install dsh-todo-float-ball
然后在你所用 profile 的 package.json(如 %USERPROFILE%\.dsh\profiles\desktop\package.json)里,把 "dsh-todo-float-ball" 同时加进 dependencies 和 dsh.profile.bundles,重启 DSH 生效。
手动安装
把本包目录整体复制进 profile 的 node_modules(必须是真实目录复制——不要用 link: / file: 依赖,会触发 DSH 安装恢复死循环),按上面同样方式注册后重启。
重启后右下角应出现悬浮球。可用下面的地址验证宿主端已挂载:
http://127.0.0.1:43120/dsh-todo-float-ball/health
→ {"ok":true,"plugin":"dsh-todo-float-ball","version":"0.1.0"}
实现原理
官方的 todo 数据是一条会话投影(session projection):
@deepseek-ai/dsh-tool-todo注册todo_write工具,并在sessionProjections上登记todos投影单元;每次调用向会话日志追加一条todo/write快照;@deepseek-ai/dsh-client-connection把当前值以控制帧广播:{type:"projection", sessionId, key:"todos", value:[{content,status}...]};@deepseek-ai/dsh-client-ui-conversation把它渲染成输入框上方的任务条([data-testid="todo-panel"])。
本插件在两端各挂一个只读探针,不碰任何一端:
- 主路(DOM):一个带 200ms 防抖的
MutationObserver盯着[data-testid="todo-panel"]——面板展开时读li[data-status]全量清单;折叠时解析本地化的计数文案(如"1 完成 · 2 进行中",含中文数字解析)。 - 辅路(传输层):一次性、防御式的
window.fetch包装(clone 响应、只处理文本/JSON)与WebSocket.prototype.onmessage包装(文本帧),把每个载荷送进严格的提取器——只对形如投影帧、todo/write事件、{todos:[...]}快照的对象起反应,其余一律忽略,绝不回写。
所有通道汇入同一个归一化器:过滤出三种合法状态、丢弃空内容、列表无变化时零开销跳过(签名比对)。
常见问题
悬浮球不出现?
先开上面的 health 地址:能返回说明宿主端正常,是客户端 bundle 没加载(查 DSH 日志有无 loaded without registering,bundle id 必须与包名一致);不能返回说明插件没进 profile 的 bundles 列表。
能移动悬浮球吗? 能,拖到哪都行。位置按浏览器/渲染进程分别记忆;万一保存的位置跑到屏幕外,启动时会自动拉回视口内。
官方面板折叠时也能同步吗? 能。这正是辅路存在的意义:官方面板折叠时只渲染计数文案,而投影帧始终携带完整清单。
会拖慢界面吗?
不会。观察器 200ms 防抖;传输层窃听先做 "todos" 字符串预筛再解析;兜底看门狗跑约 10 分钟后自动停止。
兼容性
- DSH Desktop 2.x(desktop profile)与 DSH web(web profile)
- 无
peerDependencies——插件自包含,只通过公开 DOM/HTTP 面与 DSH 交互
License
MIT
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 7488
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 7488
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
omdsh-dev/DSH-better-sidebar★ 3555
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
ccch1mneyyy/dsh-TUI★ 2994
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 2274
右下角常驻的小鲸鱼余额挂件:显示余额、今日已用、每轮对话消耗与随机台词,带音效与设置菜单。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1072
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。