Parent doc: ACP Client And Project-Local Servers
Issue index: ACP Client Project-Local Servers Issues
Part B 依赖一个私有 sessionUpdate: "task_complete" 扩展,不属于 ACP 标准枚举(标准集合仅含 user_message_chunk / agent_message_chunk / agent_thought_chunk / tool_call / tool_call_update / plan)。为了不让 Agentao 作为 ACP client 的行为偏离标准,并避免对 server 端引入非标扩展义务,决定彻底去掉该能力,而不是保留一个默认关闭但私有的路径。以下关于 Part B 的章节作为历史设计保留,不再代表当前实现。
在现有 project-local ACP client 基础上,补两个增强能力:
显式指定目标服务器
当用户消息中明确点名某个 ACP server 时,直接把该消息路由给对应 server,而不是继续走主 Agent 的普通 chat()。
后台 ACP server 主动 push 通知并触发后续委派 (已取消,见 Status)
当特定 server 开启实验性开关后,如果它通过 session/update 主动推送 task_complete 类型通知,Agentao 会在安全空闲点把结果注入主对话上下文,并自动触发一轮后续处理。
本 issue 只覆盖:
/acp send 路径执行显式路由本 issue 不覆盖:
agent.chat()@code-reviewer 帮我审查最近一次 git diffsecurity-auditor: 检查当前项目的依赖漏洞让 security-auditor 检查当前项目的依赖漏洞v1 建议只做确定性匹配,不做模糊猜测:
@server-name <task>server-name: <task>可选扩展规则(v1.1 或 v2):
让 server-name ...请 server-name ...server-name 帮我 ...命中显式路由时:
agent.chat(user_input) 路径/acp send <server> <task> 的执行逻辑ACP Delegation → code-reviewer@server-name新增一个轻量解析结果类型:
@dataclass(frozen=True)
class AcpExplicitRoute:
server: str
task: str
syntax: str # at_mention | colon | zh_explicit
raw_prefix: str
agentao/acp_client/router.py
detect_explicit_route(text: str, server_names: list[str]) -> Optional[AcpExplicitRoute]agentao/cli/app.py
self.agent.chat(user_input) 之前插入预路由逻辑agentao/cli/commands_ext.py
/acp send 主体为可复用 helperuser input
↓
detect_explicit_route()
├─ no match → normal agent.chat(user_input)
└─ match → run_acp_prompt_inline(cli, route.server, route.task)
⚠️ 本节仅作为历史设计保留,不在代码库中实现。原因见顶部 Status:
task_complete不属于 ACP 标准sessionUpdate枚举,继续保留会迫使 server 侧引入私有扩展。
允许特定 ACP server 在后台主动推送“任务完成”结果,并把结果交给主 Agent 做后续决策。
在 .agentao/acp.json 的具体 server 下增加实验性开关:
{
"servers": {
"security-auditor": {
"command": "python",
"args": ["-m", "security_server"],
"env": {},
"cwd": ".",
"experimental": {
"pushTaskCompleteToAgent": true
}
}
}
}
experimental复用已有 session/update,约定私有 sessionUpdate 类型:
{
"method": "session/update",
"params": {
"sessionId": "sess_xxx",
"update": {
"sessionUpdate": "task_complete",
"taskId": "audit-20250412-001",
"title": "Dependency audit finished",
"content": {
"type": "text",
"text": "Found 3 vulnerable packages..."
},
"metadata": {
"severity": "high"
}
}
}
}
仅当同时满足以下条件时,才触发 push delegation:
method == "session/update"params.update.sessionUpdate == "task_complete"experimental.pushTaskCompleteToAgent否则:
禁止在 ACP reader 线程或 notification callback 线程内直接调用 agent.chat()。
正确做法:
task_completeagent.chat()@dataclass(frozen=True)
class ACPDelegateEvent:
server: str
session_id: str
task_id: str
title: str
text: str
metadata: dict[str, Any]
timestamp: float
新增:
ACPDelegateQueueACPManager.delegate_queueACPManager.drain_delegate_events()在 safe idle point 把事件转成 synthetic user message:
<system-reminder>
ACP background task complete
server: security-auditor
task_id: audit-20250412-001
title: Dependency audit finished
result:
Found 3 vulnerable packages...
</system-reminder>
An ACP background server finished a task. Incorporate this update and decide whether any follow-up action is needed.
然后由主线程触发一轮:
self.agent.chat(synthetic_message)
agent.chat(user_message) 主路径兼容task_complete 应强制要求 taskId。
去重键:
(server, task_id)若缺失 taskId:
只允许在这些空闲点消费 delegate queue:
不得在:
/acp send 的中间等待线程同一空闲点如有多个 task_complete 事件:
agent.chat()synthetic message 不参与 explicit route 检测。
即:
建议增加简单限流:
v1 可先不实现复杂配额,只保留 hook 点。
agentao/acp_client/models.py
AcpServerConfig 增加实验开关解析建议新增字段:
experimental_push_task_complete_to_agent: bool = False
或:
experimental: dict[str, Any] = field(default_factory=dict)
更推荐前者在内部落成稳定布尔字段,避免下游处处读裸 dict。
agentao/acp_client/router.py
agentao/cli/app.py
agentao/cli/commands_ext.py
run_acp_prompt_inline(cli, name, message)agentao/acp_client/delegate.py
agentao/acp_client/manager.py
task_completeagentao/cli/app.py
drain_delegate_events()self.agent.chat(...)@server task 命中并走 ACP runnerserver: task 命中并走 ACP runnertask_complete 只进 inboxtask_complete 进入 delegate queue(server, task_id) 不重复注入taskId 时只渲染 inbox,不自动注入@server / server: / 让 server / 请 server/acp send runnertask_complete push delegation需要同步更新:
docs/features/acp-client.md其中用户文档应明确: