@ dougbots/ avenor- opencode (打开代码)
在您的 OpenCode 会话中, 注册代理服务器的 OpenCode 插件将作为工具运行 。 当您需要子代理来处理一个定义明确的任务时——写出代码,运行测试,搜索一个代码库——在您保持会话焦点的同时,代理者在背景中运行.
设置
安装套件并附带对等依赖 :
bun add @dougbots/avenor-opencode @opencode-ai/[email protected]
OpenCode 2 直接从默认导出加载插件定义形状, 因此运行时不需要 OpenCode 2 包; OpenCode 1 主机 (1. 18.29+) 调用同一切入点 server()。 。 。 .
你还需要 avenor 二进制. 要么加进你身上 PATH 或设置 AVENOR_BIN 环境变量到其位置.
# Option 1 — add to PATH (e.g. via mise, brew, or manual install)
which avenor
# Option 2 — explicit path
export AVENOR_BIN=~/.botfiles/bin/avenor
注册插件
添加 @dougbots/avenor-opencode 到您的 OpenCode 配置 。 如果您使用全局配置 :
// ~/.opencode.json
{
"plugins": ["@dougbots/avenor-opencode"]
}
对于项目级别配置,将同一条目添加到 .opencode.json 在你的还原根.
注册后,插件会曝光您 OpenCode 代理可以直接调用的工具——不需要额外的配置 : avenor_spawn, (中文(简体) ), avenor_status, (中文(简体) ), avenor_result, (中文(简体) ), avenor_inspect, (中文(简体) ), avenor_answer_permission, (中文(简体) ), avenor_message, (中文(简体) ), avenor_peers, (中文(简体) ), avenor_events, (中文(简体) ), avenor_kill, (中文(简体) ), avenor_shutdown,以及 avenor_workflow。 。 。 .
行为
当发送运行时 avenor_spawn,插件为:
- 默认区块 ——工具调用保持开放状态,随着子代理运行更新其标题和元数据,与OpenCode自己的子代理工具调用完全一样. 当运行到达终端状态时工具返回 .
- 完成后重新提示 当
wait=false(fire-and-forget)运行完成,插件会自动向管弦乐会场注入一个完成信息,所以LLM在没有人工投票的情况下接取. - 路由权限 当一个子剂运行在
opencode-http后端请求权限,插件向管弦乐会话注入了再提示. LLM可以打电话avenor_answer_permission;正常权限对话框也显示为倒置. - 格式化结果 —— OpenCode 返回简洁, 其共享的有约束的道词
output页:1avenor_status, (中文(简体) ),avenor_result, (中文(简体) ),avenor_answer_permission, (中文(简体) ),avenor_message, (中文(简体) ),avenor_peers, (中文(简体) ),avenor_events, (中文(简体) ),avenor_inspect,以及avenor_shutdown结构化元数据留在主机/会场状态. - 发布自己完成的回合 ——每一次对话都公布其已解决的回合,作为自己的约束,通过经纪人的同级最后消息途径,按每个对话顺序进行,所以是同行的
avenor_peersaction: "last"读一下它的名字. - 接收信件 - 绑定的谈话运行一个
avenor feed broker消费者,被认证为对话本身的跑道,每条饲料记录的到来作为快件标记为另一会话的词句,一次一个记录的到来顺序. 原生标题作为跑步名称发布,所以同龄人可以看到对话的自有名称;没有原生标题,对话使用opencode-<repo>从其目录中,具有相同的主机名和运行-id-tail规则的 Pi 扩展使用. 见 邮件。 。 。 .
MCP客户给出自己的结果.
工具
avenor_spawn
在当前工作目录中发送代理运行 .
屏蔽模式( 默认 ), wait=true: 工具调用显示实时进度更新,并在运行完成时返回结构化结果.
火灾和遗忘wait=false: 随即返回 run_id. 完成后自动重排会话.
| 参数 | 需求 | 说明 |
|---|---|---|
agent | 没有 | 代理名称; 省略使用提供的模型或运行时间默认值 |
prompt | 没有 | 提示文本 |
prompt_file | 没有 | 快速文件路径 |
label | 没有 | 运行时的可读标签 |
timeout | 没有 | 暂停时间(例如:. 3600s, (中文(简体) ), 30m(中文(简体) ) |
model | 没有 | 模型覆盖 |
thinking | 没有 | 运行级推理控制; 不支持的有效后端拒绝显式值 |
backend | 没有 | 后端覆盖; 直接模式默认为 Avenor opencode-acp 删除后端 |
roster_file | 没有 | 高级名册地图路径 |
roster_entry | 没有 | 内键 roster_file |
wait | 没有 | 屏蔽到完成( 默认) true(中文(简体) ) |
supervisor_id | 没有 | 通过 socket 路径重新使用已有导师 |
产卵母道是对话本身的束缚跑道,所以通过 只有在产卵经过控制运行的主管——默认情况下 单子,或明确命名的同一套接字。 一只卵子指着另一个 主管仍然在那里运行,没有母路线.
工作目录( E)dir)是从您的 OpenCode 会话上下文自动被注入的——它不是一个面向用户的参数.
直接模式和名册模式
使用 roster_file 加号 roster_entry 以选择完整的身份。 每个名册条目都要求 backend 其中至少一个 agent 或者说 model; 名册模式拒绝直接 agent, (中文(简体) ), model,以及 backend 超载 直接模式允许所有三个身份字段独立省略,包括后端只选择. 名册模式不应用直接 opencode-acp 默认.
{
"prompt": "Review the repository",
"roster_file": "/repo/roster.json",
"roster_entry": "reviewer",
"wait": true
}
列入名册的条目 backend, (中文(简体) ), agent, (中文(简体) ), model,可选 thinking 默认; system 被拒绝。 明确的运行级别 thinking 胜过条目, 并被验证对有效的后端。 续会不能改变后端。 插件通过 roster_file 因此,当OpenCode进程目录与项目目录不同时,绝对路径可以避免模糊.
avenor_status
获取特定运行状态或所有活动运行状态 。 使用紧凑 lifecycle 查看进度和等待检查的许可; full 仍然是兼容默认值.
| 参数 | 需求 | 说明 |
|---|---|---|
run_id | 没有 | 用于查询的特定运行 ID( 所有运行的密件) |
view | 没有 | 详细反应: lifecycle 或者说 full (默认) |
supervisor_id | 没有 | 通过 socket 路径重新使用已有导师 |
avenor_result
等待运行完成并返回其完整的最终输出,没有记录或事件细节. 这是输出检索工具; avenor_status 仍然是一次生命周期检查.
| 参数 | 需求 | 说明 |
|---|---|---|
run_id | 对 | 运行ID等待 |
wait | 没有 | 等待终端结果( 默认) true(中文(简体) ) |
timeout | 没有 | 最多等待时间( 例如 30s 或者说 5m(中文(简体) ) |
supervisor_id | 没有 | 通过 socket 路径重新使用已有导师 |
被封锁的运行返回其等待的许可, 而不是永远等待 。 如果此工具本身的超时过期, 它返回最新的状态 ready: false 财务报告和审定财务报表 timed_out: true。 。 。 .
avenor_inspect
使用 avenor_inspect 以审查一个有界限的快照。 简况包括文字记录、完成的工具和活的工具、权限和最后产出。 使用 avenor_events 当需要原始事件记录时.
| 参数 | 需求 | 说明 |
|---|---|---|
run_id | 对 | 运行ID检查 |
limit | 没有 | 要缩小到快照的最大事件 |
after_seq | 没有 | 只包含在此序列号后的事件 |
supervisor_id | 没有 | 通过 socket 路径重新使用已有导师 |
avenor_answer_permission
回答一个待批准的许可请求。 这个 option_id 从 pending_permission.options 数组返回 avenor_status。 。 。 .
| 参数 | 需求 | 说明 |
|---|---|---|
run_id | 对 | 以待决权限运行 ID |
option_id | 对 | 选项编号从 pending_permission.options |
request_id | 没有 | 请求ID( 如果省略, 自动发现) |
supervisor_id | 没有 | 通过 socket 路径重新使用已有导师 |
avenor_message
向另一个运行发送消息,撤回一个待决请求,恢复一个已完成的运行,或者发送控制回复. 每个行动都是明确的,每个结果都表明一个失败的要求是否仍然可以撤回.
action | 所需字段 | 它会做什么 |
|---|---|---|
tell | target, (中文(简体) ), message | 在不创建询问边缘的情况下发送消息 |
ask | target, (中文(简体) ), message选项 timeout_ms | 传递信息等待回复 |
reply | reply_to, (中文(简体) ), message | 答一入道传. 从其索赔中答复了这一表面的询问;经纪人将这一消息传送回寄件人。 没有路由报告的信件 ID edge-absent |
resume | target, (中文(简体) ), message选项 label, (中文(简体) ), idempotency_key | 恢复其持续届会的完成运行 |
withdraw | message_id | 撤回待决请求 |
control_reply | target选项 payload | 在供应商支持的情况下发送控制回复 |
target 是一个运行的id,一个对等标签,或者 "self"。 。 。 . timeout_ms 必须是不超过共享询问盖的整数。 此工具不使用 supervisor_id;它与默认的主管有关.
谈话是自言自语 而不是主管: tell, (中文(简体) ), ask, (中文(简体) ), reply 财务报告和审定财务报表 withdraw 作为对话, resume 仅保留所有者,以及 control_reply 这里没有支持的表面 。 答复通过feed的声称库回答——询问这次谈话的反馈是回答,第二次答复报告 edge-absent。 。 。 .
该工具的结构化元数据是"蛇"中共享的合同对象(action, (中文(简体) ), outcome, (中文(简体) ), text,以及 message_id, (中文(简体) ), run_id, (中文(简体) ), label, (中文(简体) ), reply, (中文(简体) ), sentinel_file, (中文(简体) ), on_event 当结果带回来时, MCP 主机返回的字段相同.
avenor_peers
列出可见代理会话,重命名运行,或读取运行中最后一个代理消息.
action | 字段 | 它会做什么 |
|---|---|---|
list (默认) | —— 说 | 列出可见的对等点 |
rename | name选项 session_id | 默认更改显示名称 |
last | target | 读取目标最后一个代理消息及其停止原因 |
last 在目标尚未完成转弯时返回共享的空结果. target 接受运行的id、标签或 "self"。结构化元数据是 {peers}, (中文(简体) ), {renamed} 或者说 {last} 在 snake case中,与 MCP 主机返回的对象相同.
avenor_events
从运行读取事件,可选择按类型过滤. 返回最后的 N 事件 .
| 参数 | 需求 | 说明 |
|---|---|---|
run_id | 对 | 运行ID以读取事件 |
types | 没有 | 按事件类型过滤( 字符串阵列) |
limit | 没有 | 返回最大事件( 默认为 50) |
supervisor_id | 没有 | 通过 socket 路径重新使用已有导师 |
avenor_kill
停止运行而不关闭主管。 其他运行和主管自己持续运行.
| 参数 | 需求 | 说明 |
|---|---|---|
run_id | 对 | 运行运行的ID或标签以终止 |
supervisor_id | 没有 | 多监督模式的主管ID |
avenor_workflow
驱动一个持久的工作流程实例 。 一个 action 选择动词; 每个动作都有一个可选 supervisor_id 用于多监督模式。 只读动作不需要允许; gate, (中文(简体) ), complete 财务报告和审定财务报表 cancel 保持他们的权力检查.
| 行动 | 参数 | 目的 |
|---|---|---|
status | workflow_id | 轻量级实例状态 |
inspect | workflow_id | 完整实例细节 |
events | workflow_id, (中文(简体) ), after_seq, (中文(简体) ), limit | 这个案例的日志事件 |
wait | workflow_id, (中文(简体) ), timeout | 等待终端状态或超时 |
ready | controller_id, (中文(简体) ), limit | 申请自动派送的候选人;不给予租约 |
controller_status | controller_id | 一个控制员的状态 一个咨询候选人的计数, 或者一个汇总清单没有它 |
gate | workflow_id, (中文(简体) ), node_id, (中文(简体) ), gate_id, (中文(简体) ), activation_id, (中文(简体) ), operation字段 | 记录停放的门的决定 awaiting_gate 激活 |
complete | workflow_id, (中文(简体) ), node_id, (中文(简体) ), activation_id, (中文(简体) ), attempt_id, (中文(简体) ), lease_id, (中文(简体) ), owner_token, (中文(简体) ), outcome, (中文(简体) ), outputs, (中文(简体) ), artifacts | 完成一台机器/外部交接激活 |
cancel | workflow_id, (中文(简体) ), actor, (中文(简体) ), reason | 取消整个实例( 最终) canceled(中文(简体) ) |
基本控制方法为 docs/control-protocol.md。 。 。 .
avenor_shutdown
关闭报务监督程序,清理临时档案. 工作完成或主管失事时请打电话.
| 参数 | 需求 | 说明 |
|---|---|---|
supervisor_id | 没有 | 监事会关闭( 默认为单通) |
force | 没有 | 强制关闭而不是优雅 |
关机时有个主管 命名另一个 离开此插件的束缚 对话、他们的素材和他们的证书 主管 谈话一定会放弃的.
典型工作流程
屏蔽( 默认) :
1. avenor_spawn → tool call shows live progress, blocks until done
2. (avenor_answer_permission → if a permission is routed to this session mid-run)
3. tool call returns → completion preview with status + session_id
4. avenor_result → retrieve the complete final output when needed
5. avenor_message → optionally iterate with action "resume"
6. avenor_shutdown → clean up when finished
平行/火灾和遗忘(wait=false:
1. avenor_spawn × N → each returns run_id immediately
2. plugin starts monitoring each run immediately
3. (sub-agent finishes) → plugin re-prompts this session automatically
4. avenor_answer_permission → if a permission was routed here mid-run
5. avenor_result → wait for and retrieve the final output
6. avenor_events → inspect raw event history when needed
依赖关系
- 端点 :
@opencode-ai/pluginv1.15.3( 主机代理机用于挂载插件的运行时间) - 构建时间 :
@opencode/plugin(OpenCode 2 加载器的类型定义;已建成的入站点没有运行时间引用,因此一代都不安装) - 二进制 :
avenor必须在PATH或时AVENOR_BIN(在第一个工具引用时选中, 而非插件加载时间)