CodeBridge:在 DSH 標準模式中用 JavaScript/TypeScript 編排工具

前言

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 把「多步工具編排」收斂到一次代碼調用裏,狀態在同一個會話裏保持,權限仍走宿主的原生管線。適合需要在標準模式下做分頁、篩選、彙總這類鏈路的場景;如果只是單步讀寫,直接調原生工具更省事。

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

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

小夜