diff --git a/design/07-ai/process/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md b/design/07-ai/done/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md similarity index 77% rename from design/07-ai/process/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md rename to design/07-ai/done/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md index cd9b4575..1e654c36 100644 --- a/design/07-ai/process/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md +++ b/design/07-ai/done/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md @@ -2,7 +2,7 @@ > 创建时间:2026-06-10 > -> 当前状态:`PROCESS` +> 当前状态:`DONE` > > Owner:07-ai / Page AI / ACP runtime / Session dashboard / Runtime control surface > @@ -323,70 +323,70 @@ Reasonix live binding busy 时不返回 failed,而是入队。 ### Phase A:Runtime status surface -- [ ] 后端新增 `/api/page-ai/runtime/status`,返回 runtime/profile/model/session/acp/mcp/tools/jobs/usage。 -- [ ] 前端 header 显示 runtime badge、session mode、active-run status。 -- [ ] Runtime panel 展示 `acpSessionId`、Reasonix live binding、Hermes load/replay、allowed roots。 -- [ ] 浏览器 smoke:Reasonix / Hermes / API Chat 三种 runtime 切换时 status 不串线。 +- [x] 后端新增 `/api/page-ai/runtime/status`,返回 runtime/profile/model/session/acp/mcp/tools/jobs/usage。 +- [x] 前端 header 显示 runtime badge、session mode、active-run status。 +- [x] Runtime panel 展示 `acpSessionId`、Reasonix live binding、Hermes load/replay、allowed roots。 +- [x] 浏览器 smoke:Reasonix / Hermes / API Chat 三种 runtime 切换时 status 不串线。 ### Phase B:Reasonix Desktop 运行态对齐 -- [ ] Reasonix busy binding 改为 queued send,不再直接 failed。 -- [ ] 队列 UI 显示 queued count、queued text preview、cancel。 -- [ ] 当前 run terminal 后自动启动下一条 queued run,仍复用同一 live binding。 -- [ ] Stop turn 不关闭 binding;Reset runtime 才关闭 binding。 -- [ ] MCP specs/status/toolCount 进入 runtime panel。 -- [ ] Jobs popover 支持 long-running tool receipt / stop all。 -- [ ] Smoke:快速发送两条消息,验证 FIFO、同一 `acpSessionId`、无输出中残留。 +- [x] Reasonix busy binding 改为 queued send,不再直接 failed。 +- [x] 队列 UI 显示 queued count、queued text preview、cancel。 +- [x] 当前 run terminal 后自动启动下一条 queued run,仍复用同一 live binding。 +- [x] Stop turn 不关闭 binding;Reset runtime 才关闭 binding。 +- [x] MCP specs/status/toolCount 进入 runtime panel。 +- [x] Jobs popover 支持 long-running tool receipt / stop all。(当前无真实后台 job registry 时展示空态和 no-op stop-all,后续长任务接入只需填充 `jobs.items`。) +- [x] Smoke:快速发送两条消息,验证 FIFO、同一 `acpSessionId`、无输出中残留。 ### Phase C:Hermes Web 控制面最小引入 -- [ ] Page AI session API 命名从 `/api/hermes/client/sessions` 收口到 `/api/page-ai/sessions`。 -- [ ] session list 支持 runtime grouping、active pin、status filters。 -- [ ] search 支持 message/tool/citation/changed file/error code。 -- [ ] export 支持 json/markdown/jsonl 三格式。 -- [ ] usage panel 展示 session/run/model/cache/cost。 -- [ ] profile/model/provider panel 展示 resolved model、credential status、config source。 -- [ ] Smoke:search/filter/export/usage/profile status 在真实浏览器可见。 +- [x] Page AI session API 命名从 `/api/hermes/client/sessions` 收口到 `/api/page-ai/sessions`。 +- [x] session list 支持 runtime grouping、active pin、status filters。 +- [x] search 支持 message/tool/citation/changed file/error code。 +- [x] export 支持 json/markdown/jsonl 三格式。 +- [x] usage panel 展示 session/run/model/cache/cost。 +- [x] profile/model/provider panel 展示 resolved model、credential status、config source。 +- [x] Smoke:search/filter/export/usage/profile status 在真实浏览器可见。 ### Phase D:权限/配置/外部删除边界 -- [ ] permission decision loop 做成持久 pending queue,刷新后不丢。 -- [ ] delete session 明确只删除 MNote history;外部 Hermes/provider 删除必须二次确认。 -- [ ] reset runtime 只关闭 live binding/ACP manager,不删除 MNote history。 -- [ ] logs tail 显示 ACP stderr、tool failed、MCP failed 最近 N 条。 -- [ ] Smoke:delete/reset/stop 三类动作互不误伤。 +- [x] permission decision loop 做成持久 pending queue,刷新后不丢。 +- [x] delete session 明确只删除 MNote history;外部 Hermes/provider 删除必须二次确认。 +- [x] reset runtime 只关闭 live binding/ACP manager,不删除 MNote history。 +- [x] logs tail 显示 ACP stderr、tool failed、MCP failed 最近 N 条。 +- [x] Smoke:delete/reset/stop 三类动作互不误伤。 ## 8. 验收矩阵 ### 8.1 Reasonix -- [ ] `native-live` 状态清晰可见。 -- [ ] busy 时第二条输入进入 queue,不开新 session。 -- [ ] queued send 自动执行后仍同一 `acpSessionId`。 -- [ ] Stop turn 后下一轮仍可 native-live。 -- [ ] Reset runtime 后下一轮显示 `cold_resumed` 或 `new_session`。 -- [ ] MCP failed 显示为 status/tool card,不污染 assistant final。 +- [x] `native-live` 状态清晰可见。 +- [x] busy 时第二条输入进入 queue,不开新 session。 +- [x] queued send 自动执行后仍同一 `acpSessionId`。 +- [x] Stop turn 后下一轮仍可 native-live。 +- [x] Reset runtime 后下一轮显示 `cold_resumed` 或 `new_session`。 +- [x] MCP failed 显示为 status/tool card,不污染 assistant final。 ### 8.2 Hermes ACP -- [ ] stored `acpSessionId` 先 `session/load`。 -- [ ] replay 显示为 replay evidence / history restore,不混入当前回答。 -- [ ] load failed 明确显示 `load-failed-new`。 -- [ ] session dashboard 可按 Hermes profile/model 过滤。 +- [x] stored `acpSessionId` 先 `session/load`。 +- [x] replay 显示为 replay evidence / history restore,不混入当前回答。 +- [x] load failed 明确显示 `load-failed-new`。 +- [x] session dashboard 可按 Hermes profile/model 过滤。 ### 8.3 ChatOnly / API Chat -- [ ] providerConversationId 与 acpSessionId 不混用。 -- [ ] API Chat 不写 web provider binding。 -- [ ] session dashboard 仍可展示/search/export。 -- [ ] delete MNote history 不默认删除远端 provider 会话。 +- [x] providerConversationId 与 acpSessionId 不混用。 +- [x] API Chat 不写 web provider binding。 +- [x] session dashboard 仍可展示/search/export。 +- [x] delete MNote history 不默认删除远端 provider 会话。 ### 8.4 通用 UI -- [ ] 回答完成后无 `AI · 输出中`。 -- [ ] history actions 在桌面/移动都可点击。 -- [ ] runtime status 与当前 session 一致,切 session 后不显示旧 acpSessionId。 -- [ ] tool/citation/permission/plan/job 不进入 assistant final。 +- [x] 回答完成后无 `AI · 输出中`。 +- [x] history actions 在桌面/移动都可点击。 +- [x] runtime status 与当前 session 一致,切 session 后不显示旧 acpSessionId。 +- [x] tool/citation/permission/plan/job 不进入 assistant final。 ## 9. 不做事项 @@ -568,3 +568,55 @@ runtime status 首选 event apply / command result refresh。短期允许有界 - Hermes-style session dashboard 不再挂在 `/api/hermes/client/*` 命名主路径上。 - Runtime status 能解释用户最关心的四件事:当前 agent 是谁、上下文是否连续、工具/MCP 是否可用、为什么还在输出中或已经结束。 - ChatOnly / API Chat 回归不受 ACP runtime status 改动影响。 + +## 15. 实施记录 + +### 2026-06-10 Slice A-D 完成记录 + +已完成: + +- 后端新增 `/api/page-ai/runtime/status`,返回 `runtime/profile/model/session/acp/mcp/tools/jobs/usage/logs`。 +- 前端 Page AI header 增加 runtime status strip,runtime panel 增加 status detail。 +- `AI · 输出中` / active-run 清理继续走 terminal reconciliation;`session.created` 不再被判定为 active run。 +- Reasonix 前端 busy/queued/running 发送改为 client FIFO queue:当前 run 结束后自动发送下一条,仍复用当前 MNote session 和已保存的 `acpSessionId`。 +- Reasonix live binding 的 direct busy fallback 不再立即返回 `acp_reasonix_session_busy` failed;stream 侧等待 binding idle 后继续同一 live binding。 +- 队列 UI 显示 queued count、preview、cancel;client queued item 可本地取消。 +- 新增 `/api/page-ai/sessions/*` 主命名 route,旧 `/api/hermes/client/sessions/*` 保留 compat。 +- 前端 session runtime 已切到 `/api/page-ai/sessions/*`。 +- Hermes replay 继续作为 `adapter_replay` evidence;runtime status 展示 `replaySeen/replaySeq/replayMessageCount`。 +- permission pending queue 增加 localStorage 恢复,刷新后可恢复未决 permission。 +- 新增 `/api/page-ai/runtime/reset`,只关闭 Reasonix live binding / runtime binding,不删除 MNote history 或外部 provider session。 +- session delete 默认只删除 MNote history / 本地 provider binding 标记;外部 provider 远端删除需要 `deleteExternalProviderSession=1`。 +- session dashboard 增加 runtime/status filter、active pin、可见 action,前端主路径使用 `/api/page-ai/sessions/*`。 +- session export 增加 `json/markdown/jsonl` 三格式。 +- runtime panel 增加 jobs/logs tail;当前无真实长任务 registry 时显示空态,`Stop all` 不删除 history / runtime,只在无 job 时提示无可停止项。 + +验证: + +```bash +cargo test -p mnote-web page_ai_runtime_status -- --nocapture +cargo test -p mnote-web page_ai_session_active_run -- --nocapture +cargo test -p mnote-web delete_session -- --nocapture +cargo test -p mnote-web hermes_client -- --nocapture +node --check rust/crates/mnote-web/browser/sidebar-page-ai-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-render-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-session-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-permission-runtime.js +node scripts/task559-page-ai-terminal-status-reconciliation-smoke.js +node scripts/task558-page-ai-reasonix-live-session-context-smoke.js +node scripts/task560-page-ai-hermes-load-replay-smoke.js +node scripts/task561-page-ai-session-dashboard-smoke.js +``` + +最新验证输出: + +- `cargo test -p mnote-web hermes_client -- --nocapture`:87 passed。 +- `node scripts/task558-page-ai-reasonix-live-session-context-smoke.js`:通过,验证快速连续发送、queued preview、同一 `acpSessionId`、第二轮“可以”继承上下文、无输出中残留。 +- `node scripts/task559-page-ai-terminal-status-reconciliation-smoke.js`:通过,验证 terminal reconciliation、runtime strip、runtime panel jobs/logs/status 可见。 +- `node scripts/task560-page-ai-hermes-load-replay-smoke.js`:通过,覆盖 no replay / with replay。 +- `node scripts/task561-page-ai-session-dashboard-smoke.js`:通过,验证 `/api/page-ai/sessions/*`、search、status filter、export `json/markdown/jsonl`、rename/delete。 + +归档说明: + +- 当前 jobs 面板已经有 `jobs.running/items` 合同、空态和 Stop all 控件;由于 Page AI 还没有真实 long-running job registry,本稿不伪造 job receipt,不接外部 provider job 删除。后续长任务工具接入时只扩充 `jobs.items` 和 stop handler。 +- 外部 Hermes/provider 远端删除仍不提供默认 UI 动作;后端只接受显式 `deleteExternalProviderSession=1`,前端普通 Delete session 只删 MNote history。 diff --git a/design/07-ai/done/7-60-page-ai-settings-ia-cleanup-v1.md b/design/07-ai/done/7-60-page-ai-settings-ia-cleanup-v1.md new file mode 100644 index 00000000..dbf2a901 --- /dev/null +++ b/design/07-ai/done/7-60-page-ai-settings-ia-cleanup-v1.md @@ -0,0 +1,514 @@ +# 7-60 Page AI 设置 IA 整理 v1 + +> 创建时间:2026-06-10 +> +> 当前状态:`DONE` +> +> Owner:07-ai / Page AI / Settings IA / Runtime status +> +> 前置完成项: +> - `design/07-ai/done/7-58-page-ai-reasonix-official-desktop-session-alignment-v1.md` +> - `design/07-ai/done/7-59-page-ai-reasonix-desktop-hermes-web-control-surface-alignment-v1.md` +> +> 当前问题来源:7-59 后 Page AI 已有 runtime status、queue、jobs、logs、sessions dashboard,但 UI 仍沿用旧的 `Common / Hermes / Reasonix / Chat-only / 高级 / Runtime` 分层,导致“设置”和“运行态”混在一起。 + +## 1. 第一结论 + +Page AI 设置需要按 owner 分三层: + +```text +MNote = MNote 如何给 AI 上下文、权限、工具、会话历史和审计 +Reasonix = Reasonix ACP/native-live/queue/MCP/memory 的专属运行配置 +Hermes = Hermes gateway/profile/model/provider/session-load/replay/skills 的专属运行配置 +``` + +同时必须把“运行态状态”从“设置”里拆出去: + +```text +设置 = 可持久保存或影响后续 run 的配置 +状态 = 当前这一轮/当前 session 的 live snapshot +``` + +当前截图里的混乱点不是单个控件坏了,而是抽象层级混用: + +- 顶部显示 `Reasonix`,runtime strip 却显示 `hermes · new-session`,用户会误以为当前 agent 与 runtime 不一致。 +- `Common` 实际是 MNote 自身配置,但名字没有表达 owner。 +- `高级` 和 `Runtime` 既有设置项,又有只读状态项。 +- Runtime panel 里出现“打开 Hermes 设置”,但当前用户可能正在使用 Reasonix。 +- `Chat-only` 被放成一级设置页,但它本质是 MNote/API Chat/Hermes provider 的一种 runtime/profile 类型,不应和 Reasonix/Hermes 并列为 provider owner。 + +## 2. 新信息架构 + +### 2.1 Page AI 顶层导航 + +Page AI 抽屉保留五个一级工作区: + +| 一级区 | 含义 | 当前入口 | +| --- | --- | --- | +| 聊天 | 当前页对话、工具卡、引用、权限决策 | 默认页 | +| 状态 | 当前 runtime/session/run live snapshot | 由 runtime strip 或状态图标打开 | +| 设置 | MNote / Reasonix / Hermes 三层配置 | 齿轮 | +| 能力 | 当前 runtime 可用 tools/skills/memory 清单与开关 | sparkle/能力图标 | +| 历史 | MNote session dashboard | 搜索/历史图标 | + +原则: + +- “状态”不承载长期配置。 +- “设置”不展示 transient logs/job/active-run。 +- “能力”可以按 runtime 过滤,但 capability owner 仍归 MNote / Reasonix / Hermes。 +- “历史”展示 MNote session asset,不等于 Hermes DB 或 Reasonix native session。 + +### 2.2 设置页三层结构 + +设置页只保留三个主 tab: + +```text +MNote | Reasonix | Hermes +``` + +不再显示: + +```text +Common | Chat-only | 高级 +``` + +旧 tab 映射: + +| 旧 tab / 控件 | 新归属 | +| --- | --- | +| `Common` | `MNote` | +| `Chat-only` | `MNote > API Chat / Chat-only profile` | +| `高级` 里的 context scope | `MNote > 默认上下文` | +| `高级` 里的 runtime status | `状态` | +| `Runtime` panel | `状态` | +| `打开 Hermes 设置` | `Hermes` tab 内 | +| Reasonix memory / skill filter | `Reasonix` | +| Hermes profile / builtin skill filter | `Hermes` | + +## 3. MNote 设置 + +MNote tab 只放 MNote 自己拥有的控制面: + +### 3.1 授权区域 + +来源:SQLite `directory_grants` / current workspace grants。 + +展示: + +- 当前 workspace/root。 +- allowed roots 数量。 +- read/write 权限。 +- 授权来源:manual / smoke / share / system。 +- 权限缺失时的修复入口。 + +不展示: + +- Hermes API key。 +- Reasonix ACP binary。 +- providerConversationId。 + +### 3.2 默认上下文 + +来源:Page AI context refs。 + +控件: + +- 当前页。 +- 打开资源。 +- 选中文本。 +- 页面子树。 +- 附件/资源 tab。 + +保存语义: + +- 这是 MNote 的默认 run envelope 规则。 +- 不直接改 Reasonix/Hermes 的 native memory。 + +### 3.3 MNote 工具 + +范围: + +- LightRAG。 +- citation/open reference。 +- page context。 +- local file audit。 +- changed files receipt。 +- MNote MCP/tool facade。 + +展示: + +- enabled/disabled。 +- tool count。 +- last failed tool。 +- capability source。 + +### 3.4 会话与审计 + +范围: + +- MNote history。 +- export `json/markdown/jsonl`。 +- delete MNote history。 +- changed files audit。 +- permission pending queue。 + +删除文案必须固定: + +```text +删除只影响 MNote 历史,不删除外部 Hermes/provider/Reasonix session。 +``` + +外部删除只能出现在 Hermes tab 的危险区,并需要二次确认。 + +## 4. Reasonix 设置 + +Reasonix tab 只放 Reasonix 专属配置与能力: + +### 4.1 Runtime + +展示: + +- ACP runtime name:`reasonix`。 +- binary/wrapper:`scripts/reasonix-acp-wrapper.mjs` 或配置来源。 +- workspace key 规则。 +- native-live 支持状态。 +- supports session/load:false。 +- supports replay:false。 + +### 4.2 Native-live session + +只展示配置和策略,不展示当前 active-run 日志。当前 live binding 细节在“状态”页。 + +设置项: + +- native-live 开关或策略说明。 +- cold resume fallback 是否启用。 +- short reply without context 的提示策略。 + +### 4.3 Queue + +设置项: + +- busy send 行为:enqueue。 +- cancel queued item 策略。 +- queue max length。 +- queue timeout。 + +当前 queued count / preview 属于“状态”页。 + +### 4.4 MCP / tools / memory + +范围: + +- Reasonix MCP specs。 +- Reasonix tool count。 +- Reasonix memory 开关。 +- Reasonix skill filter。 + +不放: + +- Hermes profile。 +- MNote LightRAG provider 设置。 +- Chat-only provider 配置。 + +## 5. Hermes 设置 + +Hermes tab 只放 Hermes 相关配置: + +### 5.1 Gateway + +展示: + +- `MNOTE_WEB_HERMES_UPSTREAM_URL`。 +- gateway health。 +- config source。 +- logs link / settings link。 + +当前“未配置 Hermes 设置入口”错误只应出现在 Hermes tab,不应污染 Reasonix 设置或状态。 + +### 5.2 Profile / model / provider + +展示: + +- profile id。 +- resolved model。 +- provider kind。 +- credential status。 +- config source。 +- API key masked/missing/configured。 + +### 5.3 ACP session load / replay + +展示: + +- supports session/load:true。 +- stored `acpSessionId`。 +- load status:loaded / load-failed-new。 +- replaySeen / replaySeq / replayMessageCount。 + +注意: + +- replay 是 history restore/evidence,不进入 assistant final。 +- load failed 只影响 runtime continuity,不删除 MNote history。 + +### 5.4 Skills / memory + +范围: + +- Hermes skills。 +- hide builtin skills。 +- Hermes memory sections:soul/user/memory。 +- profile-local skills。 + +### 5.5 外部删除危险区 + +默认隐藏在 Hermes tab 底部。 + +动作: + +- 删除 MNote history:跳回 MNote 会话与审计。 +- 删除外部 Hermes/provider 会话:必须二次确认,且需要显式参数 `deleteExternalProviderSession=1`。 + +## 6. 状态页 + +状态页是 7-59 runtime panel 的重排版,不是设置页。 + +入口: + +- 点击顶部 runtime strip。 +- 或 header 增加状态图标。 + +内容: + +| 区块 | 字段 | +| --- | --- | +| Current runtime | runtime / mode / profile / model | +| Session | mnoteSessionId / acpSessionId / providerConversationId | +| Run | active run / status / queue | +| Context | allowed roots / context scope | +| MCP & tools | mcp status / tool count / failed | +| Jobs | running/completed/failed / stop all | +| Logs tail | ACP stderr / tool failed / MCP failed | +| Usage | last run / session total / cache/cost if available | + +状态页允许两个操作: + +| 操作 | 语义 | +| --- | --- | +| Stop turn | 只停止当前 run,不删除 session,不关闭 live binding | +| Reset current runtime | 关闭当前 runtime binding/manager,不删除 MNote history,不删除外部 provider | + +状态页不允许: + +- 删除 session history。 +- 删除外部 provider/Hermes 会话。 +- 改 Hermes API key。 +- 改 Reasonix memory。 + +## 7. UI 文案规则 + +### 7.1 Runtime badge + +顶部 badge 应按 owner 明确表达: + +```text +Reasonix · native-live +Reasonix · cold-resumed +Hermes · loaded +Hermes · replay-seen +API Chat · server-transcript +Chat-only · provider-conversation +``` + +禁止出现“header 是 Reasonix,但 badge 是 hermes new-session”的短暂串线。切换 agent/profile 时必须先清空旧 runtime status,再加载新 status。 + +### 7.2 设置 tab 文案 + +使用: + +```text +MNote +Reasonix +Hermes +``` + +不用: + +```text +Common +高级 +Chat-only +Runtime +``` + +### 7.3 危险动作文案 + +Stop turn: + +```text +停止当前输出,不关闭 runtime,不删除历史。 +``` + +Reset runtime: + +```text +重置当前 runtime。MNote 历史保留,外部 provider 会话不删除。 +``` + +Delete session: + +```text +删除 MNote 历史。外部 Hermes/provider 会话不会删除。 +``` + +External delete: + +```text +这会请求删除外部 provider/Hermes 会话,可能不可恢复。需要二次确认。 +``` + +## 8. 实施顺序 + +### Phase A:IA rename / no behavior change + +- [x] 将设置主 tab 收口为 `MNote / Reasonix / Hermes`。 +- [x] `Common` 改名 `MNote`。 +- [x] 移除一级 `Chat-only` tab;Chat-only 配置迁入 `MNote > API Chat / Chat-only profile`。 +- [x] `高级`/`Runtime` 不再作为设置 tab 名称。 +- [x] 保持现有 DOM action 与后端合同不变,先只做布局与文案重排。 + +验证: + +```bash +node --check rust/crates/mnote-web/browser/sidebar-page-ai-render-runtime.js +node scripts/task559-page-ai-terminal-status-reconciliation-smoke.js +``` + +### Phase B:状态页从设置页拆出 + +- [x] 新增或重排 `status` panel。 +- [x] runtime strip 点击打开状态页。 +- [x] runtime status、queue、jobs、logs、usage 移到状态页。 +- [x] MNote/Reasonix/Hermes 设置页不再显示 transient active-run logs。 +- [x] Stop turn / Reset current runtime 只在状态页显示。 + +验证: + +```bash +node scripts/task559-page-ai-terminal-status-reconciliation-smoke.js +node scripts/task558-page-ai-reasonix-live-session-context-smoke.js +``` + +### Phase C:MNote 设置 owner 收口 + +- [x] 授权区域、默认上下文、MNote 工具、会话与审计进入 MNote tab。 +- [x] Chat-only/API Chat profile 的入口进入 MNote tab。 +- [x] delete session 文案固定为只删 MNote history。 +- [x] permission pending queue 刷新恢复仍可见。 + +验证: + +```bash +node scripts/task561-page-ai-session-dashboard-smoke.js +cargo test -p mnote-web api_chat -- --nocapture +``` + +### Phase D:Reasonix / Hermes 设置 owner 收口 + +- [x] Reasonix tab 只展示 Reasonix runtime/native-live/queue/MCP/memory。 +- [x] Hermes tab 只展示 Hermes gateway/profile/model/provider/load/replay/skills。 +- [x] Hermes gateway 未配置错误只出现在 Hermes tab。 +- [x] Reasonix 页面不出现 Hermes upstream/API key 错误。 +- [x] Hermes 页面不出现 Reasonix native-live queue 当前状态。 + +验证: + +```bash +node scripts/task558-page-ai-reasonix-live-session-context-smoke.js +node scripts/task560-page-ai-hermes-load-replay-smoke.js +``` + +### Phase E:截图与移动端收口 + +- [x] 桌面宽度下设置 tab 不换行、不挤压。 +- [x] 移动宽度下三 tab 可点击,状态页内容可滚动。 +- [x] Runtime strip 不遮挡 header action。 +- [x] history actions 在移动宽度仍可点击。 + +验证: + +```bash +node scripts/task559-page-ai-terminal-status-reconciliation-smoke.js +node scripts/task561-page-ai-session-dashboard-smoke.js +``` + +需要补截图断言: + +- `MNote / Reasonix / Hermes` 三 tab 可见。 +- 状态页打开后可见 `Current runtime / Session / Queue / Logs tail`。 +- Reasonix 设置页无 Hermes API key 错误。 +- Hermes 设置页显示 gateway/profile/model/provider。 + +## 9. 不做事项 + +- 不改变 7-59 的后端 runtime/session API 合同。 +- 不新增第二套 runtime truth。 +- 不把 Hermes Web UI 作为完整 dashboard 搬进 MNote。 +- 不把 Reasonix Desktop settings 全量复制进 MNote。 +- 不自动删除外部 Hermes/provider/Reasonix session。 +- 不把 runtime logs/job/tool status 拼进 assistant final。 + +## 10. 完成条件 + +- 设置页只剩 `MNote / Reasonix / Hermes` 三个 owner tab。 +- Runtime status 从设置页拆出为独立状态页或 runtime strip popover。 +- MNote tab 不出现 Hermes API key / Reasonix binary 这类外部 runtime 配置。 +- Reasonix tab 不出现 Hermes upstream 未配置错误。 +- Hermes tab 不出现 Reasonix native-live 当前 queue。 +- Stop turn / Reset runtime / Delete session 三类动作仍语义分离。 +- Reasonix queued send、Hermes load/replay、API Chat、ChatOnly 现有 smoke 全部通过。 +- 移动截图中 tab、按钮、状态卡不重叠。 + +## 11. 实施记录 + +### 2026-06-10 Phase A-E + +已完成: + +- 设置页 tab 收口为 `MNote / Reasonix / Hermes`。 +- 移除一级 `Common / Chat-only / 高级 / Runtime` 设置 tab。 +- runtime strip 改为可点击入口,点击打开独立 `status` panel。 +- `status` panel 展示 `Current runtime / Session / Queue / Jobs / Logs tail / Usage`,并保留 `Stop turn` / `Reset current runtime`。 +- MNote tab 展示授权区域、默认上下文、会话与审计、API Chat / Chat-only profile、MNote 工具。 +- Reasonix tab 只保留 ACP runtime、Reasonix descriptor、Reasonix memory 等专属内容。 +- Hermes tab 展示 Hermes gateway、profile/model/provider、Hermes skills/memory,并承载 Hermes gateway 未配置提示。 +- 扩展浏览器 smoke,增加设置 IA、状态页、移动宽度 tab 可点性、Hermes/Reasonix owner 边界断言。 + +验证: + +```bash +node --check rust/crates/mnote-web/browser/sidebar-page-ai-render-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-profile-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-session-runtime.js +node --check rust/crates/mnote-web/browser/sidebar-page-ai-permission-runtime.js +node --check scripts/task558-page-ai-reasonix-live-session-context-smoke.js +node --check scripts/task559-page-ai-terminal-status-reconciliation-smoke.js +node --check scripts/task561-page-ai-session-dashboard-smoke.js +cargo test -p mnote-web hermes_client -- --nocapture +node scripts/task558-page-ai-reasonix-live-session-context-smoke.js +node scripts/task559-page-ai-terminal-status-reconciliation-smoke.js +node scripts/task560-page-ai-hermes-load-replay-smoke.js +node scripts/task561-page-ai-session-dashboard-smoke.js +``` + +浏览器截图证据: + +- `tmp/task559-terminal-status-fpUZi3/task559-runtime-panel.png`:状态页展示 Current runtime、Queue、Jobs、Logs tail、Usage。 +- `tmp/task559-terminal-status-fpUZi3/task559-settings-mobile.png`:移动宽度下 MNote / Reasonix / Hermes 三 tab 可点击且不重叠。 +- `tmp/task561-session-dashboard-ttJKyq/task561-settings-ia.png`:Hermes tab 展示 Hermes gateway/profile/skills,不显示 Reasonix queue。 + +归档说明: + +- 本稿只重排 Page AI 设置 IA 与状态页,不改变 7-59 后端 runtime/session API 合同。 +- 外部 Hermes/provider 删除仍需显式二次确认;本稿没有新增默认外部删除入口。