前言¶
DeepSeek Harness(简称 dsh)把模型、工具、会话、沙箱和界面都做成可替换插件,官方口号就是「一切皆插件」。实际用起来,agent 往往会连续思考、调工具、再思考,终端或 Web 界面上却只剩一句静态的「正在工作」。你知道它没死掉,但不知道此刻是在读文件、跑测试,还是卡在某条 bash 命令上。
working-activity 就是冲着这件事来的。它把会话事件收成一条实时「工作状态行」:正在跑什么工具、想了多久、收尾用了几把工具,都可以直接看见。仓库由 chimney(GitHub:ccch1mneyyy)维护,社区出品,不是 DeepSeek 官方项目。同一套想法还做了 pi CLI 版本,两个 npm 包独立发布。本文只写 DeepSeek Harness 这一侧。
社区插件目录 https://deepseek-harness-plugin.com 是独立站点,和 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。截至 2026-08-17,GitHub 仓库 ccch1mneyyy/working-activity 为 646 星;目录页分类为「开发与运行时」,npm 包 dsh-working-activity 当前版本 0.2.6。
这是什么¶
一句话:它是一条由会话事件驱动的工作状态行,把 agent 当前相位(空闲 / 等待 / 思考 / 工具 / 收尾)折叠成可读文本,送到 TUI、dsh-cc 终端或 Web UI 上显示。
源码在仓库的 packages/activity/working-activity/。早期独立仓库 dsh-working-activity 已归档,文档写明代码与开发已合并进现在这个仓库,npm 包名仍是 dsh-working-activity,安装方式不变。
状态机监听的是 dsh 自己的会话流:turn/start、assistant/chunk、tool/call、tool/result、turn/end,再加上 agent/status。它不注册新工具,也不改 agent 循环;activity/status 只是 log-only 事件,模型看不到这条状态行。
核心功能¶
下面这些能力来自仓库 README 与 DSH 版文档,pi 版多出来的进度百分比、连击、彩虹彩蛋等,DSH 侧没有对等事件,文中不写进去。
1、实时状态行。思考阶段轮换短句,例如「嗯…让我捋捋」「盘一下盘一下」,中间会夹一句面无表情的 lol / hm / ok。想得太久会换档:30 秒、1 分钟、5 分钟各有一档;本地时间 0 点到 6 点会混入深夜文案。工具阶段显示「俏皮动词 + 参数细节 + 已耗时」,例如:
跑个命令 npm test · 12s
回合结束变成收尾摘要:
搞定 ✓ · 4 工具 · 想12s 干11s
失败工具会换成「翻车了」一类文案,而不是只留一个叉。把 phrases 设成 false,就只剩朴素标签,例如 思考中 · 总1m23s。
2、模型自述。默认 narrate: true,插件会往 system prompt 里加一条约定:模型在步骤开头写 ⏵ 你正在做什么(≤20 字)。扩展解析流式输出,把这行放到状态行上,并从聊天正文里滤掉(日志仍保留)。不需要自述时,把 narrate 关掉即可。
3、两条消费出口,接缝不存在时对应出口不生效。一条是 TUI prompt 槽位:插件在 ctx.tuiPrompt 上注册 ${activity},把它写进 theme.leftPrompt,就能跟 cwd、model、context 排在一起。另一条是会话事件 activity/status,给 Web UI 和 dsh-cc 状态栏用。dsh-cc-tui 装好后,状态栏会消费同一条事件流,渲染动画指示器、流光文案和上下文预警。
4、可调的发布节奏。状态行变化会立刻发布;稳定后最多每隔 publishIntervalMs 再发一次,长工具的秒数能跟着走,又不至于把日志刷爆。文档建议给 dsh-cc 把间隔调到 500 毫秒,秒数跳动更跟手。
安装与启用¶
目录页给出的安装命令如下,在 DeepSeek Harness 终端里执行:
dsh plugin add github:ccch1mneyyy/working-activity
需要可复现安装时,按目录页说明固定 commit:
dsh plugin add github:ccch1mneyyy/working-activity#commit
把 #commit 换成实际哈希。仓库 README 里还有按 npm 包安装的写法,效果是装到指定 profile,并靠自带的 dsh.bundle.patch 自动挂进组合树,不必再手写 insert:
dsh plugin --profile <你的 profile> add dsh-working-activity
前置是已经装好官方 CLI(npm install -g @deepseek-ai/dsh)。包的 engines 要求 Node.js ^22.19 || >=24。插件声明了 bundle patch,dsh plugin add 会在 profile 里 pnpm add,再把包名追加进 dsh.profile.bundles;启动时 cordis.patch.yml 会把自己 insert 进树。文档明确不建议只跑手动 pnpm add,因为 reconcile 这一步只发生在 dsh plugin 命令里。
如果同时用作者的 dsh-cc-tui,文档推荐的顺序是先装本插件、再装 tui,这样 tui 的 bundle 才能命中 working-activity 那一行并把 publishIntervalMs 盖成 500:
dsh plugin --profile cc-tui add dsh-working-activity
dsh plugin --profile cc-tui add dsh-cc-tui
顺序反了会打一条警告后跳过覆盖,需要自己在用户层改配置。
调参不要再 insert 同名插件。在该 profile 的用户补丁 $DSH_HOME/profiles/<你的 profile>/cordis.patch.yml 里按 id 覆盖即可:
- id: working-activity
config:
publishIntervalMs: 500
phrases: true
narrate: true
主要配置项如下(以插件包 README 为准;docs/dsh-working-activity.md 里有一处把 publish 默认值写成 true,与包 README、根 README 不一致,这里按更接近发布包的说明):
| 键 | 默认值 | 含义 |
|---|---|---|
phrases |
true |
趣味文案池;false 只显示功能标签 |
publish |
false |
是否追加 activity/status 会话事件给 Web / dsh-cc |
tickMs |
500 |
状态渲染 tick 间隔 |
publishIntervalMs |
2000 |
稳定行的最小发布间隔;dsh-cc 建议 500 |
detailLimit |
40 |
路径、命令等细节的最大展示长度 |
customActions |
{} |
按工具名精确匹配的文案池 |
narrate |
true |
是否注入 ⏵ 自述约定 |
publish 默认关闭是有原因的:当前 session.append() 不能把事件标成 ignorable,resume 读取路径会拒绝含未知且不可忽略事件的日志。打开之后,凡是显示过状态行的会话都可能无法 resume。TUI 实时 prompt 不依赖这条事件,不受影响。只有宿主已经支持 ignorable append、并且确实需要 Web / dsh-cc 消费时,再打开。
典型用法¶
1. 官方 TUI 里显示状态行
profile 里已经组合了官方 dsh-tui 时,在用户层给左侧 prompt 加上 ${activity}:
- id: tui
config:
theme:
leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'
模板里没有这个槽位,插件在 TUI 里不会产生任何可见效果。文档给出的显示例子:思考时是 嗯…让我捋捋 · 总1m23s;跑工具时是 dsh main 跑个命令 npm test · 12s deepseek-chat …;收尾短暂显示 搞定 ✓ · 4 工具 · 想12s 干11s。
2. 自定义工具文案
customActions 按工具名精确匹配,不会执行配置里的正则:
{
"customActions": {
"my_deploy": ["部署一下", "上线中"],
"format_code": ["格式化", "整理代码"]
}
}
3. Web 端(可选,依赖官方 rc.6 槽位)
DSH 版完整文档把 Web 拆成两段:runtime 补丁负责数据通道,slot 插件负责渲染。slot 插件随 npm 包分发,挂到 conversation.input.dock,不改官方 UI 源码。但 ConversationSnapshot.activity 需要给官方 client runtime 打补丁后才有运行时数据,不打补丁时组件渲染为空、不报错。补丁在仓库 patches/webui-working-activity.patch,文档要求在官方 rc.6 源码根目录执行:
git apply <本仓库>/patches/webui-working-activity.patch
远期若官方把 activity 字段合进发布线,这块补丁就可以去掉。Web 端不是安装后立刻可用的能力,需要按文档补数据通道。
适用场景与注意事项¶
适合已经在用 dsh 终端或 Web、希望一眼看到 agent 卡在哪一步的人。和 dsh-cc-tui 一起用时,状态栏是文档里写得最完整的消费端。只关心「现在在跑哪条命令、想了多久」时,把 phrases 关掉即可。
使用前要看清边界:
1、每会话只有一条状态行,Web / 终端显示最近活跃会话。
2、DSH 没有工具进度事件,长工具只显示已耗时,没有百分比。这一点和 pi 版不同,不要按 pi 版 README 去找 DSH 的进度条。
3、TUI 槽位渲染的是静态文本;帧动画在 dsh-cc 的渲染侧,不在这条事件载荷里。
4、许可证要分开看。GitHub 仓库与 pi 版是 MIT;DSH 插件包 packages/activity/working-activity/ 的 package.json 与 npm 页面写的是 BSD-3-Clause。目录页把整项标成 MIT,指的是仓库根许可证,安装 DSH 包时以包内许可证为准。
5、插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前检查源码仓库和许可证。作者说明两个版本都不采集、不上传数据,无网络请求、无遥测;activity/status 只写入本地会话日志,模型不可见,回放忽略。
小结¶
working-activity 做的事情很具体:把 dsh 会话里已经有的思考、工具和收尾事件,收成一条人能读的工作状态行。它不替代 agent,也不增加工具面,只解决「它正在干什么」这件事。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/working-activity/
GitHub:https://github.com/ccch1mneyyy/working-activity
DSH 版文档:仓库内 docs/dsh-working-activity.md