GitChat:在 DeepSeek Harness 裏把 AI 對話當成可分叉、可歸檔的樹

前言

在 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"

卸載

  1. 從 dsh.profile.bundles 移除 "dsh-gitchat"。
  2. 執行 dsh plugin --profile desktop remove dsh-gitchat。
  3. 重啓 DSH。

典型用法

下面按 README「30 秒上手」整理爲可復現流程。

  1. 在有歷史的會話裏切換到 GitChat 視圖。
  2. 點擊要保留上下文的那一輪節點,閱讀檢查器中的 fork 點與元數據。
  3. 對該 已結束 輪次選擇「從此處分叉」,在新開的子會話裏繼續提問或換模型 / prompt(父上下文一致,比較才受控)。
  4. 對失敗實驗分支使用「歸檔」;需要時用「顯示已歸檔」並恢復。
  5. 需要交接或備份時「導出 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 裏翻頁更貼近實際工作方式。

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

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

小夜