Files
mnote/design/old/08-legacy-rust-kernel/process/rust-kernel-missing-targets.md
T

389 lines
15 KiB
Markdown
Raw Normal View History

# [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 <tool-name> --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 替换”。