Files
mnote/rust/design/core/04-onlyoffice-integration-boundary-v0.md

492 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 内核里。**