第 42 讲:App Server RPC 网关——186 个 JSON-RPC 方法如何安全抵达 Agent 核心

Codex 源码解析 · 第 42 讲

Codex 源码解析系列 第 42 讲:App Server RPC 网关——186 个 JSON-RPC 方法如何安全抵达 Agent 核心 基于 OpenAI Codex 源码 · 2026-11-05 💡 本讲一句话: Codex 的 IDE、Xcode、CLI、网页全都通过同一个 app-server 进程说话——它把 186 个 JSON-RPC 方法挡在三道门后面:initialize 握手闸门、turn 准入闸门(RAII permit + watch 通道)、按资源划分的串行队列。读完你能看懂为什么"同一线程的请求严格排队、不同线程互不阻塞、工作区切换时新 turn 会被礼貌拒绝"。 一、网关定位:一个进程,N 个客户端,M 条线程 前几讲我们一直在 core(会话运行时)和 thread-store(持久化)里打转。但别忘了:用户从来不是直接调用 core 的——IDE 插件、Xcode 扩展、CLI、网页前端,全部通过 app-server 这个 JSON-RPC 网关进程与 Codex 对话。它相当于整个系统的"总机接线员": 🔹 对上:stdio / WebSocket 两种传输,一条连接一个 session; 🔹 对下:24 个 RequestProcessor,每个负责一族 RPC(account、config、fs、git、mcp、thread、turn……); 🔹 中间:三道门——握手检查、turn 准入、按资源串行化。 先看 MessageProcessor 的"路由表",一眼看清网关管着哪些业务域: 📄 codex-rs/app-server/src/message_processor.rs (第 158-180 行) account_processor: Arc<AccountRequestProcessor>, // 账户类 RPC:登录、限流、GCP setup apps_processor: AppsRequestProcessor, // App 市场 / 应用管理 catalog_processor: CatalogRequestProcessor, // 模型目录查询 command_exec_processor: CommandExecRequestProcessor, // 一次性命令执行(exec) process_exec_processor: ProcessExecRequestProcessor, // 长驻进程句柄操作 config_processor: ConfigRequestProcessor, // 全局配置读写 environment_processor: EnvironmentRequestProcessor, // 环境变量 / 环境管理 external_agent_config_processor: ExternalAgentConfigRequestProcessor, // 外部 agent 接入配置 feedback_processor: FeedbackRequestProcessor, // 用户反馈提交 fs_processor: FsRequestProcessor, // 文件系统 RPC(读/写/watch) git_processor: GitRequestProcessor, // Git 相关查询 initialize_processor: InitializeRequestProcessor, // 连接建立后的首次握手 marketplace_processor: MarketplaceRequestProcessor, // 插件市场操作 mcp_processor: McpRequestProcessor, // MCP server 管理 / OAuth plugin_processor: PluginRequestProcessor, // 插件安装/启用/禁用 project_processor: ProjectRequestProcessor, // 项目(工作区)管理 remote_control_processor: RemoteControlRequestProcessor, // 远程控制 / 配对 sea…

阅读全文:Codex 源码解析 第 42 讲