# 04. OnlyOffice Integration Boundary v0

更新时间：2026-04-11
适用范围：`/mnt/Data1T/mnote-rust`

---

## 1. 目标

本文件定义 `mnote-rust` 中 OnlyOffice 的正式边界。

它要解决的问题：

- OnlyOffice 在系统里到底是什么
- 可以接多深
- 哪些能力该放进插件/编辑器侧
- 哪些能力必须留在 Rust 内核
- 官方现状已经支持到哪一步，哪些不是猜想

---

## 2. 基于官方资料的确定事实

以下判断基于 ONLYOFFICE 官方文档与官方 API 文档，而不是推测。

### 2.1 ONLYOFFICE 已有官方 AI 插件能力

官方文档已明确：

- ONLYOFFICE 提供 **AI 插件**
- 可接入多种模型提供商，例如 **OpenAI、DeepSeek**
- 支持的能力包括但不限于：
  - 文本生成
  - 文本编辑
  - 总结
  - 自动创建宏
  - 面向编辑器的 AI 辅助操作

这说明：

> OnlyOffice 不是一个“完全不懂 AI 的富文档编辑器”，而是已经具备官方 AI 扩展体系。

### 2.2 ONLYOFFICE 已有插件系统

官方文档明确支持：

- 自定义插件
- 插件 UI 集成
- 插件调用外部服务
- 插件与编辑器文档内容交互
- 插件注册、安装、配置与运行

这说明后续你完全可以：

- 做自有 AI 插件
- 做面向 mnote-rust 的桥接插件
- 把系统命令面引入编辑器环境

### 2.3 Office JS API 已能做深度文档操作

官方 API 文档与样例表明，插件/脚本可进行：

- 获取文档对象 `Api.GetDocument()`
- 获取当前选区/范围
- 获取文本内容
- 插入文本
- 替换内容
- 创建段落
- 插入内容控件
- 处理表格、图片、表单等对象

这意味着：

> “AI 在 OnlyOffice 内获取当前选区并改写当前文档片段”这条能力链，官方已经支持。

### 2.4 ONLYOFFICE 支持自建部署与集成

官方文档明确把 ONLYOFFICE Docs 作为可集成到自有系统中的 office suite / Docs API / 插件宿主来提供。

结合你当前仓库里已有：

- Docker 自建 `onlyoffice/documentserver`
- callback / proxy / 外网地址改写
- 前端侧 OnlyOffice 工具桥

可以判断：

> 自建部署这条路是成立的，而且值得继续做。

---

## 3. 由这些事实推出的边界判断

## 3.1 能做深集成，但不能反客为主

结论：

- **OnlyOffice 适合深集成**
- **OnlyOffice 不适合做系统主内核**

原因不是它能力不够，而是职责不同。

OnlyOffice 擅长：

- 编辑 office 文档
- 处理复杂版式文档
- 承载编辑器插件与文档内 AI
- 管理编辑器态的操作命令

但它不擅长天然承担：

- 笔记块树真相
- 全局页面树真相
- 跨页面引用网络真相
- AI 全局任务编排
- 统一命令总线
- 全系统事件日志中心

## 3.2 在 mnote-rust 中的正式定位

OnlyOffice 应定位为：

> **Office Asset Editor Adapter + Office AI Subsystem**

而不是：

- 主页面编辑器内核
- 主数据模型
- 主命令入口
- 主任务系统

---

## 4. 正式职责划分

## 4.1 OnlyOffice 负责什么

### A. Office 资产编辑

负责编辑：

- `docx`
- `xlsx`
- `pptx`
- 部分 `pdf` 相关工作流

### B. 编辑器内局部 AI 能力

例如：

- 基于当前选区总结
- 重写/润色选区文本
- 插入生成内容
- 提取 action items
- 生成标题/批注/宏

### C. 编辑器上下文采集

例如：

- 当前文档 ID
- 当前资产版本 ID
- 当前选区
- 当前页/书签/活动对象
- 编辑器保存状态

### D. 将编辑结果回写主系统

例如：

- 保存为新 `AssetVersion`
- 产出书签/目录/片段锚点
- 触发提取文本与索引任务

## 4.2 Rust 内核负责什么

### A. 主事实层

- Workspace
- Page
- Block
- Asset
- AssetVersion
- Reference
- Task
- Event
- CommandLog

### B. 系统级命令与权限

- 谁可以编辑哪个资产
- 谁可以覆盖哪个版本
- 哪些操作需要确认
- 哪些任务需要后台执行

### C. 全局 AI 调度

- Agent Session
- Tool Registry
- CLI / MCP / Tool API
- 长任务编排
- 审计与回放

### D. 跨资产与跨页面知识组织

- 引用图
- 搜索索引
- 反链
- RAG
- 页面/块/资产统一导航

---

## 5. 最推荐的集成方式

## 5.1 推荐结构

```text
AI / CLI / Web / Desktop
          │
          ▼
Rust Command / Query / Tool API
          │
          ├─ Asset Service
          ├─ Agent Service
          ├─ Search / Reference Service
          └─ OnlyOffice Adapter Service
                     │
                     ├─ Docs API
                     ├─ Callback Handler
                     ├─ Plugin Bridge
                     └─ Selection / Save / Anchor Bridge
```

核心含义：

- 所有人和 AI 都先找 Rust 内核
- Rust 内核再协调 OnlyOffice
- OnlyOffice 不是上帝，只是一个能力域

## 5.2 不推荐结构

```text
AI -> OnlyOffice Plugin -> 直接改系统数据库/页面状态
```

或者：

```text
Web 页面逻辑 -> 直接控制 OnlyOffice -> 顺手写一部分业务真相
```

这种结构会再次回到胶水冲突。

---

## 6. 官方 AI 能力在新系统中的用法

## 6.1 可以直接利用的部分

可以利用官方插件/Office API 做：

- `office.get_selection`
- `office.get_document_text`
- `office.replace_selection`
- `office.insert_after_selection`
- `office.create_comment_from_ai`
- `office.generate_outline`
- `office.extract_action_items`

这些能力适合做成：

- 插件内命令
- 本地桥接命令
- Tool API 的 office 子域工具

## 6.2 不应依赖的部分

不应把以下能力外包给 OnlyOffice：

- 页面树管理
- 笔记块模型
- 全局知识链接
- Agent 全局工作记忆
- 系统统一任务编排
- 跨类型对象权限控制

---

## 7. 推荐的 Tool API 分工

## 7.1 Rust 内核对外工具

例如：

- `asset.open_in_office`
- `asset.list_versions`
- `asset.commit_new_version`
- `reference.resolve_anchor`
- `office.create_edit_session`
- `office.get_capabilities`

## 7.2 OnlyOffice 插件桥工具

例如：

- `office_plugin.get_selection`
- `office_plugin.get_document_text`
- `office_plugin.replace_selection`
- `office_plugin.insert_text`
- `office_plugin.get_outline`
- `office_plugin.list_bookmarks`

## 7.3 正确的调用链

```text
Agent / CLI
   -> note/asset/office Tool API
   -> Rust 内核
   -> OnlyOffice Adapter / Plugin Bridge
   -> Office JS API / Docs API
   -> 返回结构化结果
```

而不是：

```text
Agent 直接知道 OnlyOffice 内部细节并自行编排保存流程
```

---

## 8. 版本回写策略

这是边界里最关键的一块。

### 8.1 正确做法

OnlyOffice 编辑完成后：

- 生成新的 `AssetVersion`
- 更新 `assets.current_version_id`
- 写 `command_log` / `event`
- 触发：
  - 文本提取
  - 大纲提取
  - 锚点更新
  - 索引更新

### 8.2 不正确做法

- 只在编辑器里“看起来改了”但系统无版本记录
- callback 到了就直接覆盖文件，不产生日志
- 直接把插件临时状态写成业务真相

---

## 9. Anchor / 选区 / 书签策略

OnlyOffice 的一个真正价值，是它能提供相对更强的文档内部定位。

建议区分两类定位：

### 9.1 短期编辑上下文

例如：

- 当前选区
- 当前光标
- 当前页
- 当前激活对象

这类只作为：

- `SelectionAnchor`
- AgentSession 上下文
- Tool 输入

### 9.2 长期可引用锚点

例如：

- bookmark
- 标题路径
- 批注 id
- 内容控件 id
- 提取片段 hash

这类才适合进正式 `Reference.anchor`。

原则：

- 选区是瞬时上下文
- 书签/内容控件/稳定片段才是长期引用对象

---

## 10. 插件开发建议

## 10.1 建议做自有插件桥

理由：

- 官方插件体系已经成熟到可用
- 你需要的是“把 OnlyOffice 接进自己的命令系统”
- 自有桥插件比零散页面 hack 更稳

## 10.2 插件职责建议

插件只做：

- 获取编辑器上下文
- 执行局部编辑命令
- 请求 mnote-rust Tool API
- 接收结构化结果并落到文档
- 回传选择/书签/状态

插件不要做：

- 自己维护主业务状态
- 自己做全局权限判断
- 自己做全局任务调度
- 自己缓存长期知识图谱

---

## 11. 源码部署 / 自建部署的实际建议

## 11.1 结论

**值得继续推进自建部署。**

## 11.2 原因

- 网络、callback、鉴权策略可控
- 便于把插件、配置、回调、存储策略收归自己管理
- 更方便未来与桌面版、本地模式、离线模式衔接
- 减少外部部署差异导致的集成复杂度

## 11.3 但不建议的误区

- 不要把“自建部署”误解为“去重写编辑器引擎”
- 不要把“插件可改内容”误解为“OnlyOffice 可以替代整个笔记内核”
- 不要把“官方已有 AI 插件”误解为“你的 Agent 架构可以省掉”

---

## 12. 对 mnote-rust 的直接影响

这份结论会直接影响后续架构文档：

1. `office.*` 作为独立工具域存在
2. `AssetVersion` 必须是一等对象
3. `Reference.anchor` 必须支持 office bookmark / content control / text quote
4. `SelectionAnchor` 只做短期上下文，不升格为主事实
5. Agent 与 OnlyOffice 的关系必须经由 Rust Tool API，而不是页面硬连

---

## 13. 最小落地路线

### Phase A

- 自建 ONLYOFFICE Docs 持续使用
- 补正式 adapter 文档
- 补 `AssetVersion` / callback / save 流程

### Phase B

- 做自有桥插件
- 打通选区读取、文本替换、结构化命令执行
- 统一插件与系统鉴权

### Phase C

- 把 office 工具域接入统一 Tool API / CLI / Agent Runtime
- 让 AI 通过系统命令操作 Office 资产
- 建立锚点、版本、索引、审计闭环

### Phase D

- 再评估是否要更深度定制 UI / 插件体验
- 但不进入“重写 OnlyOffice 内核”路线

---

## 14. 一句话结论

基于 ONLYOFFICE 官方当前能力，最合理的路线不是回避它，也不是围绕它建系统，而是：

> **把 ONLYOFFICE 作为可自建、可插件化、可 AI 深接入的 Office 资产编辑子系统；同时把主事实层、命令层、日志层、任务层牢牢放在 Rust 内核里。**
