Skip to content

[codex] feat: ACP Server over WebSocket(ZER-579) - #28

Merged
ZeroPointSix merged 24 commits into
mainfrom
codex/zer-579-acp-websocket
Aug 12, 2026
Merged

[codex] feat: ACP Server over WebSocket(ZER-579)#28
ZeroPointSix merged 24 commits into
mainfrom
codex/zer-579-acp-websocket

Conversation

@ZeroPointSix

@ZeroPointSix ZeroPointSix commented Aug 10, 2026

Copy link
Copy Markdown
Owner

背景

openab-plus 增加可选启用的 /acp WebSocket 服务,移植上游 openabdev/openab#1418 的 A1 范围,并关联 ZER-579

Review Contract

Goal

交付可在独立 Gateway 与 unified openab run 中启用的 ACP v1 WebSocket 服务。客户端必须能完成 initialize → session/new → session/prompt → session/resume,并通过真实冒烟脚本验证鉴权、会话连续性和完整回复回送。

Non-goals

  • 不实现 Browser/MCP-over-ACP。
  • 不实现 session/load 历史回放。
  • 不实现工具授权、文件系统、终端、多 Agent 或 Streamable HTTP 扩展。
  • 不承诺 session/cancel 终止后台 Agent 进程。

Accepted Residual Risks

  • session/cancel 不会终止后台 Agent;网关会立即回复客户端,但继续占用全局后端槽和 session owner,直到后台终态。后台永久不结束时会占住容量,这是有意的 fail-closed 行为。
  • 有界回复队列饱和时会丢弃中间 full-text snapshot,并为最终 Text + Done 预留两个槽;慢客户端可能延迟自身 turn,但不会形成无界内存增长。
  • 尚未实现全局连接数上限和空闲连接淘汰。
  • 非本机监听必须配置 OPENAB_ACP_AUTH_KEY;业务身份仍由 GATEWAY_ALLOWED_USERS 控制,部署时必须包含 acp_client

Acceptance Criteria

  • cargo check --workspace
  • cargo clippy --workspace -- -D warnings
  • cargo clippy --workspace --features unified -- -D warnings
  • cargo test --workspace
  • cargo test -p openab-gateway --features acp
  • cargo build --features unified
  • 标准 Docker smoke 矩阵 17/17 通过
  • Unified Docker smoke 矩阵 17/17 通过
  • scripts/acp-ws-smoke.py 对真实服务完成拒绝错误鉴权、初始化、新建会话、prompt、resume 和长回复验证
  • Admin Web 与 Slack 现有流程无回归
  • 根包、openab-coreopenab-gateway 补丁版本已递增

Review Fixes

  • Canary 与服务端统一使用 OPENAB_ACP_AUTH_KEY
  • resource_link 用例对超时和 JSON-RPC 错误均 fail-closed。
  • Axum/tungstenite 在缓冲完整消息前限制 1 MiB message 与 frame。
  • OPENAB_ACP_ENABLED 按仓库既有规则接受 1 和大小写不敏感的 true
  • 长回复文档更新为 ZER-579 已修复状态。
  • sessionId 增加进程级唯一 owner;并发 resume 返回 -32001,旧连接的完成/断开清理不能删除新 owner 的 sink。
  • 共享 32 个后端 permit;cancel/timeout 立即结束客户端等待,但 permit 与 busy 保留到后台终态,阻断 prompt→cancel 绕限。
  • WebSocket 出站队列限制 64 帧、每个 prompt 回复队列限制 32 个 snapshot;饱和时保留最终 Text + Done
  • 新增双连接 resume、旧 owner 延迟清理、cancel 后占槽、慢消费者队列饱和回归测试,并把双连接场景加入 live smoke。

Follow-ups

  • 真正的 agent→core→下游 Agent 取消传播另开后续任务;当前通过保留 permit 实现资源上限。
  • 空闲连接淘汰和全局连接数上限另开后续任务。
  • Railway 隔离项目 zer-579-acp-canary 当前已停止。只有在用户明确授权注入 credstore backend.test.tokengo_config 并启用隔离容器 agent-full-access 后,才继续真实模型 canary。
  • 先前 preview 镜像对应审查前 head 5244ceb;审查修复后的 head 必须重新构建镜像后再用于 canary。

移植边界

固定上游基线 2e3292bc3e3e01f0fb203dc38003ad4c9afc7ca5 与 PR head c0cb2f1f564aedd6b5f11e001dd6d0001f414437,当前 PR 共修改 19 个文件,避免带入上游后续 Browser/MCP-over-ACP 能力。

验证记录

  • 最新提交:c34d232342ba709ae1cfbe8028f555e1238a2844
  • CI #103:check、两套 clippy、全量测试、ACP 专项测试与 unified 构建全部成功。
  • Docker Smoke #118:17/17 job 成功。
  • Unified Docker Smoke #118:17/17 job 成功。
  • Review Contract:成功。
  • Live smoke 脚本已新增双连接并发 resume 拒绝与旧 owner 断开后释放用例;真实 Railway 模型 canary 仍等待单独授权,当前未运行。
  • PR 保持 Draft;真实模型 canary 与 Admin Web/Slack 回归完成后再请求正式 review。

@linear-code

linear-code Bot commented Aug 10, 2026

Copy link
Copy Markdown

ZER-579

@ZeroPointSix
ZeroPointSix marked this pull request as ready for review August 10, 2026 03:59
@ZeroPointSix
ZeroPointSix marked this pull request as draft August 10, 2026 04:00
@ZeroPointSix
ZeroPointSix marked this pull request as ready for review August 10, 2026 06:36
@ZeroPointSix
ZeroPointSix marked this pull request as draft August 10, 2026 06:36
@ZeroPointSix
ZeroPointSix marked this pull request as ready for review August 10, 2026 08:38
@ZeroPointSix
ZeroPointSix marked this pull request as draft August 10, 2026 08:38
@ZeroPointSix
ZeroPointSix marked this pull request as ready for review August 12, 2026 06:52
@ZeroPointSix
ZeroPointSix merged commit a03d9de into main Aug 12, 2026
62 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant