前言¶
在 DSH 的 Web GUI 裏,todo 面板由內置組件掛在 conversation.input.dock 槽(order: 0),默認顯示在聊天輸入框上方。這裏有兩個問題:一是面板佔文檔流,擠佔輸入區空間;二是原生機制下,turn/start(用戶發消息開啓新一輪)會把 todos 投影清空,面板隨之整體消失,要等 agent 本輪重新調用 todo_write 纔會回來。如果你的工作流依賴任務列表跟蹤進度,這兩個行爲都會打斷節奏。
下面介紹 dsh-todo-dock。它針對這兩點做處理:一段 CSS 注入把面板釘到右上角,一段 host 側重放邏輯讓列表跨輪保持可見。
這是什麼¶
dsh-todo-dock 是一個 DeepSeek Harness Web GUI 插件,作者是 lsxblh,License 爲 MIT,當前版本 0.3.2。v0.3.0 起由 dsh-ui-todo-fix 更名爲 dsh-todo-dock(v0.2.x 及更早均爲原名)。
它是純 Host 插件,零依賴,核心代碼約 50 行,走官方注入鉤子 webServer.tapIndex 注入(與內置主題插件同構),不碰任何組件邏輯。標準 dsh.bundle 形態,dsh plugin add 會自動登記進 profile bundles。
核心功能¶
面板停靠右上角¶
插件向 index.html 注入一段 <style>,把 todo 面板(section[data-testid="todo-panel"])用 position: fixed 釘到右上角,加陰影、圓角和滾動,不佔文檔流、不擋輸入。包內 lib/index.js 的 DEFAULT_CSS 是內置默認樣式,裝完即有默認效果:
body section[data-testid="todo-panel"]{
position: fixed; top: 104px; right: 16px;
width: 320px; max-width: min(320px, calc(100vw - 32px));
z-index: 9999; margin: 0;
box-sizing: border-box;
box-shadow: 0 8px 32px rgba(0,0,0,.35);
max-height: calc(100vh - 120px); overflow-y: auto;
}
注意:TodoPanel 是條件渲染的——當前會話沒有 todo 任務時不顯示面板,這是產品行爲,與插件無關。
跨輪常駐¶
原生機制是 turn/start 把 todos 投影清空,面板消失,直到 agent 本輪重新調用 todo_write。本插件在 host 側監聽 session/event:按會話記錄最近一次 todo/write 的列表,turn/start 後立即重放一條 todo/write。這樣任務列表跨輪保持可見,任何 agent 都無需額外動作,不依賴 agent 的行爲習慣(v0.2 新增)。
默認開啓;config.keepAcrossTurns 設爲 false 可關閉,恢復原生行爲。兩點邊界需要知道:
1、agent 主動清空(寫入空列表)後不會復活。
2、每次 turn 會在會話事件流多追加一條 todo/write——這是合法事件,僅用於恢復。
跨重啓恢復¶
v0.3.2 新增。關閉重開 dsh 後,重開同一會話時,插件會從 DSH 已持久化的會話日誌恢復最後一條 todo 列表。實現上是零新增存儲:懶掃描 + 增量遊標。進程重啓後遊標爲空,首個 turn/start 會從該會話的持久化事件日誌倒序懶掃描最後一條 todo/write(僅此一次,之後增量 O(1));日誌裏沒有 todo(新會話,或已被 compaction 剪掉)則安全回退爲不重放。
健壯性加固¶
v0.2.1 / v0.3.2 做了四項加固:非數組 junk 不重放;Map 隨會話銷燬清理;重放錯誤隔離;日誌無 todo 時安全回退。tests/ 目錄附迴歸測試,可用下面的命令運行:
node tests/keep-across-turns.test.mjs
安裝與啓用¶
依賴 DSH Web profile。dsh plugin 基於 pnpm,需本機已安裝 pnpm。
1、安裝插件。方式一,GitHub 發佈包(推薦):
dsh plugin --profile web add https://github.com/lsxblh/dsh-todo-dock/archive/refs/tags/v0.3.2.tar.gz
方式二,本地源碼目錄:
dsh plugin --profile web add file:/path/to/dsh-todo-dock
2、重啓一次 dsh web 服務(bundle 層在啓動時組合)。
3、刷新頁面,面板即出現在右上角。
樣式熱調¶
注入的 CSS 默認取包內 DEFAULT_CSS。想覆蓋或調整,在 ~/.dsh/profiles/web/cordis.patch.yml 追加 id/name 爲 dsh-todo-dock 的條目,設置 config.css:
- id: dsh-todo-dock
name: dsh-todo-dock
config:
css: |
body section[data-testid="todo-panel"]{
position: fixed; top: 104px; right: 16px;
width: 320px; z-index: 9999; margin: 0;
box-shadow: 0 8px 32px rgba(0,0,0,.35);
}
改完無需重啓:HMR 自動應用,刷新頁面即生效。
卸載 / 回滾¶
dsh plugin --profile web remove dsh-todo-dock
如果改過 cordis.patch.yml,把相關 override 行一併刪除。
適用場景與注意¶
適合在 DSH Web GUI 裏用 todo 列表跟蹤多步任務、希望列表常駐可見、不想讓它擠佔輸入區的使用者。配置項只有兩個:config.keepAcrossTurns(關掉跨輪常駐,恢復原生行爲)和 config.css(覆蓋默認 CSS)。
安裝前注意:
1、插件以當前 dsh 進程權限運行,安裝前建議先檢查源碼(倉庫見文末)與許可證(MIT)。
2、依賴 DSH Web profile 和本機 pnpm。
3、面板是否顯示取決於當前會話有沒有 todo 任務,沒有時 TodoPanel 不渲染,這是產品行爲。
4、開啓跨輪常駐後,每次 turn 會在會話事件流多追加一條 todo/write。
結尾¶
總結:dsh-todo-dock 用一段 CSS 注入加 host 側機制級重放,解決了 DSH Web todo 面板的停靠位置和跨輪消失兩個問題,改動不碰組件邏輯,樣式可熱調,跨重啓也能恢復,卸載也只需一條命令。
- GitHub 倉庫:https://github.com/lsxblh/dsh-todo-dock
- 社區插件目錄頁:https://www.skillhub.cn/plugins/lsxblh/dsh-todo-dock