dsh-session-fork-tree:把 DSH 側欄分叉會話排成父子樹

前言

在 DeepSeek Harness(DSH)裏對會話做「分叉」,會新建一條獨立會話,但側欄默認按最近活動排序,分叉行往往和父會話分開,看起來像兩條無關記錄。會話一多,很難一眼看出哪條分支從哪條父會話長出來。下面介紹社區插件 dsh-session-fork-tree(維護者 ayuanxx-max),它不改核心包,只在側欄把 parentSessionId 關係畫成縮進樹,並配合摺疊與懸停高亮,方便做分支實驗。分類爲工作流;倉庫 GitHub 與 SkillHub 目錄頁 可查閱詳情。SkillHub 爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。

這是什麼

DSH 會話分叉樹排列功能(DSH Session Fork Tree Arrangement)是一條 Cordis bundle:fork 出來的會話掛在父會話下面,帶圓角連接線、綠色 + 展開器,以及懸停時的祖先鏈高亮。README 寫明兼容 DSH Desktop / Web;當前平臺支持以倉庫說明爲準——Windows 11(DSH Desktop)標註爲穩定運行,Ubuntu 測試中,macOS 計劃中。

核心功能

經 README 覈實,插件主要做五件事:

  1. 歸屬與順序:子會話緊跟父會話顯示;可選配置把順序寫回 workspace.sessionIds 持久化,否則僅在渲染層按父鏈排序。
  2. 縮進與連接線:子行縮進 16px;從父標題左緣起畫 ╰(豎線到行高一半後轉橫線,圓角 8px,窗口變化時重算)。
  3. 摺疊:有分叉的會話,名稱右側出現綠色 +,默認全部收起;點擊展開(展開時 + 帶綠色邊框),再點收起,支持逐層遞歸。
  4. 懸停高亮:鼠標劃過子行時,整條祖先鏈變亮。
  5. 自動命名:若分叉標題仍爲系統默認形式(如 父名 (1)),會改爲 父名 · 分叉N(N 爲同父分叉創建順序);用戶手動改過的標題不會被覆蓋。

實現上分爲 Host 與 Client:Host 從 sessionController.list() 讀取 SessionSummary.parentSessionId 生成譜系,並提供 GET /fork-tree/lineage.json、GET /fork-tree/style.css(客戶端約每 15 秒重取樣式,改樣式無需重啓)等;Client 註冊官方槽位 sidebar.session.row.leading 與 sidebar.workspaces.session.row.action,用 MutationObserver 在新建分叉後約 0.2–0.5 秒內歸位。數據僅使用官方 API,不改 app.asar。

與同維護者的 dsh-session-accordion(會話摺疊成單行)可組合使用;倉庫內另有 會話管理指南 說明摺疊與分叉樹搭配用法。

安裝與啓用

插件以當前 DSH 進程權限運行,安裝前建議瀏覽倉庫源碼與 MIT 許可證。npm 安裝爲 README 推薦方式(示例版本 @0.9.0,與 README 安裝節一致):

桌面版(profile=desktop):

dsh plugin --profile desktop add dsh-session-fork-tree@0.9.0

或免全局安裝:

npx -y @deepseek-ai/dsh plugin --profile desktop add dsh-session-fork-tree@0.9.0

Web UI(profile=web):

dsh plugin --profile web add dsh-session-fork-tree@0.9.0

安裝後需完全退出 DSH 再啓動纔會加載。卸載示例:

dsh plugin --profile desktop remove dsh-session-fork-tree

並按 README 從 profile 的 dsh.profile.bundles 中移除 dsh-session-fork-tree 後重啓。

Linux / macOS 若 npm 包不可用,README 給出本地 link 方式:克隆倉庫後執行 dsh plugin --profile desktop add "link:$REPO",再在 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 中加入 "dsh-session-fork-tree",然後完全退出並重啓。順序須爲先 dsh plugin add,再改 bundles,最後重啓;只做其一可能導致未加載或啓動失敗。

若重啓後 DSH 無法打開,可在 profile 的 cordis.patch.yml 末尾追加禁用條目後重啓恢復:

- id: fork-tree
  disabled: true

典型用法

經過安裝並重啓,打開側欄即可使用,無需額外命令:

  1. 對某會話執行分叉後,新會話會自動縮進到父會話下方。
  2. 父會話若存在子分叉,名稱右側出現綠色 +(默認收起);點擊展開子樹,再點收起。
  3. 子會話若繼續分叉,會出現下一層 +,逐層展開。
  4. 懸停在子行上,父行與中間祖先同時高亮。
  5. 刷新頁面或重啓 DSH 後,摺疊狀態回到「全部收起」(摺疊狀態僅存內存,README 已知限制)。

可選配置寫在 profile 的 cordis.patch.yml,覆蓋 bundle 的 config(升級不丟):

- id: fork-tree
  name: 'dsh-session-fork-tree'
  config:
    renames:
      - sessionId: session-…
        title: '父會話 · 分叉1'
    reorder:
      - sessionId: session-…
        afterSessionId: session-…

reorder 用於把「子緊跟父」寫入 sessionIds;不配置時客戶端仍會在渲染層排序。

診斷可在頁面 Console 執行 __ftReport() 查看當前行、縮進、連接線座標與摺疊狀態;Host 自報文件位於 %TEMP%\fork-tree-report.json(Linux 上對應系統臨時目錄)。

適用場景與注意

適合經常在 DSH 裏用分叉做方案對比、提示詞迭代或多路徑實驗、且側欄會話較多的開發者。不適合期待「摺疊狀態跨重啓記憶」或「與任意未來側欄 DOM 永久兼容」的場景——插件依賴側欄內部結構與 parentSessionId,上游改版可能靜默失效;行順序在極少數情況下可能與宿主重排爭搶一次,由 MutationObserver 再糾正;僅作用於當前已掛載的可見會話行。

前置:DSH 桌面版或 dsh web,可用 profile(默認 desktop),Node.js >= 18(見 package.json engines)。故障排查時查看 ~/.dsh/logs 最新日誌中的 boot / activate 報錯;若自行改過包名,須保證 client.js 裏 window.__ModuleLoader__.load 的 id 與 package.json 的 name 一致。

結尾

dsh-session-fork-tree 把 DSH 側欄裏互不相干的分叉行,收成可摺疊、可高亮的父子樹,改動集中在官方槽位與 API,便於在不動核心的前提下理清分支關係。

羽毛球分组比赛记分
小程序二维码

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

小夜