From ee0643041a93e022825288705326d703fc193225 Mon Sep 17 00:00:00 2001 From: lix-2026 Date: Sun, 17 May 2026 21:21:59 +0800 Subject: [PATCH] feat: enrich page ai ACP runtime UI --- ...e-ai-acp-agent-runtime-unified-layer-v1.md | 42 +++++ rust/crates/mnote-web/src/acp_bridge.rs | 58 ++++++- .../mnote-web/src/acp_session_manager.rs | 10 +- rust/crates/mnote-web/src/ssr/pages/layout.rs | 152 +++++++++++++++--- rust/crates/mnote-web/src/ssr/styles.rs | 50 ++++++ 5 files changed, 282 insertions(+), 30 deletions(-) diff --git a/design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md b/design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md index 4c6e6394..85c05e65 100644 --- a/design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md +++ b/design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md @@ -724,6 +724,38 @@ node /home/lix/.codex/skills/page-ai-browser-verify/scripts/verify_mnote_page_ai | **边界** | Skills 展示只是可见信息;当前还不能据此认为这些 skills 都已经注入 Reasonix ACP runtime 的工具系统 | | **下一步** | 后续若要把 Reasonix skills 变成可执行能力,需要明确 Reasonix skill schema → ToolRegistry 注册规则;当前优先保持只读展示与不误导 | +#### 问题 4:ACP Hermes 未复用 soul/user/memory 可编辑 UI + +| 项 | 详情 | +|---|---| +| **用户反馈** | ACP Hermes 页面中看不到 Hermes HTTP 已有的 `SOUL.md` / `USER.md` / `MEMORY.md` 编辑卡片 | +| **根因** | `layout.rs` 在 `isAcp` 分支把 Agent 面板替换成 runtime info 卡片,并且 `if (agentPanel && !isAcp)` 才渲染 memory 编辑器;因此 ACP Hermes 被误归入 Reasonix 风格的 runtime 信息态 | +| **参考结论** | `hermes-vscode-main` 本身没有 soul/user/memory 模块;这部分应复用 mnote 现有 Hermes HTTP BFF:`/api/hermes/client/profile-memory` | +| **已修复** | ACP Hermes (`pageAiAcpRuntime === "hermes"`) 继续显示与 Hermes HTTP 相同的三张可编辑 memory 卡片;ACP Reasonix 仍显示 runtime info;Hermes profile 下拉继续保留 | +| **边界** | 未额外把 memory 文本硬塞入 ACP prompt,避免和 `hermes -p acp` 自身 profile 加载逻辑重复;当前需求以 UI 可见、可编辑、可保存为准 | + +#### 问题 5:页面 AI 会话历史刷新丢失 + +| 项 | 详情 | +|---|---| +| **用户反馈** | 当前会话历史刷新后没有了,不清楚真源在哪里 | +| **根因** | 前端运行期真源是 `pageUiState.pageAiSessions/pageAiMessages`;旧 `localStorage` 只保存 `activeSessionId/activeProfileName`,不保存 `messages`;ACP run 也未落 Hermes HTTP session export | +| **参考结论** | `hermes-vscode-main/src/sessionStore.ts` 把 `ChatSession[]`、`messages`、`acpSessionId` 存在 VSCode `workspaceState`,最多 20 个 session、每 session 300 条消息 | +| **已修复** | 短期真源明确为“按文档隔离的浏览器 localStorage”:`hermes_page_ai_session:` 现在保存 `version/activeSessionId/activeProfileName/activeAcpRuntime/sessions/messages`,每 session 最多 300 条消息 | +| **验证方法** | 浏览器验证 skill 已增加 Hermes 回复后 reload,再打开页面 AI,确认 marker 回复仍可见 | +| **长期方案** | 后续应把页面 AI 会话统一落后端 session store,并让 ACP session id 支持 `session/load` 恢复;localStorage 只保留本地缓存与离线恢复 | + +#### 问题 6:ACP 工具调用信息和流式输出不完整 + +| 项 | 详情 | +|---|---| +| **用户反馈** | 与 `hermes-vscode-main` 相比,缺工具调用信息(需可折叠、默认折叠),缺流式输出 | +| **根因** | ACP `message.delta` 已到前端,但旧 UI 只累加到局部 `assistantText`,stream 完成后才 push assistant message;工具事件虽然会生成 tool message,但卡片是普通 div,未折叠,且 ACP bridge 丢掉了 `rawInput/content/status` | +| **参考结论** | `hermes-vscode-main` 的关键是协议层 text dedup、UI 层 `pendingText/currentAgentText` 流式占位、`data-tool-id` 原地更新工具状态;参考实现本身不是折叠 UI,因此 mnote 在其基础上新增 `
` | +| **已修复** | 前端收到首个 `message.delta` 时创建 `streaming=true` assistant 消息并持续更新;完成后标记为普通 assistant 消息并持久化;工具卡改为 `
`,默认折叠,summary 显示工具名/状态/kind/call id,展开显示参数/结果/trace | +| **后端补齐** | `AcpSessionEvent::ToolCall` 保留 `raw_input`,`ToolCallUpdate` 保留 `content`;`acp_bridge` SSE 输出 `status/input/output`,让前端可展示工具参数和结果摘要 | +| **验证** | `cargo test -p mnote-web acp -- --nocapture` 已覆盖 `acp_tool_events_keep_detail_for_collapsible_ui`;浏览器验证 skill 会记录 `sawStreaming` 并保留截图 | + ### 📋 待完成 | Step | 工作 | 前置 | 估算 | @@ -816,6 +848,9 @@ node /home/lix/.codex/skills/page-ai-browser-verify/scripts/verify_mnote_page_ai > - Agent 标签页新增 `