Pull Request已成功合入, 合并人@openeuler-ci-bot
(感谢 DoraA_Mengjie 的贡献)变更摘要
本 PR 为 xiaoO 引入与 RAM-A 长期记忆服务对接的完整 MCP 能力,主要包括:新增 MCP 2025-11-25 Streamable HTTP 传输层(支持 session 管理、[REDACTED] 鉴权、SSE 流式响应、会话恢复和 initialize 429 安全重试);新增可选的长期记忆自动化模块(turn 前召回、turn 后异步持久化摄入队列含重试 worker);新增 .mcp.json JSON 配置文件加载和与 TOML 配置合并的能力;在 TUI 状态面板中展示内存健康状态。
主要改动
- 新增
StreamableHttpTransport传输层: 在crates/mcp/src/transport/streamable_http.rs中实现了 MCP 2025-11-25 协议传输,支持/mcpendpoint、Mcp-Session-Id会话管理、[REDACTED]环境变量鉴权、X-Agent-ID代理标识、SSE 事件流解析与重连、会话恢复机制,以及 initialize 请求在收到 429 时进行一次安全重试。 - 新增
McpMemoryAutomation长期记忆自动化: 在apps/shared/src/gateway/memory_automation.rs中实现了可选的 RAM-A 记忆自动化,包含 turn 前通过memory_search召回记忆并渲染为<untrusted_long_term_memory>系统上下文、turn 后通过memory_ingest异步摄入对话记录,以及基于 JSONL 文件的DurableIngestQueue持久化队列(支持文件锁、重试退避、并发安全)。 - 新增
.mcp.jsonJSON 配置加载与合并: 在crates/mcp/src/json_config.rs中实现了从命令行--mcp-config、环境变量XIAOO_MCP_CONFIG、工作区.mcp.json和用户目录~/.config/xiaoo/mcp.json的自动发现链;merge_server_configs确保 TOML 与 JSON 服务器名不冲突,并在重复时报告双方源文件路径。 - Session 生命周期集成记忆自动化: 在
apps/shared/src/gateway/session_service_impl.rs的CoreBackedSessionService中,turn 执行前调用recall将召回记忆注入系统提示词,turn 成功后构建CompletedTurnIngest入队异步写入;AppBootstrap新增from_session_components_with_hooks_and_backend_manager_and_memory_automation方法接受可选的TurnMemoryAutomation。 - TUI 与 Daemon 端到端集成: CLI 和 TUI 入口新增
--mcp-config参数、MemoryAutomationConfig配置段和MemoryStatus状态枚举(Disabled/Unknown/Connected/Degraded),在状态面板标题栏实时展示内存连接状态,并通过watch::channel在 turn 间传递健康变化。


代码审查
审查总结
逐文件审查确认
| 文件 | 结论 |
|---|---|
apps/endside/src/cli/config.rs |
无问题 |
apps/endside/src/cli/entry.rs |
无问题 |
apps/endside/src/cli/mod.rs |
无问题 |
apps/endside/src/gateway_api/remote.rs |
无问题 |
apps/endside/src/gateway_api/runtime_request.rs |
无问题 |
apps/endside/src/gateway_api/runtime_stream.rs |
无问题 |
apps/endside/src/gateway_api/session.rs |
无问题 |
apps/endside/src/gateway_api/session_core.rs |
无问题 |
apps/endside/src/main.rs |
无问题 |
apps/endside/src/render/header.rs |
无问题 |
apps/endside/src/render/status_panel.rs |
无问题 |
apps/endside/src/support/config.rs |
无问题 |
apps/serverside/src/daemon_config.rs |
无问题 |
apps/serverside/src/main.rs |
无问题 |
apps/shared/Cargo.toml |
无问题 |
apps/shared/src/gateway/bootstrap.rs |
无问题 |
apps/shared/src/gateway/hosted_runtime_resolver.rs |
无问题 |
apps/shared/src/gateway/memory_automation.rs |
无问题 |
apps/shared/src/gateway/memory_automation_test.rs |
无问题 |
apps/shared/src/gateway/mod.rs |
无问题 |
apps/shared/src/gateway/session_service_impl.rs |
无问题 |
crates/llm-client/src/url_fallback.rs |
无问题 |
crates/mcp/Cargo.toml |
无问题 |
crates/mcp/src/client.rs |
无问题 |
crates/mcp/src/config.rs |
P3 ×1 |
crates/mcp/src/error.rs |
无问题 |
crates/mcp/src/json_config.rs |
无问题 |
crates/mcp/src/lib.rs |
无问题 |
crates/mcp/src/transport/mod.rs |
无问题 |
crates/mcp/src/transport/sse.rs |
P3 ×1 |
crates/mcp/src/transport/stdio.rs |
P3 ×1 |
crates/mcp/src/transport/streamable_http.rs |
无问题 |
crates/mcp/src/types.rs |
无问题 |
crates/mcp/tests/streamable_http.rs |
无问题 |
docs/config_file_guide.md |
无问题 |
docs/mcp.md |
无问题 |
按严重度统计
- P0: 0
- P1: 0
- P2: 0
- P3: 3(均为可选的改进建议,不修复也不影响正确性)
整体风险判断
低风险。 此 PR 在逻辑正确性、安全性和可靠性方面质量较高。核心功能(MCP Streamable HTTP 传输、.mcp.json 配置加载、RAM-A memory automation)实现正确,错误处理完善,安全措施到位(bearer token 通过环境变量注入、禁止在 JSON 中写入密钥、memory 内容做了 HTML 转义防注入、UNIX 文件锁保证持久队列并发安全)。3 个 P3 发现均为可选改进:1 个过于保守的头名称匹配策略,2 个冗余的空方法覆盖。无阻塞性问题,可以合入。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Welcome To openEuler Community
Hey @jie-qi , thanks for your contribution to the community.
Bot Usage Manual
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.
Contact Guide
If you have any questions, please contact the SIG: sig-intelligence ,
and any of the maintainers: @fromhsc, @gogoxiaoxiao, @huzhengce, @kaitiandu, @leon-wang2021, @liumiao27, @lyhu, @wqianli ,
and any of the committers: @extinctfire, @hypothesiser, @xiangyou_xie, @xujing99 .


门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/xiaoO/630/console


🟡 Medium Priority
DurableIngestQueue::acquire_lock 方法(apps/shared/src/gateway/memory_automation.rs 第 345-368 行)在 async 函数中使用了同步阻塞 I/O:
在 tokio 多线程 runtime 中,这些调用会阻塞当前 worker 线程。对于本地文件系统这通常很快,但在网络文件系统(NFS/CIFS)或高 I/O 压力下可能导致明显的延迟,影响同一 runtime 上其他 async 任务的执行。
建议:将 acquire_lock 中所有同步 I/O 操作(OpenOptions::open、file.set_len、writeln!)包裹在 tokio::task::spawn_blocking 中执行,避免阻塞 async worker 线程。


master,4939aafb-feat(mcp): add Streamable HTTP server configuration [AI: Codex GPT-5],7d71cba2-feat(memory): add opt-in RAM-A long-term memory [AI: Codex GPT-5],d7cba002-docs(mcp): document RAM-A Streamable HTTP integration [AI: Codex GPT-5],a7c3730b-fix(mcp): harden RAM-A lifecycle and operator status [AI: Codex GPT-5],6add15af-docs(mcp): clarify role-gated memory activation [AI: Codex GPT-5],385edb6e-fix(mcp): retry rate-limited RAM-A initialization [AI: Codex GPT-5],046592cb-fix(memory): move durable queue locking off async workers [AI: Codex GPT-5]master,4939aafb-feat(mcp): add Streamable HTTP server configuration [AI: Codex GPT-5],7d71cba2-feat(memory): add opt-in RAM-A long-term memory [AI: Codex GPT-5],d7cba002-docs(mcp): document RAM-A Streamable HTTP integration [AI: Codex GPT-5],a7c3730b-fix(mcp): harden RAM-A lifecycle and operator status [AI: Codex GPT-5],6add15af-docs(mcp): clarify role-gated memory activation [AI: Codex GPT-5],385edb6e-fix(mcp): retry rate-limited RAM-A initialization [AI: Codex GPT-5],046592cb-fix(memory): move durable queue locking off async workers [AI: Codex GPT-5]门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/xiaoO/642/console


门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/xiaoO/643/console


/lgtm


/lgtm


/approve


当前PR是否有AI参与:
[ ] 否
[x] 是
__1. AI Agent 平台: Codex
__2. AI 模型: GPT-5
__3. Prompt上下文 : 基于本 MR 范围内的 xiaoO MCP 配置加载、MCP Streamable HTTP client transport、RAM-A 长期记忆接入、联调问题修复、本地测试和代码审查上下文。
参考:openEuler社区《生成式AI工具使用与开源贡献政策》
PR功能描述 / 为什么需要这个合入**:
本 PR 为 xiaoO 增加与 RAM-A 长期记忆服务对接所需的 MCP 能力,支持通过 MCP 2025-11-25 Streamable HTTP 连接独立部署的 RAM-A HTTP MCP 服务,并提供可选的长期记忆自动召回与写入能力。
主要修改:
.mcp.json加载能力,支持从命令行参数、环境变量、工作区和用户配置目录加载 MCP server 配置。/mcpendpoint、MCP-Protocol-Version: 2025-11-25、Mcp-Session-Id、Bearer token 环境变量、X-Agent-ID、会话关闭、超时、取消和 initialize 429 一次安全重试。tools/list发现 MCP 工具,将工具 schema 暴露给模型,由模型自主判断是否调用,再通过tools/call执行。allowed_agent_roles对自动记忆是否启用的影响。为什么需要:
RAM-A 是一个独立的长期记忆服务,需要作为共享 HTTP MCP 服务被 xiaoO 连接。原有 stdio 模式适合本地子进程,不适合多个 xiaoO 实例或多 Agent 共享同一个 RAM-A 服务;legacy SSE 也不符合 RAM-A 当前使用的 Streamable HTTP MCP 2025-11-25 会话协议。因此需要在xiaoO 中新增 Streamable HTTP MCP transport,并在 turn 生命周期内接入自动召回和写入。
兼容性说明:
.mcp.json是运行时导入,不会写回 TOML。验证情况:
cargo fmt --all -- --check: passedcargo test --locked -p mcp: 51 passedcargo test -p xiaoo-shared memory_automation: 14 passedcargo test -p xiaoo-endside: 223 passedcargo clippy -p mcp --all-targets -- -D warnings: passed该PR关联的issue
(格式为fixes #<issue号>, 或者resolves #<issue号>): fixes #
希望检视人员了解:
本 PR 只引入 RAM-A 对接所需的 MCP Streamable HTTP transport 和 opt-in memory automation,不改变 xiaoO 默认对话流程。
实际联调中暴露过 RAM-A session 未关闭导致 initialize 429 的问题,本 PR 已在客户端侧对 initialize 增加一次受 deadline 约束的安全重试,并保留 MCP session close;如果 RAM-A 服务端长期处于 session admission 饱和状态,仍需要服务端释放或重启,这是服务端资 源治理问题,客户端不会无限重试。