feat(kernel): finish phase3 bridge cutover and phase4 tree projection

- add generic mnote-web query transport and bridge routes for workspace/request/trace

- route sidebar compat traffic through mnote-web and tighten fixture fallback to dev/test

- unify sidebar/page tree/file tree/picker consumers on page_tree projection

- sync phase3/phase4 checklist, breakdown docs, and harness progress state
This commit is contained in:
lix-2026
2026-04-17 00:25:28 +08:00
parent b1d5d97142
commit ddf285b82d
27 changed files with 2650 additions and 340 deletions
+80 -37
View File
@@ -52,8 +52,8 @@
- `Kernel Phase 0``DONE`
- `Kernel Phase 1``DONE`
- `Kernel Phase 2``DONE`
- `Kernel Phase 3``PARTIAL`
- `Kernel Phase 4``PARTIAL`
- `Kernel Phase 3``DONE`
- `Kernel Phase 4``DONE`
- `Kernel Phase 5``PARTIAL`
- `Kernel Phase 6``PARTIAL`
- `Kernel Phase 7``PARTIAL`
@@ -62,7 +62,7 @@
一句话总结:
> **Kernel 基础层已经进入真实 Rust 主线,搜索/阅读页/AI 也开始带上 node、subtree、evidence 一类结构上下文,但 consumer 主路径仍未切完,旧前端壳然是主要执行面。**
> **Kernel 基础层与 Rust Web 承载层已经进入真实主线,树域 consumer 已统一到稳定 projection family;但旧前端壳然是主要执行面,下一步才是独立 Rust Web tree shell 重构。**
---
@@ -74,7 +74,7 @@
| --- | --- | --- |
| Rust 中存在统一的 kernel node / edge / projection / subtree 真相层 | `DONE` | `core-protocol` 已落地 |
| Rust 中存在统一的 kernel query / command 面 | `DONE` | `bridge-runtime` 已支持 kernel 查询与写协议 |
| Rust Web 能承接 kernel route | `PARTIAL` | `mnote-web`有 route,且已接到真实 sidebar dataset query plan,但仍是样板级接入 |
| Rust Web 能承接 kernel route | `DONE` | `mnote-web`具备通用 query transport、kernel/bridge/compat route、测试专用 fixture 边界,以及可切到真实 Sidebar 流量的兼容入口 |
| Sidebar / 页面树 / 文件树直接消费 kernel projection | `PARTIAL` | 前端主 Sidebar 已以 `kernelSidebarTree` 作为主树来源,但仍是重客户端壳,其他树域仍残留旧拼树 helper |
| 搜索直接消费 kernel-aware 检索结果 | `PARTIAL` | cron 已有 `kernel-aware refresh` 过渡链,搜索结果也已带 `nodeId` / `subtreeRootId` / `evidence`,但仍是 LightRAG 过渡口径,不是 kernel 真相层检索 |
| 阅读页直接消费 page subtree projection | `PARTIAL` | `DocumentReadView` 已直接消费 `pageSubtree`,但 projection 仍在前端读链内生成,不是 Rust/kernel 真相层输出 |
@@ -174,7 +174,7 @@
## 8. Kernel Phase 3Rust Web 接入 kernel,成为主承载层
**当前状态:`PARTIAL`**
**当前状态:`DONE`**
### 已落地
@@ -185,57 +185,99 @@
- `/api/kernel/subtree`
- `/api/kernel/edges`
- `/api/kernel/graph`
- sidebar kernel route 已通过 `sidebar.dataset.list` runtime plan + `execute_sidebar_dataset_query(...)` 读取数据集
-有路由测试,说明 route 不只是声明
- sidebar kernel route 已通过 `sidebar.dataset.list` runtime plan + 通用 Convex query transport 读取真实数据集
-新增真实 workspace / bridge 查询 route
- `/api/bridge/workspace`
- `/api/bridge/request`
- `/api/bridge/trace`
- 已新增 Next 兼容切流入口:
- `/api/compat/next/sidebar`
- `MNOTE_WEB_QUERY_FIXTURES_JSON` + `allow_dev_fixtures` 已把 fixture 收紧到测试/开发边界
- `/api/sidebar` 与服务端 Sidebar 首包在配置 `MNOTE_WEB_BASE_URL` 后,默认经 `mnote-web` 的 Sidebar compat route 取数
- `mnote-web` transport 已优先转发真实 `Authorization`,否则才退回开发态 admin/dev identity
- 已有 kernel / bridge 路由测试,说明 route 不只是声明
### 当前真实问题
### 已完成判定
- `mnote-web` 还不是主 Web 入口
- kernel route 主链已经不再直接依赖 `demo_sidebar_dataset(...)` helper,但仍保留 `MNOTE_WEB_KERNEL_SIDEBAR_FIXTURE_JSON` 环境变量 fallback
- 当前更真实的接缝主要集中在 sidebar dataset 这一条查询上,还没有形成更广的 workspace / storage / bridge 主链
- 这只能证明“kernel route 已进入 Rust Web”,不能证明“真实主链已切过去”
- Sidebar 这条 kernel 查询主链已不依赖生产态 fixture fallback
- `mnote-web` 已不再只有 Sidebar 单点 transport,而是能承接更广的 query / bridge 主链
- Next -> Rust Web 的第一条真实切流边界已经明确并可启用
### 下一阶段必须完成
### 当前保留边界
- 把 fixture fallback 收紧到测试/开发边界,避免环境变量 fixture 成为隐性主链
- 在 sidebar dataset 之外,再打通至少一条真实 workspace / storage / bridge 查询主链
- 至少让一条真实页面树或工作区查询主链通过 `mnote-web` 提供
- 明确 Next -> Rust Web 的真实流量边界
- `kernel.subtree.get` / `kernel.project_view` 仍主要建立在 `sidebar.dataset.list` 这一份页面树数据集之上
- 更广义的 node pool、reference edge、summary/index node 真相层,仍属于后续阶段
- `mnote-web` 还不是整个产品的唯一 Web 入口,这属于更后的双栈收缩问题
### 完成判定
- 至少一条不依赖 fixture fallback 的 kernel 查询主链在 `mnote-web` 上稳定运行
- 至少一条不依赖 fixture fallback 的 kernel 查询主链`mnote-web` 上稳定运行
- 至少一条真实 workspace / bridge 查询主链已通过 `mnote-web` 对外提供
- 至少一条真实前端流量已具备默认切到 `mnote-web` 的兼容边界
---
## 9. Kernel Phase 4Sidebar / 页面树 / 文件树切到 kernel projection
**当前状态:`PARTIAL`**
**当前状态:`DONE`**
### 本阶段边界
这个阶段只解决一件事:
> **把树域 consumer 全部统一到稳定的 kernel projection / tree protocol。**
这里刻意**不**包含:
- 独立 Rust Web tree shell
- `Leptos` / `Dioxus` / `Yew` 树域 UI 重写
- Sidebar 整体壳替换
这些属于 `Phase 4` 完成之后的独立大任务,即:
- [sidebar-pagetree-filetree-rust-web-rebuild-v1.md](/mnt/Data1T/mnote/design/sidebar-pagetree-filetree-rust-web-rebuild-v1.md)
### 已落地
- Sidebar 已有服务端首包
- Rust runtime 已能把 `sidebar.dataset.list` 转为统一 kernel subtree / projection 结果
- `sidebar-data.ts` 已生成 `kernel_sidebar_projection``kernelSidebarTree`
- 前端主 Sidebar 已以 `sidebarData.kernelSidebarTree` 作为初始化与同步的主树来源
- [x] Sidebar 已有服务端首包
- [x] Rust runtime 已能把 `sidebar.dataset.list` 转为统一 kernel subtree / projection 结果
- [x] `sidebar-data.ts` 已生成 `kernel_sidebar_projection``kernelSidebarTree`
- [x] 前端主 Sidebar 已以 `sidebarData.kernelSidebarTree` 作为初始化与同步的主树来源
- [x] 已新增统一 `page_tree` projection protocol
- `rowId`
- `nodeId`
- `parentNodeId`
- `projectionKind`
- `depth`
- `position`
- `capabilities`
- `resourceMeta`
- [x] `PrivateTree` 已改为直接消费 `page_tree` projection 可见行,而不是自行 flatten 嵌套树
- [x] 文件树已改为只消费 `page_tree projection + asset 映射``buildVisibleRows(...)` 收口为 projection -> visible rows
- [x] `move-embed picker` 空查询态已直接消费 `kernelSidebarTree -> page_tree projection`,不再调用 `buildDocumentTree(...)`
- [x] `SidebarInitialData` / `sidebar-data.ts` 已将 `kernelSidebarProjection``kernelSidebarTree` 收紧为主路径必备字段,不再在映射阶段对缺失 projection 做主路径 fallback
### 当前真实问题
### 本阶段完成后仍保留的问题
- 前端主 Sidebar 仍是超大客户端组件
- 主 Sidebar 已不再以 `DocumentRecord[] -> buildDocumentTree(...)` 作为主树入口,但 `move-embed picker``lib/documents.ts` 等兼容场景仍保留旧拼树 helper
- 页面树 / 文件树还没有完全统一到 kernel node / edge 真相层
- 页面树 / 文件树 / picker 虽已统一协议,但 Rust Web tree shell 仍未开始
- 文件树中的 `asset-folder` / `asset` / `index` 仍由前端 adapter 基于现有数据集补齐,不是 Rust 直接输出的 `file_tree projection`
- `buildDocumentTree(...)` 仍保留在兼容 helper 与旧单测中,但已退出树域主路径
- 现在可以进入树域 Rust Web 壳重写,但不能把这一步与本阶段混写成同一任务
### 下一阶段必须完成
### 下一阶段任务
- 把主 Sidebar 之外的 page treefile tree、embed/move picker 也统一改读 kernel projection
-展开、折叠、拖拽、hover 之类状态收口为纯 UI 层
- 收敛 `buildDocumentTree(...)` 一类旧树 helper 的残留 consumer
-布局层只保留轻 host,不再常驻重树组件
- 独立推进 [sidebar-pagetree-filetree-rust-web-rebuild-v1.md](/mnt/Data1T/mnote/design/sidebar-pagetree-filetree-rust-web-rebuild-v1.md)
-当前 `page_tree` / `file_tree` protocol 下沉成 Rust Web 独立 route / shell
- 继续缩小 Sidebar 超大客户端壳,只保留局部交互岛
-文件树中的更宽对象投影逐步由 Rust projection 直接输出
### 完成判定
- 主 Sidebar 以及相关树域已直接消费 kernel projection
- 页面树 / 文件树 / 嵌入移动器等不再通过旧对象数组拼树
- [x] 主 Sidebar 以及相关树域已直接消费 kernel projection
- [x] 页面树 / 文件树 / 嵌入移动器等不再通过旧对象数组拼树
- [x] tree row / projection protocol 已冻结,足以支撑下一步独立 Rust Web tree shell 重构
- [x] 当前 React/Next 树域可以继续作为 consumer 壳存在,但不再定义树结构真相
---
@@ -449,8 +491,9 @@
如果按当前真实代码继续推进,建议顺序是:
1. 完成 `Kernel Phase 3` 收尾
2. 先打通 `Kernel Phase 4`
1. 完成 `Kernel Phase 4`
2. 基于稳定 tree protocol,启动树域独立重构:
- [sidebar-pagetree-filetree-rust-web-rebuild-v1.md](/mnt/Data1T/mnote/design/sidebar-pagetree-filetree-rust-web-rebuild-v1.md)
3. 同步启动 `Kernel Phase 5`
4. 再推进 `Kernel Phase 6`
5. 再推进 `Kernel Phase 7`
@@ -458,7 +501,7 @@
原因很简单:
- 如果 `mnote-web` 仍是 demo route,后面的 projection consumer 都会继续挂在旧前端壳上
- 如果 Sidebar / 页面树 / 文件树还没切到统一 kernel projection,树域 Rust Web 重写会在协议未冻结前重复返工
- 如果 Sidebar / 页面树还没切到 kernel,工作区主导航就还没换真相层
- 如果知识刷新与 kernel-aware 检索不成立,AI 和 BookMindmap 路线也无法形成长期闭环
@@ -472,4 +515,4 @@
所以后续主线必须固定为:
> **先补齐 Rust Web 的真实 kernel 主链,再切 Sidebar / 页面树 / 文件树,再建立结构知识刷新与 kernel-aware 检索,之后才轮到 Mindmap、阅读页、AI、`BlockNote` 旧壳退场。**
> **先完成树域的 kernel projection 统一,再基于稳定协议做 Sidebar / 页面树 / 文件树的独立 Rust Web 重构;之后再并行推进结构知识刷新、Mindmap、阅读页、AI、`BlockNote` 旧壳退场。**