状态: ready-for-implementation 日期: 2026-05-14
参考:
- OpenClaw:
docs/concepts/multi-agent.md - OpenClaw:
docs/tools/subagents.md - OpenClaw:
docs/tools/acp-agents.md - OpenClaw:
src/commands/agents.commands.*.ts - OpenClaw:
src/agents/system-prompt.ts - OpenClaw:
src/agents/subagent-announce.ts - OpenClaw:
docs/reference/templates/ - OpenManus:
app/flow/planning.py,app/tool/planning.py - DeepCLI:
../kernel/architecture.md - DeepCLI:
../kernel/subsystems/session.md
DeepCLI 要交付 OpenClaw-style 的多 Agent 能力:
Access/Gateway -> Agent Hub Router -> agent session
agent session -> sessions_send/spawn -> Agent Hub Router -> agent session
agent session -> sessions_spawn(runtime="acp") -> Codex / Claude Code / other ACP runtime
关键点:
- OpenClaw 的 Agent 间通信不是靠 Gateway 当总线,也不是靠 ACPX 互调。
- Gateway/Access 只负责外部入口、bindings 和 reply sink。
- Agent 间通信靠
sessions_send/sessions_spawn,统一经过 Agent Hub。 - ACPX 只作为外部 ACP harness 的兼容参考,不做 DeepCLI 内部总线。
交付多个可长期存在的 agentId:
- 默认 agent 叫
main;现有primary只作为兼容别名。 - 每个
agentId都有独立workspace、agentDir、session store、transcripts、 prompt/profile/model/tool/memory scope。 - session key 使用 OpenClaw 形态:
agent:<agentId>:mainagent:<agentId>:subagent:<uuid>agent:<agentId>:acp:<uuid>
交付 agent 的增删改查能力:
- create: 创建
AgentDefinition、workspace、agentDir、sessions、prompt bootstrap; 支持非交互--workspace、--model、--agent-dir、--bind。 - read/list: 查询当前可见 agents、identity、workspace、
agentDir、model、 bindings、routes、providers、runtime status、queue status。 - update: 修改 identity、workspace、runtime、model/profile、policy、bindings、 per-agent tool/sandbox/subagent overrides。
- delete: 禁止删除
main;停止 runtime;删除 config/bindings/allowlist;把 workspace、agentDir、sessions 移到 trash。
Agent 自己默认只能通过 agents_list 查询 policy-filtered Agent Directory。
创建、修改、删除 agent 属于管理能力,需要用户授权或 operator scope。
OpenClaw 管理面还包含这些必须对齐的细节:
- 默认 agent 规则:
agents.list[].default可标记默认;多个默认时第一个生效; 未显式设置时第一个 agent 是默认;DeepCLI 对外默认名仍是main。 agents list --bindings --json不只是列 id,还显示IDENTITY.md/ config identity、 route summaries、provider/channel status 摘要,并提示 live health 走 channels probe。agents bind/unbind/bindings是独立管理面;unbind --all可移除某 agent 的全部 route bindings。- binding 写入要检测冲突:同一 match 不能被两个 agents 同时 claim;同一 agent 的 channel-only binding 可升级成 account-scoped binding。
- delete 必须 prune
bindings[]和tools.agentToAgent.allow,并报告 removed counts。 agents set-identity可从 workspaceIDENTITY.md读取,也可显式写 name/emoji/theme/avatar; 未给--agent时可通过 workspace 反查唯一 agent。- per-agent config 不止 runtime/model:还包括 thinking/reasoning/fast defaults、stream
params、skills、memorySearch、heartbeat、groupChat mention patterns、sandbox、
tools profile/allow/deny/elevated、
subagents.allowAgents。
对用户暴露两层入口:CLI slash command 给人用,operator JSON-RPC 给 Home Screen / automation 用。两者必须调用同一组 management service,不能各自改 config。
CLI slash commands:
/agents list [--bindings] [--json]
/agents add <name> --workspace <dir> [--model <id>] [--agent-dir <dir>] [--bind <channel[:accountId]>]
/agents set-identity <agentId> [--from-identity] [--identity-file <path>] [--name <name>] [--emoji <emoji>] [--theme <text>] [--avatar <path-or-url>]
/agents bindings [--agent <agentId>] [--json]
/agents bind <agentId> --bind <channel[:accountId]> [...]
/agents unbind <agentId> (--bind <channel[:accountId]> [...] | --all)
/agents delete <agentId> [--force] [--json]
Channel/platform commands(本计划新增;当前 DeepCLI 没有等价命令):
/channels list [--no-usage] [--json]
/channels status [--probe] [--timeout <ms>] [--json]
/channels capabilities [--channel <name>] [--account <accountId>] [--target <dest>] [--json]
/channels resolve <entries...> --channel <name> [--account <accountId>] [--kind auto|user|group|channel] [--json]
/channels logs [--channel <name>|all] [--lines <n>] [--json]
/channels add --channel <name> [--account <accountId>] [--name <display>] [channel-specific credentials/options]
/channels remove --channel <name> [--account <accountId>] [--delete]
/channels login [--channel <name>] [--account <accountId>] [--verbose]
/channels logout [--channel <name>] [--account <accountId>]
/channels setup [<channel>] [--account <accountId>] # interactive alias for /channels add
当前实现只有 legacy gateways: config、GatewayManager 生命周期加载和
POST /gateways/{adapter_id}/webhook webhook 入口;它们不是 OpenClaw 的
channels add/status/onboarding 管理面。/channels * 必须作为 operator-facing
命令新增,并接到同一组 management service。命名以 OpenClaw 为准:主写入口叫
channels add/remove/login/logout,setup 只是交互式 alias,内部语义仍是
channels add + setupChannels()。
DeepCLI 对齐 OpenClaw 的 channel 命令职责:
list: 从 Channel Registry + Auth/Profile store 读取配置账号,输出 configured / enabled / linked / token source / usage 摘要;JSON 输出给 Home Screen 复用。status: 优先经 Gateway RPCchannels.status取 live snapshot;Gateway 不可达时 fallback 到 config-only status。--probe允许做凭证/连接探测,但必须有超时。capabilities: 展示 channel/account 的 intents、scopes、可用动作、风险开关,用于 配置前确认权限面。resolve: 调 channel plugin resolver,把人类输入的 user/group/channel 名称解析为 route binding 可使用的稳定 id。logs: 读取 Gateway/channel 日志,按 channel 和行数过滤,debug 外部通信闭合缝。add: 非交互模式写channels.<channel>或channels.<channel>.accounts.<accountId>; 交互模式运行setupChannels(),按 plugin 的 setup adapter 收集 token、webhook、 auth dir、allowlist 等字段,写入 SecretManager / ConfigManager,并运行 post-write hook。remove: 默认 disable channel account,--delete才删除 config;同时触发 channel lifecycle hook。login/logout: 面向 WhatsApp/Matrix/Slack 等需要运行态登录的 channel,走 Gateway RPC 或 plugin auth adapter,不直接让普通 agent 处理密钥。setup: 只作为用户友好的交互式 alias,避免计划里出现一套和 OpenClaw 不同的主术语。
Operator JSON-RPC methods:
_mustang.agent/agents/list
_mustang.agent/agents/create
_mustang.agent/agents/update
_mustang.agent/agents/delete
_mustang.agent/agents/set_identity
_mustang.agent/agents/list_bindings
_mustang.agent/agents/bind
_mustang.agent/agents/unbind
_mustang.agent/channels/list
_mustang.agent/channels/status
_mustang.agent/channels/capabilities
_mustang.agent/channels/resolve
_mustang.agent/channels/logs
_mustang.agent/channels/add
_mustang.agent/channels/remove
_mustang.agent/channels/login
_mustang.agent/channels/logout
_mustang.agent/agents/update 是 Home Screen / automation 的 PATCH 型接口,
不对应 CLI slash command;人的 CLI 入口拆成 set-identity、bind/unbind 等
可解释的具体动作。
Agent-visible tools:
agents_list:普通 agent 可用,只返回 policy-filtered Agent Directory。- 管理写操作不是普通 tool。agent 若要创建/修改/delete/bind/channel add,必须发起 management request,经 operator permission / Home Screen 确认后由 management service 执行。
交付 OpenClaw 命名的工具面:
agents_list: 返回当前 session 允许看到、发送、spawn 的 agents。sessions_send: 向已有 session 投递消息,不创建新 session。sessions_spawn: 创建sub-agent session或ACP session。subagents: list/info/log/kill/send/steer 当前 session 创建的 sub-agent runs。
这些工具取代产品语义上的 AgentTool。AgentTool 可以保留为内部兼容层,
但不作为多 Agent 产品入口。
交付外部平台消息进入多 Agent 的路径:
- Access/Gateway 规范化外部消息为
InboundEnvelope。 bindings[]按channel、accountId、peer、parentPeer、guild/team/thread 匹配到agentId或 session。- 出站回复从 runtime 走 Hub -> Access -> reply sink。
- 平台 adapter 不直接调用 Mustang
SessionManager。
外部通信配置分两层交付:
channels.*/platforms.*:平台账号、token/webhook、DM/group policy、 allowlist、streaming、media、proxy 等 channel runtime 配置。bindings[]:把已配置 channel/account/peer/guild/team/thread route 到某个agentId或 persistent ACP session。bindings[]支持type: "route"和type: "acp";type缺省等同 route。- 某些 channel 还支持 topic/thread 级
agentIdoverride;它要被归一化进同一套 Hub routing snapshot,不能成为 adapter 私有捷径。 - 外部 conversation 默认是持久 session:Access/Hub 必须从
channel + accountId + peer/guild/team/thread + agentId生成稳定 session key; 已存在则恢复并追加 transcript,只有没有历史 session 时才创建。除非显式配置oneshot/ 临时模式,否则 Discord/Telegram/Slack 等入口不能每条消息新建对话。
这两层都由 operator-facing 管理面完成:CLI、Home Screen 或 operator JSON-RPC。 普通 agent 默认不能直接写外部通信配置;它最多可以提出配置建议,或在获得 operator scope / 用户确认后调用受控 management method。
交付 ACP runtime backend,让 Codex、Claude Code、Gemini CLI 等外部 harness
成为可路由的 ACP agent / ACP session:
agents:
list:
- id: codex
runtime:
kind: acp
command: ["codex", "acp"]
- id: claude-code
runtime:
kind: acp
command: ["claude", "code", "--acp"]它们要有 DeepCLI 统一的 identity、session key、status、cancel、close、queue、 bindings 和 permission tunnel。
交付 OpenClaw 风格 agent 创建体验和启动文件:
- 创建字段复用 OpenClaw:
agentId、workspace、agentDir、auth/model、channels、 bindings。 - bootstrap 文件:
AGENTS.md、SOUL.md、IDENTITY.md、USER.md、TOOLS.md、HEARTBEAT.md、BOOTSTRAP.md、MEMORY.md。 - system prompt 复用 OpenClaw section 思路:tooling、safety、workspace、 runtime、current date/time、reply tags、heartbeats、reasoning。
- sub-agent 注入
# Subagent Context:只做当前任务,completion push 回 parent, 不轮询、不伪装 parent、不做长期状态维护。
做法:
- 把现有 Mustang runtime 改成可多实例化。
- Agent Hub Manager 根据
AgentDefinition启动多个 runtime instance。 - 每个 runtime instance 绑定一个
agentId和独立AgentResources。 SessionManager、orchestrator、tool registry、tool authz、LLM、MCP、skills、 hooks、memory、tasks 都继续复用,只是依赖从当前 agent scope 读取。
为什么:
- 这和 OpenClaw 的
agentId + workspace + agentDir + sessions模型一致。 - 不复制 Mustang 代码,避免两套 agent loop。
- 启动期可拒绝多个 agents 复用同一个
agentDir或 session store,避免 auth/session 串线。
做法:
- Hub Router 负责 target 解析、policy、correlation、status projection。
- 目标 runtime 的 per-session queue 负责真正执行 turn。
- Hub 不执行 LLM turn,也不持久化对话队列。
为什么:
- Agent 间通信需要统一路由、权限、状态和可观测性。
- Session FIFO 必须留在各 runtime/session 内,否则会绕开现有 SessionManager 边界。
做法:
sessions_send只发送到已有sessionKey/sessionId。- 支持
wait、timeout、accepted、reply-back loop、announce step。 - transcript 写入
inter_sessionprovenance。
为什么:
- 这是 OpenClaw 的 session-to-session messaging。
- 它解决“Agent 怎么知道跟谁通信”:先由用户显式指定、已有 binding、plan step
metadata 或
agents_list选择目标;不靠广播猜测。
做法:
runtime="subagent"创建agent:<agentId>:subagent:<uuid>。runtime="acp"创建agent:<agentId>:acp:<uuid>,由AcpRuntimeController启动 Codex/Claude Code 等进程。- 支持
mode="run" | "session"、thread/current-conversation binding、cleanup、 timeout、sandbox inheritance guard、attachments。
为什么:
- OpenClaw 区分长期 agent session、一次性 sub-agent run、外部 ACP session。
- Codex/Claude Code 需要 status/cancel/close/binding,不应被塞进私有
AgentTool。
做法:
- 新平台入口放在 Access Agent。
- adapter 只做 webhook/authn/event normalize/reply sink。
- binding resolution 产生 target hint,最终 route 仍交给 Hub Router。
- channel/account 凭证与平台策略由 Access/Platform management 写入 Config/Secrets;
route ownership 由 Agent management 写入
bindings[]。
为什么:
- Gateway 如果直接调用
SessionManager,会形成第二套路由和权限路径。 - Home Screen、CLI、平台消息都必须看到同一套 session state projection。
OpenClaw 对照:
openclaw agents addwizard 会问Configure chat channels now?,调用setupChannels()写channels.*。- 同一个 wizard 随后问
Route selected channels to this agent now? (bindings), 调buildChannelBindings()/applyAgentBindings()写顶层bindings[]。 - 非交互模式可用
openclaw agents add --bind <channel[:accountId]>或openclaw agents bind/unbind/bindings单独管理 routing bindings。 bindings[]只声明 route/acp binding;平台凭证、allowlist、webhook 等仍在 channel config 里。- route binding 的确定性匹配顺序是:
peer、parentPeer、guild+roles、guild、team、exact account、channel-wide、default agent;同一层第一个匹配 wins。 type: "acp"binding 用于 persistent ACP conversation,按精确 conversation identity 解析,不走普通 route binding tier order。
DeepCLI 当前差距:
- 已有
AgentDefinition.bindings、PlatformBindingSpec、AgentHubManager.binding_plan()这类声明式骨架。 - 但 Access 进程当前仍加载 legacy
kernel.agents.mustang.gateways.GatewayManager。 旧GatewayAdapter会在_handle()里直接创建/运行 Mustang session。 - 还没有 operator-facing 的
/channels add/status/login/logout/remove、/agents bind、bindings conflict 检查、SecretManager 写入和 Access binding plan hot reload。 - 所以现在的 agent 还做不到自己完成 Gateway 对外通信配置;正确实现也不应该让 普通 agent 直接做。应交付受控管理面,再让 agent 通过授权路径请求管理动作。
做法:
- CLI/Home Screen/JSON-RPC 都调用同一组 management method。
agents add/list/delete/bind/unbind/set-identity的语义对齐 OpenClaw。- 写 config 前后都通过 Hub Manager reload/restart 对应 runtime。
agents add可以串起channels add交互式 onboarding,但 channel config 写入和 route binding 写入 必须保持两层分离。- Management methods 必须返回结构化结果,包含 added/updated/skipped/conflicts、 removed bindings/allow entries、trash paths、identity source、route summaries。
- Slash command 只是 management method 的薄壳;Home Screen、CLI、automation 看到的结果 schema 必须一致。
- ConfigManager 是管理面写入的权威 store;Agent Directory 是按 policy 过滤后的 read model,不是让 agent 直接读全局 config。
为什么:
- Agent 是可管理资源,不只是 prompt 里的名字。
- CRUD 必须同时处理 config、workspace、
agentDir、sessions、bindings、policy、 runtime lifecycle。
做法:
- 支持 durable plan:每个 step 可记录
targetAgentId、session、runtime、runId、 acceptance、status、notes。 - 执行 step 时仍调用
sessions_send或sessions_spawn。
为什么:
- OpenManus 的 plan/status 对跨 Agent 工作有用。
- 但 OpenManus 是同进程对象调用,不具备 OpenClaw 的 agent lifecycle、bindings、 transcript provenance,所以只能借鉴 planning,不借鉴通信模型。
直接按下面这些交付块实现;它们不是阶段划分,全部都是本计划完成条件的一部分。
-
Agent contracts / config schema
- 收敛
kernel.agent_hub.contracts.schema与kernel.agent_hub.contracts.schemas的重复模型,保留一套 OpenClaw-style 命名:AgentDefinition、runtime、workspace、agentDir/stateDir、bindings[]、identity、resources。 - 在 ConfigManager 下新增/接入
agents.list[]和顶层bindings[]schema;main是对外默认 agent,primary只做兼容 alias。 - 明确 session key builder:
agent:<agentId>:main、agent:<agentId>:subagent:<uuid>、agent:<agentId>:acp:<uuid>。
- 收敛
-
Agent management service
- 在
kernel.agent_hub.manager下实现单一 management service,负责agents list/create/delete/set_identity/list_bindings/bind/unbind。 - 所有写操作都先更新 ConfigManager / SecretManager,再 reload Hub snapshot; slash command、Home Screen JSON-RPC、automation 只能调用这一个 service。
- 实现 OpenClaw binding 语义:parse
channel[:accountId]、冲突检测、 同 agent account-scope upgrade、unbind --all、delete prune。
- 在
-
Channel management service
- 新增 Channel Registry / ChannelAccount 抽象,现有 Discord gateway 和其他 channel adapter 都按同一接口接入。
- 实现
channels list/status/capabilities/resolve/logs/add/remove/login/logout;setup只作为add的交互式 alias。 channels add/remove/login/logout写channels.*/ secrets / lifecycle hook; 不写 route ownership。route ownership 只由agents bind/unbind写bindings[]。
-
Command / JSON-RPC surface
- 扩展
kernel.agents.mustang.commands.CommandManager的 catalog,让/agents *和/channels *出现在可用命令里。 - 在 ACP routing / session handler 增加
_mustang.agent/agents/*与_mustang.agent/channels/*methods;这些 methods 只做鉴权、参数解析和 service 调用,不直接改配置。
- 扩展
-
Hub Router / runtime delivery
- 扩展
AgentHubRouter,从bindings[]snapshot 按peer -> parentPeer -> guild+roles -> guild -> team -> account -> channel -> default解析 target。 - 把
sessions_send/sessions_spawn做成 model-visible tools,并接到 Hub;sessions_send只投递已有 session,sessions_spawn创建 subagent / ACP session。 - 每次跨 agent 投递都写 correlation id、source/target session、provenance。
- 扩展
-
Access / Gateway rewrite seam
- 保留现有
GatewayManager作为 legacy adapter 兼容层,但禁止 adapter 直接创建 Mustang session。 routes/gateways.py/ platform webhook 只产出InboundEnvelope,交给 Hub Router; reply 统一走 runtime -> Hub -> Access reply sink。- binding plan 变化后 Access 热更新,不需要重启进程才能切换 route ownership。
- 保留现有
-
ACP external runtime
- 实现
AcpRuntimeController,支持 initialize/new/prompt/cancel/close/status。 - Codex、Claude Code 等外部进程作为
runtime.kind=acpagent 接入,拥有独立 session key、status、permission tunnel、transcript provenance。
- 实现
-
Prompt / bootstrap
agents add创建 workspace bootstrap 文件:AGENTS.md、SOUL.md、IDENTITY.md、USER.md、TOOLS.md、HEARTBEAT.md、BOOTSTRAP.md、MEMORY.md。- system prompt composition 增加 agent identity、resource scope、tool policy、 current date/time、reply tags、heartbeat、subagent context section。
- AgentDefinition validation:
agentId、agentDir、session store 唯一性。 - Contract convergence:只允许一套 AgentDefinition / BindingPlan contract 被业务代码导入。
- Default agent resolution:
mainfallback、first default wins、no default uses first agent。 - Agent Directory policy filtering:只返回当前 session 允许看到的 agents。
- Agent summaries:identity source、providers、route summaries、bindings count。
- Management command parity:slash command 与 JSON-RPC method 走同一 service, 返回同一 added/updated/skipped/conflicts/removed schema。
- Router resolution:显式 target、conversation binding、config binding、default route; peer/parentPeer/guild+roles/guild/team/account/channel/default 顺序。
- Binding priority:most-specific wins。
- Channel add / binding split:channel credentials 不进入
bindings[]; binding conflict 时不能覆盖其他 agent。 - Channel command parity:
channels list/status/capabilities/resolve/logs/add/remove/login/logout的 slash command 与 JSON-RPC method 走同一 service;setup只测为add的交互式 alias。 - Command catalog:
/agents *、/channels *都能从CommandManager/ ACPcommands/list看到。 - Binding management:add/update/skip/conflict、unbind exact、unbind all、account-scope upgrade。
- Delete pruning:
bindings[]、tools.agentToAgent.allow、workspace/agentDir/sessions trash。 - Identity update:从
IDENTITY.md读取、显式字段覆盖、workspace 反查 agent。 sessions_sendpayload mapping、timeout、wait、provenance。sessions_spawnruntime selection、mode、cleanup、depth/concurrency guard。tools.sessions.visibility与tools.agentToAgent共同限制跨 session / 跨 agent targeting。- ACP permission request:已知 request tunnel,未知 request fail closed。
- 启动
main+research两个 Mustang runtime,确认各自 session DB/transcript 独立。 main调agents_list,只能看到 policy 允许的 targets。main调sessions_send到research,researchFIFO 执行,返回结果并写 provenance。main调sessions_spawn(runtime="subagent"),生成 sub-agent session,completion announce 回 parent。- fake platform inbound 通过 Access -> Hub -> bound agent session,reply sink 收到回复。
- 同一 fake platform conversation 连续发两条消息,必须命中同一个 session key, transcript 连续追加;不同 thread/peer/account 才分配不同 session key。
/channels add写 channel config/secret;/agents bind写 route binding; Access 收到新的 binding plan 后热更新。- Legacy gateway adapter inbound 不能直接调用
SessionManager;必须走 Hub Router。 - fake ACP runtime 通过
AcpRuntimeController完成 initialize/new/prompt/cancel/close。
Definition of Done 必须跑真实闭合缝:
- CLI -> Access -> Hub -> Mustang Runtime -> reply。
- Agent ->
sessions_send-> Hub -> Agent -> reply。 - Agent ->
sessions_spawn(subagent)-> Hub -> Mustang Runtime -> announce。 - Agent ->
sessions_spawn(acp)-> Hub -> ACP process -> announce。 - Runtime permission request -> Hub -> Access -> user decision -> runtime。
- Platform fake inbound -> Access binding -> Hub -> runtime -> reply sink。
只跑 unit tests 不能算完成。
你可以运行或通过 Home Screen 做等价操作:
/agents list
/agents add research --workspace /tmp/deepcli-research
/agents set-identity research --name Research --theme "Finds sources and summarizes"
/agents bind research --bind cli
/agents bindings --agent research --json
/agents unbind research --all
/agents list --bindings --json
/agents delete research
期望:
main永远存在且不能删除。research有独立workspace、agentDir、sessions。- list 能看到 identity、bindings、routes、providers、runtime status、queue status。
- binding 冲突会被拒绝,不会静默抢走其他 agent 的 route。
- delete 后 runtime stopped,bindings 和
tools.agentToAgent.allow被 prune,状态目录进入 trash。
在 main 对话里问:
列出你现在可以通信的 agents,并说明什么时候该用它们。
期望:
- agent 调
agents_list。 - 返回的是 policy-filtered Agent Directory。
- 每个 target 有
agentId、description、capabilities、whenToUse、canSend、 canSpawn、runtimeKind。 - 如果目标不明确,agent 会问你,不会广播给所有 agents。
对 main 说:
把这个问题发给 research agent,让它找 3 个来源,然后把结果总结给我。
期望:
main使用sessions_send,不是创建新 agent。research的 session transcript 出现inter_sessionprovenance。main收到结果后总结给你。- UI/日志能看到 source session、target session、correlation id、timeout/wait 状态。
对 main 说:
开一个 sub-agent 检查当前 repo 的测试结构,完成后告诉我结论。
期望:
- 创建
agent:main:subagent:<uuid>。 - sub-agent prompt 包含
# Subagent Context。 - sub-agent 不假装自己是 parent,不主动和外部平台对话。
- completion 通过 announce 回到
main。
配置一个 external agent,例如:
agents:
list:
- id: codex
workspace: /path/to/repo
runtime:
kind: acp
command: ["codex", "acp"]然后对 main 说:
让 codex agent 看一下这个 repo 的入口文件,并返回它认为的架构摘要。
期望:
main使用sessions_spawn(runtime="acp", agentId="codex")。- Hub 创建
agent:codex:acp:<uuid>。 - ACP process 有 status、cancel、close。
- 返回结果进入 transcript,且 provenance 标记为 ACP session completion。
先由 operator 配置 channel 和 binding:
/channels add --channel telegram --account personal
/agents bind research --bind telegram:personal
/agents bindings --json
用 fake platform adapter 或测试 webhook 发送一条消息到绑定 conversation:
channel=telegram accountId=personal peer=chat-123 message="hello"
期望:
- Access 只规范化 inbound,不直接调用
SessionManager。 - Hub Router 根据 binding 路由到目标
agentId/session。 - 回复从 runtime -> Hub -> Access -> reply sink。
- follow-up 继续进入同一 binding session。
- 普通 agent 如果尝试直接改 channel token/binding,会触发 management permission, 未授权时拒绝。
完成时必须同时满足:
- 多个 Mustang agents 可并存,资源和 sessions 不串线。
agents_list/sessions_send/sessions_spawn/subagents可用。- Gateway/Access external inbound 统一经 Hub Router。
- Codex/Claude Code 等 ACP runtime 可作为
ACP agent接入。 - Agent CRUD 能管理 config、workspace、
agentDir、sessions、bindings、policy、 runtime lifecycle。 - 所有跨 subsystem 闭合缝有真实 probe 记录。