npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-todo-float-ball

v0.12.3

Published

让 AI 的任务清单常驻眼前:悬浮球显示完成数/总数与进度环,点开看完整清单,支持多会话固定、胶囊模式、六款皮肤。| Keep the agent's todo list always visible: a draggable ball with live done/total and progress ring, expandable list, multi-session pins, six skins.

Readme

dsh-todo-float-ball

把 AI 干活的任务清单常驻挂在一个悬浮球上 —— DeepSeek Harness(DSH)进度悬浮球插件。

让 AI 的任务清单跑出侧栏,常驻在你眼前。

English | 简体中文

悬浮球展开面板

展开态:左上角 7/8 胶囊显示总进度;主区按状态列出全部任务(✓ 已完成绿勾 / ▶ 进行中橙脉动),已折叠的历史分组可点击展开,「一键清理全部历史」;底部一行提示「⚠ 还有 1 项未完成」。右侧是「固定会话」区。

悬浮球收起态

收起态:球体显示 7/8 进度分数,清单以窄条形态贴着屏幕边缘常驻,不挡内容。

这是什么?

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.11.0) | 📌 固定会话与当前对话走同一个历史渲染器(两个折叠行、🧹、♻️、按会话独立的开合与操作归属);面板头部新增 ⇄ 按钮,可在【上下堆叠】与【左右并排】之间切换,并带列标题 |

固定会话与面板布局(v0.11.0)

  • 一套渲染器,两种清单——当前对话与每个 📌 固定会话都由同一个 historySectionHtml() 渲染:最新快照平铺,其后是 ▾ 已完成历史(N 条) 与 ▸ 被抛弃的历史任务(M 条),每个折叠行自带 🧹,另有 🧹 一键清理全部历史 与 ♻️ 一键恢复全部隐藏的历史。固定会话面板是从本版本起才拿到后两行的。
  • 状态按会话隔离——折叠开合与隐藏记录都以会话 id 为键,在 A 会话里展开或清理不会影响 B 会话;每个操作行都带着它所属会话的 data-ownsid。
  • 快照边界稳定——快照/历史的切分先按未过滤的原始列表取 snapLen,再各自过滤隐藏行,隐藏一条快照行不会再把历史行顶进快照区、也不会改变折叠计数。
  • ⇄ 布局切换——上下堆叠(当前清单在上、固定会话在下)⇄ 左右并排(左列当前清单、右列固定会话);偏好写入 localStorage["dsh-todo-float-ball-layout"],下次打开自动恢复。
  • 列标题——左右并排时左列显示当前对话标题(与头部同源同步),右列显示 📌 固定会话;上下堆叠时列标题隐藏,视觉与之前完全一致。

历史归档与面板管理(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":"<已安装 package.json 里的版本号>"}

实现原理

官方的 todo 数据是一条会话投影(session projection):

  1. @deepseek-ai/dsh-tool-todo 注册 todo_write 工具,并在 sessionProjections 上登记 todos 投影单元;每次调用向会话日志追加一条 todo/write 快照;
  2. @deepseek-ai/dsh-client-connection 把当前值以控制帧广播:{type:"projection", sessionId, key:"todos", value:[{content,status}...]};
  3. @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