前言¶
在 DSH 裏把 OpenCode 當作子智能體委派出去,常見做法是等子進程跑完再看最終文本。OpenCode 內部還會切換 agent、調用工具,並自行派生 fixer、explorer 等子 agent;這些過程若只在終端或 OpenCode 自己的界面裏看,和 DSH 主會話是割裂的。下面介紹社區插件 dsh-opencode-live(維護者 lof6yo):把 OpenCode 接到 DSH 的 opencode 工具上,並把 ACP 事件鏡像成 trace,在 Web UI 面板裏按會話實時展示。
這是什麼¶
dsh-opencode-live 的定位是:OpenCode as a DSH subagent, with a live ACP trace panel for its agents and self-spawned subagents(OpenCode 作爲 DSH 子智能體,併爲其 agent、工具調用與自派生子 agent 提供實時 trace 面板)。分類屬於 DSH 社區目錄中的「工作流」類插件;源碼與說明見 GitHub 倉庫,目錄頁爲 skillhub.cn/plugins/lof6yo/dsh-opencode-live。DSH 社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。
耦合刻意保持很薄:OpenCode 仍用自身的配置、模型與認證;DSH 側主要傳遞工作目錄(cwd)與任務文本。
核心功能¶
委派方式¶
DSH 中的 opencode 工具每次任務會啓動一個獨立的 opencode acp 子進程。Host 端把 ACP 事件鏡像成 trace,Client 插件負責渲染。
實時面板與數據通道¶
面板只消費 /opencode-live/events(SSE:連接時先發一份 snapshot,之後逐事件推送)。/opencode-live/state 保留爲只讀 API(返回同一份快照),面板本身不使用它;不再提供單獨的 HTML 頁面。
裝好並重啓 DSH 後:
- 右側邊欄「+」引導頁裏會出現 OpenCode Live,點開是常駐標籤頁,只顯示當前會話的委派。
- 左側欄出現 OpenCode Live 圖標,點開是全局頁,按會話分組彙總所有會話的委派(running / error 優先),頁面右側標註「所有 session」,並可一鍵「返回對話」。
兩個視圖共用同一條 SSE 全局流和同一套卡片渲染。打開全局頁會替換中央對話區,右欄標籤頁內容此時隱藏;返回對話即恢復。
面板裏能看到什麼¶
| 事件 | 來源 |
|---|---|
主會話的 agent(mode)和 model |
session/new 的 configOptions,以及 config_option_update |
| 每次工具調用(標題 / kind / 狀態) | session/update → tool_call / tool_call_update |
| OpenCode 派給子 agent 的任務(含 agent 名) | tool_call_update.rawInput.agent |
| 子會話的生命週期(created / running / completed) | opencode/session/child_update(需要客戶端聲明 _meta["opencode/child-session-updates"]) |
| 子會話裏的工具調用和消息 | 同上的 child_update.update |
| 思考片段、token 用量、結束原因 | agent_thought_chunk、usage_update、prompt 結果 |
子 agent 的模型不在 ACP 流裏。面板能確認主會話的 model,以及每個子 agent 的名字和動作;子 agent 自己用的模型需查看 OpenCode 的會話存儲。
安裝與啓用¶
在 DSH profile 裏用 plugin_manager 的 install_bundle 安裝本插件目錄。bundle 的 cordis.patch.yml 會插入兩行:provider(opencode-live)和工具(opencode,maxDepth: provider-managed)。
ACP 客戶端僅使用 Node 內置模塊;@deepseek-ai/schemastery 聲明爲 peerDependency,由 DSH 安裝提供,link 方式安裝時也會被正確解析,不需要本地 node_modules。
bundle 同時聲明瞭 dsh.client,因此安裝後需要重啓一次 DSH(新的 Client 模塊在啓動時掃描);之後每次委派都會出現在面板裏。卸載或禁用時,Host 側通過 ctx.effect 釋放路由與 provider。
當前 package.json 中 engines 要求 DSH 版本 >=0.2.1-rc.2 <0.2.3,插件版本 0.15.1,許可證 MIT。
配置要點¶
在 profile 的插件配置中,id 爲 opencode-live,name 爲 dsh-opencode-live。常用字段如下(完整示例見倉庫 README):
- id: opencode-live
name: dsh-opencode-live
config:
# 省略時依次嘗試 $OPENCODE_BIN、~/.opencode/bin/opencode、PATH
command: opencode
args: ['acp']
permission: ask
askFallback: reject
askTimeoutMs: 600000
path: /opencode-live
historyRuns: 30
historyDays: 7
historyEvents: 200
env: {}
說明幾步含義:
permission:ask把 OpenCode 的權限請求轉成 DSH 問題卡片(允許一次 / 始終允許 / 拒絕);allow自動同意;reject爲只讀子智能體。askFallback:問題送不到用戶(無應答者或超時)時的回退;運行被取消時直接回cancelled。path:面板與 Host 路由路徑,默認/opencode-live。historyRuns/historyDays/historyEvents:跨重啓保留 run 與事件的策略;historyRuns: 0關閉持久化。
模型與 agent 也可在「設置 → 插件 → dsh-opencode-live」配置頁修改(寫回 profile patch)。留空則用 OpenCode 默認值;ACP 不會繼承 preset 裏 agent→model 的映射。
典型用法¶
經過上面的安裝與重啓,在 DSH 對話裏通過 opencode 工具委派任務即可;無需爲面板單獨再開頁面。右側 OpenCode Live 看當前會話,左側圖標進入全局頁查看所有 session 的 running / error 優先列表。
若需聯調 provider 層,倉庫說明 lib/provider.js 不依賴 DSH,可脫離宿主單獨驅動 opencode acp 子進程。開發時可做語法檢查:
node --check index.js client.js lib/provider.js lib/trace.js
歷史記錄、安全與限制¶
歷史記錄¶
運行記錄默認在內存中;也可鏡像到磁盤,重啓 DSH 後仍可見。位置爲 $DSH_HOME/opencode-live/history.json(未設置 $DSH_HOME 時爲 ~/.dsh/opencode-live/history.json),權限 0600。內容可能包含模型思考片段、工具描述、最終回答、token 用量與 OpenCode stderr 尾部;共享機器上應視爲敏感數據。單文件超過約 2 MB 時會繼續丟棄最老的 run。
安全邊界¶
- 子進程不在 DSH 的文件沙箱之下。默認
permission: ask爲 fail-closed 取向;askFallback默認reject。 - 面板路由
/opencode-live/*複用 DSH Web UI 鑑權(connection.requestRejection、dsh-auth-*cookie);外來 Origin 或無效鑑權 fail-closed。 - 發往瀏覽器的 trace 只帶目錄名 / 命令名(basename),不下發絕對路徑。子進程環境會過濾
*_API_KEY、*_TOKEN等;確需傳遞時用config.env顯式補回。
限制(README 原文)¶
- 外部子智能體是一次性的:只回最終文本,不能
send_message追問。 - 面板是本進程內存裏的環形記錄(最多 50 個 run、每個 600 條事件),進程重啓即清空。
- 只爲 OpenCode 的 ACP 擴展做了適配;換成別的 ACP agent 時,
child_update相關行不會出現。
適用場景與注意¶
適合需要在 DSH 主工作流裏委派 OpenCode,又希望同屏看到 agent 切換、工具調用與子 agent 生命週期的開發者。安裝前建議閱讀 源碼與 LICENSE(MIT),確認子進程權限與歷史文件落盤策略符合你的環境。
插件以當前 DSH 進程權限啓動 opencode acp;權限卡片與 OpenCode 自身 deny 規則共同決定實際能力。
結尾¶
dsh-opencode-live 把 OpenCode 的 ACP 流接到 DSH 子智能體工具上,並用 SSE 驅動的 OpenCode Live 面板統一展示當前會話與全局委派狀態。進一步瞭解與安裝 bundle,見 社區目錄頁 與 GitHub README。