首页
2026-02-11 · rebornix/agmente
Agmente 架构分析封面

Agmente:移动端 Agent 客户端的双协议架构剖析

ACP + Codex app-server | iOS SwiftUI | 断线恢复与多会话管理

导语:Agmente 的定位非常明确:它不是 agent 运行时,而是一个移动端"协议客户端"。核心目标是把 ACP 与 Codex 两套协议统一在 iOS 上,让用户能在手机上看见工具调用、会话历史与断线恢复。

核心要点:它解决了什么问题

多协议统一

通过 ServerViewModelProtocol 抽象 ACP 与 Codex,两套协议在 UI 层共享统一入口,运行期自动识别切换。

移动端断线恢复

X-Client-Id + stdio-to-ws --persist 配合,解决 iOS 后台切换导致的短线断连问题。

会话与工具可视化

流式消息、tool call、审批请求被结构化为 UI 组件,形成"agent 工具执行现场"的可视化日志。

本地缓存兜底

对不支持 session/list 的服务端,通过 Core Data 缓存会话与消息,实现最小可用体验。

架构速览

AppViewModel(过载核心)

负责连接、初始化、缓存、协议切换、日志与状态机;体量大、责任集中,是当前最大的技术债。

ServerViewModel / CodexServerViewModel

分别映射 ACP 的 session/* 与 Codex 的 thread/turn/* 语义,但存在大量重复逻辑。

SessionStorage(Core Data)

保存 server/session/message 与 MRU 工作目录,为无 session/list 的服务端兜底。

AppServerService(Codex RPC)

JSON-RPC 请求管理与 pending continuation 处理,当前缺少超时与指标。

关键数据流(简化版)

  1. 连接 connect → initialize → 探测 session/list / session/load 能力 → 切换到 ACP/Codex 视图模型。
  2. 会话 ACP 用 session/new(placeholder 迁移);Codex 用 thread/start + turn/start。
  3. 恢复 ACP: session/load/resume;Codex: thread/resume → 重建消息树。
  4. 缓存 不支持 session/list 时落盘;支持时以服务端为准。

主要风险与技术债

AppViewModel 过度膨胀

职责过多,难以测试与演进,回归风险高。

重复逻辑

ACP/Codex 的 session 管理重复,后续行为可能漂移。

并发安全

@unchecked Sendable 与 delegate 跨线程回调存在隐患。

文档与实现偏差

文档称 capability 默认 on,但代码默认 false。

"这是一个移动端的协议客户端,不是运行时框架。把协议一致性和断线恢复做到极致,就是它的护城河。"

— 分析结论摘要

工程建议(精简版)

  1. 01 引入显式会话状态机(draft/creating/materialized/loading/resuming/ready),统一处理 placeholder 与竞态。
  2. 02 每服务器独立连接管理器,消除共享 ACPClientManager 的串扰。
  3. 03 拆 AppViewModel:ServerRegistry / ConnectionOrchestrator / SessionRecoveryCoordinator。
  4. 04 AppServerService 增加请求级 timeout + metrics(pending 数、超时数、平均 RTT)。
  5. 05 能力矩阵契约测试(session/list/load/resume + Codex thread/resume + 多 cwd 合并)。
#Agent #iOS #ACP #Codex #Architecture