前言¶
DSH 默認走「工具調用」這一步:模型一次拿一個工具的參數,調完把結果帶回對話,再決定下一步。單步讀寫沒問題,遇到「循環分頁處理」「先篩一批結果再彙總」「條件分支串聯多次調用」這類任務,往返次數會迅速膨脹,中間結果也要反覆塞進上下文。
CodeBridge 針對這個問題做了一件事:給標準模式加一個代碼執行入口,讓模型在一次調用裏寫 JavaScript / TypeScript,通過 tools.* 串聯多個工具、控制流程,再把需要的結果返回給模型。原有的原生工具仍然可以直接調用,二者共存。
下面介紹這個插件。CodeBridge 由 MUKAPP 維護,倉庫是 MUKAPP/dsh-codebridge,分類屬於工作流類插件。當前版本 0.1.1,聲明兼容 DSH 0.2.2-rc.1、Node.js >=24.9.0,許可證 MIT。
能做什麼¶
官方 README 列出的能力,按用途歸一下:
- 會話內狀態:默認在同一會話裏保留變量、函數、導入和中間結果,後續調用直接複用,不用包一層函數。
- 用代碼串工具:支持條件判斷、循環、結果篩選和彙總,減少模型往返。
- 先查結構再調用:按名稱或描述搜索當前可見工具,再按需取參數和返回 schema;也可以只做只讀環境診斷。
- 可選重啓恢復:開啓後自動保存受支持的頂層 JSON 數據變量,重啓後按原變量名恢復,不重跑歷史代碼。
- 大輸出可恢復:全文保存成功後縮短展示,保留規範 JSON 並提供取回位置。
- 沿用當前權限:每個子調用都經過 DSH 工具管線,保留可見性檢查、審批、取消和調用記錄。
- 與 PTC Plus 共存:使用專用官方 Node 運行時
codebridge-runtime,與公共運行時命名隔離。
需要說明的是,README 明確寫了標準模式的工具 schema 仍然保留,CodeBridge 不承諾固定的 token 節省比例。
安裝與啓用¶
在 DSH 的「插件 → 添加插件」中輸入 GitHub 地址:
https://github.com/MUKAPP/dsh-codebridge.git
安裝過程會從源碼編譯插件,倉庫的 prepare 和 prepack 腳本會編譯 Host 與 Web 客戶端。如果管理器提示構建腳本待批准,先覈對該倉庫的編譯腳本再決定是否允許。安裝完成後按管理器提示啓用或重啓 DSH,只刷新瀏覽器頁面不會重新加載 Host 插件。
命令行方式可以裝到指定 profile,下面以 web 爲例:
dsh plugin --profile web add https://github.com/MUKAPP/dsh-codebridge.git
注意安裝會影響使用該 profile 的全部會話。插件當前只聲明支持 DSH 0.2.2-rc.1,其他版本需要先適配,不能靠忽略版本檢查來兼容。
升級時同樣需要重新加載整個 dsh-codebridge 組合包,使工具和專用運行時一起更新爲持久模式。卸載時關閉或移除整個組合包,等待會話資源釋放。
兩個工具¶
插件提供兩個工具:
| 工具 | 參數 | 用途 |
|---|---|---|
codebridge_exec |
code、description、可選 timeoutMs、maxInlineBytes |
執行代碼並返回日誌與結果 |
codebridge_tools |
names 或 query,可選 detail、offset、limit、diagnostics |
搜索摘要、查詢完整結構或只讀診斷 |
code 是 TypeScript REPL 源碼,支持頂層 await 和最後一個表達式。工具名和返回結構以當前會話的查詢結果爲準,代碼裏拿到的是工具的規範 JSON,可能與原生工具展示的文本不同。子工具失敗會拋出可捕獲的 ToolCallError,包含 name、toolName 和 message。
典型用法:先查詢,再調用,再編排¶
不知道工具名時,先讓模型調用 codebridge_tools 按描述搜索:
{ "query": "文件", "limit": 20 }
搜索不區分大小寫,按去除首尾空白後的子串匹配,query: "" 可以瀏覽全部可見工具。默認只返回名稱和說明,不附帶參數與返回結構。結果按名稱排序,total 是匹配總數,有後續頁時返回 nextOffset。limit 默認 20,範圍 1–100,offset 默認 0。
找到目標後用精確名稱查完整結構:
{ "names": ["working_directory"] }
names 查詢默認返回名稱、說明、完整 parameters 和 output,不可用的名稱出現在 unavailable 裏。確認參數後就可以調用 codebridge_exec:
{
"description": "讀取當前工作目錄",
"code": "const directory = await tools.working_directory({}); directory",
"timeoutMs": 10000
}
同一個會話裏可以跨調用複用綁定。第一次調用準備數據和函數:
const values = [12, 8, 5]
function total() { return values.reduce((sum, value) => sum + value, 0) }
total()
下一次調用直接接着用:
values.filter(value => value >= 8).map(value => value * 2)
默認只在當前進程內保留會話狀態。開啓「重啓後恢復」後,插件會額外保存受支持的頂層 JSON 數據變量,進程重啓後從最近快照恢復;函數、模塊和句柄不恢復。文件寫入、網絡請求和其他外部副作用不會因爲代碼失敗而回滾。
設置項¶
在「設置 → 插件 → CodeBridge」裏改兩個開關,保存後即生效;配置屬於當前 profile,使用該 profile 的會話共享設置。
| 設置 | 配置鍵 | 默認 | 行爲 |
|---|---|---|---|
| 保留會話狀態 | retainSessionState |
開啓 | 同一會話複用 Node REPL;關閉後下一次調用釋放舊環境,以新環境執行 |
| 重啓後恢復 | restoreOnRestart |
關閉 | 需同時開啓會話保留;保存與恢復受支持的頂層 JSON 數據變量 |
恢復功能只跟蹤頂層的 const、let、var 聲明(含解構),且只支持有限數字、字符串、布爾值、null 和普通 JSON 數組/數據對象。函數、類實例、Promise、句柄、getter、Proxy、循環引用、嵌套作用域屬性和 globalThis 上的新增屬性都不在恢復範圍。每次快照的完整記錄上限爲 1 MiB。恢復只注入數據,不重跑原始代碼。
運行時的限額在 codebridge-runtime 裏調整:
| 配置 | 默認值 | 含義 |
|---|---|---|
executionMode |
persistent-in-memory |
每個會話保留一個 Node REPL;可選 JSON 數據快照恢復 |
timeoutMs |
120000 |
默認執行超時,毫秒 |
maxTimeoutMs |
600000 |
單次超時參數的上限,毫秒 |
maxOutputBytes |
67108864 |
日誌與結果的合計輸出上限,64 MiB |
CodeBridge 要求運行時保持 persistent-in-memory 和 programFormat: "repl"。手動改回 per-call 時,codebridge_tools({ diagnostics: true }) 會報告配置未就緒,代碼執行也會明確拒絕,避免把 REPL 末尾表達式誤交給函數體 runtime。
執行規則與注意點¶
閱讀使用時要注意幾條硬約束:
- 子調用串行:提交多個 Promise 不代表並行,所有異步工具調用都要
await,程序結束時未完成的調用會被取消並等待收尾。timeoutMs不含收尾工作。 - 遵守作用域:只能調用當前代理可見的工具,不提供遞歸調用 CodeBridge 或
run_code的入口,代碼工具本身沒有提權參數。 - 沙箱沿用宿主:Node 文件、網絡和子進程操作受實際宿主策略約束。Windows 後端可能報告
partial,不能當成完整隔離。 - 大輸出:
maxInlineBytes默認32768(32 KiB),範圍1024–262144。超預算時插件用宿主已掛載的spillStore保存完整 JSON 並展示首尾預覽;預覽文本可能在 JSON 中間省略,不能當作完整 JSON 解析。 - 診斷非安全證明:
diagnostics返回stateRetention、stateRecovery、configurationReady等狀態,但configurationReady只表示配置檢查未發現問題,不證明沙箱完整隔離。運行時缺失時應恢復整個組合包,單獨啓用公共 Node 運行時可能無效。
安裝前建議先讀一遍倉庫源碼與編譯腳本,確認許可證和權限符合自己環境的約束。插件以當前 DSH 進程權限運行,沒有獨立的提權通道。
目錄頁與源碼¶
- 社區插件目錄:https://www.skillhub.cn/plugins/MUKAPP/dsh-codebridge
- GitHub:https://github.com/MUKAPP/dsh-codebridge
需要說明的是,社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係,也不等於官方應用商店。
CodeBridge 把「多步工具編排」收斂到一次代碼調用裏,狀態在同一個會話裏保持,權限仍走宿主的原生管線。適合需要在標準模式下做分頁、篩選、彙總這類鏈路的場景;如果只是單步讀寫,直接調原生工具更省事。