Files
mnote/design/old/07-ai/process/7-phase7-ai-kernel-projection-plan-v3.md

9.7 KiB

7 [process][recycle] mnote Kernel Phase 7 AI 与 CLI 外置 Agent 边界实施方案 v3

更新时间:2026-05-05

上位依据:

  • /mnt/Data1T/mnote/ARCHITECTURE.md
  • /mnt/Data1T/mnote/design/01-05-current-priority-overview.md
  • /mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md
  • /mnt/Data1T/mnote/design/03-rust-web/process/3-rust-web-long-term-architecture-v1.md
  • /mnt/Data1T/mnote/design/04-tree-domain/done/4-6-tree-command-protocol-cutover-stage2-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/07-ai/done/7-1-phase7-document-ai-minimum-loop-checklist-v1.md
  • /mnt/Data1T/mnote/design/old/07-ai/process/7-phase7-ai-kernel-projection-plan-v2.md

本稿与 v2 的关系:

  • v2 记录的是文档页 AI 最小闭环与 openai-agents-python sidecar 的主线收口
  • 本稿记录的是从“双中心并存”过渡到 CLI-first 之前的边界判断,重点保留当时为何要把页面内 AI 与外置 agent 拆层
  • 若未来继续演进,长期口径以 v4 为准;本稿不再作为当前长期判断依据

2026-05-05 追加说明:

  • 本稿已被 /mnt/Data1T/mnote/design/07-ai/process/7-phase7-ai-kernel-projection-plan-v4.md 覆盖
  • v3 只保留用于记录“双中心并存”的过渡判断
  • 当前长期口径不再采用本稿,而采用 v4CLI-first
  • 当前统一口径是:mnote-cli 是唯一长期 agent 执行面,openai-agents-python、Hermes、Codex 都只是可插拔外置 agent

1. 文档目的

这份稿只回答一个问题:

mnote 的 AI 能力到底应该以“内置 agent”为中心,还是以“CLI 兼容外置 agent”为中心。

当前长期结论已被 v4 修正为单一执行面:

  1. Web 文档页 AI 面板继续保留,但只作为页面内交互壳 / CLI host
  2. mnote-cli 是唯一长期 agent 执行面
  3. Hermes、Codex、openai-agents-python 这类外置 agent 不再直接依赖产品内编排细节,而是统一通过 CLI / 稳定工具面进入系统
  4. Rust kernel 继续作为唯一事实源与真执行面

一句话收口:

本稿原始判断是“不要退回成只有 CLI”;该口径现已被 v4 覆盖。当前长期口径是:CLI 作为唯一执行面,Web AI 只保留为页面内交互壳。


2. 当前完成情况

2.1 文档页 AI 最小闭环已完成

7-1 已经完成,说明当前文档页 AI 至少已经跑通:

  • 当前页 page aggregate 上下文读取
  • openai-agents-python sidecar 编排
  • 标题改名与正文写回
  • Hermes fallback / 对照链
  • model_key / profile / tool registry 的可见配置面

这意味着当前系统已经不是“要不要有 AI”,而是“AI 的长期边界该放在哪一层”。

2.2 mnote-cli 已经不是空壳

当前 Rust 侧已有 mnote-cli,并且已经覆盖:

  • page
  • block
  • mindmap
  • search
  • sidebar
  • editor
  • tool

同时它已经有较清晰的执行参数面:

  • --json
  • --execute
  • --session-id
  • --reason
  • --idempotency-key
  • --validate-only
  • --dry-run

这说明 CLI 已经具备成为“外置 agent 统一兼容层”的基础,而不是只做调试壳。

2.3 内置 AI 现在的定位已经足够清晰

当前 wolai-backend/app/services/ai_document_agent.py 这一层已经把文档页 AI 约束成:

  • 只处理当前文档页
  • 只使用有限工具面
  • 通过 page aggregate 组织上下文
  • 通过 slash_run / doc_insert_blocks / doc_replace_range 这类写链回写

所以内置 AI 的价值不是“全能 agent 平台”,而是“产品内即时编辑体验”。


3. 核心判断

3.1 v3 当时对 CLI-first 的顾虑

本节保留的是 v3 当时尚未接受 CLI-first 时的顾虑:

  1. 担心产品内即时体验变差
  2. 担心页面上下文、审核、回写被拆散
  3. 担心外置 agent 变强但产品主链变弱

这些顾虑在 v4 中的处理方式不是退回“双中心”,而是明确:

  • Web AI 面板继续保留
  • 但它只作为 mnote-cli 的页面内 host / client
  • 执行面不再由产品内 AI 单独持有

3.2 也不建议把内置 AI 变成唯一中心

相反,如果继续把内置 AI 当唯一中心,另一个问题会变得更严重:

  • agent 更新能力受限
  • 记忆层容易变成产品私有状态
  • 能力面会偏向单一页面操作
  • Hermes / CLI 这类外置 agent 很难稳定接入

所以正确做法不是“只保留内置 AI”,而是mnote-cli 收口为唯一长期 agent 执行面

3.3 当前长期分层应理解为三层

  1. Web AI 面板 / 页面内交互壳

    • 负责文档页内交互、上下文读取、局部回写、审核辅助
  2. mnote-cli

    • 负责唯一长期 agent 执行面,以及外置 agent、脚本、批处理、离线任务、可观测执行
  3. Rust kernel

    • 负责所有事实源、命令、查询、投影、审计与回放

这三层之间不应该互相抢语义中心。


4. 架构边界

4.1 Rust kernel

负责:

  • 页面、树、边、投影、查询、命令
  • 结构化写入的最终事实源
  • 审计、trace、回放、恢复

不负责:

  • 直接承担 UI 体验
  • 直接承担通用 agent 编排

4.2 Web AI 面板(产品内交互壳)

负责:

  • 当前文档页的即时编辑
  • 选中上下文的解释与改写
  • 通过正式命令面回写
  • 审核与继续编辑的体验闭环

不负责:

  • 成为全局 agent 平台
  • 取代 CLI 的批处理入口
  • 持有独立长期记忆真源
  • 成为第二个长期执行面

4.3 mnote-cli

负责:

  • 作为唯一长期 agent 执行面与统一命令面
  • 作为人类与脚本的可执行入口
  • 作为 Hermes、Codex、批处理、定时任务的兼容层

应该提供:

  • 稳定的 JSON 输出
  • 明确的 plan / execute 分层
  • 会话与 trace 参数
  • 幂等键
  • 校验模式与 dry-run
  • 可发现的 capability manifest

4.4 Hermes / Codex / openai-agents-python

负责:

  • 可插拔外置 agent 场景
  • 过渡平台
  • 回归对照

不负责:

  • 成为产品内部独立长期主编排
  • 直接绕过 Rust runtime 写业务数据

5. CLI 应该补什么

5.1 统一能力发现

CLI 需要先变成“可发现能力集合”,而不是一堆散命令。

最少要能回答:

  • 当前可写什么
  • 当前可读什么
  • 当前哪些命令是计划态
  • 当前哪些命令可直接执行
  • 当前命令属于哪个 scope

5.2 统一执行元数据

外置 agent 真正缺的不是命令本身,而是执行元数据一致:

  • session_id
  • actor_id
  • actor_type
  • reason
  • idempotency_key
  • validate_only
  • dry_run
  • trace / audit id

这些都应该在 CLI 层成为一等参数。

5.3 统一记忆入口

这里的“记忆”不应该是产品壳里的隐式状态,而应该拆成三层:

  1. 会话记忆

    • 某次 agent 运行的上下文与结果
  2. 配置记忆

    • profile、工具注册、运行时偏好
  3. kernel 记忆

    • 真实业务对象、projection、历史变更

CLI 负责把这三层显式化,外置 agent 通过它读取或写入,不再自己猜。

5.4 统一机器可读输出

如果 Hermes、Codex、脚本都要接入,CLI 输出必须稳定机器可读。

最低要求:

  • --json 必须完整
  • 错误结构必须稳定
  • 成功结构必须能直接喂给上层 agent
  • 人类输出和机器输出要分开

6. Web AI 面板继续保留什么

6.1 继续保留

  • 当前页正文改写
  • 当前页标题改名
  • 当前页上下文读取
  • 页面内审核与继续编辑
  • 与 page aggregate 对齐的最小闭环

6.2 不继续扩写

  • 通用多 agent 平台壳
  • 全局记忆产品壳
  • 独立于页面主链的第二份真相
  • 把 CLI 功能重复做一遍

6.3 设计原则

Web AI 面板只做“最近的一层”,不要做“全部层”。

因为页面内 AI 交互壳的目标是让用户快,不是让系统像一个独立平台那样完整。


7. 迁移策略

阶段 1:收口 CLI 兼容面

  • mnote-cli 明确成唯一长期 agent 执行面
  • 保持现有命令树不乱长
  • 先统一 JSON / plan / execute / trace / idempotency

阶段 2:补稳定能力发现

  • 输出 capability manifest
  • 区分 read / write / job
  • 区分 document / tree / workspace scope

阶段 3:外置 agent 接入

  • Hermes 通过 CLI 进入系统
  • 后续其他 agent 也通过同一 CLI 进入
  • 不再为每个 agent 单独做一套产品内桥接逻辑

阶段 4:保留页面内 AI host

  • 文档页 AI 继续保留当前页面内主路径
  • 只做 UI 内最小闭环
  • 不回退到全局壳
  • 不再把页面内 host 叙述成独立长期执行面

8. 非目标

本稿不做:

  • 重新实现一个新的通用 AI 平台
  • 把 Hermes 直接升级成产品内主编排中心
  • 把内置 AI 删除掉
  • 把所有页面内交互体验都删除并强制改成手工 CLI 操作
  • 在 CLI 里重复一套产品 UI

9. 完成判定

当下面几项成立时,才算这个方向真正站稳:

  • mnote-cli 是唯一长期 agent 执行面,而不是纯调试壳
  • Web AI 面板只负责页面内最小闭环
  • openai-agents-python、Hermes、Codex 等外置 agent 通过 CLI 进入系统
  • Rust kernel 仍然是唯一事实源
  • model_key / profile / tool registry 这些产品语义不被页面内 host 私有化

一句话收口:

本稿保留的是“产品内 AI + CLI 兼容层”并存的过渡判断;当前长期口径已经改为:mnote-cli 是唯一执行面,Web AI 只是页面内交互壳,Rust kernel 继续负责真相。