- 补齐 design/10-review 执行清单、验收标准与相关设计治理记录 - 迁移已完成的 tree、mindmap、runtime fallback、AI kernel 等设计和缺陷条目 - 推进 Rust Web runtime、tree/sidebar、page aggregate、mindmap 与 OnlyOffice 路由侧验证支撑 - 增加 task177-task180 smoke/audit 脚本及前端相关测试覆盖
12 KiB
7-3 [process] 页面 AI Hermes 面板与 mnote Plugin 主线方案 v1
更新时间:2026-05-13
上位依据:
/mnt/Data1T/mnote/ARCHITECTURE.md/mnt/Data1T/mnote/design/01-05-current-priority-overview.md/mnt/Data1T/mnote/design/03-rust-web/process/3-rust-web-long-term-architecture-v1.md/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md/mnt/Data1T/mnote/design/05-editor-mainline/done/5-10-wolai-page-settings-and-ai-surface-alignment-v1.md/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/hermes-web-ui-0.5.18/mnt/Data1T/mnote/design/07-ai/process/7-2-phase7-structured-artifact-write-chain-v1.md覆盖关系:
- 覆盖
/mnt/Data1T/mnote/design/old/07-ai/process/7-phase7-ai-kernel-projection-plan-v4.md中“mnote-cli是唯一长期 agent 执行面”的口径。- 保留
v4中“Web 不应拥有第二套工具注册表、结构化写入必须回到 Rust runtime / kernel”的判断。- 保留
7-2中summary node / ai_note node / reference edge的对象模型和写入边界, 但触发方改为 Hermes tool call,而不是页面 AI host 私有按钮或mnote-clihost。
1. 文档目的
这份稿只回答一个问题:
未来页面 AI 的长期主语到底是谁。
当前冻结答案是:
页面 AI 面板只是 Hermes 的页面内客户端;Hermes session/message/tool event/usage/model 才是会话真相;mnote 通过 Hermes skill/plugin 暴露业务能力。
这不是把 mnote 的业务真相交给 Hermes。长期边界必须分清:
- Hermes 负责 AI 编排、会话、模型、tool call 调度和聊天历史。
- mnote 负责页面、树、正文、artifact、edge、projection 和审计事实。
- 页面 AI 面板只负责在文档页里打开一个 Hermes 客户端。
一句话收口:
AI 会话归 Hermes,mnote 能力归 Rust kernel;页面 AI 面板只连接两者。
2. 为什么要从 CLI-first 改为 Hermes-first
CLI-first 解决了一个真实问题:避免 Web 前端继续拥有私有 AI 编排、私有工具注册表和私有写链。
但它也带来了新的错位:
- 页面 AI 面板开始伪装成
mnote-cli图形客户端。 - Hermes、Codex、
openai-agents-python被统一压成“外置 agent”,但实际用户希望页面 AI 就是 Hermes 面板。 - 真实会话能力、模型选择、tool event、thinking、usage、历史搜索这些已经是 Hermes 的强项,mnote 自己再做一套会重复。
- 当前运行态已经出现冲突:页面壳默认发送
provider=hermes,而/api/ai-agent/run又按旧退场口径返回ai_provider_bridge_unavailable。
因此新的主线不是恢复旧的 Web 私有 AI 编排,而是:
把页面 AI 从
mnote-cli host改成 Hermes client,把 mnote 能力从 Web 私有 tool 改成 Hermes 可发现、可调用的 skill/plugin。
3. 长期分层
3.1 Hermes
Hermes 负责:
- session 创建、恢复、重命名、删除、搜索
- message 存储与 conversation history
- model / provider / profile 选择
- streaming 事件、thinking / reasoning、usage
- tool call 调度、排队、取消、恢复
- skill / plugin 的发现和启停
Hermes 不负责:
- 直接写 mnote 的 Convex 表
- 直接构造第二套 page aggregate
- 直接决定页面树、文件树、artifact、edge 的事实结构
3.2 mnote Rust kernel / runtime
mnote Rust 负责:
Page Aggregatepage.*commandtree.*commandkernel.*query / edgesummary node / ai_note node / reference edge- projection、audit、idempotency、workspace / actor scope
Rust 不负责:
- 存储 Hermes 聊天历史
- 维护 Hermes session 列表
- 重做 Hermes 模型、profile、usage 管理
3.3 页面 AI Leptos 面板
页面 AI 面板负责:
- 右下角入口与右侧抽屉壳层继续服从 Wolai 对齐结果
- 用 Leptos 实现 Hermes chat 的页面内子集
- 调用 Hermes session / run / stream API
- 把当前页面上下文作为 Hermes run 的输入或 session workspace context
- 展示 Hermes 返回的 message、reasoning、tool event、error、usage
页面 AI 面板不负责:
- 自己保存聊天真相
- 自己维护工具注册表
- 自己执行页面写入
- 自己 fallback 到
mnote-cli或旧 sidecar
3.4 mnote Hermes skill/plugin
mnote 需要作为 Hermes skill/plugin 暴露能力。
第一版建议能力分组:
mnote.page.getmnote.page.savemnote.page.update_titlemnote.page.update_optionsmnote.tree.createmnote.tree.movemnote.search.documentsmnote.artifact.create_summarymnote.artifact.create_ai_notemnote.kernel.attach_reference
这些工具可以由 plugin 内部调用:
- Rust Web 同源 tool bridge
mnote-cliJSON adapter- 或后续更稳定的 Rust plugin bridge
但对 Hermes 来说,它们必须表现为一组稳定 Hermes tools,而不是页面前端私有函数。
4. 会话真相
页面 AI 的会话真相固定在 Hermes。
mnote 不保存:
- 聊天消息列表
- assistant 文本历史
- thinking / reasoning 历史
- tool event 完整展开状态
- session 标题、分组、usage
mnote 可以保存:
- 结构化写入产生的 audit
- artifact node
- reference edge
- page/body/title/options 的正式变更
- 与一次 Hermes tool call 对应的 request / trace / actor / reason
也就是说,mnote 只保存“对 mnote 事实源造成影响的结果”,不复制 Hermes 的聊天数据库。
5. 页面上下文进入 Hermes 的方式
页面 AI 面板打开时,mnote 应提供最小上下文包:
workspaceIddocumentId- 页面标题
pageAggregate摘要- 当前选区 / blockId / selected text
- 页面设置
- 当前用户 actor / capability 摘要
上下文传入 Hermes 有两种可接受方式:
- 作为 run input / instructions 的结构化上下文。
- 作为 Hermes session workspace context,由 mnote panel 在创建或恢复 session 时设置。
第一版优先采用简单方式:
页面 AI 面板每次发起 run 时附带当前页面上下文摘要;Hermes 如需读取最新正文,再通过
mnote.page.get工具回读。
这样可以避免把 page aggregate 大对象长期塞进 Hermes session,也避免 stale context 变成事实源。
6. API 与路由边界
6.1 退役 /api/ai-agent/run 主路径
/api/ai-agent/run 不再作为页面 AI 的长期主入口。
允许状态:
- 暂时保留为 legacy compat,明确返回旧接口退场信息
- 或只用于旧 smoke / 对照验证
禁止状态:
- 页面 AI 新实现继续向它发送
provider=hermes /api/ai-agent/run继续作为 Hermes 面板的主代理- 它继续持有 mnote 私有工具注册表或执行编排
6.2 新增 Hermes client proxy
浏览器不应直接暴露 Hermes API key。
建议在 mnote-web 中提供同源薄代理:
/api/hermes/client/sessions/api/hermes/client/runs/api/hermes/client/events/api/hermes/client/models/api/hermes/client/tools
这层只做:
- auth / cookie / token 转发
- 同源安全边界
- 页面上下文最小注入
- 错误码标准化
这层不做:
- session 真相存储
- message 真相存储
- tool 执行编排
- 旧 provider fallback
6.3 mnote tool bridge
Hermes 调用 mnote 工具时,应进入窄桥:
Hermes tool call
-> mnote Hermes plugin
-> mnote-web /api/hermes/tools/mnote/*
-> Rust runtime / kernel command/query
-> Hermes tool result
第一版不要求一次性冻结最终 URL,但要求协议字段稳定:
toolNameargumentsworkspaceIddocumentIdactorsessionIdtraceIdidempotencyKeydryRuncapabilityScope
7. Leptos 面板参考范围
参考 hermes-web-ui-0.5.18,但只采用页面内必要子集。
第一版采用:
- Chat session list
- Message list
- Chat input
- streaming delta
- thinking / reasoning 展开
- tool started / tool completed 展开
- model selector
- error / retry / abort
- session search 可后置
第一版不采用:
- 平台 Channels 管理
- Jobs / Cron 管理
- Profiles 管理全页面
- Logs 全页面
- Files 全浏览器
- Terminal
- Group Chat
- Hermes 全局 Settings
这些能力属于 Hermes 管理台,不属于 mnote 页面 AI 抽屉。
实现要求:
- 使用 Leptos island 实现,不引入 Vue / Naive UI。
- 保留 Wolai 对齐的右下角入口和右侧 drawer 容器。
- 文案和视觉以 mnote 文档页密度为准,不照搬 Hermes Web UI 的整站导航。
8. 结构化 Artifact 写链
7-2 的对象模型继续成立:
summary nodeai_note nodereference edgeAI Artifactsprojection-only 分组
但触发方改为 Hermes tool call:
- 用户可以在 Hermes 面板中自然语言要求总结当前页。
- Hermes 决定调用
mnote.artifact.create_summary。 - 或页面面板提供快捷按钮,但按钮本质也是向 Hermes 发送意图,不是绕过 Hermes 直接写 mnote。
第一版允许两个快捷入口:
创建 Summary创建 AI Note
但它们必须走:
Leptos panel -> Hermes session/run -> mnote plugin tool call -> Rust kernel
不得走:
Leptos panel -> /api/documents/* 直接写 artifact
9. 权限与安全
Hermes 可以调度工具,但 mnote 必须做最终授权。
每个 mnote tool call 至少校验:
- 当前 actor 是否登录
- actor 是否属于 workspace
- 当前页面是否允许 AI 读取
- 当前页面是否允许 AI 写入
- 当前工具是否允许写入页面 / 树 / artifact
- 是否需要
dryRun或确认
默认第一版:
- 读当前页:允许
- 写当前页:按页面 capability
- 创建 summary / ai_note:按当前页 artifact capability
- 跨页写入:默认禁止
- 跨 workspace:禁止
10. 迁移步骤
Phase A:设计口径统一
- 新增本稿作为 07-ai 当前主线。
- 将
7-v4 CLI-first移入design/old/07-ai/process/并标记[recycle]。 - 更新仍引用
mnote-cli唯一长期 agent 执行面的活跃设计稿。
Phase B:薄 Hermes client proxy
- 在
mnote-web补 Hermes client proxy。 - 页面 AI 面板不再调用
/api/ai-agent/run。 - 浏览器不直接持有 Hermes API key。
Phase C:Leptos Hermes 面板最小子集
- 实现 session 创建 / 恢复。
- 实现 run / stream / abort。
- 实现 message / reasoning / tool event 展示。
- 保留 Wolai 右侧抽屉壳。
Phase D:mnote Hermes plugin
- 暴露 mnote tool manifest。
- 先接
mnote.page.get、mnote.page.save、mnote.artifact.create_summary、mnote.artifact.create_ai_note。 - 工具结果回到 Hermes tool event。
Phase E:退役旧面板执行链
/api/ai-agent/run从主路径移除。- 旧 React
DocumentAiAgentPanel.runtime降为历史参考或 compat。 provider=hermes/codex/claudecode502 不再出现在新页面 AI 主链。
11. 验收标准
第一版完成时必须满足:
- 页面 AI 抽屉打开后可创建或恢复 Hermes session。
- Hermes session 存储中能看到页面 AI 的消息历史。
- mnote 本地不复制聊天消息真相。
- 发送消息后,事件流来自 Hermes run。
- tool call 展示使用 Hermes tool event。
- Hermes 可调用至少一个只读 mnote 工具读取当前页面。
- Hermes 可调用至少一个写入工具,经 Rust runtime 写回当前页或创建 artifact。
- 页面刷新后,AI 会话从 Hermes 恢复,而不是从 mnote 本地 state 恢复。
- 结构化写入产生的 artifact / edge 能在 mnote projection 中验证。
12. 禁止项
- 不再新增 Web 私有 AI tool registry。
- 不再把
mnote-cli写成页面 AI 唯一长期执行面。 - 不把 Hermes 聊天历史复制进 mnote page aggregate。
- 不让 Hermes plugin 直接写 Convex。
- 不在 Leptos 面板里重做 Hermes 后台管理台。
- 不把
AI Artifacts做成真实 kernel node。 - 不绕过 Rust runtime 创建 artifact / edge。
13. 最终冻结口径
页面 AI 是 Hermes 面板,不是 mnote-cli 面板。
Hermes 持有 AI 会话真相,mnote 持有业务对象真相。
mnote 通过 Hermes skill/plugin 暴露工具,工具最终回到 Rust runtime / kernel。
Leptos 负责页面内 Hermes 客户端体验,不负责 AI 编排。