dsh-todo-dock:把 DSH Web 的 todo 面板釘到右上角,跨輪不消失

前言

在 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.jsDEFAULT_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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜