# [recycle] Mindmap 与 OnlyOffice 当前边界说明

> 更新时间：2026-04-14
>
> 主仓：`/mnt/Data1T/mnote`

## 1. Mindmap 当前主链

### 1.1 主组件与嵌入链路

- 主组件：`/mnt/Data1T/mnote/wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx`
- BlockNote 注册入口：`/mnt/Data1T/mnote/wolai-frontend/src/components/editor/schema.ts`
- 独立全屏页：`/mnt/Data1T/mnote/wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/page.tsx`

当前事实：

- `MindmapBlockView` 同时服务文档内嵌块与独立全屏页。
- 独立页通过 `editorStub` 复用同一组件，不额外复制第二套思维导图主壳。
- 文档内嵌与独立页共用同一套工具栏、侧栏、导航器、缩略图与上下文菜单子组件。

### 1.2 数据入口与 ops 边界

- 本地读写入口：`/mnt/Data1T/mnote/wolai-frontend/src/lib/mindmap/mindmapLocalStore.ts`
- 节点操作入口：`/mnt/Data1T/mnote/wolai-frontend/src/lib/mindmap/mindmapOps.ts`
- 页面 API：
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/route.ts`
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/[mindmapId]/route.ts`

当前拆分：

- 前端交互状态保留在 `MindmapBlock.tsx` 及其子组件内。
- 本体数据读写由 `mindmapLocalStore.ts` 提供本地文件落盘兼容接口。
- 节点增删改、引用、注释、链接等操作由 `mindmapOps.ts` 统一描述为 `MindmapOp`。
- 页面 API 当前通过 Convex `api.mindmaps.*` 承接 `get/put/restore/purge`，保留现有前端形态不变。
- 当前 Mindmap API 已补统一元信息口径：
  - `pageId = documentId`
  - `attachmentId = mindmapId`
  - `workspaceId` 统一来自页面归属工作区
  - `requestId/traceId` 统一从请求头透传或在路由侧兜底生成

### 1.3 后续 adapter 目标

后续若进入 Rust adapter，只抽象以下边界，不复制历史仓 UI：

- 节点树结构
- 节点引用 `refs`
- 节点操作日志 `MindmapOp`
- mindmap 与 page/block 的绑定关系

## 2. OnlyOffice 当前主链

### 2.1 页面与 API 边界

- 页面入口：
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/onlyoffice/page.tsx`
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/onlyoffice/OnlyOfficeClientPage.tsx`
- 页面侧面板：
  - `/mnt/Data1T/mnote/wolai-frontend/src/components/onlyoffice/OnlyOfficeAiAgentPanel.tsx`
- API 边界：
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/onlyoffice/sign/route.ts`
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/onlyoffice/proxy/route.ts`
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/onlyoffice/callback/route.ts`
  - `/mnt/Data1T/mnote/wolai-frontend/src/app/api/onlyoffice/forcesave/route.ts`

当前拆分：

- `page.tsx` 负责页面级早期 DOM 补丁与容器加载。
- `OnlyOfficeClientPage.tsx` 负责编辑器初始化、内部请求改写、代理地址适配与 callback URL 组装。
- `sign` 负责 JWT 签名。
- `proxy` 负责同源代理与回源 URL 安全限制。
- `callback` 负责保存回写存储。
- `forcesave` 负责触发文档服务器强制保存。

### 2.2 与正文和附件的关系

- Office 文件入口仍来自 `MediaBlock`：`/mnt/Data1T/mnote/wolai-frontend/src/components/editor/blocks/MediaBlock.tsx`
- 正文里只保留附件块与跳转入口，不在 BlockNote 内直接运行 OnlyOffice 编辑器。
- OnlyOffice 编辑器继续在独立 `/onlyoffice` 页面运行。
- 当前 OnlyOffice 已稳定使用：
  - `documentId` 作为页面业务标识
  - `assetId` 作为附件业务标识
  - 页面归属仍由文档/附件在 Convex 中的 `workspace_id` 与 `document_id` 决定

## 2.5 与 Mindmap 对齐后的共享标识口径

- 页面标识：
  - Mindmap 使用 `pageId/documentId`
  - OnlyOffice 使用 `documentId`
- 附件标识：
  - Mindmap 使用 `attachmentId/mindmapId`
  - OnlyOffice 使用 `assetId`
- 页面归属：
  - 两者都以 Convex 中的 `workspace_id + document_id` 作为最终归属真相
- 追踪字段：
  - Mindmap API 已返回 `requestId/traceId`
  - OnlyOffice 页面当前通过查询参数与调试上下文持有 `assetId/documentId/userId`，后续若接入统一 Rust adapter，继续沿用同一页面/附件口径

### 2.3 静态资源边界

- 根目录静态资源保留在 `/mnt/Data1T/mnote/src/components/onlyoffice/`
- 当前已确认存在：
  - `onlyoffice-web-apps/`
  - `onlyoffice-plugins/`
  - `onlyoffice-data/`

这些目录继续保留为运行所需静态资源、插件和数据目录，不做迁移式替换。

### 2.4 后续 adapter 目标

后续若进入 Rust adapter，只抽象以下边界：

- 对象解析与附件定位
- 签名生成
- callback 写回
- forcesave 触发
- 代理回源请求

## 3. 历史仓禁止误复制范围

以下历史仓路径只作为参考，不进入主仓主线：

- `/mnt/Data1T/mnote-rust/app/documents/[id]/mindmap/page.tsx`
- `/mnt/Data1T/mnote-rust/app/documents/[id]/office/page.tsx`
- `/mnt/Data1T/mnote-rust/components/sidebar/sidebar.tsx`
- `/mnt/Data1T/mnote-rust/app/page.tsx`
- `/mnt/Data1T/mnote-rust/app/onlyoffice/page.tsx`

约束：

- 不复制第二套对象页壳。
- 不复制第二套 sidebar 壳。
- `adapter-onlyoffice`、`adapter-mindmap` 继续作为后置实现项，而不是本阶段直接迁入主线。
