前言¶
在 DSH 裏跟 coding agent 長聊,常見局面是:同一條會話裏試了多種方案,只有一條能跑通,其餘討論都堆在滾動條裏;想從「最後一個好狀態」繼續探索,卻只能整段歷史一起往前拖;比較兩種架構或兩個模型時,線性窗口也更容易變成來回刪改的同一條時間線。
GitChat(npm 包名 dsh-gitchat)是維護者 shuirongshen 發佈的 客戶端 DSH 插件:在會話界面把每一輪對話畫成樹,從任意已結束輪次 fork 出真實子會話並繼承事件前綴,對死衚衕 歸檔 並可恢復,整棵樹可導出 JSON。插件當前爲 early preview(0.1.0,MIT)。
社區目錄見 SkillHub:shuirongshen/dsh-git-fork-chat(與 DeepSeek / 幻方無官方從屬關係,僅爲社區收錄)。
這是什麼¶
一句話:GitChat 把「對話上下文」做成一等對象——樹而不是線,分支對應 DSH 真實的 sessions.fork,不是手工拼 messages 數組。
技術形態上是 原生雙端插件(不是 Webview):
- 宿主半讀會話日誌,提供
/gitchat/*路由; - 瀏覽器半把 React 組件掛進現有
conversation.view插槽,用 React Flow 12 + Dagre 佈局,複用 DSH 主題、locale、會話與模型層。
核心功能¶
下面列出 README 中已寫明、可在界面裏直接驗證的能力。
樹狀瀏覽
- 每輪一個節點,fork 邊着色,支持平移、縮放、小地圖與 Dagre 自動佈局。
- 點擊節點可在檢查器裏看用戶消息、助手回覆、模型、時間戳、工具調用次數與分叉點;懸停按鈕有主題感知的 tooltip(含「爲何此刻不能 fork」的說明)。
分叉與繼承
- 在已結束的輪次上執行「從此處分叉」,內部調用
sessions.fork({ sessionId, atSeq: turn.endSeq });子會話繼承精確事件前綴,作爲普通 DSH 會話繼續用 agent / 工具 / 模型。 - 運行中的輪次 deliberately 不可從圖中 fork。
歸檔、跳轉、導出
- 「歸檔分支」通過
workspaceRegistry.archiveSession歸檔該分支及 fork 後代(非刪除,失敗會回滾已歸檔項),可恢復。 - 「打開會話」跳轉到擁有該節點的會話。
- 導出整樹 JSON,或寫入
~/.dsh/plugin-data/dsh-gitchat/exports/。
其它
- 存在運行中輪次時每 7 秒刷新樹,空閒不輪詢;中英文 locale;窄屏時檢查器變爲覆蓋層。
/gitchat僅接受迴環地址;插件不註冊工具、不改 system prompt,以讀日誌與 fork / 歸檔爲主。
環境要求¶
安裝前對照官方 README 覈對版本:
| 依賴 | 要求 |
|---|---|
| DeepSeek Harness | >= 0.2.1-rc.3(在 0.2.1-rc.5 的插件/會話 API 上開發) |
| Node.js | ^22.19.0 \|\| >=24.0.0(開發構建用;插件運行時不依賴 npm 包) |
| pnpm | 11+(僅開發構建需要) |
| Profile | 例如 desktop 或 web |
安裝與啓用¶
GitChat 是 profile link 插件,需要本機上有插件倉庫的絕對路徑(README 以 clone 後目錄爲例;取得源碼目錄的方式由你自行選擇,下文只寫 DSH 側步驟)。
1. 鏈接包¶
先把插件鏈入 profile(將 <absolute-path-to-this-repo> 換成實際路徑,含空格時加引號):
dsh plugin --profile desktop add link:<absolute-path-to-this-repo>
若 dsh 不在 PATH,可用應用自帶 CLI(Windows 示例見倉庫 README.zh.md)。
2. 寫入 profile bundles¶
編輯 ~/.dsh/profiles/desktop/package.json(Windows:%USERPROFILE%\.dsh\profiles\desktop\package.json),在 dsh.profile.bundles 末尾加入 "dsh-gitchat":
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-gitchat"
]
}
}
}
dsh plugin add 只把包裝進 node_modules;必須進入 bundles,cordis.patch.yml 纔會應用,ui-gitchat 纔會插入 profile 樹。
3. 重啓並驗證¶
關閉並重新打開 DeepSeek Harness。打開至少有一輪對話的會話,在 Chat / Trajectory 旁點 GitChat。
可選驗證:
dsh --profile desktop --dump-config | grep -i "ui-gitchat\|dsh-gitchat"
卸載¶
- 從
dsh.profile.bundles移除"dsh-gitchat"。 - 執行
dsh plugin --profile desktop remove dsh-gitchat。 - 重啓 DSH。
典型用法¶
下面按 README「30 秒上手」整理爲可復現流程。
- 在有歷史的會話裏切換到 GitChat 視圖。
- 點擊要保留上下文的那一輪節點,閱讀檢查器中的 fork 點與元數據。
- 對該 已結束 輪次選擇「從此處分叉」,在新開的子會話裏繼續提問或換模型 / prompt(父上下文一致,比較才受控)。
- 對失敗實驗分支使用「歸檔」;需要時用「顯示已歸檔」並恢復。
- 需要交接或備份時「導出 JSON」或「保存到磁盤」。
README 還給出了幾類意圖示例:保住 known-good 時間線再探索、同一需求下多架構並行 fork、在長任務最佳上下文點 fork 下一階段、導出樹做演示或比較模型變化等。
若只想看 UI、不連真實 DSH,倉庫內已帶構建產物時可本地起獨立預覽(詳見 README.zh.md 的 node scripts/preview-server.mjs 與 http://127.0.0.1:5177/)。
適用場景與注意¶
適合誰
- 經常在單會話裏做多種方案試探、又希望主線保持乾淨的 DSH / 智能體開發者。
- 需要可視化譜系、導出結構化樹而非複製長 transcript 的團隊協作或教學演示。
使用前應明確
- 插件在 當前 DSH 進程權限 下運行;安裝前建議閱讀源碼與 MIT 許可證,確認
/gitchat迴環策略與歸檔行爲符合你的安全預期。 - 歸檔不是刪除:DSH 無公開刪會話 API,日誌仍在磁盤;JSON 導出是讀模型快照(單條消息最多 20,000 字符等限制見 README「已知限制」)。
- 大會話有 80 會話 / 800 turn 上限,超出會標記
truncated;DSH session/slot API 仍在演進,大版本升級後可能需要插件同步更新。 - 狀態爲 early preview,路線圖仍含分支並排對比、跨分支搜索等未完項。
結尾¶
GitChat 的核心價值是把 DSH 裏本來就有的 sessions.fork 和歸檔能力,用一棵樹和原生視圖暴露出來:分叉帶確定性的上下文繼承,失敗路徑可歸檔而不污染主線,整棵樹可導出。若你在長調試會話裏反覆「如果當時走另一條路會怎樣」,比在單線 transcript 裏翻頁更貼近實際工作方式。