dsh-new-session:給 DSH 的模型一個能真正新開對話的工具

前言

在 DSH 裏跑長任務時,經常會遇到一種尷尬:上下文已經塞滿,代碼也改完了,模型說「接下來的東西不適合在這個對話裏繼續,我們新開一個對話吧」——然後它其實開不了。DSH 0.2.1 裏模型給出的典型回答是「新對話我開不了,那是界面操作」。左側欄的「新對話」按鈕確實存在,但那條通路(sessionController.commands.create + commands.prompt)沒有暴露成工具,模型只能先停下來等你手動點。

dsh-new-session 就是補這個缺口的插件:它把建會話、投遞交接消息、附帶上一段對話的只讀引用、自動切到新會話這一整套動作,做成一個模型可以直接調用的 new_conversation 工具。維護者是 CassiaTw1g,分類是工作流。

下面按「這是什麼 → 裝什麼 → 怎麼用 → 有什麼要注意的」來講。

這是什麼

一句話定位:一個 DSH 插件,讓模型在當前工作區裏真正創建一個新會話,並立刻開始幹活,同時把界面切過去。

它做的事情拆成四步,對應工具裏的四個能力:

能力 說明
建會話 建在調用方當前所屬的工作區(workspaceRegistry)裏,側邊欄直接出現,不是孤兒會話
投交接 交接內容作爲新會話的首條用戶消息投進去,新會話立刻跑自己的第一輪,調用方不等它結束
帶引用 reference_current: true(默認)會在首條消息裏附一段本對話的只讀快照引用;不給它引用時,prompt 必須自包含
切視圖 結果落地後調 uiWorkspace.openSession(sessionId),主視圖跳到新對話

另外它會把 title 通過 session/title 的 user 來源釘住,這樣自動標題(fallback / LLM)不會再覆蓋你指定的標題。工具行渲染成一張「新開對話」卡片,顯示標題、工作區、session id 和打開按鈕;失敗時卡片上直接寫原因。

倉庫地址:https://github.com/CassiaTw1g/dsh-new-session,目錄頁:https://www.skillhub.cn/plugins/CassiaTw1g/dsh-new-session。許可證 MIT,engines.node >= 22。

工具參數

new_conversation 的參數就五個,全部來自 README:

  • prompt:必填,交接內容
  • title:新會話標題
  • workspace:工作區;寫錯會報錯並列出可選工作區
  • reference_current:是否附帶上一段對話的只讀引用,默認 true
  • switch:是否自動切視圖,默認開

其中 switch / reference_current 可以覆蓋全局配置裏的同名默認值。

和已有插件的差別

README 裏列了兩個社區相近的插件,都是作者查過 npm / GitHub 的:

  • @ryuu-64/dsh-session-tools:提供 session_create / session_send / list_sessions / session_wait,功能很全,但 peer 依賴釘在 0.2.0-rc.2,而且建會話是「出一張卡片,手動點開」。
  • dsh-session-messaging:會話之間互發消息,沒有建會話。

dsh-new-session 的差異點是三點:自動切換(作者稱之爲 codex 的手感)、內置跨對話引用、宿主半邊零 @deepseek-ai/* import,所以不挑宿主小版本,裝進任意 0.2.x profile 都不會因爲 peer 解析失敗而掛。

安裝

README 給了三種方式,按省事程度排。

方式 0,npm / 插件市場:

dsh plugin --profile desktop add dsh-new-session

或者在 DSH 的「插件 → 發現」裏搜 new session。README 在這裏有一句注:索引上架後纔可見;同時它自己也提到「npm 還沒發佈、或想跟主幹」的情況,這時走下面的方式。桌面版要先完全退出,dsh plugin 才能拿到 profile 鎖。

方式 A,倉庫裏的安裝腳本,README 標爲推薦,桌面版運行中也能裝:

node tools/install-profile.mjs                      # 默認 desktop profile
node tools/install-profile.mjs --profile headless   # 其它 profile
node tools/install-profile.mjs --dry-run            # 只看會做什麼
node tools/install-profile.mjs --profile desktop --rollback   # 撤銷

腳本做的是文件級安裝:複製包、改 package.json 的 dependencies 和 dsh.profile.bundles,每次都留一份 package.json.bak-newsession-<時間戳> 備份。

方式 B,dsh plugin 指向本地路徑:

dsh plugin --profile desktop add file:D:/DSH/插件/dsh-new-session

裝完之後的收尾動作,README 寫得很具體,這兩步都在做同一件事:讓兩邊各自重新加載。

  1. 宿主半邊:桌面版通過 profile 熱重載掛上新工具,README 的實測記錄是秒級生效;沒生效就完全退出 DSH 再打開。
  2. 瀏覽器半邊:刷新一次頁面,因爲 dsh.client 的模塊圖是在頁面加載時組裝的。

配置

全部配置都在 cordis.patch.yml 裏,只有幾行:

- insert:
    - id: new-session
      name: dsh-new-session
      config:
        autoSwitch: true        # 結果落地後自動切到新對話
        referenceCurrent: true  # 自動附加上一段對話的只讀引用
        switchDelayMs: 900      # 切換前的停頓(毫秒)
        # toolName: new_conversation

也就是說,不寫任何配置直接裝,默認行爲就是「自動切 + 帶上一段對話的只讀引用 + 切之前停 900 毫秒」。

用法

裝好之後不需要記參數,直接跟模型說人話就行。README 給的示例:

新開一個對話,把 X 剩下的事繼續做完。

模型會調 new_conversation,然後寫一段自包含的交接,內容至少包含目標、已完成、下一步、約束、路徑這幾項。新會話建起來立刻開工,界面切過去;舊會話保持原樣,隨時可以切回來。

想把交接做得穩一點,可以明確要求交接段落自包含,或者明確說不要帶引用。調用方和接收方都不依賴彼此記得上一句說了什麼,這是這套設計的核心。

適用場景與注意

適合這些人:在 DSH 裏跑多步任務、上下文容易被撐爆、希望用對話分段而不是在同一個會話裏無限追加的人;以及自己寫插件、需要一個「會話生命週期」工具來做參數參考的人。插件的目錄結構(lib/index.js 宿主半邊、lib/client.js 瀏覽器半邊、cordis.patch.yml、安裝腳本、兩個方向的單測)本身可以當作一個雙半邊插件的樣板。

有幾個邊界需要在裝之前知道,都來自 README 的「已知邊界」一節:

  • 只建會話,不建工作區。workspace 填錯會報錯,並列出可選的工作區。
  • 瀏覽器半邊只有 Web / 桌面版有意義。headless profile 沒有 sessionController,這時工具會給出可讀報錯而不是靜默失敗。
  • 跨對話引用依賴宿主裝了 @deepseek-ai/dsh-session-reference(dsh-web-app 默認帶);沒有這個服務時會自動降級爲純文本交接。
  • 自動切換不會搶視圖:卡片只出現在發起調用的那段對話裏,而且只跳一次;3 分鐘以外的歷史卡片不會觸發跳轉。

另外提醒一句安裝前的通用動作:插件是以當前 DSH 進程的權限運行的,能讀到這個進程能讀到的文件、能執行它能執行的命令。裝之前把源碼和許可證過一遍,這是任何第三方插件都適用的前提,對這個插件也不例外。倉庫許可證是 MIT,作者目前沒有發佈正式 npm 包,走 npm 方式前可以先確認一下是否已經上架。

小結

dsh-new-session 解決的問題非常窄:模型需要一個能真正開會話、並且自動切過去的能力,而不是一份「建議你新開對話」的說明。它沒有試圖去替代現有的會話管理插件,只是在它們之外補上了「建會話 + 自動切」這個動作。如果你正好被卡在「上下文該切但切不了」這一步,可以試一下。

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

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

小夜