前言¶
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