DocFlow 可复用资产与实现缺口
区分库能力、本地扩展、有效接线、占位和仓库外职责。
本页整理自 2026-10-04 的 DocFlow 静态调查材料。原材料没有提供仓库 URL、分支或提交哈希;正文中的路径、行号、计数与依赖版本均指向该未锚定快照。本轮整理读取了归档报告,未取得原工作副本、启动产品或验证外部后端。下文的“复核”指原材料记载的复核,前端路径存在与运行可用性分别判断。
自研资产与库能力
作者自己写的(自研清单)
编辑器扩展层(src/extensions 29 个目录,其中 26 个自研/二次封装条目实际注册进 ExtensionKit,清点口径见 扩展注册与计数):
- 结构类:Document(block+)、Heading、HorizontalRule、TrailingNode、Selection、ClearMarksOnEnter;
- 代码:CodeBlock(CodeBlockLowlight 二次封装:语言别名输入规则、Mod-/ 按语言注释、Tab 缩进)、SelectOnlyCode;
- 图片三节点:ImageUpload(占位上传块 + useDropZone 视图)、ImageBlock(官方 Image.extend + width/align/alt 属性与命令)、TableImage(表格缩略);
- 交互:SlashCommand(suggestion 手搓菜单 + groups 配置)、DraggableBlock/DragHandler(ProseMirror 插件 + 策略工厂)、FontSize、Figcaption、Link(javascript: 协议过滤 + Markdown 链接语法)、Mention(inline 原子节点 + 好友建议)、EmojiSuggestion、Youtube(extend 官方 + 对话框命令)、AgentSuggestion(AI diff mark + accept/reject)、SearchAndReplace(decoration 高亮)、TableOfContentsNode、MathLiveExtension(MathLive 弹窗)、JsonPaste、MarkdownPaste;
- 写好未接线:Comment(mark + Mod-Shift-m)、Figure(figcaption 父容器)。
UI/交互组件:CustomBubbleMenu(floating-ui 手搓文本工具栏定位)、ContentItemMenu(+ 块、AI 续写、块操作弹出)、SearchPanel、HistoryPanel、FloatingToc、DocumentSidebar(文件树 dnd-kit、组件库 DnD、SettingsTab)、AgentEditPanel。
Hooks 层:useCollaboration(两阶段启动、awareness、stateless 权限)、useDocumentPermission、useDocumentEdit(Agent 提案落地 + markConflicts)、useEditorHistory、useSetupE2EE(LiveKit)、useAnalysis(埋点)。
服务/请求层:自研双请求封装 client.ts/server.ts(401 刷新 + 请求队列重放、streamPost + parseOpenAIStreamLine 的 OpenAI 兼容 SSE 手动解析、Sentry 埋点);snapshotService(Yjs 快照 IndexedDB 存取);21 个业务服务模块封装。
导入导出:两套手写 MDAST→ProseMirror Markdown 转换;export-doc(tiptap-extension-export-docx 的 fork 维护版,18 个文件);PDF/公众号导出编排。
workspace 包:@syncflow/transformer(封装 y-prosemirror 双向转换 + 两个 presets)、@syncflow/bilibili(B 站 embed 节点)、@syncflow/alert(双形态 Alert 节点)——注意这三者均未接入前端编辑器,transformer 为后端准备。
直接使用的官方/三方库
- Tiptap 官方:StarterKit(裁剪 12 项)、Highlight、Emoji(+gitHubEmojis)、Details 三件套、TaskList/TaskItem、FileHandler、UniqueID、TableOfContents、Mathematics(KaTeX + migrateMathStrings)、TableKit(@tiptap/extension-table 系)、@tiptap/extension-collaboration / collaboration-caret、@tiptap/extension-drag-handle-react(DragHandle)、@tiptap/react/menus 官方 BubbleMenu(Link/ImageBlock 用)、CodeBlockLowlight + lowlight;
- 协同:Yjs、@hocuspocus/provider(仅客户端)、y-indexeddb、y-prosemirror(transformer 底层);
- 定位:floating-ui(@floating-ui/dom);
- AI:无前端 SDK——纯自研 fetch 解析;@azure/core-sse(装而未用);
- 音视频:livekit-client 全家桶(E2EE worker、krisp、背景虚化为库能力,但对应 UI 未接线);
- 画布:ReactFlow;排序:dnd-kit(仅文件树);
- 导出:docx、jspdf、@zumer/snapdom、juice;Markdown 解析:micromark-extension-gfm + mdast-util-from-markdown/mdast-util-gfm;
- 公式:KaTeX(经 Mathematics)、MathLive;
- 监控:Sentry;其他:zod、tailwindcss、turbo、husky。
"装而未用"依赖清单(声明/安装但源码零引用)
| 依赖 | 声明位置 | 实际情况 |
|---|---|---|
| @hocuspocus/server ^3.1.1(实装 3.4.4) | package.json:52-53 | 零 import;服务端在外部 api.codecrack.cn |
| y-webrtc ^10.3.0 | package.json | 零 import,传输层只有 HocuspocusProvider |
| mammoth ^1.10.0(实装 1.11.0) | package.json:156 | 零引用;Word 导入不存在 |
| xlsx 0.18.5 | package.json:194 | 仅 file-type.ts:19 文件图标颜色映射 |
| tiptap-extension-export-docx 0.0.9 | package.json:189 | 零 import,实际用其 fork 源码 utils/export-doc/* |
| livekit-server-sdk 2.14.2 | package.json:206 | 零引用(属后端职责,后端不在仓库) |
| frappe-gantt | package.json:145 | 仅 styles/index.css:18 引入 CSS,无组件 |
| @syncflow/bilibili / @syncflow/alert | workspace 包 | 扩展未注册进 ExtensionKit(bilibili 仅 CSS 被引入) |
| @azure/core-sse 2.3.0 | package.json:44 | sseStream 实现(client.ts:902-1008)零调用方 |
| vitest/@vitest/*、@playwright/test | devDependencies | 无测试文件、无配置、无 test script |
| tinykeys | 依赖 | 仅注册在被注释掉的 LiveKit Debug 面板 |
| ofetch | 依赖 | 仅导出工具拉 blob,非主请求层 |
未实现与规划中(文档声明、依赖与源码范围)
以下逐条列出"文档或依赖宣称存在、但仓库代码没有"的项。标注来源与证据;反向情况(README 说没有但代码有)一并列出。
README 宣称、仓库无代码
| # | 宣称 | 来源 | 仓库现实 |
|---|---|---|---|
| 1 | NestJS 后端框架 | README:19,37-39 | grep '@nestjs' 全仓库零命中,无任何 NestJS 代码/依赖 |
| 2 | Prisma ORM 数据访问层 | README:39 | 无 schema.prisma、无 @prisma/client;lockfile 唯一 prisma 是 Sentry 传递依赖 |
| 3 | Hocuspocus 作为 Yjs WebSocket 服务端 | README:41-43 | 仅 package.json 依赖声明;源码只用客户端 provider;服务端在未开源的 api.codecrack.cn |
| 4 | Server Actions 前后端通信 | README:25 | 全仓库无一处 'use server';AGENTS.md:15 反而明文 no API routes |
| 5 | Prometheus 指标采集 + Grafana 面板 | README:45-51 | 无 prom-client 依赖、无指标导出代码、无编排 |
| 6 | ELK 日志栈(Elasticsearch/Kibana) | README:53-59 | 全仓库仅 README 提及(logstash 一词连 README 都未出现) |
| 7 | MinIO 对象存储 | README:61-63 | 无 MinIO SDK/配置;上传由外部 API 承接 |
| 8 | RabbitMQ 消息队列 | README:61-63 | 无 amqp 依赖与代码 |
| 9 | Monorepo 前后端代码分离 | README:115(自述"计划") | 现状只有前端,印证后端未出现在所查快照 |
| 10 | 编辑器内 AI 头脑风暴/内容润色/文档续写(配截图重点宣传) | README:15 | 服务层接口已写好(/api/v1/chat/brainstorm|polish|autocomplete、/api/v1/ai/continuations)但前端无任何调用组件,仅遗留 ai-brainstorm.css 与注释 |
| 11 | RAG 检索增强("续写时从文档中检索相关段落") | README:91 | 前端无 embedding/向量库/检索代码;知识库问答 API(useKnowledgeBase/knowledgeIds)无调用方;后端不在仓库无法核实 |
| 12 | "通过拦截器机制实现权限控制与数据持久化"(Hocuspocus onAuthenticate/onChange) | README | 服务端代码不在仓库,仅能从客户端 onStateless 'server:permission' 消息反推其存在 |
依赖暗示存在、源码无实现
| # | 功能 | 来源 | 现实(证据) |
|---|---|---|---|
| 13 | Word(.docx)导入 | 调研材料转述"主页 FAQ 宣称支持导入 Word";材料未提供该 FAQ 的 URL/路径/行号,本报告无法定位核对,该宣称本身未经证实 | 原材料记录的代码侧依据:mammoth 在 package.json:156 声明,全仓库源码零引用 |
| 14 | xlsx 导出 | package.json:194(xlsx 0.18.5) | 仅 utils/format/file-type.ts:19 用作文件图标颜色映射,无导入导出实现 |
| 15 | 甘特图 | package.json:145(frappe-gantt)+ styles/index.css:18 | 无任何 Gantt 组件/扩展(grep -ri gantt 全 src 仅命中该 CSS) |
| 16 | B 站视频块 | packages/bilibili(实现完整的 workspace 包) | ExtensionKit(extension-kit.ts:73-393)未注册;仅 styles/index.css:23 引入其样式、next.config.ts:13 transpilePackages——编辑器中不可用 |
| 17 | y-webrtc P2P 传输 | package.json 声明 ^10.3.0 | 全仓库零 import;实际传输层只有 @hocuspocus/provider 的 WebSocket |
| 18 | 用户自配 API Key 参与 AI 调用 | 设置页 UI(api-key-settings.tsx:53-58,83-98) | localStorage 键 docflow_api_keys 有写入、无读取:没有任何 AI 请求读取或携带该 key(grep 仅命中设置页与 storage 定义) |
代码已写好但未接线(死代码,对应图例 🚫)
| # | 功能 | 证据 |
|---|---|---|
| 19 | 评论(Comment mark + Mod-Shift-m) | extensions/Comment/Comment.ts:217 实现完整,未注册进 ExtensionKit,编辑器内不生效;与 HTTP 权限等级 COMMENT 的关系见 协同权限边界 注记 |
| 20 | 图注结构(Figure + Figcaption) | Figure.ts 实现含 figcaption 子节点,未注册;单注册的 Figcaption 缺父容器,图注功能未形成 |
| 21 | 侧栏组件库的视频/日历/AI/音频/标题/引用等块类型 | BlocksTab.tsx:94-189 展示 14 种块;DragHandler 策略表(DragHandler.ts:258-269)只覆盖 10 种;video/calendar 走默认段落策略;audio/ai 生成的节点类型 schema 不存在;点击插入处理器仍是 TODO console.log(BlocksTab.tsx:209-212) |
| 22 | setDraggableBlock 命令 | DraggableBlock 已注册,命令无任何调用方 |
| 23 | 深色模式开关 | 设置页"暗色主题"复选框(settings/page.tsx:73-82,无绑定)与 SettingsTab 主题下拉(SettingsTab.tsx:19-35,本地 state)均为装饰 UI;useDarkMode hook 零调用方 |
| 24 | LiveKit 聊天面板 / 设备菜单 / krisp 降噪 / 背景虚化 | <Chat/> 被注释(PageClientImpl.tsx:369);SettingsMenu/CameraSettings/MicrophoneSettings 未被任何页面渲染 |
| 25 | PreJoinScreen 组件 | app/rooms/[roomName]/PreJoinScreen.tsx 已写好,未被引用 |
| 26 | @azure/core-sse 的 sseStream 与 request.sse 通道 | 实现/定义存在,前者零调用,后者仅被三个无调用方的 AiApi 接口使用 |
| 27 | AiApi 孤儿接口 | StreamAgent(assistant-messages)、TextToImage(images)、GeneratePodcastAsync(podcasts/async)、CorrectText 类型——仅定义无消费 |
| 28 | tinykeys 调试面板 | Debug.tsx 注册 Shift+D,但 DebugMode 在 PageClientImpl.tsx:28,371 被注释 |
README 滞后于代码(反向:实际已有)
- LiveKit 音视频:README 列在"未来计划",实际 rooms 页面、livekit-client 依赖栈、/api/v1/livekit/quick-create 均已落地(services/rooms/index.ts:20 等)。
- Agent 编辑面板:README 自述"AI 聊天后续集成到编辑器侧边栏、未来实现 Agent 模式"——AgentEditPanel 已存在(属 README 已声明的进行中规划;聊天页仍独立)。
其他"零"项
- 测试体系为零:无 .spec/.test 文件、无 playwright.config、无 test script;vitest/@playwright/test 是空头 devDependencies。
- 国际化为零:无 i18n 依赖,UI 文案硬编码中文。
- 历史版本无服务端:快照纯本地 IndexedDB(每文档 50 份),换设备无法取得本机历史快照。
最后更新于