前言¶
在 Agent Chat 中,一次會話很容易從某輪對話分叉出多個子會話,這些子會話又可能繼續分叉、回退或繼承歷史。在默認的列表視圖裏,誰從誰分叉、當前會話在整張圖裏的位置,都得自己回憶。這會增加定位上下文的成本,也容易遺漏分支或重複閱讀共享歷史。
插件簡介¶
這個插件爲 DSH 會話提供一個可視化畫布:把用戶輪次畫成節點,會話退成顏色與標籤貫穿的線條,分叉點與繼承關係一目瞭然。它默認只顯示當前會話所在的樹,且自上而下生長,可以通過工具欄切換到“全部會話”和“橫向”佈局。插件由 xiguazhiPrince 維護,屬於客戶端插件。
核心功能¶
- 當前會話的樹:打開即定位,只鋪開當前會話所在的那棵輪次樹——父鏈、與它並列的兄弟分支、以及它們的後代;一鍵切回全圖。
- 豎向生長:默認自上而下,同一會話的下一輪在上一輪下方,父節點居中於自己的所有子節點;fork 頭在兩側展開,自己的下一輪夾在中間;會話顏色貫穿自己的輪次;一鍵切回橫向。
- 輪次節點:每個用戶輪次是一個節點;當前會話及祖先路徑的 steering 輸入也會作爲後續節點出現;輪次號、提示預覽、分叉數;共享的繼承前綴只畫一次;0 條自有輸入的會話顯示爲會話頭 chip;長直鏈摺疊成
+N 條輸入。 - 畫布手感:滾輪平移、Shift + 滾輪橫向平移、Ctrl / ⌘ + 滾輪縮放、拖空白平移(不會選中文字),外加適應窗口 / 定位當前 / 100%。
- 一屏概覽:另有一個“會話概覽”標籤頁:輪次、步驟、模型耗時、工具耗時、輸出 token、運行狀態。
- 三個入口:對話標籤頁、會話頭部開關、右側欄常駐標籤頁——哪裏順手用哪裏。
安裝與啓用¶
GitHub 直裝:
# 裝進 web profile —— 就是 `dsh web` 啓動的那個
dsh plugin --profile web add github:xiguazhiPrince/dsh-session-map
# 換你自己的 profile 名即可,例如 tui
dsh plugin --profile <你的 profile> add github:xiguazhiPrince/dsh-session-map
profile 名要已經存在於 $DSH_HOME/profiles 下(dsh --help 裏 --profile 那一段就是它);想新建一個就先用模板派生:dsh myweb --from-default-profile web 會照 web 模板建出 myweb 並啓動它。安裝走的是 profile 自己的 pnpm,裝完這個包會同時寫進它的 dependencies 與 dsh.profile.bundles。
安裝後驗證:
dsh --profile web --dump-config # profile 名換成你裝的那個
在輸出中確認有 # == dsh-session-map 層:
# == dsh-session-map
- id: session-map
name: dsh-session-map
然後重啓該 profile 的進程並刷新頁面。四處應該出現:
| 位置 | 應該看到 |
|---|---|
| 會話標籤欄 | 「概覽」與「會話圖譜」兩個標籤頁 |
| 會話頭部工具區 | 「會話圖譜」開關;右側欄正顯示圖譜時再點一次會關閉它 |
| 右側欄標籤 | dsh-session-map.map(標題「會話圖譜」)和 dsh-session-map.overview(標題「會話概覽」) |
| 圖譜頁本身 | 輪次樹畫布;默認只畫當前會話的那棵樹、且自上而下,工具欄的「當前會話樹 / 全部會話」與「豎向 / 橫向」兩組開關可切回全圖與原方向,旁邊顯示會話數、輪次數、樹數與當前縮放百分比 |
典型用法¶
三個入口¶
| 座位 | 內容 |
|---|---|
conversation.view |
「概覽」標籤頁(order 20)、「會話圖譜」標籤頁(order 30)—— 默認關閉 |
conversation.session.header.utilities |
會話頭部的「會話圖譜」開關(order 40) |
sidebar.right.pane.tab |
常駐標籤頁 dsh-session-map.overview 與 dsh-session-map.map |
工具欄¶
| 控件 | 作用 |
|---|---|
| 「當前會話樹 / 全部會話」 | 畫布範圍:當前會話所在的那棵樹,或者列表裏的全部會話 |
| 「豎向 / 橫向」 | 樹的生長方向:自上而下,或者自左向右 |
| 「摺疊長直鏈」 | 直鏈超過 8 條輸入時摺疊中間段(保留頭 2 + 尾 1),顯示 +N 條輸入;點擊畫布上的膠囊展開,取消勾選則全部展開(默認開) |
| 「隱藏子代理會話」 | 過濾 origin: subagent 的會話(默認開) |
| − / + / 100% / 適應窗口 / 定位當前 | 縮放與取景 |
| 鍵盤圖標 | 快捷鍵表 |
畫布交互¶
- 滾輪上下平移,Shift + 滾輪左右平移,Ctrl / ⌘ + 滾輪縮放;
- 拖動空白平移(不會選中文字),點空白收起菜單;
- 點擊輪次節點彈出操作菜單:跳轉到該會話 / 在畫布中居中(暫時只能定位到會話,不能定位到具體輪次);
- 點擊會話標籤或會話頭 chip 彈出會話操作菜單;
- 點擊摺疊直鏈上的
+N 條輸入展開該段;工具欄的「摺疊長直鏈」控制是否自動摺疊。
默認只畫當前會話的會話樹¶
圖譜打開時只鋪開當前會話所在的那棵樹:從樹根(parentId 鏈上仍被列表列出的最遠祖先)到它的所有後代,含與當前會話並列的兄弟分支。工具欄上的「當前會話樹 / 全部會話」兩段開關切換這個範圍。
默認豎向生長¶
樹自上而下長:同一會話的下一輪在上一輪下方,父節點居中於自己的所有子節點;fork 出來的會話頭在兩側展開,父會話自己的下一輪夾在中間;沒有 fork 的父子輪次保持一條直鏈。fork 邊從被繼承的最後一輪出發,而不是從父會話的鏈尾出發。橫向模式是自左向右,輪次往右排。
輪次、會話與空會話¶
- 節點 = 一條用戶輸入:輪次 prompt 來自
projectionValues.turnOutline;當前會話及其祖先路徑的已加載事件窗口會把同一輪裏的 steering 消息追加成後續節點。沒有加載歷史的會話仍只有每輪首條 prompt。 - 會話 = 顏色 + 標籤:顏色按會話 id 穩定哈希取 8 色之一;標籤只掛在該會話第一條自有輪次上,顯示該會話的顯示標題;當前會話的整條自有鏈強高亮,繼承路徑弱高亮。
- 共享前綴只畫一次:子會話的日誌以父會話的事件開頭,構建時按
turn+ prompt/response 與父 outline 求最長公共前綴;匹配到的輪次複用祖先的節點,fork 後的第一條自有輪次掛在該前綴的最後一輪下。 - 0 條自有輸入的會話:沒有輪次可以放標籤,就在 fork 輪上掛一個會話頭 chip(
尚無輸入)。chip 本身也是樹節點,所以「空會話再 fork 出空會話」會形成 chip 鏈,不會丟層級。 - 長直鏈摺疊:一段沒有分叉的純直鏈超過 8 條輸入時,默認保留頭 2 + 尾 1,中間折成
+N 條輸入;點擊展開。摺疊只發生在純直鏈上,分叉輸入、會話頭、末條輸入永遠可見。 - 投影缺失:該會話只畫會話頭 chip(
投影未加載),工具欄說明有幾個會話沒有輪次數據。
對話標籤欄的兩個標籤頁默認關閉¶
「概覽」和「會話圖譜」這兩個 conversation.view 入口由瀏覽器本地偏好控制,默認不註冊。頭部開關和右側欄的兩個標籤頁不受影響,圖譜仍然可以從右側欄正常使用。
在頁面控制台裏改,刷新後生效(不需要重新構建或重啓):
localStorage.setItem('dsh.session-map.conversationViews', 'true') // 打開
localStorage.setItem('dsh.session-map.conversationViews', 'false') // 顯式關閉
localStorage.removeItem('dsh.session-map.conversationViews') // 回到出廠默認
適用場景與注意¶
適合需要頻繁查看 Agent 交互上下文、多分支會話梳理的開發者與調試人員。插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證(MIT)。
短結尾¶
通過可視化畫布,分叉與繼承關係變得清晰,便於定位上下文與調試。插件由 xiguazhiPrince 維護,可在目錄頁與 GitHub 上找到更多信息。
參考資料¶
- https://github.com/xiguazhiPrince/dsh-session-map
- https://www.skillhub.cn/plugins/xiguazhiPrince/dsh-session-map