Skip to content

feat(docwall): .univer 产物文稿视图预览——内嵌 univer-office Viewer - #95

Merged
chumingjun merged 3 commits into
mainfrom
feat/univer-docwall-preview
Aug 29, 2026
Merged

chumingjun merged 3 commits into
mainfrom
feat/univer-docwall-preview

Conversation

@chumingjun

Copy link
Copy Markdown
Owner

背景

dsh-univer-office 集成调研(#无 issue,会话决策)确认:agent 节点可零代码使用 univer_* 工具产出 .univer 办公文档,但文稿视图对 .univer 只能下载不能预览。本 PR 打通最后一环:点开 .univer 产物直接内嵌 univer-office 自带 Viewer 预览/编辑。

方案

纯 URL/iframe 集成,零跨插件依赖(构建纯度门无感):

  • orchestrator:新增 GET /wf1/api/univer/resolve,按 run+node+file 把 .univer 产物解析为节点工作区原始文件的绝对路径(Viewer file key = 绝对路径 base64url)。已结束运行沿 artifactIndex.relativePath 精确定位,断点续跑沿 resumedFrom 祖先链回退,运行中按名解析。路径校验与 /wf1/api/artifact 同款(resolveInside + realpath),仅 .univer 后缀。
  • document-preview:注册 univer kind;新渲染器三步拼 Viewer URL——/univer-api/status 发现 Gateway(端口会漂移,现查不缓存)→ resolve 换绝对路径 → Gateway /uf/<key>/worktrees 选 worktree(draft 最新优先;实测不带 worktree 显示「空文件」,因 agent 产物在 draft 未合入 trunk)→ mode=embedded iframe。未装 univer-office 时 404 降级为提示 + 现有下载路径。

验证

  • 单测:orchestrator 全量 ✅;document-preview 10 例(新增 kind 注册 + 纯函数 fileKeyOf/pickWorktree/resolveEndpointOf)✅
  • build-web.sh 双构建 ✅
  • 真实 E2E:web profile 实机跑通——上轮工作流产出的「2026年8月杂项支出表.univer」经 resolve → gateway → worktree → iframe 全链路,官方 UI 页面内 iframe 完整渲染(SUM 公式、表头样式、货币格式、工作表标签全对,截图见下)
  • E2E 中发现并修复:快照产物是内容寻址名(无后缀)被 Gateway 拒收 → resolve 改为解析工作区原始 .univer

风险与边界

  • univer-office 0.2.x URL 协议无稳定性承诺 → 集中在一个 renderer + 纯函数文件,协议变了只改一处
  • Gateway 本机 loopback 无鉴权 → 与 univer-office 自身设计一致,dsh 拒听 0.0.0.0,远程场景不存在
  • 配套项(另做):skill-seed 提示词引导 agent 优先交付 .univer 源文件

document-preview 的 Univer Viewer 渲染器需要文件系统绝对路径作 file key
(univer-office Gateway 以绝对路径 base64url 定位 .univer 文件)。
不走内容寻址快照目录(无后缀 Gateway 拒收),统一解析节点工作区原始文件:
已结束运行沿 artifactIndex 的 relativePath 定位(断点续跑沿 resumedFrom 祖先链回退),
运行中按 file 名解析;路径校验(resolveInside + realpath)与 /wf1/api/artifact 同款,
仅 .univer 后缀,防止暴露任意工作区文件路径。
注册 univer kind(application/x-univer),新增 renderers/univer.jsx:
/univer-api/status 发现 Gateway(端口漂移所以现查不缓存)→
/wf1/api/univer/resolve 换绝对路径 → /uf/<key>/worktrees 选 worktree
(draft 最新优先)→ mode=embedded iframe 打开。纯 URL 集成不 import
univer-office 任何值,构建纯度门无感;未装插件时 404 降级为提示 + 现有下载路径。
纯函数(fileKeyOf/pickWorktree/resolveEndpointOf)抽到 univer-core.js 供
node --test 直测。实机 E2E:真实工作流产出的支出表 .univer 在 iframe 完整渲染
(公式/格式/合计全对)。
自审发现两处缺陷:
1. fileKeyOf 用了 Node Buffer——该代码跑在浏览器,Vite 不注入,运行时
   ReferenceError。改纯 Web API(TextEncoder + btoa),测试补中文名路径。
2. dsh 重启后 Gateway 是 stopped,/univer-api/status 不拉起,首次点击必报
   「Gateway 未运行」。改为先 POST /univer-api/gateway/start(幂等,运行中
   reused=true)再取地址,dsh 重启后首次点击即可用。
浏览器上下文实机复验:重启 dsh → Gateway stopped → renderer 同款代码链路
(resolve → start → worktrees → iframe)渲染支出表成功。
@chumingjun
chumingjun merged commit fef2b46 into main Aug 29, 2026
1 check passed
@chumingjun
chumingjun deleted the feat/univer-docwall-preview branch August 29, 2026 12:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant