前言¶
在 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。