# [recycle] mnote Rust 内核替换剩余目标清单 > 更新时间:2026-04-15 > > 关联文档: > - `/mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/process/rust-kernel-backport-plan.md` > - `/mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/process/rust-kernel-backport-phase-checklist.md` > - `/mnt/Data1T/mnote/ARCHITECTURE.md` ## 1. 本文目的 本文不再回答“Rust 内容是否已经回迁到主仓”,而是直接回答: > **距离“用 Rust 内核替换原有内核,并让绝大部分功能 CLI 化、可供 AI 自主编辑”这一最终目标,我们现在还差什么。** 当前结论很明确: - **单仓收口已经基本完成** - **Rust workspace 与 P0 crate 已经落位** - **部分前端 API 已经接入 Rust 风格协议与 bridge 接缝** - **但“Rust 真正成为唯一执行内核”这件事还没有完成** 也就是说,当前更接近: > **“前端/Node 先学会说 Rust 协议”** 而不是: > **“产品已经由 Rust 内核统一执行”** --- ## 2. 当前已经完成的基础 截至目前,已经完成的只是替换前的基础设施准备: - `/mnt/Data1T/mnote/rust/` 已成为主仓内唯一 Rust workspace 根。 - `core-domain`、`core-protocol`、`event-log`、`storage-convex-bridge`、`index-fts` 已落位。 - `rust/design/core/01~04` 核心设计文档已落位。 - 文档内容、标题、统计、Sidebar 等链路,已经开始使用统一 envelope、`request_id`、`trace_id`、`idempotency_key` 等 bridge 元信息。 - `command_logs`、`domain_events` 已有首批落账能力。 这些工作解决的是: - 单仓问题 - 协议问题 - 目录问题 - 第一批接缝问题 **它们还没有解决“原内核是否已经被 Rust 取代”的问题。** --- ## 3. 还差的核心目标 ## 3.1 还没有形成“Rust 唯一执行内核” 这是当前最大的缺口。 虽然已有一部分 route 在构造 Rust 风格 request,但真实执行主链仍然大量停留在 `Next.js route + TypeScript + Convex client`。 当前仍明显属于旧执行面的代表链路包括: - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/create/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/delete/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/move/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/restore/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/duplicate/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/search/documents/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/onlyoffice/*.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/media/*.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/tables/*.ts` 这说明目前还没有做到: - 所有核心读写先进入 Rust `Command / Query / Tool` 层 - 所有执行规则由 Rust 决定 - Node/Next 只做 transport、auth、session、streaming、UI 适配 最终目标需要变成: - Web route 只负责接请求、鉴权、转发、回流结果 - Rust 负责真正的命令执行、查询聚合、约束校验、冲突处理、日志和事件生成 验收标准: - 文档、块、Sidebar、搜索、页面树、Mindmap、OnlyOffice、媒体、表格等主链路都有 Rust 执行入口 - 前端 route 不再手写业务规则和数据聚合 - TypeScript 侧不再直接成为业务真内核 ## 3.2 还没有完成“全域能力模型”的 Rust 化 当前 Rust workspace 只有 P0 通用内核 crate,缺的不是“再多几个通用 crate”,而是产品能力域本身还没被吸进 Rust。 还没有真正完成 Rust 化的能力域至少包括: - 页面树与层级操作 - 页面创建、移动、复制、删除、恢复、清空回收站 - BlockNote block 级操作全量协议 - 搜索与召回 - 引用、反链、嵌入 - 媒体与附件 - 在线表格 - Mindmap - OnlyOffice 会话、签名、回调、强制保存 - AI 调用的写入工具面 当前 `core-domain` 和 `core-protocol` 更像底层骨架,但还没长成完整产品内核。 验收标准: - 每个产品域都有明确 Rust domain model、command、query、tool contract - 前端不再自行定义第二套 payload 形状 - “页面系统”和“对象系统”不再由不同 TS route 各自发明规则 ## 3.3 CLI 入口还没有建立起来 你的目标里有一条是关键约束: > **绝大部分功能 CLI 化** 这件事当前还远未完成。 直接证据是: - `mnote-cli` 已并入主仓 workspace,但当前还只是最小命令面与 `--json` 计划输出协议 - `/mnt/Data1T/mnote/rust/scripts/` 还未初始化 - `/mnt/Data1T/mnote/rust/bridge/` 已初始化最小说明目录,且 `crates/bridge-runtime` 已提供 Phase 1 最小真实执行样板 - `/mnt/Data1T/mnote/rust/tests/`、`/mnt/Data1T/mnote/rust/fixtures/` 还未形成 CLI 驱动的验收体系 这意味着目前仍然缺少: - 真正可执行而不止输出计划的统一 CLI 二进制入口 - 可脚本化的命令集 - 稳定的 stdout/stderr/json 输出协议 - 面向 AI 的非交互调用模式 - dry-run / plan / apply / rollback 风格能力 最终至少应该具备的 CLI 面包括: - `page create/get/update/move/delete/restore/list` - `block insert/replace/move/delete/get` - `search query` - `sidebar dataset` - `mindmap get/put/op` - `onlyoffice sign/callback/forcesave/session` - `media upload/list/get/delete` - `table create/get/update` - `tool run --json` 验收标准: - 核心功能可以不经过浏览器完成 - 核心功能可以稳定返回 JSON - shell、脚本、AI agent 都能直接调用 - CLI 和 Web 不再各维护一套业务实现 ## 3.4 AI 还没有真正建立在 Rust 工具面之上 当前已经有 AI 入口: - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/ai-agent/run/route.ts` - `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/DocumentAiAgentPanel.tsx` 但这套 AI 执行仍主要建立在前端/Node 工具注册表与页面侧 bridge 上,不是建立在 Rust 原生 tool protocol 上。 这会带来四个问题: - AI 能调用的工具面和 Web 内部实现强耦合 - AI 与 CLI 不是同一执行平面 - AI 写入行为缺少统一事务语义 - AI 很难获得稳定、可审计、可回放的编辑能力 为了实现“AI 可自行编辑”,至少还差以下目标: - Rust 提供稳定的 `Tool` 执行协议,而不是只提供 `Command/Query` 壳 - AI 调用和 CLI 调用共享同一工具注册面 - 每个写入工具都支持明确的目标对象、权限校验、冲突返回、审计日志 - 支持 `validate_only`、`dry_run`、`explain_plan` 之类的安全模式 - 支持机器可消费的错误码,而不是前端文案式错误 最终目标不是“AI 像用户点按钮一样绕进前端”,而是: > **AI 直接调用 Rust 工具内核完成读写,Web 只是展示层。** 验收标准: - AI agent 使用的写入工具与 CLI 使用的工具完全同源 - AI 的每次编辑都能追踪到 command、event、trace、目标对象和 actor - AI 可稳定执行页面编辑、块编辑、检索、结构化改写、批处理操作 ## 3.5 观测、审计、幂等和失败恢复还只完成了首批链路 现在已有 `command_logs`、`domain_events`,但仍是首批写链路覆盖,不是全域治理。 仍缺的能力包括: - 所有命令统一落账 - 所有失败态统一编码 - 统一重试与幂等语义 - 统一冲突模型 - 统一补偿与回放 - 统一事件重建和索引重放 如果没有这一层,CLI 和 AI 即使能写,也不够稳定。 验收标准: - 任一写操作都能查 request、trace、command、domain event - 幂等 key 在 CLI、AI、Web 三侧语义一致 - 冲突、拒绝、权限不足、对象不存在等错误有统一 code - 可从事件或命令日志重建关键派生层 2026-04-15 进展补记: - `rust/crates/core-protocol` 与 `bridge-runtime` 已新增 `bridge_request_get`、`bridge_trace_get`、`bridge_command_get`、`event_replay`、`index_rebuild` 这组统一观测/恢复能力;当前 `/api/bridge/request` 与 `/api/bridge/trace` 也已切到 Rust query plan + TS transport 的同一路径,不再各自直连 Convex 查询。 - `src/lib/documents/bridge-log.ts` 已把命令日志与领域事件的状态语义显式化,支持 `pending/succeeded/failed/rolled_back` 与 `pending/committed/rejected/failed` 两套状态模型,为后续冲突、失败和补偿写回提供稳定落点。 当前仍未关闭的缺口: - 失败态、冲突态虽然已经在页面主写链与 AI/Mindmap 写链补上第一批落账,但仍未覆盖所有对象域写链。 - `event_replay` / `index_rebuild` 目前已成为正式命令面,但还主要停留在 runtime/工具层,尚未形成完整的持久化游标、任务调度和断点续跑体系。 - workspace 级总览、分页、按对象范围筛选等观测 UI 仍未完善。 ## 3.6 搜索、索引和派生视图仍在持续切换中 2026-04-15 进展补记: - `search.documents` 已不再把核心 ranking / snippet / filter 留在 TS route。当前 `/mnt/Data1T/mnote/wolai-frontend/src/app/api/search/documents/route.ts` 只保留参数校验、原始数据装载与 HTTP 回传;标题/正文/思维导图/表格/附件的匹配合并、高亮 snippet 与 OCR 待补队列决策已进入 `rust/crates/index-fts/src/lib.rs`。 - `search.recent` 已补齐独立 Rust query 名称,并通过 runtime 返回最近访问结果;当前保留 `/api/search/recent` 作为“打开页面后写最近访问记录”的 side-effect 接口,不与搜索召回混在一条写链里。 - `sidebar.dataset.list` 已从“只在 route 上挂一个 Rust queryName”推进为真实 runtime query transport,`/api/sidebar` 现会先经过 Rust runtime,再调用 `sidebar:datasetList`。 当前仍未完全关闭的缺口: - 索引重建、校验与回放命令还未落到产品主路径。 - `src/app/(app)/layout.tsx` 的 SSR 侧边栏初始数据仍复用现有 `loadSidebarDataFromConvex` helper,没有一并切到 runtime transport。 更新后的验收标准: - `search_web`、`image_read`、`slash_run` 这类 AI 核心工具必须保持 `RUST_OWNER`,不能回退到 TS 真执行兜底。 - `builtins/**` 中已被 Rust 替代的服务端真入口必须进入第一批 `TS_LEGACY_DELETE`,清单以 `/mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/done/rust-kernel-legacy-delete-list.md` 为准。 - 搜索结果由 Rust query / index 层给出。 - TS 前端只做 UI 投影,不做核心排序与召回逻辑。 - 索引可重建、可校验、可回放。 ## 3.7 Mindmap 和 OnlyOffice 还没有进入真正的 Rust adapter 执行层 现在对这两个对象域,文档上已经明确了边界,但执行层仍主要在现有 TS/Convex 逻辑。 现状更接近: - **边界想清楚了** - **前端形态保住了** - **但 Rust adapter 还没真正接管** 缺口主要包括: - `adapter-mindmap` 尚未并入主仓 - `adapter-onlyoffice` 尚未并入主仓 - Mindmap 节点操作还没有稳定的 Rust ops 协议 - OnlyOffice 的 sign / proxy / callback / forcesave 还没统一进入 Rust 对象适配层 验收标准: - Mindmap 的结构操作可由 CLI 与 AI 直接调用 - OnlyOffice 的对象能力具备统一 session/asset 边界 - 不需要依赖前端 route 才能操作这些对象 ## 3.8 仍缺一条“从旧内核切换到新内核”的明确割接路线 目前已有 backport plan,也有 phase checklist,但还缺一个更硬的最终割接视角: - 哪些旧 TS route 会被逐步下线 - 哪些功能先双写、再单写 - 哪些功能允许长期保留在前端侧 - 哪些功能必须强制进入 Rust - 何时可以宣布“原内核不再是主执行面” 如果没有这一条,项目会长期停留在“看起来在迁移,实际上双内核并存”的状态。 验收标准: - 列出旧执行面的退役清单 - 每个能力域有 cutover milestone - 明确宣布 Rust 成为唯一业务执行平面时的准入条件 2026-04-15 进展补记: - 本轮已新增 `/mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/done/rust-kernel-cutover-v1.md`,首次把页面系统、块系统、查询聚合、AI、Mindmap、OnlyOffice、兼容接口统一盘点为 `RUST_OWNER / TS_TRANSPORT_KEEP / TS_COMPAT_PENDING / TS_LEGACY_DELETE` 四类状态。 - 当前“不明确”的问题已经收口为“执行尚未完成”的问题:退役清单、阶段 gate 与最终宣布口径都已写清,但旧接口的物理删除和 AI 工具面的完全统一还未完成。 --- ## 4. 对最终目标的重新拆解 如果目标是: > **Rust 内核替换原有内核,绝大部分功能 CLI 化,AI 可以自行编辑** 那么最终至少要同时满足下面四件事。 ## 4.1 Rust 是唯一业务执行平面 要求: - Web、CLI、AI 都调用同一 Rust command/query/tool 内核 - 前端不再是业务规则主载体 ## 4.2 CLI 是一等公民,不是调试附属品 要求: - 大部分核心能力都能通过 CLI 完成 - 输出稳定 JSON - 支持脚本化、批处理和非交互执行 ## 4.3 AI 只是 CLI/Tool 的智能调度者 要求: - AI 不再依赖页面私有 bridge 才能编辑 - AI 调用的每一步都可审计、可回放、可限权 ## 4.4 Convex 继续是事实层,但不再直接暴露产品规则 要求: - Convex 主要承担持久化与事实保存 - 规则、协议、工具、索引、对象适配统一收进 Rust --- ## 5. 建议按优先级补齐的剩余里程碑 按最终目标倒推,接下来最应该补的不是 UI,而是下面六个里程碑。 ### M1. 建立真实 Rust 执行入口 - 初始化 `rust/bridge/` - 让 Web route 可以调用真实 Rust 运行时,而不是只在 TS 中模拟 Rust request - 先覆盖 `documents.create/get/save/title/options/stats/sidebar/search` ### M2. 并入 `mnote-cli` - 在主仓加入 CLI crate - 先定义稳定命令面和 JSON 输出协议 - 让页面、块、搜索、Sidebar 至少先能命令行操作 ### M3. 完成页面系统与块系统的 Rust 接管 - 页面创建、移动、删除、恢复、复制 - block 插入、替换、移动、删除 - 页面树与回收站 ### M4. 完成搜索/索引/派生视图 Rust 化 - 把搜索、snippet、排序、Sidebar 数据集聚合切到 Rust - 建立索引重建与校验命令 ### M5. 完成对象域 adapter - `adapter-mindmap` - `adapter-onlyoffice` - 后续再看媒体、表格等对象域 ### M6. 让 AI 与 CLI 共用同一 Tool 面 - AI 不再调用前端私有写入逻辑 - 改为直接使用 Rust tool protocol - 加入 dry-run、权限、审计、回放能力 --- ## 6. 一句话结论 当前不是“还差一点点就完成 Rust 内核替换”,而是: > **我们已经完成了 Rust 内核替换前的单仓收口、协议奠基和首批接缝,但距离“Rust 真正取代旧内核,并让 CLI 与 AI 成为一等执行入口”还差一整层执行面重构。** 最关键的剩余目标只有三条: - **把业务执行权从 TS route 真正移交给 Rust** - **把核心能力系统化地做成 CLI** - **让 AI 与 CLI 共用同一套 Rust tool 内核** 只要这三条没完成,就还不能说“原有内核已经被 Rust 替换”。