621 lines
3.5 MiB
621 lines
3.5 MiB
{"p":".clawd-todos.json","s":1,"e":52,"m":1776672601718.6682,"t":"[\n {\n \"content\": \"审计真实 documents.content/documents.save/Convex content contract\",\n \"activeForm\": \"审计真实 documents.content/documents.save/Convex content contract\",\n \"status\": \"completed\"\n },\n {\n \"content\": \"把 LeptosTiptapEditorHost 从 query-string 初始化改成 bootstrap postMessage\",\n \"activeForm\": \"把 LeptosTiptapEditorHost 从 query-string 初始化改成 bootstrap postMessage\",\n \"status\": \"in_progress\"\n },\n {\n \"content\": \"让 8123 runtime 支持 bootstrap/reset 并避免跨文档复用错误状态\",\n \"activeForm\": \"让 8123 runtime 支持 bootstrap/reset 并避免跨文档复用错误状态\",\n \"status\": \"in_progress\"\n },\n {\n \"content\": \"补 iframe 高度同步\",\n \"activeForm\": \"补 iframe 高度同步\",\n \"status\": \"in_progress\"\n },\n {\n \"content\": \"建立 stored content 到 tiptap doc 的正式 adapter\",\n \"activeForm\": \"建立 stored content 到 tiptap doc 的正式 adapter\",\n \"status\": \"pending\"\n },\n {\n \"content\": \"建立 tiptap doc 到 stored content 的正式 adapter\",\n \"activeForm\": \"建立 tiptap doc 到 stored content 的正式 adapter\",\n \"status\": \"pending\"\n },\n {\n \"content\": \"接通真实保存与 persisted meta 回写\",\n \"activeForm\": \"接通真实保存与 persisted meta 回写\",\n \"status\": \"pending\"\n },\n {\n \"content\": \"固定 /documents/[id] 默认直接编辑态\",\n \"activeForm\": \"固定 /documents/[id] 默认直接编辑态\",\n \"status\": \"pending\"\n },\n {\n \"content\": \"固定 EditorHost 主路径为 tiptap 并把 BlockNote 退到 compat\",\n \"activeForm\": \"固定 EditorHost 主路径为 tiptap 并把 BlockNote 退到 compat\",\n \"status\": \"pending\"\n },\n {\n \"content\": \"补验收脚本并完成主编辑器人工验收准备\",\n \"activeForm\": \"补验收脚本并完成主编辑器人工验收准备\",\n \"status\": \"pending\"\n }\n]","v":"aL+jPPqznzxlDPG9jYnOuoIWjD3B/7i9a5tDPdOEGzsyXg68iv+uvUZxUr3LjDO89wEPPQPfgLwvea08oyjMu8siu7s3adi838+APHTPjzxNL7u7DYjcvA5cirxcE1C83KelPACWxjwAT0m8KjZrPSLFebsbGD+7WTYjPZAyMr0CKNE7FsaWPDqO1bznmoa9MKcIu+JBqbwpsF27fJIAPaKKMD2ktAi8i8CBPDqHib3XoXg8rs9YvfpOcj1YPwO9EcS7PZxRTr3mIe48x6OovIGEKLte71S8kQ6SPaJEUD2KlUa9gs1UveGFXTuheZa95P0wPd9i0zx9Eyg8l9GlPV8Wgj1mBpm896MRvbM2CD3Z8uQ6N2eLPS8/Nz2qRZA99SMqvQSzFzx0poi9Yk+mPHn2D72LTNO7ISgSu4F7sjxzNPy8NrOWvLPCIz1lBYi8jQQePVsdUbzBgJu8HFSXvHqwY72vgnY8cXf9O5iXoTyOcu+7XrEvvOG4pDyDbhE9Ex53vO5+Szw1goW9vs7hPEWbCTtdea28nu/sPFFFCD1BIXa8WDExPTKwsrxollM8aQ1AvQCi4rvRe0i8fIAmPSUASr0XfM08360ZPVo+Bz0yEYU92/WMPNqek71UGLE8H8DivOYFd7wUsrw8MOcKPYXBVD2fKjM8yItVvEbEery5gwc9hZa4vOVMRb2KHMW7a5LlvDo/0jxNuVq8W89HPXacgr25+t87jxMIveK1br0FjoU7FFrdvM7VWbwLnHk7zBGQPFq1Nb2h8UU8zmpMO6KDKbz5wSS6VVTOPJWB17wkKGy8qI4SvRZ1AD3TUbW8xNw0PFLCMb2U1UE8XiukPM7j+Tx7NwQ9cLJlvEKSGj2fHMc8BflpuldR/7xkF1I9QxyQO/EarjxpGl69Naduvd2DXbtPsdY8gsqIPPpMTrzXy3I9Ttj2O25qFj1SkHq9fDDxuyWTFL0V9Dk9hcZJOzEcgb2nv/O8ZMWcPD5KGr3/vse8nb5JvREP6LwOn3i8lLX1vGi6LT3G2307kIsKvorKTj2D0po8Qh8JPYs2SLw0Dge9WcGnO9bxUL2B6QS8RPcIva0i9zuriua7HEc0PRWzubxGRRs7ls2UPUCoy7xbbgw8dG8gvMK3qTtTlUc7Roq5PCkBvLyzwGK8Zbftuy8pAj3D5x68ijEfOvP377s8l9Y77IUHPan7W71sKKm7PspgPZ7bTr2i1ji8uNW9vXCt+zsQGr+7bPm0vLSanDwoFhi7zPkePQcwjju+0nA9IGQbPIix4TzT4OY80jC3vJBNvjxyUxY7pFSwu8h1Izwb/ce7bwUuPXw9Cj0zRhE80+VHPYqo3TyyZ0Q9PSpIvUMMgb3sp288ncDNO/gYG7y3nCU7RoobvYOD+Tz29a68yngTvaNyN712PnC9i5bEvBuHCj1PQEI97NCLPCCC1ruBbJE8/wRyPZjaXTyX2+c7swt7vJJm3zx2wiK9NXGwPNf+2rxBh+W8dE+WPGwX3Dz0fIq9ApEGPIHDR72DqHA8Tn0bPTSMXT10P+M8k/47vHzDFLx8toI9FTeSPO92bjzjGwW8zrPAOxAtAL2Cpgi8DnolPEULMz1UXak9YlUiPVE3Az2iOea8MZsKPaZrczyH/xY9o1RZvE/5rbwAuZ68zVmdvIzUWrrQw5g8uEscPZbykT1FABM90XsCPVRL6ryEFXq9bke3vEYsN7yylFm9YUAKPNaPeT2UQAm9BzMeO/VqYTyTHWA9aqG+PIVeJz0YrtA8+/K9ve6/K7x5gA47wGoNvI+fmTvNlpU8x6r5PMulbz38bQA8SjWdPZVxarxo2Ay8/SYVPcNSc72x/6W7NSlkPUvqPT0n3xG9lfxHOx47y7zc2Lq8rcFkvDaCkDzCmxq9ClcKPYRTFzwMJZw82q2CPbYq3TysDWo8W2eXu1/6K70OFDc9sl6CPHu9Hjv
|
||||
|
|
{"p":".gitignore","s":1,"e":60,"m":1778065346968.3103,"t":"node_modules/\n**/node_modules/\n.next/\n**/.next/\ndist/\n**/dist/\nbuild/\n**/build/\n.turbo/\npnpm-debug.log*\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n*.log\n.DS_Store\n.env\n.env.*\nenv-archive/\n.vscode/\n*.local\ntmp/\ntemp/\n**/.venv/\n.venv/\n**/__pycache__/\n__pycache__/\n# Convex 本机开发临时目录\n**/.convex-tmp/\n# 大模型文件,防止超出 LFS 配额\nservices/mineru/models/\n*.safetensors\n# ONLYOFFICE 挂载/同步目录(体积很大,禁止入库)\n/onlyoffice-web-apps/\n/onlyoffice-plugins/\n/onlyoffice-data/\n/onlyoffice-fonts/\n/onlyoffice-pg-data/\n# ONLYOFFICE 现已移至 src/components/onlyoffice 下,整目录忽略\n/src/components/onlyoffice/\n# 参考资料目录\ncankao/\n# services 整体忽略(包含本地模型与临时服务)\n/services/\n**/test/\npw-tests/**\npw-tests/ \nwolai-frontend/public/documents/\nwolai-frontend/public/documents/**\nartifacts/\nartifacts/**\ntmp\n\n# Rust 本地构建与调试产物\n/rust/target/\n/rust/spikes/**/target/\n\n# Harness 本地运行状态/调试产物\n/.harness-active\n/.harness-stop-counter\n/harness-tasks.json.bak","v":"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
|
|||
|
|
{"p":".gitignore","s":49,"e":80,"m":1778065346968.3103,"t":"artifacts/\nartifacts/**\ntmp\n\n# Rust 本地构建与调试产物\n/rust/target/\n/rust/spikes/**/target/\n\n# Harness 本地运行状态/调试产物\n/.harness-active\n/.harness-stop-counter\n/harness-tasks.json.bak\n\n# pnpm 本地缓存\n/.pnpm-store/\n.playwright-mcp\nrust/spikes/leptos-tiptap-spike/trunk-8123.err\nrust/spikes/leptos-tiptap-spike/trunk-8123.out\ndesign/05-editor-mainline/reference-code\n\n# 本地 Wolai 对标取证与截图产物\n/test-results/\n/wolai-*.png\n/wolai-*.md\n\n# 任务型浏览器 smoke 只作本地验收,不纳入项目运行面\n/scripts/task*-wolai-*.js\n/scripts/task*-rust-web-wolai-*-smoke.js\n\n# 下载的 Wolai 静态页面参考包,不作为可维护设计稿入库\ndesign/design/html/\nrecycle","v":"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
|
|||
|
|
{"p":".mcp.json","s":1,"e":34,"m":1767229535357.0203,"t":"{\n \"mcpServers\": {\n \"supabase_local\": {\n \"type\": \"stdio\",\n \"command\": \"cmd\",\n \"args\": [\"/c\", \"npx\", \"-y\", \"mcp-remote@latest\", \"http://127.0.0.1:18000/mcp\"],\n \"startup_timeout_ms\": 60000,\n \"env\": {\n \"PROGRAMFILES\": \"C:\\\\Program Files\",\n \"SystemRoot\": \"C:\\\\Windows\"\n }\n },\n \"chrome-devtools\": {\n \"type\": \"stdio\",\n \"command\": \"cmd\",\n \"args\": [\"/c\", \"npx\", \"-y\", \"chrome-devtools-mcp@latest\"],\n \"startup_timeout_ms\": 60000,\n \"env\": {\n \"PROGRAMFILES\": \"C:\\\\Program Files\",\n \"SystemRoot\": \"C:\\\\Windows\"\n }\n },\n \"context7\": {\n \"type\": \"stdio\",\n \"command\": \"cmd\",\n \"args\": [\"/c\", \"npx\", \"-y\", \"@upstash/context7-mcp\", \"--api-key\", \"ctx7sk-8beae3e8-38a0-497a-a44d-a67c05669318\"],\n \"startup_timeout_ms\": 40000,\n \"env\": {\n \"SystemRoot\": \"C:\\\\Windows\"\n }\n }\n }\n}","v":"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
|
|||
|
|
{"p":"AGENTS.md","s":55,"e":60,"m":1778973402636.99,"t":"- 页面 AI 编辑长期主路径为 `mnote.doc.markdown_edit`(search/replace 或 full_content,markdown 文本级),在线文档和本地 `.md` 文件共用。当前过渡实现为 `POST /api/page-ai/block-edit-workflow` fast-path(`local_rule` planner,Phase B 退役)。`mnote.block.*` 保留为结构性辅助(拖拽排序等)。两层操作模型已获 CLI Main(Lark Doc)参考实现验证。流式 apply + suggest/review(参考 BlockNote AI)作为 Phase C 设计冻结,当前不实施。复杂任务进入 `/api/hermes/client/runs`。模型不直接产出 unified diff 或 blockId 操作;最终定位、校验和写入由 Rust runtime 负责。\n- 需要架构判断时,优先参考:\n - `/mnt/Data1T/mnote/ARCHITECTURE.md`\n - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`\n - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md`\n - `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/process/2-tree-first-graph-convex-rust-long-term-architecture-v1.md`","v":"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
|
|||
|
|
{"p":"AGENTS.md","s":49,"e":108,"m":1778973402636.99,"t":"- 前端可以做展示、交互和局部适配,但不要新增第二套树真相、排序真相或 projection 契约。\n- `mnote-web` 的 `compat route` 可以承接过渡流量,但不要把新的长期业务逻辑继续堆进 compat。\n- 涉及文档页标题、页面设置、正文保存、页头与树一致性时,优先判断是否应收口到 `Page Aggregate`,不要继续在页面壳或 island 外侧拼第二份页面真相。\n- 涉及页面新建、重命名、移动、归档、恢复、嵌入时,优先沿 `tree.*` 正式命名推进;`documents.*` 只视为兼容层,不应继续扩写为长期命令面。\n- 涉及 AI 读取、定位或精确编辑页面块时,优先沿 `mnote.doc.*` / `mnote.block.*` Hermes tools 与 Rust `EditorCommand` 推进;`mnote.page.save` 只作为页面级兜底写入工具。\n- 涉及资源归属(哪个页面拥有哪个 mindmap/附件)、object identity 和资源生命周期时,优先沿 Resource Tree → File Tree projection → `tree.resource.*` 命令面推进;`tree.*` 是正式命令面,`documents.*` 只视为兼容层。\n- 页面 AI 编辑长期主路径为 `mnote.doc.markdown_edit`(search/replace 或 full_content,markdown 文本级),在线文档和本地 `.md` 文件共用。当前过渡实现为 `POST /api/page-ai/block-edit-workflow` fast-path(`local_rule` planner,Phase B 退役)。`mnote.block.*` 保留为结构性辅助(拖拽排序等)。两层操作模型已获 CLI Main(Lark Doc)参考实现验证。流式 apply + suggest/review(参考 BlockNote AI)作为 Phase C 设计冻结,当前不实施。复杂任务进入 `/api/hermes/client/runs`。模型不直接产出 unified diff 或 blockId 操作;最终定位、校验和写入由 Rust runtime 负责。\n- 需要架构判断时,优先参考:\n - `/mnt/Data1T/mnote/ARCHITECTURE.md`\n - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`\n - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md`\n - `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/process/2-tree-first-graph-convex-rust-long-term-architecture-v1.md`\n - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md`\n - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`\n - `/mnt/Data1T/mnote/design/07-ai/process/7-10-page-block-ai-tooling-execution-checklist-v1.md`\n - `/mnt/Data1T/mnote/design/04-tree-domain/done/4-6-tree-command-protocol-cutover-stage2-v1.md`\n - `/mnt/Data1T/mnote/design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md`\n - `/mnt/Data1T/mnote/design/10-review/process/08-kernel-architecture-next-priority-review-and-checklist.md`\n - `/mnt/Data1T/mnote/design/10-review/process/09-page-ai-fast-block-edit-runtime-review.md`\n - `/mnt/Data1T/mnote/design/07-ai/process/7-14-online-local-ai-markdown-editing-convergence-v1.md`\n - `/mnt/Data1T/mnote/design/04-tree-domain/done/4-24-resource-tree-filetree-pagetree-source-contract-checklist-v1.md`\n - `/mnt/Data1T/mnote/design/05-editor-mainline/done/5-12-main-editor-object-tab-resource-alignment-checklist-v1.md`\n\n## 设计稿目录规则\n\n- `design/01-*` 到 `design/07-*` 主线大类统一按 `process/` 与 `done/` 分层。\n- 主线设计稿在推进中时放到对应大类的 `process/`。\n- 主线设计稿在当前真实代码中已完成后,必须移动到对应大类的 `done/`。\n- 已被后续实现或更新稿明确覆盖、但又不属于 `done` 的旧主线稿,必须移动到 `design/old/` 并标记为 `[recycle]`,不要继续占用活跃 `process/`。\n- `design/old/` 下的历史废弃稿也统一按 `process/` 与 `done/` 分层,但标题继续标记 `[recycle]`。\n- `design/90-reference/` 只放参考资料,不参与 `process/done` 状态迁移。\n\n## Bugs 目录规则\n\n- `bugs/` 默认镜像 `design/` 的主线分类方式,按对应大类放置缺陷。\n- 每个大
|
|||
|
|
{"p":"ARCHITECTURE.md","s":1,"e":60,"m":1778945276797.0444,"t":"# MNOTE 当前架构梳理\n\n> 更新时间:2026-05-16\n>\n> **当前阶段:初步 MVP 已达成。** 3000 下文档页完整读写链路(标题、正文、页面设置、Page Aggregate)、Sidebar/File Tree/Page Tree 三层树模型、tree command(`tree.*` preferred)、tree realtime SSE(snapshot/delta/resync)、页面 AI 快速编辑(fast-path < 1s,当前 `local_rule` planner 为过渡实现,长期方向为 markdown 级编辑,见 7-14)均已通过真实浏览器 smoke 验证。剩余工作集中在单一真源收口、live cache 统一、AI 编辑路径从块级收敛到 markdown 文本层,而非继续证明架构可行性。\n\n本文只描述当前仓库中真实成立的主线结构,以及当前最优先的架构收口点。\n\n## 1. 当前主线结论\n\n当前仓库的主线不是:\n\n- `BlockNote-first`\n- `Mindmap-first`\n- “先拆掉 Convex 再谈 Rust”\n\n当前主线固定为:\n\n1. `tree-first graph kernel` 是长期对象真相层\n2. `Convex` 继续保留为当前自托管存储 / 实时 / 文件协作底座\n3. `mnote-web` 是当前 Rust Web 主执行面,负责 3000 gateway、server-first shell、query / command / projection / transport 与 realtime stream;Next App Router 已降为 legacy compat / island bundle source,不再是当前主入口\n4. 文档页默认主编辑器已切到页面内 `leptos-tiptap` island\n5. `BlockNote` 已退出文档页默认主路径,仅作为历史参考实现 / 对照材料保留\n6. 页面 AI 工具链已建立最小闭环:`POST /api/page-ai/block-edit-workflow` 提供快速编辑 route(当前 `local_rule` planner 为过渡态,长期方向为 `mnote.doc.markdown_edit` 文本级搜索替换,见 7-14);Hermes tools(`mnote.doc.*` / `mnote.block.*`)承担复杂任务编排\n\n一句话收口:\n\n> **Rust 持有语义主导权,Convex 保留底座,前端逐步从重壳转向消费稳定 projection 与少量交互 island。**\n\n补充口径:\n\n> **主 Web 执行面当前以 `mnote-web` 为 3000 owner;Next App Router 只保留为 legacy compat、交互 island bundle source 与显式 debug/迁移辅助边界。**\n>\n> **页面 AI 块编辑当前以 fast-path `local_rule` planner(`/api/page-ai/block-edit-workflow`)为简单操作首选;Hermes agent(`mnote.doc.*` / `mnote.block.*` tools)保留为复杂任务编排器。**\n\n## 2. 当前主线目录\n\n- `/mnt/Data1T/mnote/wolai-frontend/`\n 当前 React island 与 legacy compat 代码来源;Next.js App Router 不再作为 3000 主入口,只在显式 legacy/debug 迁移边界继续服务重交互运行态与对照链。\n- `/mnt/Data1T/mnote/rust/crates/core-protocol/`\n Kernel 类型、projection 协议、编辑器协议、树 / 图核心术语。\n- `/mnt/Data1T/mnote/rust/crates/bridge-runtime/`\n Kernel query / command、bridge transport、Tiptap <-> editor document 适配、命令解释层。\n- `/mnt/Data1T/mnote/rust/crates/mnote-web/`\n Rust Web route、kernel projection、documents/search/mindmap shell、Hermes bridge、stream transport、compat,以及显式开启时的 debug shell;它是当前主 Web gateway / shell / transport owner。\n- `/mnt/Data1T/mnote/wolai-frontend/convex/`\n 仍在使用的 Convex functions 与数据侧逻辑。\n- `/mnt/Data1T/mnote/infra/convex/`\n Convex 自托管部署与基础设施。\n- `/mnt/Data1T/mnote/wolai-backend/`\n 辅助后端与异步处理,不是当前页面主链。\n\n## 3. 当前页面运行结构\n\n### 3.1 根布局与 legacy island source\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/app/layout.tsx`\n\n职责:","v":"5hpGPIyOJz2fYke+2ChdvRklkDldoFO9rkbPPEcqcLs86ga9yb3ZvH3LQrwYsEI7Z+PoPJRoNzz0s6i8lFg+vSEd8bw4naE7ofK6vCrgYzwwT4s77fGsPHZF/7z+aIe9LF4/Pc7k2TwqSk89OvNevKUoxrw+Gsg7JsMHPq5O0LyWD0y9dyVnO4zvLr3uCYK9+qyfPHYEJTsPKhO8WuQ3up5KrT2q2Cw7MAl3PCTzEr3Dlck8aw+xvLArHj3bjwi8pfp0PfAPrr3zHpC8MD2KOhAFkryRsQq9a9P4PCJVQD1qiZe8FKiLu8RKFzzzu0y9HB8JPXJpoj0kO+I7rsdwPdYgVT1od3U8sYkavbtATj3A+vY7dWQYvZt1UT30XQC8n7/gPIe6x7zfJ0M8MBLpu
|
|||
|
|
{"p":"ARCHITECTURE.md","s":49,"e":108,"m":1778945276797.0444,"t":"Convex 自托管部署与基础设施。\n- `/mnt/Data1T/mnote/wolai-backend/`\n 辅助后端与异步处理,不是当前页面主链。\n\n## 3. 当前页面运行结构\n\n### 3.1 根布局与 legacy island source\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/app/layout.tsx`\n\n职责:\n\n- 作为 legacy Next / React island bundle source 的根布局\n- 保留 Convex / Query Provider 等前端 island 运行时依赖\n- 服务显式 legacy/debug/迁移边界\n\n注意:\n\n> **3000 当前根入口与文档页 shell 由 `mnote-web` 持有;Next App Router 不再是 3000 主入口或页面根布局事实源。**\n\n### 3.2 工作区壳与 Sidebar\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/app-layout-shell.tsx`\n- `/mnt/Data1T/mnote/wolai-frontend/src/hooks/use-sidebar-data.ts`\n- `/mnt/Data1T/mnote/wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.ts`\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/sidebar/use-preferred-sidebar-snapshot.ts`\n\n当前 Sidebar 不是单一路径,而是三层组合:\n\n1. 初始 SSR / route snapshot\n2. query / refetch snapshot\n3. tree stream live snapshot\n\n`PreferredSidebarSnapshotProvider` 负责在 query 与 tree stream 之间做 freshness 选择,再把同一份 preferred snapshot 同时给:\n\n- `Sidebar`\n- `Breadcrumb`\n- 文档页头标题消费链\n\n这说明当前工作区树链已经进入正式收口阶段:`3000` 主壳已直接接入 `/api/tree/events` 的 snapshot / delta / resync consumer,并有浏览器 smoke 验证;但 preferred snapshot、page subtree、filetree 与补偿链还没有完全统一成唯一 live cache。\n\n## 4. 文档页主链\n\n### 4.1 入口\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/lib/documents/page-aggregate-loader.ts`\n- `/mnt/Data1T/mnote/wolai-frontend/src/app/(app)/documents/[id]/page.tsx`\n\n当前文档页读取主链已经不再由页面入口手工拼若干独立字段,而是:\n\n1. 页面 SSR 入口通过 `page-aggregate-loader.ts` 直接请求 Rust `/api/page-aggregate/:id`\n2. `DocumentContent` 的内容重试补拉也直接请求同一条 `/api/page-aggregate/:id` 正式读链\n3. 读取主链不再回退到 TS builder;snapshot 不可用或不可信时直接显式失败\n4. Next `/api/documents/page` 已退场为明确 `410` 的 compat 边界,不再参与文档页运行时主路径\n\n对应聚合类型定义:\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/lib/documents/page-aggregate.ts`\n\n### 4.2 文档壳","v":"THCUO5fESj0nDTm+aoJHvQkuhzocXEy9T4c3vJwR6jphOVm9nmDYvGlNG71yq3s8M94yPR6UDTxWsTK9Y5CUvaCeGL2Hz7w8ec5YvJ9+67wtkY28mtXLOx16FLyNh569Y2onPY1FIj3/7vg824nYPEJa9LtmDRm8wZ3sPUEY5Lwi+2O88UqsPKF5R70fewq9XYv3vEHkhrwPkxe62rhbuyJ56TwSbkC85gWrPIRCY7zfyyo9s1IKvUuDRj0sju48VDR7Pd0Al72YX7W8YVyyvFHKFzx878W85J/vOXzDIjsEX9q7SEUCPefTrTzu15e8fQJmPNSApD1Pzu88OCRdPQZJpj0+DxI8BlI/ujxUHz1Z/1k9AsExvUxAjT2JRbI8guI4vA0Iq7xekLA84AslO/DGobxHXx+9YE4uvfGQNz2oMVs9v9EsvUKTtz3T1aE86g6LPYCWkLynMoi7oQPgvGMxsL3Kjr09PCa1OyCpVrvqOFI8A6t7O2fYpL3IzSK5kLq9unSdRDwQMzm9gTRKPA+Ycrs+LNi83zbCOyt+XT0ql188sPgRPQ6G0LyNepM8O5KmvL4yZ7sFZwS8HLPDPD6OOjm9Wqe8kqymPN8xAb23ApI9Ns3FuxR3Prwxrzk9Mg4xvQZ7D72iGvi8NUF5PW4lsz10oja7WI6JvTAn9jpU9EM9EXGcvaJ297skEw26VS2AvVENhzwUI0Q95547PcWvk72BVa27ld5iPInltTzonOG6euMAPN2FCzzJ/iY62M7fPCcd97w6Lz09RibqvGPtlb3OLjw804UwPF++5rzsq5C8WTq6PDs6LD1YERy9kw+zuzKHCDtlOAQ82lmIPb5LgTp2v7E8L3EFOwMMkj3j/fW61S41vbXSEDvo4gc9lYsRPS0LtDwcXk+97pjbu5ikTTsnyb67VUxDPcG/ZrxTCxk9Z7YRvTHr2Dy8lK28JYGZu53+PLx808a8DlIRPSXtnL2av6m8UyrIvI1cxLwl3Qo8ryZgvRo7VDw6TwW8Sn45vY4G2zzZIHO81x5DvXurCD3zT1o8habuPKGpL713eP68iF8KO7GmgjxaMAg9KeyEvUuKkDwv9N08CjB+POEl67y7GQg8sPq6PGHkFD13FUi8NB4JvdHjmDy1yqu7dW3Lu1xHOb00VLq8iqppORv50Tx75j29A2Z0OqQ4Ib1fFao9rC6rPMx0n7wGqSg7I2SOPG+DIr1EOyy9nvtwvSMxgTw2Abw8yq8MOqEROj2mjsS8YmnsPOBV6Lx6hzw9D82+PCVjdzwKnhS87kRfvFyILbzFp3u7wC7XO4mw4LtbpgU9oD5vPZF+BbxVpQA9SnKKPR4mvDxeH625ulYrvW6gkrsJSmo7t2ZjPAVuRb0YqsK7rKsevamgDj3L7ju9pq/EPO9KuLwUrzi8Zs9YvLvqpjyV4K08HolCvAC4Mb0Q8yw8GjB6PZdps7usZ2s7pRm6vApRwDwlp6G92IoXPczhNzxGuVq9y5Kyuw4sLTw+vni7EjQyPQQfH7wjBIi8sg
|
|||
|
|
{"p":"ARCHITECTURE.md","s":97,"e":156,"m":1778945276797.0444,"t":"当前文档页读取主链已经不再由页面入口手工拼若干独立字段,而是:\n\n1. 页面 SSR 入口通过 `page-aggregate-loader.ts` 直接请求 Rust `/api/page-aggregate/:id`\n2. `DocumentContent` 的内容重试补拉也直接请求同一条 `/api/page-aggregate/:id` 正式读链\n3. 读取主链不再回退到 TS builder;snapshot 不可用或不可信时直接显式失败\n4. Next `/api/documents/page` 已退场为明确 `410` 的 compat 边界,不再参与文档页运行时主路径\n\n对应聚合类型定义:\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/lib/documents/page-aggregate.ts`\n\n### 4.2 文档壳\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/document-shell.tsx`\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/document-content.tsx`\n\n`DocumentShell` 现在只是薄封装,文档页核心状态和交互壳集中在 `DocumentContent`。\n\n### 4.3 默认编辑器 host\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/editor-host-config.ts`\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/editor-host.tsx`\n\n当前默认 host 为:\n\n- `leptos_tiptap_island`\n\n文档页主路径已不再暴露显式 debug host 选择;历史 `iframe_debug` 宿主仅剩源码参考,不再参与页面 host 选择面。\n\n### 4.4 正式主编辑器\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/leptos-tiptap-island-editor-host.tsx`\n\n当前默认主编辑器已经是页面内 Leptos island,不再是 iframe bridge。\n\n它负责:\n\n- 加载 Leptos/WASM 编辑器本体\n- 接收初始化内容与 page options\n- 处理同页事件、命令、保存与状态同步\n\n### 4.5 BlockNote 的当前位置\n\n- `/mnt/Data1T/mnote/recycle/wolai-frontend/src/components/editor/blocknote-editor.tsx`\n\n`BlockNote` 当前仍保留回收副本,但其定位已变成:\n\n- 历史参考实现\n- 对照材料 / 调试素材\n\n而不是默认主编辑器方向。\n\n## 5. 当前编辑器与页面聚合关系\n\n当前文档页已经开始消费统一的前端侧 `PageAggregateProjection`,但仍不能说“页面域已完全统一成 Rust 单一真源”。\n\n当前真实状态是:\n\n- 读取主链已优先消费 Rust `mnote.page_aggregate.v1` snapshot\n- Page Aggregate 已输出 `blockDocument`、`blockProjectionVersion` 与 `projectionSource`","v":"VR5vvMpOcD0HWiS+BmmYvcBGBT3875W9Xq2su81NOT2vvjG9zIdBO4qrdrzHl0q9a7CaPGJTDTywa2K8KYogvZxkxryDK/i8FRQ5vVcftzzvfY28ToMVPXOOgLufv4697i5ZPfW5Xj1aFgq8SIhZPKjkN73owgq9lzPUPE7h6rzcObS7riVlOz5u5ryv36G8XvVtPKZCZrxSlyG8F80Tuzcj5TxNOwa902sbvJ5uKL0u8Bc9z8D1vPrGyDyLlAs8XYmQPWpSZ73ILsC8cBGLvP8zBT19dly94/lgPd19zjyWAvi8IpavOijlQT3nSwC8A3+RPMeOnz3lWbk8rGWRPSImhz2ay707OMQSPHbZhj0PqSU91nrlvP1QET3E+CE9MVr2O1M9A7wGwb08QIo/O+rXlrwmVT296Lv6vOlVpjyYBBM8lil5vIFUyD1OogQ8KpvGPTHon7ytcR29rbovvfa5lb3N8Xg9TnKbPGMCpzvJ0hu8I20QugbBsb3LEIY8tdosvM1HRDwykT+93GCAOxD2ebyx9vy8y6XUO/Xq5Dw+3mK8njbaPDVuFr2BPTK77ld5PBFImLxEq3W8Rh2FPU2iFzyFM1K8c8RePWKsFb1DI5g9RicWPaRHkrznb448cDNGu4dGCb2XFyK9i9Z7PcLKXT30ad47GzhzveZMCDwwQxQ9S0vjvTZja7sJxZS8KTQjvYEbrrtqZjc9joMBPb6Dub0Xu1G8xIydvL8jpjpN5Ze7eJG0vO8xW7wDLrG8pohbPEbNwLzHb+A8d1NCvTzsDb1MvMI83vdyvEomzLy2u568IH39PE2ZEz1ZU+m8N5T1O5Tp7LwklIC79k2BPfdgJjzVpZA7bbLTvJmZqz2zvJY8Ufn8vCKE5ryrp7c8xRuZPGyvzLvmfSG9d38cvMXUzruZOgk8AAF8O0hJxbwahAI9AvxAvSyI8DxpHsC82uHju0wTB7rPf0A89Wk+vPp/lb3LIIO9jqSIvNakDb0nWrw80LfnvJsMxrzQxnu8mYVEvEXvCD3wvBC8jBQpvcTAiD0vtwE8wBwePN20Bb1aSwS9fsZZPMn4fLz0bXW8/HeCvRMkUD2Wrge8N7/wPLupGr21tiE9oiAuPcdWxTzanHe8WwSZu6MSnzwN8Js81s+uvMf8Jr2F5gS9H9p7vOrPNT1Ynla9XWoQvCF4TbvIpEo9JjfwPGR8Gr0C+4U8nqAmvADZIL2c81q9FlSXvf2UHjwM8e48+pcnPMgLszvidkS9C3WSPQqx1by0NXg8S+8FuXL4AD3H5OW80j6DvQrNXLnCEYW8cj2NuSv207z4ggc85pikPcQZmjyJs5g8YJ5wPZUzgz07BUm7+a46vZmnuLvekTU8jDsDPcgBFr3ByvQ8Z6hRvXNa5DrgIha9UCDLvIPf/LzDrlS8IEMMvFac3jymWeQ84iblPGnsIr24yvu8hrddPdYLRLysM8k8AmaXu1LlBTxdT5W9Ng4zPNJ1eTy+Zw29hmC5u4WXGzz5SRw7nCL2PF4cFb1bJkO9FjeQPPS4bD011IE9KymKvBFpm7xp9GA9Y49vO5eZoTywzaA6smVGOxA5h7wvn/47g6XKPEnrcj0QIKI9IG9aPdv+c7wLwC+9YEN3PeBQiDwHHbA8lF8GvTpEc
|
|||
|
|
{"p":"ARCHITECTURE.md","s":145,"e":204,"m":1778945276797.0444,"t":"- 对照材料 / 调试素材\n\n而不是默认主编辑器方向。\n\n## 5. 当前编辑器与页面聚合关系\n\n当前文档页已经开始消费统一的前端侧 `PageAggregateProjection`,但仍不能说“页面域已完全统一成 Rust 单一真源”。\n\n当前真实状态是:\n\n- 读取主链已优先消费 Rust `mnote.page_aggregate.v1` snapshot\n- Page Aggregate 已输出 `blockDocument`、`blockProjectionVersion` 与 `projectionSource`\n- 标题链路已开始与工作区树 canonical snapshot 对齐\n- 正文默认由 `leptos-tiptap` island 编辑与保存\n- 页面设置已有一部分进入 island 运行时语义\n- `page_tree` / `pageSubtree` 已进入统一聚合入口\n- 页面/块 AI tools 已开始通过 Page Aggregate block projection 读取、定位、dry-run、替换、插入和受限移动块,并经 `page.body.save -> documents:updateContent` 持久化\n\n2026-05-16 更新:以下四项已通过真实 3000 browser smoke 验证(证据见 `tmp/page-aggregate-*` 目录):\n\n- 标题写入后 Page Aggregate、页头、Breadcrumb、Sidebar、Page Tree、File Tree 一致性(`task110`)\n- 正文保存后 `body.revision` / `conflictDetectionKey` / `blockDocument` 同步(`task-page-aggregate-body-sync-smoke`)\n- 页面设置写入后 `layout.pageOptions` 与 island runtime DOM 同步,刷新后不退回(`task-page-aggregate-options-sync-smoke` / `task-page-aggregate-refresh-persistence-smoke`)\n- Convex 不可用时返回 degraded error(503 + `x-error-code=convex_unavailable`),不返回伪 fixture(route 级负向测试)\n\n仍未完成的关键点是:\n\n1. Rust 侧已提供最小 `Page Aggregate` snapshot 和 block projection v1,但当前 block projection 仍主要从 `documents.content` / local markdown content 投影(`projectionSource=documents.content`),不是 EditorBlockDocument 原生落库完成态\n2. 标题 / 正文 / 页面设置虽已收口到 `page.*` family 并通过 smoke,但客户端仍保留 `PageAggregateClientState` reducer(混合 server snapshot / draft title / local content),页面域单一真源仍未完全闭环\n3. AI 块工具最小闭环已启动且 fast-path < 1s,但 `scope=selection`、`format=page_xml/text`、多块插入、复杂块移动矩阵和持久审阅 UI 仍未完成\n4. Sidebar 仍通过 preferred snapshot(initial / query / tree_stream)做 freshness 选择,tree realtime live cache 未统一\n\n因此当前正确表述应是:\n\n> **文档页读取主链已进入 Rust-first `page aggregate` 过渡态,标题/正文/页面设置 smoke 已通过,但页面域单一真源(ClientState → Rust snapshot)与 tree realtime live cache 仍未闭环。**\n\n## 6. 当前树域结构\n\n### 6.1 Kernel projection 与 route\n\n- `/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/kernel.rs`\n\n当前 Rust 已提供:\n\n- `sidebar_tree`\n- `page_tree`\n- `file_tree`\n- `subtree`\n- `edges`\n- `graph`\n\n这些 route 说明树域 projection family 已经在 Rust 侧具备清晰边界。\n\n### 6.2 树命令现状\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/lib/documents/tree-command-client.ts`\n- `/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/tree.rs`\n- `/mnt/Data1T/mnote/rust/crates/storage-convex-bridge/src/mapping.rs`\n\n当前树命令已经开始以 `tree.*` 为 preferred command name,例如:","v":"8pkaPXx7Mj3hwj++IduHvVLo9Tyn55K9Mp0TPaxgIz17siC9jnx1u3NPGrx7elG9FW/Ru29WDT3TfzS89idUvdH/AL0KFJm8DCIpvVmrQzyckey8WhuJPN9nYLrmWj+92K+FPKgRkz3kzOm6cijOO34ZPL1lOdq83WZ7PfPynbzY21+910EpvLGFDL3M3uW8HEn6PIQO3bz9Gfc8ivmXPMuLfD3mUbY7VTgKPOCojrz0u2G84T4Gu4u9CD09Gcw8mNTJPUA7ML3Nzxg7BH/6Owa4ET2kVyG9Vq97PfmxWj1gTw68ruRYPNg1jDwicti8lGSpOh3Vrj3UooY6r5dFPVkOWD3iI+A8b/dgvVgAGz0uohc8bf7cvEEYZz28xLY737VjPF2uhzzoXQG8A+wiPKpxIr2WSWi9cyVUvGor1jxuiUs713VqvRKLyD1MuJk8c7WFPds0XLs4pUG92o6OvFTdKb1CuwQ9OMw+PW9orDzQeSM8rTDSPJ2ja71ybu48y1e7vMYTujz97XG9W9LeO53bLr2WZDO9k8eKPFdBQT2puRI83rAZPd/yw7z65Q09JA0aPIXS3LxUW+m870m3PM9hCb1Smqu8vFwTPaQo9bydS6E9Hil+Oy+rsrxOpk49
|
|||
|
|
{"p":"ARCHITECTURE.md","s":193,"e":252,"m":1778945276797.0444,"t":"- `edges`\n- `graph`\n\n这些 route 说明树域 projection family 已经在 Rust 侧具备清晰边界。\n\n### 6.2 树命令现状\n\n- `/mnt/Data1T/mnote/wolai-frontend/src/lib/documents/tree-command-client.ts`\n- `/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/tree.rs`\n- `/mnt/Data1T/mnote/rust/crates/storage-convex-bridge/src/mapping.rs`\n\n当前树命令已经开始以 `tree.*` 为 preferred command name,例如:\n\n- `tree.node.create`\n- `tree.node.rename`\n- `tree.subtree.move`\n\n但兼容层仍广泛保留:\n\n- `documents.create`\n- `documents.title.update`\n- `documents.move`\n\n这说明 tree command cutover 已开始,但还没有完成。\n\n### 6.3 树 realtime 现状\n\n当前 Sidebar 已有:\n\n- query snapshot\n- tree stream\n- preferred snapshot 选择\n\n正式的 snapshot + delta 主链已经固定到 `mnote-web` 的 `/api/tree/events`,Next `/api/mnote-web/stream` 只保留 compat alias。\n\n因此当前正确表述应是:\n\n> **树域 realtime 主链由 Rust Web `/api/tree/events` 持有,前端只消费稳定 stream contract 与 projection。**\n\n补充:\n\n> **`3000` 主壳当前已不再通过 `/api/tree/projections/*` 额外维护第二条 runtime live fallback;snapshot / delta / resync 直接消费 `/api/tree/events` 载荷。**\n\n### 6.4 Resource Tree / File Tree / Page Tree 三层模型\n\n当前树域已建立三层语义(合同见 `design/04-tree-domain/done/4-24-*` 与 `design/05-editor-mainline/done/5-12-*`):\n\n- **Resource Tree**:长期 canonical 对象组织树,Rust kernel 持有语义。资源类型包括 page、mindmap、attachment、onlyoffice、code 等(`KernelObjectIdentity`、`KernelProjectionResourceKind` 已在 `core-protocol` 落地)。\n- **File Tree**:Resource Tree 的主组织投影。展示页面文件夹、`{title}.md`(非 `index.md`)、mindmap、附件等资源。文件树行消费 Rust `/api/tree/projections/file` 或等价 projection,不在前端临时拼装第二真相。\n- **Page Tree**:面向阅读/导航的快捷投影。只显示页面关系和导航语义,不拥有排序、父子、附件归属的最终真相。\n\n关键规则:\n\n- 文件树点击 mindmap 打开 mindmap object editor,不被 `{title}.md` 吞掉\n- `{title}.md` 只代表页面正文(Page Aggregate body),mindmap / OnlyOffice / 附件是不同 object model\n- 页面树不持有独立结构真相,只显示文档导航关系\n\n## 7. Mindmap 与 OnlyOffice\n\n### 7.1 Mindmap","v":"ZbiavCaqRj0ocC6+T4uHvTeAJDxAD7C977rstyKanTz9SLS8x/OYPM0JYDpPouM7Fam5PVGjaLw6aJy8BxKSvH1mI7xq+x68loTDvHiAXjxTZZy7tOoEvHSyNLp23k69nyFdPdU9mj38bOY7qpG0vB1N6LwnP547pOa1Pemf8TxNczu9YPesvAtirb0Fw2W9QP4OPH5a2rwnSEY9Voc/u5oUgT0aR8O8tn0OvTC73rwHp5c82qMuvZF2gz13ELE80XCoPQGZnL0Hi3c8lzvMujTvVj2t31q9LyE4PT6oRz2sUOw8A2TGPBdPIb1DFS69JEcPPR0sRz0hMYW7NUhoPfi1ujxO67a3QydSvOIrPT3Lstc8t0CyvPMgZz3WNqQ8MN4autBKALxqwsE8K7IVPPTNFrwupXC9L+RNvdPqZzzHhzc9LBb8vDZRyD26NaE7xGAUPdhZczxKzfo7L6VuPIx7hr3rWtQ8S2sAvICJDbymawW8bNZJPEWAnr2mSss7fOvbvCmTBjxx7F+9rsLhPHW2Cr2CR9i8RPd1PErfizxT+Mg81trWPCFD2bxRXUM8dKY6PPSyHTsnERy9/A2XPHxjULwGfk+9r/X4PNT4Arx+mqg9ocBtvTz4vzw6pO88vE2gu8aB8Ltb4q+8FUcqPTq9bz3NNsU8Ih5svW3ZnDr4Dg496KSLvchEdDzm+si8jVIWvX4HvDxruh87s3ZbPSNrybxISjO8/RNQPRPZhDxcQc87k6/bO89lIjwAdyO9jZkxPF64+rznJiM9mreTu1WDwr1Ncx89fozxu1aRxbz7tmu8n0acPN4I2jtVFj+9vHmdvHsz2rpDS8e80ap8PdjLh7wcRLQ8KJxzvHCCij2J3SO8BJOmvenBnjzvD+88CRgQPYMxBrzy8ZW983PIvPDCarzeJS48zSQAPV9LuzoVR5g7a9L5vB10wTvBV8a8PJJAPbV6TbzkunI9UnJLPKKBvL3eo8a8zDCGvHiPobxWefO7lhofvYlvEz0ktoW7zCBjvUP1xLvXrJA86zZavO6cGT0dmAW9lHbtPDifQb3F4UW9hv0TOcilZ7zkQV88lRCMvbdMjj2vn4i8OTY/PEXnG70aGdA8WjooPZV5vTpKgLM8jpgHvZsq+bsaa+m8+64ZOhF3Dr3U8hW9BAyhPH+LKTxtxfa80eWtvGxaQzyg9iA9KtSaPCaRB72QWrW7XGPTPIGsnrtUQoO8wZdTvXycXT2+HPG7UGSdPEVj6bvCM+K7cG85PTCVsjxuuMQ8WzozO6d2CT3N0sG8LWSqvLeHJb1bwKQ8yPvAPFrvbTxyug89iCtNPW8NDj3fgS483MtdvKfQnT2Cwr88xak1vUkEKb2JX887lkQDvEO0hrzS6jk4P0QovZIbKDzua4y9a7gDPYlmtryz1i29EDKkvDctLj1G7nE76wT8O1f5HLxoE6Y8KhlDPS3J3rzJIaU6+D7pO6cWMT0bVa69ZmPnPBT3FL1s0Y29PqgHvbEO3
|
|||
|
|
{"p":"ARCHITECTURE.md","s":241,"e":300,"m":1778945276797.0444,"t":"- **File Tree**:Resource Tree 的主组织投影。展示页面文件夹、`{title}.md`(非 `index.md`)、mindmap、附件等资源。文件树行消费 Rust `/api/tree/projections/file` 或等价 projection,不在前端临时拼装第二真相。\n- **Page Tree**:面向阅读/导航的快捷投影。只显示页面关系和导航语义,不拥有排序、父子、附件归属的最终真相。\n\n关键规则:\n\n- 文件树点击 mindmap 打开 mindmap object editor,不被 `{title}.md` 吞掉\n- `{title}.md` 只代表页面正文(Page Aggregate body),mindmap / OnlyOffice / 附件是不同 object model\n- 页面树不持有独立结构真相,只显示文档导航关系\n\n## 7. Mindmap 与 OnlyOffice\n\n### 7.1 Mindmap\n\n当前 Mindmap 不再是系统中心,而是:\n\n- `tree-first graph kernel` 的一种视图 / 编辑挂件\n\n它仍有:\n\n- 文档内嵌块形态\n- 独立页面形态\n\n但不应再被理解为对象真相层。\n\n### 7.2 OnlyOffice\n\nOnlyOffice 仍然是:\n\n- 独立页面型编辑器\n\n它不直接嵌入正文主编辑画布;正文中通常通过附件块跳转进入。\n\n## 8. 当前最优先的架构收口\n\n当前最优先的三条主线,不是继续大规模 UI 重写,而是:\n\n### 8.1 Page Aggregate\n\n目标:\n\n- 让标题 / 页面设置 / 正文 / page tree 统一成同一组 page aggregate projection 与 command family\n- 前端不在页面壳、island 外侧、Sidebar preferred snapshot 外再拼第二份页面真相\n\n当前进度(2026-05-16):\n\n- ✅ 文档页读取主链已 Rust-first,TS builder 退出 runtime,Next compat 返回 410\n- ✅ 标题单一真源 smoke 通过(`task110`):页头/Breadcrumb/Sidebar/Page Tree/File Tree 一致\n- ✅ 正文写入后 `body.revision` / `blockDocument` 同步 smoke 通过\n- ✅ 页面设置写入后 `pageOptions` 同步与刷新持久化 smoke 通过\n- ✅ Convex 不可用时返回 degraded error,不返回伪 fixture\n- ⬜ block projection 从 EditorBlockDocument 原生落库(当前仍从 `documents.content` 投影)\n- ⬜ 客户端 `PageAggregateClientState` reducer 退役,页面域完全以 Rust snapshot 为单一运行时真相\n\n对应设计稿:\n\n- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md`\n- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`\n- `/mnt/Data1T/mnote/design/05-editor-mainline/done/5-5-1-page-aggregate-contract-v1.md`\n\n### 8.2 Tree Command Cutover","v":"DgWTPJ/uQD1JzyG+sZuCvcuphryf9DK9ODxIO1ZQAj3d5Oe82DSavOjfHj1EMXi8mbSQPce8tbskzVQ8PAj2u4/Y6byOOgO9FnCDvUTTPj2TMhy9qD5cPGXvz7zm44S9WbIHPdZqqD2IE1a8UvyivPfQG72ZeZY8tXuUPX8JyjyjQxa92sS8vH1sbL0ifBC9nmtEPbathTxMPR49Y42ePIJJRz2Swg69fIsDve6U5rxOjx08uhL6ukslJT3s0/M8U4SzPTE3Zb1YkI08T7N0PLsj3z2aPtu8Oh+MPfIfJz3rujI8eZgcPMRQg7uz6C29HMGfPFV2kD0Lg1g8B2Q4PaPsiTxveom8qK7fvAR8CT25JF478c+ivArqgj20ZTg9V62DPFJrtDxRhe+728m1PP9Jx7wTvja9IxhGvXS8uzv4jvc8QZqsvGQ42j17u+c8yNuHPZaQtTz1qIu8yppLPLINX71q+do8Kg2dPM5HkjzB4Hu8EF2JPHU+lr3htzk8lB/BvBLE6TxUoOi8BIlRPV07WL2wDEe8nVepPJRnDj3ZWMA8bRplPbVXo7zvgo06PA8uvJZVebwMOaW8dMg5PcQ587y1nyC92kPJPAPNKb3edrk9A94yu+8ma7xSDSU9cEXMPDv2Jb1b+BY8AvckPQxm4Tw1axI8nCU8vXBM2LlQJzI8S46/vZMdazzMZom8XqF4PCrbSzz+HbM7SQKBPfnO1rwdwa67fDnHPB88rzxh2uO7NptYvIjvlTzlTou9iUtFvOeL9LxnAzw9p92jvG2ylb2z6NI8vZ7CuufVnLze9We8i/JAPH7IOj2DKE292ZTUvKfUpLum3uq8TNpXPIJQn7wnxGE9G4WUvLlbkz2bomE88sagvciT0rvbsiQ9Qp6zPIbn+7tAsaW9PUEYvHFgTjzi9kA88g39PCIiFbp5dAK7BYQ8vYXdKDztltG8UXNWPX+jEL0/YOA8yG1VvB+iob26NGe9KMjDvCJzTDxmNYu8gy8GOy3PGzyj8gU7bvpmvce7GbzVMsK77vdUu1x/Qj2d+i+8YffDPGh7Z71Mm9W8Ac6RPPixI73aIZI6vJWqvSdsoD1LDJS89RENPfUTPr0nZP26DAn/PCZT5TsIwOs8axdovIc06zuHgrK6cixavBtrZr0nGYS9jOxTPPo1orykB7y7shGwvKllXLq7TAM92ZGIO3MtHL0iAfs8P7mWPLJnOrx70fm8Bs1WvfIOTT3j7QQ9PNnQO2d7+LxJXFK8Rue9PWHLFD3pyXk9NA34vD+j+jzM/bm8ORpBvUZNK71+e4m8JnasPNCPGrxSphQ9sa5JPaCo1TyjbpE8ez2QPFdbkT2OaQc9C9ssvesBmr3Tl1I7/L1ovK2nrTuMMjs9UwSAvQtjIj2FtFK97kRbu+XluLzZTU694dhxvCAeEj2l/1w8b5aiPAHRij
|
|||
|
|
{"p":"ARCHITECTURE.md","s":289,"e":348,"m":1778945276797.0444,"t":"- ✅ 页面设置写入后 `pageOptions` 同步与刷新持久化 smoke 通过\n- ✅ Convex 不可用时返回 degraded error,不返回伪 fixture\n- ⬜ block projection 从 EditorBlockDocument 原生落库(当前仍从 `documents.content` 投影)\n- ⬜ 客户端 `PageAggregateClientState` reducer 退役,页面域完全以 Rust snapshot 为单一运行时真相\n\n对应设计稿:\n\n- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md`\n- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`\n- `/mnt/Data1T/mnote/design/05-editor-mainline/done/5-5-1-page-aggregate-contract-v1.md`\n\n### 8.2 Tree Command Cutover\n\n目标:\n\n- 让 `tree.*` 成为正式命令面\n- `documents.*` 降为兼容层\n\n对应设计稿:\n\n- `/mnt/Data1T/mnote/design/04-tree-domain/done/4-6-tree-command-protocol-cutover-stage2-v1.md`\n\n### 8.3 Tree Realtime Event Stream\n\n目标:\n\n- 让 snapshot + delta 正式成为树域实时主链\n- 减少当前 query/refetch/freshness 补偿链的长期存在\n\n对应设计稿:\n\n- `/mnt/Data1T/mnote/design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md`\n\n### 8.4 Page / Block AI Tooling\n\n目标:\n\n- 让 AI 读取、定位、dry-run 和精确块写入统一走 Rust Hermes tools、Page Aggregate block projection 与 `EditorCommand`\n- 把 `mnote.page.save` 固定为页面级兜底写入工具,不再代表长期精确块编辑主入口\n- 补齐 `scope=selection`、`format=page_xml/text`、多块插入、复杂块移动矩阵和持久审阅 UI\n\n当前进度(2026-05-16,按 7-14 v2 更新):\n\n- ✅ 页面 AI 快速编辑 route 已上线:`POST /api/page-ai/block-edit-workflow`\n- ✅ 简单编辑本地 planner(`local_rule`)已验证:788ms(过渡实现,将被 `markdown_edit` 替代)\n- ✅ Hermes tools(`mnote.doc.*` / `mnote.block.*`)已可读取和写入块投影\n- ✅ 参考实现已确认两层模型可行性:CLI Main(Lark Doc)`str_replace` 对应 `markdown_edit`,`block_*` 对应 `apply_block_ops`\n- ⬜ **Phase A(当前唯一活跃实施)**:`mnote.doc.markdown_edit` + `mnote.doc.fetch` 增强(search/replace + `format: \"markdown\"` + local source + Hermes 注册)\n- ⬜ **Phase B(下一阶段)**:退役 `direct_block_edit_operations`,`page_ai_workflow.rs` 改走 `markdown_edit`,system prompt 产 search/replace 对\n- ⬜ `scope=selection`、`format=page_xml/text` 稳定输出\n- ⬜ tool manifest annotations(`readonly` / `destructive` / `requiresApproval` 等)\n- ⬜ **Phase C(设计冻结,不实施)**:`StreamApplyController` + `ReviewSession` + `GhostTextOverlay`(流式 apply + suggest/review)\n- ⬜ stale revision / idempotency 重放保护(已有 revision 乐观锁覆盖,补端到端 smoke)\n\n关键原则(2026-05-16 补充,按 7-14 v2 更新):\n\n- **两层操作模型**(参考 CLI Main Lark Doc):文本级 `mnote.doc.markdown_edit`(str_replace)为主路径(覆盖 80%+ 场景),块级 `mnote.doc.apply_block_ops` 为结构性辅助(< 20%)\n- AI 编辑主路径应从块级降维到 markdown 文本层:新增 `mnote.doc.markdown_edit`(search/replace 或 full_content)作为主要 AI 写入工具\n- `mnote.block.*` 降级为结构性辅助(拖拽排序、精确块删除等),不删除\n- 当前 `local_rule` planner(`direct_block_edit_operations`)是过渡实现,应退役并替换为模型产出 search/replace 对","v":"FgU0PSHXYzxIszC+JvRyvSZP5DzpHkO9bbQLPQJLPz2I5ca7rtQqvMWdVjw9fqE4gC3PO6zbXTyYsAa8r+cLvdOhw7yi/yK94zBDve6lmjzARce7DBkAPV5ff7xRKaW9MNY1PYQlST2jZqQ7xG0BvABSCb0uctQ8NSyyPWkePDzbE7S9yBF/vPCqRr30Nse82X0xPaMe+jxmWCq7LmI1u21GZT3gPDQ6xj9RPIg68LzvPO46R6zHO6hlZD2Nmsw8pfWXPVlIlr1lCLc8YUdMvK/sQz2FTQm8dHubPZwFBD2HyxW8vkdUOngXAD0vh0C9SUklvAFgxD0/uIw8rQGKPY1UdjyZ9tc794KnvNm1zDwQth89uAUXvMpRSz05q0o9UDZ5PLIMJT0b9js8u/BJOzjPJ70Hseq7D5LdvE73xjxWFoW8RlDXvNju4T3nf1k9Vq2CPcLSdjviVdq8y
|
|||
|
|
{"p":"ARCHITECTURE.md","s":337,"e":396,"m":1778945276797.0444,"t":"- ⬜ **Phase B(下一阶段)**:退役 `direct_block_edit_operations`,`page_ai_workflow.rs` 改走 `markdown_edit`,system prompt 产 search/replace 对\n- ⬜ `scope=selection`、`format=page_xml/text` 稳定输出\n- ⬜ tool manifest annotations(`readonly` / `destructive` / `requiresApproval` 等)\n- ⬜ **Phase C(设计冻结,不实施)**:`StreamApplyController` + `ReviewSession` + `GhostTextOverlay`(流式 apply + suggest/review)\n- ⬜ stale revision / idempotency 重放保护(已有 revision 乐观锁覆盖,补端到端 smoke)\n\n关键原则(2026-05-16 补充,按 7-14 v2 更新):\n\n- **两层操作模型**(参考 CLI Main Lark Doc):文本级 `mnote.doc.markdown_edit`(str_replace)为主路径(覆盖 80%+ 场景),块级 `mnote.doc.apply_block_ops` 为结构性辅助(< 20%)\n- AI 编辑主路径应从块级降维到 markdown 文本层:新增 `mnote.doc.markdown_edit`(search/replace 或 full_content)作为主要 AI 写入工具\n- `mnote.block.*` 降级为结构性辅助(拖拽排序、精确块删除等),不删除\n- 当前 `local_rule` planner(`direct_block_edit_operations`)是过渡实现,应退役并替换为模型产出 search/replace 对\n- 在线 Convex 文档和本地 `.md` 文件共用同一条 markdown AI 写入路径(`resolve_source` → Convex | LocalFS)\n- Markdown 既是 AI 编辑格式也是人类可读格式,不需要 XML 中间层\n- 流式 apply + suggest/review(参考 BlockNote AI 的 `StreamToolExecutor` + `suggestChanges`)仅作为 Phase C 设计冻结,当前不实施\n\n对应设计稿:\n\n- `/mnt/Data1T/mnote/design/07-ai/process/7-10-page-block-ai-tooling-execution-checklist-v1.md`\n- `/mnt/Data1T/mnote/design/10-review/process/09-page-ai-fast-block-edit-runtime-review.md`\n- `/mnt/Data1T/mnote/design/07-ai/process/7-14-online-local-ai-markdown-editing-convergence-v1.md`\n\n### 8.5 定向 Bug Hunt 与质量基线\n\n目标:\n\n- 围绕已知架构风险做定向排查,而非泛泛\"找 bug\"\n\n优先关注:\n\n- Page Aggregate 回流不一致\n- AI 块写入 conflict / stale revision\n- File Tree `{title}.md` 与 page title 同步\n- tree stream resync / 双浏览器一致性\n- debug / compat / fallback 是否混入首屏主链\n\n已有 smoke 体系(`scripts/` 目录):\n\n- `task110-page-title-single-truth-smoke.js`:标题全链路一致性\n- `task-page-aggregate-body-sync-smoke.js`:正文写入后 Page Aggregate 同步\n- `task-page-aggregate-options-sync-smoke.js`:页面设置写入后同步\n- `task-page-aggregate-refresh-persistence-smoke.js`:刷新持久化\n- `task123-rust-web-tree-live-stream-consumer-smoke.js`:tree realtime 消费\n- `task169-mindmap-realtime-smoke.js`:mindmap 隔离与持久化\n- `task179-tree-create-delete-no-reload-smoke.js`:树操作无刷新\n\n## 9. 当前不该再用的旧口径\n\n下面这些说法现在都不准确:\n\n- “默认文档页仍然是 `BlockNoteEditor`”\n- “主编辑器还没切到页面内 Leptos island”\n- “当前最优先是继续证明 `leptos-tiptap` 能不能跑”\n- “当前最优先是先做树域 UI 重构”\n- “Rust Web 还只是实验,没有接真实页面链路”\n- “页面 AI 编辑必须经过 Hermes agent,没有快路径”\n\n当前真正的卡点已经从“能不能跑”变成:\n\n> **单一真源如何收口(Page Aggregate ClientState → Rust snapshot),projection / command / realtime 三条链如何从兼容态进入正式主链,以及 AI 块编辑如何从“能写”变成产品级可靠(selection、review、conflict、idempotency)。**","v":"MwdxOpf9HjyBfCC+9OR7vaCdWDyyIcC9F/fnPDf8iD2YNJE8/EaGu7n+rjsfV4M7eYSNPVzXgDwtWT28qhQxvSXgITxgmBu9V5NevYAvtDx4mOq7FIGcvEQ9F71KNoW91J5LPZOjND0yJMM70E9NvHFPg72k27g8Jlp+PT1n6Tzb9Vm9oPi5vFxzb73wZoK8R+U8PRhFjrsTiWi7vkcNPBryhj0a7S88HLDYO9EhPb04auk8Ckb7u4NbXz1QL9M89oPXPXC4p71EK2k81sxMvMfqDz3yJie9PuSJPXeOCz01Z9g7gZuGPFUcmLua6Wa9x/CDPDT3eT19S/A7QzAZPSjmUjsi8tM7cx/bO3XIwTy/
|
|||
|
|
{"p":"ARCHITECTURE.md","s":385,"e":397,"m":1778945276797.0444,"t":"下面这些说法现在都不准确:\n\n- “默认文档页仍然是 `BlockNoteEditor`”\n- “主编辑器还没切到页面内 Leptos island”\n- “当前最优先是继续证明 `leptos-tiptap` 能不能跑”\n- “当前最优先是先做树域 UI 重构”\n- “Rust Web 还只是实验,没有接真实页面链路”\n- “页面 AI 编辑必须经过 Hermes agent,没有快路径”\n\n当前真正的卡点已经从“能不能跑”变成:\n\n> **单一真源如何收口(Page Aggregate ClientState → Rust snapshot),projection / command / realtime 三条链如何从兼容态进入正式主链,以及 AI 块编辑如何从“能写”变成产品级可靠(selection、review、conflict、idempotency)。**","v":"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
|
|||
|
|
{"p":"DESIGN.md","s":1,"e":49,"m":1776084302914.8396,"t":"# Design System Inspired by Notion\n\n## 1. Visual Theme & Atmosphere\n\nNotion's website embodies the philosophy of the tool itself: a blank canvas that gets out of your way. The design system is built on warm neutrals rather than cold grays, creating a distinctly approachable minimalism that feels like quality paper rather than sterile glass. The page canvas is pure white (`#ffffff`) but the text isn't pure black -- it's a warm near-black (`rgba(0,0,0,0.95)`) that softens the reading experience imperceptibly. The warm gray scale (`#f6f5f4`, `#31302e`, `#615d59`, `#a39e98`) carries subtle yellow-brown undertones, giving the interface a tactile, almost analog warmth.\n\nThe custom NotionInter font (a modified Inter) is the backbone of the system. At display sizes (64px), it uses aggressive negative letter-spacing (-2.125px), creating headlines that feel compressed and precise. The weight range is broader than typical systems: 400 for body, 500 for UI elements, 600 for semi-bold labels, and 700 for display headings. OpenType features `\"lnum\"` (lining numerals) and `\"locl\"` (localized forms) are enabled on larger text, adding typographic sophistication that rewards close reading.\n\nWhat makes Notion's visual language distinctive is its border philosophy. Rather than heavy borders or shadows, Notion uses ultra-thin `1px solid rgba(0,0,0,0.1)` borders -- borders that exist as whispers, barely perceptible division lines that create structure without weight. The shadow system is equally restrained: multi-layer stacks with cumulative opacity never exceeding 0.05, creating depth that's felt rather than seen.\n\n**Key Characteristics:**\n- NotionInter (modified Inter) with negative letter-spacing at display sizes (-2.125px at 64px)\n- Warm neutral palette: grays carry yellow-brown undertones (`#f6f5f4` warm white, `#31302e` warm dark)\n- Near-black text via `rgba(0,0,0,0.95)` -- not pure black, creating micro-warmth\n- Ultra-thin borders: `1px solid rgba(0,0,0,0.1)` throughout -- whisper-weight division\n- Multi-layer shadow stacks with sub-0.05 opacity for barely-there depth\n- Notion Blue (`#0075de`) as the singular accent color for CTAs and interactive elements\n- Pill badges (9999px radius) with tinted blue backgrounds for status indicators\n- 8px base spacing unit with an organic, non-rigid scale\n\n## 2. Color Palette & Roles\n\n### Primary\n- **Notion Black** (`rgba(0,0,0,0.95)` / `#000000f2`): Primary text, headings, body copy. The 95% opacity softens pure black without sacrificing readability.\n- **Pure White** (`#ffffff`): Page background, card surfaces, button text on blue.\n- **Notion Blue** (`#0075de`): Primary CTA, link color, interactive accent -- the only saturated color in the core UI chrome.\n\n### Brand Secondary\n- **Deep Navy** (`#213183`): Secondary brand color, used sparingly for emphasis and dark feature sections.\n- **Active Blue** (`#005bab`): Button active/pressed state -- darker variant of Notion Blue.\n\n### Warm Neutral Scale\n- **Warm White** (`#f6f5f4`): Background surface tint, section alternation, subtle card fill. The yellow undertone is key.\n- **Warm Dark** (`#31302e`): Dark surface background, dark section text. Warmer than standard grays.\n- **Warm Gray 500** (`#615d59`): Secondary text, descriptions, muted labels.\n- **Warm Gray 300** (`#a39e98`): Placeholder text, disabled states, caption text.\n\n### Semantic Accent Colors\n- **Teal** (`#2a9d99`): Success states, positive indicators.\n- **Green** (`#1aae39`): Confirmation, completion badges.\n- **Orange** (`#dd5b00`): Warning states, attention indicators.\n- **Pink** (`#ff64c8`): Decorative accent, feature highlights.\n- **Purple** (`#391c57`): Premium features, deep accents.\n- **Brown** (`#523410`): Earthy accent, warm feature sections.\n\n### Interactive\n- **Link Blue** (`#0075de`): Primary link color with underline-on-hover.\n- **Link Light Blue** (`#62aef0`): Lighter link variant for dark backgrounds.\n- **Focus Blue** (`#097fe8`): Focus ring on interactive elements.","
|
|||
|
|
{"p":"DESIGN.md","s":50,"e":60,"m":1776084302914.8396,"t":"- **Badge Blue Bg** (`#f2f9ff`): Pill badge background, tinted blue surface.\n- **Badge Blue Text** (`#097fe8`): Pill badge text, darker blue for readability.\n\n### Shadows & Depth\n- **Card Shadow** (`rgba(0,0,0,0.04) 0px 4px 18px, rgba(0,0,0,0.027) 0px 2.025px 7.84688px, rgba(0,0,0,0.02) 0px 0.8px 2.925px, rgba(0,0,0,0.01) 0px 0.175px 1.04062px`): Multi-layer card elevation.\n- **Deep Shadow** (`rgba(0,0,0,0.01) 0px 1px 3px, rgba(0,0,0,0.02) 0px 3px 7px, rgba(0,0,0,0.02) 0px 7px 15px, rgba(0,0,0,0.04) 0px 14px 28px, rgba(0,0,0,0.05) 0px 23px 52px`): Five-layer deep elevation for modals and featured content.\n- **Whisper Border** (`1px solid rgba(0,0,0,0.1)`): Standard division border -- cards, dividers, sections.\n\n## 3. Typography Rules\n\n### Font Family","v":"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
|
|||
|
|
{"p":"DESIGN.md","s":49,"e":101,"m":1776084302914.8396,"t":"- **Focus Blue** (`#097fe8`): Focus ring on interactive elements.\n- **Badge Blue Bg** (`#f2f9ff`): Pill badge background, tinted blue surface.\n- **Badge Blue Text** (`#097fe8`): Pill badge text, darker blue for readability.\n\n### Shadows & Depth\n- **Card Shadow** (`rgba(0,0,0,0.04) 0px 4px 18px, rgba(0,0,0,0.027) 0px 2.025px 7.84688px, rgba(0,0,0,0.02) 0px 0.8px 2.925px, rgba(0,0,0,0.01) 0px 0.175px 1.04062px`): Multi-layer card elevation.\n- **Deep Shadow** (`rgba(0,0,0,0.01) 0px 1px 3px, rgba(0,0,0,0.02) 0px 3px 7px, rgba(0,0,0,0.02) 0px 7px 15px, rgba(0,0,0,0.04) 0px 14px 28px, rgba(0,0,0,0.05) 0px 23px 52px`): Five-layer deep elevation for modals and featured content.\n- **Whisper Border** (`1px solid rgba(0,0,0,0.1)`): Standard division border -- cards, dividers, sections.\n\n## 3. Typography Rules\n\n### Font Family\n- **Primary**: `NotionInter`, with fallbacks: `Inter, -apple-system, system-ui, Segoe UI, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol`\n- **OpenType Features**: `\"lnum\"` (lining numerals) and `\"locl\"` (localized forms) enabled on display and heading text.\n\n### Hierarchy\n\n| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |\n|------|------|------|--------|-------------|----------------|-------|\n| Display Hero | NotionInter | 64px (4.00rem) | 700 | 1.00 (tight) | -2.125px | Maximum compression, billboard headlines |\n| Display Secondary | NotionInter | 54px (3.38rem) | 700 | 1.04 (tight) | -1.875px | Secondary hero, feature headlines |\n| Section Heading | NotionInter | 48px (3.00rem) | 700 | 1.00 (tight) | -1.5px | Feature section titles, with `\"lnum\"` |\n| Sub-heading Large | NotionInter | 40px (2.50rem) | 700 | 1.50 | normal | Card headings, feature sub-sections |\n| Sub-heading | NotionInter | 26px (1.63rem) | 700 | 1.23 (tight) | -0.625px | Section sub-titles, content headers |\n| Card Title | NotionInter | 22px (1.38rem) | 700 | 1.27 (tight) | -0.25px | Feature cards, list titles |\n| Body Large | NotionInter | 20px (1.25rem) | 600 | 1.40 | -0.125px | Introductions, feature descriptions |\n| Body | NotionInter | 16px (1.00rem) | 400 | 1.50 | normal | Standard reading text |\n| Body Medium | NotionInter | 16px (1.00rem) | 500 | 1.50 | normal | Navigation, emphasized UI text |\n| Body Semibold | NotionInter | 16px (1.00rem) | 600 | 1.50 | normal | Strong labels, active states |\n| Body Bold | NotionInter | 16px (1.00rem) | 700 | 1.50 | normal | Headlines at body size |\n| Nav / Button | NotionInter | 15px (0.94rem) | 600 | 1.33 | normal | Navigation links, button text |\n| Caption | NotionInter | 14px (0.88rem) | 500 | 1.43 | normal | Metadata, secondary labels |\n| Caption Light | NotionInter | 14px (0.88rem) | 400 | 1.43 | normal | Body captions, descriptions |\n| Badge | NotionInter | 12px (0.75rem) | 600 | 1.33 | 0.125px | Pill badges, tags, status labels |\n| Micro Label | NotionInter | 12px (0.75rem) | 400 | 1.33 | 0.125px | Small metadata, timestamps |\n\n### Principles\n- **Compression at scale**: NotionInter at display sizes uses -2.125px letter-spacing at 64px, progressively relaxing to -0.625px at 26px and normal at 16px. The compression creates density at headlines while maintaining readability at body sizes.\n- **Four-weight system**: 400 (body/reading), 500 (UI/interactive), 600 (emphasis/navigation), 700 (headings/display). The broader weight range compared to most systems allows nuanced hierarchy.\n- **Warm scaling**: Line height tightens as size increases -- 1.50 at body (16px), 1.23-1.27 at sub-headings, 1.00-1.04 at display. This creates denser, more impactful headlines.\n- **Badge micro-tracking**: The 12px badge text uses positive letter-spacing (0.125px) -- the only positive tracking in the system, creating wider, more legible small text.\n\n## 4. Component Stylings\n\n### Buttons\n\n**Primary Blue**\n- Background: `#0075de` (Notion Blue)\n- Text: `#ffffff`\n- Padding: 8px 16px\n- Radius: 4px (subtle)\n- Border: `1px solid transparent`\n- Hover: background darke
|
|||
|
|
{"p":"DESIGN.md","s":102,"e":108,"m":1776084302914.8396,"t":"- Active: scale(0.9) transform\n- Focus: `2px solid` focus outline, `var(--shadow-level-200)` shadow\n- Use: Primary CTA (\"Get Notion free\", \"Try it\")\n\n**Secondary / Tertiary**\n- Background: `rgba(0,0,0,0.05)` (translucent warm gray)\n- Text: `#000000` (near-black)","v":"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
|
|||
|
|
{"p":"DESIGN.md","s":145,"e":204,"m":1776084302914.8396,"t":"### Navigation\n- Clean horizontal nav on white, not sticky\n- Brand logo left-aligned (33x34px icon + wordmark)\n- Links: NotionInter 15px weight 500-600, near-black text\n- Hover: color shift to `var(--color-link-primary-text-hover)`\n- CTA: blue pill button (\"Get Notion free\") right-aligned\n- Mobile: hamburger menu collapse\n- Product dropdowns with multi-level categorized menus\n\n### Image Treatment\n- Product screenshots with `1px solid rgba(0,0,0,0.1)` border\n- Top-rounded images: `12px 12px 0px 0px` radius\n- Dashboard/workspace preview screenshots dominate feature sections\n- Warm gradient backgrounds behind hero illustrations (decorative character illustrations)\n\n### Distinctive Components\n\n**Feature Cards with Illustrations**\n- Large illustrative headers (The Great Wave, product UI screenshots)\n- 12px radius card with whisper border\n- Title at 22px weight 700, description at 16px weight 400\n- Warm white (`#f6f5f4`) background variant for alternating sections\n\n**Trust Bar / Logo Grid**\n- Company logos (trusted teams section) in their brand colors\n- Horizontal scroll or grid layout with team counts\n- Metric display: large number + description pattern\n\n**Metric Cards**\n- Large number display (e.g., \"$4,200 ROI\")\n- NotionInter 40px+ weight 700 for the metric\n- Description below in warm gray body text\n- Whisper-bordered card container\n\n## 5. Layout Principles\n\n### Spacing System\n- Base unit: 8px\n- Scale: 2px, 3px, 4px, 5px, 6px, 7px, 8px, 11px, 12px, 14px, 16px, 24px, 32px\n- Non-rigid organic scale with fractional values (5.6px, 6.4px) for micro-adjustments\n\n### Grid & Container\n- Max content width: approximately 1200px\n- Hero: centered single-column with generous top padding (80-120px)\n- Feature sections: 2-3 column grids for cards\n- Full-width warm white (`#f6f5f4`) section backgrounds for alternation\n- Code/dashboard screenshots as contained with whisper border\n\n### Whitespace Philosophy\n- **Generous vertical rhythm**: 64-120px between major sections. Notion lets content breathe with vast vertical padding.\n- **Warm alternation**: White sections alternate with warm white (`#f6f5f4`) sections, creating gentle visual rhythm without harsh color breaks.\n- **Content-first density**: Body text blocks are compact (line-height 1.50) but surrounded by ample margin, creating islands of readable content in a sea of white space.\n\n### Border Radius Scale\n- Micro (4px): Buttons, inputs, functional interactive elements\n- Subtle (5px): Links, list items, menu items\n- Standard (8px): Small cards, containers, inline elements\n- Comfortable (12px): Standard cards, feature containers, image tops\n- Large (16px): Hero cards, featured content, promotional blocks","v":"lwsqvKyfnj1dkCW+BqntvKN+AD3m0iW9ZJWKPYQewbxMLW69DenJvD3BfTyFxnA9XFNdPfszjD0okTQ9YTP2u6kKAr26GGK9G7+POxzCMT2DybQ86g/JuhYrRb1imQq9DQEOPWSR1z3Tm427cpAEPQkmer3sHJc8tW7xPPPezLxGIY29WIYCvX2+BT0RC7e8pXDUPIn/Kz0z7VK8twgqPRYVZT1lJik9+eEQPayifr2hlk+9WvIvPNwkaLz4wQI8RvxfPZcevLx3Cbm86l2LPLzoB7s2ZjC9bFTHOyBivrzYBN07mELAPMwU2zs7Pic9I2c5PY0ksT3araI8f9KAPSbxLz1oTCO9L3YbvcNNizyo+oS8MbuwvIuWFj3ItI+8a3ErO+8AZTzwWdu8iTqANrGtH70/Ytm8WGsUPAUHwzw52as8ukgSvVSpRTxa5bg8UL6ZPU5BiDvx4vs6aw36OmFeH71HQXk9y6G7PGbDEjxPhVq8kWw1PX0CBb3rZRA9kOPmPFXG4DtRkdk8uB4KvTe2lryRz9y7jlnBPGO8fzvDHMQ7yxOYPTWrTbxREIw8qL5xPHAIprzJ7oG8qdLIOy+//7s6yZq8yn5cPbUozrxK4lw9TknIPNNLBLx/hVg99+XTPElwHrzWDaA8MDz3PCmfbzwssXm8d5FVvcjetbwtGOC85ayDvZ7VY7wND4o8roqNvGSpKzw9F/08Hk06PXYIt7xbQlw8+hAWPajdoDssxQq90yxEPTiu6bwxs108zzLxvKtowr2aBMA839qbvCR4nrzPaIy849AVvYNOQb33FM68c/LSPE7TCDvoknu9IvlUPRrNyTuFSqa728CqPcpTKz04E7E8KSkhvSayRj2y1n48CfC2vctkHD1urwE9nISqPBryGz1a9bq9an++OzTEK73jD0e8K6wIPGbgH71TKz494zo+PGKArjy3tBO9e1riO7Hma7x/2j09VGOoPJZ7F7yh5Vi9wEc1PH4GVbtRs5g8ony/ORWnRD1lnng9p4GAvSBVi7soIHG6QZLjvG2bqD3pLKe6RPowPM671bqTXFW9/EDqvB36zryzqOI8244PvVTpNj07/zg85ZrxPGTi7Lz+GFE8TMO5PBn1dbzNFvw7cRMovU/Lhj03lmk98lrfvB2bg7wv1TW9vDKrPM2GOz2gUis7KLrVvGICXL3d3w89CKOMvDoSob1GByK8+WigPBPBMr3Aqcu87GfMvIlPST2bQgq83shxvX5Vwrzf5Ba8JutmPcDvDr0QFok8kj
|
|||
|
|
{"p":"DESIGN.md","s":193,"e":252,"m":1776084302914.8396,"t":"### Whitespace Philosophy\n- **Generous vertical rhythm**: 64-120px between major sections. Notion lets content breathe with vast vertical padding.\n- **Warm alternation**: White sections alternate with warm white (`#f6f5f4`) sections, creating gentle visual rhythm without harsh color breaks.\n- **Content-first density**: Body text blocks are compact (line-height 1.50) but surrounded by ample margin, creating islands of readable content in a sea of white space.\n\n### Border Radius Scale\n- Micro (4px): Buttons, inputs, functional interactive elements\n- Subtle (5px): Links, list items, menu items\n- Standard (8px): Small cards, containers, inline elements\n- Comfortable (12px): Standard cards, feature containers, image tops\n- Large (16px): Hero cards, featured content, promotional blocks\n- Full Pill (9999px): Badges, pills, status indicators\n- Circle (100%): Tab indicators, avatars\n\n## 6. Depth & Elevation\n\n| Level | Treatment | Use |\n|-------|-----------|-----|\n| Flat (Level 0) | No shadow, no border | Page background, text blocks |\n| Whisper (Level 1) | `1px solid rgba(0,0,0,0.1)` | Standard borders, card outlines, dividers |\n| Soft Card (Level 2) | 4-layer shadow stack (max opacity 0.04) | Content cards, feature blocks |\n| Deep Card (Level 3) | 5-layer shadow stack (max opacity 0.05, 52px blur) | Modals, featured panels, hero elements |\n| Focus (Accessibility) | `2px solid var(--focus-color)` outline | Keyboard focus on all interactive elements |\n\n**Shadow Philosophy**: Notion's shadow system uses multiple layers with extremely low individual opacity (0.01 to 0.05) that accumulate into soft, natural-looking elevation. The 4-layer card shadow spans from 1.04px to 18px blur, creating a gradient of depth rather than a single hard shadow. The 5-layer deep shadow extends to 52px blur at 0.05 opacity, producing ambient occlusion that feels like natural light rather than computer-generated depth. This layered approach makes elements feel embedded in the page rather than floating above it.\n\n### Decorative Depth\n- Hero section: decorative character illustrations (playful, hand-drawn style)\n- Section alternation: white to warm white (`#f6f5f4`) background shifts\n- No hard section borders -- separation comes from background color changes and spacing\n\n## 7. Responsive Behavior\n\n### Breakpoints\n| Name | Width | Key Changes |\n|------|-------|-------------|\n| Mobile Small | <400px | Tight single column, minimal padding |\n| Mobile | 400-600px | Standard mobile, stacked layout |\n| Tablet Small | 600-768px | 2-column grids begin |\n| Tablet | 768-1080px | Full card grids, expanded padding |\n| Desktop Small | 1080-1200px | Standard desktop layout |\n| Desktop | 1200-1440px | Full layout, maximum content width |\n| Large Desktop | >1440px | Centered, generous margins |\n\n### Touch Targets\n- Buttons use comfortable padding (8px-16px vertical)\n- Navigation links at 15px with adequate spacing\n- Pill badges have 8px horizontal padding for tap targets\n- Mobile menu toggle uses standard hamburger button\n\n### Collapsing Strategy\n- Hero: 64px display -> scales to 40px -> 26px on mobile, maintains proportional letter-spacing\n- Navigation: horizontal links + blue CTA -> hamburger menu\n- Feature cards: 3-column -> 2-column -> single column stacked\n- Product screenshots: maintain aspect ratio with responsive images\n- Trust bar logos: grid -> horizontal scroll on mobile\n- Footer: multi-column -> stacked single column\n- Section spacing: 80px+ -> 48px on mobile","v":"KJRcPPIrrz2uyVS+HEWKvSq3gbxsBwu9VC3qPcpPB70vWCa9tHlbvfL5oTyl35c9ZTSgPCx7Sj3z2FI6Btkkup2u87zuSLG8euR1O66u0Twxfjm8VpjWORL3Or0Sv7a8WaYTPRWo2j2G7V458v1nvLXSxr3sa0U7gOk6PQZiib3mQS+94OQ1vBhcBT2Mevy6vphFPeLXRTywzwY72EN5PckmqT0rY1I8VD5rPAFyhrxhCV68QIN0Ow1tNrkO/j08SrioPL3DmbweeE+9TfrDOyNlFLwl8t+8IZA4PQB3kDyl+Z68hATRPGnyCT0MDt47+ZiJPH98Nj06vB09v0l7PUTnJz0WAQC9bMnqvB63+jw8JY+8rDPqvA+9Sz0bDdq8M7dmO2xSjjyWXA29s1qbvEoGr7yj1Mq8dGuRO0d/6zwzigE8HW8hvYs0Gj0WD4K7KOnDPffkbbyDw/461e6/vH94lL1bdKY9xwE2PC3Ap
|
|||
|
|
{"p":"DESIGN.md","s":241,"e":300,"m":1776084302914.8396,"t":"- Pill badges have 8px horizontal padding for tap targets\n- Mobile menu toggle uses standard hamburger button\n\n### Collapsing Strategy\n- Hero: 64px display -> scales to 40px -> 26px on mobile, maintains proportional letter-spacing\n- Navigation: horizontal links + blue CTA -> hamburger menu\n- Feature cards: 3-column -> 2-column -> single column stacked\n- Product screenshots: maintain aspect ratio with responsive images\n- Trust bar logos: grid -> horizontal scroll on mobile\n- Footer: multi-column -> stacked single column\n- Section spacing: 80px+ -> 48px on mobile\n\n### Image Behavior\n- Workspace screenshots maintain whisper border at all sizes\n- Hero illustrations scale proportionally\n- Product screenshots use responsive images with consistent border radius\n- Full-width warm white sections maintain edge-to-edge treatment\n\n## 8. Accessibility & States\n\n### Focus System\n- All interactive elements receive visible focus indicators\n- Focus outline: `2px solid` with focus color + shadow level 200\n- Tab navigation supported throughout all interactive components\n- High contrast text: near-black on white exceeds WCAG AAA (>14:1 ratio)\n\n### Interactive States\n- **Default**: Standard appearance with whisper borders\n- **Hover**: Color shift on text, scale(1.05) on buttons, underline on links\n- **Active/Pressed**: scale(0.9) transform, darker background variant\n- **Focus**: Blue outline ring with shadow reinforcement\n- **Disabled**: Warm gray (`#a39e98`) text, reduced opacity\n\n### Color Contrast\n- Primary text (rgba(0,0,0,0.95)) on white: ~18:1 ratio\n- Secondary text (#615d59) on white: ~5.5:1 ratio (WCAG AA)\n- Blue CTA (#0075de) on white: ~4.6:1 ratio (WCAG AA for large text)\n- Badge text (#097fe8) on badge bg (#f2f9ff): ~4.5:1 ratio (WCAG AA for large text)\n\n## 9. Agent Prompt Guide\n\n### Quick Color Reference\n- Primary CTA: Notion Blue (`#0075de`)\n- Background: Pure White (`#ffffff`)\n- Alt Background: Warm White (`#f6f5f4`)\n- Heading text: Near-Black (`rgba(0,0,0,0.95)`)\n- Body text: Near-Black (`rgba(0,0,0,0.95)`)\n- Secondary text: Warm Gray 500 (`#615d59`)\n- Muted text: Warm Gray 300 (`#a39e98`)\n- Border: `1px solid rgba(0,0,0,0.1)`\n- Link: Notion Blue (`#0075de`)\n- Focus ring: Focus Blue (`#097fe8`)\n\n### Example Component Prompts\n- \"Create a hero section on white background. Headline at 64px NotionInter weight 700, line-height 1.00, letter-spacing -2.125px, color rgba(0,0,0,0.95). Subtitle at 20px weight 600, line-height 1.40, color #615d59. Blue CTA button (#0075de, 4px radius, 8px 16px padding, white text) and ghost button (transparent bg, near-black text, underline on hover).\"\n- \"Design a card: white background, 1px solid rgba(0,0,0,0.1) border, 12px radius. Use shadow stack: rgba(0,0,0,0.04) 0px 4px 18px, rgba(0,0,0,0.027) 0px 2.025px 7.85px, rgba(0,0,0,0.02) 0px 0.8px 2.93px, rgba(0,0,0,0.01) 0px 0.175px 1.04px. Title at 22px NotionInter weight 700, letter-spacing -0.25px. Body at 16px weight 400, color #615d59.\"\n- \"Build a pill badge: #f2f9ff background, #097fe8 text, 9999px radius, 4px 8px padding, 12px NotionInter weight 600, letter-spacing 0.125px.\"\n- \"Create navigation: white header. NotionInter 15px weight 600 for links, near-black text. Blue pill CTA 'Get Notion free' right-aligned (#0075de bg, white text, 4px radius).\"\n- \"Design an alternating section layout: white sections alternate with warm white (#f6f5f4) sections. Each section has 64-80px vertical padding, max-width 1200px centered. Section heading at 48px weight 700, line-height 1.00, letter-spacing -1.5px.\"","v":"vugDPU5ZVD344iS+Lz5ZvNltOj3O2SO8nD6XPW9uzDthjz+83ecavcc3jjwWqCA9mvHbPOpWAz3WohM9iCKYvGywI7za6cu9xi7Muw6nOT1DnR09B+8DO89BNb3RE1m9MiY/PddDbj0digc8dMzrPIR+l70gMC89k8EsPVejD70+4bi9phOCPICPWz3Oe/G8s418PLhXLz2X2XK9KVRuPf9uIT3ErMw827KWPD4eUr2lr5K8isG1u7/njDwtg0g92CJtPegKn7yhH2G9VcM6O7RhKrxiHW+9I0OBPbiRZzwcbXs8m2RfPFlWKT1rjME8jIoLPdcXzD2rS5q8zomdPcfyOT3LDJq8hMYOvcAeKD0RU4C99VfJvGgNvDzVcwe9I8SqO0chvjyU13+8ZJTLu+QgOr1zTYa7oP+LOylpHj00V
|
|||
|
|
{"p":"DESIGN.md","s":289,"e":310,"m":1776084302914.8396,"t":"- Muted text: Warm Gray 300 (`#a39e98`)\n- Border: `1px solid rgba(0,0,0,0.1)`\n- Link: Notion Blue (`#0075de`)\n- Focus ring: Focus Blue (`#097fe8`)\n\n### Example Component Prompts\n- \"Create a hero section on white background. Headline at 64px NotionInter weight 700, line-height 1.00, letter-spacing -2.125px, color rgba(0,0,0,0.95). Subtitle at 20px weight 600, line-height 1.40, color #615d59. Blue CTA button (#0075de, 4px radius, 8px 16px padding, white text) and ghost button (transparent bg, near-black text, underline on hover).\"\n- \"Design a card: white background, 1px solid rgba(0,0,0,0.1) border, 12px radius. Use shadow stack: rgba(0,0,0,0.04) 0px 4px 18px, rgba(0,0,0,0.027) 0px 2.025px 7.85px, rgba(0,0,0,0.02) 0px 0.8px 2.93px, rgba(0,0,0,0.01) 0px 0.175px 1.04px. Title at 22px NotionInter weight 700, letter-spacing -0.25px. Body at 16px weight 400, color #615d59.\"\n- \"Build a pill badge: #f2f9ff background, #097fe8 text, 9999px radius, 4px 8px padding, 12px NotionInter weight 600, letter-spacing 0.125px.\"\n- \"Create navigation: white header. NotionInter 15px weight 600 for links, near-black text. Blue pill CTA 'Get Notion free' right-aligned (#0075de bg, white text, 4px radius).\"\n- \"Design an alternating section layout: white sections alternate with warm white (#f6f5f4) sections. Each section has 64-80px vertical padding, max-width 1200px centered. Section heading at 48px weight 700, line-height 1.00, letter-spacing -1.5px.\"\n\n### Iteration Guide\n1. Always use warm neutrals -- Notion's grays have yellow-brown undertones (#f6f5f4, #31302e, #615d59, #a39e98), never blue-gray\n2. Letter-spacing scales with font size: -2.125px at 64px, -1.875px at 54px, -0.625px at 26px, normal at 16px\n3. Four weights: 400 (read), 500 (interact), 600 (emphasize), 700 (announce)\n4. Borders are whispers: 1px solid rgba(0,0,0,0.1) -- never heavier\n5. Shadows use 4-5 layers with individual opacity never exceeding 0.05\n6. The warm white (#f6f5f4) section background is essential for visual rhythm\n7. Pill badges (9999px) for status/tags, 4px radius for buttons and inputs\n8. Notion Blue (#0075de) is the only saturated color in core UI -- use it sparingly for CTAs and links","v":"4G3LPKYINz17/je+PbdcvXhhRz0qFYa87O+6PcP3JbzbYBC7m+1KvcHpkLy1onE9666TPNTRhzp+ylQ96akiOhPMsjlCaL+9104vPJsgEj0bJcy8KMYAveGGML0ndeK71Z1/PYUmWD2GqUc9gKGQvIYhpL3RoIS8SPEnPe8mhb03QBC90qOJvA4JXTxgMty8yAYgPT0Bdj1TyQ+8gPyNPelmjT2WVQY8aCMzPbetGb2BmTU8HnW7PCqEx7zfWAQ9YJCwPGclKzxt90C8zM4aPC4Bojvj2nq9K3UOPWlatbygkTG87jNyOlKDgjwE5fI7CUfDPCD+rD3zB6+86bKNPVKIkD1687G89ovlPNmLaD0K6Ay9/rcOvaq07TzMrgC9fzZ2OwEUQD3gbe68o5lJvONJ7byHYpk8kqiRPCZ7TD1l3h+87eU8vUhugT2jqDk90UddPZK387umpWW8dI4EvaBNnr0y0no92/kyvNv1Rj00Imm8iZ8lO2uxIbs9q5o8bBugPAxDhjseqaq8pg3YvO+XgrwU3kS9rYIHPAV5Fjt3nZy8Dg1tPWzYJb3irkU8CVCjvOMygrzf0MW8XZzquiDh17x0hja9TRCBPdYb2zz6ITw9PtmLu6lvbbxZd008HnjnujXyxbzbZTQ87oEKPXF+6zxrgge9SAYavY7pjLyEuCY6mIghveFImbwtala8HpKDvKNX3Lx5TJO6ijSEPUQyD7xx4sK8+BlOPHX0ibpQUa+8EaCSPJL437zGK1q9vTs5PFY9fb3H/ZM8soUdvAG3Hr1sQVS8xd2Hu90zE7wFGAa9AZKXPNZvxTxzhQm8GeGAPTL4qTs82su74QBUPVB6Ej2UF7Y8DcJWvcr/Oj1n7CA8Agu+vZCzrzyR9wU9LqHtO0BXYDxIEQG9eJz3O6fJ7Lwnaie8P1F9u7XV7rww7JE9vA0ivOTZhTyzb9G7pM2+PIzVl7xnnYo9whXIO+xNsruhuim9bLbGPDRvBr2DL5a8xhMfOx5ub7zsBxw9gNanvVXvPjw+EAe9eaQgvSDXVj0490k7DRNCO1yPjrzpyjC9Q7wTvWtAjLwX75C5JVMHvbUIhjxXnN675AIoPT79wbzxYw49xMGPO8Y6R7wvG4y8GiYSPCQ3HD1m+bA7OdmAOxBS8by8Yoe8LvVmPIDiET2HFac8OokJvA+KOb0274085OBKu9+4Yr0Ag6I623N6PP8BLb1MVSS97PuMvcPOPj1SXKm8PitovYydHTzMsqU7W2GcPTBOr7xfhgA9PO9IPbAunT33gd+6hwROvFzsUr2Wusw84ROmO2xXO71mkrm6JSzOPcjbYrzXcC48JG6pPd+Uwjxclak7JHVgvd2QPr32Hdm8sLr1uhtff7tkk3w7pKHXu2gjSboYWGa8wmpdvSm+KzyPfGu9wgwcPF2THj16F0w8sesaPdEsMzx6MOU6qELJPGbfJLzKRy674sZBPZGuurzn7Za8AQ1pPZtckjx2mtq8N4BkPE9BaTwiDmO9E394PVQX1zwmC2G7ifFPPeABRzwWt4+8VuVzPFTxabzRLP+7/CoOO7f6RzzaoXg9zxhJvHaOsDxSXeU6ZT5nPGBUeT0BMDg9qUcDPTXXlb2/nK+8VA42PaUuBrxS/Yg8cJMCPTNCwrusbum8o4wQPDA/ID3p/9687DtOPOdF7DzBPFs8DBduO230ljyXydA7PlxYvaNfhzxmSTy9fxukvKwChD0kdPO6uL8VPShUED3DyWK7lEMAPVBAAj2S/SA7oyXGvBrn0LwZLH89jT6dvDlX7DwNpLa725MDvBEy
|
|||
|
|
{"p":"harness-init.sh","s":1,"e":28,"m":1778951184599.713,"t":"#!/usr/bin/env bash\nset -euo pipefail\n\n# Harness 会在每次会话启动时执行此脚本,这里只做轻量且可重复执行的环境检查。\nROOT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\ncd \"$ROOT_DIR\"\n\ncommand -v git >/dev/null || {\n echo \"ERROR: 缺少 git\"\n exit 1\n}\n\ncommand -v python3 >/dev/null || {\n echo \"ERROR: 缺少 python3\"\n exit 1\n}\n\nif [ -d \"$ROOT_DIR/wolai-frontend\" ]; then\n if ! command -v node >/dev/null; then\n echo \"WARN: 缺少 node,前端相关任务可能无法执行\"\n fi\n if ! command -v pnpm >/dev/null; then\n echo \"WARN: 缺少 pnpm,前端相关任务可能无法执行\"\n fi\nfi\n\necho \"Harness 环境检查完成\"","v":"hokhPCdMmT1GYSy+aLtdvaomhj2VB469h6fJvIS78Tq64la9VHyKvaW/Fr3RVsE9I89/PAf8nzy+Jqq884rivFOyKb1l3yY8QnyzvGH/wbwm3xu8pOKdvBVQLL0l4fe8djMnPg3q2jxToYc927XVPNN+FbwzFAo8g0gEPSMc4zw8oGM8OAJ0u4rW472WB6m92Pjguo5izTyEdQQ939ihO6jCPDzjwOQ57OsQvUI+Djxk4ta4ubqFvQKqDD3UbGq8+pM7PXELlL3MFuo8y/mCPExpM71cyhC7+nFsPXg9Hj2aQXW85vLpO6FoKT2ECiG8CENOO8qJWLzSb8k5BOwqPTVDBb16Bia8nziIvAu7YLxjREA9UWmXuyDXHzwz/Aq9N/kdPIBuD72Yd427h2HOuuQtir3vuVm94M8SvTWWYLzvoTE9GpehvHrCgD0Ie6A8+LaLvClkWb26fLu8tXWZvCLxJb1wIAE824xKvANPYjyeRU69sPaHPXXSLL02Ubw8bLSKvA9hYz0SPu085AWOvMstWzsBLC+94wspu6wec7zl0is8QHUvPRc6jjxFXh08NdghvQafV7wQe4+7O3QsPUU9D7yVRVu7SrA7PX70jLzYqYc9pkoFvZ8+Fb0veIg98ZpXPIUZLb0Lhkc9Y3CBPNVCXzyTpS49hRLevFOq2rz4GGs8k1AFvXXrZLuNRbe8pGxZvSHPPjxoB3w9WSHzPBVodb10kxG9HuuTPRYHwTmogGk7D6+TPC5eTzxrvhu98bFYvH9zJb3aaZE9zEL6vCiY87zyvW+85kZCvQ9KLLwuSTo9NX3SPOKtVjz55fa8QMVPvSsT6zy4NiG8Y/YyPNIP0Tw9gCc9GuK5O9dugjy4AY08xRimvIoCJz2ENvU8ICQtO9OwkTuxBp+9nfsFvZGek7zj1Vq8YBLOPDZmAb3Pw6a85AoPvcMWYzyE8x49KsEjPYvcFL2dSpM8Wsg/vJNvZL1VtZG5q/9OvOv7Dr3SNvi8ZeHhvEUObbq3E2g8tvIjvPN7bbxEYY+6AM3rvHu2y7zDr5i8wYvFPG6TjbxglaC85Y7QPGogODz/ZgY8724SvQNOKT3uvFu8/ociPZJhsrvK6cc87sOPPdRE+7za1q67PpftvLyOoTzEamm8AWhePXFCnr0d90K89u9zPGTVCT3M5eu7/SsYPZb8FbxseM08vbtBvEKXqLyVYu86XmTwu2JQMr3EXsa8h1hcvYPAwDy5/Tk9epFSvPPk/Dyf2PI8aqyKPZXZxbyZY808ryPMvAMLAz3Vzyk8ne6tu3bzMb2HWrM7sqlsvbiyLr0WS4S9EetTPRRUAjsXgHO8O+KEPf4qJz3Q3Ww9UlhUvfoghLx8dfi794aOPecYorwXRrq8z/MDvD0MjDxJB0O9VUsuPC6J2byOKGi8Bv3mPGhg07v5z1q89C09PEOH97pLqsi8nZMfPeC0yDwvDdI8whmHPeJlIDw0RYy9gcryO/xRWb2EChw7EAi6vP1YFrp18Iy8Y4FBPB+a3bynWp+7Ah1JPXC71Lur6Xk9BusXvaSnF716wgQ9foCFvCsB2TvrZS48q/T5O6EM0jzBAr46zvT9PCRzobzDhQk8Msv1PL02HL1OzE69l419PKfUebyqGvo4d6vuPHuT5LyL4cC8ceUGvLXpUzw5DTW9npIrO4nQKz3+n6o8aHFBPIk7Pr28QB69h0w6vfpomDiM0bi8cSvbPA39DD0AWck8n45iPZYABjz5MOe8FrQHPRIr5zzbEHU9YM6Muy/ObrxJL3+8+v26O1HoczydFfW8DPy9PU9LOj184RE7UnjbO3VpTDiLuzU8m6hLPJb5Tb0FY2u7Na6zPJy2AT7DAi69aatZPDANB72YTHM7VGANPRHPaL0GLpA9l1qGvAEZSD2wi/+8J6uQPdPPhDvDP8Q8/UVgPPECObwnwyk65GyUPAY0Gr2q9fc7UmQtPas7fLyvEns8RRKHvOJd3TvPZIy98eqWO86gLr0t4oE8jfSCvHWhcz0uODM93YbAvCswvTzsYsa8gMtUO8Q457udi388CyLjvFC76jzE/9Y8A0F8PBFQnbxilPK8LYZ9utLy5zyEoKu84SlQPV2RpDywQxe9t1TiPD1Uvr2RLsq9y0y2u7/dojn5AS88gAInPA7zr7v9C867QbtgPZSLDDzSVqg9Y/b6O6GijTs1wXe849mdPJ16GDq+gSs9WI9VPQ7KNrxQLZ28wb8hPRYjDD0Kk9E7aG7ivAVQhDwdpfg8+qVfPFuKBD3nKL+8n1KZvW/WrDuQvyQ9+dduu9yQHzxOTzy8XPE8Pad7Rbxv+6o7f3qmvZt5UT22tH49hRUevfJqob3bsAm873uluzN1ZD1IRAY+HspyvepliDzO9Bw9H0qDPLouAD1SdY89kgC7PPTKnz336NW88z/2O+/hg7z8ani8HcN3vFRD2by5qNU77DRBvWTAvjvDUUU8HvjGu9MTcby6Q6S9mN1EPSFBXj2UgRw8IlohvdplHj0XwRW9BibsO7qokzyO+nu7LEmBPOXyATw9ZKC5V2FLu6Fwg72iRFe9ms+jvGPM1jtMtm09w5wcPDDMgrxZCS+9MYkBPemxEzoPoRI8bFaNPB0IFD2jDR684rC4vS/sT71NCOU8F2oOPEipuTueAd48fsyOvENnR72JGno8Q/MdPQnDiLwFqSI9iQeSvId9jL0me1W8MKRbPfqBpDyjPQQ8wMdbvNuyujwkTjC9ThwJPL4Hlb0ZWpO9hPfiPAa3zLqlBEi9qMtVPN+VEb0gse68jKCTO99WEz2NLBq9UVn7OWe6mDxAPrY8p2LevGDCHL1ZKs27yUcHvJ6RxrykKlY83s21PAq5Qz2SIYw8DZJQPEKSI7yj6QQ85ujEPKMyxrw2NlA9/Va+vJm+sj3Hyhi94SCuvRVUjz0Cksu8k1wnvYOMjzufylm7IfTQvCHQtrzONbi8WS6gvMD5BL2D/mM8KHEHvQWUizzhwV08Wp/QPCv1kLyhFos8X0BOPftNpTziWrs857HVvI/GoLylkja99/TcunospTt07kc8awedvHV4jzyKPWi9nKgsvWrksjyKyka9SXLxPGLBWjywUcq8pqWCPN8yyrv0uP68WjIZPK/tEL0kE7C8vUgKPAyEBDyWa4W5yipRu3WeTDw1Vge6OpEHvVWwKLx0LBa7EfCuvDu9IT3GzKA9vltivDzSjLxlaJE9hXC4vJRz4zzuk5y868zGvM6VjzzgpTo7OrPDOkFgV72yfaK3nRQCvZQwzzs5loO63lvPPNX
|
|||
|
|
{"p":"harness-progress.txt","s":24,"e":52,"m":1778951184599.713,"t":"[2026-04-26T23:38:55Z] [SESSION-1] Completed [task-005] (commit skipped by repo rule; validated by mnote-web tree_shell_embeds_renderer_input_contract, tree-shell iframe/surface vitest, task112 and task113 smoke)\n[2026-04-26T23:38:55Z] [SESSION-1] Starting [task-006] Phase L:将 tree.subtree.move 最终写路径继续下沉 Rust kernel (base=6d89f5ca)\n[2026-04-26T23:38:55Z] [SESSION-1] STATS tasks_total=9 completed=5 failed=0 pending=3 in_progress=1 blocked=0 attempts_total=6 checkpoints=5\n[2026-04-26T23:52:20Z] [SESSION-2] LOCK acquired (pid=3897587)\n[2026-04-26T23:52:20Z] [SESSION-2] RECOVERY [task-006] action=\"validate existing uncommitted changes\" reason=\"previous session left task-006 in_progress after implementation and validation\"\n[2026-04-26T23:52:52Z] [SESSION-2] CHECKPOINT [task-006] step=1/1 \"已引入 Rust treeWriteOperation,Convex 优先执行 Rust write operation;目标验证通过。\"\n[2026-04-26T23:52:52Z] [SESSION-2] Completed [task-006] (commit skipped by repo rule; validated by bridge-runtime tree_subtree_move_command and 39 frontend target tests)\n[2026-04-26T23:52:52Z] [SESSION-2] Starting [task-007] Phase M:补齐 block/save-snapshot formal artifact 与 domain-event contract (base=6d89f5ca)\n[2026-04-26T23:52:52Z] [SESSION-2] STATS tasks_total=9 completed=6 failed=0 pending=2 in_progress=1 blocked=0 attempts_total=7 checkpoints=6\n[2026-04-27T00:09:12Z] [SESSION-2] CHECKPOINT [task-007] step=1/1 \"formal domainEventPlan payload schema 与 resync_required delta 已落地;目标验证通过。\"\n[2026-04-27T00:09:12Z] [SESSION-2] Completed [task-007] (commit skipped by repo rule; validated by bridge-runtime formal contract tests and frontend adapter/runtime tests)\n[2026-04-27T00:09:12Z] [SESSION-2] Starting [task-008] Phase N:继续收薄 3000 Next route 过渡职责 (base=6d89f5ca)\n[2026-04-27T00:09:12Z] [SESSION-2] STATS tasks_total=9 completed=7 failed=0 pending=1 in_progress=1 blocked=0 attempts_total=8 checkpoints=7\n[2026-04-27T00:18:38Z] [SESSION-3] LOCK acquired (pid=codex-session-3)\n[2026-04-27T00:18:38Z] [SESSION-3] RECOVERY [task-008] action=\"resume diagnostics with uncommitted changes\" reason=\"previous session implemented Phase N but task112 picker move wait timed out\"\n[2026-04-27T00:28:56Z] [SESSION-3] CHECKPOINT [task-008] step=1/2 \"已定位 task112 超时根因:move 请求实际发出但 Convex 运行态 documents.move validator 未加载 treeWriteOperation,执行 npx convex dev --once 刷新本地 functions。\"\n[2026-04-27T00:34:43Z] [SESSION-3] CHECKPOINT [task-008] step=2/2 \"目标 Vitest 与 task112 smoke 通过;补充 iframe ready 等待,运行态 Convex functions 已刷新。\"\n[2026-04-27T00:34:43Z] [SESSION-3] Completed [task-008] (commit skipped by repo rule; validated by tree route/delta/boundary vitest and task112 smoke)\n[2026-04-27T00:34:43Z] [SESSION-3] Starting [task-009] Phase O:搜索语义 hardening 与资源类型 fixture 补齐 (base=6d89f5ca)\n[2026-04-27T00:41:58Z] [SESSION-3] CHECKPOINT [task-009] step=1/1 \"file_tree 搜索 hardening 前端契约与资源 fixture 已完成;目标验证通过。\"\n[2026-04-27T00:41:58Z] [SESSION-3] Completed [task-009] (commit skipped by repo rule; validated by tree-delta, projection-client, kernel-file-tree tests and task112 smoke)\n[2026-04-27T00:41:58Z] [SESSION-3] STATS tasks_total=9 completed=9 failed=0 pending=0 in_progress=0 blocked=0 attempts_total=9 checkpoints=9\n[2026-04-27T00:41:58Z] [SESSION-3] LOCK released\n[2026-04-28T00:00:00Z] [SESSION-4] CORRECTION final-renderer-gate=\"task-001..task-009 were Rust/WASM reducer runtime completion, not final DOM shell completion\"\n[2026-04-28T00:00:00Z] [SESSION-4] INIT Added task-010..task-013 from design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\n[2026-04-28T00:00:00Z] [SESSION-4] NEXT task-010 must add negative gates so default page/filetree/picker success path cannot remain iframe_srcdoc inline DOM shell\n[2026-04-28T00:00:0
|
|||
|
|
{"p":"harness-progress.txt","s":53,"e":60,"m":1778951184599.713,"t":"[2026-04-28T02:44:47Z] [SESSION-5] Starting [task-010] Phase P-0:补 final DOM shell 负向门禁,阻止 iframe_srcdoc 被误判为完成 (base=81ba21c5)\n[2026-04-28T02:52:03Z] [SESSION-6] LOCK acquired (pid=manual-codex-session-6)\n[2026-04-28T02:52:03Z] [SESSION-6] RECOVERY [task-010] action=\"resume in-progress final DOM shell gate\" reason=\"previous session lock stale; preserve existing uncommitted changes\"\n[2026-04-28T03:28:16.005752Z] [SESSION-6] CHECKPOINT [task-010] step=1/4 \"已新增默认非 iframe rust_wasm_dom_shell_host 与共享 DOM projection model,legacy iframe 改为显式环境开关。\"\n[2026-04-28T03:34:10.533972Z] [SESSION-6] CHECKPOINT [task-010] step=2/4 \"tree-shell-surface 与 legacy iframe host 目标 Vitest 通过;默认主路径断言已切成 rust_wasm_dom_shell_host 且负向排除 iframe_srcdoc。\"\n[2026-04-28T03:36:24.605315Z] [SESSION-6] CHECKPOINT [task-010] step=3/4 \"move/embed picker 测试已切到 DOM shell;默认 picker 不再以 iframe postMessage 为成功条件,目标前端 Vitest 29 项通过。\"\n[2026-04-28T04:40:14Z] [SESSION-7] RECOVERY [task-010] action=\"resume stale leased final DOM shell cutover\" reason=\"previous session left task-010 in_progress; existing changes validated without rollback\"\n[2026-04-28T04:40:14Z] [SESSION-7] CHECKPOINT [task-010] step=4/4 \"已补默认 DOM shell 负向门禁:tree-shell-host/surface/picker 测试与 smoke 默认拒绝 iframe_srcdoc 成功路径。\"","v":"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
|
|||
|
|
{"p":"harness-progress.txt","s":72,"e":96,"m":1778951184599.713,"t":"[2026-04-28T06:29:15Z] [SESSION-7] INIT Added task-014..task-018 for remaining 4-16 final runtime closure: normalizedMove fallback removal, snapshot event/Page Aggregate, embed pageReference migration, and file_tree indexing visibility.\n[2026-04-28T06:29:15Z] [SESSION-7] Starting [task-014] Phase L2:删除 normalizedMove fallback,强制 move 主写路径使用 treeWriteOperation (base=81ba21c5)\n[2026-04-28T06:37:40Z] [SESSION-7] CHECKPOINT [task-014] step=1/1 \"已删除 normalizedMove fallback;bridge-runtime/TS transport/Convex move 写路径只保留 treeWriteOperation,目标测试通过。\"\n[2026-04-28T06:37:40Z] [SESSION-7] Completed [task-014] (commit skipped by repo rule; validated by bridge-runtime tree_subtree_move_command and 20 frontend target tests)\n[2026-04-28T06:37:40Z] [SESSION-7] Starting [task-015] Phase M2:定稿 document.snapshot.saved 独立事件并避免与 page.body.saved payload 重叠 (base=81ba21c5)\n[2026-04-28T07:44:37Z] [SESSION-8] CHECKPOINT [task-015] step=1/1 \"page.body.saved 与 document.snapshot.saved 已拆成 domainEventPlans 双事件;artifact writer 支持 domainEvents 批量落库,page.body.saved payload 不再夹带 snapshot。\"\n[2026-04-28T07:44:37Z] [SESSION-8] Completed [task-015] (commit skipped by repo rule; validated by bridge-runtime --lib and rust-runtime/bridge-log/page-write tests)\n[2026-04-28T07:44:37Z] [SESSION-8] Starting [task-016] Phase M3:把 snapshot 独立事件接入 Page Aggregate 深层收口文档与客户端边界 (base=81ba21c5)\n[2026-04-28T07:44:37Z] [SESSION-8] CHECKPOINT [task-016] step=1/1 \"Page Aggregate contract 与 5-6 清单已固定 page.body.saved / document.snapshot.saved 职责边界;4-16 snapshot 项已勾选。\"\n[2026-04-28T07:44:37Z] [SESSION-8] Completed [task-016] (commit skipped by repo rule; validated by page-aggregate-client-state/page-aggregate-builder/page-write tests and git diff --check)\n[2026-04-28T07:44:37Z] [SESSION-8] Starting [task-017] Phase N2:将 tree.node.embed 的 pageReference 组装迁到 Page Aggregate / Rust artifact 边界 (base=81ba21c5)\n[2026-04-28T07:44:37Z] [SESSION-8] CHECKPOINT [task-017] step=1/1 \"Rust pageAggregateEmbedPlan 已产出 pageReference block 与 next content;3000 route/documents embed adapter 只传 substrate preflight,tree-route-boundary compatPending 已清空。\"\n[2026-04-28T07:44:37Z] [SESSION-8] Completed [task-017] (commit skipped by repo rule; validated by bridge-runtime --lib, route tests, and tree-route-boundary tests)\n[2026-04-28T07:44:37Z] [SESSION-8] Starting [task-018] Phase O2:补 file_tree 搜索索引可见性指标边界并收口 4-16 (base=81ba21c5)\n[2026-04-28T07:44:37Z] [SESSION-8] CHECKPOINT [task-018] step=1/1 \"file_tree 搜索 indexingVisibility 已提升为 projection result meta;mnote-web 与 3000 同源 projection route 均透传该指标,4-16 无未勾选项。\"\n[2026-04-28T07:44:37Z] [SESSION-8] Completed [task-018] (commit skipped by repo rule; validated by bridge-runtime --lib, mnote-web file_tree_projection, file projection route/client tests)\n[2026-04-28T07:44:37Z] [SESSION-8] STATS tasks_total=18 completed=18 failed=0 pending=0 in_progress=0 blocked=0 attempts_total=18 checkpoints=20\n[2026-04-28T08:53:21Z] [SESSION-9] INIT Added task-019..task-026 from design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md for Rust Web main execution plane cutover.\n[2026-04-28T08:53:21Z] [SESSION-9] NEXT task-019 must freeze main execution owner manifest before gateway implementation.\n[2026-04-28T08:53:21Z] [SESSION-9] STATS tasks_total=26 completed=18 failed=0 pending=8 in_progress=0 blocked=0 attempts_total=18 checkpoints=21\n[2026-04-28T09:06:04Z] [SESSION-9] LOCK acquired (pid=codex-main-session)\n[2026-04-28T09:06:04Z] [SESSION-9] Starting [task-019] Phase W-0:冻结 Rust Web 主执行面 owner manifest 与负向门禁 (base=9f6a2c86)\n[2026-04-28T09:07:58Z] [SESSION-9] CHECKPOINT [task-019] step=1/1 \"已新增 Rust Web 主执行��
|
|||
|
|
{"p":"harness-progress.txt","s":97,"e":120,"m":1778951184599.713,"t":"[2026-04-28T09:13:44Z] [SESSION-9] CHECKPOINT [task-020] step=1/1 \"mnote-web gateway owner、desktop-hot 默认启动计划与 task114 smoke 已落地;目标验证通过。\"\n[2026-04-28T09:13:44Z] [SESSION-9] Completed [task-020] (commit skipped by repo rule; validated by desktop-hot node tests, mnote-web gateway cargo tests, and task114 smoke)\n[2026-04-28T09:13:44Z] [SESSION-9] Starting [task-021] Phase W-2:把 runtime config 与 auth/session handoff 迁到 Rust Web (base=9f6a2c86)\n[2026-04-28T09:16:15Z] [SESSION-9] WARN validation.commands=\"修正 task-021..task-025 Cargo 多过滤词写法;原命令会被 cargo test 拒绝为 unexpected argument。\"\n[2026-04-28T09:16:28Z] [SESSION-9] CHECKPOINT [task-021] step=1/1 \"mnote-web runtime config/session routes 与 Next token compat/debug route 已落地;修正后目标验证通过。\"\n[2026-04-28T09:16:28Z] [SESSION-9] Completed [task-021] (commit skipped by repo rule; validated by mnote-web session/runtime_config tests and runtime-config/token vitest)\n[2026-04-28T09:16:28Z] [SESSION-9] Starting [task-022] Phase W-3:建立 Rust-owned 文档页 / Page Aggregate server-first shell (base=9f6a2c86)\n[2026-04-28T09:20:22Z] [SESSION-9] CHECKPOINT [task-022] step=1/1 \"Rust-owned document shell 与 Page Aggregate snapshot contract 已落地;目标验证通过。\"\n[2026-04-28T09:20:22Z] [SESSION-9] Completed [task-022] (commit skipped by repo rule; validated by document_shell/page_aggregate tests, document-content/page-aggregate-builder vitest, and task115 smoke)\n[2026-04-28T09:20:22Z] [SESSION-9] Starting [task-023] Phase W-4:把主 API transport 从 Next route 收薄为 Rust Web owned (base=9f6a2c86)\n[2026-04-28T09:26:14Z] [SESSION-9] CHECKPOINT [task-023] step=1/1 \"Rust Web documents/tree/search transport owner 口径已落地;目标验证通过,page_aggregate 过滤词命中 0 项已记录为配置缺口。\"\n[2026-04-28T09:26:14Z] [SESSION-9] Completed [task-023] (commit skipped by repo rule; validated by mnote-web documents_api/tree_commands/search tests, bridge-runtime tree_subtree_move_command tests, and frontend route/search tests)\n[2026-04-28T09:26:14Z] [SESSION-9] Starting [task-024] Phase W-5:把 tree realtime stream 固定为 Rust Web 主链 (base=9f6a2c86)\n[2026-04-28T12:33:41Z] [SESSION-10] CHECKPOINT [task-024] step=1/1 \"Rust Web /api/tree/events owner、snapshot/delta stream、Next /api/mnote-web/stream compat alias 与 consumer URL cutover 已通过验证;task112 legacy renderer crash 仅在 Target crashed 时新 context 恢复。\"\n[2026-04-28T12:33:41Z] [SESSION-10] Completed [task-024] (commit skipped by repo rule; validated by mnote-web tree_realtime/stream tests, frontend stream/documents route tests, and task112 smoke)\n[2026-04-28T12:33:41Z] [SESSION-10] NEXT task-025 Phase W-6:把 Search / AI / Mindmap 页面壳迁到 Rust Web shell + islands\n[2026-04-28T12:34:53Z] [SESSION-10] Starting [task-025] Phase W-6:把 Search / AI / Mindmap 页面壳迁到 Rust Web shell + islands (base=9f6a2c86)\n[2026-04-28T12:34:53Z] [SESSION-10] CHECKPOINT [task-025] step=0/4 \"初始 Rust 目标过滤词 search_shell/ai_bridge/mindmap_shell 命中 0 tests;先补 owner/contract 门禁。\"\n[2026-04-28T12:44:04Z] [SESSION-10] CHECKPOINT [task-025] step=1/1 \"Search / AI / Mindmap shell owner 已迁到 Rust Web;Hermes contract 固定 session/tool/client action owner;React runtime 标记为 island 或 legacy compat。\"\n[2026-04-28T12:44:04Z] [SESSION-10] Completed [task-025] (commit skipped by repo rule; validated by mnote-web search_shell/ai_bridge/mindmap_shell tests, frontend AI/search target tests, task116 smoke, and git diff --check)\n[2026-04-28T12:44:04Z] [SESSION-10] NEXT task-026 Phase W-7:退役 Next App Router 主入口并完成 03-rust-web 文档收口\n[2026-04-28T12:50:07Z] [SESSION-10] Starting [task-026] Phase W-7:退役 Next App Router 主入口并完成 03-rust-web 文档收口 (base=9f6a2c86)\n[2026-04-28T12:50:07Z] [SESSION-10] C
|
|||
|
|
{"p":"harness-progress.txt","s":121,"e":122,"m":1778951184599.713,"t":"[2026-04-28T12:50:07Z] [SESSION-10] STATS tasks_total=26 completed=26 failed=0 pending=0 in_progress=0 blocked=0 attempts_total=26 checkpoints=29","v":"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
|
|||
|
|
{"p":"harness-tasks.json","s":1,"e":60,"m":1778951184600.0012,"t":"{\n \"version\": 2,\n \"created\": \"2026-04-26T23:16:13Z\",\n \"session_config\": {\n \"concurrency_mode\": \"exclusive\",\n \"max_tasks_per_session\": 9,\n \"max_sessions\": 80\n },\n \"tasks\": [\n {\n \"id\": \"task-001\",\n \"title\": \"Phase K-1:定义 tree shell Rust runtime artifact 边界\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web renderer_input && cargo test -p mnote-web runtime_artifact && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx\",\n \"timeout_seconds\": 1800\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已在 mnote-web rendererInput 中定义 rust_tree_shell_runtime_artifact_v1,覆盖 rendererInput/projection/expanded/selected/active/focused 输入、DOM patch/intent/command 输出和 focus/keyboard/expand/selection/context/drag/pick 事件边界;3000 inline host 同步输出同名 runtimeArtifact。\",\n \"timestamp\": \"2026-04-26T23:22:39Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:22:39Z\"\n },\n {\n \"id\": \"task-002\",\n \"title\": \"Phase K-2:建立 page tree Rust-side runtime 状态机\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-001\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web page_renderer && cargo test -p mnote-web page_focus && cargo test -p mnote-web page_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 page_runtime reducer,组合 focus/expand/open/context-menu/drop feedback/tree.subtree.move dispatch 输出,验证 page_renderer/page_focus/page_runtime、tree-shell iframe/surface vitest 与 task112 smoke 均通过。\",","v":"otInPe3HOzxHcyK+TLM0vfLZbT24/8G9VYfRPLbtD7wMtS49/c14vZ89Lr3omKk8LTGdPG/HrzyNcYQ8NI6CvdnO/zpdfOi8/NgavMr7pLwTPuQ8562WvNI7x7xSVV28rnGpPVV7nD3vtEy80FsxPf+ynbz9VVm7LNW1PQiyhTxvRTu87ynYvGfrWbvPUkm9IwG0vHo+Zb3kp0c7aH6UPNvgMzw8R9W8g79/Pabji73Q4tS87AxivR7Svz3rO4Q8YsWhPABzcb3cp4G7dapBvfIkWDxBdXK9682LPQuImD0atIG9Vb/UPCTCCj0Do1G9tt7pPG72Qz1BC7I7Og2dPeNFRzwXBUS8XLrVvI6w4Dxh+nk77aYUuwTKDz2J3J688yMOu1F7Bb3xJMC5G1YAPX9g0rs3tQ69WGeLvLnsHD22qKk7tYXHvNKdUT2oRIi7aP3xPDDIuryTjfu8jp+WPFeCLL3s6tA9y2IGPcIfvzrUYSK8iwNcvE8zmrwe4bG7aHa9vIVVCzwNy5i8crmAPWYXC7xm4I28i7GDu1tBdbxlhTc9Zb6EPc7HHL0zKrQ8EqCwvMTTGzxLSpK84Ep4PDp+D72WiiK9iATzPHEqErywMk09WZZmveyqkbyEyKE8wsgjO5ebvL2F0XG7w7TSPDW+Tz1RtzC8snw+vYUBBzyt1/i58Ne6vGqlCb0S5eM7QFPquohCmz2tqUU8pD2DPPg0Ar2KA+K8/3MiPLicBb1I1bu8XlcJu3tNKb2JQv48GUa6ugp2X70Upnw9lkfdPEnzTL1VqbW8ywiTuxW66ry/AIW8n7cSPWwJwDk7YZ29oqQtvG2rQTys2Ak8jWBXPSvgQDwJhCY9mo4pve0jXj3NCLy8I8AiveRo/Dwu7DY93N1pPc3rgLsAvlO9QQt0vUnQw7w4WQ+8CxUIvNrSSzzg1Ww9mTQMPJT9PTz/kXU74fWbPLJ6Ib3awZC8sicOPF4/27wVHUa9gMx5PPRjSr07bSy9DhpMvehhrzsmeP+8Zoeuu2dDPr1A0BC9HfaLvV3wiT1Q9j+9qJWQPQh0PL2RUra8hGrOPOKMXb0p+0A91XT0vC1FLT32orO8EwRjPYIIIb2YxY884hJtPWqe/TxXlWq8t7rQu3ER9boZ3bG5by3SOyWxUTzh//+8ifjXPKwBnD3/5b28ejZXO3/89Lt61WU90KAQO4vQw7xSXzU8vUYDPeWP9Lw+jZK8AVtMvR7ovzwBLJ48300pu7e/Jz3sekG8xM53PUQVNLxagUs9UA
|
|||
|
|
{"p":"harness-tasks.json","s":49,"e":108,"m":1778951184600.0012,"t":"\"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web page_renderer && cargo test -p mnote-web page_focus && cargo test -p mnote-web page_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 page_runtime reducer,组合 focus/expand/open/context-menu/drop feedback/tree.subtree.move dispatch 输出,验证 page_renderer/page_focus/page_runtime、tree-shell iframe/surface vitest 与 task112 smoke 均通过。\",\n \"timestamp\": \"2026-04-26T23:27:43Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:27:43Z\"\n },\n {\n \"id\": \"task-003\",\n \"title\": \"Phase K-3:建立 file tree Rust-side runtime 状态机\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-001\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web filetree_renderer && cargo test -p mnote-web filetree_selection && cargo test -p mnote-web filetree_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/lib/file-tree/shell.test.ts src/lib/tree-stream/tree-delta.test.ts && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 filetree_runtime reducer,覆盖 selection/range/context/normalize、drag row ids、copy/move effect、drop target feedback,以及 doc/index/asset-folder/asset 的 open/context-menu intent;目标测试与 task112 smoke 通过。\",\n \"timestamp\": \"2026-04-26T23:32:11Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:32:11Z\"\n },\n {\n \"id\": \"task-004\",\n \"title\": \"Phase K-4:建立 picker Rust-side runtime 状态机\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-001\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web picker_renderer && cargo test -p mnote-web picker_state && cargo test -p mnote-web picker_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/documents/move-embed-picker-dialog.test.tsx src/components/sidebar/tree-shell-iframe-host.test.tsx && node /mnt/Data1T/mnote/scripts/task113-picker-keyboard-regression-smoke.js\",\n \"timeout_seconds\": 2400","v":"kO7bOxhKbLzEki2+4t4nvaS+qz0MOYS9cxV2Os5ZwTtAETy7VspOvbcaZb2zfD49evoqPdnXzjz8faU7txsovYFLHzxT/iK9nmfyO+e9Kr2O9r08MnRQvf0mx7wbzQC9TZC2PRhmPz1QrvK5ZrpOPXm9QL0Iim88ba6yPVxE+zvmATS9Q+Pgu3DXLb3VHUC9Ub6+vMYsKb2P53m7mbMYPWc5czzjwFS9fLYcPYdRNL15Skm8yjorvdysWTyonis8BHdvPDbdg73RFOc7QR3QvTyY1DyxtSi9JlxQPQsbPzuyQmy7gVlYvCOAAT0GNV+9MGa8PPshBT2jrK47hRW3PcsgSz1BM0W8n6nOu+9/1zwTIAg9fsiRPJQ2Oz0tMjM7xRRYOrzgSL2uVmY80k1SPMG9qLwMYgi9pq8Yve6UID140U898b3DvCCvhz18b4s8pQFvvNrfO7w/Xpm8m3AHvD1ba70onmA9PEfrPL2i/TxDbZU8z36pPGDStLyfrBy6ZkgTvaiZqbybqq+8v5P8PCsnnrpQZIC7gVmgu7DpfryymiA93a5pPZRoYDy2FRw9+UgpPfqbe71wn/S8ysGtvItTxbz/ABW9JBMoPXrS7rxic3w9L5XQvI52rrwCru08oJYYPI0Mer17Hxi965L6PKSDoT2pHLG85yQ7vV9HLT0I2/w8Dkfdu/mbGryTd+A8VaYbvAkFlj3k8+w57ogCPMS6Ar2Rm028m/5UPJiiyrxyl
|
|||
|
|
{"p":"harness-tasks.json","s":97,"e":156,"m":1778951184600.0012,"t":"\"title\": \"Phase K-4:建立 picker Rust-side runtime 状态机\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-001\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web picker_renderer && cargo test -p mnote-web picker_state && cargo test -p mnote-web picker_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/documents/move-embed-picker-dialog.test.tsx src/components/sidebar/tree-shell-iframe-host.test.tsx && node /mnt/Data1T/mnote/scripts/task113-picker-keyboard-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 picker_runtime reducer,覆盖 normalize/next/previous/home/end/focus/pick、excluded ids、root pick,以及搜索输入不被键盘运行时抢 DOM 焦点的 focus_dom 输出边界;目标测试与 task113 smoke 通过。\",\n \"timestamp\": \"2026-04-26T23:34:59Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:34:59Z\"\n },\n {\n \"id\": \"task-005\",\n \"title\": \"Phase K-5:3000 host 调用正式 runtime artifact,并将 mnote-web /tree 固定为 debug/internal\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-002\",\n \"task-003\",\n \"task-004\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js && node /mnt/Data1T/mnote/scripts/task113-picker-keyboard-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已固定 3000 inline host 与 mnote-web debug shell 均输出 rust_tree_shell_runtime_artifact_v1,并通过 tree-shell 目标测试、task112 与 task113 证明 3000 主路径继续使用 inline iframe host,/api/tree/shell debug 直连默认禁用。\",\n \"timestamp\": \"2026-04-26T23:38:55Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:38:55Z\"\n },\n {\n \"id\": \"task-006\",","v":"XezWPNVfgzrbDTS+sfg3vVVzWT2bHJi9YQMbPSj/v7wzTca7lAfSvHlPkr2QlUw8Do6WPBh5xrt71Jk8upAqvQOFDLzf6I69/VGNPINGm7yInEQ8Ar4Iu00oGb2JpNu8hl1ePT+L1DwyrPK7oOfEO/6hBr2+umU7Lo6WOtlOdTycM2q98JVHvHhshb2Wx8q8cPrcPG6v1Lyu0tW73rZSO1UjHrzLFZG81NcoPWbicr2whaY81SHHvF8nVj3YNTA9fQIzPUmvRr0aurC5Ox46vRqqPz2d4569BZVHPf9LpDz5PCa8JRnWPKTM/DumOvG80A1hPQntmz3B/fS8Y8KdPSad6Tw3Mbu8Q8mCPNp6aD1qyqU7IPsdPCDHJj0JwzQ8eP15vH4hY7wh9ti85ktOPd+eAbwAbDi8Rn+hvPvnBD1swIk89fgevZkisDxczkU8KQX+PMSLKbz6uAM7v9i/O6y8hb0RkHs9DALEPGSgRT0xgzq9khAUPOwdUL20u6W7H5fRvIj+i7yzvfu8r/xnPEg65rxyvZm8JypOvJWbrrx3FZo8CGbCPWwxeLxpmes8fSahvKahqrsdB9S8QsKNOVUum7y2JEW9HGdoPWAorDvfbgs9EKpmvKC8TL0Q3Pg8PvipPC+2Nb1wVra7lTgxPT04oD1v4xS9fL5HvSLSJT2hw4Q8HfhEvV04nruTRsU7Esv4PNWwJj1l06U7PJgDPby1LzvDnCa8rkSjuykR+js7CcK8mIPXPPwYibw+SIk8yzB6Owcw3byC1Dg9kFW4PDOenb3j4gy9w7RYu+U72DxKyXC8c0ucu2gtfzwwl0W9RRv1u4jwhztTKJS84wAiPakzLD35/Ag9gHy4vE+9wT14nfS72EzjOk2YljxjnNs8zyzePJFvgjxS8Yy9xypdvXYahDxpode8abb8uwaCRLudeEI9/zoxPDMQFj33sIa7H2NQPf3oir2n2Dc9h3Z0PD6XTb29Eii9rwvMPIblpLyaZ526uGUuvSt9lLttw9W8L9cRvXmXOL0MbS29AJOpvWFTET1G3D69AkNdPfzwkb1y9E69jiTAPAy1/7zc9Ug9Nndava74LDyNDWu9UF6GPRU+Yb2Mlz897DtuPfHzZjshVHu8rNtcPKb9iLy4sUq8kyWmvAVvOT3pe9u8wVsAPd6McDyDLK684TLWurz0uDq
|
|||
|
|
{"p":"harness-tasks.json","s":145,"e":204,"m":1778951184600.0012,"t":"\"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已固定 3000 inline host 与 mnote-web debug shell 均输出 rust_tree_shell_runtime_artifact_v1,并通过 tree-shell 目标测试、task112 与 task113 证明 3000 主路径继续使用 inline iframe host,/api/tree/shell debug 直连默认禁用。\",\n \"timestamp\": \"2026-04-26T23:38:55Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:38:55Z\"\n },\n {\n \"id\": \"task-006\",\n \"title\": \"Phase L:将 tree.subtree.move 最终写路径继续下沉 Rust kernel\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-005\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/commands/route.test.ts src/lib/documents/tree-command-client.test.ts src/lib/tree-stream/tree-delta.test.ts\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已引入 Rust treeWriteOperation,Convex documents.move 优先执行 Rust write operation,normalizedMove 保留旧 fallback;bridge-runtime move 单测与前端 39 个目标测试通过。\",\n \"timestamp\": \"2026-04-26T23:52:52Z\"\n }\n ],\n \"completed_at\": \"2026-04-26T23:52:52Z\"\n },\n {\n \"id\": \"task-007\",\n \"title\": \"Phase M:补齐 block/save-snapshot formal artifact 与 domain-event contract\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-006\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_save_command_plans_include_formal_domain_event_contract && cargo test -p bridge-runtime block_commands_include_formal_domain_event_contract && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/rust-runtime.test.ts src/lib/documents/page-write-command-adapter.test.ts src/lib/blocks/block-command-adapter.test.ts\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {","v":"bNwMPfXT2TsCCDO+nXq9vKtcoD32faS9YdAmPWsIxzuPCUY9AAk0vZYfcL16FQY9p3QyPf4MXTwPfDW8MrGTvdlt1LzwkB69xHSLO+UJQ7xJb4E9LlMfPHU5kL0usJ+84CNpPXjoTj1xamU8V2oWPSjkQL2DFZo82NREPaqkrbxFVPq8JiMlvayybLzn4Zm9GiEGvf1dPr0rC3q7sUx2uhn/oD34kLG8TFWAPKsoWr2/vu682R09vG+uOj1ihb08CrFYPbGRgL2XCFg7Q46cvWgTkjwuEbq8obt4PeBPGT1ZaLc7lQzHu7N7HD2oiqG9ZqD9PLeO6TyyLV48TSZoPZV5Nz3NVb+8Hw7xuyAQIz1UwtA7q5PHPPriGD3dfo07unzlvPq74bxV6Dm6LaRXPat+lLyDxrK8arIjO3el7Tx/cww8Ab29vNOUlj10mAU9OAIcPPJ6uTzpFD+9boPpvNtKg71T8oQ9x3OAPPBbLzwYUDO8hTJUPDyMVL0az/M8PR+ovDrT2Dtiojq9yI+kPAjZkzybNv27EVVZvJvnGL3dEmk9eeXcPNp0gbyBLxs8jAhuPL6TWjzHety75SOPuNf+a7yGsBe9wNQTPVgTHjsoCnU9JDYQvY/TsTqSqc885RckuUPZyLyKjD695zgJPXNAlDydg/y8N5QWvT+gA7uQjIw8BpzNvDa4wjzXTO47OZqivArajT1GY9c8g3SwPPtUqTzRCga8akAWO36NEb0wHJm8wm2/PIm4VbzMR1i6DnFau5isPb37xJM9q6OoOlw8T705tJC8ncB9O9yAqLxd+Y27EvTBO9LuPDsAXhi9JXRSOg8/QbzNb5s8Ln+kPfjd2zsankg9070BvSiJoD3VlTq8qMj9vF2e3zv49jQ9LElHPQNjOLtMeAG9fjc5vSuHA7xHO+85umYmPBk1LDzyUVM88HcDvTCqjTtRSWO98L8ZPQ25Dr2xkHM94KgtPRUoEb2p3v+83qW2PBpMD70d3xe92j9+vb8agjyIb028J+OFvBGeRL1bERS9DGMUvRviFj2AI528HiyQPUQUtr0IfQ+96Fc5O0l9Ar235zo9eKlcvW1N0jwsD5C8joisPcaAtb1OGec8YvAfPVPahjyv1Tm9dT6EvJEhrLx0KkS7wNhpPJ/viry3Cb4812JhOzAs5TzFRAK9v4O7PFn+iLyp4Us92yWCPAQA0ry+dNS8N5etPIR+ML2nV7m7npBtvSyJFD2OZ328A43MPBO6bzzXGKM8nZ5pPRsv+bvm0fY8jYL3PJs1Dj0F/VO87bkx
|
|||
|
|
{"p":"harness-tasks.json","s":193,"e":252,"m":1778951184600.0012,"t":"\"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_save_command_plans_include_formal_domain_event_contract && cargo test -p bridge-runtime block_commands_include_formal_domain_event_contract && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/rust-runtime.test.ts src/lib/documents/page-write-command-adapter.test.ts src/lib/blocks/block-command-adapter.test.ts\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已将 page.body.saved、block.patched、block.moved、block.embedded 切到 formal domainEventPlan payload schema;复合命令 streamDelta 使用 resync_required 保守策略,command log/domain event 通过同一 command_id 关联;目标验证通过。\",\n \"timestamp\": \"2026-04-27T00:09:12Z\"\n }\n ],\n \"completed_at\": \"2026-04-27T00:09:12Z\"\n },\n {\n \"id\": \"task-008\",\n \"title\": \"Phase N:继续收薄 3000 Next route 过渡职责\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-007\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/commands/route.test.ts src/lib/tree-stream/tree-delta.test.ts && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 2,\n \"total\": 2,\n \"description\": \"Phase N route thinning manifest 与 task112 iframe-ready smoke 同步已完成;刷新本地 Convex functions 后 move treeWriteOperation 运行态验证通过,目标 Vitest 与 task112 smoke 均通过。\",\n \"timestamp\": \"2026-04-27T00:34:43Z\"\n }\n ],\n \"completed_at\": \"2026-04-27T00:34:43Z\"\n },\n {\n \"id\": \"task-009\",\n \"title\": \"Phase O:搜索语义 hardening 与资源类型 fixture 补齐\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-008\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",","v":"/tPvPKtuqDwEg0C+qwQ+Ozhcqj2SD2a9dFBbu4p92DzIL6O8k1TbvP7Gq70NNKc83aaJPPMFgbvS1iK8RdhYvaHhxjy85Hq93A1BOz4up7ysxiA90dhRvW80PL0Jkmm9DREjPfrbdz0cl568w5z8PGkuir0Z+x49s8aJPc1H97xXXDO97aJUvfcCY7wk81m9m0ElvdsR5Lw34q05t1cVO7m6OTxKx8u8VXyTPGrhT72wcd+8K8dFvIOhGj1mzxY9YyJ/PXslR72RMZM7ZeeXvH0d3zycLC+996OdPWfIjD3PTIa91USZu5iGpTsvNn29a/HMPD+fSbz6T9e7H4sNPTRdpjyLFQG7yB70vK8NFj0sAuQ85RiIvHgwjT02YwC9qeHAvDUYa71/N0W7LH4kPXhoYrygNUu9+/eGO4lVRj0RXvQ8kCAFvSZVaz0uRR66qqDHO8Ok1DzQl9a8oFwQuktxZr2x5qE9o1ulPBFGujtTkay7rCyuvED76bwsarE8XxKxvLMRTjwY+gy9/UEhPRzDoTq7/7i8AH0svKKDaLyRjYq8iH+EO4fwUTyvIYs8lsbQPCStNTzfc5+8ItNDPNI/+byesje9LWbrOh3UrLscewc95cWPvErJubw9gEu8DtO0OnDqhL26Yju9aqLwPCFwjTtMrOC8X7IavfA6GjxjnJA8zWzQvPFV0jscb967WtrLvLLOhjyxL7Q8lfa3PJr8hrwDZze97vn2vBP63bxlSBe9BNvaO09YaDzkVT47cUyDO1H/eb1opiY9N6JYPd0Tkb3z5IO8ukoWPCDrUDxti4Y8mtzlu/U/iLsJki69xgGzO+HTULyywt676tSiPVFFv7uZD8A8k4CLvWn+Az04NnW8rXsEvYE9hDsSij49FeQSPcsZCD2SYkm9V3eCvTl44Ltjh+i8ovBvvA4YsTvxY7w8Oai/u2x6yzy54hq8OElDPYs4nr1odR49b/wCPXd7Ur204C68bPIqPeiiHb18D2+9mTrzvAWfv7uXhYq8ahb0vBAQzbwDcCm9HaZXvc/wiD0V0g69ipWFPWmuaL3EFv+8PyXHPFQITr1NM/A8H/FMvQosOj1/SQ+9ku6cPTfAjLwEzUU9fnEZPSIn3jxwpji99jnQO+qoXDzo2we9gRgHvNdccDwTGW88wncRPJzsUj2acaq8hPisPHy6IrxwqGw8FftAO4ddOL0WI8y8dplJPUa1A72LtxO81TknvbUoFzzFCNG7ycccvGKIDT3f4vi7xiOFPJXw3zmiAQU9ohztOCa8dT1V2nu8VeW3PH2lSL2rftW8wEc/vUF28LuNYmY7wNmTPawP
|
|||
|
|
{"p":"harness-tasks.json","s":241,"e":300,"m":1778951184600.0012,"t":"},\n {\n \"id\": \"task-009\",\n \"title\": \"Phase O:搜索语义 hardening 与资源类型 fixture 补齐\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-008\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"6d89f5ca\",\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/tree-stream/tree-delta.test.ts\",\n \"timeout_seconds\": 1800\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已补 file_tree 搜索 hardening 前端契约:projection-client 固定 maxResults=80、祖先补全/排序/异步可见性元数据,tree-delta fixture 覆盖 index、asset-folder、mindmap child、book、pdf;目标验证与 task112 smoke 通过。\",\n \"timestamp\": \"2026-04-27T00:41:58Z\"\n }\n ],\n \"completed_at\": \"2026-04-27T00:41:58Z\"\n },\n {\n \"id\": \"task-010\",\n \"title\": \"Phase P-0:补 final DOM shell 负向门禁,阻止 iframe_srcdoc 被误判为完成\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-009\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/components/sidebar/tree-shell-host*.test.tsx\",\n \"wolai-frontend/src/components/sidebar/tree-shell-iframe-host.test.tsx\",\n \"scripts/task112-tree-rust-family-regression-smoke.js\",\n \"scripts/task113-picker-keyboard-regression-smoke.js\"\n ],\n \"acceptance\": [\n \"默认 page/filetree/picker 主路径测试不得再把 srcDoc inline DOM shell 作为成功条件\",\n \"默认主路径测试不得出现 data-tree-browser-bridge=\\\"iframe_srcdoc\\\" 正向断言\",\n \"旧 TreeShellIframeHost 的 srcdoc 合同测试必须迁入 legacy/debug 分组或显式标注为 legacy\",\n \"task112/task113 smoke 需要验证新 Rust/WASM DOM shell 主路径,而不是证明旧 inline iframe host 继续可用\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null","v":"qvyRPYrHerobGCS+OP06vSf8kz0J8LK9Zz5YPPzQwzyoThw7mLtRvUUeMb0bEwA9BlsGPcXBkjx8Lum8LKdFvQGSvjzX+D69f7jTPJSg1bxYSZA8xNoTvVl6Qb0Nx0W9MTv8PLHyjj0LIKY8dBYtPZxss7zT57s7TQSgPZIYJD0EDU290uCIvTUUe72jjuk7s6xaPMzYbDphea88oWHNvOyBbzyGcgG9YsGQPVXcsr3Gv+y7jh28vOfIGj0FYTw9iPlBPTXrKr21nXA6aqhTvdaZHjwAEIa929BCPUlFOj0FBwq7hR3hOmtyd7vl0iy95gYMPXh+5Dy4Doa8xIN1PfFBbjyQPLm7VUEpu7912zy81YE8kHGBPKcFXD2WB++7YhO2PPS8sLyYS7+8qGgnPdIj+rz0WEW6s83cPDBXBTxNDSs9RREiPFL5ND26jbI8Xx8PPXO4MDyHWri81ctYu4pHgL1SVKU9e8edPasYrTy/AcC81m1SvOUBOr3LlwM7BOyCupLcKDyzr129ux5PPZ3L6jtyGku9B8eXvLLHU7yZZAk8qz0xPRAFELwliKo80tgZunx8QDyss4C8xCf9PGsOcL2uiWu9pWuaPVHQIL0pDkk9hUi9vCi9jr3Tce48RuESPcWDPr0eGY68HVoiPCVx2zy7hsG8J1IXvbi2wDyiJKY6bgBSvRrjXjzSgoI8Lz57vKTGZj0rWeY84JsiPSLS7rzNR7y8MTv+u6r9srw/Fhq9okwIPepiRrvLupM7QjmnPIyxDr2wh1s96OHAPNTsrr3yLFO8KHxZPNpfnrsLZJm7H3wpvV64Dz15xEW90yoTPE+1g7yUD2e8pGqAPa4qXTyMZvI8nOTEvHnARD3sTQ06UUEjvX02uTv304M9TheoPJtOCT3gtZK9lFBgveTYuDx3U5G8/RUOPOMDRD3/goc8tsSAO+YPRz2vTcy79uApPSfAMr28ttg8yYNkvErxQb03Sya9qyEyPN78Qb3QKfe8TQUdvQlvIzwN2ey8+mOVvCNzrLxCUum8XNKKvSDGujyNykC9AR1nPbugEr01PSC9xbI2PDURmbzVgHs9QqeAvSdkgDxcERO9xjNGPXcnDr3PluQ8dkgyPR6LWDw78gM6
|
|||
|
|
{"p":"harness-tasks.json","s":289,"e":348,"m":1778951184600.0012,"t":"\"acceptance\": [\n \"默认 page/filetree/picker 主路径测试不得再把 srcDoc inline DOM shell 作为成功条件\",\n \"默认主路径测试不得出现 data-tree-browser-bridge=\\\"iframe_srcdoc\\\" 正向断言\",\n \"旧 TreeShellIframeHost 的 srcdoc 合同测试必须迁入 legacy/debug 分组或显式标注为 legacy\",\n \"task112/task113 smoke 需要验证新 Rust/WASM DOM shell 主路径,而不是证明旧 inline iframe host 继续可用\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 4,\n \"description\": \"已新增默认非 iframe rust_wasm_dom_shell_host 与共享 DOM projection model,legacy iframe 改为显式环境开关。\",\n \"timestamp\": \"2026-04-28T03:28:16.005752Z\"\n },\n {\n \"step\": 2,\n \"total\": 4,\n \"description\": \"tree-shell-surface 与 legacy iframe host 目标 Vitest 通过;默认主路径断言已切成 rust_wasm_dom_shell_host 且负向排除 iframe_srcdoc。\",\n \"timestamp\": \"2026-04-28T03:34:10.533972Z\"\n },\n {\n \"step\": 3,\n \"total\": 4,\n \"description\": \"move/embed picker 测试已切到 DOM shell;默认 picker 不再以 iframe postMessage 为成功条件,目标前端 Vitest 29 项通过。\",\n \"timestamp\": \"2026-04-28T03:36:24.605315Z\"\n },\n {\n \"step\": 4,\n \"total\": 4,\n \"description\": \"已补默认 DOM shell 负向门禁:tree-shell-host/surface/picker 测试与 smoke 默认拒绝 iframe_srcdoc 成功路径。\",\n \"timestamp\": \"2026-04-28T04:40:14Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T04:40:14Z\"\n },\n {\n \"id\": \"task-011\",\n \"title\": \"Phase P-1:拆分默认 Rust DOM shell host 与 legacy TreeShellIframeHost\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-010\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/components/sidebar/tree-shell-host.tsx\",\n \"wolai-frontend/src/components/sidebar/tree-shell-iframe-host.tsx\",\n \"wolai-frontend/src/components/sidebar/tree-shell-*.test.tsx\"\n ],\n \"acceptance\": [","v":"pVP3OxykID113SK+/HdYvelzSj0EuoS9ii5WPFvo9zx/SZO8VEY6vfsXq7zSukk9zeg1PTtiAj19qT08uXf2vJ0LpTyLNKi9kQ1kO6gvubwMXJK89sj9vLYxqr2pJ6i8YXeePdICBz1WCKg7p+YiPdkm3ryxNgM9BedFPbVJzTsGO6c72d+5vMqKt7y3ZFW9zO8ivI5QHb0q1+c8M2LpvFC9e7y8g+M7cbgvPZhvP71sVkk9iQZQvKWbZD0piQw93i13PclIxb2sx/471OiWvSUfEj3l5AS9hr4bPZs5Iz0DR9W8Dlk9Pfq6kzvIDfq8MCo3u++LzDzQ63q8UWEiPQYlHT3FHNs8NwHXPDoiHj17VyI9Y6qMvC/cGj1du7K6t+k6vfYff7z5vzo6Z3kfO7i/Gb1zD1y97FicO9c5+DyMzCI9GFQRvdswFD3qzaE8PywjPDIYpLtzs4G7PiGaPCW06Lx+bqE9XNFvPEW8Yjw4Qkm9kpq5PHaJUr05uS08ytYzvSU6p7zy9FO95kH1vLXtEz096hS95HufvPw3mzzJiaQ8+vNmPRaAurw+kcY8EBArPNGb3Lwp7zC9UYI4PHy/ujt+y6m9BGuyPb3QNL1JAg898Bgcvb8uVrwxSVI9fB/2PIgnSL2HbyK8v8wiPawiMj2e2zi9vY5xvdEa4js9MHo8fyAQvdnTn7x0qOI7MpFZuQrxgT2Y0BU9Kxf1PMWmF733m7G8NpPmPNox5ry8iAS8WRlpPAi3Rrw70788SW4ju63U47ySoxM9Rt8OPYh8eb00Fs2856Shu0pNVTx3c8U8abrzPG//brsKv3u9r72+PDQmKbukg8e6cjfNPZrZYD0iWBs9WRaOvFcNUz0tBgU9j+gOvfdscjzDXMI8Dj9yPZ3trbuKupi8gxgNvRBvKDwIyK+8oH6JuVaHJL10LPs8neErOwZGlTw3UYA5EFDbPK7757x0oTc9BdyEvPewZb0o24S9uM0EPUQ
|
|||
|
|
{"p":"harness-tasks.json","s":337,"e":396,"m":1778951184600.0012,"t":"\"task-010\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/components/sidebar/tree-shell-host.tsx\",\n \"wolai-frontend/src/components/sidebar/tree-shell-iframe-host.tsx\",\n \"wolai-frontend/src/components/sidebar/tree-shell-*.test.tsx\"\n ],\n \"acceptance\": [\n \"TreeShellHost 默认选择 rust_wasm_dom_shell_host 或等价新 host\",\n \"TreeShellIframeHost 改为 LegacyTreeShellIframeHost 或显式 legacy/debug host\",\n \"旧 iframe srcdoc host 只能通过 debug/legacy flag 进入\",\n \"默认 page tree 首屏不依赖 LOCAL_TREE_SHELL_TEMPLATE\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/sidebar/tree-shell-iframe-host.test.tsx\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"TreeShellHost 默认选择 rust_wasm_dom_shell_host;TreeShellIframeHost 仅由 NEXT_PUBLIC_TREE_SHELL_LEGACY_IFRAME_HOST=1 进入。\",\n \"timestamp\": \"2026-04-28T04:40:14Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T04:40:14Z\"\n },\n {\n \"id\": \"task-012\",\n \"title\": \"Phase Q:page / picker / filetree 迁入 Rust/WASM DOM shell 主路径\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-011\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",\n \"scope\": [\n \"rust/crates/tree-shell-runtime-wasm\",\n \"rust/crates/mnote-web/src/tree_shell\",\n \"wolai-frontend/src/components/sidebar\"\n ],\n \"acceptance\": [\n \"page tree 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件\",\n \"picker 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件\",\n \"filetree 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件,并保留 doc/index/asset-folder/asset 能力\",\n \"3000 host 只保留挂载、auth、transport、文件读取、postMessage/command bridge\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_shell && cargo test -p tree-shell-runtime-wasm -- --nocapture && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/documents/move-embed-picker-dialog.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js\",","v":"Y9JLPGzG5Tx3MQu+ah+ROrCifz3pIFi99/zkPAGW0jyY/2G8X2CDvEq9ab3agFI9clkPPYHn9Tzlqg68vprovKhO5zy3BlW9GJ82vEQ6Cb0gcLs8vqI9vaLX7rxLwJm8UEREPR9eHT0KTKa7FnwwPQ1eYbzHnSU9OYBYPS0e2rwxQPm8ge3vvFwAJLyLKzG9hQs5vB7GK70upVQ82ImTPBTiWryfG5G9elgGPVO3lr0K88S8GwW3vBhSQT2X3pM8t14yPYN8Mb3kICA6RCylvcSy7jypDxO9mMAKPa2UFj2DuUi9lLuXPKbYFj3G9z+9kS3HPMXmWTxLLhC8FY3lPOuI1rvN/HE8WtMYPLxlzDxdkQc9QMALOwKejD05lP686dHzvA0eXrwa8wE7pjJ/O5OSs7zZmX69PCOGvF8HhDzuCLI9cKl3vcdLgz29diI7MzXgPDbnijy9fFe9taztPPOGw7we+r89oqQmPW7sBj3DjnK8U9P7vL9EBL2/Rdw8KgFdvXZFhrs7vbO8/ZZQPK8FwDxUsQu9edKEvPS0jrzWw7w8s7NjPbo9Oryekc88+pOau865BTxX19O82+CoPML3Xb0tK4u93+wtPfDhbTv790c9eCT3vN5dkrywqYc8vasSOmDzcr38ft28q4z5O1b5jjy75iS9FY8/vcb2NzvitEA9eQE9OkhGMTyxcUM8YFBAvGk5Qz0dsW488B9wPD/2qLxV7C69tIMcPeuXlry+tG+82abiPAvdmLxOZcI8Z2E0PMboQ
|
|||
|
|
{"p":"harness-tasks.json","s":385,"e":444,"m":1778951184600.0012,"t":"\"rust/crates/tree-shell-runtime-wasm\",\n \"rust/crates/mnote-web/src/tree_shell\",\n \"wolai-frontend/src/components/sidebar\"\n ],\n \"acceptance\": [\n \"page tree 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件\",\n \"picker 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件\",\n \"filetree 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件,并保留 doc/index/asset-folder/asset 能力\",\n \"3000 host 只保留挂载、auth、transport、文件读取、postMessage/command bridge\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_shell && cargo test -p tree-shell-runtime-wasm -- --nocapture && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/documents/move-embed-picker-dialog.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"page / filetree / picker 默认 DOM host 已消费 TreeShellRuntimeRequest/Result,并由 WASM artifact 或同源 Rust seam 驱动 hostEvents/commandEvents。\",\n \"timestamp\": \"2026-04-28T04:40:14Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T04:40:14Z\"\n },\n {\n \"id\": \"task-013\",\n \"title\": \"Phase R/S:删除默认 JS DOM state machine 并完成文档收口\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-012\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/components/sidebar\",\n \"design/04-tree-domain/process\",\n \"design/04-tree-domain/done\"\n ],\n \"acceptance\": [\n \"默认主路径不再调用 LOCAL_TREE_SHELL_TEMPLATE、buildInlinePageTreeHtml、buildInlineFileTreeHtml、buildInlinePickerHtml\",\n \"默认主路径不再标注 data-tree-browser-bridge=\\\"iframe_srcdoc\\\"\",\n \"旧 JS fallback reducer/state machine 只在 legacy/debug host 中存在\",\n \"4-11、4-16、4-18 的 final DOM shell gate 按真实代码完成状态更新\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/documents/move-embed-picker-dialog.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js && git diff --check -- wolai-frontend/src/components/sidebar design/04-tree-domain\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [","v":"llP2O7bYxjxfXSK+o5wPvcIRjT0meYq9pPnmO2dlUjzyxRy8dSN7vFuvBL2elo89iokkPTBc1zyKTBq8voONvZbVkjyiOEG9PBo/PEjUF72AAB68SaHtvIf2Fb0R1968RJedPWpshj02GmE64edoPUAb/Lv7BFw9QDU3PUHuW7zblMw8Zq7hvHMso7zwUyy9TVQhvfrmK72C5yg9nxG5O9MvCbwaj6i8Z2InPTlOEb0F++u7QEGxvGjpHT2gBwQ9sUFMPTqtkL2u0S87YUquvW2QJD2C4iC9/ppUPa2h1ToDyt27fNWPPE9pAD2BY3y9l/SqO95BZT2OBM88TfR4PS2WMT2rAJQ8AW3zPMjn7TykhEM9+g+avLV3nD0/SBq8VeusvJu2R7xdvqA8eQvgPDvSF735wei8iDLWvApgJT3cu1s9JTF3vdXxKz2ZnL47d6/wuwP2JTy2++K8m/MvvIuUU71uBnE9epgIPUk4Jrv+ZXc84Je2PGYKIr2u0E08+Ms5vT4Fo7zpYUu9Tn1gvCgojjshUDy8Hc+uvBIWUzzZLTc9rRJCPer73rygRso8JzECPUJxIL0RquG8pAITPJPQ3bwmFGS9iowqPWNnG
|
|||
|
|
{"p":"harness-tasks.json","s":433,"e":492,"m":1778951184600.0012,"t":"\"旧 JS fallback reducer/state machine 只在 legacy/debug host 中存在\",\n \"4-11、4-16、4-18 的 final DOM shell gate 按真实代码完成状态更新\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/documents/move-embed-picker-dialog.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js && git diff --check -- wolai-frontend/src/components/sidebar design/04-tree-domain\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已清理 1.md、4-11、4-16、4-18 的 final DOM shell 口径;旧 JS renderer/state machine 只作为 legacy iframe host 保留。\",\n \"timestamp\": \"2026-04-28T04:40:14Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T04:40:14Z\"\n },\n {\n \"id\": \"task-014\",\n \"title\": \"Phase L2:删除 normalizedMove fallback,强制 move 主写路径使用 treeWriteOperation\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-013\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"scope\": [\n \"rust/crates/bridge-runtime/src/lib.rs\",\n \"wolai-frontend/convex/documents.ts\",\n \"wolai-frontend/convex/_utils/documentMoveOrder.ts\",\n \"wolai-frontend/src/lib/documents/rust-runtime.ts\",\n \"wolai-frontend/src/lib/documents/*move*test.ts\",\n \"wolai-frontend/src/lib/documents/rust-runtime.test.ts\"\n ],\n \"acceptance\": [\n \"bridge-runtime 不再输出 normalizedMove 作为 documents.move 参数\",\n \"Convex documents.move 不再接受 normalizedMove fallback;缺少 treeWriteOperation 时显式拒绝\",\n \"TS Rust mutation transport 不再透传 normalizedMove\",\n \"相关测试改为验证 treeWriteOperation 是唯一主写入计划\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/document-move-order.test.ts src/lib/documents/document-move-order-convex.test.ts src/lib/documents/rust-runtime.test.ts src/app/api/tree/commands/route.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已删除 normalizedMove fallback:Rust plan 不再输出 normalizedMove,TS transport 强制 treeWriteOperation,Convex documents.move 只接受 treeWriteOperation;目标 Rust/Vitest 通过。\",","v":"kYQmPa1qCj1d4iC+GywevRKpmD3Jciu9WL6PPJwRCT1/Doc8iCCHvfJfn73FYRo9/3VkPO4uBz3xi9q7jnYBvdfJi7wxeo68c5J2O8v7HL3lqk48Kam4vLrXmL2HQYa8Y1C2PeSuOT2Mlju9w9ozPfa6GrvS9gc9bMDOPfAe47wGrly8/hACvSQpT73YBTO99+pcvMts47xWwbo7C2eVPOVYEj0J0eK7DU0tO9+mUr1/l608+sisud4zej3R88W8MaREPRtWpL2EnW68TausvQDvwzxKCyC9IncWPV/ACLxG3KS97ViDPem0QDuxhmC9VDyjPAbRxDyoV2K8zSY8Pef9Bj2booe8xrNPvBAO5Dx9RtY8GnvivEpClzxDXoQ8bawevfubCr3Uf5U8pq/PPCE3OL14xw+9y+/+u5BXG7t4vEM9dkwJvZtUjz3oXco8wFgMPa8Bvjy8NEy9IdEPOhULm71+fGs9uhT1OsXRkDuDX3M7dxwpvBZAMr3UhG08uwOOvLTkSDtT2DK86cHavB/nBLz9k/i8TO6bOgoI0LwwYAc8LiG0PeMjA7wqL9w74UoiPNVknDzJRTC9gmALu+1Dw7zDwxS9ce3CPFs8kLwSlH49whnBu77jErx9wGk8biSOO0Fep7yAA7C8Pu3fPIr5Rz3BxGy8rNqvvQBUaTwzQG080PYrPIpUzLzUqku8Tz/pvBC0Dj3GyRI9HYcFPaOGtrs4zP28Pu2Z
|
|||
|
|
{"p":"harness-tasks.json","s":481,"e":540,"m":1778951184600.0012,"t":"\"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/document-move-order.test.ts src/lib/documents/document-move-order-convex.test.ts src/lib/documents/rust-runtime.test.ts src/app/api/tree/commands/route.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已删除 normalizedMove fallback:Rust plan 不再输出 normalizedMove,TS transport 强制 treeWriteOperation,Convex documents.move 只接受 treeWriteOperation;目标 Rust/Vitest 通过。\",\n \"timestamp\": \"2026-04-28T06:37:40Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T06:37:40Z\"\n },\n {\n \"id\": \"task-015\",\n \"title\": \"Phase M2:定稿 document.snapshot.saved 独立事件并避免与 page.body.saved payload 重叠\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-014\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"scope\": [\n \"rust/crates/bridge-runtime/src/lib.rs\",\n \"wolai-frontend/src/lib/documents/rust-runtime.ts\",\n \"wolai-frontend/src/lib/documents/bridge-log.ts\",\n \"wolai-frontend/src/lib/documents/*test.ts\"\n ],\n \"acceptance\": [\n \"page.body.saved 保留正文保存事件语义\",\n \"snapshot 版本/hash/updatedAt 拆入 document.snapshot.saved 独立 domain event plan 或 artifact plan\",\n \"SSE 对 snapshot 独立事件有明确 resync 或 noop 策略\",\n \"测试覆盖两个事件不再 payload 重叠\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_save_command_plans_include_formal_domain_event_contract && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/rust-runtime.test.ts src/lib/documents/bridge-log.test.ts src/lib/documents/page-write-command-adapter.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已将 page.body.saved 与 document.snapshot.saved 拆成 domainEventPlans 双事件;artifact writer 支持 domainEvents 批量落库,page.body.saved payload 不再夹带 snapshot。\",\n \"timestamp\": \"2026-04-28T07:44:37Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T07:44:37Z\"\n },\n {","v":"c2PBPErk17we/Ta+QodCvIBppj3QC1y9rtYqPPCq/Lx9N9G7ehWQvJO4n730ZxA991yaOwXpDrwrO4O8Wz2FvfwkbzxQ4e68N+5Zu/aXM72xukQ9KTwmu+cQObxDJoS7xLksPSYAMT0z3D+7MUMkPZ4kLr36wq07bNa3PZWM2zuW3hm9yZE+veIeXr3GZIK9E5VwvTege728Jjk9drzLPHQiRrygw2K8vIYHPLIzir0YJgc9fo0JvdD0BT2j1vW7574APU4mEr038Sk8tluYvR0GwzsAk9i7v4BoPdtv7zwwLRs8l61/u1qzDD3h/269TETCPGZ00zxRlXw8N7AfPQ7Thj3xByg8PKn6vC6OoTsFU8k8C8q6uxM8Rj23sxW86Gu3u1nBgr2Vzwm8v+dTPSZw0Lx9+xK9sVeFvG68oTzWKpw8vtP/vJgjhz3iO2Y9pZdLvBVkFDs7rRK9cC+ZvEzAn710bD09mW0FPUP4WTnBt+a6dfWWO2z1DL1Mh588HAGAvdCdNLz13Ta9D8Dfu2YxXbzQjh696h80PEN+gryTtBg9IvM5PJ5OIbyp7+E8sHGIPLlwory44sm8pf1yO8s/Cr3maTm9YeY8PeQOP7vixJE9lM3OvFhy0Ly8xAU85XBdvLINtbx2uga9Z4zrPLhnUz2NSsu8u4uAvbHcjzsH3eI8J2vxPMZjQrud5Zs7ULOxvMM7VT3ylqQ8uaeAPNKGbbwAZQe9FZBWPOPiF71BqaQ5ZrEnO96idbwt8s67z6iIvAhaWb2k0II9X8kcPXZqpb0Phd283s+euuAEDT2VXYO8jBAKPSOxAz1XgRC9zy37O/kUQ7tUo5Q7lbiKPWT2bjyESYc7lj9uvQ2ejT1GQQW8LkqsvLi8Qztqxkg9H5g3Pcl2GTz0HUq93haTvWibKrzKVPM8kc44PCixvbyZ/eM89tWMO6F4IDwyFkW9xfvwPLfotrxATSg9mO4ZvFD9db1Sbke98mxoPH13Db2YMwm9j/JLvVCVjTzeGJW8742ovFp5Qb0ZOV68w+eKvTi1Zrw1Zxa9rzEU
|
|||
|
|
{"p":"harness-tasks.json","s":529,"e":588,"m":1778951184600.0012,"t":"\"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已将 page.body.saved 与 document.snapshot.saved 拆成 domainEventPlans 双事件;artifact writer 支持 domainEvents 批量落库,page.body.saved payload 不再夹带 snapshot。\",\n \"timestamp\": \"2026-04-28T07:44:37Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T07:44:37Z\"\n },\n {\n \"id\": \"task-016\",\n \"title\": \"Phase M3:把 snapshot 独立事件接入 Page Aggregate 深层收口文档与客户端边界\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-015\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/components/editor/page-aggregate*\",\n \"wolai-frontend/src/lib/documents/page-aggregate*\",\n \"design/05-editor-mainline/process\",\n \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\"\n ],\n \"acceptance\": [\n \"Page Aggregate 文档明确 page.body.saved 与 document.snapshot.saved 的职责边界\",\n \"客户端 Page Aggregate 状态不再把 snapshot 保存当作正文保存的附带语义\",\n \"4-16 对应 snapshot/Page Aggregate 项可勾选或明确剩余迁移边界\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/page-aggregate-client-state.test.ts src/lib/documents/page-aggregate-builder.test.ts src/lib/documents/page-write-command-adapter.test.ts && git diff --check -- design/04-tree-domain design/05-editor-mainline wolai-frontend/src/components/editor wolai-frontend/src/lib/documents\",\n \"timeout_seconds\": 2400\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已更新 Page Aggregate contract 与 5-6 清单,固定 page.body.saved 与 document.snapshot.saved 的职责边界,并同步 4-16 勾选状态。\",\n \"timestamp\": \"2026-04-28T07:44:37Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T07:44:37Z\"\n },\n {\n \"id\": \"task-017\",\n \"title\": \"Phase N2:将 tree.node.embed 的 pageReference 组装迁到 Page Aggregate / Rust artifact 边界\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-015\"\n ],","v":"FB9hPTcM0Tz5DBG+c9kDvcz3iz3hZDG9db5TPXS0dDwJt2+8xAY5vRkHA70aH4Q7tXBQPSIzkDzH55Q8plwivfhWaTx8egC9g5YPvVt3QTxSKRk9ZHylO6N/Rr336SS8KOCaPYfVij0DZl68rckXPbi6pL2VvAE9WaHBPOoONbwmBJm9t/hgvbF+wDv0taq9225LvWNsY737jPO7x0/oPHAVTD1hEta7/M1VvICpS70ZAVC9BDE0vLKFpD1rnR09FuKyPQtdDr0PIzo9taMPvSz5fTzPOXO9oRXNPbwdgD0qdp482CHnvKcMqzyknoe9LLWrPWM9NT2HWWI8Aao6PZOOvzx9Pfq84wDNvGaA2DoThUo8mbg+vJUfAD2jGfS6tGE3vaPUjjtiIGC87mhdPRwnQr3wToa8lwCePJ2FtDyiqIO82rjXu64IPD0nJWA9XBAdPYxu+zyvKBe9LZABvTLRpL1ejVc9o+eSPIiYC70OlPi8ZIsAvQ6inbxZwyY82MKhOzcsXTy3eQO9zy8KPAzvXDxFwwu98UHTvFW+/bvzNCE9sw0BPZom5rw7loo7R0SIvDhlXruIwzC8TqYIPV8GyrzMR627ZxlTPeQQ0rvv6cE973QivXDnD73auk49gJjZvCWuFL0MDhW9R1bXPJOfTry1ius8QAjwvIWHO7z1A508p/1zvKJOETzeMLe8MHbtvOl6WDzGd5U9LqAxPTuUoLojrAO9t4bFPGaInrx/rZG8xRmgPLn9p7y6P8M6m/wBPJkoQ72yGkY9NocEPZ2mLr1/z2k8UOJvvNChq7zZm6e8jiS5PHcUZDyf1JW8HZ26vODr37vf3vI8AO+TPVKiDDz950E9DFpqveUXiD1wqAC6i4qivM/4sbvLnAg9aavYO7mmjzurPNu8YALTvKq5Wbzwae28jIOwPCHPxTvZPQM80QuovOmWZDyk9Fy9xf8zPfAF17xUY1s9SpPuPGG/EL08j0i96e6EPAr+hbzF4AS8HOhmvVD5NzzYWqE6KXgHvW65g72SI9+85aVTvbaucj09iom9C5umPDmegL27WEq9S7A+PFbRsb1Qy6c817CmveBLlzvINeK8dMCdPYzIeb3kP7K7/CpkPbhPKT1P86S8aczxPL3Cpbtr6da6u4dZPKZvqrsU/cG7aWjnu893Rj37JKi8jB8mPM/+iLwQ5Wk9YPg4vAkgrrwO8qq8G
|
|||
|
|
{"p":"harness-tasks.json","s":577,"e":636,"m":1778951184600.0012,"t":"}\n ],\n \"completed_at\": \"2026-04-28T07:44:37Z\"\n },\n {\n \"id\": \"task-017\",\n \"title\": \"Phase N2:将 tree.node.embed 的 pageReference 组装迁到 Page Aggregate / Rust artifact 边界\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-015\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"scope\": [\n \"rust/crates/bridge-runtime/src/lib.rs\",\n \"wolai-frontend/src/app/api/tree/commands/route.ts\",\n \"wolai-frontend/src/lib/documents/page-command-adapter.ts\",\n \"wolai-frontend/src/lib/tree-route-boundary.ts\",\n \"wolai-frontend/src/app/api/tree/commands/route.test.ts\"\n ],\n \"acceptance\": [\n \"3000 route 不再本地决定 pageReference block 的结构与插入位置语义\",\n \"Rust plan 或 Page Aggregate artifact 接收 source/target/anchor/content snapshot 并产出 next content 或 block patch plan\",\n \"tree-route-boundary manifest 移除该 compatPending 项\",\n \"测试覆盖 tree.node.embed 的 pageReference 组装来源已迁移\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_embed_command_plan_maps_to_documents_update_content tree_embed_and_copy_aliases_keep_tree_command_names && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/commands/route.test.ts src/lib/tree-route-boundary.test.ts src/lib/documents/rust-runtime.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 Rust pageAggregateEmbedPlan;3000 route 与 documents.embed adapter 只传 source/target/anchor/content snapshot preflight,不再本地决定 pageReference block 结构与插入位置。\",\n \"timestamp\": \"2026-04-28T07:44:37Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T07:44:37Z\"\n },\n {\n \"id\": \"task-018\",\n \"title\": \"Phase O2:补 file_tree 搜索索引可见性指标边界并收口 4-16\",\n \"status\": \"completed\",\n \"priority\": \"P2\",\n \"depends_on\": [\n \"task-014\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"scope\": [","v":"+bglPGJh1rtBcCa+pZkLvfqbsD3kv7O9ezW7PD6LuTwFjXG8o3QVvZ/8d72h9fo8JekdPR3Ni7ou+h27lPIBvdq5Fjy5zhW9LEMZPOqz1rwvCZk8YPPHvH8fu7xDnqI8VMZKPXCgTDwQKw09oA/UO0emHr3lrr07AWZhPVUvibzHGlK9AIftvBpPD727Xze9MLjjvGLApLxb5Jg9ThkGvHtEuDwNCJo6s6EvO2mcoL18na28HLzQvIKBST3+8JA8ThygPQK2/7za2jA8DsifO4auIjxjRMe8VuWUPZ/OmT3+P5W8QE3UO886QTy6J1q94zjMPLN2Zj0o+H68T6+XPd2GQz10jPO7pXwivKHREj1y9d08xXqRPAYFRj1vM6S8l+MAvHTcg7wsPtK8l+lAPWMeNbz4K0G84lSxuxpNDD0R8gc8kHMfvbuCRz0eQoU7Xu2mPCLKWDx7gKG8Gf5OvMy9fL316pc9dg4YPWDFsrypBGC9yKoLvSHNs7xQVXg7JoscvagVmzzY3Sm9ZtYJPVA3Ar1ZK9+8dCahvNEJ2bwnwQA9+RoLPUZ4Or3FvwY9SJg1vLwiUD2zP8m7t3w3vO49Mr0VRWa8JSdZPW6EpDyCTIQ9hsUmveh6KLuzqyo857AkOyzCOL1nINi8L2DSPPEvMz0Vu/28aLTRvHDMErtt6da8l5yhOwtH3rrrHgi90Q6QOUUESDzcbiI9TRgHPSNi4rwmSby8jLHIOyRj57uLo1K8Fj6TOxg/wrxAYgY8+Kq+O0Ykv7x1vIE8ggaXPLJavr3CAxq9v0flO7GlSDz/mWe8CawJOzLxGjtejSu9f46XvDtPGrwd8w68PVsePd5C4TxGTAY9W1+RvL4lwD3eVx09hxAivUovozwZzvI8Z2JWPRebSzwrvem8xe5XvZWJvrwjSZO80xQGu8weZTyFcjc969uyPOy7gz3N0488At5LPTnXS70l32A910VhvBflkL2k1BO9CJDcOiMTjr3g+8+8uqEyvbysJDwvGh+8aBw0vSX6sjsWntK7pCcuvWyS5DyRcIq9Ma0FPbFeZL2v4Im7dMZAPco78LwD9389y0nsvI09NzxFKlW9iNanPYPB57w1Lhk9Q88TPb9TAL1YQjW7U+68POXWrTlxZG68fsMuPCxSljpFUSe7K6WZu4H2OD35Y0m9TKLJPGjWH7u10pU8EDC/O+3Tersc6XK8uPnIPH3i
|
|||
|
|
{"p":"harness-tasks.json","s":625,"e":684,"m":1778951184600.0012,"t":"\"id\": \"task-018\",\n \"title\": \"Phase O2:补 file_tree 搜索索引可见性指标边界并收口 4-16\",\n \"status\": \"completed\",\n \"priority\": \"P2\",\n \"depends_on\": [\n \"task-014\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"81ba21c5\",\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"scope\": [\n \"rust/crates/bridge-runtime/src/lib.rs\",\n \"rust/crates/mnote-web/src/routes/kernel.rs\",\n \"wolai-frontend/src/lib/server/kernel-file-tree.ts\",\n \"wolai-frontend/src/app/api/tree/projections/file/route.ts\",\n \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\"\n ],\n \"acceptance\": [\n \"file_tree 搜索 projection 输出稳定 indexing/visibility meta,不再只是临时 request meta\",\n \"3000 同源 projection route 透传该 meta\",\n \"move-embed picker/file tree 搜索可观察 index visibility 状态\",\n \"4-16 中 Phase O 未完成项完成或明确转为非树域 runtime 后续\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime file_tree && cargo test -p mnote-web file_tree_projection && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/projections/file/route.test.ts src/lib/tree-stream/tree-delta.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已把 file_tree 搜索 indexingVisibility 提升为 projection result meta;mnote-web 与 3000 同源 projection route 均透传该指标,4-16 Phase O 已收口。\",\n \"timestamp\": \"2026-04-28T07:44:37Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T07:44:37Z\"\n },\n {\n \"id\": \"task-019\",\n \"title\": \"Phase W-0:冻结 Rust Web 主执行面 owner manifest 与负向门禁\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/lib/rust-web-main-execution-boundary.ts\",\n \"wolai-frontend/src/lib/rust-web-main-execution-boundary.test.ts\",\n \"ARCHITECTURE.md\",\n \"design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md\"\n ],\n \"acceptance\": [","v":"dG4nPIJw2Ll/cBi+SnzIvIxefT10nG69zRXOuZmBBD3ZBNe89iI4vJbaGb36Kx88HkP/POpWWjyouem7fIsgvXcPijzDflO9bMxnPJo4VL31b8M8dF4KPLJI9LxEZCy6+QcSPbiLfjyqSlW8tMclOX9I9LzBDjo984VQPeZObLs18Iq9lc4nvcJLHr2lShm9vjAOPJjMgLwQwR898pkEvLP/Bb2HgUy9VNMOPdKPmb0H5Gg8xFhzve1eNj3lTv88waGlPXtM5bx3mOk81L7hvK3d4TtnQry8JlIiPZ8bhj07J1K9EZC/vMeV4rz1zQu9y9gVPXCkLj0i4nq8JIjuPAfXDj0UupS7auFPvHm/9Dwn0Ik72UCmvCmdkz0hTT68XYWnvD0E37yQDyW9t0kjPeWPEb0fhTm9TqCivCzgHDxqAoU9NHE4vc6NbT1sT7I8qljBO34IrzvGecu7bpMIPQvRaL1wVIY9GMO/PISdrDwFVya9mJt4vOrhTr1gWaw8gwAxvQGKgTr+CSi8aP0EPZmYxbxxsd68vGJrOYEejbzvrh49ZQyNPDO2gbyxGeM8HzQBvY17xzwBJRy81+JIO46Yg72PSYK9Ps+KPZ/KIjv0yYQ9S+iJvZMUA73rzwQ9JDUSOzz2Sr3ldZm8SA8gPBR+MD3Bt0y9LgxavanidjyJbJI8JF3vu2InBTzYeyE8Fy8GvAHkMjzLtSg86DDCPFkW4ryOfBu9Z6tqPOFNQjzwPSe8436Fu4a8IrxAjfY8e+0CPTfiUL1no5c8FDW0PBE5o71rYiS9RYt1u+CMUDz2gAc7r+HGPLvCjDyVWBK9MkOdvOMIgjzbfiW81PttPdhKgDya0Ew9X3RpvD5iyj1j0gE7sL0TvYdmzzyIYT89UGJnPS+bFj03hyy9SKv5vEOOrDz4Q8C8ijD2vBSXm7txMII85LlePG5Yaj2weQU8SdsZPXy4Mb3MtkM9XsJxvMPtmL0zKy+9B7/BOsE34bzh+wa9JCYqvWESITyYGqu83y0ivcuKs7vl2dq8I4+fvfJ0Hjz+aZ69L7kUPW0zzL1OzeS8Zy8QPbghTL0WEIA93CFLvbabCj3LnHm
|
|||
|
|
{"p":"harness-tasks.json","s":673,"e":732,"m":1778951184600.0012,"t":"\"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"wolai-frontend/src/lib/rust-web-main-execution-boundary.ts\",\n \"wolai-frontend/src/lib/rust-web-main-execution-boundary.test.ts\",\n \"ARCHITECTURE.md\",\n \"design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md\"\n ],\n \"acceptance\": [\n \"新增 RUST_WEB_MAIN_EXECUTION_BOUNDARY,固定 publicEntry=3000、mainWebOwner=mnote-web、legacyCompatOwner=next-app-router\",\n \"测试禁止把 Next App Router 写回主 Web owner\",\n \"ARCHITECTURE.md 明确树域完成不等于主 Web 执行面完成\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/rust-web-main-execution-boundary.test.ts src/lib/runtime-config.test.ts && cd /mnt/Data1T/mnote && git diff --check -- ARCHITECTURE.md design/03-rust-web wolai-frontend/src/lib\",\n \"timeout_seconds\": 1800\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 Rust Web 主执行面 owner manifest 与负向门禁,并更新 ARCHITECTURE.md / 3-6 checklist 口径。\",\n \"timestamp\": \"2026-04-28T09:07:58Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T09:07:58Z\"\n },\n {\n \"id\": \"task-020\",\n \"title\": \"Phase W-1:让 mnote-web 默认成为 3000 gateway owner\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-019\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"rust/crates/mnote-web/src/app.rs\",\n \"rust/crates/mnote-web/src/routes/mod.rs\",\n \"rust/crates/mnote-web/src/routes/gateway.rs\",\n \"scripts/desktop-hot.js\",\n \"scripts/desktop-hot.test.js\",\n \"scripts/task114-rust-web-gateway-entry-smoke.js\"\n ],\n \"acceptance\": [\n \"mnote-web 支持 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3000 并作为默认 3000 owner\",\n \"Next dev 默认改为 legacy upstream port,不再拥有 3000\",\n \"task114 smoke 证明 3000 响应来自 Rust gateway 且 3104 不作为公开入口\"\n ],","v":"tvTQPFvNAz1zYja+JTXBu9rLhD2dhQu9p5G9PK28vDzKnr+8YHVSvD7oQr1UBDQ8YytCPC0ykjyyYk+8lgoOvfnnhjxmDz+9QcMtu4d7Tr1drRM9u5FsvWLhjbuLYz+9Ews5PdGrEz1ABi+9yerpPN28fb0x6NE8xsiAPUZg1by7Xju92NcBvTS+VTwaMSm9tMc8vZ2jprxZ+6q8oyifPNmNArwX3ly9TQbYPE+j/rwHVgO8PGV6vKPkIT3JKRg9QWNEPUuiSL0QuQE9kBP4vCmVAj2q1Hi9ojKXPc7SXz0TyYW9S9/WOzQgAD39JZi9VhQUPUH/zTxsPre7XRL7PI6N3jz0l1881eXlvFE3izwEy6s8wMOpvPG/lT2tpS699Qm5vFFfIL1N14i89enLPMQnaLzlZ0y9ptPhOwn/NT334No73aEovSamOD3xACU8z+GNPLN+7zzSJ7O8q2UpPBV1Vb1o/J49On4PPb2X3Ts0vKS8zPWXvD+wRb3o+WE8XJrdvGoDST1iiji9kG8NPViBWLyjsgG8bS42O9UugbwMvYE897wvPcR81TvCdNk8Wrpgu5YUtDzBXaG8haYNvHSXj7w/Vfi8AfzyPMD78TqitF49LgnVvKf4jLx5Gfo5o4JPvBG6Yb3onzq97CvgPKmvNT0frhq9QyHcvCTvMTrd1b88JSoEvXxugTxxvZg7SgMwuzyGYjq1nQU912owPAflIr0lZu+8SByBvFeyATxa/Bq8hACbvK6e4DsBlIy7lBbtPI+HML2eBg09b2QjPcaTi716bmA6IodXPKRAqjxNhsE4K29qPDixFDw7bhO9fnXBvBxGBDc7GRK7Za2oPZPJIDxviYI8LaU3vSbvhz17B+s8xYoTvdTTODzjhD89hxYuPerbDj3HDQC9Bn4Tvdkulbywnpu8+HohvbAqKT1vl548qOvGu9ugpTw6Q6+7//UgPeLrlr1W2SA9thS2PJPIBb0xIZC8koFGPZDKG72sxpC9MPEhvdIFGbs1J+q89xagvEKxIL2nhNu8QEBkvXZKYT3Y2zy95JqXPTkJcr0zQrW8MISQPMI8H70yNFE9wN9Xvc73Ij2jeIO8PJGlPQ5jb7w7MHc9pt//PA25ATsF85C8ZG6UP
|
|||
|
|
{"p":"harness-tasks.json","s":721,"e":780,"m":1778951184600.0012,"t":"\"rust/crates/mnote-web/src/app.rs\",\n \"rust/crates/mnote-web/src/routes/mod.rs\",\n \"rust/crates/mnote-web/src/routes/gateway.rs\",\n \"scripts/desktop-hot.js\",\n \"scripts/desktop-hot.test.js\",\n \"scripts/task114-rust-web-gateway-entry-smoke.js\"\n ],\n \"acceptance\": [\n \"mnote-web 支持 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3000 并作为默认 3000 owner\",\n \"Next dev 默认改为 legacy upstream port,不再拥有 3000\",\n \"task114 smoke 证明 3000 响应来自 Rust gateway 且 3104 不作为公开入口\"\n ],\n \"validation\": {\n \"command\": \"node --test /mnt/Data1T/mnote/scripts/desktop-hot.test.js && cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web gateway && cd /mnt/Data1T/mnote && node scripts/task114-rust-web-gateway-entry-smoke.js\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 mnote-web gateway route/owner header、desktop-hot Rust gateway 默认启动计划与 task114 smoke。\",\n \"timestamp\": \"2026-04-28T09:13:44Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T09:13:44Z\"\n },\n {\n \"id\": \"task-021\",\n \"title\": \"Phase W-2:把 runtime config 与 auth/session handoff 迁到 Rust Web\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-020\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"rust/crates/mnote-web/src/routes/session.rs\",\n \"rust/crates/mnote-web/src/routes/mod.rs\",\n \"wolai-frontend/src/lib/runtime-config.ts\",\n \"wolai-frontend/src/lib/runtime-config.test.ts\",\n \"wolai-frontend/src/app/api/auth/mnote-web-token/route.ts\"\n ],\n \"acceptance\": [\n \"mnote-web 输出 /api/runtime/config、/api/auth/session 与 session refresh/handoff route\",\n \"浏览器 runtime config 不泄漏 internal MNOTE_WEB_* base URL\",\n \"Next /api/auth/mnote-web-token 降级为 compat/debug\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web session && cargo test -p mnote-web runtime_config && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/runtime-config.test.ts src/app/api/auth/mnote-web-token/route.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {","v":"2jsAOgsaEbviMjG+6TlkvPY/hj3QnoG9SJVjPIlTWDzWZXc8AEWnvNw1hr1fJx89HH7sPDCenDs+k3U82ASQvSjouDyvROi8zPdyPCI4hb0P1Ac9cpuOvUZ1TDqK63u9xqppPfsp0LpMrAs7IIASPcVE9bxj7DG8of5gPZMoLbz6kjC9ryTFvFKjobp714a8qAk/vSw1gb2b2Lk7mAOtu2ui5TzbiHC9M8VrPUv4h7z/Pby4HFNmvCTLTzxQWhw9fhf/PK04kr2MmiM9j1Oxve5P5DxjF8C88zU0PaZmGDxot567EQi8PEMQ0LorQzq9sBaPPUCdZz3h2EI80slkPWx0dj36Iac728mRu9ZmKj0qKAc9syrLPJiATz1OYRG99cDDPFZP6bxZejO8Ukm+PAEEITxwV728IHACvIIb+jyBruY8YCPmvCytKj3OeEM7nsbFvCLKG7ypxBO8/szeO84sjb16emo9AXMaPRAkiTzjH5A8W3a2PL3Q9Lz4NlM8WCy7vIzo/7upszu9PWYGPSnrfLxbxRe8Jkf4vDSBxLsO8iE97ML2PK7p/7whFGw913oJPX4XAb1/1VO93HvtO66Ou7wtBAq9tM6NPY99ybv47IU9IjmBvbLDG7weH2Y8n91oPLDOPb1/t4G95AslPS4Qsz1yJRK9BMgdvQ3HAjrC4KM8247SvCAzqztb3as7dL11u3oxbz0/rzG7PtmSPDY1m7wmwoo7HLkFvK/IR7um61o8qhI3vKQAhLyRqHE7+vsrPNp/Rb24HAk9SjvaPOzEg73XChW8TFiSu6bVCj0DJ9i8OwAQPMHeszxJi4C9vtpYvCSuhbt0h6486kTDPXYIbjxghas8ffMuvRE8dj0tEds8PQsrvcvXRDuwty89uz8aPeDIszyZ7Pu8i4uRvM+vBb0jNki8sdu/vC7RqzwfEco8PSuzO54YejzbIkq9AaHNPIvXXrxxtCU9pWfePPWna7wxbUy8EPIiPRgTCr0bn4G9+LW2vfrqV7t8Oka9F7kRvLbQab3BlQC9qu4jvS0fxTyon9K8ObCLPTbbK71V+Mi8/P7yutOMB7yPjyY9L1NJvfi9Hj1xFb28eLaNPZ8evbyAAB49GDBHPUkwiTulEOa8cLAfv
|
|||
|
|
{"p":"harness-tasks.json","s":769,"e":828,"m":1778951184600.0012,"t":"\"wolai-frontend/src/app/api/auth/mnote-web-token/route.ts\"\n ],\n \"acceptance\": [\n \"mnote-web 输出 /api/runtime/config、/api/auth/session 与 session refresh/handoff route\",\n \"浏览器 runtime config 不泄漏 internal MNOTE_WEB_* base URL\",\n \"Next /api/auth/mnote-web-token 降级为 compat/debug\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web session && cargo test -p mnote-web runtime_config && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/runtime-config.test.ts src/app/api/auth/mnote-web-token/route.test.ts\",\n \"timeout_seconds\": 3000\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 mnote-web runtime config/session/refresh routes,并将 Next mnote-web-token route 标记为 compat/debug。\",\n \"timestamp\": \"2026-04-28T09:16:28Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T09:16:28Z\"\n },\n {\n \"id\": \"task-022\",\n \"title\": \"Phase W-3:建立 Rust-owned 文档页 / Page Aggregate server-first shell\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-021\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"rust/crates/mnote-web/src/routes/web_shell.rs\",\n \"rust/crates/mnote-web/src/routes/documents.rs\",\n \"rust/crates/mnote-web/src/routes/mod.rs\",\n \"wolai-frontend/src/components/editor/document-shell.tsx\",\n \"wolai-frontend/src/components/editor/document-content.tsx\",\n \"scripts/task115-rust-web-document-shell-smoke.js\"\n ],\n \"acceptance\": [\n \"mnote-web 输出 /documents/:id server-first shell 与 page aggregate snapshot\",\n \"Next 文档页降级为 legacy compat\",\n \"task115 smoke 证明默认文档页由 Rust shell 服务且不挂载 mnote-web-document-shell iframe\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web document_shell && cargo test -p mnote-web page_aggregate && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/document-content.test.ts src/lib/documents/page-aggregate-builder.test.ts && cd /mnt/Data1T/mnote && node scripts/task115-rust-web-document-shell-smoke.js\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [","v":"dyVyvAvUyzyAGx6+MvMPvU7Joj0oG3G9NtqyPBJq9rtomAU91xAhvctTeL24/Ms8EM8xPWx5STyTXao6CZihve9fBT2fNCK9qyNcvHTurb2DFF880IctvVlrKb3MO4+94XqVPRnG8zygT507ACQTPfhls7wn9QE5cYeMPV57wLziYb472bLCO3WgibzU4bi7AFVFvaIUC73b93w7xyHWubng5DxXoj+8SA2ZPaObF7yzphw9LlcuvZdDBj3zvKc8JqsXPShqVr1/wVy8yoqZvXU6xDty0za8M1JcPWoIRTw4fjc7n0GzPKEpero8mVa9vhJEPYnVhj3DHg07iDNePcGalj2H5168dvMGvCh+Zjx4QEE9ufysPPAldT27j0O8xeLDvJOaqbzEGss8q9fSPCg/pTlvC8G8o3qGumU4PDzm8MQ8/spnvFzINj0xUcw8Zg4GvfWX77zNtYY65yrVvK173r0AOrM9iYHnPODBgLw6s2m8o/FPOlDCVL3BjVa8SHHWvG+Y0rzSLE29ql2WPJlIujwhzQo8mUFOvfemOzyc4RI91orQPIPx5byKMj49Ldi4PGUgwbxoVl+9MBcxPAyQyztbZdy8EGQQPZa1ibwTsHI9swC4vGb1CTxTnQA9rxoIO3FKPr3uPXK9Xj8WPaP0zD05wAy9diE1vRjLRjwy1PY8DL4dvdN26DtJUwM60HIMvYQUDD3elAW6LClRPGkXlrqe0DE6OVLHvJbLtrqcJzc8jEiCuTZbHLwQQJY7cRu4PDHxO7052Ys9XS/HPBPoQb0f6IY85II8u+XmEj1wuay8HM7mO8QzAz0i+G+9nGoDvGz3pTtqCOw8q2aoPY3quDzmVcc7jIDtvJc2cD2ko6W6uVsMvD1vtzxp5jM9LW6SPNw+FD2f3SS7tNeOvI+H67z5b/s7Imf+O3QHmzyqNgM9hZsrPKgLpTxwege8L0q7PIPLa7yhQLk8CjPgOz0GJb2+D+W8tgUEPV+f27zTz4C9EXTbvRtDYTzLW2y9TegavX55qrzG+zq9LXX8vKafnDzV7SC
|
|||
|
|
{"p":"harness-tasks.json","s":817,"e":876,"m":1778951184600.0012,"t":"\"Next 文档页降级为 legacy compat\",\n \"task115 smoke 证明默认文档页由 Rust shell 服务且不挂载 mnote-web-document-shell iframe\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web document_shell && cargo test -p mnote-web page_aggregate && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/document-content.test.ts src/lib/documents/page-aggregate-builder.test.ts && cd /mnt/Data1T/mnote && node scripts/task115-rust-web-document-shell-smoke.js\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已新增 mnote-web /documents/:id shell 与 /api/page-aggregate/:id snapshot contract,并补 task115 smoke。\",\n \"timestamp\": \"2026-04-28T09:20:22Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T09:20:22Z\"\n },\n {\n \"id\": \"task-023\",\n \"title\": \"Phase W-4:把主 API transport 从 Next route 收薄为 Rust Web owned\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-022\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"rust/crates/mnote-web/src/routes/documents.rs\",\n \"rust/crates/mnote-web/src/routes/tree.rs\",\n \"rust/crates/mnote-web/src/routes/search.rs\",\n \"wolai-frontend/src/lib/tree-route-boundary.ts\",\n \"wolai-frontend/src/app/api/documents/route-adapters.test.ts\",\n \"wolai-frontend/src/lib/search/request.test.ts\"\n ],\n \"acceptance\": [\n \"Rust Web owner 覆盖 documents meta/content/save、tree commands/projections 与 search documents transport\",\n \"Next route 只保留 cookie/header 透传和 legacy compat\",\n \"TREE_3000_ROUTE_BOUNDARY_MANIFEST owner 口径改为 rust-web-gateway\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web documents_api && cargo test -p mnote-web tree_commands && cargo test -p mnote-web search && cargo test -p bridge-runtime page_aggregate && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/tree-route-boundary.test.ts src/app/api/documents/route-adapters.test.ts src/lib/search/request.test.ts\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [\n \"[CONFIG] 原验证中的 cargo test -p bridge-runtime page_aggregate 过滤词当前命中 0 项;本任务实际覆盖 documents_api/tree_commands/search 与 route boundary。\"\n ],\n \"checkpoints\": [\n {\n \"step\": 1,","v":"GYfbPEuyBrsy8Cm+wuJtvXvziz08aYK9uqNgu+5gET0TrbA6E6thvRjKP73NCpk8mO5JPbPk3DulJAG8MalVvfB2fLxzCxS9ZbEKvTNKsbzVUyE7/PMsvW9pKL0y+4e9W+mvPfWawTxaWBK8VKHqPFEtorwP1RK9BBiePcshyLuNJSe9piUKvfs+Hr3/wly9QMvsu4XrmbxT1Ns7p4CzPPHjYj2IhbC8MwlEPbrHprwx6/A8beVUvMwIKj06VsU88gppPYWro73yGGO8L4G4vfZfHT3yVcW8lJBuPT+BHD28EVO9ZlqdPLMEgbxk0DG9vdbQPHJaWT0Axq88IeqgPbSqNz0drgm9j+zGvCrYpjxnw/Y8KSY/vGt1Mz2yzf+7p1QtvE8EfLsVaG28d2WEu/TI6rz+OaW8zy6MvMUnET3ljW09I7wevRxRaD1qGCo9r9gcOvdQj7yEn8q8aZHOvGtUV70xwEo9n5MwPbK9tzzxh/Q62V2oPHHwjbwAa/U87gHuvKaDr7w6IT697wgXPftICTuNqQi90NITOoQlpDxDokA84JFsPRy0/btRJQ09Zi3yO8w36bzu+0y933sQu7PSVby/WUu9sXeHPT7v6bx94249fmfUvKCpMr0owYk8Ox97PFT+lb1PuQC8hGVUPa+1cz11W/S89NlMvQe2kTuOTNo8HiH/vJ4maLyHR5o8W+wTvMuYWD0KC8E8fF2gO4oFS71p2Sa7OyNnuybZibyhmVc8Vw24u6IwwbzimxA8xce+PHHWsLy1gyk90RfDPE2rjr3+QQ697K1QvDDRgzwF4K+7GQqcPIfjBD0l52+9syE2
|
|||
|
|
{"p":"harness-tasks.json","s":865,"e":924,"m":1778951184600.0012,"t":"\"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web documents_api && cargo test -p mnote-web tree_commands && cargo test -p mnote-web search && cargo test -p bridge-runtime page_aggregate && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/tree-route-boundary.test.ts src/app/api/documents/route-adapters.test.ts src/lib/search/request.test.ts\",\n \"timeout_seconds\": 3600\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [\n \"[CONFIG] 原验证中的 cargo test -p bridge-runtime page_aggregate 过滤词当前命中 0 项;本任务实际覆盖 documents_api/tree_commands/search 与 route boundary。\"\n ],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"已补 Rust Web search.documents transport、documents owner headers 与 TREE_3000_ROUTE_BOUNDARY rust-web-gateway owner 口径。\",\n \"timestamp\": \"2026-04-28T09:26:14Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T09:26:14Z\"\n },\n {\n \"id\": \"task-024\",\n \"title\": \"Phase W-5:把 tree realtime stream 固定为 Rust Web 主链\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-023\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"rust/crates/mnote-web/src/routes/sse.rs\",\n \"rust/crates/mnote-web/src/routes/stream_support.rs\",\n \"wolai-frontend/src/app/api/mnote-web/stream/route.ts\",\n \"wolai-frontend/src/lib/tree-stream/protocol.ts\",\n \"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts\",\n \"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx\"\n ],\n \"acceptance\": [\n \"Rust Web 输出正式 /api/tree/events snapshot + delta stream\",\n \"/api/mnote-web/stream 降级为 compat alias\",\n \"Sidebar / page tree / file tree consumer 使用 Rust-owned stream\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_realtime && cargo test -p mnote-web stream && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/mnote-web/stream/route.test.ts src/lib/tree-stream/tree-stream.test.ts src/lib/tree-stream/use-sidebar-tree-stream.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js\",\n \"timeout_seconds\": 4200\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"Rust Web /api/tree/events 已固定为 tree realtime stream 主链,输出 rust-web owner、snapshot/delta stream;Next /api/mnote-web/stream 保留 compat alias,consumer URL 指向 /api/tree/events。task112 针对 legacy Chromium renderer crash 仅做一次新 context 恢复。\",\n \"timestamp\": \"2026-04-28T12:33:41Z\"\n }","v":"n2s1OhLsGrydjTm+ypzrvEyGnj1b5Va9L3oaPIJufDuoYcg5YmdOvf+rdL2Dzfo87MsKPWF69TqK5Vy8JoVjvesjiLsWauq88WX4u9FtWb04TiY9U40QvfY3OTz7N5C8gdxjPWGCIz3UrIq8IHwSPba0Q71jNKG7w0iaPcBAeDq48Wy9NNiEvLJpgr0vwUm9t7/WvJKvDb3bHGA8XOw2PV60TT0XniS94Y/XPDnBQr0CXJg7lMxovYUqJz3qQIk83SIdPfzUYb1n+0c7ume2vajDoTzYAse8H5CCPS2CwTyzAwu8kCdCvFSSdDyRzZG97bEAPSKAOT0865U8Yeh6PVqHiT1klP27FqkNvDymtjxBSSM9bnunPFyjXz3MN568l5OMPFXVXb0LRZ47l1W4PL5mG72xSuu8seahvLYR2Dw58x09BK9avPO6ez1qVbk8OSUqvH9jibuC9tG8kfLGvGylWr3EfUc9sBP2PHd9rTzsbpA8V3hkPBtd27w3j6E7SOAivbM3w7x3Esi8hCu0PC10j7zn9rS7DZOeO18URDtZol09xpUKPT7RqryReiI9DwliPC5IUr36nBO9Wfq7O2rW6btnbCy9uVMJPfJh0rtD8
|
|||
|
|
{"p":"harness-tasks.json","s":913,"e":972,"m":1778951184600.0012,"t":"},\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"Rust Web /api/tree/events 已固定为 tree realtime stream 主链,输出 rust-web owner、snapshot/delta stream;Next /api/mnote-web/stream 保留 compat alias,consumer URL 指向 /api/tree/events。task112 针对 legacy Chromium renderer crash 仅做一次新 context 恢复。\",\n \"timestamp\": \"2026-04-28T12:33:41Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T12:33:41Z\"\n },\n {\n \"id\": \"task-025\",\n \"title\": \"Phase W-6:把 Search / AI / Mindmap 页面壳迁到 Rust Web shell + islands\",\n \"status\": \"completed\",\n \"priority\": \"P1\",\n \"depends_on\": [\n \"task-024\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"rust/crates/mnote-web/src/routes/search.rs\",\n \"rust/crates/mnote-web/src/routes/mindmap_shell.rs\",\n \"rust/crates/mnote-web/src/routes/hermes.rs\",\n \"wolai-frontend/src/components/search/SearchPaletteHost.tsx\",\n \"wolai-frontend/src/components/editor/DocumentAiAgentPanel.runtime.tsx\",\n \"wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/page.tsx\",\n \"scripts/task116-rust-web-islands-smoke.js\"\n ],\n \"acceptance\": [\n \"Rust Web 输出 Search server-first shell\",\n \"Rust Web / Hermes 拥有 AI bridge session、tool event、client action contract\",\n \"Rust Web 输出 Mindmap object shell,React runtime 只作为 island 或 legacy compat\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web search_shell && cargo test -p mnote-web ai_bridge && cargo test -p mnote-web mindmap_shell && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/DocumentAiAgentPanel.runtime.test.tsx src/lib/ai-agent/runtime/runAgent.test.ts src/lib/search/request.test.ts && cd /mnt/Data1T/mnote && node scripts/task116-rust-web-islands-smoke.js\",\n \"timeout_seconds\": 4200\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"Search server-first shell、Hermes AI bridge owner contract、Mindmap object shell 已落到 Rust Web;React runtime 标记为 island/legacy compat;task116 smoke 证明三类 owner 已迁移。\",\n \"timestamp\": \"2026-04-28T12:44:04Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T12:44:04Z\"\n },","v":"ghFqPR1iKDkvcCy+T9NJvQoajz1IhG+9LIW9O4AgXDtBgYw8smCbvaubXL3I1EY9IsiJPUvnPD0F4xe9rJuLvYyvkTtnIyS90dLOvC1udbwlrBY9JgMTvWCXOrydFPS7BJGOPTWVgj10hHa7OBIOPSh1U73ge307iNJKPa1nCD1QIl69zJo0vcKSHr02Y4e8FzYRvZJnULyq4D88cdG4u+pFQj1EFqG8Dlh6PHh5Sr0xFrq8WZY2vRGDzz0hXNU8Uhn4PP+tg72t7bE8vXgcvWYNiTyC8IC9lOC8PYNSUT3uI/S854FXPHCh2Dt2BoC9Bq2BPYUKYj2Pmgg98098PfaA9DzCq6287CDLvF1fWzxEPog8otNgOyvMKT3Zrwe6jQVQvOLdDr3cgtS8XcCcPe3YTr3+7eq7W62GvNKGBj2fIEq8K+t5OyDzTT1ZTGs9+q40PYk2FjypbAm9o71Vvenilb11Q109Bs1WPWlbELvHaFy8W7BXu5r9R72bZmY8imcRverSsjzFTOy87+sgPQZq0zvW2be8xf4cveiWpbyL7X49Tq/dPEV2xLt/VS89VUtXPKORwrw8c9q8lfLrOx2Spbxm1Vi9lrBrPYuATL2f8IU9Ol8fvQBwvLzVGug83eh4Ozj6jb3wiKu8ipY7PZcCSj1Ipbm7AA69vPVd/zx1zRs89Ve0vNgFwzu4CrY8+xzavEgsZj2K5mQ93kinPN59gbx6ggC8P2WjuXuC/7zaiKQ8hZFjPP4nK70gVdi7OizEPHArRb0+rnY9sJ/kPIxGK73SBr67jpzQvIkeLDy1pta8teYPPDj1uTw3LDu9VCgiO9ICvrxJ1nA8l+hXPd7bbTzJxm09uDWpvPXdjz2Xoii8t4mHvKAaP7ySNSI6K5U1PWBNXTxu07O8jE4vvV9Qhrwx/X6850povCAAhjzvdCs89KEgPOcuqTvdU4u9wZ1LPdwlOL23U708jfONPDFWi7xcBoa9PMXkPAZ8W7ygBNO8YeeXvZ
|
|||
|
|
{"p":"harness-tasks.json","s":961,"e":1020,"m":1778951184600.0012,"t":"},\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"Search server-first shell、Hermes AI bridge owner contract、Mindmap object shell 已落到 Rust Web;React runtime 标记为 island/legacy compat;task116 smoke 证明三类 owner 已迁移。\",\n \"timestamp\": \"2026-04-28T12:44:04Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T12:44:04Z\"\n },\n {\n \"id\": \"task-026\",\n \"title\": \"Phase W-7:退役 Next App Router 主入口并完成 03-rust-web 文档收口\",\n \"status\": \"completed\",\n \"priority\": \"P0\",\n \"depends_on\": [\n \"task-025\"\n ],\n \"attempts\": 1,\n \"max_attempts\": 3,\n \"started_at_commit\": \"9f6a2c86\",\n \"source_doc\": \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"scope\": [\n \"ARCHITECTURE.md\",\n \"design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md\",\n \"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"scripts/task117-next-retirement-guard.js\"\n ],\n \"acceptance\": [\n \"task117 证明 SKIP_NEXT_LEGACY=1 时核心 smoke 仍可通过\",\n \"默认启动链不再把 pnpm dev 作为 3000 owner,3104 不恢复为公开入口\",\n \"ARCHITECTURE.md 与 3-1 同步 Next App Router legacy compat 口径,本 plan/checklist 移入 done\"\n ],\n \"validation\": {\n \"command\": \"cd /mnt/Data1T/mnote && node scripts/task097-homepage-entry-smoke.js && node scripts/task114-rust-web-gateway-entry-smoke.js && node scripts/task115-rust-web-document-shell-smoke.js && node scripts/task116-rust-web-islands-smoke.js && node scripts/task117-next-retirement-guard.js && git diff --check -- ARCHITECTURE.md design/03-rust-web scripts wolai-frontend rust/crates/mnote-web\",\n \"timeout_seconds\": 4800\n },\n \"on_failure\": {\n \"cleanup\": null\n },\n \"error_log\": [],\n \"checkpoints\": [\n {\n \"step\": 1,\n \"total\": 1,\n \"description\": \"task117 已证明 SKIP_NEXT_LEGACY=1 时核心 shell 不依赖 Next legacy;desktop-hot 支持跳过 Next legacy;ARCHITECTURE/3-1 已同步 Next App Router legacy compat 口径,3-5/3-6 已移入 done。\",\n \"timestamp\": \"2026-04-28T12:50:07Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T12:50:07Z\"\n }\n ],\n \"session_count\": 10,\n \"last_session\": \"2026-04-28T12:50:07Z\",\n \"final_renderer_gate\": {\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",","v":"diIEPbnNDj2BZhm+LSE7vXLApz3GdjW9J3kgPTz4zjxzI3k7M1p4vYrDMr0l7DA9MNdDPahDBjyMcqg8eShjvc7yOzzRW5K88vXLvAYayzuHgVk9zRegvG6RKb26liW9IsGwPUROXz1eBIK8ldBJPTYKNL3r1Yk8LTUjPc3bz7tdkiu9fuJUvcAQ9ru0/J+9E34cvWoqXr3DkCW8KUkSuVIIoj3hHEG9Xg6sO+LeU70NPm69Zhu/vPW4qT2SkD89SrqWPSYMXb25JAQ9xII+vXa/wDxZLkC9zH+dPS3kcT27e8a8uC+LPC3Jzjp/1K+9vYKLPUpO7TyO3gI9eAeYPbgwhTyhCHe8Ym3RvNt5EjwUoWI8ScqTvDKo/zwwgYC8JXGVvIu7w7yL1a28NjxnPVHkUL30IIi8c28CPOMo8TxIo5o5zTKfO0wcZD218ek8jX0TPZHwJT1RDjm9toQivZ34g72763o968D5OXuG5rs9X9O8sKfHvKhXIb3gNuY6VxW4vMilsjzDdSq8x4kdPZi2lDxukpu8HlS5vC/xq7yz6SE9wfdSPcwlLLxpKD47b8lsvE3aCbyMude7bsbQO0ObprzNvb288kREPVsXt7yMWoo95qUXvb4hAr2Qvh09aWcGunfMeb3BEMG8wO4uPfcVbrz3XUQ8m2ATvewWHzwUCbE8Ib3XvIbD+Dt6fus7qW7NvDvhJT3k/Io97wSjPDIxWbz8F9G8oi7/PAIhkrwCw8I62OQkPDXFu7wGL9G6hstyPHEYMr2h/To9c7KTPO94RL0Oe+E8hImlvA9YFrzBmmK8yAxCPeG0frvjG3y8cGp6vNYHz7zWxQE8VjisPYJGPTsMbFI9M7RjvWyoeT1Actm7KZYuvZyXnLyTivg8gYigPPrqg7zwiMG8+Ln1vAbawbz9/828c2MoPHIVzjtuT2S5EhnOvJaT4jvq62y9xm1EPVb52by9t1A9yLQhPaw2CL21ky29lwTiPCg5Gb3+cB69hClZvYD5gTyLNAu8pLsJvXqSjL2lqIK8z44UvST
|
|||
|
|
{"p":"harness-tasks.json","s":1009,"e":1068,"m":1778951184600.0012,"t":"\"total\": 1,\n \"description\": \"task117 已证明 SKIP_NEXT_LEGACY=1 时核心 shell 不依赖 Next legacy;desktop-hot 支持跳过 Next legacy;ARCHITECTURE/3-1 已同步 Next App Router legacy compat 口径,3-5/3-6 已移入 done。\",\n \"timestamp\": \"2026-04-28T12:50:07Z\"\n }\n ],\n \"completed_at\": \"2026-04-28T12:50:07Z\"\n }\n ],\n \"session_count\": 10,\n \"last_session\": \"2026-04-28T12:50:07Z\",\n \"final_renderer_gate\": {\n \"source_doc\": \"design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md\",\n \"status\": \"completed\",\n \"note\": \"task-001 至 task-009 只代表 Rust/WASM reducer runtime 阶段完成;不得再把 inline iframe srcdoc host 视为 final Rust DOM renderer。\"\n },\n \"final_runtime_remaining\": {\n \"source_doc\": \"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md\",\n \"status\": \"completed\",\n \"tasks\": [\n \"task-014\",\n \"task-015\",\n \"task-016\",\n \"task-017\",\n \"task-018\"\n ]\n },\n \"main_web_execution_plane\": {\n \"source_doc\": \"design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md\",\n \"plan_doc\": \"design/03-rust-web/process/3-5-rust-web-main-execution-plane-cutover-plan-v1.md\",\n \"status\": \"planned\",\n \"tasks\": [\n \"task-019\",\n \"task-020\",\n \"task-021\",\n \"task-022\",\n \"task-023\",\n \"task-024\",\n \"task-025\",\n \"task-026\"\n ],\n \"note\": \"树域 Rust family 默认执行面已完成;主 Web 执行面仍需通过 task-019 至 task-026 迁到 mnote-web / Rust family。\"\n },\n \"rust_web_3_4_undo\": {\n \"source_doc\": \"design/03-rust-web/process/3-4-undo.md\",\n \"status\": \"in_progress\",\n \"dependency_chain\": \"A -> B/C -> D/E/F -> G -> H\",\n \"tasks\": [\n {\n \"id\": \"task-3-4-A\",\n \"title\": \"Page Aggregate 升级为 core-protocol projection contract\",\n \"status\": \"in_progress\",\n \"depends_on\": [],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol page_aggregate && cargo test -p bridge-runtime page_aggregate && cargo test -p mnote-web page_aggregate\"\n },\n {\n \"id\": \"task-3-4-B\",\n \"title\": \"page.* 成为页面默认写命令族\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-A\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime page_body_save && cargo test -p bridge-runtime page_head_update_title && cargo test -p bridge-runtime page_layout_update_options && cargo test -p mnote-web documents_save\"","v":"vxcFPU5sHT0X5yO+EmUlvQGvGj3Wp9K925UlPf3dkzyzq2q7/lwRvVfFfr2kQ/s7S+AvPVASwTz4Ba26bOZPvTqv8rxtAua8NovOvMaeyzxmJyQ8UUsbvZds8ryapQe8n30wPSn8Ez3FlX86mPfZPCwvRr3hKaG8Uo2OPXQJGrq52C69oe10vEcsJ734fV+9RacbPeSADb2RB1y8JRaiPAlaBz0tIYO9BVh7Pbb+/ry/cjW8dBKovFURPz3eJWw8pw4iPaDI/7zCPCc8NMcXvcbfOzxpujW9w3uFPQn5AD2pOcS9+uFru3YBgTxmGW69zNrbPNs72TyNGiy9MkuuPQCcCjwjsYy8xXqKPG0QXz2FU9k7F97evG8DGDyaTk+8i3VcvHtC0bw9Lyy9hcfEPCrYKb2aLgO7t32CPOsdDT0z0y09P2BrvU4giT0ucpc8I14pPS1jhLp1+xi9MpreOmMTv7zH3sg9IGXYPHRZED1n22+8lmOBu6VEirxLXQw9ftIRvTSc2jyINd68IAJKPeh4Y7ztHj+8otUpvANYGL08J7k8YUS2PRzGkrmGhhQ9rlRnPJFMAD2ddh281i0SvDeEB70uXjy8huxvPVuB2LwdnmA9qfgDvWhiX73d1Qs9oR2UPJ/taL2ieFq8wnc/PLzxDj1RLxe9y88Fvc7IFDzpTmW7EvVyO5On2Lyoh1S8BZkZuUM3iT211Vw920IwPVVXWL0rBG67zGDBumGq0LtwapE8ZXVevS3Lh72jb1M8TORdPMHxg7ydcaQ8r1XzPIlRj706GCC9giMlPFBazTnnwYE7ar10PGdEpDsB2qG9kA7pvB7LvLxWBwC92RCSPaHtwzzOU709GSFpOprLqT3Y3HE8yOlyvVAygbzO5u474yM5PdG/Wrw8zAO97MAWvT44H7yUpQG9vjC7vOHufL3OyoM91cl/vBCF2TzwSbM6P4T8PIIeHb0fAxU92BUqu3UTz7xpPQ69oJIfPRtlVL0iUg+9WOzlO4iMtDqamsY7eOcKu5ugoLjOO0y83HA+vVcuTD0GK1U7rJswPZQKdb2RGhI7Hjf/OtiZY72kSWQ94SVLvRXxIz2qWc+7PTirPebbYL3KYkk8HOdAPS9mkLxfwaM8pYg6vSxyzTzcT0U7e8TYOi2yzLkxDTC8GbhePLJYwzw5/mS84P27PCW3NbyUcgc8Onp8PN0jrbsmm5o6dPhNPOozkLpYWZu892h
|
|||
|
|
{"p":"harness-tasks.json","s":1057,"e":1115,"m":1778951184600.0012,"t":"\"id\": \"task-3-4-A\",\n \"title\": \"Page Aggregate 升级为 core-protocol projection contract\",\n \"status\": \"in_progress\",\n \"depends_on\": [],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol page_aggregate && cargo test -p bridge-runtime page_aggregate && cargo test -p mnote-web page_aggregate\"\n },\n {\n \"id\": \"task-3-4-B\",\n \"title\": \"page.* 成为页面默认写命令族\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-A\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime page_body_save && cargo test -p bridge-runtime page_head_update_title && cargo test -p bridge-runtime page_layout_update_options && cargo test -p mnote-web documents_save\"\n },\n {\n \"id\": \"task-3-4-C\",\n \"title\": \"3000 Rust shell 消费 tree realtime event stream\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-A\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_events && cargo test -p mnote-web tree_command && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task123-rust-web-tree-live-stream-consumer-smoke.js\"\n },\n {\n \"id\": \"task-3-4-D\",\n \"title\": \"Search 收口为 server-first / kernel-aware 主链\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-B\", \"task-3-4-C\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol search && cargo test -p bridge-runtime search_documents_query && cargo test -p mnote-web search && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task125-rust-web-search-server-first-smoke.js\"\n },\n {\n \"id\": \"task-3-4-E\",\n \"title\": \"AI bridge 与结构化写链收口\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-B\", \"task-3-4-C\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol ai && cargo test -p mnote-web hermes && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task126-rust-web-ai-bridge-structured-write-smoke.js\"\n },\n {\n \"id\": \"task-3-4-F\",\n \"title\": \"Mindmap 成为 kernel projection / command truth\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-B\", \"task-3-4-C\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol mindmap && cargo test -p bridge-runtime mindmap && cargo test -p mnote-web mindmap && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task127-rust-web-mindmap-kernel-projection-smoke.js\"\n },\n {\n \"id\": \"task-3-4-G\",\n \"title\": \"Legacy Next / React 兼容层退役 gate\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-D\", \"task-3-4-E\", \"task-3-4-F\"],\n \"validation\": \"cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web gateway && cargo test -p mnote-web legacy_next && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task117-next-retirement-guard.js\"\n },\n {\n \"id\": \"task-3-4-H\",\n \"title\": \"设计文档状态治理与执行节奏\",\n \"status\": \"in_progress\",\n \"depends_on\": [\"task-3-4-G\"],\n \"validation\": \"cd /mnt/Data1T/mnote && rg -n \\\"\\\\\\\\[ \\\\\\\\]\\\" design/03-rust-web/process/3-4-undo.md && rg -n \\\"\\\\\\\\[done\\\\\\\\]|\\\\\\\\[recycle\\\\\\\\]\\\" design/03-rust-web design/old && git diff --check && git status --short --untracked-files=all\"\n }\n ]\n }\n}","v":"UvbgO7rkAT1HIhq+c+RqvQfrjj22R1u9//NyOt0r9TyejDg7lJf4vFv7RL16BmY8wLKwPCngsbw5kum7fCuTvJha7byU8MG8l54xuk0XDbzhz8U7uCsKvaSGdDyeFUO93ctOPfUcwDyzcMk8F8O9PDEUobwhpQK9u8IzPd4dTbw4fhq9BUPovFKfIL2vyKK9OxL9PLnTAr1+8Pm8bqfnu4NTCDwo
|
|||
|
|
{"p":"package.json","s":1,"e":60,"m":1769360164441.8494,"t":"{\n \"name\": \"mnote-desktop\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"main\": \"desktop-electron/main.js\",\n \"scripts\": {\n \"desktop\": \"node scripts/desktop-prod.js\",\n \"desktop:hot\": \"node scripts/desktop-hot.js\",\n \"desktop:local\": \"node scripts/desktop-local.js\",\n \"desktop:electron\": \"node desktop-electron/dev-runner.js\",\n \"build:desktop:next\": \"node scripts/prepare-desktop-next.js\",\n \"dist:win\": \"pnpm run build:desktop:next && electron-builder --win nsis\"\n },\n \"dependencies\": {},\n \"devDependencies\": {\n \"@playwright/test\": \"^1.56.1\",\n \"electron\": \"^34.0.0\",\n \"electron-builder\": \"^26.0.12\",\n \"playwright\": \"^1.56.1\"\n },\n \"build\": {\n \"appId\": \"org.aichem.mnote\",\n \"productName\": \"MNOTE\",\n \"asar\": true,\n \"directories\": {\n \"output\": \"dist\",\n \"buildResources\": \"desktop-electron/build\"\n },\n \"files\": [\n \"package.json\",\n \"desktop-electron/**\",\n \"!desktop-electron/desktop-next{,/**}\"\n ],\n \"extraResources\": [\n {\n \"from\": \"desktop-electron/desktop-next\",\n \"to\": \"desktop-next\",\n \"filter\": [\n \"**/*\",\n \"!node_modules{,/**}\"\n ]\n },\n {\n \"from\": \"desktop-electron/desktop-next/node_modules\",\n \"to\": \"desktop-next/node_modules\"\n }\n ],\n \"win\": {\n \"target\": [\n \"nsis\"\n ]\n },\n \"nsis\": {\n \"oneClick\": false,\n \"allowToChangeInstallationDirectory\": true,\n \"include\": \"desktop-electron/build/installer.nsh\"\n }\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [","v":"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
|
|||
|
|
{"p":"package.json","s":49,"e":66,"m":1769360164441.8494,"t":"\"target\": [\n \"nsis\"\n ]\n },\n \"nsis\": {\n \"oneClick\": false,\n \"allowToChangeInstallationDirectory\": true,\n \"include\": \"desktop-electron/build/installer.nsh\"\n }\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"electron\",\n \"electron-winstaller\"\n ]\n }\n}","v":"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
|
|||
|
|
{"p":"playwright-snapshot-auth.md","s":1,"e":1,"m":1778542528420.6665,"t":"- generic [ref=e2] [box=0,13,1440,39]: \"{\\\"ok\\\":false,\\\"code\\\":\\\"convex_upstream_error\\\",\\\"message\\\":\\\"Convex mutation 失败\\\",\\\"requestId\\\":\\\"req_1778542522227_65\\\",\\\"traceId\\\":\\\"trace_1778542522227_66\\\"}\"","v":"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
|
|||
|
|
{"p":"wolai-frontend/.gitignore","s":1,"e":48,"m":1773495424137.6084,"t":"# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/versions\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# env files (can opt-in for committing if needed)\n.env*\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n\n#test\n**/test/\npw-tests/**\npw-tests/ \nwolai-frontend/public/documents/**","v":"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
|
|||
|
|
{"p":"wolai-frontend/components.json","s":1,"e":23,"m":1773495424146.6084,"t":"{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"new-york\",\n \"rsc\": true,\n \"tsx\": true,\n \"tailwind\": {\n \"config\": \"\",\n \"css\": \"src/app/globals.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true,\n \"prefix\": \"\"\n },\n \"iconLibrary\": \"lucide\",\n \"aliases\": {\n \"components\": \"@/components\",\n \"utils\": \"@/lib/utils\",\n \"ui\": \"@/components/ui\",\n \"lib\": \"@/lib\",\n \"hooks\": \"@/hooks\"\n },\n \"registries\": {}\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/dev-3001.err","s":1,"e":18,"m":1773495424157.6086,"t":"F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.","
|
|||
|
|
{"p":"wolai-frontend/dev-3001.err","s":19,"e":34,"m":1773495424157.6086,"t":"F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.","v":"b7zgPMsynjxnixa+ND+8vddouz1yspO9SzN8vPQFuTzrj+s8kd2OvT8hBL3pyG89uN+6PTlNBj0ssAO9WWgCvZANPD2nORK8Pzi5u7DXgryGjne8k7Nov
|
|||
|
|
{"p":"wolai-frontend/dev-3001.err","s":35,"e":48,"m":1773495424157.6086,"t":"Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis","v":"3a2pPAPsBT12YAu+DQ2
|
|||
|
|
{"p":"wolai-frontend/dev-3001.err","s":49,"e":60,"m":1773495424157.6086,"t":" at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed","v":"zwjAPPtpJT0Evx6+VcCYvSBc5D3Za5W9iS+NPJt/ozw8tR89GoClvcE0S70rdYA9Ku+MPQfPiDz1pgC9kRkRvU3aYz38ASq9F72wO5jwcrxTp4i86AUuvVzc/LriupS9m7ihPdedTz2c60A94Ya+PA1Lhjzx5i48QUZwPc06OL00uY48HNQOvS3s1bw38nS9OvPtvOebqTkazYM9SmWVvLTkizyWCwQ80NZNPIWJhr2GWQc8tMpUuwG6zDzYFbk8NzfTPXW3lb3vFEw80q9GvR+StrxZ7pS8lj6pPWVTqjxbXjy8Cq6kPHyOqTwM84G8qX+hPVNvOj3q2xm7m/umPe3H5zywkVc78FqUvS/hmDxwnB89O/MevXYZUD1dEF88hyR8vSM5irtE2tG8JgYjPFwOQ7wC27S88iqEvCcboTy4jC68g2UIvAHiVj2Yu6G7PYZ6PSLgEL22pf+88yoZPTgSLb2/g1Y9nJ5HPB0kKL1TxcW7csoNuy+zqb0/opK8YSGoPCAq0jw/87K9TvpfvN6eOLs8d/O6670uvTMYQzzOqF+8gbNiPLbmgDwJG5E8tkgfvb7wD7ww1we7ban0PEUFvTsJ6xG9Y/tXPJmbVr1nkBc99DQFPEwrDjyq28k7aeM2vS4dNrwd/0a8dCQRPXg2Lz3GrqC8BaCovKgKrDxbJIc87qljvQD2ZLx
|
|||
|
|
{"p":"wolai-frontend/dev-3001.err","s":49,"e":63,"m":1773495424157.6086,"t":"at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\node_modules__pnpm_ecee5139._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: Route \"/documents/[id]\" used `params.id`. `params` is a Promise and must be unwrapped with `await` or `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis\n at DocumentPage (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__d0423852._.js:120:150)","v":"S+uuPIMZMj05IB2+TGybvSYo0j38g569RxF/PGt3iTw3rRA9rT+jvRPFIr3CuoU9QKGdPYhorjwFS+C8s/8KvbHWSz3HuQi9bJULO6iuGbzNdJ
|
|||
|
|
{"p":"wolai-frontend/dev-3001.err","s":64,"e":79,"m":1773495424157.6086,"t":"Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\2536e_@blocknote_react_dist_blocknote-react_65a5c21f.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\node_modules\\.pnpm\\next@16.0.3_@babel+core@7.2_a6e7fe7b2107bfd5c9e45031e322c5c3\\node_modules\\next\\dist\\compiled\\next-server\\app-page-turbo.runtime.dev.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__c5e4d87b._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\n ⨯ ReferenceError: window is not defined\n at <unknown> (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\2536e_@blocknote_react_dist_blocknote-react_65a5c21f.js:421:9)\n at Se (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\2536e_@blocknote_react_dist_blocknote-react_65a5c21f.js:419:354)\n at BlockNoteEditor (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__c5e4d87b._.js:87:315) {\n digest: '2629247923'\n}","v":"mcfoPOCAYT1x6Q++Iu0tvb0m7T1m8Gy9bRLEPIJlgD2Vi5s9lwOuvbDke70aOXw9Ms5DPSYmnrw36Y+9AA46vcBenD0O+3G9zwjtOyE3y7vG0Wy8e1UcveD9y7vSW0S92qFuPZqN4zymrEk9C/1sPNF8jjsklpc7SXtGPaS9SL0cEFw8I7LDvI0op7wsZmm9Dez3vPnZkTyAsj49k5hJPHF4Vzzj2bc8dJixOuWDML2jS7I7AnPAPE3WmDyuf4c83ffaPVlah71jGDA9vsjvvEHmFDwdSyS8BJTMPclFSzyH/Yq80yDQPJ5+1DhkBNW8jFyfPfIRLD38soc72He0PdCxLz1jvyE7H6mdvbolKD1IVgw8kigOvTm7gD3hPnw6irZZvXqLgTyEs6W8s/wjPA5Uo7xoWly8ej0QusEH2Twt5Fs7iKeGvPWMPD3/eJg8U69iPemTBL2f8fa8MgsEPNkdt7zbGRY90oyVPM2WkL228wQ9sFS/vHonlr0IAWU82l4sPFVzGT1XVZS9iR+vvLiatLwtEhg8GKQIvSPqGjyqefe71kRrPNfpd
|
|||
|
|
{"p":"wolai-frontend/dev-3001.out","s":1,"e":60,"m":1773495424171.6086,"t":"> wolai-frontend@0.1.0 dev F:\\SOFT\\MNOTE\\wolai-frontend\n> next dev \"--port\" \"3001\"\n\n ▲ Next.js 16.0.3 (Turbopack)\n - Local: http://localhost:3001\n - Network: http://192.168.121.1:3001\n - Environments: .env.local\n\n ✓ Starting...\n ✓ Ready in 729ms\n GET /login 200 in 2.3s (compile: 2.1s, render: 265ms)\n GET / 200 in 613ms (compile: 365ms, render: 248ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 3.4s (compile: 2.9s, render: 473ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 442ms (compile: 26ms, render: 415ms)\n GET /documents/1f256e20-0ef4-4090-9bec-954fcd799a4c 200 in 245ms (compile: 25ms, render: 220ms)\n POST /api/documents/create 200 in 424ms (compile: 311ms, render: 113ms)\n GET /documents/880f0a7a-e894-465b-a64d-bea1afa3da48 200 in 62ms (compile: 27ms, render: 34ms)\n GET /documents/1f256e20-0ef4-4090-9bec-954fcd799a4c 200 in 68ms (compile: 22ms, render: 47ms)\n GET /documents/e8b15472-3665-425e-b945-0de6bc9a15fb 200 in 56ms (compile: 22ms, render: 35ms)\n GET /documents/880f0a7a-e894-465b-a64d-bea1afa3da48 200 in 56ms (compile: 22ms, render: 34ms)\n GET / 307 in 297ms (compile: 2ms, render: 295ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 222ms (compile: 23ms, render: 199ms)\n GET / 307 in 102ms (compile: 3ms, render: 99ms)\n GET /login 200 in 53ms (compile: 3ms, render: 49ms)\n GET / 200 in 20ms (compile: 3ms, render: 17ms)\n GET /login 200 in 35ms (compile: 4ms, render: 31ms)\n GET /login 200 in 18ms (compile: 2ms, render: 15ms)\n GET / 200 in 20ms (compile: 3ms, render: 17ms)\n GET /login 200 in 34ms (compile: 3ms, render: 31ms)\n GET /login 200 in 18ms (compile: 2ms, render: 16ms)\n GET / 307 in 108ms (compile: 3ms, render: 105ms)\n GET /login 200 in 57ms (compile: 5ms, render: 52ms)\n GET / 307 in 193ms (compile: 3ms, render: 190ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 125ms (compile: 23ms, render: 102ms)\n GET / 200 in 27ms (compile: 4ms, render: 23ms)\n GET /login 200 in 34ms (compile: 3ms, render: 31ms)\n GET /login 200 in 19ms (compile: 3ms, render: 16ms)\n GET / 200 in 19ms (compile: 3ms, render: 16ms)\n GET /login 200 in 39ms (compile: 3ms, render: 36ms)\n GET /login 200 in 19ms (compile: 3ms, render: 16ms)\n GET / 200 in 20ms (compile: 3ms, render: 18ms)\n GET /login 200 in 40ms (compile: 9ms, render: 31ms)\n GET /login 200 in 19ms (compile: 2ms, render: 17ms)\n GET / 200 in 27ms (compile: 5ms, render: 22ms)\n GET /login 200 in 41ms (compile: 3ms, render: 37ms)\n GET /login 200 in 21ms (compile: 2ms, render: 18ms)\n GET / 200 in 23ms (compile: 3ms, render: 20ms)\n GET /login 200 in 40ms (compile: 3ms, render: 37ms)\n GET /login 200 in 22ms (compile: 3ms, render: 19ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 307 in 181ms (compile: 29ms, render: 152ms)\n GET /login 200 in 60ms (compile: 3ms, render: 57ms)\n ✓ Compiled in 90ms\n GET /login 200 in 235ms (compile: 93ms, render: 142ms)\n GET /login 200 in 42ms (compile: 3ms, render: 39ms)\n GET / 200 in 175ms (compile: 93ms, render: 82ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 313ms (compile: 125ms, render: 188ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 67ms (compile: 4ms, render: 64ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 235ms (compile: 118ms, render: 117ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 611ms (compile: 24ms, render: 587ms)","v":"GnFDPOnGOD3skhu+yp3RvectOD19EOC8/oAYPeD55Tux8Ni8syO0vaxcOr03yGM9qgOLPRSVBzyEg7Y8Eg7nvIWFZzyeyjq99UitvOnGwbzBCRK8DngQvW72Lb0fcqm8Zd2rPX0Ljz3Md2I8OmhJPcgPhLzYatw8d/OjPYTrQL3HtRC9GQLBvOwHFDzhw4u9x1g8vZnYHL3fIQA8PSyRO2+Trrs4fEa9h9AzOzod3bwdAeo8fYoovFhSZD3FzpY8X6VGPS1Jhr3d0QE8C6QWvV1l8bw2nRq8UqyDPLb6CDz+ioO97nz7uwgGlzw6Z3S90J5rPYfOlT3aL8Y8PzxhPRtViT02i667bimXvGHtnj3sVcs81mQsvDSOvDwIwBy8gmlhvaDnGLwcX7w885GBPWhPjDyX0gu9S2H3uwMivzz0qFW8zKl/PKye5z1N9Q+9StTWPNGAzLxWRl287WwKPRCPp70qBYE97Cjfukx8GrzrITy7n9uHvBvmKb2+4jW83/puOx323ro8x6m84
|
|||
|
|
{"p":"wolai-frontend/dev-3001.out","s":49,"e":61,"m":1773495424171.6086,"t":"GET /login 200 in 40ms (compile: 3ms, render: 37ms)\n GET /login 200 in 22ms (compile: 3ms, render: 19ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 307 in 181ms (compile: 29ms, render: 152ms)\n GET /login 200 in 60ms (compile: 3ms, render: 57ms)\n ✓ Compiled in 90ms\n GET /login 200 in 235ms (compile: 93ms, render: 142ms)\n GET /login 200 in 42ms (compile: 3ms, render: 39ms)\n GET / 200 in 175ms (compile: 93ms, render: 82ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 313ms (compile: 125ms, render: 188ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 67ms (compile: 4ms, render: 64ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 235ms (compile: 118ms, render: 117ms)\n GET /documents/2b01d6b7-dc39-49b9-97bb-0be59956e6fb 200 in 611ms (compile: 24ms, render: 587ms)","v":"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
|
|||
|
|
{"p":"wolai-frontend/eslint.config.mjs","s":1,"e":34,"m":1773495424200.184,"t":"import { defineConfig, globalIgnores } from \"eslint/config\";\nimport nextVitals from \"eslint-config-next/core-web-vitals\";\nimport nextTs from \"eslint-config-next/typescript\";\n\nconst eslintConfig = defineConfig([\n ...nextVitals,\n ...nextTs,\n {\n // 说明:当前仓库存在大量历史代码与第三方/生成代码。\n // 为避免 ESLint 在生产构建阶段被“风格型规则”阻塞,这里将部分规则从 error 降级为 warning。\n name: \"mnote-lint-overrides\",\n rules: {\n \"@typescript-eslint/no-this-alias\": \"warn\",\n \"@typescript-eslint/no-explicit-any\": \"warn\",\n \"@typescript-eslint/no-require-imports\": \"warn\",\n \"react-hooks/set-state-in-effect\": \"warn\",\n },\n },\n // Override default ignores of eslint-config-next.\n globalIgnores([\n // Default ignores of eslint-config-next:\n \".next/**\",\n \"out/**\",\n \"build/**\",\n \"next-env.d.ts\",\n // 说明:静态资源/第三方构建产物不参与 lint(否则会产生大量无意义报错)。\n \"public/luckysheet/**\",\n // 说明:Convex 生成代码不参与 lint。\n \"convex/_generated/**\",\n ]),\n]);\n\nexport default eslintConfig;","v":"peZtPV5Q8zxq3AG+mtiXvWtA0zzvxWm8ZPIdvVJDlzz6SyY8M43uvFnok73U6KU9Xp6yPYOSqrwJ7f47AazWPBssHjrw6hM9rg8uPTFhKjmRy5c8Z0FBvcCasDzI2X29A09wPd4HWz3S27I8sA5yPCQm/ry//A07WNpdPYStrDup/105g4tDPIOFlb2PqVG8pQg6vW51ZDoL63a9vpUPPZzGozzAO+M8fAulvEwO9DwAw0E8LKwAvRpujT3+14w8egYRParWbb2Of2+5DhLyvEXaBbwLClq9wV5cPS8g5jy71za9kzbMPLN2CT0v7Ty9Qz86PPQLeD3tE0G9w5ORPcWpzTsm4jC97ZvLvF+Noz3WVzA9Eoc3O6ta8Tw693A8kcfYPPnwHbyzMzO9fABsvLPogLt7Tt28gpmevNg9Oj3gxSu9TBnKPDj5Sz1nXhC9FIVcO/Q2RLz4QZa67rlsvdDkN70O41c93x0bPXQGFL0GpGk8aKx5u7uCd70Q2Ia8FpfsPCR12LznSZ270kwlvRl5hDxttg69tIqqPI21U7wM9Ks8o2KlPRkL2juIo7s8ao6zvOk9TL2JJ0G8QaSGPQXNUzuq2rS8f9Dguwj1KLxgVew7LSVHvcqnkDyr2X48oq/TvFZ4M73DCz08BB2gPXV5nD1jD7082TUNPRY/qrqN72I9RgKlvYTdKr1qchu9Z4GUPNpRTD0Nglg9BUQtPUoWKr25egQ7h7GOOw5ovTzP0ui8/nAUvI9ZX7wao8m7N3V9O5ivH7zpSsc8z7nMvHz9B73Xs5S86ExOvKUFXLzriym9kQoMPTpK6jtEOxG5uqHTPJP+hDwSgWA8nJc1vVYmHj2QivA7aHc9vZofmz35L2w7MbY2vW62PLt9/3M9gUMyvJHCET0xj2i9yPEEvM1XgzvBSag8sljFPGGRbDz+aQg9WtYSvQoIgzyDBfy8okkLvYRhnbydzb88QgYnPf7SpLxNQiK8HkMqvcWWDL1B+4M8nTf3vOisBz070n280fznvAQTCbrj5rK8Ou0rvSYGgzxSPQg85qbkPLqkaLxlOqC783gKvIiyGr20mvO8mHwPvlmhkjxPDky9Vy07PcGRHr0/7zk9r2giPSsYvLsOJQO9LKtNvGagQ7wWu/Y8HoFWPJdXEb1Ht2u9ax7yPJz43Dw08B290hVhPVpyajh5guc8awCWvGcIa7yCy9S7bwU/PHF94LxDC/28RSxovR363jxBHo084iW5OpvZRz3pmxU6IIJBPSMq1joUE6483WxRPRgcFz0A+PW8HCABu+2Hp7yAFQ29qRPivJDdb7zX8ia8Og9QPRgdEr1t7IQ9xZ0PPIn4mj331gU9nJDPvboCBb2SacW8a/Ksu8yym7zPIoO8TuerPJ9mrjzLxEO9JHYfPOXCJr00BQk9aBnfPHKzwzyuB6s8nZmCvIMWkryiHF29UjiDPf2hMT08no48W6DnO0A3w7sszei80rr2O0cSBr1bjo29XdGEu31az7wUej68dtH0u9ZUuLxLY9w65m0MPB4xC708Irm6pv63OkkA1rxvAiY9wyLmO8ci2LwbQZs8jZYuPNrUzLta6Jm8KV0+PaFugz3g0Ho9pWQaPblwdLwcmTi9rGvdPK7eDL0YNKo8VARivOH0W701Ojs8yHO6PKGylj3lDCu9t3fvPKYFBD2jhjw8Xcd9PbnfQ704pjS6jm8BvcUCtztyRqs6wswsvO8IwjzDvve89+HCPF3NUTu8fbi8suOTPYu5AD0ZP9E8/WwlveremLyt36k8nBZLPHGLHj3kk7O7qzFiPbf9KT1tTKm9uIb+PKkk4jtCE7K8npDovJWVd73UQdy8Qn9FPSPVlT1A9Qq9CEgTPaQwLL2VuiG9X7mlu9pDAT3vSH8872znPHNQ0ztr/ae8h6itPCuZx7x+25I8htD1vOyVjzyEOmc9r80bPV2k4TybMVc94NezvNzI9zw/kRK9U/HAuyBIDT1trwU9CAmUvNk79bxx9UI9GGAlvT/tVjz9dNQ9nMiOvcMu/7yAkgG99ZGnOjyLpDwQOrI8xW07OgUYSrzakw89EkkAvAvrJb2WQsc8ZRa/u7GbEj1gKsy6YU8tPX8lMD07Zeo6c4FCPEkEWb1x5o29uSuYu3/fB7ybmsG7NtCvu1pmjrxjZiq9zQXfPHZKSzwnn3o8CvbAO9cPDTy9z468IiUAPSZUEbyCN5s9J9xCPVAYHr3ths+8M2QpvZEMxDs+SvK8EtZSvRxoFj3QYLk8zuHbPMKVuLwVj0M8PCtdvfrp5zxcESs9MVVGPVgsm7yj+es8acUavL5/uTxVTeE8BDqIvI2w1TyVLbo8vZmEvc7pgry5Ocm8LYi6O9jViT2fURE9/jwovbPhfTodqB89rzqROxRcNr2dDlY9NYTBPM1hiD1Q1Ha9+wh+vJC7Sr1frEE8fbW3vHCKrDz+VvU8TVmGvbXzKTteQqc87Pl+u8bdkDou6h2908wOPVf5MD2dqZq7L8bnO3dhyrvxHpe8bp4IPRwRiT3fJGO7Hk0JPY96Ib2zrkQ9cy/tu6Q3kb0SU2q96fOFvYKxfryBKHM9Ao0IPKg+2DuolVQ9VeW/uwx4GD0c8pe8aLd+vNRwgrx+vmS7o4RrvPNMC73YapI8n4dzPH6/JL0HRMG8FKAuuyrqmrxjrHw9f10DvLY1Ib1aoP882TUUvdoIk702/xC9WUtYPLLk9DvB89s7IJ9wPFlNmD3ATVC95ftZuhCGFTtRY4G9Z6Fau9/kL
|
|||
|
|
{"p":"wolai-frontend/frontend-3001.err","s":1,"e":1,"m":1773495424208.6091,"t":"^C","v":"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
|
|||
|
|
{"p":"wolai-frontend/frontend-3001.out","s":1,"e":12,"m":1773495424215.6091,"t":"> wolai-frontend@0.1.0 dev F:\\SOFT\\MNOTE\\wolai-frontend\n> next dev \"--port\" \"3001\"\n\n ▲ Next.js 16.0.3 (Turbopack)\n - Local: http://localhost:3001\n - Network: http://192.168.121.1:3001\n - Environments: .env.local\n\n ✓ Starting...\n ✓ Ready in 876ms","v":"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
|
|||
|
|
{"p":"wolai-frontend/frontend.err","s":1,"e":13,"m":1773495424224.6094,"t":"⨯ Failed to start server\nF:\\SOFT\\MNOTE\\wolai-frontend\\node_modules\\.pnpm\\next@16.0.3_@babel+core@7.2_a6e7fe7b2107bfd5c9e45031e322c5c3\\node_modules\\next\\dist\\server\\lib\\start-server.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\node_modules\\.pnpm\\next@16.0.3_@babel+core@7.2_a6e7fe7b2107bfd5c9e45031e322c5c3\\node_modules\\next\\dist\\trace\\trace.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nError: listen EADDRINUSE: address already in use :::3000\n at <unknown> (Error: listen EADDRINUSE: address already in use :::3000)\n at new Promise (<anonymous>) {\n code: 'EADDRINUSE',\n errno: -4091,\n syscall: 'listen',\n address: '::',\n port: 3000\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/frontend.out","s":1,"e":7,"m":1773495424235.6094,"t":"> wolai-frontend@0.1.0 dev F:\\SOFT\\MNOTE\\wolai-frontend\n> next dev \"--port\" \"3000\"\n\n\u001b[?25h\n ELIFECYCLE Command failed with exit code 1.","v":"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
|
|||
|
|
{"p":"wolai-frontend/next-dev.err","s":46,"e":60,"m":1773495424243.6096,"t":" at async (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\012f5__pnpm_791fff69._.js:12357:24)\n at async (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\012f5__pnpm_791fff69._.js:8251:36) {\n __isAuthError: true,\n status: 400,\n code: 'refresh_token_not_found'\n}\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\wolai-frontend_9f844c81._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__97b7743c._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\n ⨯ Error: 创建默认工作空间失败:new row violates row-level security policy for table \"workspaces\"\n at ensureDefaultWorkspace (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\wolai-frontend_9f844c81._.js:172:15)\n at async Home (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__97b7743c._.js:126:5) {\n digest: '2664484505'\n}\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.","v":"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
|
|||
|
|
{"p":"wolai-frontend/next-dev.err","s":49,"e":71,"m":1773495424243.6096,"t":"status: 400,\n code: 'refresh_token_not_found'\n}\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\wolai-frontend_9f844c81._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__97b7743c._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\n ⨯ Error: 创建默认工作空间失败:new row violates row-level security policy for table \"workspaces\"\n at ensureDefaultWorkspace (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\wolai-frontend_9f844c81._.js:172:15)\n at async Home (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__97b7743c._.js:126:5) {\n digest: '2664484505'\n}\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\wolai-frontend_9f844c81._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\nF:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__97b7743c._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed\n ⨯ Error: 创建默认工作空间失败:new row violates row-level security policy for table \"workspaces\"\n at ensureDefaultWorkspace (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\wolai-frontend_9f844c81._.js:172:15)\n at async Home (F:\\SOFT\\MNOTE\\wolai-frontend\\.next\\dev\\server\\chunks\\ssr\\[root-of-the-server]__97b7743c._.js:126:5) {\n digest: '2664484505'\n}\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.","v":"zGK/PLyqNT2cTx6+hFdwvaVz5T22k5O9sJkDPbZdAz3PoH49Lc2pvaOVkL2xnYA9+VofPbXOMzvmSoO9ufCxvLqWrz1
|
|||
|
|
{"p":"wolai-frontend/next-dev.err","s":72,"e":104,"m":1773495424243.6096,"t":"Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\nUsing the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\n\n<--- Last few GCs --->\n\n[30704:000001C2AAECC000] 3154411 ms: Mark-Compact 31843.8 (32807.5) -> 31742.3 (32803.9) MB, pooled: 0 MB, 10826.74 / 19.88 ms (average mu = 0.281, current mu = 0.289) task; scavenge might not succeed\n[30704:000001C2AAECC000] 3167016 ms: Mark-Compact 31812.8 (32808.6) -> 31722.8 (32794.1) MB, pooled: 8 MB, 11662.27 / 4.09 ms (average mu = 0.187, current mu = 0.075) task; scavenge might not succeed\n\nFATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory\n----- Native stack trace -----\n\n 1: 00007FF6DC3D7F8F node::OnFatalError+1343\n 2: 00007FF6DD01B1E7 v8::Function::NewInstance+423\n 3: 00007FF6DCE1BA97 v8::base::AddressSpaceReservation::AddressSpaceReservation+322071\n 4: 00007FF6DCE1F7A4 v8::base::AddressSpaceReservation::AddressSpaceReservation+337700\n 5: 00007FF6DCE2E73C v8::internal::StrongRootAllocatorBase::deallocate_impl+16604\n 6: 00007FF6DCE2DF7B v8::internal::StrongRootAllocatorBase::deallocate_impl+14619\n 7: 00007FF6DE295D2D v8::base::UnsignedDivisionByConstant<unsigned __int64>+2791341\n 8: 00007FF6DCE19560 v8::base::AddressSpaceReservation::AddressSpaceReservation+312544\n 9: 00007FF6DCDC9F12 EVP_PKEY_asn1_set_get_priv_key+86258\n10: 00007FF6DC32A48A node::GetNodeReport+98346\n11: 00007FF6DC328C70 node::GetNodeReport+92176\n12: 00007FF6DD082BCB uv_run+1867\n13: 00007FF6DD08273F uv_run+703\n14: 00007FF6DC4E4E3F node::DecodeWrite+367\n15: 00007FF6DC3659B2 node::MultiIsolatePlatform::DisposeIsolate+240642\n16: 00007FF6DC430F4C node::Start+1052\n17: 00007FF6DD449A82 AES_cbc_encrypt+2546\n18: 00007FF6DE29F434 v8::base::UnsignedDivisionByConstant<unsigned __int64>+2830004\n19: 00007FFEDDDAE8D7 BaseThreadInitThunk+23\n20: 00007FFEDFAAC53C RtlUserThreadStart+44","v":"WM9NPEeUij0X5wu+8ZFgvT27AD6FRVS9N2TrPMOKbj1T63M95lKbvdvdlb2Tpj09XHDqPFJqNr2c1Ia9UQY0vdB7cD2Cf6q9jpo/O4SODDzHZ6s70pinvIKdwbvY1ZC7nKNIPTqq0Tw6r0o9y/6tPIGflDwk92M8PF9wPQSgjb0D72C7UE+dvFwZOb1Lk1e9RbzFOxuStTvRoms9VCP7u5LhwDvU8e873/O1O9yM4bxXLJy8MkXvPHEgIz2Kkd88VQHVPQRugb3lH6k8Sa+wvJsryTvhjZy8qq/BPbL2hjq7i7C8QfoqPMxVoLzz48q8lbKlPeVg3DzRHxW7hMiQPRUgPT0LTiE8abtKvS/APD3Qcwq8hwU3vbBpWz1JAi88VPljvaEkGz2B6wy9Qdj3PPIsCb09KC68IZwTPJL8Nj32tm879te3vLBdKD2kbxc8IRvKPKEH9bzdfe68cCRjPA3g5LyuNQc9lo5Ou/rLF70UHbE8VBMWvVYBgL1ontc7c8FfPXUJbj3l9JK9BG4puJmTFb1EuWg8QpCHvFnWuTuVhqm8qHKwPG5olTzopg49vebLvNb+hTzZDgg9AVwiPTaRDLxDsgO9IBLgOzAvE71FuGA8eoUpO/vjhTw4sPe6jLwLvdBC6TpHL7m8GPALPbJQ2Tt08QS8dgzEvDuyJT2yrU49bbIOvVCgA71xlW69fLPDveCJ7zmvHjM9NhYUPce1kL0uOBa9tTGRPL3Ng7wu/NE78GuwPVMdpjyt4C29Hq70u7i7b70i1/E8Q/iDPEZMgL23t5U8FUUlvcDQtzxdeRa91x4hPa/CqzxlggO95Cg3vL2llTzkNEM9fNE3PdbcTD1vHqs81zAdvRQFJz3lLdq7lgn6uhnj6jvKTUU9L5hIPAhS0ruAYwu9ciYtu3ZnXLyl7xu8TqRlvcKoYDwAuQI9grMsvdUdybsFEOG7xcQAPQxTkL14JWY9bMEGPfhtAL25/a+7aP9rPIbXxLxje0A9rT+fvCvshry1qH68N6yHPEk1VDyWCBK9VYjivI9a4zyPGUI8Vo0aPQoVHbyrHa68krIovLsvJrw5g0o6ct7svEWyxby1k8e8qlc3PWMiE71nQaQ2Nf4jPSu/C72CZce7nHy3Oc8Y7byNPRy7+A0IPJ4nI72tF++8K
|
|||
|
|
{"p":"wolai-frontend/next-dev.out","s":1,"e":46,"m":1773495424255.6096,"t":"> wolai-frontend@0.1.0 dev F:\\SOFT\\MNOTE\\wolai-frontend\n> next dev\n\n ▲ Next.js 16.0.3 (Turbopack)\n - Local: http://localhost:3000\n - Network: http://192.168.121.1:3000\n - Environments: .env.local\n\n ✓ Starting...\n ✓ Ready in 983ms\n ○ Compiling /documents/[id] ...\n GET /login 200 in 2.4s (compile: 1432ms, render: 975ms)\n POST /api/auth/callback 200 in 460ms (compile: 439ms, render: 21ms)\n GET /login 200 in 632ms (compile: 31ms, render: 601ms)\n GET /documents/fe527e35-08c8-45db-8cc5-4e040b40973e 307 in 6.2s (compile: 5.1s, render: 1160ms)\n POST /api/auth/callback 200 in 42ms (compile: 29ms, render: 13ms)\n GET /login 200 in 639ms (compile: 35ms, render: 603ms)\n POST /api/auth/callback 200 in 48ms (compile: 22ms, render: 26ms)\n POST /api/auth/callback 200 in 146ms (compile: 45ms, render: 101ms)\n POST /api/auth/callback 200 in 200ms (compile: 49ms, render: 151ms)\n GET / 200 in 1154ms (compile: 432ms, render: 723ms)\n GET /login 200 in 699ms (compile: 29ms, render: 670ms)\n POST /api/auth/callback 200 in 55ms (compile: 44ms, render: 12ms)\n POST /api/auth/callback 200 in 98ms (compile: 47ms, render: 50ms)\n POST /api/auth/callback 200 in 132ms (compile: 36ms, render: 96ms)\n POST /api/auth/callback 200 in 133ms (compile: 40ms, render: 93ms)\n POST /api/auth/callback 200 in 141ms (compile: 39ms, render: 102ms)\n POST /api/auth/callback 200 in 188ms (compile: 44ms, render: 144ms)\n GET / 200 in 788ms (compile: 52ms, render: 736ms)\n GET /login 200 in 711ms (compile: 20ms, render: 691ms)\n POST /api/auth/callback 200 in 57ms (compile: 37ms, render: 21ms)\n POST /api/auth/callback 200 in 59ms (compile: 41ms, render: 18ms)\n POST /api/auth/callback 200 in 130ms (compile: 22ms, render: 108ms)\n POST /api/auth/callback 200 in 132ms (compile: 33ms, render: 99ms)\n POST /api/auth/callback 200 in 136ms (compile: 34ms, render: 102ms)\n POST /api/auth/callback 200 in 171ms (compile: 37ms, render: 134ms)\n GET / 200 in 900ms (compile: 44ms, render: 856ms)\n GET /documents/6fd575a8-1ca5-41f8-9366-2d8c400efd02 200 in 1754ms (compile: 65ms, render: 1689ms)\n GET /documents/6fd575a8-1ca5-41f8-9366-2d8c400efd02 200 in 1323ms (compile: 61ms, render: 1262ms)\n GET /api/references/backlinks?workspaceId=637d70cb-fbe1-4dc3-9f2c-ff8e099b1225&pageId=6fd575a8-1ca5-41f8-9366-2d8c400efd02 200 in 252ms (compile: 156ms, render: 96ms)\n POST /api/documents/save 200 in 174ms (compile: 134ms, render: 40ms)\n POST /api/documents/stats 200 in 192ms (compile: 156ms, render: 37ms)\n\u001b[?25h\n ELIFECYCLE Command failed with exit code 134.","v":"J4IquVLVBD21ch++SkalvZVFYD2gBze9a9srPepCzbyMznG8b0G1vWyAG71pYzY9LFqYPYj99jwq0OM8uTQJvR+rBT1tc2a9mpchvGF2h7xENde8y31yvAw8T72T0eu8l4vGPf9ahj19sIo8j+htPeasV7sKDT09gt+gPYs1mrysj6K88m67vPwCYrzX/LG8D9nVvOfn1byEluQ8pSezvHzZkDz9jZa8iWSyPIpoYjwjrPQ8/0+AvG65Nz07sqo8XupxPROPPb1VMWm8ut89vFCrDr2hOyy83M1EPXPhKTwRd4a9yahavPugWjw0kF29l9R1PSPgbD2DbnU8U9YFPRtcoT0/IM286u8TvVC6Vj3CPh495RNbvA8XYz3MMi88OAyXvUoOxbz1P/Y7ZLxVPcKfI7vXpju9QLuru5zTujxiLQC8JH2Tuxiu1T3yxx+8wikdPJqQFr3s2ZW8Ez8WPX7gub2frbs9rciIO2SfnLwq0bq8pdtCvDqbgb3gd+28aF7NO4j1fzuQUPO8Y18KvQM4+zwKXB69IchovRHZgDvl8dk8LA3BPDe7bjxTqaw7chicvFFRUzzoMLW8x8cavAngoryJGgG9XGFIvFlAPLz5wCI9iL6ePH1kpjym3hw9Q9Mfvc5lcr1PsMU8cCjWvNdwhD3H0oy8nzMFvZm6UrxogBI8IpsevfWx0Lquwoe8pxqmvUMH97ynb4885x2bPc4OOL3Liz69SIKgunxDlDy99RE9+iUNPTkSDz0Rb+y8NI8qOwYnkL2MPG895FiDO0Koojx1jXC8GFqtPECCVLws4jM9gVsFPb0w4ToJOJG9zBIEve4VSj1YXTi7N8l/PeoixDzFqO28P8QDvSVEbz13imK87l6evIJkQjuHLC89bowGPB9YXT1qLQy9qkckPCGc2rsvMw68eFMkPA0drDy96k+70trfvNFymjl05jw8qxZLOwTMBL1xaSC8/ik+Oy7EF725k567ZCqbO2lMZbzDZxe741lIvYnceDxmZcQ8dV2Dve/yYDxKZ1o6In/FvOvrCj01Th29qejbOyMvAb1IeCQ7H5UMPdLgY7sVs6g8/5smvSlYvTyZgo081fSTPDjZoTtFJXi81AMJPWyNlTunoZ65eAAROi/3lDx7K2E7QqrfvGUrV72x22S7l+wLvLLPmD3ryPy8E2bVPGeq4ryF/nQ9BOtZvYAhZr2JpP07gM0XvM/tIL1IlA+8TaFPvRkOHTx+kfw8ZWXAvEt7lzwgsDC99uQaPXW7sLyQcwY8rgSTO/J/Czt+FAg8xrUzvGJJibzfBB+747jWuX7DF7y48A49WxSPPYdaBDthP2s8xWNyPW8mojzv0sS8/jJjvEYs9rwomlm8+AghPZD4Rr2z0IK7F1Xfu/kJ7zz7FI29qik4
|
|||
|
|
{"p":"wolai-frontend/next-dev.pid","s":1,"e":2,"m":1773495424268.6099,"t":"27684","v":"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
|
|||
|
|
{"p":"wolai-frontend/next.config.ts","s":1,"e":60,"m":1778399433063.417,"t":"import type { NextConfig } from \"next\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nfunction loadEnvAll() {\n // 约定:全局仅使用仓库根目录的 .env.all 作为配置来源(生产优先)。\n // 说明:这里仅“补齐缺失项”,避免覆盖系统环境变量(方便部署/容器注入)。\n const envAllPath = path.resolve(__dirname, \"..\", \".env.all\");\n if (!fs.existsSync(envAllPath)) return;\n const raw = fs.readFileSync(envAllPath, { encoding: \"utf8\" });\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const idx = trimmed.indexOf(\"=\");\n if (idx === -1) continue;\n const key = trimmed.slice(0, idx).trim();\n const value = trimmed.slice(idx + 1).trim();\n if (!key) continue;\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n\nloadEnvAll();\n\nconst nextConfig: NextConfig = {\n // 说明:3000 Rust 网关会把 /_next/* dev 资源代理到 3100,浏览器 Origin 仍是 127.0.0.1:3000。\n // Next dev 默认会拦截这类跨 origin HMR 请求,导致客户端 hydration 不执行。\n allowedDevOrigins: [\"127.0.0.1\", \"localhost\"],\n // 供桌面端打包使用(Electron 内置 Next server.js + 最小依赖)。\n // 说明:`pnpm run build:desktop:next` 会依赖该产物。\n output: \"standalone\",\n turbopack: {\n // 避免 monorepo/多 lockfile 场景下 root 误判,减少构建与热更新的不确定性\n root: __dirname,\n },\n async headers() {\n // 说明:ONLYOFFICE 文档服务器会在其 iframe 内跨域拉取插件 manifest/js/html。\n // 这里对插件资源放开 CORS,避免 pluginsData 加载失败。\n return [\n // 说明:远程通过 Cloudflare Tunnel 访问时,Next.js(Turbopack dev)默认对\n // `/_next/static/chunks/*` 返回 `no-store`,导致 Cloudflare 无法缓存大体积\n // bundle,网络稍慢时会出现页面长期停留在“正在载入编辑器...”的现象。\n // 这些资源带 hash 文件名,设置 immutable 不会导致更新不一致。\n {\n source: \"/_next/static/chunks/:path*\",\n headers: [{ key: \"Cache-Control\", value: \"public, max-age=31536000, immutable\" }],\n },\n {\n source: \"/_next/static/media/:path*\",\n headers: [{ key: \"Cache-Control\", value: \"public, max-age=31536000, immutable\" }],\n },\n // Luckysheet 静态资源:文件位于 public/luckysheet,路径稳定(并且我们在 URL 上追加了版本参数),可长期缓存。\n {\n source: \"/luckysheet/:path*\",\n headers: [{ key: \"Cache-Control\", value: \"public, max-age=31536000, immutable\" }],\n },\n {\n source: \"/onlyoffice/plugins/:path*\",","v":"Mde9PEs27jwpqAS++s54vaQiDj0T4JW9IlV2vMP0gLzyhj285USuvfnWT73e2A49qIOMPfGcQjvzjLE7TT2/PIKME70x4CW9hTZTPLZYVjxGkSI8ZAjFO6fdFT3KKTi9ewJ0PTP5ij1KTI89zTvqPEbpYb3mp0U8yrIGPbSw7TwjEhk93HU5ug+TxL0CnR+9vCmtvDHGfzziYv48UqjQvND3bDxu57+8QeEMvGJvRr1v0cw8STxwvYa+oD3AoAo9jFf5PSfMqb317Jw7otcYPbaGmru1ode7a5TIPdNMgz23+By8Bi7DuwN8kTzY4Dw7gR0evNPZgT3o/BK9Qi6CPTqoHTyEdEe9tb1VvQ33cD21xV68py8avShrxTuJdu+76PZAOxQX2LyPNFm7Kz3AOrTNmztg9I28oivHOrrJPj3G+oi9VME4vN+5Uj30hKU8VtkcPQgtvrwtNgS9jZw/PAIchbzNRww9yWV8vNdBm7xAg+C8vTkDvApPgL3Umvc7ojBVPO1VIz3PWeo8BfIPveOwgDxUK3y9esqzPG3VW7vLXFq8UngtPZVIoDqCPvg8UFPmvL83h72nzP87Ma9SPTSkN71aZTo57kRhPcOdEbxnARE9l4/EOw3jyLxTCC496UAevPs4hL23Fe07yVihPZI0aj2wIvM8jDcevBcFSTw/FRI9G37EvUG7Ab1PdM67ZFYgPLjvqzymO2E9NrPDPHG7Br3AbWu8Yh/NPJj5bDtTxoq7Wb9svKikA7vcE/U6qPq+PPcdAr1GvEg99IAUu4Gqmbyk+Yi84HcWvXDtEbyxsRi7XhQsPboCXjzWRiq9sSRJPFZ66zy0aJY78mrwvFdDwDxUJzI9mGKdvA8l5Tw+h+E8dcQgvVE6FjyLyG09nfdVvGSnbjx+Q8e9UFUgva44BzyCWaI8YJoxvCWYELt34Ko79XOPvZyKPTv1gNG8h+X0PDuj4by0ZiI9hye7O/AoMb3GJtO70cQGvfQkvbyIpwk8RoUmvYUmVjzJV928wpgrvXZTHj3ffZG7eF5OvWbLAbxCU4w7uOjKPKobS71n7tg8ybMgPRbL07vGCIo8JkFlvaZ3LT2cTie9mMLAPAusKr3E9TQ9v2WWPTqPK
|
|||
|
|
{"p":"wolai-frontend/next.config.ts","s":49,"e":72,"m":1778399433063.417,"t":"},\n {\n source: \"/_next/static/media/:path*\",\n headers: [{ key: \"Cache-Control\", value: \"public, max-age=31536000, immutable\" }],\n },\n // Luckysheet 静态资源:文件位于 public/luckysheet,路径稳定(并且我们在 URL 上追加了版本参数),可长期缓存。\n {\n source: \"/luckysheet/:path*\",\n headers: [{ key: \"Cache-Control\", value: \"public, max-age=31536000, immutable\" }],\n },\n {\n source: \"/onlyoffice/plugins/:path*\",\n headers: [\n { key: \"Access-Control-Allow-Origin\", value: \"*\" },\n { key: \"Access-Control-Allow-Methods\", value: \"GET,OPTIONS\" },\n { key: \"Access-Control-Allow-Headers\", value: \"*\" },\n ],\n },\n ];\n },\n};\n\nexport default nextConfig;","v":"GuMNvenSOz0gVQS+2PeKvUAhoLutU828UX13vDV3C7srd1O6Ee6KvbSWOb2aDuk7M+fUPTQozjs6+RI9SbjQvG7pm7x36H29ugATvEDRdD1xsww6k4+7vayR0Dvlj5i7jIN1PTWggTxBNyw97L53PA+air1vfuA70uA2PRY7IrwI56e6W+4EvD6vXb1dEwy9J4QHvPWjzbx6UXo872v6PC0d7jztuFs8Zy9MvNh1JzsDAQk8kfzxvFoPYD3NPn89554KPn+us71tE8A7Yek8vHOPUj2T7J68hTHYPUiaBD2EY8y8Vy7uO3l5Wrx7WQY73MrYPL+lyD0F2gw8RiBsPRqKjj1IUZK8I/fVvABgLD0FlIa8iavTvPOGhz0i0iM8bRL9OkwNrry8OzE74IFGPLCAxrxJNb68xayTO0oFSD0WHtW85yIHvGCpAj2zi7o5z7IfPXxklTy27Qo8sA0ZPNu7Rb3zmuA8xoKkvOM9GL2to0s81E6/Ouu6A73V87u7vuBXvG0eNj22ZnM8FL4PvYZOCTz7RxW9sSK+Oz0P3DzHMfm8gVYyPTkwtDuHpE89pyEWPLBQK70/st28s/ZYPTom8rxFSco7R4B8PTHOljsfyoo9sSSOO7Ikubtqc6w9q5G4vO07Nb2jp8A8nFg9PQHlgT2BI208LFUBvX2/QDuc2bW81lVcvYHfzbwzTdm87xQdPHS/sjzMKts8CKcTPYa5rby+C7S81z4Zu5ljb7xs8f07rMS4PPdYhbtdY6e8Gg0AvMEW3byBrEE9jZOvu0pUjr1LgnE816OPuwVoSbxeZ4m8MqEWPcu5vjk0vk29CFoEPWz837qpl668eqetPIqNPzyOq4k8+vNtPFdFjj0hh7Q8Ng0gvdkKlDuTUwE9dWilvNzQKz01RZq96pk4vVdZj7yaczc9oLqAvD/U07ynXR89Guupu/o8pbwCE0q9oaxxPFiFe70nsHc982unPPdQJb2H8kO9irTyu29LMrxI4HI8Srgzva/UKDwjPSu9R4tSvV67Hjw4Hxu9rCKJvUXgizyXsgq9F4YwPT0txbyzfP08emLgPOuEE7zjCGg7D5R3vPTdEz0LGXC8+OBJPaFakLvrjTK8Xt6kPRI4tDwVSAu9yltEvBG4tDy2PrU8IeSDu3Eq/bwubQG9q0/nuvWrZz0rdca8qZlLPPws8rzzkFM9CFeePFwupLwlvE68NXXIvKh8kzzCjv28Ake/vSA/5jw/9Do9Y2t9PDbHpjx4RFU8JDxsPfs6UTxmYak8swQbu7bhnTzWsSq8xZbhus5kQr1+il68Sb0CO+SIqb3fyMy7yKSbPY6f3zzBHBy8TgzjPEwELj09hgU9SqpfvXnyyryZ5Bo9ACUSvCmPc7wm+Ys8zpw5vBr7EbyRN4q9NfaHPBvoETt6Tgm85MK0PL63CDwU4xU90FpKO3X5NT1l8U68V2yQPc59D73GJ8A8wXe1PApyAj1P4m+88eEXPdfZOr0wCLu8/AqcvIhiMbwa1/W7MWDEuglgg7pKb0+8KL/4uvrA+TzGnoy5lS+rO2BKLr14xQw9ggc9u3GRF7qkHlU9rj5Fu6gLLr22EO28fA/CPKUQcj3fp5c9RixPPcSik7zNfRg7IbQ2PQdBR7z8Ywo9IPcfPJnF5byYEa08Wzc0vTCoUj2BvCy7IvSIPImY6Dz2xR08AAhbPTbjlrtedAm9orE4vYehWbxQo628e4SMvBWpbTzWJs68c/GoPNjEdLuKUH87oyuLPRRROz3QRCY7FXwLvdXqXbuNtI07qVKPPMIwubzxAeI8zNKdPHgvdz2qcxM8MnKAPGK9ULytMIe7a6aCPBCKCr0FjGS8ZDBCPeklBT3o2xu9ubp/vA48Xrw2/Ec8vBKWuxqdFz25l+68RRUTPTS59Tx1FWA8mLOiPJTYMzwc+nA97Sx8PFGgjzptWps94JENvLQEsryzM2E9SWboOaLYsbwUZkm9/DwGPFzcirz6iye8G9MPvGYDXL0nGhE9Hf5PvSToRT3MDGE9pVBWvUIGODyJbmk9U/4dPR/T6TzrbhQ9q5AJvSakAj20Y1Y8pT5PuqY2Cb2Lkj09uVP0PPABWj2SyNO8j4EHvIGIAzxhiXw8IIR3PZZErL03QSO9J+yCO1NXkTypE9S8k6l8POW3jbzdcn29STeDPcRa6Lxa47M8dggDPbcgyrySvVa8SBlJPbbj4zpUghU9OGgSvTCqoLwbr0S96vg6PYbKnjv5TXy8KMjnuzI1nz0/qts8QZmnPL20ZDzjgOY8oCBZvZPZ7bw3oX49wEujPT7V9rznkpC8Cfa9O2k2xjw4ZAA9wCInO93a0jy9D6E9y16wvet7srzsFFm9dzsRPfw6fD21oBY9h8MlvVGlKL1pCz49V9Z5OkQHqbzaCwE9zxE2POFnpz1clWa9TJv/vMtVAT18fg49mlSvvHwobrs4vrK5q46BvfLqBrykDM+8GAvduzjZGjwVXBK9SzkpPbtQkj1v0WK93LtJO0bQxTzYEYc74BOlOlII1jw5+L68OiG+PGvVwbx3WdI8jWbcvEIter2gzYm9EHAqvVkniTyb+GE93zDUu5ColLw9kKU7xrPfvG9NLD3B0Ay9Q2SIvPcJFjxPHDu8Ec+bvfnZ7rviyCW8lg5SPDDK8ToukfC8RdPpOn1RaL0MeFQ9sMPmPGCfXrxCspk96wdSvbsfjr3asbK8g8kWPYRuLL0axFM8NzlDPTm2ZT0Ml9i73dZlPOE9gjzimmi9PXvRO5ipbLs+9oi9P3KrO+DCobyChce9GmNVPBxBn7w4zre939NnPYQFCrzUXyK99JE1vMWu1by/QOS79ZK+PNao8zxKV8O9/X8KPabXMj3Mjyg9SHLNO04R1bzpM6I8xnVzvKOtAb3k9pm8tJUZvV5oCT3O+Y28odOnvU8Xqz0BIYG8xWKxPKXYsztXvx89Yl5EvUHHLDxQNsE87DhEvQABj7wfuZc8OdQjPLftlTwKVgM9IdAjvLKARb2QVIY8iOm0O4ZAirvSDzA9YXDzvD1J2Lw0f6a8ayzYuzciYb2awUG8FBaiPI2pNrzNrk296LtfvBnZW7wFs0G9WHHRPHVVyzw7WTm9EmL3PIlBhrw11lK9kJZVO22jGL0IpkO9gBPwu8SQgT2ernK8ckSIPB
|
|||
|
|
{"p":"wolai-frontend/package.json","s":1,"e":60,"m":1778032105652.3577,"t":"{\n \"name\": \"wolai-frontend\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"node scripts/dev-server.js\",\n \"build\": \"next build\",\n \"start\": \"node scripts/prod-server.js\",\n \"start:next\": \"next start\",\n \"lint\": \"eslint\",\n \"test\": \"vitest\"\n },\n \"dependencies\": {\n \"@auth/core\": \"0.37.0\",\n \"@blocknote/core\": \"^0.42.0\",\n \"@blocknote/mantine\": \"0.42.0\",\n \"@blocknote/react\": \"^0.42.0\",\n \"@convex-dev/auth\": \"^0.0.91\",\n \"@dnd-kit/core\": \"^6.3.1\",\n \"@dnd-kit/sortable\": \"^10.0.0\",\n \"@dnd-kit/utilities\": \"^3.2.2\",\n \"@hello-pangea/dnd\": \"^18.0.1\",\n \"@hocuspocus/provider\": \"^2.15.3\",\n \"@radix-ui/react-avatar\": \"^1.1.11\",\n \"@radix-ui/react-dialog\": \"^1.1.15\",\n \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n \"@radix-ui/react-hover-card\": \"^1.1.15\",\n \"@radix-ui/react-label\": \"^2.1.8\",\n \"@radix-ui/react-popover\": \"^1.1.15\",\n \"@radix-ui/react-scroll-area\": \"^1.2.10\",\n \"@radix-ui/react-separator\": \"^1.1.8\",\n \"@radix-ui/react-slot\": \"^1.2.4\",\n \"@radix-ui/react-tabs\": \"^1.1.13\",\n \"@radix-ui/react-toggle\": \"^1.1.10\",\n \"@supabase/auth-helpers-nextjs\": \"^0.10.0\",\n \"@supabase/auth-helpers-react\": \"^0.5.0\",\n \"@supabase/supabase-js\": \"^2.81.1\",\n \"@svgdotjs/svg.js\": \"^3.2.5\",\n \"@tanstack/react-query\": \"^5.90.10\",\n \"@tanstack/react-query-devtools\": \"^5.90.2\",\n \"@tanstack/react-virtual\": \"^3.11.0\",\n \"@xyflow/react\": \"^12.9.3\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"cmdk\": \"^1.1.1\",\n \"convex\": \"^1.35.1\",\n \"jszip\": \"3.10.1\",\n \"lucide-react\": \"^0.554.0\",\n \"next\": \"16.2.4\",\n \"pdfjs-dist\": \"^4.10.38\",\n \"react\": \"19.2.0\",\n \"react-dom\": \"19.2.0\",\n \"react-dropzone\": \"^14.3.8\",\n \"react-icons\": \"5.5.0\",\n \"simple-mind-map\": \"0.14.0-fix.1\",\n \"simple-mind-map-plugin-themes\": \"^1.0.1\",\n \"sonner\": \"^2.0.7\",\n \"tailwind-merge\": \"^3.4.0\",\n \"uuid\": \"^13.0.0\",\n \"vaul\": \"^1.1.2\",","v":"NCCJPBuAkTwbGwK+diI3vaQUsj2wY669qxWvvDEzS71P2kW8ah6cvcaoUTx+k4A90oeePeRNGz2Tilk8xsm8u9sYCD1fZGG8yPk5PbSaX71FrRS9RQQ9vb96JL1e/gq9ZoXRPXVo5jwNDFA8ybNKPZdBlrypcQg9QqioPVCbk7uj8vK6bhWAPOVxQD2WrYW9oc4lvR3uU7xU8E09OtmXPCXEPL2yYoE7ZVNPPADCz7x1sGs78f/zvP/hZjxW2rS7/DmTPHx3Ob0X0/M8yUwavX9ATr1NZs+8yYwFPWX6TTuvZ5m7mFIXPJnVLD2HICi9Qt7KPLOEfz2OwvG83/6lPYuaTT0fN7e8KFQEvfp5ojzmcJ49jWrSunbJfz1NVc26lGwXO6tiDLwTfoc8C+SEPAANBDzb5iO9hXS8u2IIrbz5E9s7ymEPPIUuYz1o4au8sougPNkBUr2dzxW9FazIu/haA761nNc92jtxPcnV7by2EF69LWEcPB5LjrxTnxu9CVkcvMXcljoDeuO8aB86vbH80zx14jW9PXRgvf74brz6oEQ9y8CWPN26Nb0jHqY8y218PNnTaTzATQC9Qon/vAxXdzvA+iC9QSfyO5KvJL2IyYw9QXGCPJ0QsTqrbK48VRgovTlPFLzMBki800zou7Fmoj2ju2e9QJ71vEh9Ab1o/708u5+NvBmokTxpODW880t4vaYi2bn7EDI91YvAPRKYTL11/e68hi34OvBbAb2jZP668g2XPGqawbt4x/68eelKvPtGQr3JU4w9AYP8PD7hy7zgWMo8MzV1vDyD9TvOXRS892tqPLpnGTuvOIW9+L7/vLZp9zzgE3y8lPhLPNXSMz36hoQ7m+OcO/88Pj3CZxU8/hEbvUWQQz2iTjI96FpaPBOUyj3A/Wa9T0RAvV1kJL1u0XM8AczpO4ghTDyNWn48FgqSvLMXFDwDVEI8g8XDOwRcir02lBI9QzXOPPjrrrxe4wM7T4EXvLBYWL3qnX285GOWve2injw1zpy8TFtGvVf70rvkHNe77xM4vTASorxYdqK8ukqOuy53wbyBa+G8H9KxPAyudLxW31Q9w9FTveRhmzy3PPS7AoByPJwLBzwDvFE9nCQwPTMXz7zIY9Y7ARzoO8I8DT2klB47+MLLvFX2tLyWsYS8YiY1vOjFez2voBi9P0qBPIOBHr099EE9oMM7vb7d37ytzik8a0fuuy7KE71zVh29cY1nvfx3qTvJiOQ7TjPKPNDFQjwtGDO9n42uPGQXFL2b1Yi7lWzvuzmiRLyT3KQ8SM7GPN2RgztMfa27cNKDvEVEhzzjofc8IkJaPcX54jwR2mu81k3VPHTswDymtLE8roygvNCrCr38xeC8qzf2PClXe72cqIW87tulu5axnTxmARa75nLRPC0vybvhyy89g8L9vGhWpzxYShA8AYR5PDz4Ir1zBfo7z//QPPoMbbp4rmY8xV+TPJ/7ZD0WKwC9MUm7PVcOjbzHhB68sJiHvDvYoz0fHoU5GgYavR2IDjvFiaa8fxOvPFuPBjw+1K48FLxjvB5O6bxoNyw9/BaqPDHVyLuhYI08E22RPCsmYbwm5ao8qwKkPCp4sD0icHo9NUTAPc/axzyGCxa9/8EmPKbWJD1Qqa68pVSKPCUVTb3YkKA80jbdvOJfkjz0ghk8Gb9jPW+fmjwdRiE81jDbO3FhmjqhDla7ViLUu3UwBL2FwIy91bxZvLQaPD290UO8UFkaPZuyIT0/qK08CmOAPWCctDze8
|
|||
|
|
{"p":"wolai-frontend/package.json","s":49,"e":81,"m":1778032105652.3577,"t":"\"next\": \"16.2.4\",\n \"pdfjs-dist\": \"^4.10.38\",\n \"react\": \"19.2.0\",\n \"react-dom\": \"19.2.0\",\n \"react-dropzone\": \"^14.3.8\",\n \"react-icons\": \"5.5.0\",\n \"simple-mind-map\": \"0.14.0-fix.1\",\n \"simple-mind-map-plugin-themes\": \"^1.0.1\",\n \"sonner\": \"^2.0.7\",\n \"tailwind-merge\": \"^3.4.0\",\n \"uuid\": \"^13.0.0\",\n \"vaul\": \"^1.1.2\",\n \"y-protocols\": \"^1.0.6\",\n \"yjs\": \"^13.6.27\",\n \"zustand\": \"^5.0.8\"\n },\n \"devDependencies\": {\n \"@cloudflare/next-on-pages\": \"^1.13.16\",\n \"@tailwindcss/postcss\": \"^4\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"^19\",\n \"@types/react-dom\": \"^19\",\n \"eslint\": \"^9\",\n \"eslint-config-next\": \"16.2.4\",\n \"jose\": \"^6.1.3\",\n \"jsdom\": \"^27.2.0\",\n \"tailwindcss\": \"^4\",\n \"tw-animate-css\": \"^1.4.0\",\n \"typescript\": \"^5\",\n \"vitest\": \"^4.0.13\"\n }\n}","v":"0Wssu8a22Dv0cvW9A6n5vPNPZD3EzYu9gszmOYEhCjz6GXA8UTwNvjV7z7xeMiq80VysPYyVVj2/Kzo7W3dOvPQ9MD18AQ+8CvqJPZMabrz8Pgu9Qt/QvbP9Mr35BzG8wWSnPFTzkT3Q+h07zyE5PdIyxb0AeSM7o74kPfSVTrz9Ajq9N4Lzu6wq/TunUzm9xrC0PEkjQr2RAgA879FYPVXk4bx03GW8QHCwvMbvKD37fLI8CuEVvTfMTDxKWPE8XpYnPcCxKr1lR2Y9pEnOPEXPwLxwjDO9t2mRPa1/AztAYjm9erU0PeVEdT0dUci80vcnPDzlVD392428G6XDPPUqKz3DKae6V1Z7vWF3kTzbuwW8wTDUvApf2Duuis48bGEFPIP9ID0sble86nVWvHLMoTzwvDW9J8M+vW/VaLtZRXu8PVQYvPPmTz1ukM68qTABPRhrAr1+k1q9SkfWO9YON73+g4Y9EvcgPMFKnrwmbtS8qAykPFkcAr2BEAK9V8Q5vCu/Ibwgus87vD5CvY4aA72Nkt28bZrBvNuwybsY3og8Eh36PDZEH73MPPQ8F4iWO61CKr13Jze9D/PuO8BQo7sLprc8lacAPa/dYryEsAE9MUsivA/PfzyNU4o9XDblux0jUz3L8LY7PPLVPEkJFD132vm8teThPEh8Or0/zLc7/vvyux9037rJAk+8iFrbu62SIT0JogI9/3XSPZhpQ7yMAYM8AXcOPC17sjvhS4Y8PgOQPBwvXjwapl69k2OCPPOra72+/Bc94SQ1PaLBz7zIIaK8cDrZvMJhbr2ut5k6V9W/PNhAjDtwooS9WSQavYMvDT1yjyG8ydmyPIAdFTzYdYA8rmnUvHDQXz2AJRg7lR5yvA5dhjzvkbI8ogHVu39kJD0k4Mq9UaWWPH3YkbwXts88WBPZPIhXIL2C2tw8HNUyve0QCr1GMBO9hjUbPda0p7zWMVC7tEpRPIotnDsXGeq8zeoGu8lQRr3ZsMS84rIxvdpQfT3bMvo7w9OCvWZ/6bw/WdC8N09NvRyFqDzd/OK5aJagObiXPj3F9gE8DfN4O4e3Uzsii149++zEvWUjUT0ROp68X3xVPZa1Er1+ADo9V5oYPe4C2LwPQps7TvJ3u+vPEDzXvyQ9+DbVO56xaL312wG9i+5tPGljaTv4lAw92A2zOhwqJr2LQY09b+WsOyZbVbxzxrS89yRwO9YyeDu+eAg7TjaZvHgKqzsLa8E8S76RvL2UbDtSkw+7ocnIPOABhbwMzLe8Am+Auy8cGj2Cqf082tAbPXsIi7zwIN88fwSYvAEmVb0CqYk6EL7dPT5EJT3YLjU837qxPMxOET2Kan08ukExvSqfcL3oFLO8ACPSvBlEsr24QAu8zO2EOox1wjvCRCy9hHIcOxxY1rxV5be7jsxvvNgJezxA4kC8Zx3RvJ6k7TwL+Ly8joA7PRh/E72vIpA9c6huPLkewrxQ6OG8zKSbPWH6kbyUCLs82wThu/O0KT0kAlA6NDo4vYX8FTxzW6a85bgdvRH0Or1qA8w8o8A0PSdaBr1RHg89z3ImuTg4Kzy62kI9aFi/vI/JGL23LwS8Xm8aPSEuAT3p/eU9cZOKPaNIeTxlUxq9o+bfO/iGPbyYJ2+8wMM1PYpox7xFKHQ8zcI3vKzSvzz4JPC8DHSFPZQeCz1YvNw8tTq6PHhetbsKrio9N8ihumhSL71Ley29LFJSPGXecT0X2Xc7PrBOPDUj2TybDQk9wdCtPZT3Jj0CYl87C1TcvOxT8Tz8eJg94126vLsLNj3cTSg9WYWVPE4NgD135B+9FFO1PIK0ATsvfBi9nc4xPFPMm7yejCy9jkHsPB1aXz1Exga9mSPpPMNYDb2ctmW7pdyxPPllSbxNVb28NTGHvA1zUb1LO987n8m1vInpXrxkaSE9qeqQPAYvkbu+cDg94e7su+gnkLx+XQU9PAtivJUDKbuyczu8QALMPOL4FjzBP9g7+twuvXmR0rzsq9k8oZKJuwA8hrtt3pk9l016vAq7y7zux6E8eu3kPLu4NDzDCzU9RkGlvXvgDD0ZPgc84zt+vDvyiTvMm6W8emdbPdL1SzxCc328oQcxPbIsgD10hZ29jAClPbc8gr0+GQ69FQmOPBdZMrxEGSK9s68qvPhITb1YyU+8syRnPWOQd702t6U9A4XBuxs2zDz8Et68YvcNvZz6M71OioU9u7FaPFzzEbyBmT47C3ZPvJYr9jx9N4M7xvWovAYSxDxkZLg8fMN0PHcfGD0mpKS7QqyIvDNazbzi2MS6z3M4PfeQGb1iK568VefSPKa4kzzklP48kvPNvKLlIbwi9Ac9t+SGOtlinDtmrQy9kH3jPFPu5T0PCEo9KXkgPN1dNb0gbGW7lMItvdoLurrZA8c8E4zbOmjTNz1CXh29V30ZvTqIvDoHM+88tBcYPcKuaDxJrJo8/qPzuofzvLog5Aq9GB5fvGPZuLulOPu8e6gqvEJAkjynfj29kIesvFPN4rm8zLI8kPC9u6HEOzzeyBk9aA5wPQ8Mwzz+iAw90pwjvZ4L7rwFdp+9EFLivLIdqTxdfAU8IqnEvHloobzdbt08rFHMvEcIDD0zzQk8YVIxvXZkoLveork8ziLZu1nOmTtbcsK8gTKzPNpDLD3Lt7a7GtNkPGQfrbySw6Y8a5iFO9qdyruwQAW8sxycvYQUK71IRIs84fSfvDbdu7vGtMA7X5A8PbEFujspY6i8gtCXvNmUgTu1T8O91akNPKnLsDzyNDa9kbAjvEoHO73Alya9SKo4PTo9lr1lqGS98Ok1PIpzDz3PXYS95yeNuwjwAT2onkk9md9mvKnRnLwx3mO92PmoO56vgz2mxYA9o/ksPPkMDjsqIjO90krRPFfg/rxRa6e8CBShuZ4YpD3eM+g7Xriivbv5Iz3O3vq796WXPNeGJDwr1y481zXXut2YuLyHN/q8ht6WO0gKRr0lCEO8UVaIvBfKTbwHacM8pWcSvWKNPr1Rkwu8QXg0vS64i7zNNQQ9b
|
|||
|
|
{"p":"wolai-frontend/postcss.config.mjs","s":1,"e":8,"m":1773495424316.6104,"t":"const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;","v":"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
|
|||
|
|
{"p":"wolai-frontend/start-4000.out","s":1,"e":12,"m":1773495424334.6106,"t":"> wolai-frontend@0.1.0 start F:\\SOFT\\MNOTE\\wolai-frontend\n> next start \"--port\" \"4000\"\n\n ▲ Next.js 16.0.3\n - Local: http://localhost:4000\n - Network: http://192.168.121.1:4000\n\n ✓ Starting...\n ✓ Ready in 785ms\n ELIFECYCLE Command failed with exit code 4294967295.","v":"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
|
|||
|
|
{"p":"wolai-frontend/tsconfig.json","s":1,"e":47,"m":1773495424357.6108,"t":"{\n \"compilerOptions\": {\n \"target\": \"ES2017\",\n \"lib\": [\n \"dom\",\n \"dom.iterable\",\n \"esnext\"\n ],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noEmit\": true,\n \"esModuleInterop\": true,\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"jsx\": \"react-jsx\",\n \"incremental\": true,\n \"types\": [\n \"vitest/globals\"\n ],\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"paths\": {\n \"@/*\": [\n \"./src/*\"\n ]\n }\n },\n \"include\": [\n \"next-env.d.ts\",\n \"**/*.ts\",\n \"**/*.tsx\",\n \".next/types/**/*.ts\",\n \".next/dev/types/**/*.ts\",\n \"**/*.mts\",\n \".next/dev/dev/types/**/*.ts\"\n ],\n \"exclude\": [\n \"node_modules\"\n ]\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/vitest.config.ts","s":1,"e":18,"m":1776442821892.3726,"t":"import { defineConfig } from \"vitest/config\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nexport default defineConfig({\n resolve: {\n alias: {\n \"@\": resolve(dirname(fileURLToPath(import.meta.url)), \"./src\"),\n \"server-only\": resolve(dirname(fileURLToPath(import.meta.url)), \"./test/server-only.ts\"),\n },\n },\n test: {\n environment: \"jsdom\",\n globals: true,\n include: [\"src/**/*.test.ts\", \"src/**/*.test.tsx\"],\n },\n});","v":"WpKkPN7pCD26Wg2+g1pRvYousD0Ny5q9VR3DvCL5LD3XZ6Q7DGsrvWtoqbwAGy89R4OfPWQZqLzgBCO98UVdvbWWTTz/IIS9hBAuPUlRpbw5oXS8z47JvfTKhTwT4IK8JnjLPW7+Hj1TT847y0YePRAPHL2aBiE9nmciPSS6mDyrcXE94kVgO5g1rryb5OE8zpCDvXOh5Lw4dMC8g9/qO26pgryEHxE7CgHDPMrOKL1NXk89bGqQPNJUsjxpMvw888N7PSuWi72T4Lg8oZOrvO631bzMOjK95AOcPemcsDtJv2m7bWgJPTtk6DxdEpu84zGeOwYHWz1Uo428W2DiPZTXPz2huGi9s79FvU/UlD1GPWw8MlahPAbiEz0AqZe8+RrWPCexPb2xv4G6MDFHPEBJHbuSXlC9ZrJyvOTDLjnKWNI77IcGvJV7qDzZpUo82guFPVVtBLtny+w7yk1tPINZKLzVxzI9Fos3PVW4U70PxMQ7geC/PAVBWb2Wx8+85D1Su9AQOT3jtg+9t1XhvK+NMz2qeh+9Q7UwPHcwAD1yoKi8AuyDPVyI4TuMN0g98IWDPVifU73Xz5m9BVFMPdBxfbrM3oI8J4eWPfYIKr02l3I81HfnuxzZprxz5x89WX2dOznqQbz7ILW7zEu5PIqONT0D5Fc8Hd7ivEKNCzy3gJo8cmplvZwiXL2qg9m8qNllvPDEZTynF1E90mZXu0D0Eb2If1a9A5jNvJc6fjwkylK8O0kSvSes6bx1mJ08UeIcOzeahr1gU4Q9qm75vP6OOr2v6bw8Y92rvNPbvzyzSvI5U0sfPHWoNTwqXDG9+wMwvOZw6jwxqWA6Gisku2ckFD2oT3K7GjYUvV6vMT35YI88atyXvZy8ED0JEgc9p24FvD3tuTxlV3C9W9MJvZ7JyLzVakw8GViuvFTIr7yHPAq73KjZvC407jh7uYS8jWMVvJu04b3pUjA9SMcRO6T5wbxNQD882RzrPImaNL2R2Qs8QUgvvR9UFz1YksS8WM6EvV6mYb3Aeje82JCLvcempjyxFt28ie0jPR+tCLxTO9q8OgrQO+QTbDwRKK47c21bve4PLDtRbqy9S0w9PZF4k7yckuQ7pmDAPW9/ELxcIEK7JvkHPG3DqbssQKk79PUHPdo8lryio+28cfnqu/0Z5TyxHEG9o8chPWFvgTrJxjE94vqBPBVRtLzeOQk9SErZvH5Ttbyh1tu7VC/JvTOMtDxzmTE8WNHCPEbJNz3ALPq8LDMfPVlSK7yxnTY7z5KTPMQtb7pN+DC8Aag0vM5qDLzUA1k8H0TEvOnUAr3LWKk80xsPPaOiIz3eFNs7t+twPLl0kT3SqcY7i5aPvb2tM7zxBti89rHdu4ReiL3xbZO8AtPWvEhxhzxhNeU7/0JSvCWtT73gwdE8Mh4HPOau67vFARw91HP3u5N2Xbs4Vbi8zcquPHBt0Tp0hD09pjAvPRblZbsCI4O9hp8TPcixi739Zwe9H43QvIgbpbymUF88/PnUunfqorxzSQs8h/aOvA1L7Dyc9Yw7xX+uOtBh4LxJlag9Sz0fvDsR/Tskwu48NpR7OjPJE7zthmS8WlQFPffE+zx67ps9gFGLPeQ0Pr3BkRO97e7Hu/CqjztiSQQ79k8yvBOJQL3hsDG8TJMlvRZPfD0GXr28PZgcPHP39zxQ7hQ9qovmO5CFZrzlHx29/KP7vMbBDj2Cd148JQgGvYjSHD3jEn68XDHpPIU9WbtwYyC8D9mEPXyrJT33ge08o88XvcS6iL20yEa86lJSvbPckzzbmZE8xU5KPVv1BzqKdXa9jkqnOguW1DyiMHK8BITXPObF9LzJdGM8UmIePYYrRz3ODpS9QKFLPWPQBr16TXc7zuF0vD1hsTuGdvY7wuoGPczdzTxDedm43Y8NPcaMX7yZrao8nTXvvFciBDsNSJQ92Qg/PKEOEjpwbzE856Q7vODqTbx2Lku8oXibvCGlZzwjN5c8QM3tu2GkmL2oInw989xpvUnU2jy2TSU9IUEyvRY3rDz/5sW71rDWPGH9AT2R/O87mwTrOxQ+GrzwbzY9Z+veOO5hHryaFZU8TJgpPAfb3Dy7mCA9YNIXPUihYj3kpze9eG/sPCRIeL0Fq1y94yNIPcAcnrw1RuO8VVSQO5gbFb1avWW87NdCPbpTtDykWto8LeUePdO8eDxUtyS9JvYhPddLMDyCroA9ztosPAiOJ73e6tm8ONIcvXZeNLzxDqQ8lghgvGhRGD0SSre6qFMBPT2nizyJ4Yy5jOfNvGtMJL0V++I7lSG6PPT0HL14Lg+9Q1dUO3zbwTw5dFQ9RTaHvPYKDj1xLmE9RTU0vPvzCTzY5T+9r+0evSxQwj2jfI49e5OIvJEWkr3oq/S78ZQ3vQ390TuiDkk96oqjus4Ahj3T5ny8qb+Gu9H+Ljqz9Tk8WG6JvGeVa7yD9p88vwUnvRKR0zwDX9s7CwS1vKQntbzcdyq8OrAuPVQ7cz0qryO9N0wEvcTGVjzQKCG8fsKkPXNoAj3Bkrw7n2PXPN/M47rKBh28X06GvPOhhL2U+lW9QocDvWtyobv1ECE9m6ugugfxNzt4Ifk8c2ZSujOJxbwVvEe8Zk3ZvIrjlTxNq3493mS7vMKwzLyxNCE8+qhtvGNsIrzp/9I8LEiXO7V4F7yICiE9F9UAvWMBnjthfh091a3/uxhkP70CWBC9TjVBPWpPDr0y2868dsxNPZ6OzD1tEYW9H/KgPHLNPz2yZYO8gFK4vIdHszxHF9i8n6CXvH6eOr0TVDa9Z0AjPbB0IzxleF+9/27zOjeyAzvv6hS9H17FPCkCzLs7sc08hlX8PPJCLbw0R1O9MCkdPXv+S7u9QTA9x0MQvf6aF7u8uCI9hpQUvXkWAL3oZHA8TaI6PPHY8Txxh3K7sxK4vP8+uTzglg29XN30u8PI5roK2wg9M62uvJi+fDwbKtK8hK0tvZfBE73P1/Q7M54aPXaXYDwa5LM8S9LIvDTLxryx65U6lg6FPA6eXbwp7bA8HJI2vCCc6DuBnV472tkbvYgZjruDiTk9v+0RPGsFFrxZx6W8pj4SvU774TxQjJi9cdAhPWVEoDxvOPq8Vf7GvIXchjyxSX29965kPF90ZL3Ld1Y8Ty2JPLgCaTy4CZa56OKMPa0LLj3KX368X7xXvYsagr0og9c8T1jxPPSGIj0MrRI9W66wvK/PHT1Yzws8jtfXvF1izzxDeuC7fcnPvETJqzxAcss8A3hBvZHQsTwmhVo9slwfveX7DTvBuGY8GHHGvBNlnbx7cMy8Ln1hvfBvhT2O8h08m4grPCSqO71QOCa9JONyvHABXDw4rrc8CxKEvatGFT3TMK+97NjdvTcIrL25LJ498Yebu+TCwbwTE6c8L6sqPRIZjD0QE4a7N/AfvGO9TLzr8Aa2CcNJvXDo+DyMgfo8HJuTOOgBqDwTnNY9RJxNPYI97jxP
|
|||
|
|
{"p":"wolai-frontend/src/proxy.ts","s":1,"e":55,"m":1778395785622.2131,"t":"import { convexAuthNextjsMiddleware, createRouteMatcher, nextjsMiddlewareRedirect } from \"@convex-dev/auth/nextjs/server\";\nimport { isDevAuthEnabled } from \"@/lib/auth/devUser\";\n\n// 说明:\n// - 这里启用 Convex Auth 的 Next.js 中间件,负责:\n// 1) 代理 /api/auth 到 Convex(用于 signIn / signOut 等动作)\n// 2) 刷新/同步 auth cookies\n// 3) 对需要登录的页面做统一拦截\n// - 默认将未登录用户重定向到 /auth(Convex Auth 登录页)。\n\nconst isPublicRoute = createRouteMatcher([\n \"/auth\",\n \"/login\",\n \"/api/auth(.*)\",\n // 说明:ONLYOFFICE 文档服务器(容器/远端)拉取文件与回调保存不携带用户态,必须放行。\n \"/api/onlyoffice/proxy(.*)\",\n \"/api/onlyoffice/callback(.*)\",\n // 说明:媒体附件 API 作为 Rust 3000 的 TS transport 壳保留;\n // 先放过 Next middleware,真实鉴权由各 route 内部 requireAuthContext 执行。\n \"/api/media(.*)\",\n // 说明:/onlyoffice-server 与 /cache 主要承载 ONLYOFFICE 静态资源与二进制缓存。\n // 这些资源不依赖用户态,且需要浏览器强缓存;若经过 Auth middleware 可能被追加 no-store,导致每次都重下几十 MB。\n \"/onlyoffice-server(.*)\",\n // 说明:本地自定义 ONLYOFFICE 插件页面运行在同源 /onlyoffice/plugins/* 下,由文档编辑器 iframe 直接加载。\n // 若被鉴权重定向到 /auth,会导致插件桥永远收不到 ready。\n \"/onlyoffice/plugins(.*)\",\n \"/cache(.*)\",\n \"/api/health(.*)\",\n \"/_next(.*)\",\n \"/favicon.ico\",\n]);\n\nexport default convexAuthNextjsMiddleware(async (request, ctx) => {\n // 公共路由不做拦截(但 proxy 仍会处理 token 刷新/代理等)。\n if (isPublicRoute(request)) return;\n\n // 只在启用 Convex 模式时做鉴权拦截;否则走 Supabase 逻辑(页面内部自行处理)。\n // 注意:proxy 运行在 Edge/Node 环境中,读取到的是运行期环境变量。\n if (process.env.NEXT_PUBLIC_USE_CONVEX !== \"1\") return;\n\n // 开发用户模式下允许“免登录”访问(主要用于迁移/联调与 E2E 回归)。\n // 注意:生产环境请勿开启 MNOTE_DEV_AUTH。\n if (isDevAuthEnabled()) return;\n\n const authed = await ctx.convexAuth.isAuthenticated();\n if (!authed) {\n return nextjsMiddlewareRedirect(request, \"/auth\");\n }\n});\n\nexport const config = {\n // 说明:排除静态资源,避免无意义的 proxy 开销。\n matcher: [\"/((?!_next/static|_next/image|favicon.ico).*)\"],\n};","v":"pyekPLohLD25JwO+PGuXvYx9OT3leR+9teTCvEvjGjoJCic9yLhcvfndX71CQ7w9VxHAPQhBNb3ZCB+88Exau73syDxMN+a8vDKOPEM4V7y5hSS89CU4vWdFUDz2s/a8m51fPUPbbD1/tw09uQuOPTunjL3qZJ26DdsaPRZ3gTz8J0s7ysdGvIoPgrybZuk7xRtuPKh3NrxGSuO8XWvJPCZ1tjyml848SWRmvDdyk7uiBYw9VdHmvP++j7q3WiI9oDHsPZnCkL1QLBA95+mKvOLhubyqm3K8IfWqPb17zzyzz3S9wKMpPbe1fLzHq5W8OTEjPZIqQT3N1rO6DWzYPZcSgT1vBLC8gVsWveqaiD3KaIs83wIAPWz0wro3toU8ebp9uU9GO71H3o+9YpWRvBG1J7wQ8Ue9k0ztum33Gz0BBBW9kW+kPBjSCz2Kh+O8pEW2PQAKwrxtXi29qCg3Ox2tNL176y89S1GOPAVdKL2DZua8Xb1xvNjsjr3Xxfm7MyUwvOCuYDzsJgi9+PBgvA/baztxbwO9bTL+u0KM07yfjUy8K3UlPeI4SbywAQU9RiGzPFHQG72Dt/i7B60IPSSoyjuHJLS8+rUVPc1LYLvZF7g4THs4PJ/397yo2vw8BdEGvaM30bzY/f84H8BkPfkJVz0pdLg8mDaUvHkkgz2wn4Q8cArQvQ3XnryRFhi93nOnuyVynzzItzY8qb/jOVxDdb05AGK9cW3oPGJYSTw785Y8ksQKPYdPrLyyepG5kWwqPHIJwLzj5R49yhIJvEaijbzBOKY8fbvovEsEHrxova08jVlnPQsV8TrEixS90jlMOqb+AzzLkyM8keKaPIZG/jx16bu879SvOyYZMD0ST0A8lzoDvSXFpLyqwz890Juku7kZPD1ux/e8fKKevNi0kbzOwJQ7OrUqOzRllDwgqCI6SIssvQRrNzzkbT+9TASwPHvqyb0VPWU9/4HMPCanYr3yk3a7mo/MvB/oJr08qgo8XzsHvX0DZj1aIue8ijuhvFtv7jwBth69v5h/vaDfHz3vNdY7cE2XPBISxLzdlvA8f9XcPGqHMjwY9uA8t4J0vYwWYDujLwq9FZcKPYkUlbx+i9g8cOV1PW/FlToFhiI8msRZvMig57sFjx09rrJ/PEDyeL04ZFO9sbW6PGIehj2T6+W6vjIKPe+Qc7y9IB89FeNLvFanwbwmkfS8WdUovMsp+TtYbAa9vrHXvfbDdjyXf/I8lKwZPbHZfj0AjHM7P5GHPfOm6Dt8ypQ9NU2RPF5/oTyAkC69JxmivM3VVr0CTCq8cPkKvU4GSr3SDEu8EJaRPFhOqjxQTZs7fZtFPIqL9rvhfCY9eGB4vU+5yjv7s+m8mcfuPIAJob1Q4+28eSOKvUsuRT0yaYO9RZK0PG
|
|||
|
|
{"p":"wolai-frontend/src/types/document.ts","s":1,"e":10,"m":1773495684481.4768,"t":"import type { DocumentStats } from \"@/types/page-options\";\nimport type { Json } from \"@/types/supabase\";\n\nexport interface DocumentSnapshot {\n id: string;\n timestamp: number;\n blocks: Json;\n stats: DocumentStats;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/jsdom.d.ts","s":1,"e":9,"m":1773495684487.4768,"t":"declare module \"jsdom\" {\n export class JSDOM {\n constructor(html?: string, options?: unknown);\n // 说明:仅用于服务端导入时的最小类型声明(用于 window/document/DOMParser 等 DOM shim)。\n // 若需更完整的类型能力,可改为使用 jsdom 自带的类型定义。\n window: Window & typeof globalThis;\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/media.ts","s":1,"e":37,"m":1773495684493.477,"t":"export interface MediaAsset {\n id: string;\n workspace_id: string;\n document_id: string;\n asset_type: string;\n file_url: string | null;\n thumbnail_url: string | null;\n storage_id?: string | null;\n bucket?: string | null;\n storage_path?: string | null;\n file_name: string | null;\n file_size: number | null;\n mime_type: string | null;\n ocr_payload?: unknown;\n ocr_strategy?: string | null;\n ocr_text: string | null;\n ocr_status: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n purged_at?: string | null;\n signed_url?: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface MediaSelection {\n assetId: string;\n fileUrl: string;\n thumbnailUrl?: string | null;\n assetType?: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n}\n\nexport type MediaKind = \"image\" | \"video\" | \"audio\" | \"file\";","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/online-table.ts","s":1,"e":60,"m":1773495684499.477,"t":"export type ColumnType =\n | \"text\"\n | \"number\"\n | \"currency\"\n | \"date\"\n | \"select\"\n | \"checkbox\"\n | \"formula\"\n | \"reference\";\n\nexport interface TableColumn {\n id: string; // Unique column ID\n name: string; // Column display name\n type: ColumnType;\n width: number; // Column width for display\n options?: { value: string; color: string }[]; // For 'select' type\n}\n\nexport interface TableSchema {\n columns: TableColumn[];\n frozenRowCount: number; // 冻结行数\n frozenColCount: number; // 冻结列数\n // 其他视图偏好设置...\n}\n\nexport type TableRowData = Record<string, string | number | boolean | null | undefined>;\n\nexport interface DocumentTableSnapshot {\n rows?: TableRowData[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n luckysheet?: any;\n}\n\n// 对应 Supabase document_tables 表的元数据\nexport interface DocumentTable {\n id: string;\n document_id: string;\n grid_key: string;\n title: string;\n schema: TableSchema;\n snapshot?: DocumentTableSnapshot | null;\n created_at: string;\n updated_at: string;\n}\n\n// Blocknote 块的数据结构\nexport interface OnlineTableBlockProps {\n tableId: string;\n title: string; // 允许 Blocknote 渲染时显示表格名称\n}\n\n// Global declarations for Luckysheet (minimal definition)\ndeclare global {\n interface Window {\n luckysheet?: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n create?: (options: any) => void;\n destroy?: (id: string) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getluckysheetfile?: () => any;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/online-table.ts","s":49,"e":68,"m":1773495684499.477,"t":"title: string; // 允许 Blocknote 渲染时显示表格名称\n}\n\n// Global declarations for Luckysheet (minimal definition)\ndeclare global {\n interface Window {\n luckysheet?: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n create?: (options: any) => void;\n destroy?: (id: string) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getluckysheetfile?: () => any;\n enterEditMode?: () => void;\n getluckysheet_select_save?: () => unknown;\n // 实际功能会通过动态加载的脚本注入\n // 最小化声明以通过 TypeScript 检查(必须允许 undefined)\n };\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/page-options.ts","s":1,"e":39,"m":1773495684505.477,"t":"export type PageFont = \"default\" | \"song\" | \"kai\";\n\nexport type PageLayoutDensity = \"compact\" | \"normal\" | \"spacious\";\n\nexport type BooleanPageOptionKey =\n | \"wideLayout\"\n | \"smallText\"\n | \"showHeadingNumbers\"\n | \"showToc\"\n | \"protectEditing\"\n | \"showWordCount\"\n | \"collapseBacklinks\"\n | \"hideChildPages\"\n | \"showBlockRefCount\";\n\nexport interface PageOptionsState {\n wideLayout: boolean;\n smallText: boolean;\n showHeadingNumbers: boolean;\n showToc: boolean;\n showStructure: boolean;\n protectEditing: boolean;\n showWordCount: boolean;\n collapseBacklinks: boolean;\n pageFont: PageFont;\n layoutDensity: PageLayoutDensity;\n hideChildPages: boolean;\n showBlockRefCount: boolean;\n embedDefaultBlockId: string | null;\n}\n\nexport interface DocumentStats {\n wordCount: number;\n characterCount: number;\n blockCount: number;\n todoTotal: number;\n todoDone: number;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/references.ts","s":1,"e":14,"m":1773495684511.4773,"t":"import type { ReferenceInsertMode } from \"@/store/search-palette\";\n\nexport interface BacklinkRecord {\n id: string;\n sourcePageId: string;\n sourceBlockId: string | null;\n alias: string | null;\n displayMode: ReferenceInsertMode | string;\n isPreviewable: boolean;\n createdAt: string;\n updatedAt: string;\n sourceTitle: string | null;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/search.ts","s":1,"e":57,"m":1777473555768.3516,"t":"export type DocumentSearchMatchField = \"title\" | \"content\" | \"recent\";\n\nexport type DocumentSearchTimeRange = \"any\" | \"7d\" | \"30d\";\nexport type DocumentSearchTimeField = \"updated\" | \"created\";\n\nexport interface DocumentSearchFilters {\n titleOnly: boolean;\n exact: boolean;\n onlyCurrentPage: boolean;\n includeOcr: boolean;\n timeRange: DocumentSearchTimeRange;\n timeField: DocumentSearchTimeField;\n customRange?: {\n from?: string;\n to?: string;\n };\n}\n\nexport interface DocumentSearchRequest {\n workspaceId: string;\n documentId?: string;\n query?: string;\n filters: DocumentSearchFilters;\n limit?: number;\n}\n\nexport interface DocumentSearchResult {\n id: string;\n title: string | null;\n snippet: string;\n updatedAt: string | null;\n createdAt: string | null;\n matchField: DocumentSearchMatchField;\n hasOcr: boolean;\n publicPath: string;\n score: number;\n nodeId?: string | null;\n subtreeRootId?: string | null;\n projectionOwner?: \"rust-kernel\" | \"compat-index\";\n evidence?: Array<{\n kind: string;\n nodeId?: string | null;\n snippet: string;\n }>;\n}\n\nexport interface DocumentSearchResponse {\n projectionOwner?: \"rust-kernel\" | \"compat-index\";\n results: DocumentSearchResult[];\n recent: DocumentSearchResult[];\n}\n\nexport interface ReferenceTarget {\n id: string;\n title: string | null;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/simple-mind-map-internals.d.ts","s":1,"e":60,"m":1778397486166.5374,"t":"// 说明:\n// `simple-mind-map` 的 `src/*` 属于内部实现路径,npm 包通常不提供 TypeScript 声明文件。\n// 但在项目中我们需要按官方示例从 `src/plugins/*` 等路径引入插件,因此在此补充最小声明,\n// 仅用于消除 TS7016(找不到声明文件)报错。\n//\n// 注意:这里的类型刻意保持宽松(unknown),避免把内部 API 当作稳定公共接口依赖。\n\ndeclare module \"simple-mind-map/src/svg/icons.js\" {\n export const nodeIconList: unknown[];\n}\n\ndeclare module \"simple-mind-map/src/utils/index.js\" {\n export const mergerIconList: (icons: unknown[]) => unknown[];\n export const createUid: () => string;\n}\n\ndeclare module \"simple-mind-map/src/plugins/Painter.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/AssociativeLine.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Search.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/OuterFrame.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Export.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Formula.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/RichText.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/MiniMap.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Select.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Drag.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/KeyboardNavigation.js\" {\n const plugin: unknown;\n export default plugin;\n}","v":"uomBvLinhz2zgwC+8MOovSAoArzrfDS9Ppk3Pesuizz+dkE80RIuvbrlCr2aOHY8WBFdPdKFijvDD++8J6H/vDLxdjxZkVe96FZ0vQHl4rsQ/Su97gxwvVTwvru78ga9fLeEPTXjoj2685A98XKWPA+hALyLNRU91zJgPQxHoryFU1G8rpwbvaCOm7x2XNa8/dXIPA82jbwLjvM8uD6kPNv3BjzFhmu9Zz4XPPM2VL0CSXI9/4XtPDNoOz1lq3G8h8Z/PaKvsr2JkUE8qKeQvDTiNT3smDa95+CMPVZydTt2Qb28RdhhPAt3szxbcKg8zIxvPU4E3j0EM5071lNMPfBahD0OAl+9mA9ku6i8XT3RumA77AXSPCLj9TysB8y858CNPIVtvjyGZoe9Y7JaO/lTwDzirXK8sc63vNj92DtjTI074EOdvehffz0MVbo7UxZAPT6FWTtCBbS8aX4DvD7Agb2csoQ9/eIEvdTvqjzGy4+5WV7nPKlXFL25mBK6UVcSPIKPrTxv8vq8n0yEu8oPv7wDyFO9608+PDqiQTxkzy+8tPIEPV6po7zQJqg79JBpPW6RFb1bAxe8LuepOxgtW73XzG+70emtPNfYA724q0Y9treeu22sZzyWyho9CBppumUyeLzNSok8NSgrPQaPPz0d9a48IfrfPP/TozqWqoM8W7pVvQ9EPb11I608faSLvFT50Lw/eik92PIFPS1rQr2QCTG9gAoFPeKvCr3x5Ny7YtkyPFv2ybyV0yS9ThNGvYbEor1wGJC6Sv8EvXIM4r0G39O7KbPKvLxZwbzerdi8d7Qsu/DGVDzvy/e8rV+1urqOwbtAy6m7CtMVPFBUZrzlGdM8DCFSPCz4fT1cNDu71WwQvRlCGD2wJ/M7dcD+OwXGDbyqdKe9AeGCPI/GibyMiqc8wSNlPFmGlDvtPYA7Di65vAmlGD00+wK8rsNnPA3B1LwXUgw9zROgvHjKtbzxc027xc7Eux3aLrvljZ47nvYUvTYIQj1NC4m7cvGfvU0o97xwFV+9mrAuvUSxuTvcym08k8XvPKRQYbyDerq8SwG9vLU3ML0BVMK884f+vJJ5iDs85Sq8tAiKPe6e1LzL+ci8S9BJPQWGKT2WVzE76CZCvJtWzjyttjc83NyFPHe6lL0n5968CABePMjNDj2v0Z68aoprPMlanbxVa8s8KruavDtzQL2NQFM8xj6RO5/IobwtCHy92FpCvbtBhz2nv0e8oRsbvQMRIDzEcA88P7uZPXC3hTyt/fG6nqkVPb771LttGhY8r3IePDwyz7xRBx283uzgPKI0mL00vy27il8tPYutwDuLNoM9IocGvQiJHDz+f1Q8Ma4jvbNNlrwnRZS8ibBjPOjBDb187x89ce2GvG+GBD0PbXQ7jAVRPM1M0DrxuMw64ueUvGI8ADx9HRU85BiHvL5SIj2y8zQ8H29SPenss7zO2bA8yLCGvFLBg7x4eEO9EPb4vPVRrb26AGS8UOyxvMMZ+bwbkKi8tyXyvDxUKr1PSw49KAmIPFKeST0a/5u8kJTKPBEHe7zGHxc9azruPBm7IDy+ca+7dgmdvOTPiLyfO1i8t1yqPZJ3dj0CSTo9VqRZPQEzkrtl6Y+8AmEHPdPGnTyD+w08dqQUO6RfAb037bA7U2Wsu3YaOT1rJhC91sAmPa4oLj3J1Yc8T74YPbNxTrvkeue8TLgMvZ1jxDz9faC80sS2vDt2YT1d7Vu9HmYTO4ghYDxSeWO8IWXWPDwXeDwUMfA8uCPfvProoLz4BAQ8j7IHvXMjMz23CJq8pJDpuz4cMj04Lgy9XEJ6PeHlM73uUqe8jyIePfgWjL3SAZa8pjqgPCQDMzwDgcK8o+GRPIuFWrpmiDu82E7dvAhpsjqKT9q8160HPWI/Qz0cxuY7w8AWPW4OhTtSv2Q807ceO/rSAr2seaM8kJ1jPEsZ7zz2e1A8H5k+vBse+rsUfLA5GTkZva
|
|||
|
|
{"p":"wolai-frontend/src/types/simple-mind-map-internals.d.ts","s":49,"e":108,"m":1778397486166.5374,"t":"declare module \"simple-mind-map/src/plugins/Select.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Drag.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/KeyboardNavigation.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/NodeImgAdjust.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Scrollbar.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/RainbowLines.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Watermark.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/TouchEvent.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Cooperate.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/Demonstrate.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/MindMapLayoutPro.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/NodeBase64ImageStorage.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/ExportPDF.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/ExportXMind.js\" {\n const plugin: unknown;\n export default plugin;\n}\n\ndeclare module \"simple-mind-map/src/core/render/node/MindMapNode.js\" {\n const MindMapNode: unknown;\n export default MindMapNode;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/simple-mind-map-internals.d.ts","s":97,"e":129,"m":1778397486166.5374,"t":"declare module \"simple-mind-map/src/plugins/ExportPDF.js\" {\n const plugin: unknown;\n export default plugin;\n}\ndeclare module \"simple-mind-map/src/plugins/ExportXMind.js\" {\n const plugin: unknown;\n export default plugin;\n}\n\ndeclare module \"simple-mind-map/src/core/render/node/MindMapNode.js\" {\n const MindMapNode: unknown;\n export default MindMapNode;\n}\n\ndeclare module \"simple-mind-map/src/parse/xmind.js\" {\n const xmind: {\n parseXmindFile: (\n file: Blob | ArrayBuffer | Uint8Array,\n handleMultiCanvas?: (content: unknown[]) => unknown,\n ) => Promise<unknown>;\n };\n export default xmind;\n}\n\ndeclare module \"simple-mind-map/src/parse/markdownTo.js\" {\n export type MarkdownToMindmapResult = {\n data?: Record<string, unknown>;\n children?: unknown[];\n [key: string]: unknown;\n };\n export const transformMarkdownTo: (md: string) => MarkdownToMindmapResult;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":1,"e":60,"m":1773495684530.4773,"t":"export type Json =\n | string\n | number\n | boolean\n | null\n | { [key: string]: Json | undefined }\n | Json[];\n\nexport type Database = {\n public: {\n Tables: {\n documents: {\n Row: {\n access_scope: \"private\" | \"shared\" | \"public\";\n content: Json | null;\n created_at: string | null;\n deleted_at: string | null;\n deleted_by: string | null;\n id: string;\n index_status: string | null;\n is_public: boolean | null;\n is_starred: boolean | null;\n is_template: boolean;\n mindmap_data: Json | null;\n parent_id: string | null;\n raw_text: string | null;\n sort_order: number;\n title: string | null;\n updated_at: string | null;\n user_id: string;\n workspace_id: string;\n wide_layout: boolean;\n use_small_text: boolean;\n show_heading_numbers: boolean;\n show_toc: boolean;\n show_structure: boolean;\n protect_editing: boolean;\n show_word_count: boolean;\n word_count: number;\n character_count: number;\n block_count: number;\n };\n Insert: {\n access_scope?: \"private\" | \"shared\" | \"public\";\n content?: Json | null;\n created_at?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n id?: string;\n index_status?: string | null;\n is_public?: boolean | null;\n is_starred?: boolean | null;\n is_template?: boolean;\n mindmap_data?: Json | null;\n parent_id?: string | null;\n raw_text?: string | null;\n sort_order?: number;\n title?: string | null;\n updated_at?: string | null;\n user_id: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":49,"e":108,"m":1773495684530.4773,"t":"id?: string;\n index_status?: string | null;\n is_public?: boolean | null;\n is_starred?: boolean | null;\n is_template?: boolean;\n mindmap_data?: Json | null;\n parent_id?: string | null;\n raw_text?: string | null;\n sort_order?: number;\n title?: string | null;\n updated_at?: string | null;\n user_id: string;\n workspace_id: string;\n wide_layout?: boolean;\n use_small_text?: boolean;\n show_heading_numbers?: boolean;\n show_toc?: boolean;\n show_structure?: boolean;\n protect_editing?: boolean;\n show_word_count?: boolean;\n word_count?: number;\n character_count?: number;\n block_count?: number;\n };\n Update: {\n access_scope?: \"private\" | \"shared\" | \"public\";\n content?: Json | null;\n created_at?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n id?: string;\n index_status?: string | null;\n is_public?: boolean | null;\n is_starred?: boolean | null;\n is_template?: boolean;\n mindmap_data?: Json | null;\n parent_id?: string | null;\n raw_text?: string | null;\n sort_order?: number;\n title?: string | null;\n updated_at?: string | null;\n user_id?: string;\n workspace_id?: string;\n wide_layout?: boolean;\n use_small_text?: boolean;\n show_heading_numbers?: boolean;\n show_toc?: boolean;\n show_structure?: boolean;\n protect_editing?: boolean;\n show_word_count?: boolean;\n word_count?: number;\n character_count?: number;\n block_count?: number;\n };\n Relationships: [\n {\n foreignKeyName: \"documents_parent_id_fkey\";\n columns: [\"parent_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];","v":"k0qMPKezDLoWOQW+Op+7vemlnz3W4SK9ZXeAPHWehDyIXDQ9i2OSvdxwmLwWshc8tTkJPlnF+DvJ6qy8Khn+vMG51LxX1Zu9idIZPUwgijziqVO9xK8KPLaUBbz+wtM8lQSMPSBlPT0zirs8qAqmPDv7DL2RNj09BtNLPGRsjj3DPpk8zYheOnb4Hr0PMBm9hhphPYecizy8ayQ92GDHO7oojzyfces88GJeuwII2r1Gzau8W9auvRx5XD3XyTW8Ta+ePc7gITw6EW871dh3vSpSoj2InAg7jToAPnhw5TzX9gy9wOw+vJtNZj143eA8bOmDPdZwcj1dIi68QbWRPYVZVz2OjQy9bl6YvWvWPj0vJ0A6gIY8vDyFPj057zE9rOkQPfBbYLvr7W295qhPPbhjNr2SClS8uN5DvHIrAz1AHfE8DzLQvPyfOT3cR3O8Z6YdPWHpGL3kTfK88C6rvEUuHr3Mn5Y9Y2cYPcF3TzpwqOm8Eg4ZPb94VbtDXxE92s6OvOy+D7vKNMS8oIlZvHeM+Lw8rCO7Aq+tvND+ELx3Lro7onECPWMugrzlW2S85PiIvEhGvbyKVwy8pObiPMR3Or1J23Q8K2vGPD8TKb2VyJI9gOvLvKC1Qb3cQxo9mvb8vGQ5fzr3NN48QNa4PFg+PT0fbYO8FFffvJ3uj7uLLMG7afQ6vZ82D73LaZe8I3LtvIp27DxIxUw9VJUsPTOtY7z6nxo85wo3vfvDFLxz6vQ8ANsdPfFojb3jBBC9wVQjPQ57d72/kKA9yAi0vGBjs7sJJj08MDYJPe8Jrzxex9a8t1AeO2g2nLv/6i+97GUrPYhXmbtlBBi8B7i8vJPGhT2Bt9G7lBQPuwX8Ez29Ahg6BkdrvUy/PT1CUVy88iGIPKb9OzzJoC69FMfJvHV9YjzGUdK8bpEcvHNY57sgDZG7Q2VjumBq+DxWVLq88bxSPAdJhL1yDWg9YIKFvBdbtrxTbCS9L1hyOyHYM70JDro8IgTkvO+HMTwWXnO87KXGvAgorDzJoRe9O7DCvSKMojoaA0G9QP47u1mSHr3HTza8OOEIvKJ6TL09G9Q8VTsCvYrHijyDbkE8Q6EYPXTX7jt1Ykk9EWapPRcRcDyeDfq8T4J1PDVV1Lyv8mM7lA0NPIOwBb1FXdW8nh3VurTrhbkwpZO9kw+gPMZO2Tx+oRU90iJBPVHCBL3TM9A8WJcNvUdq9bwTfwG9GEe/vekCMj3dBvM89UGHOpJBZD015Ag73KcrPfKIqjyl2Vi8pTvwvC6HsLtXVgw8aAkAu3aBNDyM0Bg8BDWTvPU+Fb2HmlU6Qx01PS9Tnryy9mO6aVgCPdYRqz3bBQ09XQguvesh5rsErIA8ZQuYPMrurLx8wio9dN4EvWzvMj04tDm9V89Avcrue72xJ2a9sTc7vQ051zzHL5I7bnolPJ+Z4zrVF8I7aCuUO49FAj2XTHo9uLp/vHHh+jzgGlO96Q9NPd7M7rx5HNO6bKIsvYR+Gj3/Z707IsyTPA/Or7y68wO9tFm5vE4O4zuRthA9An4MPcYFErwosjc9lj3gPI1YAT3Ki009ZR5RO3IGR7xfroG7nAJIPMD/qD0At6E9otDTPNBfLLywv0C9SwtivI33lrx1KNE8AApPPNqbT71ibwO9VgBAvRFkED0mXpS83NmrPZRNcTxmbRK8pMwOPUCyqTzcFMK8/IsCvFeWbzzfEy47H3U0PKqqrDtDqq+82DOvOzTwxLx2E8A8Et8rPSc7Cz1rNt07ZuMpvA2IKrwURwQ9ICLqvKEzzbwexDW8ecTxPKLhGz15zIq716A0PQjzI72Xa6+8aTq/PJXJ3TwUDiO95mS3O07hCj1QCE+99SIrPbb0bbwyxj086
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":97,"e":156,"m":1773495684530.4773,"t":"protect_editing?: boolean;\n show_word_count?: boolean;\n word_count?: number;\n character_count?: number;\n block_count?: number;\n };\n Relationships: [\n {\n foreignKeyName: \"documents_parent_id_fkey\";\n columns: [\"parent_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"documents_workspace_id_fkey\";\n columns: [\"workspace_id\"];\n referencedRelation: \"workspaces\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"documents_deleted_by_fkey\";\n columns: [\"deleted_by\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n document_embeddings: {\n Row: {\n content_text: string;\n document_id: string | null;\n embedding: string | null;\n id: string;\n };\n Insert: {\n content_text: string;\n document_id?: string | null;\n embedding?: string | null;\n id?: string;\n };\n Update: {\n content_text?: string;\n document_id?: string | null;\n embedding?: string | null;\n id?: string;\n };\n Relationships: [\n {\n foreignKeyName: \"document_embeddings_document_id_fkey\";\n columns: [\"document_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n entities: {\n Row: {\n document_ids: string[] | null;\n id: string;\n name: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":145,"e":204,"m":1773495684530.4773,"t":"foreignKeyName: \"document_embeddings_document_id_fkey\";\n columns: [\"document_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n entities: {\n Row: {\n document_ids: string[] | null;\n id: string;\n name: string;\n properties: Json | null;\n type: string | null;\n user_id: string;\n };\n Insert: {\n document_ids?: string[] | null;\n id?: string;\n name: string;\n properties?: Json | null;\n type?: string | null;\n user_id: string;\n };\n Update: {\n document_ids?: string[] | null;\n id?: string;\n name?: string;\n properties?: Json | null;\n type?: string | null;\n user_id?: string;\n };\n Relationships: [];\n };\n relationships: {\n Row: {\n document_ids: string[] | null;\n from_entity: string | null;\n id: string;\n to_entity: string | null;\n type: string | null;\n };\n Insert: {\n document_ids?: string[] | null;\n from_entity?: string | null;\n id?: string;\n to_entity?: string | null;\n type?: string | null;\n };\n Update: {\n document_ids?: string[] | null;\n from_entity?: string | null;\n id?: string;\n to_entity?: string | null;\n type?: string | null;\n };\n Relationships: [\n {\n foreignKeyName: \"relationships_from_entity_fkey\";\n columns: [\"from_entity\"];","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":193,"e":252,"m":1773495684530.4773,"t":"};\n Update: {\n document_ids?: string[] | null;\n from_entity?: string | null;\n id?: string;\n to_entity?: string | null;\n type?: string | null;\n };\n Relationships: [\n {\n foreignKeyName: \"relationships_from_entity_fkey\";\n columns: [\"from_entity\"];\n referencedRelation: \"entities\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"relationships_to_entity_fkey\";\n columns: [\"to_entity\"];\n referencedRelation: \"entities\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n page_refs: {\n Row: {\n id: string;\n workspace_id: string;\n source_page_id: string;\n source_block_id: string | null;\n target_page_id: string;\n alias: string | null;\n display_mode: string;\n is_previewable: boolean;\n created_by: string;\n created_at: string;\n updated_at: string;\n };\n Insert: {\n id?: string;\n workspace_id: string;\n source_page_id: string;\n source_block_id?: string | null;\n target_page_id: string;\n alias?: string | null;\n display_mode?: string;\n is_previewable?: boolean;\n created_by: string;\n created_at?: string;\n updated_at?: string;\n };\n Update: {\n id?: string;\n workspace_id?: string;\n source_page_id?: string;\n source_block_id?: string | null;\n target_page_id?: string;\n alias?: string | null;\n display_mode?: string;\n is_previewable?: boolean;\n created_by?: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":241,"e":300,"m":1773495684530.4773,"t":"updated_at?: string;\n };\n Update: {\n id?: string;\n workspace_id?: string;\n source_page_id?: string;\n source_block_id?: string | null;\n target_page_id?: string;\n alias?: string | null;\n display_mode?: string;\n is_previewable?: boolean;\n created_by?: string;\n created_at?: string;\n updated_at?: string;\n };\n Relationships: [\n {\n foreignKeyName: \"page_refs_workspace_id_fkey\";\n columns: [\"workspace_id\"];\n referencedRelation: \"workspaces\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"page_refs_source_page_id_fkey\";\n columns: [\"source_page_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"page_refs_target_page_id_fkey\";\n columns: [\"target_page_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"page_refs_created_by_fkey\";\n columns: [\"created_by\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n media_assets: {\n Row: {\n id: string;\n workspace_id: string;\n document_id: string;\n asset_type: string;\n file_url: string | null;\n thumbnail_url: string | null;\n bucket: string | null;\n storage_path: string | null;\n file_name: string | null;\n file_size: number | null;\n mime_type: string | null;\n ocr_payload: Json | null;\n ocr_strategy: string | null;\n ocr_text: string | null;\n ocr_status: string | null;\n deleted_at: string | null;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":289,"e":348,"m":1773495684530.4773,"t":"file_url: string | null;\n thumbnail_url: string | null;\n bucket: string | null;\n storage_path: string | null;\n file_name: string | null;\n file_size: number | null;\n mime_type: string | null;\n ocr_payload: Json | null;\n ocr_strategy: string | null;\n ocr_text: string | null;\n ocr_status: string | null;\n deleted_at: string | null;\n deleted_by: string | null;\n purged_at: string | null;\n created_by: string | null;\n created_at: string;\n updated_at: string;\n };\n Insert: {\n id?: string;\n workspace_id: string;\n document_id: string;\n asset_type?: string;\n file_url?: string | null;\n thumbnail_url?: string | null;\n bucket?: string | null;\n storage_path?: string | null;\n file_name?: string | null;\n file_size?: number | null;\n mime_type?: string | null;\n ocr_payload?: Json | null;\n ocr_strategy?: string | null;\n ocr_text?: string | null;\n ocr_status?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n purged_at?: string | null;\n created_by?: string | null;\n created_at?: string;\n updated_at?: string;\n };\n Update: {\n id?: string;\n workspace_id?: string;\n document_id?: string;\n asset_type?: string;\n file_url?: string | null;\n thumbnail_url?: string | null;\n bucket?: string | null;\n storage_path?: string | null;\n file_name?: string | null;\n file_size?: number | null;\n mime_type?: string | null;\n ocr_payload?: Json | null;\n ocr_strategy?: string | null;\n ocr_text?: string | null;\n ocr_status?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n purged_at?: string | null;","v":"LxIaPf4G5TzyAtG9ahaCvbMXGD0AUim9m3QOPPTxcz3tFvG850ohvQucL719Uh+99/MIPuGGVbxIqJe7QaqAvV/Sf7yogfm8V4pDPfvNdbw8qO68/dTwvKmkhbyZgDs94LKjPYuXDj11kDM9Ja2+PHabfL0HlVc9Tm0qPTQ7eDxKahS9CTnFu6nZ5rwl1I29CG9EPcKM+rrhgmY9oLxFPdmO87xGLbo8SvLoPBH5Br3i50S7wD+7vbdYsDwZ2/k8BjbQPcKcODtLabI8/0QEvHk0mDyUCyu7TiDmPTyEwLt2fv47E3xMva8rlzwLlKW7SYVgO+SzaT1375m84b3QPXTXJT2yHti8HVV8vcoYxjuyfRY9TL7DvJwJgz1xqsw8eBgovfkVt7wkN+28eoEqPX+dcb3R6om9k/N6ujyX6jx0DMk8lXFmPLtLELxnW948QOBTPdvFT71mxY+8DOxfvMb2rrxVC0E99ypMPA9InTxhoY88qvcJvPEAgbzsV8o8KJ6hO/heKj2LYcS8UQejvDO3DToCjeu8844EPSrJcTycVd88geuHPd9K4rw2Sv26JALpuxhlED2mkKm8pOOAPZZTibwRLIK8vH1cPQHIg73oQJw91WyNvPAuVbx/BIU9zDUmvabmhbzvH8Y8GE2pPMHHdj1h9ZI8yD8Mvf0UfDxDaRQ9rKrKvGmuZLtPwga9640hvfulFT1otRc90o3aPA7e27zXVry8+46vu70SMb0N5DM9pXf0O1DPWry9Sgi95IS4PNu1H70PItc8QdQePGchATz0Be47jzDfvD2v+DyumCC9ykwsvBwiGLvlyz29pS/0PKXFOrwjH008nAqRPIeaUrzmh6k8vPuXPFAHiz22w0O9NOdEvQvWjT1kugW8l3ujO5GiqzuVIas7DMdUvWiPZLycCKe7wa3pvImFDb3AW+08BCp5PIPyyzwpuCu9z/+VPD0gSL3lQGM9zHpyvNu2+bupTeq6GwUtPDoBxLmOskq8g1z7u3LUmrxc6Y68F6JZvcABjzttsyO8iJxRva8YGD3Mc0y91W7oPEza2rsETSk8gVUFvNW8Xb1PNoo8vuKhvSVdljwANwm9ckG1PNHpj7xttDo9JL6LPZfmkzzeJRS9wuunPMUkIrzu2FO8EsAjvI8ejbxtY4K9lk0cvKWNiDy7Yyy95i73PMRD3rtWlyg9NsuxPBb9Jr3JdRG8+A9tvMpcwzsYIVe9ADTYvWwxBT0o3M884UH0vBBTPDwGKzg9siOYPfX3wrwodeI7vmS7vH2NJTzmtTK9yHmzvFcZ2LuVm6I7UKAIvUf3dL18+tM8aAIEPTXZDbz1dQs9PnlVPQh1KT0GNV08V2IGPA9bJ72WYqG8WN+ovHkFLb1wqyQ8PO+BPJybyry9MTi9/0d3vSSOH71/gWy9uvGwPD3y2Dx2ox4990w0POev/byUtc284E+avEpPaTz+bfA8t7W0OwWXNj2siDe9XkwvPduHHL3BRiW7vh6nvcJxZzz2yYm8QXk8PO6Tlzxiewc8wLEwO7PcALpn0Qw9o1uMPWfgC71++II8iGnEPN6zAzyYswk9EhU7vOvVmLzLna47UJYnPMtHQz1GI6s9BG/DPC4H2rzZe5O93kEVvceD9LyaIKM7ao6FPd/WiL35k5o8P5mnu5dPhz0TJxu8QhD5PDEOjzyeTpa8P+8yPXnHpLvRp1667YfQvN2P2juSnqm8Rey+u7GAwzwdp/C8WmdXPcBvZ70CT+m7TOYEPK05Vj1KJRS8/ckUvL0mm7pTqcM8qxjXPMEwETsmj7w7kWc9PUB9VT3nRcc8Nbs3PbSyfb0Ndn294EuIPHRvl7y7GIc7mCshPW0saD0iXWy8nO4EPT9WCz1ARFA7uH4AvbjWM
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":337,"e":396,"m":1773495684530.4773,"t":"bucket?: string | null;\n storage_path?: string | null;\n file_name?: string | null;\n file_size?: number | null;\n mime_type?: string | null;\n ocr_payload?: Json | null;\n ocr_strategy?: string | null;\n ocr_text?: string | null;\n ocr_status?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n purged_at?: string | null;\n created_by?: string | null;\n created_at?: string;\n updated_at?: string;\n };\n Relationships: [\n {\n foreignKeyName: \"media_assets_workspace_id_fkey\";\n columns: [\"workspace_id\"];\n referencedRelation: \"workspaces\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"media_assets_document_id_fkey\";\n columns: [\"document_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"media_assets_created_by_fkey\";\n columns: [\"created_by\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"media_assets_deleted_by_fkey\";\n columns: [\"deleted_by\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n user_recent_pages: {\n Row: {\n id: string;\n user_id: string;\n workspace_id: string;\n document_id: string;\n last_accessed_at: string;\n };\n Insert: {\n id?: string;\n user_id: string;\n workspace_id: string;\n document_id: string;\n last_accessed_at?: string;\n };\n Update: {\n id?: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":385,"e":444,"m":1773495684530.4773,"t":"document_id: string;\n last_accessed_at: string;\n };\n Insert: {\n id?: string;\n user_id: string;\n workspace_id: string;\n document_id: string;\n last_accessed_at?: string;\n };\n Update: {\n id?: string;\n user_id?: string;\n workspace_id?: string;\n document_id?: string;\n last_accessed_at?: string;\n };\n Relationships: [\n {\n foreignKeyName: \"user_recent_pages_document_id_fkey\";\n columns: [\"document_id\"];\n referencedRelation: \"documents\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"user_recent_pages_user_id_fkey\";\n columns: [\"user_id\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"user_recent_pages_workspace_id_fkey\";\n columns: [\"workspace_id\"];\n referencedRelation: \"workspaces\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n [key: string]: any;\n };\n Views: {\n [_ in never]: never;\n };\n Functions: {\n get_documents_tree: {\n Args: {\n request_user_id: string;\n };\n Returns: {\n depth: number;\n id: string;\n parent_id: string | null;\n path: string[];\n sort_order: number;\n title: string | null;\n }[];\n };\n workspaces: {\n Row: {\n created_at: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":433,"e":492,"m":1773495684530.4773,"t":"Returns: {\n depth: number;\n id: string;\n parent_id: string | null;\n path: string[];\n sort_order: number;\n title: string | null;\n }[];\n };\n workspaces: {\n Row: {\n created_at: string;\n created_by: string;\n icon_url: string | null;\n id: string;\n name: string;\n type: \"personal\" | \"team\";\n updated_at: string;\n };\n Insert: {\n created_at?: string;\n created_by: string;\n icon_url?: string | null;\n id?: string;\n name: string;\n type?: \"personal\" | \"team\";\n updated_at?: string;\n };\n Update: {\n created_at?: string;\n created_by?: string;\n icon_url?: string | null;\n id?: string;\n name?: string;\n type?: \"personal\" | \"team\";\n updated_at?: string;\n };\n Relationships: [\n {\n foreignKeyName: \"workspaces_created_by_fkey\";\n columns: [\"created_by\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n workspace_members: {\n Row: {\n created_at: string;\n id: string;\n is_default: boolean;\n role: string;\n user_id: string;\n workspace_id: string;\n };\n Insert: {\n created_at?: string;\n id?: string;\n is_default?: boolean;\n role?: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":481,"e":540,"m":1773495684530.4773,"t":"created_at: string;\n id: string;\n is_default: boolean;\n role: string;\n user_id: string;\n workspace_id: string;\n };\n Insert: {\n created_at?: string;\n id?: string;\n is_default?: boolean;\n role?: string;\n user_id: string;\n workspace_id: string;\n };\n Update: {\n created_at?: string;\n id?: string;\n is_default?: boolean;\n role?: string;\n user_id?: string;\n workspace_id?: string;\n };\n Relationships: [\n {\n foreignKeyName: \"workspace_members_user_id_fkey\";\n columns: [\"user_id\"];\n referencedRelation: \"profiles\";\n referencedColumns: [\"id\"];\n },\n {\n foreignKeyName: \"workspace_members_workspace_id_fkey\";\n columns: [\"workspace_id\"];\n referencedRelation: \"workspaces\";\n referencedColumns: [\"id\"];\n },\n ];\n };\n record_page_ref: {\n Args: {\n p_workspace_id: string;\n p_source_page_id: string;\n p_source_block_id?: string | null;\n p_target_page_id: string;\n p_alias?: string | null;\n p_display_mode?: string;\n p_is_previewable?: boolean;\n p_created_by?: string;\n };\n Returns: Database[\"public\"][\"Tables\"][\"page_refs\"][\"Row\"];\n };\n list_backlinks: {\n Args: {\n p_workspace_id: string;\n p_target_page_id: string;\n p_limit?: number;\n p_offset?: number;\n };\n Returns: Array<{\n id: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/supabase.ts","s":529,"e":561,"m":1773495684530.4773,"t":"};\n Returns: Database[\"public\"][\"Tables\"][\"page_refs\"][\"Row\"];\n };\n list_backlinks: {\n Args: {\n p_workspace_id: string;\n p_target_page_id: string;\n p_limit?: number;\n p_offset?: number;\n };\n Returns: Array<{\n id: string;\n source_page_id: string;\n source_block_id: string | null;\n alias: string | null;\n display_mode: string;\n is_previewable: boolean;\n created_at: string;\n updated_at: string;\n source_title: string | null;\n workspace_id: string;\n }>;\n };\n };\n Enums: {\n [_ in never]: never;\n };\n CompositeTypes: {\n [_ in never]: never;\n };\n };\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/types/window-debug.d.ts","s":1,"e":13,"m":1773495684536.6936,"t":"export {};\n\ndeclare global {\n interface Window {\n /**\n * 仅用于开发调试:在控制台访问当前思维导图实例。\n * 生产环境不依赖该字段。\n */\n __mindmapInstance?: unknown | null;\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/ai-agent-ui.test.ts","s":1,"e":27,"m":1776326028981.6023,"t":"import { beforeEach, describe, expect, it } from \"vitest\";\nimport { useAiAgentUiStore } from \"./ai-agent-ui\";\n\ndescribe(\"useAiAgentUiStore\", () => {\n beforeEach(() => {\n useAiAgentUiStore.setState({\n documentAgentAvailable: false,\n documentAgentOpen: false,\n documentAgentActivated: false,\n globalAgentOpen: false,\n globalAgentActivated: false,\n });\n });\n\n it(\"全局 AI 开关不依赖页面 AI 可用态\", () => {\n const state = useAiAgentUiStore.getState();\n\n state.toggleGlobalAgentOpen();\n expect(useAiAgentUiStore.getState().globalAgentOpen).toBe(true);\n expect(useAiAgentUiStore.getState().globalAgentActivated).toBe(true);\n\n state.toggleGlobalAgentOpen();\n expect(useAiAgentUiStore.getState().globalAgentOpen).toBe(false);\n expect(useAiAgentUiStore.getState().globalAgentActivated).toBe(true);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/ai-agent-ui.ts","s":1,"e":51,"m":1776325987942.81,"t":"\"use client\";\n\nimport { create } from \"zustand\";\n\ntype AiAgentUiState = {\n globalAgentOpen: boolean;\n globalAgentActivated: boolean;\n documentAgentAvailable: boolean;\n documentAgentOpen: boolean;\n documentAgentActivated: boolean;\n setGlobalAgentOpen: (open: boolean) => void;\n toggleGlobalAgentOpen: () => void;\n setDocumentAgentAvailable: (available: boolean) => void;\n setDocumentAgentOpen: (open: boolean) => void;\n toggleDocumentAgentOpen: () => void;\n};\n\nexport const useAiAgentUiStore = create<AiAgentUiState>((set, get) => ({\n globalAgentOpen: false,\n globalAgentActivated: false,\n documentAgentAvailable: false,\n documentAgentOpen: false,\n documentAgentActivated: false,\n setGlobalAgentOpen: (open) =>\n set((state) => ({\n globalAgentOpen: open,\n globalAgentActivated: state.globalAgentActivated || open,\n })),\n toggleGlobalAgentOpen: () => {\n const s = get();\n set({\n globalAgentOpen: !s.globalAgentOpen,\n globalAgentActivated: s.globalAgentActivated || !s.globalAgentOpen,\n });\n },\n setDocumentAgentAvailable: (available) => set({ documentAgentAvailable: available }),\n setDocumentAgentOpen: (open) =>\n set((state) => ({\n documentAgentOpen: open,\n documentAgentActivated: state.documentAgentActivated || open,\n })),\n toggleDocumentAgentOpen: () => {\n const s = get();\n if (!s.documentAgentAvailable) return;\n set({\n documentAgentOpen: !s.documentAgentOpen,\n documentAgentActivated: s.documentAgentActivated || !s.documentAgentOpen,\n });\n },\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/app-preferences.ts","s":1,"e":60,"m":1773495684425.4763,"t":"\"use client\";\n\nimport { create } from \"zustand\";\n\nexport type ThemeMode = \"system\" | \"light\" | \"dark\";\n\ntype PersistedPreferences = {\n theme: ThemeMode;\n showStructure: boolean;\n spellCheck: boolean;\n flightMode: boolean;\n};\n\nconst STORAGE_KEY = \"mnote:preferences:v1\";\n\nconst loadPersisted = (): PersistedPreferences | null => {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<PersistedPreferences>;\n const theme = parsed.theme === \"light\" || parsed.theme === \"dark\" || parsed.theme === \"system\" ? parsed.theme : \"system\";\n return {\n theme,\n showStructure: typeof parsed.showStructure === \"boolean\" ? parsed.showStructure : false,\n spellCheck: typeof parsed.spellCheck === \"boolean\" ? parsed.spellCheck : false,\n flightMode: typeof parsed.flightMode === \"boolean\" ? parsed.flightMode : false,\n };\n } catch {\n return null;\n }\n};\n\nconst persist = (value: PersistedPreferences) => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(value));\n } catch {\n // ignore\n }\n};\n\ninterface AppPreferencesState extends PersistedPreferences {\n hydrated: boolean;\n hydrate: () => void;\n setTheme: (theme: ThemeMode) => void;\n setShowStructure: (showStructure: boolean) => void;\n setSpellCheck: (spellCheck: boolean) => void;\n setFlightMode: (flightMode: boolean) => void;\n}\n\nexport const useAppPreferencesStore = create<AppPreferencesState>((set, get) => ({\n hydrated: false,\n theme: \"system\",\n showStructure: false,\n spellCheck: false,\n flightMode: false,\n hydrate: () => {\n const current = get();\n if (current.hydrated) return;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/app-preferences.ts","s":49,"e":108,"m":1773495684425.4763,"t":"setFlightMode: (flightMode: boolean) => void;\n}\n\nexport const useAppPreferencesStore = create<AppPreferencesState>((set, get) => ({\n hydrated: false,\n theme: \"system\",\n showStructure: false,\n spellCheck: false,\n flightMode: false,\n hydrate: () => {\n const current = get();\n if (current.hydrated) return;\n const persisted = loadPersisted();\n if (persisted) {\n set({ ...persisted, hydrated: true });\n } else {\n set({ hydrated: true });\n }\n },\n setTheme: (theme) =>\n set((state) => {\n const next = { ...state, theme };\n persist({\n theme: next.theme,\n showStructure: next.showStructure,\n spellCheck: next.spellCheck,\n flightMode: next.flightMode,\n });\n return next;\n }),\n setShowStructure: (showStructure) =>\n set((state) => {\n const next = { ...state, showStructure };\n persist({\n theme: next.theme,\n showStructure: next.showStructure,\n spellCheck: next.spellCheck,\n flightMode: next.flightMode,\n });\n return next;\n }),\n setSpellCheck: (spellCheck) =>\n set((state) => {\n const next = { ...state, spellCheck };\n persist({\n theme: next.theme,\n showStructure: next.showStructure,\n spellCheck: next.spellCheck,\n flightMode: next.flightMode,\n });\n return next;\n }),\n setFlightMode: (flightMode) =>\n set((state) => {\n const next = { ...state, flightMode };\n persist({\n theme: next.theme,\n showStructure: next.showStructure,\n spellCheck: next.spellCheck,\n flightMode: next.flightMode,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/app-preferences.ts","s":97,"e":113,"m":1773495684425.4763,"t":"flightMode: next.flightMode,\n });\n return next;\n }),\n setFlightMode: (flightMode) =>\n set((state) => {\n const next = { ...state, flightMode };\n persist({\n theme: next.theme,\n showStructure: next.showStructure,\n spellCheck: next.spellCheck,\n flightMode: next.flightMode,\n });\n return next;\n }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/comments-ui.ts","s":1,"e":35,"m":1773495684431.4763,"t":"\"use client\";\n\nimport { create } from \"zustand\";\n\nexport type CommentTarget = {\n workspaceId: string;\n documentId: string;\n blockId: string | null;\n};\n\ninterface CommentsUiState {\n open: boolean;\n target: CommentTarget | null;\n openForPage: (args: { workspaceId: string; documentId: string }) => void;\n openForBlock: (args: { workspaceId: string; documentId: string; blockId: string }) => void;\n close: () => void;\n}\n\nexport const useCommentsUiStore = create<CommentsUiState>((set) => ({\n open: false,\n target: null,\n openForPage: ({ workspaceId, documentId }) =>\n set({\n open: true,\n target: { workspaceId, documentId, blockId: null },\n }),\n openForBlock: ({ workspaceId, documentId, blockId }) =>\n set({\n open: true,\n target: { workspaceId, documentId, blockId },\n }),\n close: () => set({ open: false }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/current-document.ts","s":1,"e":28,"m":1773495684437.4763,"t":"\"use client\";\n\nimport { create } from \"zustand\";\n\ninterface CurrentDocumentState {\n documentId: string | null;\n readOnly: boolean;\n disableDownload: boolean;\n disableCopy: boolean;\n setCurrent: (documentId: string, readOnly: boolean, disableDownload: boolean, disableCopy: boolean) => void;\n clearIfMatch: (documentId: string) => void;\n}\n\nexport const useCurrentDocumentStore = create<CurrentDocumentState>((set, get) => ({\n documentId: null,\n readOnly: false,\n disableDownload: false,\n disableCopy: false,\n setCurrent: (documentId, readOnly, disableDownload, disableCopy) =>\n set({ documentId, readOnly, disableDownload, disableCopy }),\n clearIfMatch: (documentId) => {\n const state = get();\n if (state.documentId === documentId) {\n set({ documentId: null, readOnly: false, disableDownload: false, disableCopy: false });\n }\n },\n}));","v":"WcHzPM+3sDy4QwO+54yjvT0kGD18lNG8LQSRvFmtFD0G6bq7AwAevWP1mb1r3dI84PSgPe1wz7s9O8I8SOkXvcSQBztJJzW9iAEiPVdl5Dw4+pM8N+g6vQ6d9TzmvxS9c0eVPeVOCD3uTNk8zBCNPRf1Rb3iW8A825EVu2lrcD3JaA682PZIPBU6hL3CWJ+5Es+wPFtCPbzloUu95xyou5YNUr2o8KG8czE0vfTtI71GToc9DU9/uxtEwT3wkEA8mkGFPYkmnb3B3QQ9dWzcvPwXVTynhQu9GFsJPp5E7jwxqne8I7rEPLpEBj2oChS9HjN2vNStjD2Wqjk8yJPTPXdJQz2648e8E+guvRGTjj2F6oo7McnTPPL1GzzvnHc9vEWePDscUL2/2OK8NqtePZLIDr1cuS29q7rgvB0hQz2eDiy8LD74u+XbYDwXva68rQQ3Pfxt47x0OC68nWEMvUDZcr1cMSU9cXD1PAFodr2EljA8hZsFPWAbYr1AK5M8T0+AvYtWyDznhvc8BaJvvRS3Gzwy/t+6lzLROQYHvbvEfv27seRUPV0YZDygXZA8PT69O1kxU70f+YG8vFA9PQxjsbwGi5a8CTmYvKQ4/7xO/qi8QQUZPRck47zdjIw8/ynNvDPbZr15xR28bL5OPNMmkD2ui7o82wLuvIZ8aTxRVXc8oTOQvVyQPr1ZZgq9Cpe8PMZD5bz2N0U98aDSPAPArrxARVy9h7aVO1OGCzucm/c8oReGPB3XzrzFBMS86DqpvKu9Vr3veos9rn+zvBf5aLw4eD89Z3okvfzhaj3r3nG8jTaUPZIb9jxPURC9hesgPWRVtryL8Rq8ktSBvA09ZT1ll+S8w19IvJ7PZj11/nc8zRgHu5H95DtiuN08/QRtvMo4Oz0vs9m85+2QvaWFN723jr071N2hO+lEHbzoQro59VLdvLs2DT1a+VW9kOCUvAe8v72NQgs9rO6qO9GPn7zYxyo80tfMPKSiW71MVRc98b+5vJ0w0juiMeK8xQzivJESqryKDWq9rzw2vWKX4juiEwe9niLTPJDaJ723DAq88CkxPbBzaTvzy0K8v1q+vTw5gLz2tla83HDfPF68oLzSbEy8aZWaPcl587wSSvQ8XBqovG5z0LxmOBY8V7mDPEX2Kr1wgbG8YHsUPfSKqTyjG3a8It+3PbYjHTwMYVE914blPIbq+rwbC508Pse6u34CWDvyjma85CGfvSxrRTxIKSA9sCKiPAQDkDzczlo9B8C5PelnNTybi9i7V4LuucNF/rvrKmm71RarvFOXAL1S/Cm7+FySu1lGSrwsunA8TxsNPcC6grzn8KE7anahPIIMMj0IBco8AXmbvfGEX7wLjBY64YDJvPxSN72oP1I9GHAxvAp6mDyMgZu8ILLLvMndN71HFOy8iXuZvMudizwH57w8oXEkvQTBzTuY9Au9cUO/PINUOD2Qf0w8NmATvJtjuLu787W8NjaivMwsjb2i2BW9A1srvXpFMrzjVlm8rnLtPKtW/zmrbEs77dYNvYlAjrz6dxo8DSQ8PSKQ/7xA3Yw9e4Pnu5xpJj31tNw55IMCvS3BGL2Aaiq9ufY2ue5Y+zs4dJw9IbyWPH5QW7z6/5w8ntM8PNPiDry76Lg8hnkGvUYFn71JZNO8R2zXtz53WD0w2DO9uY52PYS0ez2GhQq8I2dPPC8nmryM+XY6O/NTvDHqET1nhp+8DDzcu63MXz096L+8QQx0PBkDTDwj7hy7VPmNPfaDXDz5SDc8+ot2va5CFL1G1NG7MlnKvIfZ4rxdqNg7PP9wPWFhSzzP/oS8R+BjPbZwBj0eD129hwTPPBzwUDt8eQu9/MYuPb7QDT0iO0W9j8ufPVTTYTwAv9y6h5JFvJfDTLzOMd87LPUrPWdDk7zK4K08rVeKPc6wN7ykwKk8nofhvDCWhrscVtU78ReoPCLb4Lyl8UQ9b6uwPIpJkrzR8Se9DtvxuzhkDj0lwbI8zxV9vOp/K70UPcc7KRHbu2kznjtEYm09L8gYvfjfwDytJZq6795FPCXmoDxMaWM8QlKsO26dbDxeWVo9HTvDPHRYCb1L8+s78l8EvC5CID0kGBI9T+kyO6KK4DqpK906qotyOxgxD73qRz29YjGtPB+rE72BoBK98Xdru8qlz7zVXMe78Du1PCDrzrxfyio92S0CPd9wUrxlqdm8KdpdPWMyaLyeSxQ9ZiQsPUy7h7zPaUm9TLFNu7qtIz3yJFM89lihuug8rTwAFig9+KcFvOluyzzr21E69q6KvTGRCzwNaoi7V7aMPVKhhLszJQy9MAw7O7aRcbtpLNI8vJuSvFzheD0BQ6E91SWjvLdYbbyLnSy9PIJ5PEFlUD2apK09JQiKvXP6I70/JVQ773PNvEfBjDx/CDA9omS2OwEX2T3/Cp68WSqPPVRpQDxcl6i8Poibuoy+DT3nXNI8pEo4vY3kxrt9yYy8ds8+vchAXbumlOo7FlynPe6bTj32ETe9AbICvH1D8DyNIZ68ckWJPJAPTzuSxEe9FH2WPNxl2LsPFA89J0DOu0CjFL0kWCG8+ASnvURWJz2Xi8c8zelXPO/DqTxN0o08YUqyvCg+Kj28RxC8Ynj1vGISBjzpJVG9BErHu9VuUb3s2BY9B/7wO2zOUrwUXBk9kyDYup//7LuDnVY9mHvQvK4lZ7xiUmU9X5QXvUjlV7xdvY08tOowPDudgrzkqQc7TlGEvGxNPj0P+ta8cCpRutZIQzwpwoK9H3gHPU/Sbzv0Yu68xrPSvPCZQL3HFqK9/MsYOyYjiLsRuxm9HFCCvL5BrLxvw/m84AmKPGJzvDueTba7q0WNPY7XIL2qyma9AJIsPQ2vobz9Mx08lIswvH6/9blT5B+8AycMvBS3qzz4xLA8Z7rovFKQgzxbwx48U3VOvfQiTz19+o+8uDAlvDlJ+rwbERc9MHAtvFr5aLyQxhS7AQ5+PFBoOL08yRw8B8RePf/xl7qFGXM8QoVSvBlOpzvNUCu9gahnPfkDnbysTRs9A5vCvGf8+Lz4cjO93KB9vHPVsLsuf9A8WCoHPZrfvLyOCzC90J49O7bsgzyzFp
|
|||
|
|
{"p":"wolai-frontend/src/store/editor-bridge.ts","s":1,"e":52,"m":1778334083620.3638,"t":"\"use client\";\n\nimport { create } from \"zustand\";\nimport type { ReferenceTarget } from \"@/types/search\";\nimport type { Json } from \"@/types/supabase\";\nimport type { MediaAsset } from \"@/types/media\";\n\nexport interface EditorReferenceBridgeResult {\n blockId: string | null;\n}\n\nexport interface EditorReferenceBridge {\n insertInlineReference: (target: ReferenceTarget, alias?: string) => EditorReferenceBridgeResult;\n insertEmbedReference: (target: ReferenceTarget) => EditorReferenceBridgeResult;\n undo?: () => void;\n redo?: () => void;\n getCursorBlockId?: () => string | null;\n /**\n * 向当前打开的文档插入一个“附件/媒体”块。\n * 主要用于侧边栏文件树拖拽上传后,把文件显示到主编辑区。\n */\n insertMediaAsset?: (asset: MediaAsset) => void;\n /**\n * 向当前打开的文档插入一个“思维导图”块(使用 mindmapId 作为 block.id)。\n * 主要用于侧边栏垃圾桶“恢复思维导图”后,把导图重新显示到主编辑区。\n */\n insertMindmapAsset?: (args: { documentId: string; mindmapId: string }) => void;\n /**\n * 向当前打开的文档插入一个“在线表格(luckysheet)”块。\n * 主要用于侧边栏垃圾桶“恢复表格”后,把表格重新显示到主编辑区。\n */\n insertOnlineTableAsset?: (args: { documentId: string; tableId: string }) => void;\n replaceWithSnapshot: (blocks: Json) => void;\n openTableFullScreen?: (tableId: string) => void;\n}\n\ninterface EditorBridgeState {\n bridge: EditorReferenceBridge | null;\n registerBridge: (bridge: EditorReferenceBridge | null) => void;\n}\n\nexport const useEditorBridgeStore = create<EditorBridgeState>((set) => ({\n bridge: null,\n registerBridge: (bridge) =>\n set((state) => {\n if (state.bridge === bridge) {\n return state;\n }\n return { bridge };\n }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/move-embed-picker.ts","s":1,"e":54,"m":1773495684448.9375,"t":"\"use client\";\n\nimport { create } from \"zustand\";\nimport type { MoveEmbedMode } from \"@/components/documents/move-embed-picker-dialog\";\n\ntype OnPick = (mode: MoveEmbedMode, targetId: string | null) => void | Promise<void>;\n\ninterface MoveEmbedPickerState {\n open: boolean;\n workspaceId: string | null;\n defaultMode: MoveEmbedMode;\n modes: MoveEmbedMode[];\n allowRoot: boolean;\n excludeIds: string[];\n onPick: OnPick | null;\n setWorkspaceId: (workspaceId: string | null) => void;\n openPicker: (args: {\n workspaceId: string | null;\n defaultMode: MoveEmbedMode;\n modes?: MoveEmbedMode[];\n allowRoot?: boolean;\n excludeIds?: string[];\n onPick: OnPick;\n }) => void;\n close: () => void;\n}\n\nexport const useMoveEmbedPickerStore = create<MoveEmbedPickerState>((set) => ({\n open: false,\n workspaceId: null,\n defaultMode: \"move\",\n modes: [\"move\", \"embed\"],\n allowRoot: true,\n excludeIds: [],\n onPick: null,\n setWorkspaceId: (workspaceId) => set({ workspaceId }),\n openPicker: ({ workspaceId, defaultMode, modes, allowRoot, excludeIds, onPick }) =>\n set({\n open: true,\n workspaceId,\n defaultMode,\n modes: modes ?? [\"move\", \"embed\"],\n allowRoot: allowRoot ?? true,\n excludeIds: excludeIds ?? [],\n onPick,\n }),\n close: () =>\n set({\n open: false,\n onPick: null,\n excludeIds: [],\n }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/onlyoffice-ai-bridge.ts","s":1,"e":34,"m":1776325211125.3298,"t":"\"use client\";\n\nimport { create } from \"zustand\";\n\ntype OnlyOfficeAiBridgeState = {\n pluginReady: boolean;\n targetOrigin: string;\n targetWindow: Window | null;\n lastReadyAt: number | null;\n captureReady: (payload: { targetOrigin: string; targetWindow: Window | null }) => void;\n reset: () => void;\n};\n\nexport const useOnlyOfficeAiBridgeStore = create<OnlyOfficeAiBridgeState>((set) => ({\n pluginReady: false,\n targetOrigin: \"*\",\n targetWindow: null,\n lastReadyAt: null,\n captureReady: ({ targetOrigin, targetWindow }) =>\n set({\n pluginReady: Boolean(targetWindow),\n targetOrigin: targetOrigin || \"*\",\n targetWindow,\n lastReadyAt: Date.now(),\n }),\n reset: () =>\n set({\n pluginReady: false,\n targetOrigin: \"*\",\n targetWindow: null,\n lastReadyAt: null,\n }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/page-layout.ts","s":1,"e":19,"m":1773495684454.4766,"t":"\"use client\";\n\nimport { create } from \"zustand\";\n\ninterface PageLayoutState {\n showInspector: boolean;\n toggleInspector: () => void;\n setInspector: (visible: boolean) => void;\n}\n\nexport const usePageLayoutStore = create<PageLayoutState>((set) => ({\n showInspector: false,\n toggleInspector: () =>\n set((state) => ({\n showInspector: !state.showInspector,\n })),\n setInspector: (visible) => set({ showInspector: visible }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/search-palette.ts","s":1,"e":60,"m":1776325987941.81,"t":"\"use client\";\n\nimport { create } from \"zustand\";\nimport type {\n DocumentSearchFilters,\n DocumentSearchResult,\n DocumentSearchTimeField,\n DocumentSearchTimeRange,\n} from \"@/types/search\";\n\nexport type SearchPaletteMode = \"search\" | \"reference\";\nexport type ReferenceInsertMode = \"inline\" | \"embed\";\nexport type FilterKey = \"titleOnly\" | \"exact\" | \"onlyCurrentPage\" | \"includeOcr\";\n\ninterface SearchPaletteState {\n open: boolean;\n activated: boolean;\n mode: SearchPaletteMode;\n query: string;\n filters: Omit<DocumentSearchFilters, \"timeRange\">;\n timeRange: DocumentSearchTimeRange;\n referenceMode: ReferenceInsertMode;\n alias: string;\n recent: DocumentSearchResult[];\n setRecent: (items: DocumentSearchResult[]) => void;\n openSearch: () => void;\n openReference: (options?: { referenceMode?: ReferenceInsertMode; aliasSeed?: string }) => void;\n close: () => void;\n setQuery: (value: string) => void;\n toggleFilter: (key: FilterKey) => void;\n setTimeRange: (range: DocumentSearchTimeRange) => void;\n setTimeField: (field: DocumentSearchTimeField) => void;\n setCustomRange: (range: { from?: string; to?: string } | null) => void;\n setReferenceMode: (mode: ReferenceInsertMode) => void;\n setAlias: (value: string) => void;\n rememberResult: (result: DocumentSearchResult) => void;\n resetFilters: () => void;\n}\n\nconst defaultFilters: Omit<DocumentSearchFilters, \"timeRange\"> = {\n titleOnly: false,\n exact: false,\n onlyCurrentPage: false,\n includeOcr: false,\n timeField: \"updated\",\n customRange: undefined,\n};\n\nexport const useSearchPaletteStore = create<SearchPaletteState>((set) => ({\n open: false,\n activated: false,\n mode: \"search\",\n query: \"\",\n filters: { ...defaultFilters },\n timeRange: \"any\",\n referenceMode: \"inline\",\n alias: \"\",\n recent: [],\n setRecent: (items) => set({ recent: items.slice(0, 10) }),\n openSearch: () =>","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/search-palette.ts","s":49,"e":108,"m":1776325987941.81,"t":"export const useSearchPaletteStore = create<SearchPaletteState>((set) => ({\n open: false,\n activated: false,\n mode: \"search\",\n query: \"\",\n filters: { ...defaultFilters },\n timeRange: \"any\",\n referenceMode: \"inline\",\n alias: \"\",\n recent: [],\n setRecent: (items) => set({ recent: items.slice(0, 10) }),\n openSearch: () =>\n set((state) => ({\n open: true,\n activated: true,\n mode: \"search\",\n query: state.query,\n })),\n openReference: (options) =>\n set({\n open: true,\n activated: true,\n mode: \"reference\",\n referenceMode: options?.referenceMode ?? \"inline\",\n alias: options?.aliasSeed ?? \"\",\n }),\n close: () => set({ open: false }),\n setQuery: (value) => set({ query: value }),\n toggleFilter: (key) =>\n set((state) => ({\n filters: {\n ...state.filters,\n [key]: !state.filters[key],\n },\n })),\n setTimeRange: (range) => set({ timeRange: range }),\n setTimeField: (field) =>\n set((state) => ({\n filters: {\n ...state.filters,\n timeField: field,\n },\n })),\n setCustomRange: (range) =>\n set((state) => ({\n filters: {\n ...state.filters,\n customRange: range ?? undefined,\n },\n })),\n setReferenceMode: (mode) => set({ referenceMode: mode }),\n setAlias: (value) => set({ alias: value }),\n rememberResult: (result) =>\n set((state) => {\n const existing = state.recent.filter((item) => item.id !== result.id);\n return {\n recent: [result, ...existing].slice(0, 10),\n };\n }),\n resetFilters: () =>","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/search-palette.ts","s":97,"e":114,"m":1776325987941.81,"t":"},\n })),\n setReferenceMode: (mode) => set({ referenceMode: mode }),\n setAlias: (value) => set({ alias: value }),\n rememberResult: (result) =>\n set((state) => {\n const existing = state.recent.filter((item) => item.id !== result.id);\n return {\n recent: [result, ...existing].slice(0, 10),\n };\n }),\n resetFilters: () =>\n set({\n filters: { ...defaultFilters },\n timeRange: \"any\",\n }),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/sidebar.test.ts","s":1,"e":48,"m":1776751939630.8762,"t":"import { afterEach, describe, expect, it } from \"vitest\";\nimport { useSidebarStore } from \"@/store/sidebar\";\n\ndescribe(\"useSidebarStore hydration\", () => {\n afterEach(() => {\n localStorage.clear();\n });\n\n it(\"模块初始化时应保持默认首帧状态,避免先读持久化状态\", () => {\n const state = useSidebarStore.getState();\n\n expect(state.open).toBe(false);\n expect(state.width).toBe(280);\n expect(state.viewMode).toBe(\"section\");\n });\n\n it(\"手动 hydrate 后才应用持久化状态\", () => {\n localStorage.setItem(\n \"sidebar-ui\",\n JSON.stringify({\n state: {\n open: true,\n width: 360,\n collapsedSections: {\n starred: false,\n public: false,\n shared: false,\n private: true,\n templates: false,\n },\n trashConfirm: false,\n viewMode: \"filesystem\",\n },\n version: 4,\n }),\n );\n\n const store = useSidebarStore;\n expect(store.persist.hasHydrated()).toBe(false);\n void store.persist.rehydrate();\n\n expect(store.getState().open).toBe(true);\n expect(store.getState().width).toBe(360);\n expect(store.getState().viewMode).toBe(\"filesystem\");\n expect(store.persist.hasHydrated()).toBe(true);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/store/sidebar.ts","s":1,"e":60,"m":1776751643245.2312,"t":"import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport type { SidebarSectionId } from \"@/components/sidebar/types\";\n\ninterface SidebarState {\n open: boolean;\n width: number;\n collapsedSections: Record<SidebarSectionId, boolean>;\n trashConfirm: boolean;\n viewMode: \"section\" | \"filesystem\";\n setOpen: (open: boolean) => void;\n setWidth: (width: number) => void;\n toggleSection: (section: SidebarSectionId) => void;\n setSectionCollapsed: (section: SidebarSectionId, collapsed: boolean) => void;\n setTrashConfirm: (value: boolean) => void;\n setViewMode: (mode: SidebarState[\"viewMode\"]) => void;\n setCollapsedSections: (collapsed: Record<SidebarSectionId, boolean>) => void;\n}\n\nconst sectionDefaults: Record<SidebarSectionId, boolean> = {\n starred: true,\n public: true,\n shared: true,\n private: false,\n templates: true,\n};\n\nexport const useSidebarStore = create<SidebarState>()(\n persist(\n (set) => ({\n open: false,\n width: 280,\n collapsedSections: { ...sectionDefaults },\n trashConfirm: true,\n viewMode: \"section\",\n setOpen: (open) => set({ open }),\n setWidth: (width) => set({ width }),\n toggleSection: (section) =>\n set((state) => ({\n collapsedSections: {\n ...state.collapsedSections,\n [section]: !state.collapsedSections[section],\n },\n })),\n setSectionCollapsed: (section, collapsed) =>\n set((state) => ({\n collapsedSections: {\n ...state.collapsedSections,\n [section]: collapsed,\n },\n })),\n setTrashConfirm: (value) => set({ trashConfirm: value }),\n setViewMode: (mode) => set({ viewMode: mode }),\n setCollapsedSections: (collapsed) => set({ collapsedSections: collapsed }),\n }),\n {\n name: \"sidebar-ui\",\n version: 4,\n skipHydration: true,\n migrate: (persistedState, version) => {","v":"SJsfPdgiRj0y6RC+c+G1vVQtgjyBMQe9E4mHPOKqcj3IeAO9yLoLvQOxYr3hx5W7U++OPbvfID2wY3Q9zx0nvYFtq7wpOjK9VEwcPcEnTz2PQS88JrkNvUdl5Tynkou9xaPAPSfbYT2mSLk8gGhnPbYKU7xvWJU8TpsEPEK+yDy67cc8xJDrPLKq9zvJn1O93NwQPN+darxKKky9rvKyPBMshb333Bq8S8WLu0kDnL2aamw9u2bpu/yowD3u/6C8nQqYPQo7c73KTBE9+CoMvLGCCT3/d1S8rNWePVQ9IDx9pTM8EhGGu9aqSj1tgri6RN6+vKdumT1He7K8gQu/PcaZEz2eDiA7yKo1va9ajz2DpZm8LWdFvdUkIz0Tc1w9qR8pOwVpiDv7Zb28FN5IPdTyvrwjJxK7ZFIavTKeJz0IFkq9mtlavH8ghTyXM5w8VDyRPFk+L7xF/EO8irdzvGRLT710vDs9oZOgO+5ti70Yqt27rs4FPV8CZL0dN8W8Hk3LvCk39jzZbTO9XAjdvD8I2ju+OBK9GNmaO2Ra3Ty2JAc8hQmWPd4JVrqvZtg8+JjiOyovhL1zQRS8g6zqPJoliLw5uQo8BjGgPH9ZG7363+S7QdwqPZpVzztIrnM8ClUdvQCOW72lgJG8yPjCOxYVRj3wAYo7izUGveMnijzQ3WA9bDZKvQZocbxhdAW7KZCuu/GukDwZe7w9SLyVPek357yjMKq8N0ffu54/DzwOYPM8u2jHu6KQ8bxMN9A700Z0PNk0p739nbM9n0n1vBJLD72qZA08wzIavfRYJj2ADzu94s0QPeWKejw4C1q92FmLPHqWgbwWfQ67eRihPE8kPz3cemy8Cpewu1dTbT3SDbU8ezsAuwLBiry7NVo8BOmSvHJkRD0osUy9h1TtvFCyAjswda07nPqvOw42oTzRKZk8lqrKvMjBFj3+H1u93BvOvLNKr7xoJSY8OCPaPFVAyLxq/aM7W0w7PEwL0Lz42qo8rnTsvGZHLjy8Zwa9UYBDvZxZnrw9cee8kmEhvWLh1zwJGiS9fktfPLkbVb2qWCO93zyNPFGwtTo7wHO72w2IvcbtJDtO/NK8Db4iPeRN+bx2W6o8CitrPcIpBr0ZgxY9y3pKvbwYrDzn9mi8OcmRuyPt9bzs+eE7O8o8PRgNSDy5cyW851OEPLWupzr2F4c9urOAPG+kVTsXU288PmEPvDyoorwKO4e8EQ95ve+HT7vGmpM7/uKbvI9r3jtkosQ8JthYPXvVzLsxFFO8ioZ7PNjjtbxbvh09vE0FvTVXq7yrkQm8F7EZOkoN2LxWpCs9F1uCPQ2ZAL2K/+S8i8AyPYRZJz2WJzu8M5mqvdztEr0xpnq8/OmmuwM8S73qcbc8Q+gWvMdHBz2SuLe8XjlTvFpVX72DV129BMdMOByogjw9Oa488MgEu5JLPjxyeeK80K0oPZINCD1f/eY8vXcGPQpmi7wLj0u9C1eQujJLNL2uVCW94qjDvCK6KrtPeMw6+x8nPSUJ5Lv5Rgk8drVIvc8SZzyFjak7tQdruzcpBrw9BSY9I+olPVqUBz3B78u7qzkcvQNmkL1t8kC9VAnRvFlcFz3diKw99UOZPON/L7vtD+K8jdaFu5gwXDyDMdQ8S3WkvLETTb1pCwS9uDtZvXTuFT0933m9iqnWPEjZMD2EuZg7qhrrPEjLb70VRls8IzBLvNNs5zwE/Y28YuUCPV2Oij1/75O8FTwhPQALCD3rn5i8oKyhPbCXOT10NDE8tHsMvcLdxLwZHK67GfZbvfkFMbtETHU7en9+PVmvpz00Jy69s9hoPTH7/DwYFua8mRIXO4SjjLtymAS9AWjMPKQucT20dhe9T7gyPWPR0jzQKdG7ZI3HOfTdY7zoPWA6ylkDvEiisztWM3E7Atx+Pb9dHb0pyyA8hOY+u5ErsLwzUAw9PmZtPb6skbx0I/U8+V7/uz8YErsWo7C8TMcsPGh4xjy6dP+8mA
|
|||
|
|
{"p":"wolai-frontend/src/store/sidebar.ts","s":49,"e":91,"m":1776751643245.2312,"t":"[section]: collapsed,\n },\n })),\n setTrashConfirm: (value) => set({ trashConfirm: value }),\n setViewMode: (mode) => set({ viewMode: mode }),\n setCollapsedSections: (collapsed) => set({ collapsedSections: collapsed }),\n }),\n {\n name: \"sidebar-ui\",\n version: 4,\n skipHydration: true,\n migrate: (persistedState, version) => {\n const state = persistedState as\n | Partial<\n Pick<\n SidebarState,\n \"width\" | \"collapsedSections\" | \"trashConfirm\" | \"viewMode\"\n >\n >\n | undefined;\n if (!state) return state;\n if (version >= 4) return state;\n\n const nextCollapsedSections = {\n ...sectionDefaults,\n ...(state.collapsedSections ?? {}),\n };\n\n return {\n ...state,\n collapsedSections: nextCollapsedSections,\n };\n },\n partialize: (state) => ({\n width: state.width,\n collapsedSections: state.collapsedSections,\n trashConfirm: state.trashConfirm,\n viewMode: state.viewMode,\n }),\n },\n ),\n);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/api-utils.ts","s":1,"e":60,"m":1773495684303.4749,"t":"/**\n * API 工具函数\n * 提供统一的错误处理和响应解析\n */\n\nimport { NextResponse } from \"next/server\";\n\n/**\n * API 错误类\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: unknown,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\n/**\n * 统一的 API 错误响应格式\n */\nexport interface ApiErrorResponse {\n error: string;\n details?: unknown;\n}\n\n/**\n * 创建 API 错误响应\n * @param message 错误消息\n * @param status HTTP 状态码\n * @param details 额外的错误详情\n * @returns NextResponse\n */\nexport function apiErrorResponse(\n message: string,\n status = 500,\n details?: unknown,\n): NextResponse<ApiErrorResponse> {\n const payload: ApiErrorResponse =\n typeof details === \"undefined\" ? { error: message } : { error: message, details };\n return NextResponse.json(payload, { status });\n}\n\n/**\n * 常用错误响应的快捷方法\n */\nexport const errorResponses = {\n /** 400 - 请求参数错误 */\n badRequest: (message: string = \"请求参数错误\") => apiErrorResponse(message, 400),\n\n /** 401 - 未登录 */\n unauthorized: (message: string = \"未登录\") => apiErrorResponse(message, 401),\n\n /** 403 - 无权限 */\n forbidden: (message: string = \"无权限访问\") => apiErrorResponse(message, 403),\n\n /** 404 - 资源不存在 */","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/api-utils.ts","s":49,"e":108,"m":1773495684303.4749,"t":"*/\nexport const errorResponses = {\n /** 400 - 请求参数错误 */\n badRequest: (message: string = \"请求参数错误\") => apiErrorResponse(message, 400),\n\n /** 401 - 未登录 */\n unauthorized: (message: string = \"未登录\") => apiErrorResponse(message, 401),\n\n /** 403 - 无权限 */\n forbidden: (message: string = \"无权限访问\") => apiErrorResponse(message, 403),\n\n /** 404 - 资源不存在 */\n notFound: (message: string = \"资源不存在\") => apiErrorResponse(message, 404),\n\n /** 500 - 服务器错误 */\n internalError: (message: string = \"服务器错误\") => apiErrorResponse(message, 500),\n\n /** AI 配置错误 */\n aiConfigError: (provider: \"online\" | \"local\") =>\n apiErrorResponse(\n provider === \"local\"\n ? \"未找到本地 AI 配置(LOCAL_AI_BASE_URL/LOCAL_AI_MODEL 或 ai.local.md / ai-local.md)\"\n : \"未找到在线 AI 配置(ai.md 或 ONLINE_AI_* 环境变量)\",\n 500,\n ),\n} as const;\n\n/**\n * 处理 fetch 响应并解析 JSON\n * 如果响应不成功,抛出 ApiError\n * @param response Fetch Response 对象\n * @param defaultErrorMessage 默认错误消息\n * @returns 解析后的 JSON 数据\n */\nexport async function handleApiResponse<T>(\n response: Response,\n defaultErrorMessage: string = \"请求失败\",\n): Promise<T> {\n if (!response.ok) {\n let message = defaultErrorMessage;\n let details: unknown;\n\n try {\n const payload = await response.json();\n if (payload && typeof payload === \"object\") {\n if (\"error\" in payload && typeof payload.error === \"string\") {\n message = payload.error;\n }\n if (\"details\" in payload) {\n details = payload.details;\n }\n }\n } catch {\n // JSON 解析失败,使用默认消息\n }\n\n throw new ApiError(message, response.status, details);\n }\n\n return response.json() as Promise<T>;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/api-utils.ts","s":97,"e":156,"m":1773495684303.4749,"t":"if (\"details\" in payload) {\n details = payload.details;\n }\n }\n } catch {\n // JSON 解析失败,使用默认消息\n }\n\n throw new ApiError(message, response.status, details);\n }\n\n return response.json() as Promise<T>;\n}\n\n/**\n * 安全地解析 JSON,失败时返回 null\n * @param raw JSON 字符串\n * @returns 解析后的对象或 null\n */\nexport function safeParseJson<T = unknown>(raw: string | null | undefined): T | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * 验证请求体是否包含必需字段\n * @param body 请求体对象\n * @param requiredFields 必需字段列表\n * @returns 如果验证失败,返回错误响应;否则返回 null\n */\nexport function validateRequestBody<T extends Record<string, unknown>>(\n body: T | null,\n requiredFields: (keyof T)[],\n): NextResponse<ApiErrorResponse> | null {\n if (!body) {\n return apiErrorResponse(\"请求体为空\", 400);\n }\n\n for (const field of requiredFields) {\n if (!(field in body) || body[field] === null || body[field] === undefined) {\n return apiErrorResponse(`缺少必需字段: ${String(field)}`, 400);\n }\n }\n\n return null;\n}\n\n/**\n * 从请求中安全地获取 JSON\n * @param request Next.js Request 对象\n * @returns 解析后的 JSON 或 null\n */\nexport async function safeGetJsonBody<T = unknown>(\n request: Request,\n): Promise<T | null> {\n try {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/api-utils.ts","s":145,"e":162,"m":1773495684303.4749,"t":"return null;\n}\n\n/**\n * 从请求中安全地获取 JSON\n * @param request Next.js Request 对象\n * @returns 解析后的 JSON 或 null\n */\nexport async function safeGetJsonBody<T = unknown>(\n request: Request,\n): Promise<T | null> {\n try {\n return (await request.json()) as T;\n } catch {\n return null;\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/blocks.ts","s":1,"e":60,"m":1773495684309.4749,"t":"import type { Json } from \"@/types/supabase\";\n\ntype BlockLike = {\n id: string;\n type?: string;\n props?: Record<string, unknown>;\n content?: unknown;\n children?: BlockLike[];\n};\n\nconst asBlockArray = (value: unknown): BlockLike[] => {\n if (!Array.isArray(value)) return [];\n return value.filter((b) => b && typeof b === \"object\" && typeof (b as { id?: unknown }).id === \"string\") as BlockLike[];\n};\n\nexport const findBlockInTree = (\n blocks: BlockLike[],\n blockId: string,\n): { block: BlockLike; parent: BlockLike | null; index: number } | null => {\n const stack: Array<{ list: BlockLike[]; parent: BlockLike | null }> = [{ list: blocks, parent: null }];\n while (stack.length) {\n const item = stack.pop()!;\n const list = item.list;\n for (let i = 0; i < list.length; i += 1) {\n const b = list[i]!;\n if (b.id === blockId) {\n return { block: b, parent: item.parent, index: i };\n }\n if (Array.isArray(b.children) && b.children.length > 0) {\n stack.push({ list: b.children, parent: b });\n }\n }\n }\n return null;\n};\n\nconst cloneBlock = (block: BlockLike): BlockLike => {\n return {\n ...block,\n props: block.props ? { ...block.props } : undefined,\n content: Array.isArray(block.content) ? [...block.content] : block.content,\n children: Array.isArray(block.children) ? block.children.map(cloneBlock) : block.children,\n };\n};\n\nexport const removeBlockSubtree = (\n blocks: BlockLike[],\n blockId: string,\n): { removed: BlockLike | null; nextBlocks: BlockLike[] } => {\n // 说明:这里不直接修改入参 blocks,返回新的 nextBlocks。\n const nextTop = blocks.map(cloneBlock);\n const hit = findBlockInTree(nextTop, blockId);\n if (!hit) return { removed: null, nextBlocks: nextTop };\n\n if (hit.parent) {\n const parent = hit.parent;\n const nextChildren = asBlockArray(parent.children).map(cloneBlock);\n const removed = nextChildren.splice(hit.index, 1)[0] ?? null;\n parent.children = nextChildren;\n return { removed, nextBlocks: nextTop };","v":"dr0UPb61HT2CSMi9uV/rvUVkID1tc4e8IgePvFTh6zvEnLU8va8OvQeWP71X2Hg9aBLuPU1PQbygoa68ZYCivcjGxDwFLom9apzxPNmJ4zwrzYM9knp6vHW/9DxO9Ui9AN99Pe2rhj3vyk89kge6PKA8+7zB4+A8BhmvOwGxYzuoFMU8MdE1OsTJmb3IQUm7i/GSPDubVbxweyA9L7iZuwRX2Lx/F6I7MR8Cva71Nb1fBV89orYCvYDxsz0DYuM89GupPYgdUr2yhVQ9kba8vP9LLT2L3O68Xj3JPcHz7jvb3u28q+muvLfIkTzPi5E80aYHvcBqWz29eNq5N4OwPXflAj3ZGEO7vHpAvYY+gD3rxDS9hR6vvEfo6zwwkBg8g0UqPQ1tBLy3XFK97YNAPVEvdTuioBm8+H4DvYZviz0g/jO9ZgoNOmAkNjxXqbw8hc2IPOdtGrzm3+C8tE3duyH2L73SJSc8cRQNPctX1LxrImK8xrTHu6dmBL2TmoE9Ml1MO4R4nzzx5pC8shq9vJrHKz1mRVc7E/W3PMZs5LyqX+683FlZPdqG0TxZldm7GUQWvXJ6Jr2DGbS83DGBPRpUSr27iDC9HcnMux0flb1RSK68tuC1Ooh2vzyi7sU8zCv6vIchwrubafy85sjGPORIIj00jDG8kE4EvbQFLD1gJEk9b7K3vQ7Ap7zPRzG9smqIvF+CgbvsEJY9mmMTPbo3SDtSYl29y6uePLwGv7tyXQg83UaUPAUaFbst+We8Fp61PIfP07wa/509Xr2YvEo4WL0qRvW72gICvQA0bT0o1wK8+kW2PfQBVjxSyvO8uQY/PTrQWzyL5Lw8IfVOvCA7/TyKHcW7wv6CvWNKzzztIm+7BFsfvN7ARTxKtIg8QPEeOw54Lz0A2XC9nb1DvfcUfzvjM628/qZHvfsbSbucJDY9zIzSvBeNzTsoFg+8Wvy+uyimor2XYl09Hum5PN/6Jb0yzno7CM9NvN3sCTxukQs9E82NvCdiZbvypAa9fcFVvAnL5bor1gS9a5mCvTFtYrvGF/i7UCOqPDWTRb2ZX4K8KLLEPDeGkzvG0Ze8cmyOvUQ79by6sta8+ettPSn4R712Fp08sfXZPL837LzNoZQ8uVdXOzPgGL0Hke66YYUbvWGKQbjMXnm9CkXwO/xspDxB8Ea9u5sePR/zDz1IPYQ9KNYMPXYbOzz/epM8AUZ1vAmnVb2FzyO9e3d0vSdUmDoXA2k86ffuvGOv/TpbIN88opyYPZhctLv+6KC89otCPA/yqjsy4IE8+YyivIKkpzuCRMW851osvJ9oAr2TcDM8KwG4PDKEM723Ko08ACBrPQH8cj2Kj207PhGDvSVZwTzmlAa9+uyyO1bPjL2N0/A8nvw+utoU4Twtuce8vkKVvFulm7rHbze9PlGeOrNqU7tD0sM8+p0PvcL/dTxQ1Tg8jQzePAIPVT0lNbg81G10PFg/yLx3oUa9nqKEvEZS0rwqc0u8wwTFu8OKwDzbLSK8SpaGO6rw+LwEP+C7TphWPCZ0FDwpjGC7zk+ePInSlzvyLmE9FUXRPFOsPj3IUMI7lnmJvfgwCr1pnme9iHKrO27yJD1shZ899hQSPfXwdjzCtNu8kG0DPLMZMr1fmEo88ZoNPbr8Rb3MMdm7AYldvKxhKD3LkJ+8wq4FPKCfIj2sV3i8zpg7PXUmeDu6hBK8pAhLvfrAqT11PBg9rR6OvP7dhz2hz9U7frVmPEHqobseDgy9SvxhPb+z9LuxgKE8uygCvQ9A0b3D2KU8olfOvNpZqDw5DNq8zIx8PJO0vTyqeTu9hwJPPU/BkrxCuye9khe8O8VJCr0aMWO9qHIiPX0LwDyG3S+9VEZhPZkVqjweIX68161ZPOqYOD23C0M9Zhw1uj
|
|||
|
|
{"p":"wolai-frontend/src/lib/blocks.ts","s":49,"e":108,"m":1773495684309.4749,"t":"): { removed: BlockLike | null; nextBlocks: BlockLike[] } => {\n // 说明:这里不直接修改入参 blocks,返回新的 nextBlocks。\n const nextTop = blocks.map(cloneBlock);\n const hit = findBlockInTree(nextTop, blockId);\n if (!hit) return { removed: null, nextBlocks: nextTop };\n\n if (hit.parent) {\n const parent = hit.parent;\n const nextChildren = asBlockArray(parent.children).map(cloneBlock);\n const removed = nextChildren.splice(hit.index, 1)[0] ?? null;\n parent.children = nextChildren;\n return { removed, nextBlocks: nextTop };\n }\n\n const removed = nextTop.splice(hit.index, 1)[0] ?? null;\n return { removed, nextBlocks: nextTop };\n};\n\nexport const replaceBlockInTree = (\n blocks: BlockLike[],\n blockId: string,\n nextBlock: BlockLike,\n): { ok: boolean; nextBlocks: BlockLike[] } => {\n const nextTop = blocks.map(cloneBlock);\n const hit = findBlockInTree(nextTop, blockId);\n if (!hit) return { ok: false, nextBlocks: nextTop };\n\n const normalized = cloneBlock({ ...nextBlock, id: blockId });\n if (hit.parent) {\n const parent = hit.parent;\n const nextChildren = asBlockArray(parent.children).map(cloneBlock);\n nextChildren[hit.index] = normalized;\n parent.children = nextChildren;\n return { ok: true, nextBlocks: nextTop };\n }\n\n nextTop[hit.index] = normalized;\n return { ok: true, nextBlocks: nextTop };\n};\n\nexport const extractBlockText = (block: BlockLike): string => {\n const inline = Array.isArray(block.content) ? (block.content as Array<{ text?: unknown }>) : [];\n const text = inline.map((n) => (typeof n?.text === \"string\" ? n.text : \"\")).join(\"\");\n return text.trim();\n};\n\nexport const getBlocksFromDocumentContent = (content: unknown): BlockLike[] => {\n if (Array.isArray(content)) return asBlockArray(content);\n if (content && typeof content === \"object\") {\n const blocks = (content as { blocks?: unknown }).blocks;\n return asBlockArray(blocks);\n }\n return [];\n};\n\nexport const withBlocksWrittenBack = (content: unknown, blocks: BlockLike[]): Json => {\n // 复用现有结构:数组或 {blocks: []}\n if (Array.isArray(content)) {\n return blocks as unknown as Json;\n }","v":"t2+zPd/tkjsnxOa9qn+wvczz6Dx9+tW8NJwGPOcuIz2ltzM9yTFzvTvcjL2IQII9w7Z9Pfl5YTzSb4082+GTvdHMG7ze+QW8oOMnPKRWDz0PoEY9nhzaOofVczxY8Ei9tHRXPQoqCT3reN48+F5QPKhyEL2lKDA9sZA0Pca3qjx3lLy7ScfTvORQz70AyEC8o+WfPRBmBj1rHgc8egVAvKfeRz3t0Qc9uukAvc7mK73g/G89s2/wvALNtj3ms7g8jcPCPfE0pb2ng9C70lHSvEONZz2cwSe9PJuuPdeqEz1X6Ue7PH0JPFsKjT2ZBZu8rPMWvaQpMj3KPFC8lVWvPZUjMz06A7m8TosfveqrFj0GghK6xBuuuiyIvDxpIqU8Kh0wPOXIrTqCfV29MI0kPXgnpTuk1zG97DlRvRb/Ij01dgu9TnItvMwfOD0sEQc93r6fPQisVryZOAK75fNlvAlgUb1FdzI9KP84PTjnjryJQTo8sh5CPWu6Rb02CxU8do+pvG1OlTwGHsw5l9nRux9yvzwcsm68Sb9yO6fUQr3UmHA8FRmdPbRQhTxKaKy8eFfRvDynwrzujAu9jdV5PC+gDL2XWju94dEQPFvJbb0x3lw9gdYtvCJ4RLwassw8OFcIvcZqq7xc8QO8DAsoPcosFz1gdDK8ygcrvYPwqTz/cTw9oZWOvfOnA71890S73m3BPOQ8Cj3Km249EAzgPGxyl7zrLpu8//UMutL127zyMrk8OlQJPV1oqryRlQC9jkrbPDWsTb3YrZU9H/TxvBTpSb30SwG9N9qlO6OVhDy+ytm6B0OCPSOe77udHJm8H9NOPTUIE7yY5Wg8b3atPKJg8TtOAJE7GfspvYDi7jwIgKa73wfXvLMK9LvV3q08yyuQPIEGdjwlf5+9RiddvQk5ZDt62ZQ2Q5IPvIWqUTwWmEs9yR8XvTjzGTy1o6q8ZGpjvAYjRL0RQqQ9hbUnPaQCG7zySMg7pTjFOwl7DT0/YHc8EAQ9vY2HhDvArRC9Ob7zvDfQYDwex2K8fbSXvbjpwDxKn7a6mVAsPcJWCL1YiaC8LxaKvFTiqTvPAgS9yA1ivYKVkDxzT8C8yjqEPR0aOr39UQo86yLkPBh/ILxqgV463dKqPLVIFLxT4nO7x/yUO9eQw7s2VWG9Y/J/PKjtbTxl89C8c1bCu2z2BD2T/Jk9OZzwPP3nuDz8sqa7H/YMvQxnWrx3kgu9cs26vYnPijwwiP08AimwvGJuET09U189/zi6PQIj4byo0vc8XN1WvL42kjx83HQ8LSkUvZKNIrwmVAK90PnTPGr3i7wEVpE8Fn3pPC2DG7qvig49bujIPM2IaD1QOmI9yICTvDWYTTuhLye6HBrBvIdZCL3wswY616l1vMwiAD3kfsC8xlnHvKkyI721RFq9XCBRuylGTDxaIwE9pxrjvFFKET1LdQo9QpPNPBWENzz/Kp68bsfXPPFWuLw+NHa9U3Jru9L2/7zijRg9ZeRRvQeEHbyQ/bG8qiqXPJ2OJL06pka9MIrLvMnxN7umGkC9FMCiPJwMdDxxsCs9EXqMPOt9jz0oEcW7sn1kvVLFQ709gPe8M+znO3ltGD1Rv3M9qnRhPWB/Cjx0Dku7BzEZPSD8kbzqjH68/Ov2u3aqLL0UrpU7VFzrPKSkED3mFWO9o1YAPUzsYz2J1iI324K3PIFDwDzsxyK9ov2GvPnhZz1LTWc6M8vTu5l2Hj1Y0xK92+8PPO/MvLuP77u82GXuPHi6ZDz+zys9n
|
|||
|
|
{"p":"wolai-frontend/src/lib/blocks.ts","s":97,"e":115,"m":1773495684309.4749,"t":"if (content && typeof content === \"object\") {\n const blocks = (content as { blocks?: unknown }).blocks;\n return asBlockArray(blocks);\n }\n return [];\n};\n\nexport const withBlocksWrittenBack = (content: unknown, blocks: BlockLike[]): Json => {\n // 复用现有结构:数组或 {blocks: []}\n if (Array.isArray(content)) {\n return blocks as unknown as Json;\n }\n if (content && typeof content === \"object\") {\n return { ...(content as Record<string, unknown>), blocks } as Json;\n }\n return { blocks } as Json;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/constants.ts","s":1,"e":60,"m":1773495684315.475,"t":"/**\n * 全局常量定义\n * 集中管理项目中的魔法数字和硬编码值\n */\n\n// ============================================\n// AI Agent 相关常量\n// ============================================\n\n/** AI Agent 默认最大步数 */\nexport const DEFAULT_AGENT_MAX_STEPS = 10;\n\n/** AI Agent 最大步数限制 */\nexport const MAX_AGENT_STEPS = 24;\n\n/** AI Agent 最小步数 */\nexport const MIN_AGENT_STEPS = 1;\n\n/** 客户端工具默认超时时间(毫秒) */\nexport const DEFAULT_CLIENT_TOOL_TIMEOUT_MS = 60_000;\n\n// ============================================\n// 网络请求相关常量\n// ============================================\n\n/** OpenAI 兼容 API 最小超时(毫秒) */\nexport const MIN_API_TIMEOUT_MS = 500;\n\n/** OpenAI 兼容 API 默认超时(毫秒) */\nexport const DEFAULT_API_TIMEOUT_MS = 20_000;\n\n/** OpenAI 兼容 API 最大超时(毫秒) */\nexport const MAX_API_TIMEOUT_MS = 120_000;\n\n/** OpenAI 最小输出 token 数 */\nexport const MIN_COMPLETION_TOKENS = 64;\n\n/** OpenAI 最大输出 token 数 */\nexport const MAX_COMPLETION_TOKENS = 16_000;\n\n// ============================================\n// 编辑器相关常量\n// ============================================\n\n/** 内容加载延迟时间(毫秒) */\nexport const CONTENT_LOADING_DELAY_MS = 200;\n\n/** 编辑器块标题最小级别 */\nexport const MIN_BLOCK_LEVEL = 1;\n\n/** 编辑器块标题最大级别 */\nexport const MAX_BLOCK_LEVEL = 5;\n\n/** 零延迟 setTimeout(用于将任务推入事件循环) */\nexport const ZERO_DELAY_MS = 0;\n\n// ============================================\n// 思维导图相关常量\n// ============================================","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/constants.ts","s":49,"e":108,"m":1773495684315.475,"t":"export const MIN_BLOCK_LEVEL = 1;\n\n/** 编辑器块标题最大级别 */\nexport const MAX_BLOCK_LEVEL = 5;\n\n/** 零延迟 setTimeout(用于将任务推入事件循环) */\nexport const ZERO_DELAY_MS = 0;\n\n// ============================================\n// 思维导图相关常量\n// ============================================\n\n/** 思维导图最大附件数量 */\nexport const MAX_MINDMAP_ATTACHMENTS = 12;\n\n/** 思维导图最大选中节点数 */\nexport const MAX_SELECTED_NODES = 6;\n\n// ============================================\n// RAG 搜索相关常量\n// ============================================\n\n/** RAG 默认搜索结果数量 */\nexport const DEFAULT_RAG_TOP_K = 12;\n\n/** RAG 默认 chunk 结果数量 */\nexport const DEFAULT_RAG_CHUNK_TOP_K = 12;\n\n/** 文档搜索默认结果数量 */\nexport const DEFAULT_DOCS_SEARCH_LIMIT = 12;\n\n/** 文档读取默认最大字符数 */\nexport const DEFAULT_DOCS_READ_MAX_CHARS = 2500;\n\n/** 文档获取默认最大块数 */\nexport const DEFAULT_DOC_GET_MAX_BLOCKS = 80;\n\n/** 文档查找默认最大结果数 */\nexport const DEFAULT_DOC_FIND_MAX_RESULTS = 8;\n\n// ============================================\n// 资产/附件相关常量\n// ============================================\n\n/** 思维导图从资产转换最大项目数 */\nexport const DEFAULT_ASSET_TO_MINDMAP_MAX_ITEMS = 120;\n\n/** 搜索默认结果数量 */\nexport const DEFAULT_SEARCH_COUNT = 6;\n\n// ============================================\n// UI 相关常量\n// ============================================\n\n/** 表格嵌入预览最小高度(像素) */\nexport const MIN_EMBED_HEIGHT = 120;\n\n/** 表格嵌入预览最大高度(像素) */\nexport const MAX_EMBED_HEIGHT = 600;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/constants.ts","s":97,"e":128,"m":1773495684315.475,"t":"export const DEFAULT_SEARCH_COUNT = 6;\n\n// ============================================\n// UI 相关常量\n// ============================================\n\n/** 表格嵌入预览最小高度(像素) */\nexport const MIN_EMBED_HEIGHT = 120;\n\n/** 表格嵌入预览最大高度(像素) */\nexport const MAX_EMBED_HEIGHT = 600;\n\n/** 表格嵌入预览默认高度(像素) */\nexport const DEFAULT_EMBED_HEIGHT = 300;\n\n/** 上下文菜单距离窗口边缘的最小内边距(像素) */\nexport const CONTEXT_MENU_PADDING = 12;\n\n// ============================================\n// 工具函数\n// ============================================\n\n/**\n * 将数值限制在指定范围内\n * @param n 输入值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的值\n */\nexport const clamp = (n: number, min: number, max: number): number =>\n Math.max(min, Math.min(max, n));","v":"2GI7PXHEe7vy3gS+4E+LvQMvA7w8ANC8kb/MvB6SfjqXAWA8ebOTvMbCAr2apAc8QBSMPZTX5by0fr0967UpvQmUhjt4twu9pKXEvGfPgT1i0Sk8010vPKNzPr19lMK9Txg/Peo9Fj2Za5m823AiPAtI0rwpgjg8yt2eO+zjBrt+xxG9RlGyvGycB74Guh29+EPCPBx3sDybK6y684kqPKO2Nj1/1lK9aNkhPM24brxLeoI9XbEePNlTyT0iWcA9mdzCPY1wr71qsK+7df+fO7p4sjxmUQS9hmt9PNCtbj2ppyu9oEddvBhcrDxELz08sKCNvEU+ET3yAR69nZysPMKJcjz0dBC7L4RmO2ihVD1EaQo9t9nqvGr+YzxlE+67xO1/vAtE4zvHRUK9swjlvEdGt7zDCVW99MMcPMt2bj2zJ/K5Z+yvuzNKwj3bPx08zkcBPeoZgLoBGxo7uRh4POSMQ7xUKsM8GHK9OyXXljzxwuw8MCzWPGkenb0lkHA8OGOdtxwPRD0aAaK8tdSqvNlmtTxnCB+9qUMOPUlPL711YwY9r+51PDgspz1RuRM8ZM2TPG1o5byu7Bq9rwl2PYH2oL2POa68D47EOqPRaLv6aAg8ZOqmPKohhrsXwAc9urlgvJt4/TuUY/S81dpkPfYTZTyJuhe7i9A9vUxFizx6vBE95AKjveR0eryipt+7fKx2PTkwoTs5dfQ8CnnpPNCWSr2EYGW84T+ZPDN68Ls7+hG7FsqAvC9FAz2V8G68ZpcZu4wOrbsxJQI89SYnvT5Kkr0T4pe86krTu5PfGzxF8p67HE4SPcV8P7ylG+S7Q7m8uDFtgrxlb+a8eFf+PC6XwjtPnQq8LBKYvfbhdD3SuEO8bJ9Eugpg9Lyfbsg9NwmDu2yTQLvzcM+9v+8mvaQ/ezwQLHw5J/fwPHgjZ7xIUKE9Hj03vC4ox7yhYAW8RhXZPIL3TL36YqU9iE4JPfdDIr17lHe9Yycbup1S07ssLwQ96glNPLkxQD1j6mM9hcQ+u6bKBj3tR1m8Vl9gvTdeAz0ZHF05RtQRO+lN8rzfMNC7YYnUvMW3FDzunUm9EXeMvemavzzlbGu8OXGMPcw0/byObay5K6cPPYd9Ib1iRpq8Ps+husYNCbxnm7y8DYlTPHshe7wDzVy94wsKPWw35Tvtpky8PYsavCK3aDvQ3IY9GwbxPMSqALd9fK+7j5+POpRoPzyO+ZI8AP17vaIOjD3x6Gs8WPWJvHU5szsC9DU8T5uSPT4CH7y5aVo9Rk4zPRHom7xlz467CzCROXhOlr0yKSw8WwDru8kGHrxUF4Q8bQZaPdtxbLzxwEg9byocPXEB2jzUV4w9jMouvYjvgr1zvKg8zDS6PGc2xLpR+Ja8vVFwPLkAqj2zwmW9EK2KvGUahbqzl9u8UWsWO91FMbwJrYs6+aiAvF/bYDzGtLI7JMwvPTNy47yKyAe9Nr+fPF9XOrzFx+m8p1clPA34ab2WPZa93vd1PBgoPDwh7Py7fGcDPPC1mryXWom8VHsyu0ChXzz2TBW9U9U5O40PQTxtHmM9ffsOPXGQgTwUi9g8VoFQu2tddLtOzTS9IjZtPCkbkTxxXmc8oMa4POXFHDzRsXi7AdipvH+UC70QCTs70KcOvUwAm72WBK08ij6FvBwOQD14rp29xSx4POTxQz0paNs8rTVQPZnAqjyLNLQ87fTsvG0CCz33Xqa8ZSMavFiXiD3eFRO9V1s6PVFWObyXFGK8th2RPPWrPDy6H4Q8Lma2vAsxNb3tiCc9fWwiO8ctKby593C8noIxPKiCbj17poo7Gu88Patiibxhv2y8S+mgPCOndr2oE3C5a7UlPKcBLz0RF5m8Br/yvKqeL72waMm8zmw9PVL7ujxhOF88rHkPPEdDnLtXaII8bw1oPcABsTyC2Q88X6GcPU18rjzPo/082g/lPGWDAT0o38c8In2juUu0hb0muTe8nfwtukS8gzzdjA29m3PUvEXg6LxApoG8AkaJvGg7WT3fhDs9VCsyvbgkjbyAHlM8IIg8PQO7Yr2IzgA8Rya8O/Felrwj/Qk9owAlvUIu6L39ee8880qnunKctDusPI+8VyvoO2zevT3o8DQ8CYTWO7Yx0rzwUlC9JxlKPQ9edDzBS+I78Vt0vAUkVTwfjjK9qmAGPbWJIjrc9B09qFrtPOUMor1KWMG8sIKwPEnfBT1edoo9G47WPFh6NL1mbo67hLPuPCgUAD3pn628vhX6u0++Lj0lRao8GX3SvEM5BT22fes7fh2DvYZ0orv4Dbw72mxvPdGMI73N4bA84YKWO3QB3bzMWTA9oXYLPTq2PDtUQyw8txotvfeDMbyGtHi8+j9iPB6QOjw1eHU9oM57vYFUyLxeYlc8aCWFPB4hxryhUPg7rzQxOlDDhz0YJNO8+yGVPIk+/rzEtic7ujoBPMrRdj3o55Y8wZiFvRMa/rsVzuk8qbrPu4vQ+DxoYaK85ynRPFKreT1bs4e9XrTBu1RiHj2JG6i9Pz4SPfuagz2nxqa9dEvWu71buryHx5g717uQO53mj72mO5y8lFsTvTJihTt1jkk9JVJSOyZuGL1NfAc9KhNevVGkqzzYJY27MElJvYkAqjsqYCW9+lxovP4LvrwewYu8tDUKPUcavbw7cgE9NYurPDbOtbw/bVA9I6kSO5CGmr06hT08JbwRvSbWQ73lpNI88uFRPI/MDD3JUTk9LxsJvZFUFTuxyY29lLIgPN5QMrx9JvG8JGxcvYy0oj1iYGm9PZN3vLp9kbyXmwW9sIv4vLymhLwyzKq9owkHPfOKgb1MQhi8y3TAuqWEB73VyQ+9eIJnPTBN+TwpSWK6u8Gqu9LHSD39e5U8WgN/OrOrnrxCLDu9A38NvaAe0jvbNaq7OTefPDySIj0vvgC86h70vJX/dj1Y5QK9T55Lu4YqQb26+8g8mwYTvR4re7v4T5W8oVy1vM/GHL0wGT+9CqmrPGd3FT1XMOg8GiSNvB3Fj72BQ9w7jp0nPWuqoDw/nXU9vlcduhgJU73Y1hY6qMjuPKtQtbyMI+e8aSwnP
|
|||
|
|
{"p":"wolai-frontend/src/lib/document-content.ts","s":1,"e":31,"m":1773495684322.475,"t":"import type { Json } from \"@/types/supabase\";\n\n/**\n * 提取文档内容中的块数组,兼容数组和 { blocks: [] } 两种结构。\n */\nexport const extractBlocksFromContent = (content: unknown): Json[] => {\n if (Array.isArray(content)) {\n return content as Json[];\n }\n if (content && typeof content === \"object\" && Array.isArray((content as { blocks?: Json[] }).blocks)) {\n return ((content as { blocks?: Json[] }).blocks ?? []) as Json[];\n }\n return [];\n};\n\n/**\n * 将新的块数组写回内容,保持原有结构额外字段。\n */\nexport const composeContentWithBlocks = (content: unknown, blocks: Json[]): Json => {\n if (Array.isArray(content)) {\n return blocks as Json;\n }\n if (content && typeof content === \"object\") {\n return {\n ...(content as Record<string, unknown>),\n blocks,\n } as Json;\n }\n return { blocks } as Json;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/document-tree.test.ts","s":1,"e":35,"m":1773495684329.475,"t":"import { describe, expect, it } from \"vitest\";\nimport { collectSubtree } from \"../../convex/_utils/documentTree\";\n\ndescribe(\"collectSubtree\", () => {\n it(\"会收集根节点及其所有后代\", () => {\n const rows = [\n { id: \"A\", parent_id: null },\n { id: \"B\", parent_id: \"A\" },\n { id: \"C\", parent_id: \"B\" },\n { id: \"D\", parent_id: \"A\" },\n { id: \"E\", parent_id: null },\n ] as const;\n\n const subtree = collectSubtree(rows, \"A\");\n expect(new Set(subtree.map((r) => r.id))).toEqual(new Set([\"A\", \"B\", \"C\", \"D\"]));\n });\n\n it(\"根节点不存在时返回空数组\", () => {\n const rows = [{ id: \"A\", parent_id: null }] as const;\n expect(collectSubtree(rows, \"missing\")).toEqual([]);\n });\n\n it(\"存在环时不会死循环\", () => {\n const rows = [\n { id: \"A\", parent_id: \"B\" },\n { id: \"B\", parent_id: \"A\" },\n { id: \"C\", parent_id: null },\n ] as const;\n\n const subtree = collectSubtree(rows, \"A\");\n expect(new Set(subtree.map((r) => r.id))).toEqual(new Set([\"A\", \"B\"]));\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents.ts","s":1,"e":31,"m":1776376954067.3416,"t":"export interface DocumentRecord {\n access_scope: \"private\" | \"shared\" | \"public\";\n id: string;\n workspace_id: string;\n title: string | null;\n parent_id: string | null;\n sort_order: number | null;\n is_starred: boolean | null;\n is_template: boolean;\n created_at: string;\n updated_at: string | null;\n}\n\nexport interface DocumentNode extends DocumentRecord {\n children: DocumentNode[];\n}\n\nexport function findBreadcrumb(records: DocumentRecord[], targetId: string): DocumentRecord[] {\n const map = new Map<string, DocumentRecord>();\n records.forEach((item) => map.set(item.id, item));\n const path: DocumentRecord[] = [];\n let current: DocumentRecord | undefined = map.get(targetId);\n\n while (current) {\n path.unshift(current);\n current = current.parent_id ? map.get(current.parent_id) : undefined;\n }\n\n return path;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/events.ts","s":1,"e":42,"m":1773495684349.4753,"t":"/**\n * 侧边栏与编辑区之间的轻量事件总线\n */\nexport const ASSETS_CHANGED_EVENT = \"wolai:assets-changed\";\nexport const DOCUMENTS_CHANGED_EVENT = \"wolai:documents-changed\";\nexport const ASSETS_RESTORED_EVENT = \"wolai:assets-restored\";\n\ntype AssetsChangedPayload = {\n docId?: string;\n asset?: unknown;\n assetIds?: string[];\n mindmapDeleted?: boolean;\n mindmapAssetIds?: string[];\n};\n\ntype AssetsRestoredPayload =\n | { docId: string; kind: \"media\"; assetId: string; asset?: unknown }\n | { docId: string; kind: \"mindmap\"; mindmapId: string }\n | { docId: string; kind: \"table\"; tableId: string };\n\nexport function emitAssetsChanged(\n docId?: string,\n asset?: unknown,\n assetIds?: string[],\n mindmapDeleted?: boolean,\n mindmapAssetIds?: string[],\n) {\n if (typeof window === \"undefined\") return;\n const detail: AssetsChangedPayload = { docId, asset, assetIds, mindmapDeleted, mindmapAssetIds };\n window.dispatchEvent(new CustomEvent(ASSETS_CHANGED_EVENT, { detail }));\n}\n\nexport function emitAssetsRestored(payload: AssetsRestoredPayload) {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(new CustomEvent(ASSETS_RESTORED_EVENT, { detail: payload }));\n}\n\nexport function emitDocumentsChanged(docId?: string) {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(new CustomEvent(DOCUMENTS_CHANGED_EVENT, { detail: { docId } }));\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":1,"e":60,"m":1777361904183.93,"t":"import type { DocumentRecord } from \"@/lib/documents\";\nimport type { SidebarTreeNode } from \"@/lib/kernel-sidebar\";\nimport type {\n TreeProjectionAssetKind,\n TreeProjectionCapability,\n TreeProjectionItemBase,\n TreeProjectionNodeType,\n TreeProjectionResourceKind,\n} from \"@/lib/tree-protocol\";\nimport type { MediaAsset } from \"@/types/media\";\n\nexport type KernelFileTreeProjectionRowKind =\n | \"document\"\n | \"index\"\n | \"asset\"\n | \"asset_folder\";\n\nexport type KernelFileTreeProjectionItem = TreeProjectionItemBase & {\n projectionKind: \"file_tree\";\n rowId: string;\n rowKind: KernelFileTreeProjectionRowKind;\n};\n\nexport type KernelFileTreeProjectionEdge = {\n id: string;\n edgeType: \"parent_of\";\n workspaceId: string | null;\n fromNodeId: string;\n toNodeId: string;\n};\n\nexport type KernelFileTreeIndexingVisibility = {\n schema: \"mnote.file_tree.indexing_visibility\";\n schemaVersion: 1;\n source: \"kernel.project_view\";\n status: \"visible\" | \"stale\" | \"refreshing\" | \"unknown\";\n requestKey: string | null;\n indexedResourceKinds: string[];\n visibleResourceKinds: string[];\n metrics: {\n visibleRows: number;\n visibleEdges: number;\n };\n};\n\nexport type KernelFileTreeProjection = {\n projectionId: string;\n projection: \"file_tree\";\n rootNodeId: string | null;\n items: KernelFileTreeProjectionItem[];\n edges: KernelFileTreeProjectionEdge[];\n meta?: {\n search?: {\n query?: string | null;\n maxResults?: number | null;\n maxResultsRule?: \"matches_only_before_ancestor_completion\";\n ancestorCompletion?: \"include_all_ancestors_after_match_truncation\";\n ordering?: \"kernel_file_tree_preorder\";\n indexingVisibility?: KernelFileTreeIndexingVisibility;\n };","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":49,"e":108,"m":1777361904183.93,"t":"rootNodeId: string | null;\n items: KernelFileTreeProjectionItem[];\n edges: KernelFileTreeProjectionEdge[];\n meta?: {\n search?: {\n query?: string | null;\n maxResults?: number | null;\n maxResultsRule?: \"matches_only_before_ancestor_completion\";\n ancestorCompletion?: \"include_all_ancestors_after_match_truncation\";\n ordering?: \"kernel_file_tree_preorder\";\n indexingVisibility?: KernelFileTreeIndexingVisibility;\n };\n };\n};\n\ntype BuildKernelFileTreeProjectionInput = {\n documents: DocumentRecord[];\n mediaAssets?: MediaAsset[] | null;\n mindmapAssets?: MediaAsset[] | null;\n tableAssets?: MediaAsset[] | null;\n mindmapAssetChildren?: Record<string, string[]> | null;\n rootNodeId?: string | null;\n};\n\ntype NormalizedFileTreeAsset = {\n id: string;\n documentId: string;\n workspaceId: string | null;\n title: string;\n resourceKind: TreeProjectionResourceKind;\n assetKind: TreeProjectionAssetKind;\n iconHint: string;\n nodeType: TreeProjectionNodeType;\n};\n\nfunction readRowId(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction toMillis(value: string | null | undefined): number {\n if (!value) return 0;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction sortDocuments(records: DocumentRecord[]) {\n return [...records].sort((a, b) => {\n const orderA = a.sort_order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.sort_order ?? Number.MAX_SAFE_INTEGER;\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return toMillis(a.created_at) - toMillis(b.created_at);\n });\n}\n\nfunction dedupeDocuments(records: DocumentRecord[]) {\n const seen = new Set<string>();\n const unique: DocumentRecord[] = [];\n for (let index = records.length - 1; index >= 0; index -= 1) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":97,"e":156,"m":1777361904183.93,"t":"const orderB = b.sort_order ?? Number.MAX_SAFE_INTEGER;\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return toMillis(a.created_at) - toMillis(b.created_at);\n });\n}\n\nfunction dedupeDocuments(records: DocumentRecord[]) {\n const seen = new Set<string>();\n const unique: DocumentRecord[] = [];\n for (let index = records.length - 1; index >= 0; index -= 1) {\n const record = records[index]!;\n if (seen.has(record.id)) {\n continue;\n }\n seen.add(record.id);\n unique.push(record);\n }\n unique.reverse();\n return unique;\n}\n\nfunction buildDocumentChildren(records: DocumentRecord[]) {\n const childrenByParentId = new Map<string | null, DocumentRecord[]>();\n const recordIds = new Set(records.map((record) => record.id));\n\n for (const record of records) {\n const parentId =\n record.parent_id && recordIds.has(record.parent_id) ? record.parent_id : null;\n const bucket = childrenByParentId.get(parentId) ?? [];\n bucket.push(record);\n childrenByParentId.set(parentId, bucket);\n }\n\n for (const [parentId, bucket] of childrenByParentId.entries()) {\n childrenByParentId.set(parentId, sortDocuments(bucket));\n }\n\n return childrenByParentId;\n}\n\nfunction makeProjectionEdge(\n fromNodeId: string,\n toNodeId: string,\n workspaceId: string | null,\n): KernelFileTreeProjectionEdge {\n return {\n id: `edge:${fromNodeId}:${toNodeId}:parent_of`,\n edgeType: \"parent_of\",\n workspaceId,\n fromNodeId,\n toNodeId,\n };\n}\n\nfunction buildDocumentCapabilities(childCount: number): TreeProjectionCapability[] {\n const capabilities: TreeProjectionCapability[] = [\n \"open\",\n \"drag\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":145,"e":204,"m":1777361904183.93,"t":"id: `edge:${fromNodeId}:${toNodeId}:parent_of`,\n edgeType: \"parent_of\",\n workspaceId,\n fromNodeId,\n toNodeId,\n };\n}\n\nfunction buildDocumentCapabilities(childCount: number): TreeProjectionCapability[] {\n const capabilities: TreeProjectionCapability[] = [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ];\n if (childCount > 0) {\n capabilities.unshift(\"expand\");\n }\n return capabilities;\n}\n\nfunction buildAssetFolderCapabilities(childCount: number): TreeProjectionCapability[] {\n const capabilities: TreeProjectionCapability[] = [\n \"open-asset\",\n \"select\",\n \"context-menu\",\n ];\n if (childCount > 0) {\n capabilities.unshift(\"expand\");\n }\n return capabilities;\n}\n\nfunction buildLeafCapabilities(openAsset: boolean): TreeProjectionCapability[] {\n const capabilities: TreeProjectionCapability[] = [\"select\", \"context-menu\"];\n capabilities.unshift(openAsset ? \"open-asset\" : \"open\");\n return capabilities;\n}\n\nfunction classifyGenericAssetKind(asset: MediaAsset): TreeProjectionAssetKind {\n const assetType = String(asset.asset_type ?? \"\").trim().toLowerCase();\n const name = String(asset.file_name ?? \"\").trim().toLowerCase();\n const mimeType = String(asset.mime_type ?? \"\").trim().toLowerCase();\n const ext = name.includes(\".\") ? name.split(\".\").pop() ?? \"\" : \"\";\n\n if (assetType === \"mindmap\") return \"mindmap\";\n if (assetType === \"luckysheet\") return \"table\";\n if (ext === \"pdf\" || mimeType.includes(\"pdf\")) return \"pdf\";\n if (ext === \"epub\" || mimeType.includes(\"epub\")) return \"book\";\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (mimeType.startsWith(\"video/\")) return \"video\";\n if (mimeType.startsWith(\"audio/\")) return \"audio\";\n return \"file\";\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":193,"e":252,"m":1777361904183.93,"t":"const mimeType = String(asset.mime_type ?? \"\").trim().toLowerCase();\n const ext = name.includes(\".\") ? name.split(\".\").pop() ?? \"\" : \"\";\n\n if (assetType === \"mindmap\") return \"mindmap\";\n if (assetType === \"luckysheet\") return \"table\";\n if (ext === \"pdf\" || mimeType.includes(\"pdf\")) return \"pdf\";\n if (ext === \"epub\" || mimeType.includes(\"epub\")) return \"book\";\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (mimeType.startsWith(\"video/\")) return \"video\";\n if (mimeType.startsWith(\"audio/\")) return \"audio\";\n return \"file\";\n}\n\nfunction classifyResourceKind(assetKind: TreeProjectionAssetKind): TreeProjectionResourceKind {\n switch (assetKind) {\n case \"mindmap\":\n return \"mindmap\";\n case \"table\":\n return \"table\";\n case \"book\":\n return \"book\";\n case \"pdf\":\n return \"pdf\";\n default:\n return \"asset\";\n }\n}\n\nfunction classifyNodeType(assetKind: TreeProjectionAssetKind): TreeProjectionNodeType {\n switch (assetKind) {\n case \"mindmap\":\n return \"mindmap\";\n case \"table\":\n return \"table\";\n case \"book\":\n return \"book\";\n case \"pdf\":\n return \"pdf\";\n default:\n return \"asset\";\n }\n}\n\nfunction classifyIconHint(assetKind: TreeProjectionAssetKind): string {\n switch (assetKind) {\n case \"mindmap\":\n return \"mindmap\";\n case \"table\":\n return \"table\";\n case \"book\":\n return \"book\";\n case \"pdf\":\n return \"pdf\";\n case \"image\":\n return \"image\";\n case \"video\":\n return \"video\";\n case \"audio\":\n return \"audio\";\n default:","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":241,"e":300,"m":1777361904183.93,"t":"return \"table\";\n case \"book\":\n return \"book\";\n case \"pdf\":\n return \"pdf\";\n case \"image\":\n return \"image\";\n case \"video\":\n return \"video\";\n case \"audio\":\n return \"audio\";\n default:\n return \"file\";\n }\n}\n\nfunction normalizeAsset(asset: MediaAsset): NormalizedFileTreeAsset {\n const assetKind = classifyGenericAssetKind(asset);\n return {\n id: asset.id,\n documentId: asset.document_id,\n workspaceId: asset.workspace_id ?? null,\n title: asset.file_name?.trim() || \"附件\",\n resourceKind: classifyResourceKind(assetKind),\n assetKind,\n iconHint: classifyIconHint(assetKind),\n nodeType: classifyNodeType(assetKind),\n };\n}\n\nfunction buildAssetCollections(input: BuildKernelFileTreeProjectionInput) {\n const assetsByDoc = new Map<string, NormalizedFileTreeAsset[]>();\n const assetById = new Map<string, NormalizedFileTreeAsset>();\n const seen = new Set<string>();\n\n for (const asset of [\n ...(input.mediaAssets ?? []),\n ...(input.mindmapAssets ?? []),\n ...(input.tableAssets ?? []),\n ]) {\n if (!asset?.id || seen.has(asset.id)) {\n continue;\n }\n seen.add(asset.id);\n const normalized = normalizeAsset(asset);\n const bucket = assetsByDoc.get(normalized.documentId) ?? [];\n bucket.push(normalized);\n assetsByDoc.set(normalized.documentId, bucket);\n assetById.set(normalized.id, normalized);\n }\n\n const childAssetIdsByParentId = new Map<string, string[]>();\n Object.entries(input.mindmapAssetChildren ?? {}).forEach(([parentAssetId, childIds]) => {\n childAssetIdsByParentId.set(\n parentAssetId,\n (childIds ?? []).filter((childId) => typeof childId === \"string\" && childId.trim().length > 0),\n );\n });\n\n return {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":289,"e":348,"m":1777361904183.93,"t":"assetById.set(normalized.id, normalized);\n }\n\n const childAssetIdsByParentId = new Map<string, string[]>();\n Object.entries(input.mindmapAssetChildren ?? {}).forEach(([parentAssetId, childIds]) => {\n childAssetIdsByParentId.set(\n parentAssetId,\n (childIds ?? []).filter((childId) => typeof childId === \"string\" && childId.trim().length > 0),\n );\n });\n\n return {\n assetsByDoc,\n assetById,\n childAssetIdsByParentId,\n };\n}\n\nfunction makeFallbackNode(item: KernelFileTreeProjectionItem): SidebarTreeNode {\n const documentId =\n item.resourceMeta.documentId ??\n (item.rowKind === \"document\" ? item.nodeId : item.parentNodeId ?? item.nodeId);\n return {\n access_scope: \"private\",\n id: documentId,\n workspace_id: item.resourceMeta.workspaceId ?? \"\",\n title: item.title,\n parent_id: item.rowKind === \"document\" ? item.parentNodeId : documentId,\n sort_order: item.position,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [],\n kernel: {\n nodeType: \"page\",\n depth: item.depth,\n position: item.position,\n childCount: item.childCount,\n expandedByDefault: item.expandedByDefault,\n },\n };\n}\n\nfunction makeFallbackAsset(item: KernelFileTreeProjectionItem): MediaAsset {\n const assetKind = item.resourceMeta.assetKind ?? \"unknown\";\n const resourceKind = item.resourceMeta.resourceKind;\n const assetType =\n assetKind === \"mindmap\"\n ? \"mindmap\"\n : assetKind === \"table\" || resourceKind === \"table\"\n ? \"luckysheet\"\n : assetKind;\n return {\n id: item.resourceMeta.assetId ?? item.nodeId,\n workspace_id: item.resourceMeta.workspaceId ?? \"\",\n document_id: item.resourceMeta.documentId ?? \"\",\n asset_type: assetType,\n file_url: null,\n thumbnail_url: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":337,"e":396,"m":1777361904183.93,"t":"assetKind === \"mindmap\"\n ? \"mindmap\"\n : assetKind === \"table\" || resourceKind === \"table\"\n ? \"luckysheet\"\n : assetKind;\n return {\n id: item.resourceMeta.assetId ?? item.nodeId,\n workspace_id: item.resourceMeta.workspaceId ?? \"\",\n document_id: item.resourceMeta.documentId ?? \"\",\n asset_type: assetType,\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: item.title,\n file_size: null,\n mime_type: null,\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"\",\n updated_at: \"\",\n };\n}\n\nexport function getDocIdFromFileTreeItem(item: KernelFileTreeProjectionItem): string {\n if (item.resourceMeta.documentId) {\n return item.resourceMeta.documentId;\n }\n if (item.rowKind === \"document\") {\n return item.nodeId;\n }\n const rowId = readRowId(item.rowId);\n if (rowId?.startsWith(\"index:\")) {\n return rowId.slice(\"index:\".length);\n }\n return item.parentNodeId ?? item.nodeId;\n}\n\nexport function resolveFileTreeRowNode(\n item: KernelFileTreeProjectionItem,\n nodeById?: Map<string, SidebarTreeNode>,\n): SidebarTreeNode {\n const documentId = getDocIdFromFileTreeItem(item);\n return nodeById?.get(documentId) ?? makeFallbackNode(item);\n}\n\nexport function resolveFileTreeRowAsset(\n item: KernelFileTreeProjectionItem,\n assetById?: Map<string, MediaAsset>,\n): MediaAsset {\n const assetId = item.resourceMeta.assetId ?? item.nodeId;\n return assetById?.get(assetId) ?? makeFallbackAsset(item);\n}\n\nexport function isKernelFileTreeProjection(value: unknown): value is KernelFileTreeProjection {\n return (\n Boolean(value) &&","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":385,"e":444,"m":1777361904183.93,"t":"export function resolveFileTreeRowAsset(\n item: KernelFileTreeProjectionItem,\n assetById?: Map<string, MediaAsset>,\n): MediaAsset {\n const assetId = item.resourceMeta.assetId ?? item.nodeId;\n return assetById?.get(assetId) ?? makeFallbackAsset(item);\n}\n\nexport function isKernelFileTreeProjection(value: unknown): value is KernelFileTreeProjection {\n return (\n Boolean(value) &&\n typeof value === \"object\" &&\n (value as KernelFileTreeProjection).projection === \"file_tree\" &&\n Array.isArray((value as KernelFileTreeProjection).items) &&\n Array.isArray((value as KernelFileTreeProjection).edges)\n );\n}\n\nexport function buildKernelFileTreeProjection(\n input: BuildKernelFileTreeProjectionInput,\n): KernelFileTreeProjection {\n const uniqueDocuments = dedupeDocuments(input.documents);\n const documentById = new Map(uniqueDocuments.map((document) => [document.id, document]));\n const childrenByParentId = buildDocumentChildren(uniqueDocuments);\n const { assetsByDoc, assetById, childAssetIdsByParentId } = buildAssetCollections(input);\n const rootNodeId = input.rootNodeId?.trim() || null;\n const roots =\n rootNodeId && documentById.has(rootNodeId)\n ? [rootNodeId]\n : sortDocuments(\n uniqueDocuments.filter((document) => {\n const parentId = document.parent_id?.trim() || null;\n return !parentId || !documentById.has(parentId);\n }),\n ).map((document) => document.id);\n\n const items: KernelFileTreeProjectionItem[] = [];\n const edges: KernelFileTreeProjectionEdge[] = [];\n\n const walk = (documentId: string, depth: number) => {\n const document = documentById.get(documentId);\n if (!document) {\n return;\n }\n\n const childDocuments = childrenByParentId.get(documentId) ?? [];\n const documentAssets = assetsByDoc.get(documentId) ?? [];\n const nestedChildIds = new Set<string>();\n documentAssets.forEach((asset) => {\n const childIds = childAssetIdsByParentId.get(asset.id) ?? [];\n childIds.forEach((childId) => nestedChildIds.add(childId));\n });\n const directAssets = documentAssets.filter((asset) => !nestedChildIds.has(asset.id));\n const childCount = 1 + directAssets.length + childDocuments.length;\n const parentNodeId = depth === 0 ? null : document.parent_id ?? null;\n const workspaceId = document.workspace_id ?? null;\n\n items.push({\n rowId: `doc:${document.id}`,","v":"DN4aPYNCDrvz5NW975vfvWxiRz3y0eq8pDkRvZf1kzwd1Z48gqTXvGnXYr3iL0o9CtrzPTRB4rv55ds8FT14vDqyqbzK6n29PU3VPKSAjD14SkM9vm95PD/UoDtswBu8LhGHPSP2xzx7VoW6ToIOPRzkcr2QKJk9c+d3POP0ZT0CulE7uPg2uzwSy72pAo27KKlcPH6XQrzMzIG7038bPNVvG70TOo47vsLXvLl6HbzUI2Q9cA2vvHTZtj2J+Mo86YQkPdfUlb2AjNQ8JqgFOw3V9jyQ4aC8Yd2YPfbDSD11vjW9g3SzvAornzzW/+W7ql5DPExRoz2xphs8Xoo5Pa8omD37gOq8urITvWJPTj3CWEG8ikA/PEQWlT1N4948LaV+PPMW0LzSA9a8ENdVPSr6r7y8l229LtwbvUe1Gz2E7/W8B1gVuzOaKT0DZJY8OupHPcQrDrsn87M80fAguvyL0rwf2cI8ZGXqPB3t+Lz1frE8JVCzuyAZVr2AK908K5pKvCHlwjyKtVi81CobvW8NrzzKzM68NLbcPFkCXryDN/U8EWu3PHg/XT2DeH48G9iuu1z2tbxnkqu8wEA3PYw3jr2MMCS9vpO0PKtSD72Wko88M2A1vQjg47x27WM8DmawvJaiyrytHss8KqfsPJYpcT2yVo48UuYFPMosSzyZXok7cF9avdtFNr2nJ5a7bClmPBFcQjuuLxE99EyCPIzbIL0A1968X091PHP1Hbz0jP65+wzoOym4gL22jZ28y1hNvG6H2Lw4rK89qrcJvWpIz7xI0KO83VRfurCIMz1oPCO8xkpRPc11AD0qp2K9ugWkPJNF3bt2xwy9IeYwvFtN2zyPO4g8KZGhvHj5Kz300zK9x+/ovCcG0Dr9h5A8k6SuO30vkDyWY0i9IXOPvWKNZTx7fbe8vV4MvXRLybt4uBo9zRfwuo9S47v3glq9NtKTO6/buL3ZeZ89xaw2PaISs7zwVSW9B3g/PEVlV7qKJuQ8t1KmvFfarLzznAu8tG3mvLDehTwjdui8dQyrvTps1DtBMSy8wX4RPcTXaL34evE64IkpvCNKrbtJVoY3Qt9UvT+BCLuTcwq9oB9BPfx7Er2UT4O6CsibPQyYDr1A9m88q+Gmu3saxrytP+27JQXVvNj9vrrugxe9wGfJu9YsSDqRAjK9KTOLPaB9ZT3Im1k9kvIYPQ6MybtXHsu6ri3FvIkVPLwRUD29NC5evSxlCz3/qQk9sCVkOvDOLDwLqy49F6diPWi/HDwnLrA8s3+hvIExMbzd7DS8kuQbvbQEobsQNW+8sPgovXsW4rwDz/Y8mwapOyp3nbyTcA494kycPApWsT3TMr48jyF6vPNLijunTHu8ks9qPH0fOL0oEbo8J2avO2XdUD0b98C88EbGvORWZb2KiRe9kRa2O1JUjDs7VKe6GCcuvUzpWzzS+kK8hNAnPfT5DT1i3WW7p+yBPGH5gzyE7mC9pIRJvEP4JL2tSCQ8I1C7u2peBj24LS69DBEGPe
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":433,"e":492,"m":1777361904183.93,"t":"const nestedChildIds = new Set<string>();\n documentAssets.forEach((asset) => {\n const childIds = childAssetIdsByParentId.get(asset.id) ?? [];\n childIds.forEach((childId) => nestedChildIds.add(childId));\n });\n const directAssets = documentAssets.filter((asset) => !nestedChildIds.has(asset.id));\n const childCount = 1 + directAssets.length + childDocuments.length;\n const parentNodeId = depth === 0 ? null : document.parent_id ?? null;\n const workspaceId = document.workspace_id ?? null;\n\n items.push({\n rowId: `doc:${document.id}`,\n rowKind: \"document\",\n nodeId: document.id,\n parentNodeId,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: document.title ?? \"无标题\",\n depth,\n position: document.sort_order ?? null,\n childCount,\n expandable: childCount > 0,\n expandedByDefault: true,\n capabilities: buildDocumentCapabilities(childCount),\n resourceMeta: {\n resourceKind: \"document\",\n documentId: document.id,\n workspaceId,\n iconHint: \"page\",\n },\n iconHint: \"page\",\n });\n\n const indexNodeId = `index:${document.id}`;\n items.push({\n rowId: indexNodeId,\n rowKind: \"index\",\n nodeId: indexNodeId,\n parentNodeId: document.id,\n nodeType: \"index\",\n projectionKind: \"file_tree\",\n title: \"index.md\",\n depth: depth + 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: buildLeafCapabilities(false),\n resourceMeta: {\n resourceKind: \"index\",\n documentId: document.id,\n workspaceId,\n iconHint: \"index\",\n },\n iconHint: \"index\",\n });\n edges.push(makeProjectionEdge(document.id, indexNodeId, workspaceId));\n\n let assetPosition = 1;\n directAssets.forEach((asset) => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":481,"e":540,"m":1777361904183.93,"t":"resourceMeta: {\n resourceKind: \"index\",\n documentId: document.id,\n workspaceId,\n iconHint: \"index\",\n },\n iconHint: \"index\",\n });\n edges.push(makeProjectionEdge(document.id, indexNodeId, workspaceId));\n\n let assetPosition = 1;\n directAssets.forEach((asset) => {\n const childIds = childAssetIdsByParentId.get(asset.id) ?? [];\n if (childIds.length > 0) {\n const folderNodeId = `asset-folder:${asset.id}`;\n items.push({\n rowId: folderNodeId,\n rowKind: \"asset_folder\",\n nodeId: folderNodeId,\n parentNodeId: document.id,\n nodeType: \"mindmap\",\n projectionKind: \"file_tree\",\n title: asset.title.replace(/\\.json$/i, \"\"),\n depth: depth + 1,\n position: assetPosition,\n childCount: childIds.length,\n expandable: true,\n expandedByDefault: false,\n capabilities: buildAssetFolderCapabilities(childIds.length),\n resourceMeta: {\n resourceKind: asset.resourceKind,\n documentId: asset.documentId,\n assetId: asset.id,\n workspaceId: asset.workspaceId,\n assetKind: asset.assetKind,\n iconHint: \"mindmap\",\n },\n iconHint: \"mindmap\",\n });\n edges.push(makeProjectionEdge(document.id, folderNodeId, workspaceId));\n\n childIds.forEach((childAssetId, index) => {\n const childAsset = assetById.get(childAssetId);\n if (!childAsset) {\n return;\n }\n const childNodeId = `asset:${childAsset.id}`;\n items.push({\n rowId: childNodeId,\n rowKind: \"asset\",\n nodeId: childNodeId,\n parentNodeId: folderNodeId,\n nodeType: childAsset.nodeType,\n projectionKind: \"file_tree\",\n title: childAsset.title,\n depth: depth + 2,\n position: index,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,","v":"b44iPUDDLD3NmQm+tjrWvWH3mzxat/68FIVGvcfr8jyt24c8YIsFvP8JYjwpXPU8REumPbcnVDxRMGU9xWi8PO2SNL061w+96hqAPeAM5zxUQEU8tYGEO4ISzLvflTq8vDcRPRErbD1mRFk8VzyaPHwSY73xcHE9KuA0PF3U+zwuQlm8b5DsvHNHjr2/g6+8uL13PRD/+rwDCVg8CQ08PLs/uLxWEsk7phF4vABjL708cgo9lxtGvUthnz11yYA7BHXIPRrygL1znui6DbQQPdQFNz2vsri8kbfEPaeniD20Gka99r3FPNVjdj3zHp+8X9G0PBGSeT15X2g8rz6LPScQrj0INMa8u5gfvAq+aT2oyyW8r0devAtOjD2dYJm8Cq2dPLuizbszzSy9vT4uPbTrVL3Ti9i8XdeGvSSfLj2bUGq8Erw1vUYrLD2IS+q850FsPdYyd7xahL88tXwsPAoeibwSGdA8qPWjPFo0oLzCMG87LCcFPen+uLzg8/Y6wrmfPNDMuTl/s4O9jcYDveESZb1orWo7kUXtPC3PLbkao6w7posrPR/G/Tq+P2e7fwVRvEM7Arw9Pfc7ljXvPMEyBL2jjE2997gAPH1vzrxB6lk9z3DAuaF/D72K7I286I+mvJEFdzwWxvI8n0GAPZboKT3AK/i7UJlFO1HaI7xEV108vt0yvbCgOb1W34a6qoIoPC1mCTspkk49H8o/PZvvlb2wLEW90d5WvBQRBDzxEgm9RwbiOxOAbb1DhAC91+BVvNw3Hr0wxcU8+f8DvBowpb3KXQy98q8RvBMR1zy2Wv28AbFXPPof/jxmKfS8IGh7PckG/ztiogO86UekvKmsdzzQ4Cc8xVcJvYHgyjy+LqM6VboRvbPEdz3k91g9kgUYPT5DMD2Zkyq9MTpAvUFeqzsqgZ878MmAvSk9jjzqGJI96iQzvZhHcD2bpCe9UMaePGpwVr3VKz099pBxPH4rjbwXkoa8J2q7Oh7KTrxj+QY8sx5ivSfawrw/mpG82Uh4vIQBSD07zJY7Y3FnvRVzXD3mSYS9sefSO32zbL2vmyw8JdPUu5F3T7zJ/MA70N0/vbV9aj34cDm9xzllPUaMfzv2M8k8FO+oPb9gU73btKO896MyPJ8do7yLGsQ611qRvJQAAL0K/VO93TqzPF8eK7w8v5W8G6oqPUM6QzwBeyE9MwirPOxyL7tXjqi8vK2APFHqBL3f7OG990Kevcn8mDyxMaQ8ny4lvVr9dzx19wk905C4PR5NvjzGyuk6PP0OPKxwfDtkq/q7nrO5vMxTFDylYDM8MBOGuiPdO70P31g8/pbkuYswIT3XbJg8AqzZPE6hjT2MkRQ9PGJcvfuLHDqXVk68HdTLPMO75LxL2Y88Kq8wPS2iBT3y6Gu82zR5vUDxPb1cYoW9AtysvEbpsTs+hW28/RRXPKP8Szw05HS8IUIDPZDEV7wZFzo8sRINPY6rjjy5ySK9wnFIvJ7XI712euq7+O9cvCH8Ij1t55S9jIA4PR32vLyTvqk85AU8PZEe3DofYFE8swypPKLbWbwHHBI91xtkPHpIBzgmSJs8p2MYvEu427zyl868xN07u4aCUT10imY9LWL9PCCcErxDJJO9tK4hPTF/IL2ZT5c8diHXPMr7L7uwygi9Rse7vIQ/YT2c69W68zkOPaZAXjzpX528dH+PPeelv7yiDxa7atXnvHNsEjiG7Sa82pRZvHJe5rrOp/W8fBH7PAA3FjyysHy8Hxk8Pce5Az2t7dY87BIjvQIvEb3l2L48Wv7FvBzGHj2Xj2E9y6F6PZgYGDykAIG8J6gOvOmy0TrcvI086qUKPYB5M73a1ZC8LRaLPRqRET2ID
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":529,"e":588,"m":1777361904183.93,"t":"rowId: childNodeId,\n rowKind: \"asset\",\n nodeId: childNodeId,\n parentNodeId: folderNodeId,\n nodeType: childAsset.nodeType,\n projectionKind: \"file_tree\",\n title: childAsset.title,\n depth: depth + 2,\n position: index,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: buildLeafCapabilities(true),\n resourceMeta: {\n resourceKind: childAsset.resourceKind,\n documentId: childAsset.documentId,\n assetId: childAsset.id,\n workspaceId: childAsset.workspaceId,\n assetKind: childAsset.assetKind,\n iconHint: childAsset.iconHint,\n },\n iconHint: childAsset.iconHint,\n });\n edges.push(makeProjectionEdge(folderNodeId, childNodeId, workspaceId));\n });\n\n assetPosition += 1;\n return;\n }\n\n const assetNodeId = `asset:${asset.id}`;\n items.push({\n rowId: assetNodeId,\n rowKind: \"asset\",\n nodeId: assetNodeId,\n parentNodeId: document.id,\n nodeType: asset.nodeType,\n projectionKind: \"file_tree\",\n title: asset.title,\n depth: depth + 1,\n position: assetPosition,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: buildLeafCapabilities(true),\n resourceMeta: {\n resourceKind: asset.resourceKind,\n documentId: asset.documentId,\n assetId: asset.id,\n workspaceId: asset.workspaceId,\n assetKind: asset.assetKind,\n iconHint: asset.iconHint,\n },\n iconHint: asset.iconHint,\n });\n edges.push(makeProjectionEdge(document.id, assetNodeId, workspaceId));\n assetPosition += 1;\n });\n\n childDocuments.forEach((childDocument) => {","v":"w0k1PWT9Bz1KVwy+MQ+6va9IAT0ATPe8mocevcMC8jxg+9i8FGlBvPWvuDw9rJ48cuugPb4xP7pueFk9ln2uPArSCr04ISO9eYYePVx4Az0t62U7h0YWvDD35bvp/KQ8NIbEPO6Xbj2w1qq5hAcfPAmcKb1oVlQ97QcJPfmW5TyxP428pJFvvNveab2ncw67EqU5PcPCIzxwLdE8SdKRPLMv57xMtTU8Rf0KvQUfYbxDhKc881YXvd9arz3JJic8K62zPfigOb3HIXY86g1SPLBF2TwQV6y7O9/RPaG1RT3RiB29FcMUPVc5qzw5Iyy9HKoYuy/3ej2KbRM81CWdPf0xkD0L4om8zRHcOky7Fj3qmXG8su3ivLZ7lD0DLpK8/Zh8OkASabulCtK8MPGMPOEzc72z+LS8cC9uvYZvLD1sODM8g6FIvRALMD2jJmm8/cc2PbmsnLu4eoE8PDdDPL/8e7yhiAk9cqzTPEHyrTxjF3g8Rh0pPTNR0rz38Rm8pGq2PK9IuDpwBT+9KAzxvKwMhb2TvoE8+45gPQCoqTzgTao8NW9APYmhq7yQE3w8tvTbvIfQdTuv+jw8K5IfPZcMkryJPGi9R/5lutUR8LyFB4A9fJhivFmD0bx2H/e6eTgXveeNmjx/4GA9QHdnPZAHvTyIKVG8r7UxvFd6ibo1K6Q7yw84vXmUBL1hxM67FGASOxIBirwOpVA9eCAsPZuFu72B6Fe9+kG2PPCDrzyrzCG9qL57uzHHRL3D3s68yfvDvEMS0rwbmsU87dSWuzE2vb3Q4ku8ADOJuyVcAD1DXzK9OjnNPADLQj04fre8QCABPbYpQTz/65g7YfOxu0+kIjxXXuo86NitvAbkRzywW/g7Oi4hvdWiEz2KfHg9elsrPZJCYD37fRO9MAE1vdzzFLz8YO47Wvg0vWfNjTsmM6s9NSXWvINSNT3iS0y9ki2FPKTvBr2OPyg9qb01OsUuAb23yOm8E2Dou+zHurwlNuo7qScfvdITDr0545G7STKIvOk0VT3J47A6K+RFvbSCnz3u7z29mXUEPPaHjL3/AJM7J1OGvLcUvLvwdQY8Sxv6vMhlEz3sKh295fFIPU8gzrrgEL48AsmRPcYEgr00exm9zb2WPOD8EjynvOo77M7PvBn9+rzu64G9I/UOvGEDt7tX1ZW8HUjWPKCpMDyKwgU9TTmVPLmFYTwiItA6tzkQPeHN/ruyhc69IUmuvaxgET3zZyY87vk9vXSdSjzGkq46DMvXPYblwDsGsAI8cxunPGKtoDvlv0O8SDbKvBP0sTtb7Lw8ALcFvG5RXr3b5b88an8HO4polzzfwOk85MYXPf29MT3BPzQ9+RJivVBDo7xHaEa8pB5jPCbnm7obDrw8iGUzPX1LFj228KO8icxtvbbjTb2fooG9IGRPvLypmTycfBy89kOUPKSJIDxET1685UkbPeg5rbwZhWk8/ikFPenuEz0UEyu9sHoyu32/Qb1vY4K8Th6ZvDNGSz1EJHm9/LBhPXH/ybw7EAU9MaN4PRSap7uc4CM8XseDPIYSP71ZOls8MlbBu1GJh7zlw7g8J+18uxNpQ7nXU1y82phhvF3Blz2rYUI9Cp8nPNigK7yiD4u9s4f4PH0fA70x5Ry8ujcWPVY5Fr1C/0S973ymvB4OXz1v6PG79OaXPBdC+jqh07K8bnldPQtDMb1KSow7QMD3vF1hKDkNbgY8yboJvdsacjsIuP28JB7UPE0TDrtgGrC8z234PHLsQD3pz7Q8FTXivECF+LxGUVA9D3SduhZ8xjxDjjM9ESwvPXk6UDxx/ZA7Rr8CPEGgy7sSAEs8hMkVPWU8kr1L9Cg7R+yQPbKY+Tx9Tee8AsHOvJCxB7yDkn+86kMsPFb11zwAlh28tsz6PHJBTr25iVK7egdZPTbq6zw2Z4k85/quvAj8ErxfqUU9JYXIPWCgVTzlDOM80mJkPIwzwjwKQoS97VGtPHV/KTzxfxA8
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-file-tree.ts","s":577,"e":625,"m":1777361904183.93,"t":"assetId: asset.id,\n workspaceId: asset.workspaceId,\n assetKind: asset.assetKind,\n iconHint: asset.iconHint,\n },\n iconHint: asset.iconHint,\n });\n edges.push(makeProjectionEdge(document.id, assetNodeId, workspaceId));\n assetPosition += 1;\n });\n\n childDocuments.forEach((childDocument) => {\n walk(childDocument.id, depth + 1);\n });\n };\n\n roots.forEach((documentId) => walk(documentId, 0));\n\n return {\n projectionId: `kernel_projection:file_tree:${rootNodeId ?? \"root\"}`,\n projection: \"file_tree\",\n rootNodeId,\n items,\n edges,\n meta: {\n search: {\n query: null,\n maxResults: null,\n maxResultsRule: \"matches_only_before_ancestor_completion\",\n ancestorCompletion: \"include_all_ancestors_after_match_truncation\",\n ordering: \"kernel_file_tree_preorder\",\n indexingVisibility: {\n schema: \"mnote.file_tree.indexing_visibility\",\n schemaVersion: 1,\n source: \"kernel.project_view\",\n status: \"visible\",\n requestKey: null,\n indexedResourceKinds: [\"document\", \"index\", \"asset\", \"asset_folder\", \"mindmap\", \"book\", \"pdf\"],\n visibleResourceKinds: [\"document\", \"index\", \"asset\", \"asset_folder\", \"mindmap\", \"book\", \"pdf\"],\n metrics: {\n visibleRows: items.length,\n visibleEdges: edges.length,\n },\n },\n },\n },\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-sidebar.ts","s":1,"e":60,"m":1778339806503.0166,"t":"import type { DocumentRecord } from \"@/lib/documents\";\nimport type {\n TreeProjectionCapability,\n TreeProjectionResourceMeta,\n} from \"@/lib/tree-protocol\";\n\nexport type KernelSidebarProjectionEdge = {\n id: string;\n edgeType: \"parent_of\";\n workspaceId: string | null;\n fromNodeId: string;\n toNodeId: string;\n};\n\nexport type KernelSidebarProjectionItem = {\n nodeId: string;\n parentNodeId: string | null;\n nodeType: \"page\";\n projectionKind: \"sidebar_tree\";\n title: string | null;\n depth: number;\n position: number | null;\n childCount: number;\n expandable: boolean;\n expandedByDefault: boolean;\n capabilities: TreeProjectionCapability[];\n resourceMeta: TreeProjectionResourceMeta;\n iconHint: string | null;\n};\n\nexport type KernelSidebarProjection = {\n projectionId: string;\n projection: \"sidebar_tree\";\n rootNodeId: string | null;\n items: KernelSidebarProjectionItem[];\n edges: KernelSidebarProjectionEdge[];\n};\n\nexport type SidebarTreeNode = DocumentRecord & {\n children: SidebarTreeNode[];\n kernel?: {\n nodeType: \"page\";\n depth: number;\n position: number | null;\n childCount: number;\n expandedByDefault: boolean;\n };\n};\n\nfunction sortRecords(records: DocumentRecord[]) {\n return [...records].sort((a, b) => {\n const orderA = a.sort_order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.sort_order ?? Number.MAX_SAFE_INTEGER;\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return new Date(a.created_at).getTime() - new Date(b.created_at).getTime();\n });\n}","v":"Td9kPM81/jyjN+C9fevZvdQmMT2ISyG9ebhevWstbbxW7AK8W8LDvJ/5w7z9THU8zfXNPax9R7wfcEg9pamevRrH77xrTam9si6zPAO+Iz2Rrw+8tetzu+ekszu4E+a8f1ZaPcWHiD327PE7kRklvGGwgL1wX7g8XjEcPQmErjxddf074FRJPPnX8bx3ULW782gYvCO4Tr2TA4U8qO0/PSJZOL1fIxU9E60DvTmPab0EczY9/V9cvfmGnz3m6y08AdmPPXBci732yG491+0MvcSDbzzYzqo8843NPRZwOj08w0q9M8fUO6WqvTskmCm8NohCvBP+0D1uwXm8diqtPVe5ujyzQgy8xG6FvMD/qz2F0Gy8yk8CvdGjMT0ocgY8Di9APbVwC73XrSu9AD/sPHwNkjvQkjW92XYiPCulij1hSUC9v9aMPF5yzTtv1BA9WaP9PPt1xTywQfy87EeSvHdLs7yankM9UjtIPSg2kL3nsYs6fkaZO71SQ71LoNs8lLCcPKiDVzz75tK8rXkNvf7QnDsaryG9tNkIPU3fzzw17+08PbTdPLo0Fbxq/4q8RABOvQEW+rzAa8O7iH5lPU5Sm721B8a83QcuPbiEO70L0dO7CE5DPGiYED0fVho99jpBvBjlG70U5CM8XbMCPfCFhD3F1oO8pucYvDScmDzSlmU8FBREvdWfab2CUjO9j3yXvIiC2zxGneg9iiNgPd/libyVhQW8xJn2PHedELyL7MA8lBDsvAOVRr0Ubrs82w6APAQ4obxhA6M9OM05uryTS73odK+7ko4nvUtZED2g0qi8+L6WPVo9H7zNDLS8GR9oPSXTuzym22O7NJf1vMuOSj2ouwa9Q0mTvXvpOD39/0Y8DwgBu+acLTxeF108+Iacu+AgST0beWu9XHi8vFmf5rr/ORW8Wbcuuw8WAzoLVP08HrcGOzqA0jye3Cy9EEqbu9jutr3FI5E8uEQ4u9eVV71zaS+870EgPCknmrx8DAQ9D5MJvRcBYrvllSG9jjHXvMGNT7zGnmO9TBeSvVye6Ttxzus6QyXzPJRRhL35KJc8wdQIPOKBj7ynDNa7ORpovajmxLuXRr28U9UqPdnU7rwvn9886TiAPUfHR7szos08pbAwvFlWDLxjqTI9a9svvf+84zo7CDG9naoNPUayLzx+7xO9avTGPLuohT3Rqfg8N1xrPVW9TzzWxLo88bWyu154T73OyWm978+EvUzi4TmVLS89hyB3uzM/FbxuVoo8OyB3PW6epDzcuR66qyQsvEb/+buebPC7rFOLvVBYg7v04+m7ELUpvC+8ZL2On4U83yMoPYmnKbx3D5w8XVo6PZCRTD3BqWS8MSZRvYI2UzyItba8Cn0HO1ydVr2pvhw9k4ouvKmVCz1bn1m9IvwBvUevMr3or169wYgvvOceZTnKR548EyKmvOG907w7ZR+9+pq4PJYcRj2YshG8XrA7un+DVzyCniy9B7n4Ouw7eb06+n29jZ4avSpdaDxr0eU7h64HPbiYCLsHIAW6cJfPvIrwsbpW1bA8MIoVPJh2Bb3uzlI9oirFPKIvZDx10r07PCdBvLwriL2bJV69tRUhPNvtID1PVo09J2lkPV6Sj7vBHfu8MWMSvOCO+ryKEXQ86cmuPM7gTL08O1y9u0nKvIRAaD1UicU8PEwIPW9wgDzlogy8sHrHPMnK6Ly3Whi8/1UavZhjhj3Oidg7xXMqvVBzBD1RzJ06xQvRPBe2Sjol1a+8Qt5+PeNMej0D4iy7WLW6vH3EK73mot07iUwCvTVyIjyCUJ88ENpGPSV6iz3mcN285r5TPb4bLTsbQUW8FcHHO+I/sbx6eQy9hnqjPMRmWT3UeB+9hqxXPOZyDrxGD2c7tUECPIdv6Dw6ddA8PQklPGX3wzp/YSQ83kIuPOjG0DpQUDo9uXxHvMla0jsZPWo8VBPIPGR8C7svkqQ8phU5vGWGIzy5Yly9McQRPbaWjjtQYHK8TSUrvThV9Lyx/9A8Au7jvK25Ez2Dv4g9iqVJvcKnET2ED9U7hUfDPPR61jwIgwm9cdF+vA6ghzxPYrQ9y6apPB7cbrx80g48RGhavBI0HLsuE5Q8+lIROqwMNT3A9tS7gMqNvHxwH72QPVu97soiPXaQ5rw9EOu82jMxPTaAdrwF1z08HCvAPPlUrryn6lY9ZYv6vG6KWr1pDHG8ETDBOxWCirx8zL89CEfXPKi9Hrwup4a8o/OPO88qtTwF/MU8QjiVu4iAnT2lzi09jl5wPQld1DxqTqc7mzGcvQUOBTs2nFw8Iu40PU/Nw7ymnsQ81cyfO1/jbroPIpo9rQn/OSateT08OIQ9s3xKvS/snjx6GgW84BUrOxDedz3erT48Qkseva+YXb2rJc08lYm/v
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-sidebar.ts","s":49,"e":108,"m":1778339806503.0166,"t":"function sortRecords(records: DocumentRecord[]) {\n return [...records].sort((a, b) => {\n const orderA = a.sort_order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.sort_order ?? Number.MAX_SAFE_INTEGER;\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return new Date(a.created_at).getTime() - new Date(b.created_at).getTime();\n });\n}\n\nfunction dedupeRecords(records: DocumentRecord[]) {\n const seen = new Set<string>();\n const unique: DocumentRecord[] = [];\n for (let index = records.length - 1; index >= 0; index -= 1) {\n const record = records[index]!;\n if (seen.has(record.id)) {\n continue;\n }\n seen.add(record.id);\n unique.push(record);\n }\n unique.reverse();\n return unique;\n}\n\nfunction buildSidebarCapabilities(childCount: number): TreeProjectionCapability[] {\n const capabilities: TreeProjectionCapability[] = [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ];\n if (childCount > 0) {\n capabilities.unshift(\"expand\");\n }\n return capabilities;\n}\n\nfunction buildChildrenByParent(records: DocumentRecord[]) {\n const childrenByParentId = new Map<string | null, DocumentRecord[]>();\n const recordIds = new Set(records.map((record) => record.id));\n for (const record of records) {\n const parentId =\n record.parent_id && recordIds.has(record.parent_id) ? record.parent_id : null;\n const bucket = childrenByParentId.get(parentId) ?? [];\n bucket.push(record);\n childrenByParentId.set(parentId, bucket);\n }\n for (const [parentId, bucket] of childrenByParentId.entries()) {\n childrenByParentId.set(parentId, sortRecords(bucket));\n }\n return childrenByParentId;","v":"ISIgPIuSmDzXox++xZy3vQabij1sAX69lVeHPAh5izwhXzK8BMmAvblxBb3qYXY9oFdEPcb4szv0B987E76JvQsDhL3P5cK8HZRtvA1D3TyCCic95PkhPULAzzspC1I87PVwPQayrD02QEc8WE1GPAGiwrzcfxs9BtQNPaaRAD3eERU9GtK+unvtTL0W66C8/0g8PX1FSb1vlnA9sCAbvf7YUTiLN2M9/BXqvBpPVr1SRpA9ADYvvWwLdz0l6Rc6416fPdV7mb3QwJq8uULWPBCQvTyEKia7d4HBPXmPej3cZ427Gdv5PJFcYj2p3nC84f9fPXzsOT1dfQ69Up27PdyBKT3/1fS84/+4PJraKT1TXoS693n7u+AXjzzMfDe8wca4PAk/CL0hl7q80/eoPdLkRby9F6y74ekFvVJCNT38svG8IhwhvbNEPj1sB+c8OssiPcwP07yx1/88tXRAPIapPL14u5o9HpSQvFI+ar2UYsE8mU23PFtOQL2suVw8WTC+PCobwTspBRa9cZkNu66gYrzVEZe4g1dXPegdHL3cKOI8zZkTPfAHe7qksKM8ec0/ver7Br1nmjq8U7V5PfKIzbyWzma8mqi8PNY90Lx+pLE869kovQEmc7vEChy8Zh1IvKDoLrx9fII8qRkePY0pkztvJSY9p7wROzBsbzyTgQk90ju1vI8RPr2EXNq87+l+u82lmTwj/Jo9EteMPKmCQ71uLY68NPS+PI2YSDzeXXY9DhVSu9bV6bx0Rma90gMjvAfWOb0qi509ZwwKvWsHvL36cg09dhdxvFznUrp7YLe81i0wPfse1jl9kuK8rIrLubeD+DtDMiA9IqSKvJLqAT1DkfM8nuKFvUSWND0fTSa8Wtf9vMnA47uUlrE8i1X3u8z4Zj19Ooi9e0SBvUuzlrt6RKs8FWBgvYN/7Tzg3z09uz8SvFyEWz3gGy29PWn9PNOrW72dX4I9HH0BO1gFIb0La4y8SoXfO+9ulrz4LQC9hMZ3vRxGizusDWK82PXfvNH+ejwCT8K8EaWsvIH0vLxNLoK8xSa6Ozsgab2aQpu6vAmUvCcvzbpUipq8q9NMvcUUej1WGhm89P5PPRld3bzwLzs9R1NbPSozwbxl6y097JpTO1jfHr3t/6g6AAo2PAcxMr09QMC8b03lPAmWP7zLp568a8pfPIfG4zzyoRc96UZ4vPRQwDz2UDk8+EY+OxOR07zKyYq9vVG6vWkNEjxRy7a60HIzvWBJyTxWvkQ8te2bPZxEmjuC/vY8IpezvBZrajzFio27a7nvu7t4CDotmM05WXokvEblJrzCB6A8sWLJPBbq1DxsZ1k8/g4WPVyegj31BXg9tbmPvTOnCry7/qY85OrQPJUdIr1W9eA8ExaqPAlmfTzsIPu8lz9ZvaX4X72aaDS9VKIXPPBU5ztGrEU8YX+MvOVwU7p1GDK8r5whPfyH6DweLio8F/RrPG+4vrw89xK83SpPvM2ItLzo5r+7yU8/vZNwVLypRCm9ApIDPcQkPzpyQZy8QvR0PTr0jTwDR3Q8Acu+PEnDDjx2hII81RSVvFAdgzx75ts8FCGcvCSlTL37atO8poeQPBUIKD2ldj09Q9QLPU4bC70+Dq0611QTPdBdwrwv6OQ84hWKPJ+ss7yBjB69qDIAvUq+Wjzvzaq8f7poOhVOEjwAAME5xs0OPZUklDw+O5u8foNNvYDz+DzLmj6930JfPBjC8jyUQRi9l4IgPHxchLwXQDG96oSlPA+FBT0UgxE9zs6SvQ5yIL3ZgYQ88/GYvFLLAb0w8KW8rjPVPc577Dx/ec67hx+hOzcwJb2hCUe7Pq+LPbRu7byc2xa9Wpc8PTgu6zy66BK9akzLu7Yqibxt+gi8NruiO231xjytFTc6Ak2aPLBl5DzcOAc7GDMePfiRSzzrOMO7xmokvVCQ1Lz9ubI847BGPQanDr13iuM8m1CVPPtPFbwoLlS90KotPPlExbyUfTu9gkIhveqIer3nq1g9TC+/vBH+kj3DcKQ95DhUvXXglzy+VwU9SPQQvfVuarsytQY9qRPrvMQQ1LzNHp09aROYvIgywLxVPuG8JFUuvVnmy7u6Mlm97Nibu/IoEzznvjC9k4eUPHIhmLz+RQy9ShF9u8xsRr09ZBC9FJI7PTUaKb
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-sidebar.ts","s":97,"e":156,"m":1778339806503.0166,"t":"const recordIds = new Set(records.map((record) => record.id));\n for (const record of records) {\n const parentId =\n record.parent_id && recordIds.has(record.parent_id) ? record.parent_id : null;\n const bucket = childrenByParentId.get(parentId) ?? [];\n bucket.push(record);\n childrenByParentId.set(parentId, bucket);\n }\n for (const [parentId, bucket] of childrenByParentId.entries()) {\n childrenByParentId.set(parentId, sortRecords(bucket));\n }\n return childrenByParentId;\n}\n\nexport function buildKernelSidebarProjection(\n records: DocumentRecord[],\n): KernelSidebarProjection {\n const uniqueRecords = dedupeRecords(records);\n const recordById = new Map(uniqueRecords.map((record) => [record.id, record]));\n const childrenByParentId = buildChildrenByParent(uniqueRecords);\n const items: KernelSidebarProjectionItem[] = [];\n const edges: KernelSidebarProjectionEdge[] = [];\n const visited = new Set<string>();\n\n const walk = (parentId: string | null, depth: number) => {\n const children = childrenByParentId.get(parentId) ?? [];\n for (const child of children) {\n if (visited.has(child.id)) {\n continue;\n }\n visited.add(child.id);\n const childNodes = childrenByParentId.get(child.id) ?? [];\n items.push({\n nodeId: child.id,\n parentNodeId: parentId,\n nodeType: \"page\",\n projectionKind: \"sidebar_tree\",\n title: child.title ?? \"无标题\",\n depth,\n position: child.sort_order ?? null,\n childCount: childNodes.length,\n expandable: childNodes.length > 0,\n expandedByDefault: true,\n capabilities: buildSidebarCapabilities(childNodes.length),\n resourceMeta: {\n resourceKind: \"document\",\n documentId: child.id,\n workspaceId: child.workspace_id ?? null,\n iconHint: \"page\",\n },\n iconHint: \"page\",\n });\n if (parentId && recordById.has(parentId)) {\n edges.push({\n id: `edge:${parentId}:${child.id}:parent_of`,\n edgeType: \"parent_of\",\n workspaceId: child.workspace_id ?? null,\n fromNodeId: parentId,\n toNodeId: child.id,\n });","v":"BnqXO9jSoTxba/y9ySz7vZp4bTxaS0C9Ox7Gu70Zqrwry/88FY1dvX6z7bz1ejw9vZLpPe+WIDupr688Vw+JvMO/mb3KOja90VLxPKZDkDwBxQU9g2ajPJLrpTxGtnI66S43PVoukz00utw8LIixPHltGb1DOm89DSBAPRUXID1SphA9lKwIvYF6lr2MwMa8GzQcPfpTRr0IKTo9KMa7u9sZJbz9fCU9LE5EvfqkT73eEow9/DGLvUXDrT2kEQc7M/BgPV4nGL2cPOS7Uu6xO4GuAj35ALO8+9rXPSYLcz286ly9X+uSPJu6Vj3S3Nu8qsENPLpDUD1OlPc71omwPeQbnT0pCTa7hOxEvKd+Pz31BRm9M6SfPFQSED1FEgo9AYOcPF+5Or1f/768U2/PPQ6ebTwFnRq9HmtdvbASST3SZUm9DyKLvCDgszwr1x2841Z4PfrvNLxsMU88BnsEPZwBDr0XNow9lJtbuoWmQ72aQ548c8utPNV6Dr1WE6E8v7KFOi7oVTwND7C8zaYLvGaVzzsSRwO96anvPDvL7bzyZY48mvauPKnUjzsOCMu6vUuyu3tGgLxRDxu86NxAPdweor0z+cK8gOUAPcp967y+qNs8NWtpve7CnLuvvp86+VX5uxsGtrxymb886b5ZPcPlozxBDmY9q32wuk9MorxUw/Y8P+uFvMAJdr0nIZ68BjaDumXg3jwmtos9XEijPF5jC73TubO8/TQKPME9RbzdOCo7bfh3PCH0L721iCi9E6hQu6fNEL3NErM9dabivKcaer35C8c8d3KmvP75wjzlsnm8H96KPbhGv7vQSR+9Pre6Ouj6pbwaYqI8XyuivPRZrzyVr5E8ChOLvZAgmTwyZga9WZVevRoJAD1s2bg7M8J5unn5Jz0ByF+9sH6MvdriTDxiH5u7bD9AvWyidTwGhts8CQNOvCpjGD2W5UG9KEhzPGtLx708wn49aungPAHGprwmTqm8CFGKOoWHbLyODKa79IeIvZTnQTw3yha8PjVrvFuqZjxIIoa8Kd+RveDXurtHpxO97/9pu8kopb1AfoQ8ccS+O0dhGDwHBjM8vq9dvS0KJj3LGmy8OR1LPQtMFbwIFZk8n3MrPYqVi7yUoFs8SIbiu0a3Mb2NgsS70FzqOmMLrbw9a/e8ilksPaYPUbz5KyW9OStGPf/lVD2eRTc9l6nUPIo+LbxeKNI8B1KlOaHpsbrr+H293629vQP8zjz6i4Y780+wvM2ADDtzFbE89JCuPXXkYLswQwA9rB+9u36RjjsyrEy8eDE8vUBd3rujgKy7mxDdvDXJOr297hI9W/SrPBZHzTrJ2O48vdWbPCEpgj1/rlA9E14LvS/A0zy924m6xVK5uwbjaL28h088ksifOzwL7jxSTfK8jTkHvWTan719j2W9lzQWO0G91ruEVg08SCUDvSq2tbvZYMG8ABEVPc+RBz2tyee7BExdPONJQbtaiSO9AN6SvKbDpLxO9Lm8sX6wvBV9/7qbHYe9V+KEPOAbjzkK2R28lHocPRUrxzyyAZ+72gZVPXJctLnC5C49SCQhvFy5bjwBfNA8aC4Uu1Dx5rwx9SO9b2m4O819WT33pW89DaYuPSAn4TsAyzS8BCzVPFG2dL0bJxI8CBbrPNz5EbxYf2G91Zsxvetc/DxLTwq8mexFvKA2WzyCYqO78RNBPegUazwJH5K8fKQlvf9vizza+Em8XrZoPDtlvzwk7e
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-sidebar.ts","s":145,"e":204,"m":1778339806503.0166,"t":"iconHint: \"page\",\n },\n iconHint: \"page\",\n });\n if (parentId && recordById.has(parentId)) {\n edges.push({\n id: `edge:${parentId}:${child.id}:parent_of`,\n edgeType: \"parent_of\",\n workspaceId: child.workspace_id ?? null,\n fromNodeId: parentId,\n toNodeId: child.id,\n });\n }\n walk(child.id, depth + 1);\n }\n };\n\n walk(null, 0);\n\n return {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items,\n edges,\n };\n}\n\nexport function buildSidebarTreeFromKernelProjection(input: {\n records: DocumentRecord[];\n projection: KernelSidebarProjection;\n}): SidebarTreeNode[] {\n const projectionItems = Array.isArray(input.projection?.items)\n ? input.projection.items\n : [];\n const recordById = new Map(input.records.map((record) => [record.id, record]));\n const nodeMap = new Map<string, SidebarTreeNode>();\n const itemById = new Map(projectionItems.map((item) => [item.nodeId, item]));\n\n for (const item of projectionItems) {\n const record = recordById.get(item.nodeId);\n nodeMap.set(item.nodeId, {\n access_scope: record?.access_scope ?? \"private\",\n id: item.nodeId,\n workspace_id: record?.workspace_id ?? \"\",\n title: record?.title ?? item.title ?? \"无标题\",\n parent_id: record?.parent_id ?? item.parentNodeId,\n sort_order: record?.sort_order ?? item.position,\n is_starred: record?.is_starred ?? false,\n is_template: record?.is_template ?? false,\n created_at: record?.created_at ?? \"\",\n updated_at: record?.updated_at ?? null,\n children: [],\n kernel: {\n nodeType: item.nodeType,\n depth: item.depth,\n position: item.position,\n childCount: item.childCount,\n expandedByDefault: item.expandedByDefault,\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/kernel-sidebar.ts","s":193,"e":236,"m":1778339806503.0166,"t":"is_starred: record?.is_starred ?? false,\n is_template: record?.is_template ?? false,\n created_at: record?.created_at ?? \"\",\n updated_at: record?.updated_at ?? null,\n children: [],\n kernel: {\n nodeType: item.nodeType,\n depth: item.depth,\n position: item.position,\n childCount: item.childCount,\n expandedByDefault: item.expandedByDefault,\n },\n });\n }\n\n const roots: SidebarTreeNode[] = [];\n for (const item of projectionItems) {\n const node = nodeMap.get(item.nodeId);\n if (!node) continue;\n const parentId = item.parentNodeId;\n if (parentId && nodeMap.has(parentId)) {\n nodeMap.get(parentId)!.children.push(node);\n continue;\n }\n roots.push(node);\n }\n\n const sortTree = (nodes: SidebarTreeNode[]) => {\n nodes.sort((a, b) => {\n const orderA = a.kernel?.position ?? a.sort_order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.kernel?.position ?? b.sort_order ?? Number.MAX_SAFE_INTEGER;\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return new Date(a.created_at).getTime() - new Date(b.created_at).getTime();\n });\n nodes.forEach((node) => sortTree(node.children));\n };\n\n sortTree(roots);\n\n return roots;\n}","v":"w9CbuyTLPTtZ3S2+mkyqvd/tOz2i/4O9LaXjvAI2BT1Y+o+8yvsKvRoGLL00rHU9uN1APeyCtjyNx8a8ZRY4vfF8+rgizFy9ngX1O/eK0jxyVHU7mHr5vH/FXzzjuFE7jMS7Pc8MCz2hcFi9TByEulfcprwd4bM8f1uvPWoGRrpP68Y8aSiwvNRiRL1cs4O9BpRFPTMEjDyVYVM9WU6DvQ0gIT3+DeM8zbNGvTfBU70kF4A8ghUivbspkz1EYAa9alhQPbgcG70w/gE9Ia12POA+QT1lShi9p8vOPdP+Rj2yAfQ8ODcYPfjdhz0adgC9fS6MPHNuij2tObS8/Ov0PbZk0zxlA5u8vF99u4r1mT1Nhei8irkOvYiyQjxweX87UOudPIC4CDvKCie9Tj40PbBfNb1oCzk8/8E+vZb9dD3+esE8ZXzQOzA5gjzFXm88U0bIPB8ElbvJfLk8irjqPDoi27wkZrk9w8uVPAIbH7tkcPi8dFs5PbPwJr2zrDa8ocJmPJOj8LXvEhS9W1STPBcDpju3Gc67OnQHuziW1rxqZfw7Fw2RPRO4wbv/Ci+9XIwzvPRiN73Xy9M8mXgLPTkk97ysZN68tKJ4u5tZvrxeD1k9M/sWvY/fFrwlmAM86qi7O1X+LLwrRZk8QbiTPZMtBzuFrCg96NGzu4eQ7zwh6kM793LTvFdAwLyQf9m8xSIovLuHIry600w9BU+vPU5XNr1NEK+8BBslPWiMGD3vph89T3AxvIcVIb3xbwi9Aq3GPPE6j71j0qM95C4hvQhdJr0HJiE8itOkPN2fEj3Acpm8ku9OPVNs0Dsfqui8n8vhuiEfzrsAEGA9L7feO2HUID084EW96WYTvT5QQLxDCXw733c1vWf3Cj2XPoY7tHjWPL0pUT0pL/K8e6kTvRujsTwM3Ji8UFWXvLlOgDudyZS88hr0vKqPVz1egwm9yhivPNG0QLxBHYw906uOPLIF3ry1mti7SEWMvMtRWb0owlw8UghyvZzq4rv0rz68zyIZvaNtTLw/FJG8SI8Lvd9zvDy7VfG8bNHIu0RaLr3orje8G6UQPMGBUbz4uCw7CbSLvT2jCD2lmly8+Ed2PbxkIb2JRE09s9ZYPVRpgLz1nWY6hCzjPApcYb0Tsx29Pr/Iu7lISr3DYhS97IxxPJ713ju7DlG9LmbvOz7QDTzpsr88sGOUvGsOyTz91BA954RkvfgCAryHKIi9LiemvdDurTw8ILo6GcM9PZmRTjxjE4E8ThcTPalomTxlFLQ8tNWjvCpT8jtl0Ms7wt0hvSe6DLxTwZm6wMtvu8lUs7x+jd48k9JgPWiwTTvBzJM8nOEVPXCTOz2w8MY8si9dvRR9HryKfT+8p2uHPGzhT73NBqg9mmqBOzwwBzqLlBW9QhQ0vSGUgr1OkYq8aMQaPJwJyTwtrco82wQGvCvE1rwgwcw8ewvyOyPHCz3cDGk9sWEWPb3lK7xkRxm94BMdOo8xury4+wi9bUXIvA7cdLyzLm+9r5XwPHjSpjtShiE6VZTOPDEbFLsWjEe8nq0vvLAlgruysyM9C6BsPOg2pztpGpI9mgYtvVsn67tFo4u76ACcPMvqVD2oE109jzrcPAsFlDw11je9eF/ZPIgfTTxaSRI9VuHavKQGHL0bMKc8ka0jvYucQbtp+dW6HE+evMuN8bubCDU9JvRpPVeeAT2bifW8ZBKouw4Zlry0xgS8La1bu1Jd+jwh+vC8FcMePSxErrtWnWm9/cPFPJj5MT1yFYo8T4PQvIj3fDte9sS8ykaOvDqKyLuxwqE8N3+PPQop4Dsc23C8QgI3ParY/bwYUb07ZvsCPcgu4rwhvpC83KcFPfqNHz0FlRu9zyS3PB8UUjzi4jG8LRVovK/wDj0GGNU82tEkPHpzpTwvzmA8GcAFPXZFz7rrxZa8TzckvZgQk7wozS09gC2MPRpI87zc+oQ9LjVoPE7WaLtGHyI8kbpLPAisujzQ1wO8DLQDvXFHmb3MPxY860/AO/IgIj3rJWs9WOkyvSoi6Lr5CcU8EJmRvPGE1TwGMdM8zQSZvB0ioTysoC09Ei07vKHch7xDBJa840jIvNJ1jzzRQDK9jWmNPFkQkLou0ha8XLJkPDAnrbzRUiq95J1qPFvCIb33jZ28WHgNPFdNXb2xrhe8kkigPOmuhTzH1yk8tYCmPdfgEbyF12e97cJEPW85C7z9eTM9Vr6DPDXn8LwzWCq9ufZ+vOnLgz0IXgE8h1e+OyRJuT2X6DM9huhlutWzojzigSS84pfUveROuTxElhs8EkUhPWR3Ojy47bO894BmPCAHDr1rbKk8khzKvF2Ohz1ZDJI8ilivvY9VrTyY/n27aBuTPPdCnT26TtI8wXPhvPaZg71zoSo9LCrRO4r5DT1pSrU8pun2uJZ0pj299n+9FrqoPNimp7zBoJE8AIOMPMY/BD0Ay/G7WPIdvW8unbrZt4o6M3vNvOLIv7wQHWO82wtxPSFaKD2v2zO8C/JdOUeKKLzf2+C8fkaGPAg6Hj1aVj69kjAZvASheDzSQmQ9sOn5vKOIqbznhv+8kcqEvVaju7lzbdY8Xi98PH1inrvrUu48oosVu7kqdLtYBf06JxnHPPJLBL0yuLG7Re82vJrWN7wCIRg9IAGGu977Gzz14928xF6LPPSmhrx4tos8F94JvL4LjD
|
|||
|
|
{"p":"wolai-frontend/src/lib/online-table.ts","s":1,"e":60,"m":1773495684355.4756,"t":"import { DocumentTable, DocumentTableSnapshot, TableRowData, TableSchema } from \"@/types/online-table\";\n\n// 默认表格结构:全部为空列,交由用户/全屏自行定义\nexport const DEFAULT_TABLE_SCHEMA: TableSchema = {\n columns: [],\n frozenRowCount: 0,\n frozenColCount: 0,\n};\n\nexport const DEFAULT_TABLE_ROWS = 50;\nexport const DEFAULT_TABLE_COLUMNS = 15;\n\nexport const createDefaultTableSnapshot = (schema: TableSchema): DocumentTableSnapshot => {\n const frozenRowCount = schema.frozenRowCount ?? 0;\n const frozenColCount = schema.frozenColCount ?? 0;\n return {\n rows: [],\n luckysheet: [\n {\n name: \"Sheet1\",\n index: 0,\n status: 1,\n order: 0,\n hide: 0,\n row: DEFAULT_TABLE_ROWS,\n column: DEFAULT_TABLE_COLUMNS,\n defaultRowHeight: 19,\n defaultColWidth: 73,\n celldata: [],\n config: {\n columnlen: {},\n rowlen: {},\n },\n frozen: {\n type: frozenRowCount > 0 || frozenColCount > 0 ? \"both\" : undefined,\n row_focus: frozenRowCount,\n column_focus: frozenColCount,\n },\n scrollLeft: 0,\n scrollTop: 0,\n zoomRatio: 1,\n showGridLines: true,\n },\n ],\n };\n};\n\n/**\n * 在 Supabase 中创建一个新的在线表格并返回元数据。\n * @param documentId 当前文档的 ID\n * @param title 表格的初始标题\n * @returns 新创建的 DocumentTable\n */\nexport async function createOnlineTable(\n documentId: string,\n title: string = \"未命名表格\"\n): Promise<DocumentTable> {\n // 假设 Next.js API 路由 /api/tables/create 负责与 Supabase 交互\n const response = await fetch(\"/api/tables/create\", {\n method: \"POST\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/online-table.ts","s":49,"e":108,"m":1773495684355.4756,"t":"* 在 Supabase 中创建一个新的在线表格并返回元数据。\n * @param documentId 当前文档的 ID\n * @param title 表格的初始标题\n * @returns 新创建的 DocumentTable\n */\nexport async function createOnlineTable(\n documentId: string,\n title: string = \"未命名表格\"\n): Promise<DocumentTable> {\n // 假设 Next.js API 路由 /api/tables/create 负责与 Supabase 交互\n const response = await fetch(\"/api/tables/create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n documentId,\n title,\n schema: DEFAULT_TABLE_SCHEMA,\n snapshot: createDefaultTableSnapshot(DEFAULT_TABLE_SCHEMA),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to create online table.\");\n }\n\n const newTable: DocumentTable = await response.json();\n return newTable;\n}\n\n/**\n * 获取表格元数据 (用于紧凑模式渲染)\n * 实际实现中,这可能需要一个更复杂的获取逻辑,例如同时获取前 N 行数据\n */\nexport async function getDocumentTable(tableId: string): Promise<DocumentTable> {\n const response = await fetch(`/api/tables/${tableId}`, {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch document table.\");\n }\n\n return response.json() as Promise<DocumentTable>;\n}\n\n/**\n * 将表格的 snapshot/行数据回写 Supabase,保持内联与全屏视图一致。\n */\nexport async function saveOnlineTable(\n tableId: string,\n payload: {\n title?: string;\n schema?: TableSchema;\n snapshot?: DocumentTableSnapshot | null;\n rows?: TableRowData[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n viewPreferences?: Record<string, any>;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/online-table.ts","s":97,"e":138,"m":1773495684355.4756,"t":"/**\n * 将表格的 snapshot/行数据回写 Supabase,保持内联与全屏视图一致。\n */\nexport async function saveOnlineTable(\n tableId: string,\n payload: {\n title?: string;\n schema?: TableSchema;\n snapshot?: DocumentTableSnapshot | null;\n rows?: TableRowData[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n viewPreferences?: Record<string, any>;\n },\n): Promise<DocumentTable> {\n const response = await fetch(`/api/tables/${tableId}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const message = await response.text().catch(() => \"\");\n throw new Error(message || \"Failed to save online table.\");\n }\n\n return response.json() as Promise<DocumentTable>;\n}\n\n/**\n * 删除表格及其行数据。\n */\nexport async function deleteOnlineTable(tableId: string): Promise<void> {\n const response = await fetch(`/api/tables/${tableId}`, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to delete online table.\");\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.test.ts","s":1,"e":60,"m":1777077183977.7412,"t":"import { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n getMnotePublicRuntimeConfig,\n getMnoteRuntimeConfig,\n} from \"@/lib/runtime-config\";\n\ndescribe(\"runtime-config public projection\", () => {\n it(\"不再暴露 legacy mnote-web runtime 字段\", () => {\n const runtime = getMnotePublicRuntimeConfig();\n expect(\"mnoteWebBaseUrl\" in (runtime as Record<string, unknown>)).toBe(false);\n expect(\"mnoteWebTreeShellEnabled\" in (runtime as Record<string, unknown>)).toBe(false);\n });\n\n it(\"允许通过新 runtime 配置显式选择树 renderer family\", () => {\n window.__MNOTE_RUNTIME_CONFIG__ = {\n treeRendererFamily: \"rust_family\",\n };\n\n const runtime = getMnoteRuntimeConfig();\n\n expect(runtime.treeRendererFamily).toBe(\"rust_family\");\n });\n\n it(\"树 renderer family 别名应归一到 rust_family\", () => {\n window.__MNOTE_RUNTIME_CONFIG__ = {\n treeRendererFamily: \"tree_shell\" as \"rust_family\",\n };\n\n const runtime = getMnoteRuntimeConfig();\n\n expect(runtime.treeRendererFamily).toBe(\"rust_family\");\n });\n\n it(\"树 renderer family 缺省时应回落到 rust_family\", () => {\n const runtime = getMnoteRuntimeConfig();\n\n expect(runtime.treeRendererFamily).toBe(\"rust_family\");\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n delete process.env.NEXT_PUBLIC_MNOTE_WEB_BASE_URL;\n delete process.env.MNOTE_WEB_BASE_URL;\n delete process.env.NEXT_PUBLIC_MNOTE_WEB_TREE_SHELL_ENABLED;\n delete process.env.MNOTE_WEB_TREE_SHELL_ENABLED;\n delete process.env.NEXT_PUBLIC_TREE_RENDERER_FAMILY;\n delete process.env.TREE_RENDERER_FAMILY;\n delete window.__MNOTE_RUNTIME_CONFIG__;\n });\n\n it(\"即使保留 legacy env 也不应回注 mnote-web runtime\", () => {\n process.env.NEXT_PUBLIC_MNOTE_WEB_BASE_URL = \"http://127.0.0.1:3104\";\n process.env.MNOTE_WEB_BASE_URL = \"http://127.0.0.1:3104\";\n process.env.NEXT_PUBLIC_MNOTE_WEB_TREE_SHELL_ENABLED = \"1\";\n process.env.MNOTE_WEB_TREE_SHELL_ENABLED = \"1\";\n\n const runtime = getMnoteRuntimeConfig();\n\n expect(\"mnoteWebBaseUrl\" in (runtime as Record<string, unknown>)).toBe(false);\n expect(\"mnoteWebTreeShellEnabled\" in (runtime as Record<string, unknown>)).toBe(false);","v":"ReDMPBDWhzwI3SW+CCOPvSCAfj0F3zi9nWH2OynKND1UQLe8+K9Tvf04M717AD89wocnO9WTHT33l0e919ucvXlfSzuCtl48hYNEPVxwjbuk5QG88AGAveiGYruPlpS8WUG2PY+ZjT0tS7u7NAcnPQ2UmTwW9d48mwS3Pd4PMT2WxyW8cvGeOzf9NL0MAEG9XTN7vHvnd7yhZg69+mpEPLYrszzZZda7Ec8NPW5y6LxPB0A94JkdPMBqRj3krTu7nQAbPTxdT703TY88IMrLvL40hTxcLec4y5oNPilTPT2xmcC8pUmBPM1qoTzoDCS9EtL/O267+Tzm3v28ZSSsPSZvSD17ygG8Dc75vI/abz21ECW9FwnPu5188jxVxTg802MoPO9Nn73ssV29Kne3O6mY47yy8Oa8DR1vu19zgT24Cv68ggxxu+Q9PT0WiKE8l62qPOi0Sbz0No86xCsmPMee9Lz9XUk9LpEvPVbMI70pm3e83GAsvMlxDb3asqS6glT3vNjlIT1JBUy7ey8Eu7/jFD3R36I7lOCVu8JXK71GMII8i6KdPRzkiTsqBsI8ljk9vCYH4rzS7rq6yIhGPUZwOr1BUgi9Yi+2PAcpBL1xGb48A9clvRJU37zNK+88xKlMO3PJ0rsjLCW8zEoPPZ5AlD0mpSU7z7pZvarXqDzINBQ9/wefvca0pTzLFaw5YSoevb770Tyrvjo9Cw9/PSg36bwKwGq8jc7IPO2ycjwfRBc93tOmu1XEWL33W5u7YhNjPKDTwLzyJcY8BK+SvPnTXb0wuf+8gnJKvawvRj13Hie9Q4CdPDs4zzx5/vu8qpaKvBqL+br2kak6/RNlPaQTHD2fhzG8ANQWvZsFnD2QlHi8nHCTve5r3bupYiE9psC+PNQ0uTx6Enu9zSeyvBKv1ry7O6O8rntKvYfHmryeAC08Rzyiu+gQqzx4R7Q7Q26TO8grQL36aRo9lGa7vCr9eL1e5QC9sHuuOrSYEryBX1q5GXSyvFXl0TyDJ0K99qJivS6L1LzG4be7bAZevW9p+btFXky7PhwNPWcSF73PGPa70YwZPKfIq7zIs448Pwh7vSobsjyBmlC93mwyPeyETr07ZWc9npCLPVaI1Lw3pSw8t/AtPaVkE7pZcE88Uii2O5y1ibsW4oy9DyI2PAt9Yz0DuS694mExPR9g7zzOzxE8QmB2PKZf9zt/uS67qguhO3U9P7xNFRy9nVWvve8MPz2Wrnw9d5BJO2N3WT3prSi72aboPLhFe7xpoxw9Xw+SPMUtFT0llQW8UK+xvL5iWr047ru7oS8rvCq99LskxgM93edEPOKOkLzRCoy8FJ9WPZIEWz2c+ZU7Kd+cvWKwCTznS7a8zlQivdD8N73MDe27w64MveFdDjz5Os08iqxnOs0HC7ynO/A7h+RevP54SjxpExQ8vmynudozzbvbWg29X1YUPWfNVz1oxNW7pgDOPO8XiTzLqj29nNzAuzC5pr36soW9wiBmvXL9WDz6mEq9Y8TKu43sXbxgwiO8b+OXvFIH7TuQtia8lQc6PDsMEb08p5g94z5VuxIv3LtvOKw8f4RHPMiZSDse1EW9DJFpPNL8ljxapo494FV3PVuyvbrG10K9O6xCPMkYUTzb8/K8B8KcvT3wM70q+oG9JQyHvEG3cj
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.test.ts","s":49,"e":63,"m":1777077183977.7412,"t":"});\n\n it(\"即使保留 legacy env 也不应回注 mnote-web runtime\", () => {\n process.env.NEXT_PUBLIC_MNOTE_WEB_BASE_URL = \"http://127.0.0.1:3104\";\n process.env.MNOTE_WEB_BASE_URL = \"http://127.0.0.1:3104\";\n process.env.NEXT_PUBLIC_MNOTE_WEB_TREE_SHELL_ENABLED = \"1\";\n process.env.MNOTE_WEB_TREE_SHELL_ENABLED = \"1\";\n\n const runtime = getMnoteRuntimeConfig();\n\n expect(\"mnoteWebBaseUrl\" in (runtime as Record<string, unknown>)).toBe(false);\n expect(\"mnoteWebTreeShellEnabled\" in (runtime as Record<string, unknown>)).toBe(false);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":1,"e":60,"m":1778336284573.613,"t":"export type MnoteRuntimeConfig = {\n /**\n * 是否启用 Convex(自部署)链路。\n * 说明:该字段由服务端在运行期注入到 window.__MNOTE_RUNTIME_CONFIG__,用于客户端按需关闭 Supabase 相关能力。\n */\n useConvex?: boolean;\n supabaseUrl?: string;\n /**\n * 服务端/本机回源用的 Supabase 地址(通常是 HTTP),用于避免 FRP/自签证书导致 Node 侧 TLS 校验失败。\n * 说明:该字段会出现在 public/mnote-env.json 中,但它主要给服务端读取使用。\n */\n supabaseInternalUrl?: string;\n supabaseAnonKey?: string;\n backendUrl?: string;\n onlyofficeBaseUrl?: string;\n onlyofficeBaseUrlWeb?: string;\n onlyofficeBaseUrlDesktop?: string;\n onlyofficeStorageHostOverride?: string;\n onlyofficeStorageHostOverrideWeb?: string;\n onlyofficeStorageHostOverrideDesktop?: string;\n cloudflareAppOrigin?: string;\n onlyofficeProxyOriginWeb?: string;\n onlyofficeCallbackOriginWeb?: string;\n onlyofficeCallbackOriginDesktop?: string;\n /**\n * 编辑器 host 选择。\n * 说明:文档页正式主链只保留 leptos_tiptap_island。\n */\n documentEditorHost?: \"leptos_tiptap_island\";\n /**\n * 树域 renderer family 选择。\n * 说明:默认主路径已切到 rust_family;React fallback 仍作为过渡兜底保留。\n */\n treeRendererFamily?: \"react\" | \"rust_family\";\n /**\n * 是否为桌面端(Electron)运行。\n */\n isDesktop?: boolean;\n /**\n * ONLYOFFICE 文档服务器拉取 document.url 时,如需使用 /api/onlyoffice/proxy\n * 规避 signedUrl 的 token 参数冲突,可把代理地址指向一个“文档服务器可访问”的公网 Origin。\n *\n * - 桌面端本地运行(window.location.origin):通常可不配置\n * - 通过 Cloudflare Tunnel 使用远端 ONLYOFFICE:建议配置为 https://app.<你的域名>\n */\n onlyofficeProxyOrigin?: string;\n onlyofficeCallbackOrigin?: string;\n};\n\nexport type MnotePublicRuntimeConfig = MnoteRuntimeConfig;\n\ndeclare global {\n interface Window {\n __MNOTE_RUNTIME_CONFIG__?: MnoteRuntimeConfig;\n }\n}\n\nconst parseRuntimeBoolean = (value: unknown): boolean | undefined => {\n if (typeof value === \"boolean\") {\n return value;","v":"GE+GO7v9lT2XyCW++2iKvVRXDD1YGzS97PrMuwMJHrwDu5w8HAFivervRr0QrZA9HMeTPUERw7kV3hO8mi9RvWcWFbyyix290sDDPCIwQzwnvrY7QqiFvKgwxbwxifm87CUCPQPRTj28duo8dQUoPS6fZL0aTjA8TTRhPD0zcLskSg68kH7Hu/AZLb3iJsK8ONBZvbgmPLxBPps8OqKXPMYF7zxLxgU7jf39uz+uJjwbeZQ9JMGBvMwTPD2qr7o8eXidPbmutb0hrok9rwEFvZ3BMD2Nr0a8b+SZPWuwHD1vm2u9b+Pmu7kMbDxmiyy9eYcmvZcyyD1thxe8xfRNPa4/VD040Am9GRU2vW5Pqj2wKS06A6oLvW0Czjy5hZc8il6qPB/9Pb2Ukiu9AGZlPIQb47wtRQa9hG4jvWeKCT1SX1G7CIDpvCF3sTx7H0w9XqE2PfNhR7xAdNe8h5wIvVh78ryiAgk9Z5QrPV8ph71eJrA8EAduPHIRRr3K/XU9pii+vFh5XD1mV4K7qZ2KvCGZLz26GzO9YZBWO1MowrzEhP46xoftPCdly7q3Zew8OzyOvBFDsryq2xs8UA2ZPSBdbr31V3e77HZfPdzK2LwNRRQ9PicfvCEMTDyKFXk9Gv0SPKxOOb3eIh88qNFSPcOUGDxrqOQ7tCYjvbQshTxCnbg8fJ/EvR4A6rzP0C685pomPOvmEz0LuOg8axrSPKWsOL2wjay77JJ/PBDAvLueHY48SC1cPKCooLpRHFS7FdmzvOxe1byAL5g9zAbMvAxvzby+mWA8tcxyvJ4CAj24oNC8GbtdPSEjRzyuI4G90yyjvDRTBj0Gck28lhrUPCSaFz3vfkw9T7fRvJQLRz1ZvjE7RaxdvfRAYTyuY2U9aMt5PN/uertNUI69xrbDvMWidDzftz88SlO6O4jpJr3MYhw83FCUO7GYVjyJrh29CHdMO3173718erY8Dma6O+MXfL1K/A69g788PIcE3bxtw/g7N2HyvJIIvjwMWwS9Xj1KvfByhLzqDdi8cwFqvaIkwzzC6sO7yKA2PU4yiL1hjyI87++dPBvTITxTV5I8P6FxvYZ6Mr0MTaq81uiBPdJsUb29v0m7TNhUPUyKhLxHs128Z+qFudclmjwTtyI8io4pvStty7xIo0q9RSZwPK5c+TyEBZ+8vgMYPXqH0Dw77189izMZPV9WE7xBX0m842PRPF3027z2ixq8S2mZvWlLxjyb9588Z9MZvF1YpTzoUbA8RNSmPa7mHrwOFFc9IBRzPNwMvbz0m7689n5/vRAb9bw9aEU7q1T2vCYImL1Uosg8TR/IPFnuUrufF348DPRTPbiIPz2NF6w8TuEevcB3LTwi85u7lb68PJohAr3PCKe7BMcYvZuWDT1GRC+9b/gDO0deCzw7n0y9B/d3PHelDzls3G49Y3ikO170YDyHjDK9dh+NPS9MBTvDEyY8oywmvGT0TbymcEC9AnbtOIxXD73GiQe9BE6xvGYZjLvfGfq8tS/xPMNfFzz4Rt27Bp0WvQWqWj3nq8o8OQLmPBkC2rwxTls9Quv/vGM2LDyqxI48HN/hvEC4hrzjCMi8rZNBPeFM0jsY8I89Y6YzPVN5IzypySm9deaCO0vrkrxDbSa7TOoEveMAk70XKK+7E0jMvLSkmj13nvu8akRIPXONlT38MA28u24FPeFg67zf56O8fX
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":49,"e":108,"m":1778336284573.613,"t":"export type MnotePublicRuntimeConfig = MnoteRuntimeConfig;\n\ndeclare global {\n interface Window {\n __MNOTE_RUNTIME_CONFIG__?: MnoteRuntimeConfig;\n }\n}\n\nconst parseRuntimeBoolean = (value: unknown): boolean | undefined => {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n};\n\nconst parseDocumentEditorHost = (\n value: unknown,\n): MnoteRuntimeConfig[\"documentEditorHost\"] | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n if (\n normalized === \"leptos_tiptap_island\" ||\n normalized === \"leptos_tiptap_runtime\" ||\n normalized === \"leptos_tiptap_inline\" ||\n normalized === \"leptos_tiptap\"\n ) {\n return \"leptos_tiptap_island\";\n }\n return undefined;\n};\n\nconst parseTreeRendererFamily = (\n value: unknown,\n): MnoteRuntimeConfig[\"treeRendererFamily\"] | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":97,"e":156,"m":1778336284573.613,"t":"};\n\nconst parseTreeRendererFamily = (\n value: unknown,\n): MnoteRuntimeConfig[\"treeRendererFamily\"] | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n if (normalized === \"rust_family\" || normalized === \"rust\" || normalized === \"tree_shell\") {\n return \"rust_family\";\n }\n if (normalized === \"react\") {\n return \"react\";\n }\n return undefined;\n};\n\nfunction getServerNodeBuiltin<T>(moduleName: string): T | null {\n if (typeof window !== \"undefined\") {\n return null;\n }\n\n const processWithBuiltin = process as NodeJS.Process & {\n getBuiltinModule?: (id: string) => unknown;\n };\n if (typeof processWithBuiltin.getBuiltinModule === \"function\") {\n const builtIn = processWithBuiltin.getBuiltinModule(moduleName);\n if (builtIn) {\n return builtIn as T;\n }\n }\n\n try {\n // 说明:某些 Node/打包环境仍保留 CommonJS require,这里只作为兜底。\n const runtimeRequire = new Function(\n 'return typeof require === \"function\" ? require : null',\n )() as NodeJS.Require | null;\n if (runtimeRequire) {\n return runtimeRequire(moduleName) as T;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nconst readFromEnv = (): MnoteRuntimeConfig => ({\n useConvex: process.env.USE_CONVEX === \"1\" || process.env.NEXT_PUBLIC_USE_CONVEX === \"1\",\n supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL,\n supabaseInternalUrl: process.env.SUPABASE_INTERNAL_URL,\n supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,\n backendUrl: process.env.NEXT_PUBLIC_BACKEND_URL ?? process.env.BACKEND_URL, \n ...(parseDocumentEditorHost(\n process.env.NEXT_PUBLIC_DOCUMENT_EDITOR_HOST ??\n process.env.DOCUMENT_EDITOR_HOST,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":145,"e":204,"m":1778336284573.613,"t":"return null;\n}\n\nconst readFromEnv = (): MnoteRuntimeConfig => ({\n useConvex: process.env.USE_CONVEX === \"1\" || process.env.NEXT_PUBLIC_USE_CONVEX === \"1\",\n supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL,\n supabaseInternalUrl: process.env.SUPABASE_INTERNAL_URL,\n supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,\n backendUrl: process.env.NEXT_PUBLIC_BACKEND_URL ?? process.env.BACKEND_URL, \n ...(parseDocumentEditorHost(\n process.env.NEXT_PUBLIC_DOCUMENT_EDITOR_HOST ??\n process.env.DOCUMENT_EDITOR_HOST,\n ) !== undefined\n ? {\n documentEditorHost: parseDocumentEditorHost(\n process.env.NEXT_PUBLIC_DOCUMENT_EDITOR_HOST ??\n process.env.DOCUMENT_EDITOR_HOST,\n ),\n }\n : {}),\n ...(parseTreeRendererFamily(\n process.env.NEXT_PUBLIC_TREE_RENDERER_FAMILY ??\n process.env.TREE_RENDERER_FAMILY,\n ) !== undefined\n ? {\n treeRendererFamily: parseTreeRendererFamily(\n process.env.NEXT_PUBLIC_TREE_RENDERER_FAMILY ??\n process.env.TREE_RENDERER_FAMILY,\n ),\n }\n : {}),\n onlyofficeBaseUrl: process.env.NEXT_PUBLIC_ONLYOFFICE_BASE_URL,\n onlyofficeStorageHostOverride: process.env.NEXT_PUBLIC_ONLYOFFICE_STORAGE_HOST_OVERRIDE,\n onlyofficeProxyOrigin: process.env.NEXT_PUBLIC_ONLYOFFICE_PROXY_ORIGIN,\n onlyofficeCallbackOrigin: process.env.NEXT_PUBLIC_ONLYOFFICE_CALLBACK_ORIGIN,\n cloudflareAppOrigin: process.env.NEXT_PUBLIC_CLOUDFLARE_APP_ORIGIN,\n});\n\nconst readFromPublicJson = (): Partial<MnoteRuntimeConfig> => {\n if (typeof window !== \"undefined\") return {};\n try {\n // 说明:桌面端与网页端共用 public/mnote-env.json 作为“公共环境文件”。\n // 桌面端运行时 process.cwd() 会被 Electron 切到 desktop-next 根目录。\n // 网页端运行时 process.cwd() 通常为 wolai-frontend。\n \n // 说明:这里不能直接静态引入 `node:fs` / `node:path`,\n // 否则客户端 bundle 在解析该模块时会把它们也当成浏览器依赖。\n // Node 22 优先走 `process.getBuiltinModule`,其余环境再兜底到 runtime require。\n const fs = getServerNodeBuiltin<typeof import(\"fs\")>(\"node:fs\");\n const path = getServerNodeBuiltin<typeof import(\"path\")>(\"node:path\");\n if (!fs || !path) {\n return {};\n }\n\n // 说明:Next standalone 产物的 server.js 会执行 `process.chdir(__dirname)`,\n // 导致 process.cwd() 变成 `.next/standalone`,此时 public/mnote-env.json 位于上层目录。\n // 这里向上查找多级目录,确保能读取到真正的 public/mnote-env.json。\n const candidates: string[] = [];\n let dir = process.cwd();\n for (let i = 0; i < 6; i += 1) {","v":"3daPPfTonbzotQa+fQ6nvdASQz2EvYi9ytbXvITq3jw2aCA89O6nvatCMr1yOoU9COumPXtw1Twwh/W8J05nvQqLuzmE0Ys8D4YQPZmH2LxRDK08FZCHuxfgyLxcX4W9CwNyPZv2nz27RWA82xjyPAAmA706CO881Z13PDtCWj1MMhw9QgM4PC8T9707N7q8Or1PPZZQEjwlX208DHgbvX6/xDuqbh29H1OQvEMcRL2frKI8O+movAvrrD2luFQ9roBmPc6rlL2w/gc9uDYkPNuxsjzF2Dq9Av/RPch2dj1YwLo7rI2gPBw16jqCe5+8lQWFPGWitTwBc1Y7XPbMPZy+yDxUJ2a8Oj8tvcOPHT3AijI9JujOO2tSgTqWFzg6MP8OvFSipLyRSgS8KgZ4PdSbr7yP7nm9XIUgvf9b4DwGSki86PPevMRXlT0bhOw84kN1PVs7UruJejQ8DFvNuphdGb2VVwy7FO88PeVEIDyZtDu9bbHLPHb6tb2SQTc8VOwtvBKRDD0KWK28tlTivMJWujwrfqO8lsOIvOskGb3+sTw9T511PRocfDw17KC6U2PCOruiOr0mpSm9ro9MPWg1SLl1wm69TgQ3PQ4WWr20URU9ISAPPMZN2LyHilQ9Mwn3PGODaryPiw+88IuIPbgPSD2lJCo9ITnfvHQdpLztijY9KBtIvZVflLkT0Vg7MMV0usHyWD1DMq08lsFBPT7Y2bwTVRE7rTYOPLJgRrkH7gQ987FOvAPQ87sbhQu9VkVBPPoGl70xbo09nr1pvFSAaL1vJA69AiI1vRvkrjxjE6E8lXWnPKzRFDxjuMC8bCiYO4KFLDzaIv+7jXETPWdOnDyVCuk5ceUZvY26Ij3iCZy8qijZvLK6dLwsqVY9ZpFTuzh1BDw9TKW900aqvWzxILwnzx+8j5QOvHu6mTz/xqg7cRyEvLgxgzztj4G9KLQCPetmGb03p3Y9Q8yjPOxFRL1Ij/q8TuKbPGS+Tbs/L987QvHqvPnZvTssV7C8cymBvMwDXbu+7Ue8QXVuvU2tiDxGB+y7wRtFPMKoc72oDx46Fw6Tu/ee0zyDq3Y8JYGqvYAMMj1sDlm9KUGAPdG+Ib0fYtA8tSEfPcR/Krywb9M7mRhPvahPULxngRW9CKI4uyZ2ebzBHZm9F+kLPT13Cz1Qinq9dtz7PA4VMj0qdaI9WjMhPX8G+rxzS9S8i3kjvIv6U
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":193,"e":252,"m":1778336284573.613,"t":"const fs = getServerNodeBuiltin<typeof import(\"fs\")>(\"node:fs\");\n const path = getServerNodeBuiltin<typeof import(\"path\")>(\"node:path\");\n if (!fs || !path) {\n return {};\n }\n\n // 说明:Next standalone 产物的 server.js 会执行 `process.chdir(__dirname)`,\n // 导致 process.cwd() 变成 `.next/standalone`,此时 public/mnote-env.json 位于上层目录。\n // 这里向上查找多级目录,确保能读取到真正的 public/mnote-env.json。\n const candidates: string[] = [];\n let dir = process.cwd();\n for (let i = 0; i < 6; i += 1) {\n candidates.push(path.join(dir, \"public\", \"mnote-env.json\"));\n const next = path.dirname(dir);\n if (next === dir) break;\n dir = next;\n }\n const existing = candidates.filter((p) => fs.existsSync(p));\n if (existing.length === 0) return {};\n\n // 说明:standalone 产物可能包含 `.next/standalone/public/mnote-env.json`,但它通常是构建时拷贝,\n // 用户更希望修改“项目目录下”的 public/mnote-env.json 即可生效。\n // 因此这里优先选择不在 `.next` 目录下的配置文件。\n const isInNextDir = (p: string) => p.split(path.sep).includes(\".next\");\n const filePath = existing.find((p) => !isInNextDir(p)) ?? existing[0];\n\n const raw = fs.readFileSync(filePath, { encoding: \"utf8\" });\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed as Partial<MnoteRuntimeConfig>;\n } catch {\n return {};\n }\n};\n\nconst normalizeRuntimeConfig = (cfg: MnoteRuntimeConfig): MnoteRuntimeConfig => {\n const isDesktop =\n cfg.isDesktop ??\n (typeof window === \"undefined\" ? process.env.MNOTE_DESKTOP === \"1\" : false);\n\n const onlyofficeBaseUrl = isDesktop\n ? cfg.onlyofficeBaseUrlDesktop ||\n cfg.onlyofficeBaseUrl ||\n cfg.onlyofficeBaseUrlWeb ||\n \"\"\n : cfg.onlyofficeBaseUrlWeb ||\n cfg.onlyofficeBaseUrl ||\n cfg.onlyofficeBaseUrlDesktop ||\n \"\";\n\n const onlyofficeStorageHostOverride = isDesktop\n ? (cfg.onlyofficeStorageHostOverrideDesktop ??\n cfg.onlyofficeStorageHostOverride ??\n cfg.onlyofficeStorageHostOverrideWeb ??\n \"\")\n : (cfg.onlyofficeStorageHostOverrideWeb ??\n cfg.onlyofficeStorageHostOverride ??\n cfg.onlyofficeStorageHostOverrideDesktop ??\n \"\");","v":"IWAUPWi72ruGogq+JPPXvYL7HD1e/Ie9G9c3vUGBwjwzcKi6+jeOvYo1Xr28zCk9X5+UPUxJ0zvyqm272vnbvN45o7wegro7XkHcPL8hU7zS+ng7fsu0PMn2vTzto0O9BCqVPcBHlj1dTAQ9HQ6APISiOb0uVhM8NJR3OnVZTT3iwMM8xqgBuzBi1L3hKJi99T9/PFjOZ7vjWY48PfRavUf3FjsK9gK8Na8VO/Ijk71TYRo9ezBEvUX5vD3OTs48chKUPfTVvL2LZIc7+S6rOx65fDyxSbW7NuOVPaqjaj1GnKU8bkgwvIKX5zyEnsS8oveUO33mTT24a8m84wqNPZfiEz1zESu905IQvZv6wD0Fpzk92qxMu7SRKrsIEnc8LjQqvDLcE7xxIac8y9RTPGWyBb1wOyW9qq8GvaHlTD0l3Ne60890vDSFeD2cbSe9o2CAPd7GEb3RKfC8w3iQPCw4DL04GiE8bzhfOpX4pbyafiS8J1PjOwhghr22j4C8x1mXuuFzyTxFMYy8LZxYvemtmzyfCi69pBwhvGwed7w2jo48rv8zPdMgFTzbOqs8BjecvEwqfb1Vgba8zluaPWCAoLxmecW8jdTFPOuzvbzdVEE9VfSsPJcZ4bu74b089XmCvOTYGL2y85S8kpuhPU9F+jtgCD49BmOBvEPbiDwy+3g9VhC6vYqn77xBDJY8S6XlPIATjTykK0o8RRfZPIOzHL2W4jA8EttVO8QspTud9+w81HRWu/hZt7wpt6i7vyEMPby2iL371D89xtFbvJMcQb2u7Ne8kR0PvDaRpTwqPsm6TY8kPIRvODyeNaC7XOUsvKK+TTxue5q7/sOOPJSIGj2VPic9V0D+vEZ1AT2eU4G8iCsbvWiW1TwuaKI9qPmpOpiU8Tufls+9bQE/vYaqQLxlmEs82PggvCsCvjuDzeA8Lpp2vUA2KjzKsrG8V2/PPOFNKL0ODKw9q1IGPfDSDL1WUFC7bA6SvPqgLr3t6MA8INgavSAF37qDlBW95IiuvKKUFD0molq8gviDvRmAibsBi928eIXmPP0xT73QHca8QyPdOz4vrDzKyGQ8XLiHvY+eKz2WfSG9rv2VPdyoIL0XrxQ9NYZZPbOVI7viCea8M3UPPLHU3bohSGq8hXePupN2uDm1Qq29weDvPClp4zwOIgu9GGI7PeVqajy29WA9LUkiPVvrAr0V2qK8NGNdvEANFDyE0lK9Pl/mvXq5KzxnfwQ97pUovCbODz3eJKQ83DBgPTavAzwE0Ig9qlTFPHeH17x8Las6lEb4vCs/67ym1FC8H43/uwuKMLuODIy8o6/+PG3vCLuLhEU77MAzPBiLjz0VxJo8MKhAveVZSTyK+hC7A/KJu8Tz2bzqwJG8JHzovOFTSj3x9fS8T7RmvN89mrwf8py8YGGlO8BnpDwIhEC8vAzEuxl26TstyCy843EEOqUl8ztHWIw9rfNaPTfA3bxjszu9SkUqvKUJH73utxm9e4MEvfkHuDvh+iu9J7SXPCoxkbwv
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":241,"e":300,"m":1778336284573.613,"t":"\"\";\n\n const onlyofficeStorageHostOverride = isDesktop\n ? (cfg.onlyofficeStorageHostOverrideDesktop ??\n cfg.onlyofficeStorageHostOverride ??\n cfg.onlyofficeStorageHostOverrideWeb ??\n \"\")\n : (cfg.onlyofficeStorageHostOverrideWeb ??\n cfg.onlyofficeStorageHostOverride ??\n cfg.onlyofficeStorageHostOverrideDesktop ??\n \"\");\n\n const onlyofficeProxyOrigin = isDesktop\n ? (cfg.onlyofficeCallbackOriginDesktop ?? cfg.onlyofficeProxyOrigin ?? cfg.onlyofficeProxyOriginWeb)\n : (cfg.onlyofficeProxyOriginWeb ?? cfg.onlyofficeProxyOrigin ?? cfg.onlyofficeCallbackOriginDesktop);\n\n const onlyofficeCallbackOrigin = isDesktop\n ? (cfg.onlyofficeCallbackOriginDesktop ?? cfg.onlyofficeCallbackOrigin ?? cfg.onlyofficeCallbackOriginWeb)\n : (cfg.onlyofficeCallbackOriginWeb ?? cfg.onlyofficeCallbackOrigin ?? cfg.onlyofficeCallbackOriginDesktop);\n\n const documentEditorHost =\n parseDocumentEditorHost(cfg.documentEditorHost) ?? \"leptos_tiptap_island\";\n const treeRendererFamily =\n parseTreeRendererFamily(cfg.treeRendererFamily) ?? \"rust_family\";\n\n return {\n ...cfg,\n isDesktop,\n documentEditorHost,\n treeRendererFamily,\n onlyofficeBaseUrl,\n onlyofficeStorageHostOverride,\n onlyofficeProxyOrigin,\n onlyofficeCallbackOrigin,\n };\n};\n\nexport function getMnoteRuntimeConfig(): MnoteRuntimeConfig {\n if (typeof window !== \"undefined\") {\n // 说明:浏览器侧禁止再兜底读取 NEXT_PUBLIC_MNOTE_WEB_BASE_URL / MNOTE_WEB_BASE_URL,\n // 否则会把 internal-only 的 mnote-web 边界重新泄漏回客户端。\n // 客户端只信任服务端注入的 public runtime 配置。\n return normalizeRuntimeConfig(window.__MNOTE_RUNTIME_CONFIG__ ?? {});\n }\n const isDesktop = process.env.MNOTE_DESKTOP === \"1\";\n const publicRuntime = readFromPublicJson();\n const envRuntime = readFromEnv();\n // 说明:桌面端需要优先使用 public/mnote-env.json 来覆盖 build 时注入的 NEXT_PUBLIC_*。\n // Web 端开发时则应优先使用环境变量(例如本机 http://127.0.0.1:18000),避免被\n // public/mnote-env.json 中的远程/自签地址覆盖导致浏览器登录请求失败。\n const merged: MnoteRuntimeConfig = isDesktop\n ? {\n ...envRuntime,\n ...publicRuntime,\n isDesktop,\n }\n : {\n ...publicRuntime,\n ...envRuntime,\n };","v":"Y/ULPWBYCT3Fmha+ihCqvc0qcT1oL3+9qp5hvO+pV7xqTB887kfDveVklb23UUs9koYgPU9lND1pWQ+9bvR2vRY+S70O3Zy7qG1xPGxjozsBJkM9himVvPdrCz3NYK67DP2VPDG9XD3gblM8Lcx/PeYynL2X5uS7T1RKPZP5Nj0SSS68s5rkvD1O0r3JL4K9YvYAvSXtmLqr/A28M4vwvP+02DzrirI7JmaLPDBRtrzuJIA9OlnmvAWwfT1UnVs7MgUJPa7y7r2zslQ9nxKMvHWZNj1kuEa9H0b3PXRplD16B6K81XScPAgcIz0muOC8siFfvN56bT056gi9SOlVPRlxkD3bxsM7HHUevODcrz38M6272merOweuGjxRln88CzVGPA86D7xJnQW9i+scPdbaQb3dSjO8OnjEvEcu1zxljtu84Ls0vZnYRTwtosY82augPImXM7x2kCG89FKmuoaw6bwa/j483FiIOwXzG73zJhK8sOZ7O7/obr13Oag8h6oHvblZDD3CAnG802Uuvb6uuLtuyXS7IRn+vNO6V73mtwa8m+dIPdWUCT3c7XU8wkNFvDT59bwvp1i79DGAPd+RLb1poTa9Dk7qPLdSpzzw58I8Fjo8vU+QHjy8tdG7m7KJvGN4Sb3Jl6W7vUePPZCKLT1psAY8dU1mvP0WtDzoXTE9+3KCvThuU7yPJ7w76CkRO6zzojyEM9I81AyaOxbBYrwIQee7797UPAv4QzzrS5I7NjDrvBoTW73VzQS9ab9du2poO71g7hk9KGhrvNKeQ71X6im9aVAxvMSP3TzadDY8tdGKPbptJT1KEwS96t+cvOj/D7vARAs8+LgCPXlFcT0sV048sCtlvPawGD0fssa7Y5dGvdiaVTwUXpM9sVp7PBXKrby1ZWm99ZHkvJA3zLwZ2iQ82BCvu3HeMLtta4c8jKSlvOJ1AjyT2J+8WUIyPHirjrwWIAg9jqW+PNkRpbu+EAa9G4jKPDlVRb13igS7rQYOvQM4Lzxfys28fN9IO3ZizTpzwJ68rNJUvUeq9jyNVX68xLjqPJqtjr1gXRa8wekbO2eJ07u+PFQ8adZdvbghDryPRQu9ZANnPeoSjr21e2M9QwVZPSDs3LxJ6R69+ZMKPdPDFLxVuRS8Cqn9u4DiML2w2qi9B0pWPYIDWz0FIJS8H34fPUmOrDwhMxE95duXPC077bso2Da8dNxEO5RBJry3RFq9W5hcvQb7Pz1mxzc96EC8vAERND13d4w8pxLWPX7fhLx3QIU9dcQhPaiNdjuCqp648Wwjvb6jCr0f84Q8qn2PvHNYz7wfzPO7B5aavOTUzDsp2v482l34PBpXgT37DG45f2OPvbSn3jyR7w08dCOZvBj/P7y0Enq7k1+MvOqK8rpjusO8Cgi/uzbTorzxK128DoOkvKRQsLuSmkk8biEMvQS3KTzB29y6GA6FPTbpIjxQsni8ti4wPTdYArzkweq8of+QvEjyN73MBQy9oYAgvT79Ybz67Em95oVSPB5pNblEiGc8
|
|||
|
|
{"p":"wolai-frontend/src/lib/runtime-config.ts","s":289,"e":307,"m":1778336284573.613,"t":"// Web 端开发时则应优先使用环境变量(例如本机 http://127.0.0.1:18000),避免被\n // public/mnote-env.json 中的远程/自签地址覆盖导致浏览器登录请求失败。\n const merged: MnoteRuntimeConfig = isDesktop\n ? {\n ...envRuntime,\n ...publicRuntime,\n isDesktop,\n }\n : {\n ...publicRuntime,\n ...envRuntime,\n };\n return normalizeRuntimeConfig(merged);\n}\n\nexport function getMnotePublicRuntimeConfig(): MnotePublicRuntimeConfig {\n return getMnoteRuntimeConfig();\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/rust-web-main-execution-boundary.test.ts","s":1,"e":32,"m":1777367224054.7458,"t":"import { describe, expect, it } from \"vitest\";\nimport { RUST_WEB_MAIN_EXECUTION_BOUNDARY } from \"./rust-web-main-execution-boundary\";\n\ndescribe(\"RUST_WEB_MAIN_EXECUTION_BOUNDARY\", () => {\n it(\"固定 3000 公开入口由 mnote-web 拥有,Next 只能作为 legacy compat\", () => {\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.publicEntry).toBe(\"3000\");\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.mainWebOwner).toBe(\"mnote-web\");\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.legacyCompatOwner).toBe(\"next-app-router\");\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.nextAllowedDuties).not.toContain(\"main_web_owner\");\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.forbiddenNextSemantics).toContain(\"主 Web gateway owner\");\n });\n\n it(\"把主 Web 执行面和允许保留的 React island / legacy bundle 明确分层\", () => {\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.rustOwnedPlanes).toEqual(\n expect.arrayContaining([\n \"web_gateway\",\n \"document_shell\",\n \"page_aggregate_transport\",\n \"tree_realtime_stream\",\n \"search_shell\",\n \"ai_bridge_transport\",\n \"mindmap_object_shell\",\n ]),\n );\n expect(RUST_WEB_MAIN_EXECUTION_BOUNDARY.nextAllowedDuties).toEqual([\n \"legacy_react_bundle\",\n \"legacy_app_router_compat\",\n \"island_asset_source_until_migrated\",\n ]);\n });\n});","v":"3SI9PHHhwjw8rkC+SUkvvTw6Zz3KG/e8s1KdO7Eelz0QcS8894QyvT/Rl7z2f1s9atf3PCCIx7ylaUi90kd+vaDIgrwoYu28LZqCPXN0MbznJWy8uwolvYFy4bxlHYK8AciPPcpwBT3LM168ufUrPR4mg7zi0qA8gZFyPZzJczzmAeS6JlL1u2VOOL3UXQm9c3g5vULyDjuWmDG97BLuPCHxkzyXL8i8sxWWOvBbi7w2yKM9nUutPE6MXT0r8Hk8sdN7PSQrO706b5U8RjkYvfX1tzzsc6C6i+wCPq/lHD1LYwY8jm6hPGJK6DyTb/W8eTBSvMPqvDzSPh29IB67PWiaqT1TVgS86lojvVy5JT3KlDa7yBy5uWIeBz0nKUQ89fYAO6Dvhb3KTV+9Sd5uvHNYiby1VMy8Db1BPP/dhj3NZhC9rYTau5NnDT2S6788fkWCPHdigLsQ5Ko8kZFgu/DS3rxsg7A9TYsiPcQE7LylOBA8XD+wu4NwSb2+pL28I8tEvTXb67uRbCy9P4mGvFf3Cj0vRQA83iU0u4jP/rwgfhg7JS1pPeJzkruT8gs9BXH3u4MXBL2WtNQ6vDUjPb8ncztRKXq8b6uvPO4nRL2f28E8h6D2u3gFEr17eu88aTomPAFrDL2a17+8ZEYpPQx+cD2rB+W7zeBkvZNIKTwc2Yk82MJtvQj0/DuRHxA899HLvP1kcTx6E4o95KQvPQHJJL2lgqa8eo/HO5r5ujzS7CM9mlBNu6WyBL09Q3g7+FBUt+aFr7x7nks9weaWvGhiE72lBJe8gSUpvSR0gj3yCf28VSbcPMTRTzyUY9C8WloJO2/wzLqsUpY78WoEPS8kHz3HRG+8dAd0vPGUpj1T4Is7B86SvcY+Dzx2+DE9DB4xPAvmhT27SrS8LruSvGJhnrvDzDA8v/BAvfw1+bwUMTM8peECvUwJ9Dsdop68y9oqvKQjf70d1jQ9Yz9XvPuNgL29uTK9dnOwu4HtN700sUO82SIYvQjOrzxQFdq85Bxyvd9N3byltbG648eFvQ5nDjwp8Em8xIM9PYCQJL0pvqY7VXNzPKs5pju/S5K6pqqYvZ/ftDx6Qie95lUIPcll5rywXSo9PVd5PWAlIr0FcaS6R+4qPQYIkTwkYOY8iz9tPGeQWbppPhe9ZWhsvH8WVz0pPxm94T8vPS/qI7s60PM8kXTEOyyXfDzm3QA6mzzpOKCsqrvF+W+8b8OivbOFdzyq3TQ9ItrlPPTtUD1i0Oe7udqsPEOzpzsZvZe8S1yOPKen3DzNkgc8Y4kLu3uXar0EHtK8hfYEOw4rubvlM288GTLvOxYZIzz8Tcy8EYhqPQrlOj2xLJI7jaOqvatMkjvRHuy8AOh1vG5gfL2dOUM7Cy1TveNMQD1ba+o8F63VvDAm6rwNeUm63M/mvC7bnDqrVFg8hYe4vIuxnjtD4q28g5cwPfy/UD3WpbC8FvxiPBOUJj3tgfa85ZGLPOBzj702+2y9oWm2vD3d8zxbhR29iKqKu8Cc+7ytj188V0u3vONpiDzUu2C80Y6+vOIZI72iMW89miPbu8RJ0LvMARY9RcYoPGBbjruFEhW9xsQ8vIQ89jzHuKo93SgJPe0GzLzBF4G9Zjm0PMUja7spWYU7QtmSvUkiZb2nh4+9l9qjvI7umrluiYm9VPXyPNBHBz0T3nA942Q4PA8sSruRrIO8Wkg7vdKzmjnMKJ67WYVJvBVfGD0BA1K8z49aPSg0fTsAt4g7AU2JPcTbxjwvcbA7q5Rlvf45MLxw6iq73bOavE/nMz0LDty7iLdOPXmcBz3GTF+92eHcPNs6bT2RBhG9ug/3vF0iiLwh6h28maE+PRK+Jj252l+9cvwBPYC4mLzsB388WcHuulqRLjtc/H88zNj2PMXxsDyUIvc7vJMMPcRovbs8PWk8um+uvHh7yLydNkU9KZnAPIb7jDxlZzE9qd/Cu5T3t7zeTK684O+uPB/muDyDByY9Hrd6vI4Rhr2e6+e7WshnvbSm5zuGn5I94YuwvKNfHLzLt7y8YaiMPCBY0TxuK9Q6k/ijPCUNtrySB6o7SVH4vCrO2rtmbnS8rMyuPBXMnDuBUSy9AftXPatKHz2GZga7pQDhPCBUjr0qLD+9O+s9Pal5yjwu4w+9tH4WvAdCXbyGbhG8VZUBPStVXLw/YfK8w8AdPQQ0cDwqmBq9YOn0u7TC0TyFXag9cFSpvMbuiL2yIqC8mTU8vQHeAT32AhE9FelbPKldSz3OWgg8+yKauzdKVzr57gm9jIyqvduo/7oqlo48+42FPJiHKL2Pr9i8m9KvPGIliTzPzW49y+PKu7Rd4Twj5LE7Yz1rPAM0hrytexO9vJVJPBSv1z0KgYc9azvXvBWgP7xRZS086WxOvSGEozugkKk8wMQsvC00Cj4H4ca8UggdPVCP/rsFklS8HeHfPLPT5bsiNyQ8kkWcvS5Z9DtL3qq7fn8tvUVHi7xLEXa79nsMvM8WvT3k55q9sadWu0b5Iz2cF1G7sA5dPY4AmD2yx4i8y7sYuxXAR7yTac08JuSJ
|
|||
|
|
{"p":"wolai-frontend/src/lib/rust-web-main-execution-boundary.ts","s":1,"e":36,"m":1777367210655.5774,"t":"export const RUST_WEB_MAIN_EXECUTION_BOUNDARY = {\n schema: \"mnote.rust_web.main_execution_boundary.v1\",\n publicEntry: \"3000\",\n mainWebOwner: \"mnote-web\",\n legacyCompatOwner: \"next-app-router\",\n rustOwnedPlanes: [\n \"web_gateway\",\n \"runtime_config\",\n \"auth_session_handoff\",\n \"document_shell\",\n \"page_aggregate_transport\",\n \"tree_projection_transport\",\n \"tree_command_transport\",\n \"tree_realtime_stream\",\n \"search_shell\",\n \"ai_bridge_transport\",\n \"mindmap_object_shell\",\n ],\n nextAllowedDuties: [\n \"legacy_react_bundle\",\n \"legacy_app_router_compat\",\n \"island_asset_source_until_migrated\",\n ],\n forbiddenNextSemantics: [\n \"主 Web gateway owner\",\n \"页面事实源\",\n \"树排序 canonical plan\",\n \"Page Aggregate command family owner\",\n \"tree realtime event contract owner\",\n \"搜索事实源\",\n \"AI tool protocol owner\",\n ],\n} as const;\n\nexport type RustWebMainExecutionBoundary = typeof RUST_WEB_MAIN_EXECUTION_BOUNDARY;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server-cookies.ts","s":1,"e":60,"m":1773495684368.4756,"t":"\"use server\";\n\nimport { cookies } from \"next/headers\";\n\ntype RequestCookies = Awaited<ReturnType<typeof cookies>>;\n\nconst decodeValue = (value?: string) => {\n if (!value) return value;\n let v = value;\n // 说明:部分环境下 cookies() 读取到的值仍是 URL 编码(例如 %5B%22...%22%5D),\n // Supabase Auth Helpers 期望拿到可直接 JSON.parse 的字符串,因此这里做一次解码。\n // 若不是合法的 URL 编码字符串,decodeURIComponent 会抛错,我们直接兜底返回原值。\n if (v.includes(\"%\")) {\n try {\n v = decodeURIComponent(v);\n } catch {\n // ignore\n }\n }\n return v.startsWith(\"base64-\") ? Buffer.from(v.slice(7), \"base64\").toString(\"utf8\") : v;\n};\n\nconst encodeValue = (value: string) => {\n if (!value) return value;\n // Next.js 会自动 base64 编码,我们只需处理已有 base64 前缀的情况\n if (value.startsWith(\"base64-\")) {\n return value;\n }\n return value;\n};\n\nconst wrapCookies = (store: RequestCookies) => {\n return {\n get: (name: string) => {\n const cookie = store.get(name);\n if (!cookie) return cookie;\n return { ...cookie, value: decodeValue(cookie.value) };\n },\n getAll: (...args: Parameters<RequestCookies[\"getAll\"]>) =>\n store.getAll(...args).map((cookie) => ({ ...cookie, value: decodeValue(cookie.value) })),\n set: (...args: Parameters<RequestCookies[\"set\"]>) => {\n const [name, value, options] = args as unknown as [\n unknown,\n unknown,\n unknown,\n ];\n if (typeof name === \"string\" && typeof value === \"string\") {\n (store as any).set(name, encodeValue(value), options as any);\n return;\n }\n (store as any).set(...(args as any));\n },\n delete: (...args: Parameters<RequestCookies[\"delete\"]>) => store.delete(...args),\n has: (...args: Parameters<RequestCookies[\"has\"]>) => store.has(...args),\n };\n};\n\nexport const getDecodedCookies = async () => {\n const store = await cookies();\n return wrapCookies(store) as RequestCookies;","v":"9QKIPIdqcT0Rlxa+LBiIvbpPRz0g1sS9+Xuaul6oqTyI9js6iaTAvZaYbL3HrSs9HEMmPAqevzsZZqM81e9HvPjbhjvWVMC8DD6yu+oeOTyMQl89+EkUvasBPTxRyqW9yod7PVmLgT1YOaI70NajPRHYKL1aZ/Y8dyKovKC2Yjp4cP48pvCavJQ7H73ZIIy8Tl0yveEewbxjF5C8FGSOO88zgTwJGSM97BTauw2HUL3I7ms9tOKdvPzK1j0TxrU9PBXJPYGa572gLAM9j25KvaVKCj3LwU66WVngPY+c5jwpbEe71xlYPE2IaT1owok8bQLYPP/raz2mNBW9ReWIPercWz1aeZy8UOiHvWYmfT2IoHk7TysUPBZBeT2NlIE7s9uqvE9xn7up/ju9BPFhPKUzC731gXG99jKAvFjOcT1Qif67I4qPvLlMpDyFvbq8gjKGPewBxbzAKMq8dY8GPciWKr1M5QE9j3dHvDfe/7yywlY9ua2FO143x7w5bEi5Hy+VOyVbAj3wDhG8O3GLvISOpblDNfm6wWiTPCksrrk+e5U6+0B1PTDtHT3MvFo9gh9Yu5maGL2FoNY8x8fnPH7qc7t8MOW8xQecuzVeobp0jRY95JaoPFhy/LyEvoU7sLFkvF3curxFR828Xo2LPSwEMT3rCL08fbUnvRkmIz0bLb486uiZvbSydb0aOp08r626ulvFFbvjmok9Dn6nPMDmN70z8fy8v2MQPdD9CbyuzCc89kw0vBmNczy8vcq8QBqcPHu1Gr3TwwM9rNHNvKVxy7wYugU8SuIEvadKAj0otny8GOwDPeCmTT15QbK7FX+/PEHXnzun2gM84pUDPZnvOT3zzCc90w1AvdvBHj2dNbU8F2gKvSPdDD0H/Uk9prUZvBzyRTzc2Wi9BksPvd9167oisZe7iQs8vdkpWjwoXpM7+7kjvcj8NDwsMRW9YS4Fu1hkgr0EBYo9d4aHPMRkJ72lcSQ8uKI2vG1ZDb2A4488bVkVvX93G7zp/4a89onDOtpMGT2BlQy9JSaTvTA6lLwsT7y5d5FTPdGEdLrzlHa8y6lFOzbOtzw6D627FrGavcVgzDwpblS9Be5iPQzuD71dOFU8T6qZPTTzo7v2CK68KdBVvHilLr3AvII8ZUpxvGU/Jb0lJKi949ubPT+MTz0vXv28rQuGPSgJH7xp/Wo9BQ+UPEMobLzSN3Q8UegxPG2FFL1lsru8zl+fvXRNNTy8E967DAitvFmeeTxbZVw55TKiPaNe97vH0D48vHnoOx4y9Dyd/oM8dh84u6Znpbyu72S7Pa6+PLBtIL3dPCa9u1wGPTiy2TzftJu65AC/PH1tsTy5SYI9RMm6vavnr7xzFjW8PI5tvCgCfbxVdQe8qgatvHvEhTw/+cm8IGwRPTYKUr3yrZk7ZA1mPHwWUbyEeTQ7Sc7ivDqHED2HmhU9rvr6PGgRKDw6Ovc8yVuLPB26r7uY+6a8qtSmvO68P720BDy8klTevA0GfLusxLO8U/VSO4d2K73sPzq9kNFvO96nIr35dKy83MbHvI9hk7z0Fhw9b18SPPw98DzlCG08GHsIvRFh/7y0+PC8GExpPKCzAD0tke08IDEmPM97ETuzNU87gSAfPfkpYrxdUJ07gftDvT3yybxfdbw8IGsGvCmbVTw4JYW9yN3XPJ2MJz0yrK48dmmMPCE+wrx/V428bEQxvNJU8jyBF5a8fBOwvJRnpz3Rqhm8c8M0PUmZXDyPxPO8n9EHPRjPSjuycLc8GN73vHqD/rwFa1G8CHS0PN0AgzxlTx082h2TPIc79Dz2JQa9KuwzPS7ELDwZ0nQ6bApDPCW1lL3eETy9vNsOPZctDD1n9wi9t6FN
|
|||
|
|
{"p":"wolai-frontend/src/lib/server-cookies.ts","s":49,"e":62,"m":1773495684368.4756,"t":"return;\n }\n (store as any).set(...(args as any));\n },\n delete: (...args: Parameters<RequestCookies[\"delete\"]>) => store.delete(...args),\n has: (...args: Parameters<RequestCookies[\"has\"]>) => store.has(...args),\n };\n};\n\nexport const getDecodedCookies = async () => {\n const store = await cookies();\n return wrapCookies(store) as RequestCookies;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":1,"e":60,"m":1778339865689.6956,"t":"import { describe, expect, it } from \"vitest\";\nimport type { DocumentRecord } from \"@/lib/documents\";\nimport type { WorkspaceSummary } from \"@/lib/workspaces\";\nimport type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport {\n buildSidebarDatasetListQueryPayload,\n buildSidebarDatasetListQueryResult,\n buildSidebarInitialData,\n extractMindmapImageAssetIdsFromData,\n mapSidebarDatasetListQueryResultToInitialData,\n} from \"@/lib/sidebar-data\";\n\ndescribe(\"extractMindmapImageAssetIdsFromData\", () => {\n it(\"提取导图节点里的 asset 图片引用并去重\", () => {\n const ids = extractMindmapImageAssetIdsFromData({\n root: {\n data: { image: \"asset:img_1\" },\n children: [\n { image: { url: \"asset:img_2\" } },\n { data: { image: { url: \"asset:img_1\" } } },\n ],\n },\n });\n\n expect(ids).toEqual([\"img_1\", \"img_2\"]);\n });\n});\n\ndescribe(\"buildSidebarInitialData\", () => {\n it(\"统一组装 mindmap/table/media 相关侧边栏数据\", () => {\n const workspaces: WorkspaceSummary[] = [\n {\n id: \"ws_1\",\n name: \"工作区\",\n type: \"personal\",\n iconUrl: null,\n memberCount: 1,\n isDefault: true,\n },\n ];\n\n const documents: DocumentRecord[] = [\n {\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n ];\n\n const trashedDocuments: SidebarInitialData[\"trashedDocuments\"] = [];\n\n const payload = buildSidebarInitialData({\n activeWorkspaceId: \"ws_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":49,"e":108,"m":1778339865689.6956,"t":"is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n ];\n\n const trashedDocuments: SidebarInitialData[\"trashedDocuments\"] = [];\n\n const payload = buildSidebarInitialData({\n activeWorkspaceId: \"ws_1\",\n workspaces,\n documents,\n trashedDocuments,\n mediaAssets: [\n {\n id: \"asset_file_1\",\n workspace_id: \"ws_1\",\n document_id: \"doc_1\",\n asset_type: \"file\",\n file_url: \"/file/1\",\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: \"a.txt\",\n file_size: null,\n mime_type: \"text/plain\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",\n },\n ],\n trashedMediaAssets: [],\n mindmaps: [\n {\n mindmap_id: \"mind_1\",\n workspace_id: \"ws_1\",\n document_id: \"doc_1\",\n data: {\n root: {\n data: { image: \"asset:img_a\" },\n children: [{ image: { url: \"asset:img_b\" } }],\n },\n },\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",\n deleted_at: null,\n },\n {\n mindmap_id: \"mind_2\",\n workspace_id: \"ws_1\",\n document_id: \"doc_1\",\n data: null,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":97,"e":156,"m":1778339865689.6956,"t":"},\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",\n deleted_at: null,\n },\n {\n mindmap_id: \"mind_2\",\n workspace_id: \"ws_1\",\n document_id: \"doc_1\",\n data: null,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",\n deleted_at: \"2026-04-14T01:00:00Z\",\n deleted_by: \"user_1\",\n },\n ],\n tables: [\n {\n id: \"table_1\",\n workspace_id: \"ws_1\",\n document_id: \"doc_1\",\n title: \"预算\",\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",\n is_archived: false,\n },\n {\n id: \"table_2\",\n workspace_id: \"ws_1\",\n document_id: \"doc_1\",\n title: \"归档表格\",\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: \"2026-04-14T00:00:00Z\",\n deleted_at: \"2026-04-14T01:00:00Z\",\n deleted_by: \"user_1\",\n purged_at: null,\n is_archived: true,\n },\n ],\n });\n\n expect(payload.activeWorkspaceId).toBe(\"ws_1\");\n expect(payload.kernelSidebarProjection?.projection).toBe(\"sidebar_tree\");\n expect(payload.kernelFileTreeProjection?.projection).toBe(\"file_tree\");\n expect(payload.kernelSidebarTree?.map((item) => item.id)).toEqual([\"doc_1\"]);\n expect(payload.mindmapDocs).toEqual([\"doc_1\"]);\n expect(payload.mindmapAssetChildren).toEqual({\n mind_1: [\"img_a\", \"img_b\"],\n });\n expect(payload.mindmapAssets?.map((item) => item.id)).toEqual([\"mind_1\"]);\n expect(payload.trashedMindmapAssets?.map((item) => item.id)).toEqual([\"mind_2\"]);\n expect(payload.tableAssets?.map((item) => item.file_name)).toEqual([\"预算.luckysheet\"]);\n expect(payload.trashedTableAssets?.map((item) => item.id)).toEqual([\"table_2\"]);\n expect(payload.mediaAssets?.map((item) => item.id)).toEqual([\"asset_file_1\"]);\n });\n\n it(\"冻结 sidebar.dataset.list 的 Rust query 契约字段\", () => {\n const queryPayload = buildSidebarDatasetListQueryPayload(\" ws_1 \");\n expect(queryPayload).toEqual({ workspace_id: \"ws_1\" });","v":"LcgyPbJFnbzJlQ++xyGkvaVpfT2UEpm8DXaAvO9sizvkKaw8T7idvfPyIb1WaWM9+NzzPV5D8zvhtiC9X+gkvdrKiL0Uup68k54BPX3W5DndMvI7dVIDvTgn7jySqA69WreAPRWWeT2nOf48SY1BPQxcnrecrFU9hVfFPVETmj2xdza8HWz5OxymNb1pNS+9MjBMPa8zBjz0iFs8RkOXvF3cjDtJ4Su92CwUvLKjk72bxWM8bnPevPKMqT3naWW8B5JiPZVHHLxhZo47JuZFvCCdmj0SXLO8DYHRPV56+zxOtKG8PMLzulRhFb1fV/28hkh1PTFBAjyTxxI9zWudPQWsQT3s+/08H054vVeIFTxX/BC8OZzxvOKWiz2PWok9YJkkOp54hzs8q+q8yNONPYaCFryDKx69PToYuyyvkDxogk+9fZSFPNJnKz1BW3W789SKPcLlCzyL4JU7C5rpvFWvLL3UDL09ty2kPdSDuTsv4Le8RgUMvbPvSDy0evk7HMglvGtclzvVzZ695WcHvE5mOTuEYWI7ppsvvVEJ7bs+Hpg8vQI1PU1eGrxxN2W8JSXkvOiFZDkKAw68DXKxO4n7WL0V6sC8xyDqPJeDg72DTTE9D5+svN0D+LxuUA49HIf8vBPpEr0Vivc8N1CSPXqJRj3RuN271RNtvDEzqzqEPn08JXPwu8G3Hb1Z9RC8Q1FxvZCxkj3hqB89LHcEPLtSm7sPtqi8RXrTu7xu8bw7kwE9cOUNPNtGKb2Yqoe9hcLiPIqsQ72Jprg9w/LJO27Yfb1pASm6GXK8vBXcNDu5sLi81C2nvLCqh7u0YE29jzHePF4E2jufzcM8loe9PI4fHj3HDR496ICYO6KELz3XTf+7yJgLvWXjODxS7ha9NOjSPKLsVzs//i69IGeOvb7j0DsM6fm8X32cvJgenDwzKGA8o1Xiu71c6TymZjG9c9dIPTjenr2btAM93YynPM2P9bwG/z69lpjhuyPoY7sWzqa826iRvT9LgjvK9H69cdMmvWVBtDxo/nS8BddKveoQGz3jJPG8hLF7PGN01jrk9EM77FpwvHJ5Db1VNnI9EekmvXoeBryjqoQ6FvWfPPudWLyL2Q492rp4PULe8DtofwI88BeKvPSmDLwOeo68CifBu6tgE7zIYiS9loo6uyJSDTxRO+q8tYdSPOLScDzSgoA9xZXcPLD8ebw8iQu96IgluxbIDrxz0Se9Ropwvb636zz/wO88Y86HvNs/cD05PP47x40XPU96RLu3Erk8J+OdvE88Gz1F3qm8BvBzO78apLy2JIC8XdEuvdFORb3S4zY87pWkvCzUCDzC0g28jWQRPSDQID3LG/47RbU5vRQQLbzbPbg7ZgpEvWGSH71d8Rg9RMQGPKn/AT2jf8m8SUpYPB0wjL34sYy93YHiuZgw6jykWtc6NyKHvI3x3Tv9hYo8I8JoPWsiXz19pqQ834kevanXaj1Clh+9B5XuPPatQL0nXCs7hkpWvfQyoTywH8+8uLlrvJXVgLwyyZG8HSIBPJCQEL2GhCi7E14dPbCIDr0HtZ48iXuOPJn7FDvmDKM8jXIxvPMPaLxf9DC9+DTjPHxzdT0flJM94dUCPaYNvTz8Kgq9u4yDPLa067oH2VO5ksWwu+XK2bhZCIy88NMzvC5h5
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":145,"e":204,"m":1778339865689.6956,"t":"});\n expect(payload.mindmapAssets?.map((item) => item.id)).toEqual([\"mind_1\"]);\n expect(payload.trashedMindmapAssets?.map((item) => item.id)).toEqual([\"mind_2\"]);\n expect(payload.tableAssets?.map((item) => item.file_name)).toEqual([\"预算.luckysheet\"]);\n expect(payload.trashedTableAssets?.map((item) => item.id)).toEqual([\"table_2\"]);\n expect(payload.mediaAssets?.map((item) => item.id)).toEqual([\"asset_file_1\"]);\n });\n\n it(\"冻结 sidebar.dataset.list 的 Rust query 契约字段\", () => {\n const queryPayload = buildSidebarDatasetListQueryPayload(\" ws_1 \");\n expect(queryPayload).toEqual({ workspace_id: \"ws_1\" });\n\n const queryResult = buildSidebarDatasetListQueryResult({\n activeWorkspaceId: \"ws_1\",\n workspaces: [\n {\n id: \"ws_1\",\n name: \"工作区\",\n type: \"personal\",\n iconUrl: null,\n memberCount: 1,\n isDefault: true,\n },\n ],\n documents: [\n {\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n ],\n trashedDocuments: [],\n mindmaps: [],\n mediaAssets: [],\n trashedMediaAssets: [],\n tables: [],\n });\n\n expect(queryResult).toMatchObject({\n active_workspace_id: \"ws_1\",\n workspaces: [\n {\n id: \"ws_1\",\n name: \"工作区\",\n type: \"personal\",\n iconUrl: null,\n memberCount: 1,\n isDefault: true,\n },\n ],\n documents: [\n {\n id: \"doc_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":193,"e":252,"m":1778339865689.6956,"t":"{\n id: \"ws_1\",\n name: \"工作区\",\n type: \"personal\",\n iconUrl: null,\n memberCount: 1,\n isDefault: true,\n },\n ],\n documents: [\n {\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n ],\n kernel_sidebar_projection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [\n {\n nodeId: \"doc_1\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"sidebar_tree\",\n title: \"页面 1\",\n depth: 0,\n position: 1,\n childCount: 0,\n expandable: false,\n expandedByDefault: true,\n capabilities: [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n ],","v":"RibNvDaXFz1GYvO9pt92vXfZ0juFUkW9K9E9vaYPCr0/SJu8V/klvUxlCjtfusm8N9HMPc8YoTsIsEi8e9IIvTA5kb2VLoe974giPM21cTswt+y8/KoVvCSJVrxc3ua7F3OXPek+fj2BMEo8k/pFOy/ClrwKLhw9W7xbPTj9aj25dzs878n9PNsqIr1pW/C8vdTOPIb/4zwPx808mW3pOsR18rz37Xc7GB8qPGSQr73MFIq7w5m0vVUTHj2nRI+8sgXfPYXeGbwHmea8/8+bvL3wfj24xQm8tW+rPbesSztUpu+8+YqMPHUNmzyyIUe81BzdOmL/5D1t/bq7tARPPftUTD09UIk8cPQRvW8goTyJ8/y7sRwNvf2maT11OgI9TuWvPEPYiDynhu67+IpoPap5Rbz3NkO9kCQgPA0GvjylKL08xlDxuu10qDyNcD2812FuPZ0YEDtPBRy7GnQwPIJYNLxM5Zc9rz9FPQY2Kj3Tno69fM1hPbUE5DqvTJI8XFcEPJXtIjwM7N28dC/IPHjeQLy6kee79DePPO7M2Tv+UDM62yJlPS6fGr02Xrq80lRyvWl+lL1mADi8Vsu9PL7MSL03PTi9JkSbPYCEir2ZBIc94AekvB2rF71BXEc99fS/vOvE87yFNOA80jq1PWcrKT3gWlO8NqL7vAQIuryUk/E8cVcjvceHCzyxE5y7wvJ5val3TD25XQ09XhEVPdEE2bx6Loo7H7X3Ou9y1rznIwa9Cv47PE2cV73b8FG9KDo8PcrTgr1GkZw95Om6O8YTQb1AD4m6Zil1vCGOgDxzyzS9hRXsO5iIeryUfWm9UmmEPWk6Iz1SkXE8WSRkOurGJz3qV5c8TkGuOWzN9jxRPMI7Ee8/vRz+xzselgM6mWWBPKkibjokg4e9AxqyvRGM2Luh8Ny85IWrvBRwzLxA8P88uZq/OwI/MzwTHxa970jou4hLML0dpVA796FAvAhafL1+jAq9R7IAPXzGt7v+Vog7uLK6vMdtZrwiML+8bgAsO+i1TDxpPfi8ocKfve1947vfOdK8lQcAu3PmXL2DYs86JpWRPPFZ4Ly10yg92X4cveLktjtvHfg8z3QYPMrCg7sR8fc8N5ONPXNcPjs1Rzi7vTOcvAP2/jysbKa7T8RqvcPFrLs3npS9IrZHvALdIzxTuoq9tNSMvGzmEz01SCk929oUPYaJVL3LtAQ64bdRvOYdI72mQz29GvicvdPFST0w81U97DCivE+8Hjyl0dy88XJJPTpg4rtvs1Q8lmcMvQshYjvYSXi8UxFOvak8OLx3yG68Yr0YPO16Zr20+e88m1UEPftnML3h7nC6oPcKPScXgz1zlzA965QGvdGuGLpGWuW8yF3CPOMJl72mOsg8LRQauXCfEj2FMl29rc8Lu3D9w7w6h5a9HWCHu6y5Xz2bDOE8sRTnPMfso7uEVC68mKrtPOAYjjzKFfE7ll+AvLpAHT2Ie6a9LVpOPepkvbwFYwu7i0ayO/grEz0MY7O8YUJ/OzHIdDy8c6y8lwfXu3VXG7wDEF48e/k8PW50Ob3smZs90hpcPbxbozzYvAo97/+EPNzKAb0+gPI7SrSfuzUPej1e5b49TwZGPfENLjxwjDe9xhcxPfpnKDyasww8sS2FOwrLEL222c+71Vpvva+kpjzs+z263vAuPTn49Dw2MAO9jt0ROlJ4ZT2wV5c8Jcw8ugRpRL2yLA28AOB8PApCDj3yg9m7RdXNO00SnDw5aZo8mo3NPP7M9zz6ESg9TkBju0ebBT2yTvE824TAvNCsUrv4n1Q8KBiuPbEOKD1KTKi8HzeTPYWTB71ZZsU7pwARPRnGJjzLE768Ih2auz7/YT1WFyS96DXFO2671rwzKIQ8qwQHPLgCLz1IzLU8PD7zOxsPkjzhmku8ibMqO3Iqyblg7Dq9DFgwvAwrdblMrzE9PbdYPbyvabxkwnM8RzZgPQ6MHb2Goa68ZusKPa3UFbzUI2S8s1I/vGrZqr3puU09u3OTPNxKRz2Z+JU8/4NvvZxlhzx7Q0k82rDIvPLI4jw14ue7xC9DvbTNpj1jaNI86BDAvGJT8LzKxDA70ZQcvULVfTzk4hQ7reGdvAhNejwzycK8xGCQvDoWCL0d4Ku56McdPY1DwrwHtfU8MVHNPKUBu7yGgVw8sDMxPN1A+bxQfI09tWVKPLCZfbwXoCS9yBvaO/Wyprwc8QA9uy5BvJatQb0bBdQ8bCkpPRl2Mj1rVIU8vrSRu5jWPT0a4Rg9YY8qPI7g2Tw7Y948R6IOvRUmzruL5xU972qJP
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":241,"e":300,"m":1778339865689.6956,"t":"\"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n ],\n edges: [],\n },\n kernel_file_tree_projection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n meta: {\n search: {\n ordering: \"kernel_file_tree_preorder\",\n },\n },\n items: [\n {\n rowId: \"doc:doc_1\",\n rowKind: \"document\",\n nodeId: \"doc_1\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"页面 1\",\n depth: 0,\n position: 1,\n childCount: 1,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\n \"expand\",\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n {\n rowId: \"index:doc_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":289,"e":348,"m":1778339865689.6956,"t":"\"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n {\n rowId: \"index:doc_1\",\n rowKind: \"index\",\n nodeId: \"index:doc_1\",\n parentNodeId: \"doc_1\",\n nodeType: \"index\",\n projectionKind: \"file_tree\",\n title: \"index.md\",\n depth: 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\", \"context-menu\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n },\n iconHint: \"index\",\n },\n ],\n edges: [\n {\n id: \"edge:doc_1:index:doc_1:parent_of\",\n edgeType: \"parent_of\",\n workspaceId: \"ws_1\",\n fromNodeId: \"doc_1\",\n toNodeId: \"index:doc_1\",\n },\n ],\n },\n trashed_documents: [],\n media_assets: [],\n trashed_media_assets: [],\n mindmap_assets: [],\n trashed_mindmap_assets: [],\n table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n });\n\n expect(mapSidebarDatasetListQueryResultToInitialData(queryResult)).toMatchObject({\n activeWorkspaceId: \"ws_1\",\n workspaces: [\n {\n id: \"ws_1\",\n name: \"工作区\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":337,"e":396,"m":1778339865689.6956,"t":"table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n });\n\n expect(mapSidebarDatasetListQueryResultToInitialData(queryResult)).toMatchObject({\n activeWorkspaceId: \"ws_1\",\n workspaces: [\n {\n id: \"ws_1\",\n name: \"工作区\",\n type: \"personal\",\n iconUrl: null,\n memberCount: 1,\n isDefault: true,\n },\n ],\n documents: [\n {\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n ],\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [\n {\n nodeId: \"doc_1\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"sidebar_tree\",\n title: \"页面 1\",\n depth: 0,\n position: 1,\n childCount: 0,\n expandable: false,\n expandedByDefault: true,\n capabilities: [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":385,"e":444,"m":1778339865689.6956,"t":"capabilities: [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n ],\n edges: [],\n },\n kernelSidebarTree: [\n {\n access_scope: \"private\",\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 1,\n is_starred: false,\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n children: [],\n kernel: {\n nodeType: \"page\",\n depth: 0,\n position: 1,\n childCount: 0,\n expandedByDefault: true,\n },\n },\n ],\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n meta: {\n search: {\n ordering: \"kernel_file_tree_preorder\",\n },\n },\n items: [\n {\n rowId: \"doc:doc_1\",\n rowKind: \"document\",\n nodeId: \"doc_1\",\n parentNodeId: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":433,"e":492,"m":1778339865689.6956,"t":"rootNodeId: null,\n meta: {\n search: {\n ordering: \"kernel_file_tree_preorder\",\n },\n },\n items: [\n {\n rowId: \"doc:doc_1\",\n rowKind: \"document\",\n nodeId: \"doc_1\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"页面 1\",\n depth: 0,\n position: 1,\n childCount: 1,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\n \"expand\",\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n {\n rowId: \"index:doc_1\",\n rowKind: \"index\",\n nodeId: \"index:doc_1\",\n parentNodeId: \"doc_1\",\n nodeType: \"index\",\n projectionKind: \"file_tree\",\n title: \"index.md\",\n depth: 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\", \"context-menu\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":481,"e":540,"m":1778339865689.6956,"t":"title: \"index.md\",\n depth: 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\", \"context-menu\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n },\n iconHint: \"index\",\n },\n ],\n edges: [\n {\n id: \"edge:doc_1:index:doc_1:parent_of\",\n edgeType: \"parent_of\",\n workspaceId: \"ws_1\",\n fromNodeId: \"doc_1\",\n toNodeId: \"index:doc_1\",\n },\n ],\n },\n trashedDocuments: [],\n trashedMediaAssets: [],\n trashedMindmapAssets: [],\n trashedTableAssets: [],\n mindmapDocs: [],\n mindmapAssets: [],\n mindmapAssetChildren: {},\n tableAssets: [],\n mediaAssets: [],\n });\n });\n\n it(\"缺少 kernel projection 时不再本地重建第二份 projection\", () => {\n expect(\n mapSidebarDatasetListQueryResultToInitialData({\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [\n {\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n {\n id: \"doc_2\",\n workspace_id: \"ws_1\",\n title: \"页面 2\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.test.ts","s":529,"e":572,"m":1778339865689.6956,"t":"parent_id: null,\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:00:00Z\",\n updated_at: null,\n },\n {\n id: \"doc_2\",\n workspace_id: \"ws_1\",\n title: \"页面 2\",\n parent_id: \"doc_1\",\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-14T00:01:00Z\",\n updated_at: null,\n },\n ],\n trashed_documents: [],\n media_assets: [],\n trashed_media_assets: [],\n mindmap_assets: [],\n trashed_mindmap_assets: [],\n table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n }),\n ).toMatchObject({\n activeWorkspaceId: \"ws_1\",\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:missing\",\n },\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:missing\",\n },\n kernelSidebarTree: [],\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":1,"e":60,"m":1778856784959.8887,"t":"import type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport type { DocumentRecord } from \"@/lib/documents\";\nimport {\n buildKernelFileTreeProjection,\n isKernelFileTreeProjection,\n type KernelFileTreeProjection,\n} from \"@/lib/kernel-file-tree\";\nimport {\n buildKernelSidebarProjection as buildProjectionContract,\n buildSidebarTreeFromKernelProjection,\n type KernelSidebarProjection,\n} from \"@/lib/kernel-sidebar\";\nimport type { WorkspaceSummary } from \"@/lib/workspaces\";\nimport type { MediaAsset } from \"@/types/media\";\n\ntype MindmapRow = {\n mindmap_id: string;\n workspace_id?: string | null;\n document_id: string;\n data?: unknown;\n created_at?: string | null;\n updated_at?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n};\n\ntype TableRow = {\n id: string;\n workspace_id?: string | null;\n document_id: string;\n title?: string | null;\n created_at?: string | null;\n updated_at?: string | null;\n deleted_at?: string | null;\n deleted_by?: string | null;\n purged_at?: string | null;\n is_archived?: boolean | null;\n};\n\nexport type SidebarDatasetInput = {\n activeWorkspaceId: string;\n workspaces: WorkspaceSummary[];\n documents: DocumentRecord[];\n trashedDocuments: SidebarInitialData[\"trashedDocuments\"];\n mindmaps: MindmapRow[];\n mediaAssets?: MediaAsset[] | null;\n trashedMediaAssets?: MediaAsset[] | null;\n tables?: TableRow[] | null;\n};\n\nexport type SidebarDatasetListQueryPayload = {\n workspace_id: string;\n};\n\nexport type SidebarDatasetListQueryResult = {\n active_workspace_id: string;\n workspaces: WorkspaceSummary[];\n documents: DocumentRecord[];\n kernel_file_tree_projection?: KernelFileTreeProjection;\n kernelFileTreeProjection?: KernelFileTreeProjection;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":49,"e":108,"m":1778856784959.8887,"t":"};\n\nexport type SidebarDatasetListQueryPayload = {\n workspace_id: string;\n};\n\nexport type SidebarDatasetListQueryResult = {\n active_workspace_id: string;\n workspaces: WorkspaceSummary[];\n documents: DocumentRecord[];\n kernel_file_tree_projection?: KernelFileTreeProjection;\n kernelFileTreeProjection?: KernelFileTreeProjection;\n kernel_sidebar_projection?: KernelSidebarProjection;\n kernelSidebarProjection?: KernelSidebarProjection;\n trashed_documents: SidebarInitialData[\"trashedDocuments\"];\n media_assets: MediaAsset[];\n trashed_media_assets: MediaAsset[];\n mindmap_assets: MediaAsset[];\n trashed_mindmap_assets: MediaAsset[];\n table_assets: MediaAsset[];\n trashed_table_assets: MediaAsset[];\n mindmap_docs: string[];\n mindmap_asset_children: Record<string, string[]>;\n};\n\nconst EMPTY_KERNEL_SIDEBAR_PROJECTION: KernelSidebarProjection = {\n projectionId: \"kernel_projection:sidebar_tree:missing\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n};\n\nconst EMPTY_KERNEL_FILE_TREE_PROJECTION: KernelFileTreeProjection = {\n projectionId: \"kernel_projection:file_tree:missing\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n};\n\nfunction isKernelSidebarProjection(value: unknown): value is KernelSidebarProjection {\n return (\n Boolean(value) &&\n typeof value === \"object\" &&\n Array.isArray((value as KernelSidebarProjection).items) &&\n Array.isArray((value as KernelSidebarProjection).edges)\n );\n}\n\nfunction readKernelSidebarProjection(\n result: SidebarDatasetListQueryResult,\n): KernelSidebarProjection {\n const snakeCaseProjection =\n \"kernel_sidebar_projection\" in result ? result.kernel_sidebar_projection : undefined;\n if (isKernelSidebarProjection(snakeCaseProjection)) {\n return snakeCaseProjection;\n }\n\n const camelCaseProjection =","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":97,"e":156,"m":1778856784959.8887,"t":"}\n\nfunction readKernelSidebarProjection(\n result: SidebarDatasetListQueryResult,\n): KernelSidebarProjection {\n const snakeCaseProjection =\n \"kernel_sidebar_projection\" in result ? result.kernel_sidebar_projection : undefined;\n if (isKernelSidebarProjection(snakeCaseProjection)) {\n return snakeCaseProjection;\n }\n\n const camelCaseProjection =\n \"kernelSidebarProjection\" in result ? result.kernelSidebarProjection : undefined;\n if (isKernelSidebarProjection(camelCaseProjection)) {\n return camelCaseProjection;\n }\n\n return EMPTY_KERNEL_SIDEBAR_PROJECTION;\n}\n\nfunction readKernelFileTreeProjection(\n result: SidebarDatasetListQueryResult,\n): KernelFileTreeProjection {\n const snakeCaseProjection =\n \"kernel_file_tree_projection\" in result ? result.kernel_file_tree_projection : undefined;\n if (isKernelFileTreeProjection(snakeCaseProjection)) {\n return snakeCaseProjection;\n }\n\n const camelCaseProjection =\n \"kernelFileTreeProjection\" in result ? result.kernelFileTreeProjection : undefined;\n if (isKernelFileTreeProjection(camelCaseProjection)) {\n return camelCaseProjection;\n }\n\n return EMPTY_KERNEL_FILE_TREE_PROJECTION;\n}\n\nfunction normalizeStringArray(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).filter((value) => value.trim().length > 0);\n}\n\nexport function buildSidebarDatasetListQueryPayload(\n workspaceId: string,\n): SidebarDatasetListQueryPayload {\n return {\n workspace_id: workspaceId.trim(),\n };\n}\n\nexport function extractMindmapImageAssetIdsFromData(input: unknown): string[] {\n const root = (() => {\n if (!input || typeof input !== \"object\") return input;\n const record = input as Record<string, unknown>;\n return record && typeof record === \"object\" && \"root\" in record ? record.root : input;\n })();\n\n const ids: string[] = [];\n const seen = new Set<string>();","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":145,"e":204,"m":1778856784959.8887,"t":"}\n\nexport function extractMindmapImageAssetIdsFromData(input: unknown): string[] {\n const root = (() => {\n if (!input || typeof input !== \"object\") return input;\n const record = input as Record<string, unknown>;\n return record && typeof record === \"object\" && \"root\" in record ? record.root : input;\n })();\n\n const ids: string[] = [];\n const seen = new Set<string>();\n\n const push = (value: unknown) => {\n if (typeof value !== \"string\") return;\n if (!value.startsWith(\"asset:\")) return;\n const id = value.slice(\"asset:\".length).trim();\n if (!id || seen.has(id)) return;\n seen.add(id);\n ids.push(id);\n };\n\n const get = (obj: unknown, key: string): unknown => {\n if (!obj || typeof obj !== \"object\") return undefined;\n return (obj as Record<string, unknown>)[key];\n };\n\n const walk = (node: unknown) => {\n if (!node || typeof node !== \"object\") return;\n\n const data = get(node, \"data\");\n const image = get(node, \"image\");\n\n push(get(data, \"image\"));\n push(image);\n push(get(image, \"url\"));\n push(get(get(data, \"image\"), \"url\"));\n\n const children = get(node, \"children\");\n if (Array.isArray(children)) {\n children.forEach(walk);\n }\n };\n\n walk(root);\n return ids;\n}\n\nfunction toMindmapAsset(row: MindmapRow, workspaceId: string): MediaAsset {\n const isLegacy = row.mindmap_id.startsWith(\"legacy-\");\n const suffix = row.mindmap_id.match(/(\\d{4,})$/)?.[1]?.slice(-4) ?? row.mindmap_id.replace(/^mindmap[_-]?/i, \"\").slice(-6);\n const fileName = suffix ? `思维导图-${suffix}.json` : \"思维导图.json\";\n return {\n id: row.mindmap_id,\n workspace_id: row.workspace_id ?? workspaceId,\n document_id: row.document_id,\n asset_type: \"mindmap\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":193,"e":252,"m":1778856784959.8887,"t":"const isLegacy = row.mindmap_id.startsWith(\"legacy-\");\n const suffix = row.mindmap_id.match(/(\\d{4,})$/)?.[1]?.slice(-4) ?? row.mindmap_id.replace(/^mindmap[_-]?/i, \"\").slice(-6);\n const fileName = suffix ? `思维导图-${suffix}.json` : \"思维导图.json\";\n return {\n id: row.mindmap_id,\n workspace_id: row.workspace_id ?? workspaceId,\n document_id: row.document_id,\n asset_type: \"mindmap\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: isLegacy ? \"思维导图.json\" : fileName,\n file_size: null,\n mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: row.created_at ?? \"\",\n updated_at: row.updated_at ?? \"\",\n };\n}\n\nfunction toTrashedMindmapAsset(row: MindmapRow, workspaceId: string): MediaAsset {\n return {\n ...toMindmapAsset(row, workspaceId),\n deleted_at: row.deleted_at ?? null,\n deleted_by: row.deleted_by ?? null,\n purged_at: null,\n };\n}\n\nfunction toTableAsset(row: TableRow, workspaceId: string): MediaAsset {\n const base = String(row.title ?? \"未命名表格\").trim() || \"未命名表格\";\n const fileName = base.toLowerCase().endsWith(\".luckysheet\") ? base : `${base}.luckysheet`;\n return {\n id: row.id,\n workspace_id: row.workspace_id ?? workspaceId,\n document_id: row.document_id,\n asset_type: \"luckysheet\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: fileName,\n file_size: null,\n mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: row.created_at ?? \"\",\n updated_at: row.updated_at ?? \"\",\n };\n}\n\nfunction toTrashedTableAsset(row: TableRow, workspaceId: string): MediaAsset {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":241,"e":300,"m":1778856784959.8887,"t":"mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: row.created_at ?? \"\",\n updated_at: row.updated_at ?? \"\",\n };\n}\n\nfunction toTrashedTableAsset(row: TableRow, workspaceId: string): MediaAsset {\n return {\n ...toTableAsset(row, workspaceId),\n deleted_at: row.deleted_at ?? row.updated_at ?? null,\n deleted_by: row.deleted_by ?? null,\n purged_at: row.purged_at ?? null,\n };\n}\n\nfunction deriveSidebarDataset(input: SidebarDatasetInput) {\n const activeMindmaps = input.mindmaps.filter((row) => !row.deleted_at);\n const trashedMindmaps = input.mindmaps.filter((row) => Boolean(row.deleted_at));\n const activeTables = (input.tables ?? []).filter((row) => !row.is_archived);\n const trashedTables = (input.tables ?? []).filter((row) => Boolean(row.is_archived));\n\n const mindmapAssetChildren: Record<string, string[]> = {};\n activeMindmaps.forEach((row) => {\n const ids = extractMindmapImageAssetIdsFromData(row.data);\n if (ids.length > 0) {\n mindmapAssetChildren[row.mindmap_id] = ids;\n }\n });\n\n return {\n mindmapAssetChildren,\n mindmapAssets: activeMindmaps.map((row) => toMindmapAsset(row, input.activeWorkspaceId)),\n mindmapDocs: normalizeStringArray(activeMindmaps.map((row) => row.document_id)),\n tableAssets: activeTables.map((row) => toTableAsset(row, input.activeWorkspaceId)),\n trashedMindmapAssets: trashedMindmaps.map((row) =>\n toTrashedMindmapAsset(row, input.activeWorkspaceId),\n ),\n trashedTableAssets: trashedTables.map((row) =>\n toTrashedTableAsset(row, input.activeWorkspaceId),\n ),\n };\n}\n\nexport function buildSidebarDatasetListQueryResult(\n input: SidebarDatasetInput,\n): SidebarDatasetListQueryResult {\n const derived = deriveSidebarDataset(input);\n const kernelSidebarProjection = buildProjectionContract(input.documents);\n const kernelFileTreeProjection = buildKernelFileTreeProjection({\n documents: input.documents,\n mediaAssets: input.mediaAssets,\n mindmapAssets: derived.mindmapAssets,\n tableAssets: derived.tableAssets,\n mindmapAssetChildren: derived.mindmapAssetChildren,\n });","v":"UCycPN1FSrq2SgC+WzvUvWwAJT06/469FJYevBQiajswYBk97gH4vJK0xL1pqw09hSocPnAfNrqTatm6+mt0vedBBLwvlUe9iygcPNcmgD2cuG08gT44vEFtijzU/T67k9ChPX4j6Dz22uI7xHHgux5gtr3hcpY9JW8uPfJOAj3aYQ29pinkvMSPDL0yCPm87nBZu+nihLwZxze8zDlJPE0F3LqTUZI8uZ7Wu8mCPDzCCZ09s6gXva6tjj0MzxI8xjFcPdFIir0KRis91B2bvDxW6jxWYLC8WYrEPQ/SVzwv2eO8F775vDEOMLyi+is8u7TbPJxaij2KLBi9vvqLPTR4bT11QgW9D6ZiveWKZj0+CP282aBfPEZ1czxm4OA6LAfqvEt6MTuKvTa9HS87PeShd7383Ue9wB8KvUHlHz3ixmi7cyAHvJ/3oLowBi48xR9tPdPAobyHxSW821FZvRqUGb1M6SQ97w/5PG6ZrbxJJdG84JJJPH5QTb1iqBO7XdsKvb+ohjx0qnC8aahlvXoQTDwyrcM6KjHFOrmjK736Gvg8SeiUPdjiMzx9W4m8Yk3DPDEGzLxkacS7Y7+QPaU7LL3mni07oQLAPLyPhr26RvM8rzWZutfVsLwn5oE9Deydu7+uqr33/Ie7h4ZrPL39qDx8alI9aj/mvJTFdDxDZV08xeRgvVSzIL3qDwW9YkNsOqTDrzyPTzE98eEAPQn1H71dqxG9XTVCPBtDi7x5jyg9CpxEvNA7Ybxdauq8/39lPJ4wZb2i9rY80/q+u82+FLxu4S68ON2ROycOcDyOnLY8E5AHPbjDGz1Sli69zq+rO7pnG7sfcLa80A+GPEe2QD2XaF08YVbLOxq5Wz2vsIG9D2t7vB5pZz0Xx8s8QMgbvMNjNzyAnlu6mIYavdmTebvrgwK9XGPkvIW5uLtAfrQ8NLwmvfk92zxiJ9q8ScYUPT6m6b0Pwag8TkTguUyfAb1mKmu8VpcMPSEFOLwJX8U8CRQZvQH6CLxvov+83UwfvQvrrLzzy1e9dTFavc2X3zzm+Li8su2RPU2R+rvuzwA9m8V7vJJCVryH/I47CM2OvYCc/LyVYLW7SmQiPXiYBb1ppsw8MxisPVNlpLxsyZE6a7lePOb80jzGvV27e2uwvNIsX7009Um9fRO6PABAjTwzsgi9p8FXPUSEjDwgPNs8CxCJPBlf47wIme87zZ5JvXiK1zuCFKC8nWlkvRj4DT3FphU9NzxWPD0EkzobwQ498Nu0PZCUxropggo9m8Fau6NLqTrdSYW8vALmvEJtAL3UNOU7PPldvcy5db3MVCW8usequzrFIb2PGYg8oobBu41QkDyCr9I7kpQwvV7hEzydJNy8Vxb2vB3yn7yKtSc8Gy2/PG61Bz3rgMC8g4IKvem39Ly9Miq9IorhPNZeMD376Vg9Mj+Iuk2KIT2Dsr68pSGOPER5ODxKd2E8v8O/PO1ug7yzMtu8BQbmPASsE703FMe8suhVvaYyQr0potW7HAePPJ2qrbwE64U8YRORvKvtGzvckeI5Z90APYKpJrxbyf08pxf4vLdXND1hQfg8BnESvbEkBrzM7kG9JkP+PFygUz1U9oU9O1YRPX3TI71iYdu8KIA9vPP4A72Xb288+m80vGeB/rxUngW8PiUKvRRZHj0ZyoM8Z64APVwzFj2ZKoq8/duGPZnuVDwLFiO9IaBLvVOgKD2mfQq9qVn
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":289,"e":348,"m":1778856784959.8887,"t":"export function buildSidebarDatasetListQueryResult(\n input: SidebarDatasetInput,\n): SidebarDatasetListQueryResult {\n const derived = deriveSidebarDataset(input);\n const kernelSidebarProjection = buildProjectionContract(input.documents);\n const kernelFileTreeProjection = buildKernelFileTreeProjection({\n documents: input.documents,\n mediaAssets: input.mediaAssets,\n mindmapAssets: derived.mindmapAssets,\n tableAssets: derived.tableAssets,\n mindmapAssetChildren: derived.mindmapAssetChildren,\n });\n\n return {\n active_workspace_id: input.activeWorkspaceId,\n workspaces: [...input.workspaces],\n documents: [...input.documents],\n kernel_file_tree_projection: kernelFileTreeProjection,\n kernel_sidebar_projection: kernelSidebarProjection,\n trashed_documents: [...input.trashedDocuments],\n media_assets: [...(input.mediaAssets ?? [])],\n trashed_media_assets: [...(input.trashedMediaAssets ?? [])],\n mindmap_assets: derived.mindmapAssets,\n trashed_mindmap_assets: derived.trashedMindmapAssets,\n table_assets: derived.tableAssets,\n trashed_table_assets: derived.trashedTableAssets,\n mindmap_docs: derived.mindmapDocs,\n mindmap_asset_children: { ...derived.mindmapAssetChildren },\n };\n}\n\nexport function mapSidebarDatasetListQueryResultToInitialData(\n result: SidebarDatasetListQueryResult,\n): SidebarInitialData {\n const kernelSidebarProjection = readKernelSidebarProjection(result);\n const kernelFileTreeProjection = readKernelFileTreeProjection(result);\n\n return {\n activeWorkspaceId: result.active_workspace_id,\n workspaces: [...result.workspaces],\n documents: [...result.documents],\n kernelSidebarProjection,\n kernelSidebarTree: buildSidebarTreeFromKernelProjection({\n records: result.documents,\n projection: kernelSidebarProjection,\n }),\n kernelFileTreeProjection,\n trashedDocuments: [...result.trashed_documents],\n trashedMediaAssets: [...result.trashed_media_assets],\n trashedMindmapAssets: [...result.trashed_mindmap_assets],\n trashedTableAssets: [...result.trashed_table_assets],\n mindmapDocs: [...result.mindmap_docs],\n mindmapAssets: [...result.mindmap_assets],\n mindmapAssetChildren: { ...result.mindmap_asset_children },\n tableAssets: [...result.table_assets],\n mediaAssets: [...result.media_assets],\n };\n}\n\nexport function buildSidebarInitialData(input: SidebarDatasetInput): SidebarInitialData {","v":"3KP2PHSzvbvuEte97GbXvUVxrzwrmUW9MhN2O3dekjzibwq8QF/pvAJtT72tI049+Nn8PX1ghDz/wA49p9a/vE4omrtEJSO9uQ6evOgBtj2st5o8Z0+UvH40+jy4VA291VCPPT6ghj0PiRM8IBKDu1/nM73AVsQ9WEgrPRPo+zxQOY+8qvaEuvfvtL0HutY7NJvsPAA5Mb3z0QU8tjaWvNw4LL2ec6m62LfRvOkSuDxKiQc9NohBu88vnj3/tlq8J9q8PLbPtL1pUFM8OxS9OulatrzUrCk8tdWDPWZ/Gz1dGOe8gNCFvM3WPzwwCii9TfNBPKUNlj02Auq7c9Z9PYYYWT2+kDW9sxLkvLWKmD0VBvC8Nf8wPYzCfT2nNjk9kygBPMnbCL0Hgwi9UI0JPU3NujwXnoa97XMCvRirLj1Iwk69fhbLvPOpiT3q64Q85mgjPVAk4zs/PfS7ku1jvJ4/Gr00DcM8uJ0+PUdeqLxjI7o8+cEsPKSvbL1UBnO8gpLbuhn3wDuPu7G7Y+uFvOIvLT3USyu9tJ6bPB0ebrxXb0s9EFzTPIT/iDsXHBu9aCPLvHXfljxZ+aO8BRA3PXGWgb1oD9W8+VINPV3/P72i3wQ8JX8zvX+nxrvmHE49Sn6CvKGeKL0tlRs8w7suPen4eD2FIE09ctqkvAOsHbwDNig81RblvAbUF70cOQO9JB2bOkho4jwjyIc9SvwXPYlqQL1/lMG8Yt6SPA98AjxXclo87fupO8fn5bzWeX+8mxj5vIUZbbpwIWE9bZobveHEnbwRLzW66aaru9k9Nz0I1Hu8jbOPPWpwjj0M14K9Ydn8uz6mHDyDYNO8uXQzvSKSZz3A2eY8VH8BvW2iJD1bHNm8AX9dvXOTzTkHx5I893WWvJmMbjw/LJO9TgU/vV3WPTwi+we98/WSvF8rFrzvIU89PP2qu6a4FDsZwk29CJnVPIcKmL3/nnU9LCFgPIMx47mOHPC8eo+vvGTVuzx9QSS8cPkfvffkCz0ScXK8ok8gvTxoSjz9r4u8TBSFvccdujxOhIO8e3scPcryK723Iye772hIO3JRGbvNchg9oXZqvdh29Tz90Pi8P7XtPCZtJb3z5z+8kGghPadvRbyVKj48FRH2PP7aI7xjK3o8sfC7vBICKb3LL2G8Q1Mmu9HRA7yEAzC9ZJ4LPYHgdD2frmE9Ws0CPW+g4Lz+oxm7sobhu0b0bzzD0IW9uJlpvXFeCj3uuxs8vu38vI7ynbybPCk8dKq0PaI9zbwo3Wo9AoCnuj96wroLboO8khDWvHc/JL31tgM5H/qjvH38Vb3AbBY9n4itOyyR5rvIKlo9jh/9O3m0jD24CSI9gbTBvG6rZLz5MZc5Uf09PIk3GL3JJO88g8oVvYh18DwrOUC9KF8mvGoJI73jyjS7fLCruZtyuTxJnqk7IxjvvKdT6TzikOm8VU+EPfR6qTyiAwQ9hy8FPc8Y+Ljy0Ci9IgaWvIkuUL3z87S8OBCLuw
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-data.ts","s":337,"e":353,"m":1778856784959.8887,"t":"trashedMediaAssets: [...result.trashed_media_assets],\n trashedMindmapAssets: [...result.trashed_mindmap_assets],\n trashedTableAssets: [...result.trashed_table_assets],\n mindmapDocs: [...result.mindmap_docs],\n mindmapAssets: [...result.mindmap_assets],\n mindmapAssetChildren: { ...result.mindmap_asset_children },\n tableAssets: [...result.table_assets],\n mediaAssets: [...result.media_assets],\n };\n}\n\nexport function buildSidebarInitialData(input: SidebarDatasetInput): SidebarInitialData {\n const queryResult = buildSidebarDatasetListQueryResult(input);\n\n return mapSidebarDatasetListQueryResultToInitialData(queryResult);\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-tree.ts","s":1,"e":60,"m":1776339356046.7812,"t":"import type { DocumentRecord } from \"@/lib/documents\";\nimport type { SidebarSectionId, TrashRecord } from \"@/components/sidebar/types\";\nimport type { Database } from \"@/types/supabase\";\nimport type { MediaAsset } from \"@/types/media\";\nimport {\n buildKernelSidebarProjection,\n buildSidebarTreeFromKernelProjection,\n type SidebarTreeNode,\n} from \"@/lib/kernel-sidebar\";\n\ntype TypedClient = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n from: (table: keyof Database[\"public\"][\"Tables\"] | string) => any;\n};\n\nexport type SidebarTableRow = {\n id: string;\n workspace_id: string | null;\n document_id: string;\n title: string | null;\n created_at: string | null;\n updated_at: string | null;\n};\n\nexport interface SidebarDataset {\n documents: DocumentRecord[];\n trashedDocuments: TrashRecord[];\n trashedMediaAssets: MediaAsset[];\n /**\n * 仅依据远端 mindmap_data 判定的页面 id 列表;本地文件检测由服务器侧辅助完成\n */\n mindmapDocs: string[];\n mediaAssets?: MediaAsset[];\n tables?: SidebarTableRow[];\n}\n\nexport async function fetchSidebarDataset(\n client: TypedClient,\n workspaceId: string,\n): Promise<SidebarDataset> {\n const { data: documentRows, error } = await client\n .from(\"documents\")\n .select(\n \"id,title,parent_id,sort_order,is_starred,access_scope,is_template,created_at,updated_at,workspace_id,mindmap_data\",\n )\n .eq(\"workspace_id\", workspaceId)\n .is(\"deleted_at\", null)\n .order(\"sort_order\", { ascending: true, nullsFirst: false })\n .order(\"created_at\", { ascending: true });\n\n if (error) {\n throw new Error(`获取工作空间文档列表失败:${error.message}`);\n }\n\n const documentRowsAny = (documentRows ?? []) as any[];\n const documents: DocumentRecord[] = documentRowsAny.map((row) => ({\n access_scope: (row.access_scope ?? \"private\") as DocumentRecord[\"access_scope\"],\n id: row.id,\n workspace_id: row.workspace_id,\n title: row.title ?? \"无标题\",","v":"D9dmPPvBmDxV58u9a5C7vTgbRj0ylDG9DMKFvHImibxy2VG813eNvLlm1rx29Qw8O6ECPsAJFDwXhBs9I8c/vaLbl7wLqIy9R90FuzE2Fj0hG5i7cAEPvXeV7TygPUa9McmFPefnjD1e2/A8f9tiuwQCYb2dp2c878UKPekiED2+Ocw86U6APM7L1LypTke8Pq6wvCEGkjtuZse8IdFOPcLUFb0ddHa8mR6RvO3nXL03FF09KmZDvXaTiD3tOK27rNVQPTDuWr2aU+c8QPVlvdyuCj2hmBM8242gPXvq6jy3ofu8vqx4OzJtmzz9rTG5DEWOvMGv2T2d8IQ8X/KIPa8KNj1vmCG8OIyrvN6Dpz2GXzG9+nsNvQZZMT3+D+c8kdV7PWHN2LsCd5K9ng1IPbBRojs4wRK92/C3usL0gD0ACoO9h/6bO6qFuztAN308TFgOPbK6Gjx4cQq9SpQovaIoEL2b33Y99hocPVP4N730Xfi7Dy2QvLx/77zCLgc8wd6fPOFULTzQMoi8+ON0vMKTVzzFNDO9MElAPUgQZDzMEmo8Ci/LPF5wQ7xHHm28P6MovenqKb0yTqA8IZeRPYZ7sb1Zs4i7UtrhPJk3F70KGZW6WSTquxmxszziArA8gm+XvK2LE70/6ny8u60qPZU5jT2Yuq67QOU3PL7hxzscfxg9ol94vfItOb3yZEG9NTUcvLlyQj1ev9Y9QRaPPdP4P7slKvW8M/r6Om0Vorz46EA8AoWPvKG0RL3/Qoe8g4OWuikPzbxQ5W49dLxrOxKdqbyb2Ji7Cgb1vKsbmTw/HXm87fVOPe3pJDyJwh69lIAzPXRFtTx7ARo8gtfQvLtgMD0mUhm7aa9tvcNJvzzCcc08Lw01PIApSTwNJEk8LLAZPPjHBj3Ilae9URB3vGq3Qrxyd9O7BfcaPF4X9TsHh5s81PmNvK08kDyhpAu9ElAOvHtror1tEGY7XYSqPA0aaL1kL4+776bavG3yjLwvJuk8I0XHvNpTsjwSEjC9GD2tvORE3DzY2ke9XGezvdyLoTzJOoI6xtdoPEUiQr3VySa5Yij8POJIB73pWHi80WKdvYEV3byHhvu8gpfnPF9HDr0H2DY84rifPf3ZALztYDs8u+6XvA3bGrwvzQY9q7FJvYkD7btJShu9GF3rPCMehjxqly69QjqTPAv3JT3PVo08zIsgPext1Ly6luE8CLEZvKFpk70pc069q29zvR7YJDyGBJO7S9fiu+Shnbu8vE889n2gPUe5fjwvMDk5B0FjPDXsujsWxNK8iPpjvQM9kbz1+428LVguvFpGT71RLW48vX1GPcurFLxvuaA8HCAUPXu8QT097s67Wbu2vY2YyDkT5ze9OHsDPIEER73pjBc80NTmPI7IKT3KUYC9FXCPO/b5hry7C0C9vqahPLvrnzy7kws9xRKgvHWzU7uo0X69fk5MPSnUQT0iXpo827I7OtensTy6Vzi9oGo9vNyBSL39SGu9UdYmvJppozsPa7k7H/wtPcsZVbsLEmm8LA80vCDYf7x/wRs98GgJPXOGD73nLA096DTbPCjMkjx7tWo8Pl38OzcFjL0C+UK9VCsQPS1xQj28q6M9guVtPbq1/7ue2gS9iDFEPD1+hbwt8ug8rCOnPAUXBr3T3Am9bvzTvBdHij3wZvG7SS2CPYbmVD3gBoq8J7BaPH1QsrvEDVy8KwzovGmsZD31/AY7XMkxvd4GFz3GdTc88VYKvLFyUrsr3PS7gGZfPXc1Ej353kQ9efnDvCGPIL3GsfQ83A4TveclJzzgxcc7VKVwPUf5pj304Ve9R6prPWTZRjv2WdC8VhE0PPkDp7yEx0G9HSL4PPCMYD1ypTy9JPCRPIDYsrzCGA29iP6RvBpVejtOXVA8Tl+3PEiMAruRbhq72AX3PF7UD7xOEUA
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-tree.ts","s":49,"e":108,"m":1776339356046.7812,"t":".order(\"created_at\", { ascending: true });\n\n if (error) {\n throw new Error(`获取工作空间文档列表失败:${error.message}`);\n }\n\n const documentRowsAny = (documentRows ?? []) as any[];\n const documents: DocumentRecord[] = documentRowsAny.map((row) => ({\n access_scope: (row.access_scope ?? \"private\") as DocumentRecord[\"access_scope\"],\n id: row.id,\n workspace_id: row.workspace_id,\n title: row.title ?? \"无标题\",\n parent_id: row.parent_id,\n sort_order: row.sort_order,\n is_starred: row.is_starred,\n is_template: row.is_template ?? false,\n created_at: row.created_at ?? \"\",\n updated_at: row.updated_at ?? null,\n }));\n\n const { data: trashRows, error: trashError } = await client\n .from(\"documents\")\n .select(\"id,title,parent_id,deleted_at,access_scope\")\n .eq(\"workspace_id\", workspaceId)\n .not(\"deleted_at\", \"is\", null)\n .order(\"deleted_at\", { ascending: false })\n .limit(100);\n\n if (trashError) {\n throw new Error(`获取垃圾桶内容失败:${trashError.message}`);\n }\n\n const trashRowsAny = (trashRows ?? []) as any[];\n const trashedDocuments: TrashRecord[] = trashRowsAny.map((row) => ({\n id: row.id,\n title: row.title,\n parent_id: row.parent_id,\n deleted_at: row.deleted_at!,\n access_scope: (row.access_scope ?? \"private\") as DocumentRecord[\"access_scope\"],\n }));\n\n const mindmapDocs = documentRowsAny.filter((row) => row.mindmap_data != null).map((row) => row.id);\n\n const { data: assetRows, error: assetError } = await client\n .from(\"media_assets\")\n .select(\"*\")\n .eq(\"workspace_id\", workspaceId)\n .is(\"deleted_at\", null)\n .order(\"created_at\", { ascending: false });\n\n if (assetError) {\n throw new Error(`获取附件列表失败:${assetError.message}`);\n }\n\n const mediaAssets: MediaAsset[] = (assetRows ?? []) as MediaAsset[];\n\n const { data: trashedAssetRows, error: trashedAssetError } = await client\n .from(\"media_assets\")\n .select(\"*\")\n .eq(\"workspace_id\", workspaceId)","v":"pfspuyrWSzsJXyO+30auvTzoeD0JjsG8vYAsOo2WkLwELtS8KseLvbQzSb3qm6663O0HPpJRAj02ZSy74AxTvLAcbbynEjO92GjvvKjinDrAqm46DWRnvPcWOTypmgW9jIRnPR0MaD2AMMI7MkkgutepJ70fvRY95u6APblrhD1w97s8SweWvGyFEL3L7sW88tw8PdfFdDuUwL063O4mvVYOl7ur5P+8AcNHvDio3L0oUWE94pZHvWyLfT2cbB09RYiNPflsS70+VKY7gP4Xut/m+jyrj/O8ubqbPTnt6D2lLdi8TN1qPPAEBz1LPvI72f7VPJIQrD2i+BE9RisOPYahnD0gr2u8dShRvfprDj308B29NT9+O7D4VjwktjO6K6TnPHFU8LyNGWG9Ndt6PRNP87wq4D29OHsfvKTwCz2zngu9qdJJPNK/gT2/3hw7TlsrPX2xWr25KlQ8tkxjvLkUxLzvOdY99rCFvDOL/TuhuqO8HQjeu+tK9rxKsvS7t80HOnGcVjyWoaW8hQIxvQ6Ka7wL+qS8DvMEPa/A37vc9Am81LDiPJ/mujymlJS80TpmvUJ/W70pWMY8rEVGPWXwkr35U7O7XyQnPa9TcjsNOog9gHfJvOi2Mr1Zm9A80EG+vLnnML00vCm85TCXPHm8/Dw5G9s8FBuBvJDFjDxwuY88wLJlvTDEzLzVVM685KdBvL2LtzxK06o8e3C5PPK4O7yzzS6966OvPKTfabvBLma8qneEvEOjxrwRSF69EzYoPSYJJr0uPss9ZQi3O7KtFL2vA1a7Snj6u3MZCrxPiia9FVTJO7Ol2zzkOjO8SamkPJbglLyxNY09ggsAvb09OD0UxKW6JN5AvaGchjyST5m83bqjvAXcljz7SkM8MeCsuyiFBjzGHpK9LslkvQa6BTwQnBW87/cEvafvTj35K/k8cngQvdMYJz0pZiG9rcupPO7cFr2k+Ow8oj+xPP+EFL33eIS8OA8Pvelxlbz6aNA8vBluvYBlCz3kjsq85tImvQVbTz11E7G8cWaVvX1yDrzh+tu8+akWOzTZKrxNkxY9txWsPOyMd7z51vy8WAmTvelHcDwuwIw7roWBPV5HS7w37oA88FgoPSOrKrzrF2E8AdOiPJd99rzhoD0862gMPDF3Mr3rLJG92ODEOyrhizzjlVG9oZMEPFM3ejwafNI8JBMjPKAdEr1OfNq8Btbpuwwbgb3hdFO9lWWTvVc7pzzHVx+8S85aPBpeYD1rQUm8zHeMPeeI6Dx67Fw929L0vBRXDD1VwZE74axGvX48Ur3FDhu9DEyPPHFW17xN92+8PdLjPO+XBj1qQ4G8ircEPdfuFD31AAw9sQM2vT3RlLwhH5Y7wsrSOx7bvry14GQ87WPdPAm7OD3kCa69f70VvYfNIbxyQ2G9SQcgvNANxTyAh5g8pHq3O7/QWDrXJnS7w/LzPLPIoDz4tBk9O2WcvEwMjLuBfR+9SM6LOta7Ebw+Vj68IYxzvb28pjxg/Hm8ztzGPCVMmDx/R6O8Q/yiPA1sC7wbJwc8yEw1PWDFy7ymAoI9e19PPIL8wzyJr0s9F5FquwprbL0NbJq75QAoPLO6BD0hAsk9VBHNu3bwhbypfFC89laIPa1b2jwHr4w88ggSvXZT7LxAzRO9vdGKvQqSDLzl/wo7amsMPeAvhTzzI8k8ZdKBu3derLlorki9J9mwvApFxrzJ2+G829oCvC8xFj02SeK59JSHPMd6kDyuitC8dXXuPIhl/jwFqh89jyGRuzMFWLn5+mK8SbA6vL5G9rzv7Im622LVPV/clzzFhIw73shOPQ2yvbz6nxg8lnNBPcuzp7zdtEW898OOPPFJBj2Fsye9cEaivGKaRrtqNT
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-tree.ts","s":97,"e":156,"m":1776339356046.7812,"t":".order(\"created_at\", { ascending: false });\n\n if (assetError) {\n throw new Error(`获取附件列表失败:${assetError.message}`);\n }\n\n const mediaAssets: MediaAsset[] = (assetRows ?? []) as MediaAsset[];\n\n const { data: trashedAssetRows, error: trashedAssetError } = await client\n .from(\"media_assets\")\n .select(\"*\")\n .eq(\"workspace_id\", workspaceId)\n .not(\"deleted_at\", \"is\", null)\n .is(\"purged_at\", null)\n .order(\"deleted_at\", { ascending: false })\n .limit(200);\n\n if (trashedAssetError) {\n throw new Error(`获取附件垃圾桶失败:${trashedAssetError.message}`);\n }\n\n const trashedMediaAssets: MediaAsset[] = (trashedAssetRows ?? []) as MediaAsset[];\n\n // 说明:当前 supabase types 可能未包含 document_tables;这里用 any 兜底,\n // 避免类型缺失阻塞侧边栏功能。\n const { data: tableRows, error: tableError } = await (client as any)\n .from(\"document_tables\")\n .select(\"id,workspace_id,document_id,title,created_at,updated_at,is_archived\")\n .eq(\"workspace_id\", workspaceId)\n .eq(\"is_archived\", false)\n .order(\"created_at\", { ascending: true });\n\n if (tableError) {\n throw new Error(`获取在线表格列表失败:${tableError.message}`);\n }\n\n const tables: SidebarTableRow[] = (tableRows ?? []) as unknown as SidebarTableRow[];\n\n return {\n documents,\n trashedDocuments,\n trashedMediaAssets,\n mindmapDocs,\n mediaAssets,\n tables,\n };\n}\n\ntype NodePredicate = (node: SidebarTreeNode) => boolean;\n\nfunction projectTree(nodes: SidebarTreeNode[], predicate: NodePredicate): SidebarTreeNode[] {\n const result: SidebarTreeNode[] = [];\n nodes.forEach((node) => {\n const projectedChildren = projectTree(node.children, predicate);\n if (predicate(node)) {\n result.push({\n ...node,\n children: projectedChildren,\n });\n } else {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-tree.ts","s":145,"e":204,"m":1776339356046.7812,"t":"type NodePredicate = (node: SidebarTreeNode) => boolean;\n\nfunction projectTree(nodes: SidebarTreeNode[], predicate: NodePredicate): SidebarTreeNode[] {\n const result: SidebarTreeNode[] = [];\n nodes.forEach((node) => {\n const projectedChildren = projectTree(node.children, predicate);\n if (predicate(node)) {\n result.push({\n ...node,\n children: projectedChildren,\n });\n } else {\n result.push(...projectedChildren);\n }\n });\n return result;\n}\n\nexport function flattenDocumentTree(\n nodes: SidebarTreeNode[],\n expanded: Set<string>,\n depth = 0,\n parentId: string | null = null,\n): Array<{ node: SidebarTreeNode; depth: number; parentId: string | null }> {\n const list: Array<{ node: SidebarTreeNode; depth: number; parentId: string | null }> = [];\n nodes.forEach((node) => {\n list.push({ node, depth, parentId });\n if (node.children.length > 0 && expanded.has(node.id)) {\n list.push(...flattenDocumentTree(node.children, expanded, depth + 1, node.id));\n }\n });\n return list;\n}\n\nconst SECTION_META: Record<SidebarSectionId, { title: string; icon: string }> = {\n starred: { title: \"星标置顶\", icon: \"star\" },\n public: { title: \"公共页面\", icon: \"globe\" },\n shared: { title: \"共享页面\", icon: \"users\" },\n private: { title: \"私有 / 我的页面\", icon: \"lock\" },\n templates: { title: \"模板中心\", icon: \"grid\" },\n};\n\ntype SidebarSectionSnapshot = {\n id: SidebarSectionId;\n title: string;\n icon?: string;\n nodes: SidebarTreeNode[];\n};\n\nexport function buildSidebarSections(records: DocumentRecord[]): SidebarSectionSnapshot[] {\n const tree = buildSidebarTreeFromKernelProjection({\n records,\n projection: buildKernelSidebarProjection(records),\n });\n return buildSidebarSectionsFromTree(tree);\n}\n\nexport function buildSidebarSectionsFromTree(\n tree: SidebarTreeNode[],\n): SidebarSectionSnapshot[] {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/sidebar-tree.ts","s":193,"e":220,"m":1776339356046.7812,"t":"export function buildSidebarSections(records: DocumentRecord[]): SidebarSectionSnapshot[] {\n const tree = buildSidebarTreeFromKernelProjection({\n records,\n projection: buildKernelSidebarProjection(records),\n });\n return buildSidebarSectionsFromTree(tree);\n}\n\nexport function buildSidebarSectionsFromTree(\n tree: SidebarTreeNode[],\n): SidebarSectionSnapshot[] {\n const sections: Array<{ id: SidebarSectionId; predicate: NodePredicate }> = [\n { id: \"starred\", predicate: (node) => Boolean(node.is_starred) },\n { id: \"public\", predicate: (node) => node.access_scope === \"public\" },\n { id: \"shared\", predicate: (node) => node.access_scope === \"shared\" },\n { id: \"private\", predicate: (node) => node.access_scope === \"private\" },\n { id: \"templates\", predicate: (node) => node.is_template },\n ];\n\n return sections.map(({ id, predicate }) => ({\n id,\n title: SECTION_META[id].title,\n icon: SECTION_META[id].icon,\n nodes: projectTree(tree, predicate),\n }));\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection-contract.test.ts","s":1,"e":48,"m":1778081112880.5393,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildPageTreeProjectionItems } from \"@/lib/tree-projection\";\n\ndescribe(\"tree-projection contract\", () => {\n it(\"page_tree projection item 持续输出共享 contract 字段\", () => {\n const items = buildPageTreeProjectionItems([\n {\n access_scope: \"private\",\n id: \"root\",\n workspace_id: \"ws_1\",\n title: \"Root\",\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: null,\n children: [],\n },\n ]);\n\n expect(items).toHaveLength(1);\n expect(items[0]).toMatchObject({\n rowId: \"page:root\",\n nodeId: \"root\",\n parentNodeId: null,\n projectionKind: \"page_tree\",\n expandable: false,\n expandedByDefault: true,\n iconHint: \"page\",\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"root\",\n iconHint: \"page\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1/documents/root\",\n storageIdentity: \"root\",\n operationProfile: \"convex_workspace\",\n },\n },\n },\n });\n expect(items[0]?.capabilities).toContain(\"open\");\n });\n});","v":"JEQBPDlnxTwMZhy+P2aSvb8NDD2Bqku98GmUvQHiKT2A2AS7jyuNuyBNDDzOFwo91S6FPRcVAL0IGgG9+Hcbvb08lTx+nmC9BtIdPdJ6A7yE+wG9bV5OvZoCK73Mq1Q76v5kPRDbpz0mYM+8UNPtPMVejLxfafM8UsSqPQkeYD1cZe47wVWuvJBbR702Kui8SJA7uxU3r7zAxfm8UqAzPIdI07zGr0G8trqCvCeGPL30r948jCERvJfRcz1Dijs8bMpIPeIBhLxyBYU7dvPMvA9zIjwlQDk8sEgUPvd6hz0z7gC9C7IWvDDDGj2kacQ67TRSvP+EDD3C4EG8IsLBPRxBcD2Ri528Cg5EvYEHKD3EviC9iYu1PC2VZD15Jyg9dqeQPJpxmL2Gq3y9iP2hO6yJtryitx29obdVvP0IfT1Rbw29uWpZO/YLuDzSxiU8ZWMgPZ+7pbxEr+A8pdowu7aXIbws0649va95PfziCbxdrqW7GaTROxvIcb2ciUO8YBw0vKrHg7wJ9gW9NXKOvEubAj2GZUQ82iWSO9DybLzQyNa7wMuePZCKM7yzfRm9wU8Fvfc4/byb8BW8i5oRPecUeL0giFC9CMqhOjYYg70PP8Q83ucivIJfL7y4Thk9BWUKvLexHLy3DYg8p/RcPfabST0ZIFA4T09lvCkK2rlZJFM8dYtKvbgtgbuZIoC8IgxqvfQZ3Dz/TG49r0NIPV/fzLx+HYu8WfUbPVVG8DxnTgI8/iqVPNS6gr3tgIO83V2uPGGxHr1ikos9iG7gvLEX3rzrCWK8hhVpvUVIND2Ozde8uOb+PLALmrspWwe9bskGPcV76jvMA+A8n5z7PJFTJT2epbS8yZtTvaoEcj0nJpu8E3ONvY+YljwpdEk8CHEDPTK9Fz3etSO9T4JAvQChArwR/1S8v94zvaxOO7xXeK48MCtTvH66UTwMQkO8bpx2POOfJ7276O08aWzxOLGDtb2CexW9c5xGvDFqAr36X+I6Nd7vujj+tjsjFDq9L0GNvSrSGr0kDQg7JcGJvUhfnzymedG8o36oPGSd5bwJ0y48FZ9MPFtNpbyVXTo8VK6UveXhAD0Uhwi9Nn07PRcVO7z6S0M9u02OPVHoCL114Rk9jzxQPS4EZrzoIxQ9xZ50vA8kG7zGuUe95GgtuyUz2jzPHUu9Rx35PGagKT3bEZs8NAVYPBHWjjvzwwc8l+yQO/VVALtni3C9c32IvW8OSTqA5DA9ZeOSPPHn7zxcbTi8dXSEPHtpgDx+eZA6+A2XO9YsQbyxo3c7NCtyvD3v4bzBD3W8W6b/PLEn3byBxf88fQAsPWqD/bwyGoS6wntmPdytOz1E48a6A3cUvddz8Tu5thu97oajvLRvmb3hPdw8+kJAvRtfRz1Xufk71OhPvfJeSb2WeNm7xiCevJa1vzydBxw6cq9vO3vhLDwahf68RP67PGD+QT1eBom8JhM7u787ezwjgyW9TdOqu4f8hb000Xy9c2HcvHjB+zy13xq9fABwPHZzC70AYYo6QYd9vP2rbbzm3pC7B5KmuSiuUL33gIg9vzH4O8LrAzzKFw89TyDYO2plVDw4vAi9cC0gvfFoVz2zD7s92u92PVxW2bztOlO9PjZhPfjfJbw6/zY8zr7+vB3thr2wpqu9VnQ8vWHfKzxzIBC9UGyJPE/qlzyHfUU9u1nNO0iJmrzPdhS8pPaGvAtV4juPvYU8pzIhvToQsjyEFjQ8HG8APVxMDDyDQbu8zrhtPbU//TySGs07OvsovemrLztdRTG9IRdUvJvLrjzaHdI7KlEfPS5BhjzOSPa8GEbhPG0NYj0Fwgm9OvmMvAyLPrytVEK8pFyEPSyDAD0V7Q29c7WOPEzU47pm29k8rcTwPLUV1Dyc/gs94IjzOxm57DsuvTc7lHFkO0RNRLsdyMU8NqiJvGQAKr0X8f483twjPbZcqzxEoo897wgMPSJjdTuG9gS9elSbu21JTrrH3SI9Ph+AvNWQIr1tsQm9u/PqvLbAizwP6oY9nUCxvAxQHDzfNKQ6iV59vEuLoTznJze8pIGcPKrubLo3dZ240esNu9rW27wMmgq6sjspPC+oBTyLuM+8rVpePHA2WD2Fsb28GFInuhiEPr2Ov4W9Ag1xPWwF0TtAcLm8qW2OvB5LMrxMeYg7v6GkPBUM2LtU/HO6bBg0PdG5Njx8Dz29g4UpPEHOYjwqWp89D3zFOUK5Kb21ZPG6qVUrvWqk/TwfjnU9mkJUPPARkT1jVrA8s2mQvD90nDsQoDm8BV2Tvc9jZruFQCw78QlNPeKlULzjema8OwUvPW5WjDz6snQ9jI4gvDmkPT3QR+c8XswevSehbzxqt069UTjlOxozkz2GmyY85E3qO+5AQr0Q1sQ8cn/fvLayBTyycBw9xugsvXv2AD7pSy69DU2EPFpTUT0NotO79oKFPG4CZbdRsqU7bUqsvUmuOLs058G7kGgJvRheRb3U/s+82Fs1PD/pcD0PIoe9HfLRO1PTAz28TZs706ZHPU7CiD2dKyy9c8MdPFQ8qrydj2I7GPGMPBFZaL0F
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.test.ts","s":1,"e":60,"m":1776354871424.8655,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n buildPageTreeProjectionItems,\n buildPickerTreeItems,\n filterVisiblePageTreeProjectionItems,\n} from \"./tree-projection\";\n\ndescribe(\"buildPageTreeProjectionItems\", () => {\n it(\"按当前树结构重建 parent/depth,而不是信任陈旧节点字段\", () => {\n const rows = buildPageTreeProjectionItems([\n {\n access_scope: \"private\",\n id: \"root\",\n workspace_id: \"w\",\n title: \"Root\",\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n kernel: {\n nodeType: \"page\",\n depth: 0,\n position: 0,\n childCount: 1,\n expandedByDefault: true,\n },\n children: [\n {\n access_scope: \"private\",\n id: \"child\",\n workspace_id: \"w\",\n title: \"Child\",\n parent_id: null,\n sort_order: 9,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n kernel: {\n nodeType: \"page\",\n depth: 0,\n position: 9,\n childCount: 0,\n expandedByDefault: true,\n },\n children: [],\n },\n ],\n },\n ]);\n\n expect(rows.map((item) => ({\n nodeId: item.nodeId,\n parentNodeId: item.parentNodeId,\n depth: item.depth,\n }))).toEqual([\n { nodeId: \"root\", parentNodeId: null, depth: 0 },\n { nodeId: \"child\", parentNodeId: \"root\", depth: 1 },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.test.ts","s":49,"e":108,"m":1776354871424.8655,"t":"},\n ],\n },\n ]);\n\n expect(rows.map((item) => ({\n nodeId: item.nodeId,\n parentNodeId: item.parentNodeId,\n depth: item.depth,\n }))).toEqual([\n { nodeId: \"root\", parentNodeId: null, depth: 0 },\n { nodeId: \"child\", parentNodeId: \"root\", depth: 1 },\n ]);\n expect(rows[1]?.node.parent_id).toBe(\"root\");\n expect(rows[1]?.node.kernel?.depth).toBe(1);\n });\n});\n\ndescribe(\"filterVisiblePageTreeProjectionItems\", () => {\n it(\"只返回当前展开路径上的可见页面\", () => {\n const items = buildPageTreeProjectionItems([\n {\n access_scope: \"private\",\n id: \"root\",\n workspace_id: \"w\",\n title: \"Root\",\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [\n {\n access_scope: \"private\",\n id: \"child\",\n workspace_id: \"w\",\n title: \"Child\",\n parent_id: \"root\",\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [\n {\n access_scope: \"private\",\n id: \"leaf\",\n workspace_id: \"w\",\n title: \"Leaf\",\n parent_id: \"child\",\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [],\n },\n ],\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.test.ts","s":97,"e":156,"m":1776354871424.8655,"t":"workspace_id: \"w\",\n title: \"Leaf\",\n parent_id: \"child\",\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [],\n },\n ],\n },\n ],\n },\n ]);\n\n expect(filterVisiblePageTreeProjectionItems(items, new Set()).map((item) => item.nodeId)).toEqual([\"root\"]);\n expect(filterVisiblePageTreeProjectionItems(items, new Set([\"root\"])).map((item) => item.nodeId)).toEqual([\n \"root\",\n \"child\",\n ]);\n expect(\n filterVisiblePageTreeProjectionItems(items, new Set([\"root\", \"child\"])).map(\n (item) => item.nodeId,\n ),\n ).toEqual([\"root\", \"child\", \"leaf\"]);\n });\n});\n\ndescribe(\"buildPickerTreeItems\", () => {\n it(\"复用 page_tree projection 生成 picker 列表\", () => {\n const items = buildPageTreeProjectionItems([\n {\n access_scope: \"private\",\n id: \"a\",\n workspace_id: \"w\",\n title: \"A\",\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [\n {\n access_scope: \"private\",\n id: \"b\",\n workspace_id: \"w\",\n title: null,\n parent_id: \"a\",\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [],\n },\n ],\n },\n ]);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.test.ts","s":145,"e":163,"m":1776354871424.8655,"t":"title: null,\n parent_id: \"a\",\n sort_order: 0,\n is_starred: false,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [],\n },\n ],\n },\n ]);\n\n expect(buildPickerTreeItems(items, [\"a\"])).toEqual([\n { id: \"b\", title: \"无标题\", depth: 1 },\n ]);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.ts","s":1,"e":60,"m":1778081152793.0762,"t":"import type { SidebarTreeNode } from \"@/lib/kernel-sidebar\";\nimport type {\n TreeProjectionCapability,\n TreeProjectionItemBase,\n TreeProjectionSourceMetadata,\n} from \"@/lib/tree-protocol\";\n\nexport type PageTreeProjectionItem = {\n rowId: `page:${string}`;\n} & TreeProjectionItemBase & {\n node: SidebarTreeNode;\n};\n\nexport type PickerTreeItem = {\n id: string;\n title: string;\n depth: number;\n};\n\nfunction buildPageCapabilities(childCount: number): TreeProjectionCapability[] {\n const capabilities: TreeProjectionCapability[] = [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ];\n if (childCount > 0) {\n capabilities.unshift(\"expand\");\n }\n return capabilities;\n}\n\nfunction buildPageSourceMetadata(node: SidebarTreeNode): TreeProjectionSourceMetadata {\n return {\n sourceKind: \"convex_workspace\",\n sourceUri: `convex://workspace/${node.workspace_id}/documents/${node.id}`,\n relativePath: `documents/${node.id}`,\n storageIdentity: node.id,\n operationProfile: \"convex_workspace\",\n };\n}\n\nexport function buildPageTreeProjectionItems(\n nodes: SidebarTreeNode[],\n): PageTreeProjectionItem[] {\n const items: PageTreeProjectionItem[] = [];\n const visited = new Set<string>();\n\n const walk = (\n entries: SidebarTreeNode[],\n depth: number,\n parentNodeId: string | null,\n ) => {\n entries.forEach((node, index) => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.ts","s":49,"e":108,"m":1778081152793.0762,"t":"export function buildPageTreeProjectionItems(\n nodes: SidebarTreeNode[],\n): PageTreeProjectionItem[] {\n const items: PageTreeProjectionItem[] = [];\n const visited = new Set<string>();\n\n const walk = (\n entries: SidebarTreeNode[],\n depth: number,\n parentNodeId: string | null,\n ) => {\n entries.forEach((node, index) => {\n if (visited.has(node.id)) {\n return;\n }\n visited.add(node.id);\n\n const childCount = node.children.length;\n items.push({\n rowId: `page:${node.id}`,\n nodeId: node.id,\n parentNodeId,\n nodeType: \"page\",\n projectionKind: \"page_tree\",\n depth,\n position: node.kernel?.position ?? node.sort_order ?? index,\n title: node.title ?? \"无标题\",\n childCount,\n expandable: childCount > 0,\n expandedByDefault: node.kernel?.expandedByDefault ?? true,\n capabilities: buildPageCapabilities(childCount),\n resourceMeta: {\n resourceKind: \"document\",\n documentId: node.id,\n workspaceId: node.workspace_id,\n iconHint: \"page\",\n extra: {\n source: buildPageSourceMetadata(node),\n },\n },\n iconHint: \"page\",\n node: {\n ...node,\n parent_id: parentNodeId,\n kernel: node.kernel\n ? {\n ...node.kernel,\n depth,\n position: node.kernel.position ?? node.sort_order ?? index,\n childCount,\n }\n : {\n nodeType: \"page\",\n depth,\n position: node.sort_order ?? index,\n childCount,\n expandedByDefault: true,\n },\n },\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.ts","s":97,"e":156,"m":1778081152793.0762,"t":"position: node.kernel.position ?? node.sort_order ?? index,\n childCount,\n }\n : {\n nodeType: \"page\",\n depth,\n position: node.sort_order ?? index,\n childCount,\n expandedByDefault: true,\n },\n },\n });\n if (childCount > 0) {\n walk(node.children, depth + 1, node.id);\n }\n });\n };\n\n walk(nodes, 0, null);\n return items;\n}\n\nexport function filterVisiblePageTreeProjectionItems(\n items: PageTreeProjectionItem[],\n expanded: Set<string>,\n): PageTreeProjectionItem[] {\n const visible: PageTreeProjectionItem[] = [];\n const visibleIds = new Set<string>();\n\n items.forEach((item) => {\n if (!item.parentNodeId) {\n visible.push(item);\n visibleIds.add(item.nodeId);\n return;\n }\n\n if (!visibleIds.has(item.parentNodeId)) {\n return;\n }\n\n if (!expanded.has(item.parentNodeId)) {\n return;\n }\n\n visible.push(item);\n visibleIds.add(item.nodeId);\n });\n\n return visible;\n}\n\nexport function buildPickerTreeItems(\n items: PageTreeProjectionItem[],\n excludeIds: Iterable<string> = [],\n): PickerTreeItem[] {\n const excluded = new Set(excludeIds);\n return items\n .filter((item) => !excluded.has(item.nodeId))\n .map((item) => ({\n id: item.nodeId,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-projection.ts","s":145,"e":161,"m":1778081152793.0762,"t":"return visible;\n}\n\nexport function buildPickerTreeItems(\n items: PageTreeProjectionItem[],\n excludeIds: Iterable<string> = [],\n): PickerTreeItem[] {\n const excluded = new Set(excludeIds);\n return items\n .filter((item) => !excluded.has(item.nodeId))\n .map((item) => ({\n id: item.nodeId,\n title: item.title,\n depth: item.depth,\n }));\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-protocol.test.ts","s":1,"e":60,"m":1778081105120.4348,"t":"import { describe, expect, it } from \"vitest\";\nimport type {\n TreeProjectionItemBase,\n WorkspaceSource,\n} from \"@/lib/tree-protocol\";\n\ndescribe(\"tree-protocol\", () => {\n it(\"冻结 WorkspaceSource 合同字段\", () => {\n const source: WorkspaceSource = {\n sourceKind: \"convex_workspace\",\n rootUri: \"convex://workspace/ws_1\",\n workspaceId: \"ws_1\",\n capabilities: [\n \"load-snapshot\",\n \"watch\",\n \"preflight-command\",\n \"execute-command\",\n \"resolve-page-aggregate\",\n ],\n };\n\n expect(source.sourceKind).toBe(\"convex_workspace\");\n expect(source.rootUri).toContain(\"workspace/ws_1\");\n expect(source.capabilities).toContain(\"load-snapshot\");\n });\n\n it(\"冻结共享 tree projection 字段与 file_tree 扩展语义\", () => {\n const item: TreeProjectionItemBase = {\n nodeId: \"doc_1\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"页面 1\",\n depth: 0,\n position: 1,\n childCount: 2,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\"expand\", \"open\", \"drag\", \"drop\", \"select\", \"create-child\"],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_1\",\n assetKind: \"file\",\n iconHint: \"page\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1\",\n relativePath: \"docs/doc_1.md\",\n storageIdentity: \"doc_1\",\n operationProfile: \"convex_workspace\",\n },\n },\n },\n iconHint: \"page\",\n };\n\n expect(item.resourceMeta.resourceKind).toBe(\"document\");\n expect(item.resourceMeta.assetKind).toBe(\"file\");\n expect(item.resourceMeta.extra?.source).toMatchObject({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-protocol.test.ts","s":49,"e":72,"m":1778081105120.4348,"t":"relativePath: \"docs/doc_1.md\",\n storageIdentity: \"doc_1\",\n operationProfile: \"convex_workspace\",\n },\n },\n },\n iconHint: \"page\",\n };\n\n expect(item.resourceMeta.resourceKind).toBe(\"document\");\n expect(item.resourceMeta.assetKind).toBe(\"file\");\n expect(item.resourceMeta.extra?.source).toMatchObject({\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1\",\n relativePath: \"docs/doc_1.md\",\n storageIdentity: \"doc_1\",\n operationProfile: \"convex_workspace\",\n });\n expect(item.capabilities).toContain(\"expand\");\n expect(item.expandable).toBe(true);\n expect(item.iconHint).toBe(\"page\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-protocol.ts","s":1,"e":60,"m":1778081084648.1594,"t":"export type TreeProjectionKind = \"sidebar_tree\" | \"page_tree\" | \"file_tree\";\n\nexport type WorkspaceSourceKind = \"local_folder\" | \"convex_workspace\";\n\nexport type WorkspaceSourceCapability =\n | \"load-snapshot\"\n | \"watch\"\n | \"preflight-command\"\n | \"execute-command\"\n | \"resolve-page-aggregate\";\n\nexport type WorkspaceSource = {\n sourceKind: WorkspaceSourceKind;\n rootUri: string;\n workspaceId: string;\n capabilities: WorkspaceSourceCapability[];\n};\n\nexport type TreeProjectionNodeType =\n | \"workspace\"\n | \"folder\"\n | \"page\"\n | \"section\"\n | \"asset\"\n | \"mindmap\"\n | \"table\"\n | \"book\"\n | \"pdf\"\n | \"index\";\n\nexport type TreeProjectionCapability =\n | \"expand\"\n | \"open\"\n | \"drag\"\n | \"drop\"\n | \"select\"\n | \"create-child\"\n | \"rename\"\n | \"archive\"\n | \"restore\"\n | \"context-menu\"\n | \"reorder\"\n | \"open-asset\"\n | \"pick\";\n\nexport type TreeProjectionResourceKind =\n | \"workspace\"\n | \"document\"\n | \"index\"\n | \"asset\"\n | \"asset_folder\"\n | \"mindmap\"\n | \"table\"\n | \"book\"\n | \"pdf\";\n\nexport type TreeProjectionAssetKind =\n | \"file\"\n | \"mindmap\"\n | \"table\"","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-protocol.ts","s":49,"e":108,"m":1778081084648.1594,"t":"| \"index\"\n | \"asset\"\n | \"asset_folder\"\n | \"mindmap\"\n | \"table\"\n | \"book\"\n | \"pdf\";\n\nexport type TreeProjectionAssetKind =\n | \"file\"\n | \"mindmap\"\n | \"table\"\n | \"book\"\n | \"pdf\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"unknown\";\n\nexport type TreeProjectionSourceOperationProfile =\n | \"local_readonly\"\n | \"convex_workspace\";\n\nexport type TreeProjectionSourceMetadata = {\n sourceKind: WorkspaceSourceKind;\n sourceUri: string;\n relativePath?: string | null;\n storageIdentity?: string | null;\n operationProfile?: TreeProjectionSourceOperationProfile | null;\n};\n\nexport type TreeProjectionResourceExtra = {\n source?: TreeProjectionSourceMetadata | null;\n} & Record<string, unknown>;\n\nexport type TreeProjectionResourceMeta = {\n resourceKind: TreeProjectionResourceKind;\n documentId?: string | null;\n assetId?: string | null;\n workspaceId?: string | null;\n assetKind?: TreeProjectionAssetKind | null;\n iconHint?: string | null;\n extra?: TreeProjectionResourceExtra;\n};\n\nexport type TreeProjectionItemBase = {\n nodeId: string;\n parentNodeId: string | null;\n nodeType: TreeProjectionNodeType;\n projectionKind: TreeProjectionKind;\n title: string;\n depth: number;\n position: number | null;\n childCount: number;\n expandable: boolean;\n expandedByDefault: boolean;\n capabilities: TreeProjectionCapability[];\n resourceMeta: TreeProjectionResourceMeta;\n iconHint: string | null;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-protocol.ts","s":97,"e":109,"m":1778081084648.1594,"t":"nodeType: TreeProjectionNodeType;\n projectionKind: TreeProjectionKind;\n title: string;\n depth: number;\n position: number | null;\n childCount: number;\n expandable: boolean;\n expandedByDefault: boolean;\n capabilities: TreeProjectionCapability[];\n resourceMeta: TreeProjectionResourceMeta;\n iconHint: string | null;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-route-boundary.test.ts","s":1,"e":47,"m":1777368206756.113,"t":"import { describe, expect, it } from \"vitest\";\nimport { TREE_3000_ROUTE_BOUNDARY_MANIFEST } from \"./tree-route-boundary\";\n\ndescribe(\"TREE_3000_ROUTE_BOUNDARY_MANIFEST\", () => {\n it(\"固定 3000 route 的 Rust Web gateway owner 与 legacy compat 边界\", () => {\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST).toMatchObject({\n schema: \"mnote.tree.3000_route_boundary\",\n schemaVersion: 1,\n publicEntry: \"3000\",\n });\n\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST.routes).toEqual(\n expect.arrayContaining([\n expect.objectContaining({\n id: \"tree.commands\",\n role: \"rust-owned\",\n route: \"/api/tree/commands\",\n owner: \"rust-web-gateway\",\n }),\n expect.objectContaining({\n id: \"tree.stream\",\n role: \"rust-owned\",\n route: \"/api/tree/stream\",\n owner: \"rust-web-gateway\",\n }),\n expect.objectContaining({\n id: \"tree.shell.debug\",\n role: \"compat-pending\",\n route: \"/api/tree/shell\",\n owner: \"next-app-router-legacy\",\n }),\n ]),\n );\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST.rustOwnedSemantics).toContain(\"tree.subtree.move\");\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST.nextThinProxyDuties).toContain(\n \"legacy route alias 与 header 透传\",\n );\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST.browserSubstrateDuties).toContain(\n \"新页面 scaffold 文件创建\",\n );\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST.forbiddenNextSemantics).toContain(\"树排序 canonical plan\");\n expect(TREE_3000_ROUTE_BOUNDARY_MANIFEST.forbiddenNextSemantics).toContain(\n \"主 tree command transport owner\",\n );\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-route-boundary.ts","s":1,"e":60,"m":1777368192731.9355,"t":"export type TreeRouteBoundaryRole =\n | \"rust-owned\"\n | \"next-thin-proxy\"\n | \"legacy-thin-proxy\"\n | \"browser-substrate\"\n | \"compat-pending\";\n\nexport type TreeRouteBoundaryItem = {\n id: string;\n role: TreeRouteBoundaryRole;\n route: string;\n owner: \"rust-runtime\" | \"rust-web-gateway\" | \"next-app-router-legacy\" | \"convex-substrate\";\n description: string;\n};\n\nexport const TREE_3000_ROUTE_BOUNDARY_MANIFEST = {\n schema: \"mnote.tree.3000_route_boundary\",\n schemaVersion: 1,\n publicEntry: \"3000\",\n routes: [\n {\n id: \"tree.commands\",\n role: \"rust-owned\",\n route: \"/api/tree/commands\",\n owner: \"rust-web-gateway\",\n description:\n \"浏览器公开树命令入口由 Rust Web gateway 拥有;legacy Next 仅保留 cookie/header compat 和浏览器 substrate 能力。\",\n },\n {\n id: \"tree.stream\",\n role: \"rust-owned\",\n route: \"/api/tree/stream\",\n owner: \"rust-web-gateway\",\n description:\n \"浏览器 SSE/polling 入口由 Rust Web gateway 拥有,legacy Next 只作为迁移期 alias。\",\n },\n {\n id: \"tree.shell.debug\",\n role: \"compat-pending\",\n route: \"/api/tree/shell\",\n owner: \"next-app-router-legacy\",\n description:\n \"仅服务显式 debug/internal runtime 验证;3000 主路径使用 same-origin inline host,不应默认请求 mnote-web:3104。\",\n },\n ] satisfies TreeRouteBoundaryItem[],\n rustOwnedSemantics: [\n \"tree.node.create\",\n \"tree.node.rename\",\n \"tree.subtree.move\",\n \"tree.node.archive\",\n \"tree.node.restore\",\n \"tree.node.purge\",\n \"tree.subtree.copy\",\n \"tree.node.embed\",\n ],\n nextThinProxyDuties: [\n \"cookie/auth 读取与 Convex client 获取\",\n \"workspace bootstrap\",\n \"legacy route alias 与 header 透传\",\n \"tree.subtree.move 的 sidebar snapshot preflight 数据采集\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-route-boundary.ts","s":49,"e":79,"m":1777368192731.9355,"t":"\"tree.subtree.move\",\n \"tree.node.archive\",\n \"tree.node.restore\",\n \"tree.node.purge\",\n \"tree.subtree.copy\",\n \"tree.node.embed\",\n ],\n nextThinProxyDuties: [\n \"cookie/auth 读取与 Convex client 获取\",\n \"workspace bootstrap\",\n \"legacy route alias 与 header 透传\",\n \"tree.subtree.move 的 sidebar snapshot preflight 数据采集\",\n ],\n browserSubstrateDuties: [\n \"新页面 scaffold 文件创建\",\n \"复制页面后的 mindmap 文件复制\",\n \"页面嵌入前读取目标内容、源页面标题与 anchor block,作为 Rust Page Aggregate embed plan 的 preflight substrate\",\n \"文件字节读取、upload URL、cookie/auth 等浏览器入口能力\",\n ],\n compatPending: [] satisfies TreeRouteBoundaryItem[],\n forbiddenNextSemantics: [\n \"树合法性判断\",\n \"树排序 canonical plan\",\n \"长期 streamDelta 主语义拼装\",\n \"tree shell renderer runtime\",\n \"tree.node.embed 的 pageReference block 结构与插入位置语义\",\n \"主 tree command transport owner\",\n \"主 tree stream transport owner\",\n ],\n} as const;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/type-guards.ts","s":1,"e":60,"m":1773495684381.4758,"t":"/**\n * 类型守卫和类型断言工具\n * 用于替代 `any` 类型,提供更安全的类型检查\n */\n\n/**\n * 检查值是否为普通对象(非 null、非数组)\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * 检查值是否为字符串\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * 检查值是否为数字(有限)\n */\nexport function isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\n/**\n * 检查值是否为数组\n */\nexport function isArray<T = unknown>(value: unknown, itemGuard?: (item: unknown) => item is T): value is T[] {\n if (!Array.isArray(value)) return false;\n if (itemGuard) {\n return value.every(itemGuard);\n }\n return true;\n}\n\n/**\n * 检查对象是否包含指定的属性\n */\nexport function hasProperty<K extends string>(\n obj: unknown,\n key: K,\n): obj is Record<K, unknown> {\n return isPlainObject(obj) && key in obj;\n}\n\n/**\n * 检查对象是否包含多个指定的属性\n */\nexport function hasProperties<K extends string>(\n obj: unknown,\n keys: K[],\n): obj is Record<K, unknown> {\n if (!isPlainObject(obj)) return false;\n return keys.every(key => key in obj);\n}\n\n/**\n * 从对象中安全地提取字符串属性","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/type-guards.ts","s":49,"e":108,"m":1773495684381.4758,"t":"* 检查对象是否包含多个指定的属性\n */\nexport function hasProperties<K extends string>(\n obj: unknown,\n keys: K[],\n): obj is Record<K, unknown> {\n if (!isPlainObject(obj)) return false;\n return keys.every(key => key in obj);\n}\n\n/**\n * 从对象中安全地提取字符串属性\n */\nexport function getStringProperty(obj: unknown, key: string, defaultValue: string = \"\"): string {\n if (!isPlainObject(obj)) return defaultValue;\n const value = obj[key];\n return isString(value) ? value : defaultValue;\n}\n\n/**\n * 从对象中安全地提取数字属性\n */\nexport function getNumberProperty(obj: unknown, key: string, defaultValue: number = 0): number {\n if (!isPlainObject(obj)) return defaultValue;\n const value = obj[key];\n return isFiniteNumber(value) ? value : defaultValue;\n}\n\n/**\n * 从对象中安全地提取布尔属性\n */\nexport function getBooleanProperty(obj: unknown, key: string, defaultValue: boolean = false): boolean {\n if (!isPlainObject(obj)) return defaultValue;\n const value = obj[key];\n return typeof value === \"boolean\" ? value : defaultValue;\n}\n\n/**\n * 从对象中安全地提取数组属性\n */\nexport function getArrayProperty<T = unknown>(\n obj: unknown,\n key: string,\n defaultValue: T[] = [],\n): T[] {\n if (!isPlainObject(obj)) return defaultValue;\n const value = obj[key];\n return Array.isArray(value) ? value as T[] : defaultValue;\n}\n\n/**\n * 检查是否为 Supabase 行对象(包含 id 属性)\n */\nexport function isDatabaseRow(value: unknown): value is { id: string | number; [key: string]: unknown } {\n return isPlainObject(value) && (\"id\" in value);\n}\n\n/**\n * 检查是否为 Supabase 行数组\n */","v":"z+IuPXRyeTxDFQG+6xmTvUv7yjw+Y768QtZMO9VEpLy5nLk8VFY0vdzhsr2Hyk499dV1PeW2yLxMmIo9AuAjvSwlv7yxDbi8+nEpO2vvND3iJNQ8wYWUPM9bJ7tf3rS89a1iPWHtET2qUhs9mMyqOxSNxbzNohE9EVDSOR3xJruKvAY8fz3pO5Zexb2nTBq9yMlqPOd4wbz4nRY9hoIhPM8DXLu+2N08NbKeOlLMh7wex8g9a+DEvNDEwj1blgc9PTKJPUO4oL2EYVo7jt3FvFNlVj18LJC7981iPZO5Xj19NjK8yGKrO+toQz12M+K6EyUhvDzZeT1pPCq7xnoaPVzraj1KUHG8rxTUvNgT+zwn9Wk8zRWzO7lXPz0SDPc8NuQOPNWVsLyzl069wH0oPfNUzzxsrEy9+t8tvdwVZj31TLi8tZnAvMPkRT2dDG08m3U4PYiH3Lx6J2U7DPuvPEokt7wPD289V6HJPC70trzjij49vbaZPDmiUL2q8OA78+8VvV9OiT3kvD4809oKvVPikDyGYvC8P2FbO4q4EjzWWGm7zKsaPY6KXD1aNsc8//AZvezihLss4+Y7bT+gPQjHLb10Wpm8moTgPMtOY7wknq07Uz6Du7rEo7y/UwY9zwt/vFZIibxWINY7U2aLPMWrSj0/eSI9pssCve6SHD2VGIQ8xC+ivbGRWb1T43E7FQTfPK08gjwFSAU9wgoPPUt6aL1xOzC8b59Zuzeksbymr2A71OyuvCnA7bwe9c68d8NSO0+Pnrq8a449q5g1vXZSgr32jfa7jaeZu+WTajyjsjG7R8i4PNckPj0sv/e8HDtiPXXLBrzNXKK7TugsPDK/Xjwacz492/1VvE9SFT3JfqK81TQzvTlXPDzRZkw9LfGxu7d4GT3+jNG9XhdHvRhA3zyvNhM805sxvFIfHzw8v6c85y0wvFsB/Tv7+v28wqIiu6Hye7111nM9ttGAPFitNL1Fr4E88wOQPNd8V7vl5Qo8OzpwvSNqsDtZQQ69zSVMvU1/ejx7KBa9+QNcvT0Szzv9CYm8GDPpPAwQqLzu4zG6wMT+OccuKj027Ui9m1cfvV6tFjy/lXe8cNl+PTM297yqYke8OApWPSBhFb3+HaU7wfpDPd8Vu7u/XkA8meKmu1uNsLxY8Xi9Q8T1vF7dRD0dGJi8V8cwPQTCBj0vjRU9Jo6ePcjRhr3axLE8kLPvuyWwOrypH8+8vwO2vTsH9Dzb3d48rEytvIvthTwwKxw9uTe4PavZNTxVs6w9NUEavAgkg7w/LV48BBhFvNKs0bz4tSK8LcJKvADFybyypfQ76nOsPNvs2buV6h49g+SvPOO3Wz2SD2492PRJvIdf8rxRGQq89eBpPACiA7064Xa6I/kDvUPdoz17fxW9bjbxvG3FF70hote8spUuPDJyM7wGrL48GDYPPOjj7jyVS628HXtWPY4DzTtwPuy7tVfEPDa/bTkKGBu9xioyvcid+byuN6y8Q74cvVgfCjrVUOS8Y0MPPWXWzrzjUKe8oXcNvbo1czxhJo28dJv9PAakhzzS1js9Tq8Fvbs3BD0C81y8by8UvSuEXbxCk/S8ve5YPNi9Yzwwvj09fzhKPD8EBDxT2wC88YwmPT89AL3X3Lo8cpIUvOoQP72EbII8VeXJvCc42DwR61m94Z6NPIwZMD0XJIC8yO5qPXAIqTvCyjK9JPHLvexeUz1cLK28yYLYubbuSj18SgS9dcq/OpQSTLyALy+9WgkiPaQwJD0h0qY8Nb+ru4+7hr2zmIM8d1pcvCCfsryevWq86AY6PZuqPD2yg9q7bV4HPfVPU7yhk5I8UlwOPe26K71ZUsE7muLWPDHKc7wUPA69yTPdvF0fpTkcsMM76NqHPOwzLD2XhyE8vomUPFK7IrzamCu7VmIJPWLuUzzx+1I8HTZMPF4BcTziGk08TvFHPa1PFjyBWCS9usNmO+Q6SLzwfV699KGTPBKNRbxelBa9N1RWvQiLG703ZCs8EYsGve3XDD1F26s8xaE0vXorfD0ZfUQ7hT2TPD8C4jxwwag6hXWQOqNQkrwFqwM9XeRdvKtPbb14Aas8tVhzu2DFiz0jsge9o/kZvIHsljxlz4m8V9NvvFaFqr02SIe9RNIhPMRZMbtOZhW8mJIBPT3wTDzY29K8FKWEPdOJ4rtRANc8xPw0PKIpEb3JtJ+8lZ4bPTHGCj1cBIY9tBAcPCBx1bzq8A69rp2Iu6xyKT22VbK8k8rPu/ggsz
|
|||
|
|
{"p":"wolai-frontend/src/lib/type-guards.ts","s":97,"e":156,"m":1773495684381.4758,"t":"}\n\n/**\n * 检查是否为 Supabase 行对象(包含 id 属性)\n */\nexport function isDatabaseRow(value: unknown): value is { id: string | number; [key: string]: unknown } {\n return isPlainObject(value) && (\"id\" in value);\n}\n\n/**\n * 检查是否为 Supabase 行数组\n */\nexport function isDatabaseRowArray(value: unknown): value is Array<{ id: string | number; [key: string]: unknown }> {\n return isArray(value) && value.every(isDatabaseRow);\n}\n\n/**\n * 类型断言:确保值不为 null/undefined\n */\nexport function assertNotNullOrUndefined<T>(value: T | null | undefined, message?: string): T {\n if (value === null || value === undefined) {\n throw new Error(message ?? \"值不能为 null 或 undefined\");\n }\n return value;\n}\n\n/**\n * 将 unknown 转换为 Record<string, unknown>,如果类型不匹配则返回空对象\n */\nexport function toRecord(value: unknown): Record<string, unknown> {\n return isPlainObject(value) ? value : {};\n}\n\n/**\n * 安全地访问嵌套对象属性\n * @example getNestedValue(obj, 'a.b.c') === obj?.a?.b?.c\n */\nexport function getNestedValue<T = unknown>(\n obj: unknown,\n path: string,\n defaultValue?: T,\n): T | undefined {\n const keys = path.split(\".\");\n let current: unknown = obj;\n\n for (const key of keys) {\n if (!isPlainObject(current)) {\n return defaultValue;\n }\n current = current[key];\n }\n\n return current as T ?? defaultValue;\n}\n\n/**\n * 检查响应是否为错误响应\n */\nexport function isErrorResponse(value: unknown): value is { error: string; details?: unknown } {\n return isPlainObject(value) && isString(value.error);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/type-guards.ts","s":145,"e":188,"m":1773495684381.4758,"t":"}\n current = current[key];\n }\n\n return current as T ?? defaultValue;\n}\n\n/**\n * 检查响应是否为错误响应\n */\nexport function isErrorResponse(value: unknown): value is { error: string; details?: unknown } {\n return isPlainObject(value) && isString(value.error);\n}\n\n/**\n * 从 unknown 类型中提取工具参数\n * 用于 AI agent 工具调用时的类型安全\n */\nexport function getToolArgs(args: unknown): Record<string, unknown> {\n if (isPlainObject(args)) {\n return args;\n }\n // 如果是数组或其他类型,返回空对象\n return {};\n}\n\n/**\n * 检查是否为 AI Agent 消息\n */\nexport function isAgentMessage(value: unknown): value is { role: \"user\" | \"assistant\"; content: string } {\n return (\n isPlainObject(value) &&\n (value.role === \"user\" || value.role === \"assistant\") &&\n isString(value.content)\n );\n}\n\n/**\n * 检查是否为 AI Agent 消息数组\n */\nexport function isAgentMessageArray(value: unknown): value is Array<{ role: \"user\" | \"assistant\"; content: string }> {\n return isArray(value) && value.every(isAgentMessage);\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/utils.ts","s":1,"e":7,"m":1773495684387.4758,"t":"import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/workspaces.ts","s":1,"e":60,"m":1773495684393.4758,"t":"type TypedClient = {\n from: (table: string) => any;\n};\n\ninterface WorkspaceMembershipRow {\n workspace_id: string;\n is_default: boolean;\n workspaces:\n | {\n id: string;\n name: string;\n type: \"personal\" | \"team\";\n icon_url: string | null;\n }\n | Array<{\n id: string;\n name: string;\n type: \"personal\" | \"team\";\n icon_url: string | null;\n }>\n | null;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n type: \"personal\" | \"team\";\n iconUrl: string | null;\n memberCount: number;\n isDefault: boolean;\n}\n\nexport async function ensureDefaultWorkspace(client: TypedClient, userId: string, fallbackName: string): Promise<void> {\n const { data: memberships, error } = await client\n .from(\"workspace_members\")\n .select(\"workspace_id\")\n .eq(\"user_id\", userId)\n .limit(1);\n\n if (error) {\n throw new Error(`获取工作空间成员信息失败:${error.message}`);\n }\n\n if (memberships && memberships.length > 0) {\n return;\n }\n\n const workspaceName = fallbackName.trim() ? `${fallbackName.trim()} 的空间` : \"我的空间\";\n\n const { data: workspace, error: workspaceError } = await client\n .from(\"workspaces\")\n .insert({\n name: workspaceName,\n type: \"personal\",\n created_by: userId,\n })\n .select(\"id\")\n .single();\n\n if (workspaceError || !workspace) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/workspaces.ts","s":49,"e":108,"m":1773495684393.4758,"t":"const { data: workspace, error: workspaceError } = await client\n .from(\"workspaces\")\n .insert({\n name: workspaceName,\n type: \"personal\",\n created_by: userId,\n })\n .select(\"id\")\n .single();\n\n if (workspaceError || !workspace) {\n throw new Error(`创建默认工作空间失败:${workspaceError?.message ?? \"未知错误\"}`);\n }\n\n const { error: memberError } = await client.from(\"workspace_members\").insert({\n workspace_id: workspace.id,\n user_id: userId,\n role: \"owner\",\n is_default: true,\n });\n\n if (memberError) {\n throw new Error(`创建工作空间成员失败:${memberError.message}`);\n }\n}\n\nexport async function fetchWorkspaceSummaries(\n client: TypedClient,\n userId: string,\n): Promise<{ workspaces: WorkspaceSummary[]; activeWorkspaceId: string }> {\n const { data: memberRows, error } = await client\n .from(\"workspace_members\")\n .select(\"workspace_id,is_default,workspaces(id,name,type,icon_url)\")\n .eq(\"user_id\", userId)\n .order(\"created_at\", { ascending: true });\n\n if (error) {\n throw new Error(`拉取工作空间列表失败:${error.message}`);\n }\n\n const rows: WorkspaceMembershipRow[] = (memberRows ?? []) as any;\n const workspaceIds = rows.map((row) => row.workspace_id);\n\n const memberCountMap: Record<string, number> = {};\n if (workspaceIds.length > 0) {\n const { data: memberCounts, error: countError } = await client\n .from(\"workspace_members\")\n .select(\"workspace_id\")\n .in(\"workspace_id\", workspaceIds);\n\n if (countError) {\n throw new Error(`统计成员数失败:${countError.message}`);\n }\n\n const countRows = (memberCounts ?? []) as Array<{ workspace_id: string }>;\n countRows.forEach((item) => {\n const workspaceId = item.workspace_id;\n memberCountMap[workspaceId] = (memberCountMap[workspaceId] ?? 0) + 1;\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/workspaces.ts","s":97,"e":152,"m":1773495684393.4758,"t":".select(\"workspace_id\")\n .in(\"workspace_id\", workspaceIds);\n\n if (countError) {\n throw new Error(`统计成员数失败:${countError.message}`);\n }\n\n const countRows = (memberCounts ?? []) as Array<{ workspace_id: string }>;\n countRows.forEach((item) => {\n const workspaceId = item.workspace_id;\n memberCountMap[workspaceId] = (memberCountMap[workspaceId] ?? 0) + 1;\n });\n }\n\n const summaries: WorkspaceSummary[] = rows\n .map((row) => {\n const workspace = Array.isArray(row.workspaces) ? row.workspaces[0] : row.workspaces;\n if (!workspace) {\n return null;\n }\n return {\n id: workspace.id,\n name: workspace.name,\n type: workspace.type,\n iconUrl: workspace.icon_url,\n memberCount: memberCountMap[workspace.id] ?? 1,\n isDefault: row.is_default,\n } satisfies WorkspaceSummary;\n })\n .filter(Boolean) as WorkspaceSummary[];\n\n const defaultWorkspace = summaries.find((workspace) => workspace.isDefault);\n const activeWorkspaceId = defaultWorkspace?.id ?? summaries[0]?.id ?? \"\";\n\n return {\n workspaces: summaries,\n activeWorkspaceId,\n };\n}\n\nexport async function resolveActiveWorkspaceId(client: TypedClient, userId: string): Promise<string> {\n const { data, error } = await client\n .from(\"workspace_members\")\n .select(\"workspace_id,is_default\")\n .eq(\"user_id\", userId)\n .order(\"is_default\", { ascending: false })\n .order(\"created_at\", { ascending: true })\n .limit(1);\n\n if (error) {\n throw new Error(`获取当前工作空间失败:${error.message}`);\n }\n\n return data?.[0]?.workspace_id ?? \"\";\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/url/browser-file-url.ts","s":1,"e":43,"m":1773495901228.865,"t":"\"use client\";\n\nconst isLocalHostname = (hostname: string) =>\n hostname === \"127.0.0.1\" || hostname === \"localhost\" || hostname === \"host.docker.internal\";\n\nconst base64UrlEncodeUtf8 = (input: string) => {\n const bytes = new TextEncoder().encode(input);\n let binary = \"\";\n bytes.forEach((b) => {\n binary += String.fromCharCode(b);\n });\n const b64 = btoa(binary);\n return b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n};\n\n/**\n * 将“仅本机可达”的 URL(例如 http://127.0.0.1:3210/api/storage/...)转换为浏览器可访问的地址。\n *\n * - 本地访问(页面本身是 localhost/127)时不改写\n * - 外网访问时,若目标是 localhost/127/host.docker.internal,则改为走 /api/onlyoffice/proxy 由 Next 服务端回源\n */\nexport const toBrowserAccessibleUrl = (rawUrl: string | null | undefined): string | null => {\n const input = String(rawUrl ?? \"\").trim();\n if (!input) return rawUrl ?? null;\n if (typeof window === \"undefined\") return input;\n\n try {\n if (input.startsWith(\"/api/onlyoffice/proxy\")) return input;\n const pageHost = window.location.hostname;\n if (isLocalHostname(pageHost)) return input;\n\n const u = new URL(input);\n if (!isLocalHostname(u.hostname)) return input;\n\n const proxy = new URL(\"/api/onlyoffice/proxy\", window.location.origin);\n proxy.searchParams.set(\"u\", base64UrlEncodeUtf8(input));\n return proxy.toString();\n } catch {\n return input;\n }\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/url/proxyForBrowser.test.ts","s":1,"e":54,"m":1773495901234.865,"t":"import { describe, expect, it } from \"vitest\";\nimport { maybeProxyForBrowserUrl } from \"@/lib/url/proxyForBrowser\";\n\nconst buildReq = () =>\n new Request(\"https://example.com/api/test\", {\n headers: {\n \"x-forwarded-proto\": \"https\",\n \"x-forwarded-host\": \"app.example.com\",\n },\n });\n\nconst base64UrlEncodeUtf8 = (input: string) => {\n return Buffer.from(input, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n};\n\ndescribe(\"maybeProxyForBrowserUrl\", () => {\n it(\"对 localhost URL 生成 proxy URL\", () => {\n const req = buildReq();\n const raw = \"http://localhost:3210/api/storage/xxx\";\n const out = maybeProxyForBrowserUrl(req, raw);\n const expected = `https://app.example.com/api/onlyoffice/proxy?u=${base64UrlEncodeUtf8(raw)}`;\n expect(out).toBe(expected);\n });\n\n it(\"对与 Convex Origin host 匹配的 URL 生成 proxy URL\", () => {\n process.env.CONVEX_SELF_HOSTED_URL = \"http://backend:3210\";\n const req = buildReq();\n const raw = \"http://backend:3210/api/storage/yyy\";\n const out = maybeProxyForBrowserUrl(req, raw);\n const expected = `https://app.example.com/api/onlyoffice/proxy?u=${base64UrlEncodeUtf8(raw)}`;\n expect(out).toBe(expected);\n });\n\n it(\"对外部 URL 不做处理\", () => {\n process.env.CONVEX_SELF_HOSTED_URL = \"http://backend:3210\";\n const req = buildReq();\n const raw = \"https://cdn.example.com/image.png\";\n const out = maybeProxyForBrowserUrl(req, raw);\n expect(out).toBe(raw);\n });\n\n it(\"已经是 /api/onlyoffice/proxy 的 URL 不重复包裹\", () => {\n const req = buildReq();\n const raw = \"/api/onlyoffice/proxy?u=abc\";\n const out = maybeProxyForBrowserUrl(req, raw);\n expect(out).toBe(raw);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/url/proxyForBrowser.ts","s":1,"e":58,"m":1773495901242.2314,"t":"const base64UrlEncodeUtf8 = (input: string) => {\n return Buffer.from(input, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n};\n\nconst getRequestOrigin = (request: Request) => {\n const xfProto = request.headers.get(\"x-forwarded-proto\")?.split(\",\")[0]?.trim();\n const xfHost = request.headers.get(\"x-forwarded-host\")?.split(\",\")[0]?.trim();\n const host = xfHost || request.headers.get(\"host\") || new URL(request.url).host;\n const protocol = (xfProto || new URL(request.url).protocol.replace(/:$/, \"\")) + \":\";\n return `${protocol}//${host}`;\n};\n\nconst isLocalHostname = (hostname: string) =>\n hostname === \"127.0.0.1\" ||\n hostname === \"localhost\" ||\n hostname === \"host.docker.internal\" ||\n hostname === \"0.0.0.0\";\n\nconst getConvexOriginHost = () => {\n const raw = (process.env.CONVEX_SELF_HOSTED_URL ?? process.env.NEXT_PUBLIC_CONVEX_URL ?? \"\").trim();\n if (!raw) return null;\n try {\n const u = new URL(raw);\n return u.hostname;\n } catch {\n return null;\n }\n};\n\n/**\n * 将“浏览器不可达”的内部回源 URL 包一层 `/api/onlyoffice/proxy?u=...`,避免前端直接请求内网地址。\n * 说明:该函数只做代理 URL 的生成;真正的 SSRF 防护在 `/api/onlyoffice/proxy` 内完成。\n */\nexport const maybeProxyForBrowserUrl = (request: Request, rawUrl: string) => {\n const input = String(rawUrl || \"\").trim();\n if (!input) return input;\n if (input.startsWith(\"/api/onlyoffice/proxy\")) return input;\n\n try {\n const u = new URL(input);\n const convexHost = getConvexOriginHost();\n const shouldProxy = isLocalHostname(u.hostname) || (convexHost ? u.hostname === convexHost : false);\n if (!shouldProxy) return input;\n\n const origin = getRequestOrigin(request);\n const proxy = new URL(\"/api/onlyoffice/proxy\", origin);\n proxy.searchParams.set(\"u\", base64UrlEncodeUtf8(input));\n return proxy.toString();\n } catch {\n return input;\n }\n};","v":"KP9QPPCkvjvPU9W9VAbBvffqBj0FVWi9/+mMvBjfbT3rBQg9HDswvXEQgr24a5486vNPPS7VAr3Bth891nF6vUp6Jz1WrUS6VfSvPLXC2jwPmFk8g2KlvAZphjuGzne9Lz2ZPRL/HD3w/qQ7QlUkPYDNg7yoso08PTp5vGUU1jzi7Pc8WWn8OzQSvb29g1S9ga9sOyQndbwmGoi9qo19O9lc0DwQZnq8e8jivJtEBb1r4IM9fw59vQDaxj3c+xE9pgjDPe5Qyb1AbJW7JGLsu8+GZzwNvjO989FSPaDe/jxfEVG82Wlmu/l/Dj2pB9u7r23FPM2iHD1uaRG91tfRPT3/Nz3Odni8/RA3vUjHmj2D+w49Vg+9PKuYR7yu2bU8OonTu9vHZ7xgRSy9/+3+PHNBY7wjQZi9RdEUvRz9Jz2nNOG89DUsvcwTkD2RsaW7l7eCPRqmADk4hVC8kcHJPE2UI73tUwE9q4DwO/gYuDvm1Cc8ZAWMPJUIKb1Po5I8B9SMvNtMaz3Y1AC82REOOphK5zx00yo8VEjTPH9jCLxfBAE8YPGKPScvYjxklqu7+rD/u+nPaTvedIi87j9dPQJZb7zYLS291xcrPU5uFb2256M8CghaPAlhtjsEpmE9nDL+vH0RDr19C2m9phBTPXnVgrovznA93z03vTVHBT3jQzw9GRJyvS5LGL1AFaK8762KPKCw+Dw3pE49tpjZPIp6hr2/HzK9AFrbPK8/cbzfzwI9CG5cvF0KdTywAhW9uJsnPDOrJ72hXzQ9R4zlvKyjNLyRhNw8InLcvNZVgDzXU+k8CTFOPSkhuzwAXRe8P4WLPMQrC7wHtGQ7uWB+PckGJDswuLK8vaFPvYlcaz34uLG8Nk9hu8Dqsrtv6Jg9MwFGvJr6BTzF2Ya9VbxsvacC1rvgxey7OIwuvat0CzzVxd086gUpvdvXxTuVHTu8uoinPBk5c71tclo912t6PB/bSrwiUu+89jxKvFwyp7s1Gmk7kWIJvYjLGTyTXRK9g1jvvMtJWzu3UWO8UHJFvQk5Hj3Fxyu8DEzhPBCZJb0ltMW8VdGivIZUQz1AGIS8Swq8vTP4HTx99Pu8K9tjPXKE2Lzj3cc7yWqXPZpdl7wKHLy6X+gyvMjKFL3yqO+8KxsTPCdZZL0/BlC9C1EMPWi9qjxBGjG96bZYPeH5ND3E5zY9QG+JPa6nO7u6qrc88visvDSrT7xQyIO8yWjVvfKXDT3dER09D8UdvKz1K7pod0Y9yY+aPQoBVjufwyY9jyHrvIHQRDmdwco75vNJvC04U71cTny8+hKuvLPWmbyNO9282gwRPGQryrhjvoQ8qOxBPNtBmz123SU9C5FtvYTrWrzeiqQ852/au8l8R73cjRK7M2kKvTQEQD0t9S29z23FvMrjDr2Kya28XzQJPFL0OTz18Sg8Wsm+vIz3Ez3qVJ08U9vDO5M6hzwWOIc6HPgAPSjYoLyPWze9OebnvOpgI716QaK8+ABWvHwUozwMvz29vDxZOpgo77yMafK8lLsOuRvx6bvKxOa7ekNau0ewHLvRDZ09w1oGPdia9jyESES8uY8OvTrOmrwSBqY6eqgNvf6c1jziEEc9F2ecPEWaFbrYJaq8Fi7HPIrMIbyur2M828vKvNl0nr1S+eg84bqiPFnvAD2film9I7xmPMLUCD0NC+c8ryyBO7+SjTu+XxO9ERlPvaXuBT2ofl28DnPSO7wOdD2Jtjy8dIa4PAs367x9HoS9remhPDaAurz5Gbs7C10vvUl0Ob3pqK65huiiu/aQIrykYpw8kBQUPaRRijwNkh+9lJYcPbgq6TvBU4S8XhMsPVRyRr1XwdG8191RPSYYhT2Gaxu95dWiuUib4ryA9Rw8UsrDPF7NBz0EqIM8JLedPLr5wjt7dm08tFpZPd
|
|||
|
|
{"p":"wolai-frontend/src/lib/url/rewritePublicOrigin.ts","s":1,"e":41,"m":1773495901249.9724,"t":"export const rewriteToPublicOrigin = (rawUrl: string, publicBaseUrl?: string) => {\n if (!publicBaseUrl) return rawUrl;\n const input = String(rawUrl || \"\").trim();\n if (!input) return input;\n\n try {\n const u = new URL(input);\n const pub = new URL(publicBaseUrl);\n\n // 说明:如果是 Supabase 的典型路径(storage/auth/rest/functions/realtime),即使来源域名不同\n // 也统一改为当前“公网可达”的 Supabase origin,避免历史/旧隧道域名导致不可访问。\n const isSupabasePath =\n u.pathname.startsWith(\"/storage/v1/\") ||\n u.pathname.startsWith(\"/auth/v1/\") ||\n u.pathname.startsWith(\"/rest/v1/\") ||\n u.pathname.startsWith(\"/functions/v1/\") ||\n u.pathname.startsWith(\"/realtime/v1/\");\n if (isSupabasePath && u.host !== pub.host) {\n u.protocol = pub.protocol;\n u.host = pub.host;\n return u.toString();\n }\n\n const isLocalHost =\n u.hostname === \"127.0.0.1\" || u.hostname === \"localhost\" || u.hostname === \"host.docker.internal\";\n const isLikelyInternalPort = u.port === \"18000\";\n\n if (!isLocalHost && !isLikelyInternalPort) {\n return input;\n }\n\n // 统一改为公网可达的 supabase origin(协议 + host + 端口)\n u.protocol = pub.protocol;\n u.host = pub.host;\n\n return u.toString();\n } catch {\n return input;\n }\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/protocol.ts","s":1,"e":60,"m":1777368440817.0728,"t":"import type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport {\n mapSidebarDatasetListQueryResultToInitialData,\n type SidebarDatasetListQueryResult,\n} from \"@/lib/sidebar-data\";\n\nexport type TreeStreamKind = \"snapshot\" | \"delta\" | \"resync\" | \"heartbeat\";\n\nexport interface TreeStreamEnvelope {\n stream: string;\n workspaceId: string | null;\n rootNodeId: string | null;\n cursor: string | null;\n kind: TreeStreamKind;\n projection: string | null;\n data: unknown;\n}\n\nconst TREE_STREAM_KINDS = new Set<TreeStreamKind>([\"snapshot\", \"delta\", \"resync\", \"heartbeat\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction readKind(value: unknown): TreeStreamKind | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n return TREE_STREAM_KINDS.has(normalized as TreeStreamKind)\n ? (normalized as TreeStreamKind)\n : null;\n}\n\nfunction readNestedPayload(record: Record<string, unknown>): unknown {\n for (const key of [\"data\", \"payload\", \"snapshot\", \"dataset\", \"sidebar\"]) {\n if (key in record) {\n return record[key];\n }\n }\n return record;\n}\n\nfunction looksLikeSidebarInitialData(value: unknown): value is SidebarInitialData {\n return (\n isRecord(value) &&\n typeof value.activeWorkspaceId === \"string\" &&\n Array.isArray(value.documents)\n );\n}\n\nfunction looksLikeSidebarDatasetListQueryResult(\n value: unknown,\n): value is SidebarDatasetListQueryResult {\n return (\n isRecord(value) &&","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/protocol.ts","s":49,"e":108,"m":1777368440817.0728,"t":"return (\n isRecord(value) &&\n typeof value.activeWorkspaceId === \"string\" &&\n Array.isArray(value.documents)\n );\n}\n\nfunction looksLikeSidebarDatasetListQueryResult(\n value: unknown,\n): value is SidebarDatasetListQueryResult {\n return (\n isRecord(value) &&\n typeof value.active_workspace_id === \"string\" &&\n Array.isArray(value.documents)\n );\n}\n\nexport function buildWorkspaceTreeStreamUrl(\n workspaceId: string,\n cursor?: string | null,\n): string {\n const baseOrigin =\n typeof window !== \"undefined\" ? window.location.origin : \"http://127.0.0.1:3000\";\n const url = new URL(\"/api/tree/events\", baseOrigin);\n url.searchParams.set(\"workspaceId\", workspaceId.trim());\n if (typeof cursor === \"string\" && cursor.trim()) {\n url.searchParams.set(\"cursor\", cursor.trim());\n }\n return url.toString();\n}\n\nexport function parseTreeStreamMessage(input: {\n rawData: string;\n eventType?: string | null;\n}): TreeStreamEnvelope | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input.rawData);\n } catch {\n return null;\n }\n\n if (!isRecord(parsed)) {\n return null;\n }\n\n const kind = readKind(parsed.kind) ?? readKind(input.eventType) ?? readKind(parsed.event);\n if (!kind) {\n return null;\n }\n\n return {\n stream: readString(parsed.stream) ?? \"workspace\",\n workspaceId: readString(parsed.workspaceId) ?? readString(parsed.workspace_id),\n rootNodeId: readString(parsed.rootNodeId) ?? readString(parsed.root_node_id),\n cursor: readString(parsed.cursor),\n kind,\n projection: readString(parsed.projection),\n data: readNestedPayload(parsed),\n };","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/protocol.ts","s":97,"e":134,"m":1777368440817.0728,"t":"return null;\n }\n\n return {\n stream: readString(parsed.stream) ?? \"workspace\",\n workspaceId: readString(parsed.workspaceId) ?? readString(parsed.workspace_id),\n rootNodeId: readString(parsed.rootNodeId) ?? readString(parsed.root_node_id),\n cursor: readString(parsed.cursor),\n kind,\n projection: readString(parsed.projection),\n data: readNestedPayload(parsed),\n };\n}\n\nexport function normalizeTreeStreamSnapshot(data: unknown): SidebarInitialData | null {\n if (looksLikeSidebarInitialData(data)) {\n return data;\n }\n if (looksLikeSidebarDatasetListQueryResult(data)) {\n return mapSidebarDatasetListQueryResultToInitialData(data);\n }\n if (!isRecord(data)) {\n return null;\n }\n\n for (const key of [\"snapshot\", \"dataset\", \"sidebar\", \"payload\", \"data\"]) {\n if (!(key in data)) {\n continue;\n }\n const nested = normalizeTreeStreamSnapshot(data[key]);\n if (nested) {\n return nested;\n }\n }\n\n return null;\n}","v":"LqA7PeaLWTyaCQW+w9DDvY5kPj2P+hC9XVkOvTbCDL2EjGw8JeO7vdRDUr0PcVo9vjPZPaY9KzxQ/++8VnsFvUu12LyBYqK9SO8PPR/BDz2d4NA83FTevEt8Pj0bmji8QysWPSDuSz28KQQ7YagBPUtKTb0HN3s9zLg1PVv0+TyDcKk8CjvTvJJB3L15MR48lAysvLwvBTy1Tbc8fLGAvBAAzryEa+o7OLpIvYq7e7sfI/c85p7nvNzUoj0xHTe8fLe3PKq8VL35tEU8ZaGnO6Nj6Tylz8s6bNzLPdeG+DzAJK+8xgsCvZY09DwDNc27V/etPPoMtj3nPOQ85oKtPTB5GT0L/8i8ysA4vbmdDz2ZmKM8U3owPMT9vTzPnzo9Q42QPMMr8by5YAy9Kf6+PdC19rydoa28xfkivZPiyztlyc+8qby9O/ilcTxLr9g8z90fPUZ2sbyDg428y1S8vP2vSbwfyow9e+aGPZyjz7whFdE7WLafPLAvTb0dPSs9evrxun+LKDz/Bai7sqgSvB4gwDwPCMe82zFZvLHVsbz1BsA8mskJPb0uuTxqY2u7Ow2dvAnWSb23Z++8OvrhPG1Xer31Yt28He3VPM3Zpr1/oII7yp03vf3rTrySUUQ9s2i5vCFfDL23nwO8TCGPPdojtT3scEQ8XSCWOq8KgTxles+7OfYuvabKEb3z3PW72onBvJhiLD07S9089Q/Vu4QpAL0tk6i8i9cTPCX5oDvxBks8wcvjvG+jBb1RZB29glN6u/bgTb1zo549e83evNXeBL0HUVG8Hea2vN37ST15lwE9+N9uPRItDTsz47a9o9cFPaFPojt2S6I8PYbQu7Ojij10MbQ8k7dzvLxFajwXeUi75XlEvboGhjy3lAs757cGPfrvXjyMJFu9x9KOvcueeTtmMqa8ounFvCkporwZ/RW8WNX9PDQJsTw4R2C9wb0bPZazn70jZPk8YcqtPN4sj7xEY0q927fGPHZ6uLvyS+K7Uro7vX297rxvMui8cXGDvCoOr7x1OoK8nw+bvQBJ+Tz2Zwm979EgPWoDLr3v/iY7GX0CPbQqBzycjX09GyKFvW7KDbygmSy91YtXPVceD70t9+085keKPTqISLw5+Ac8Y6OfvBYVq7wocx48diU2vfXkHbyqyZu90S7XPPqJIryYOJG9SMvhPDmhEz058cg9gZ/pPEXME73ku0I8t4bHO2QDMjxf/b283/FDvYtiEjwSigg9Tc9OvCfALLtGHTg94BNbPQ7vzjujzjC7kPrrvE42GDx1kI68klbjvJfMAr3QEIM8xU6PvGgY+LzGzuc8k7AWvL7PSbyaqzs9it4hPXXjnD0YVe47jJ5GO7OUoTzZqno8MqjevHLDPL1VNio99DbcvKrmuzvaA9a8ScoovHHA+byWZ0a9F/5OOznTTjoo7RU81/JfvTXyNjyAVjk8h1IRPfLroDyRKpY8Yt4OPAb6ozweoSS9EhynvP3YgL2mWyU8Js34vEP0NLxanum8ImpjPHcMlbvV9PK7Cba/uhnHHTvzTpy8QtGJPHgxqTutxTQ9Lpv6u3hdpTwBCn49qsoFvalb6DuY+3S98BgTPd9pMT2A/J09LREhPX3mZ7tU2g85QVHmOxPQp7xauuU7qG2FPCSNOr0kLz67+42QPDnLojxxFjk7m872u7brqTzkcem8h2EgPW8P2DzLvl+87YocvYG+IDyGNxy7gGJTPKOV6jzV1cG88LeLu39MlDxBtCM81ZPrO+GliTvnXt48LLiQu/oMI72VX446Oe9OvRPwkzv6TYE8/jGOPYl0Gj0ihJG6tYETPTyIRTsFDGa8Z0cTPXybHzzF1GK9HT3rPDGPHTwd2q+8VbpyPLaNBb2eW4O6aNU1PBR2Uj1GoAU9INe+vMx9YTz9+PI8UWpNu4H0Vb1b26K7QtZEvYk55ru/jh87hz2EPUQCSjvV1So8xCUVvB+iJLxdz5C8LXmSO5um6DxkSVK9PXssvadxgb2pNF65ylJUvAhbbzukaKQ98Px5vcsViT3YRc882FHePPgBtzej1807wZnbvMwprTzDST496bMKvSMcG70AGby8u6hJu/USjDytazU8sOwSvNuZBbxHbq+8U1Rqu05Ok73KUB296ZdzPKD46ry33AI9YyGiPPXvvrw4cYU8oDRkui0vV7xQtqI8nMORPFVBfzy1x069FkdNPewgkDsf/449/gCDPOL+6zv47YG8X5mcPKGgET0jxVa87cbJu92qTz2xwNM84v0nPGXZmjvgP848CnocvWOJ9DsqxN8806WpPWGW3TyTFsm822ITPV7j4bq2++48hdXYvIQWUD1gTl09gw+NvWoOaD1Xywu93SqTPOsTZz1oijQ9sfiEvWIR1LxntxM9HbAIu5iQGD3oozg8T+2BvORplz3VyOa8JVygPOYiszydYJQ6sVEVPVpXFbzmirY7l4ldvdxLW7zACcK8QOJqvSMn/bz8Lgq8l7hxPcRUAzzHbBG96KFdPHygVDrq5Ny8ZnrvPPAyKD37qPq8YGVFPFv8gzy4njk9iUwJuV0dbr1feIe93gxyvUe2CLxkXgo93p5rPELS9Ls04EY9qDZJvXJ0mjynABi64xE6vW8Q9jrtMQO94knUu358R72pbgQ9Ny+RvKR4QjvIXba8eK+IO1hGT70U8IE9sH6uO6KQj7saNKw9+uNSvQbGBb2G+Rs8vKf5PGO4Lb1BfAK9Hi7NvMMmAj3t4w29Iv2bOutUk7ctJLq9873MPFX/oDu1gn68cMpyu5bAHjxWdJu9MLscO+S2Sb0iNyG9AjuBvBoxDb0JFuO81kNpPOUKRLxbV/a8g2l/Peq5xjyrBgG9lGxrPWI+fjtGdtI8QKr0uzXmqDyR7ka7Gp+lPPBCB705r6s8Z5o+vSK8Aj1VfB0952MgvfX+Gj0/GpU8OWxPOzef9ryA09U8yIEcvb8/YjyIamu8Z6KIvO
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":1,"e":60,"m":1777163710956.9082,"t":"import { describe, expect, it, vi } from \"vitest\";\nimport { streamTreeFrames } from \"./server\";\nimport type { TreeStreamCommandLogCursorRow } from \"./server\";\n\nfunction buildOverview(rows: TreeStreamCommandLogCursorRow[]) {\n return {\n command_logs: rows,\n domain_events: [],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:00Z\",\n };\n}\n\nasync function collectFrames<T>(generator: AsyncGenerator<T>) {\n const frames: T[] = [];\n for await (const frame of generator) {\n frames.push(frame);\n }\n return frames;\n}\n\ndescribe(\"tree-stream/server\", () => {\n it(\"workspace scope 首帧应发 snapshot,并固定 sidebar_tree + cursor\", async () => {\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 0,\n loadOverview: vi.fn().mockResolvedValue(\n buildOverview([{ id: \"clog_2\", created_at: \"2026-04-24T00:00:01Z\" }]),\n ),\n loadSnapshot: vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { items: [] } },\n }),\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(1);\n expect(frames[0]).toMatchObject({\n event: \"snapshot\",\n payload: {\n kind: \"snapshot\",\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n rootNodeId: null,\n projection: \"sidebar_tree\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:01Z\",\n id: \"clog_2\",\n }),\n },\n });\n });\n\n it(\"subtree scope 首帧应切到 subtree + page_tree\", async () => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":49,"e":108,"m":1777163710956.9082,"t":"workspaceId: \"ws_1\",\n rootNodeId: null,\n projection: \"sidebar_tree\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:01Z\",\n id: \"clog_2\",\n }),\n },\n });\n });\n\n it(\"subtree scope 首帧应切到 subtree + page_tree\", async () => {\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n rootNodeId: \"page_root\",\n pollMs: 1,\n maxPolls: 0,\n loadOverview: vi.fn().mockResolvedValue(\n buildOverview([{ id: \"clog_2\", created_at: \"2026-04-24T00:00:01Z\" }]),\n ),\n loadSnapshot: vi.fn().mockResolvedValue({\n requestId: \"req_subtree_1\",\n traceId: \"trace_subtree_1\",\n data: { nodes: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { nodes: [] } },\n }),\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(1);\n expect(frames[0]).toMatchObject({\n event: \"snapshot\",\n payload: {\n kind: \"snapshot\",\n stream: \"subtree\",\n workspaceId: \"ws_1\",\n rootNodeId: \"page_root\",\n projection: \"page_tree\",\n },\n });\n });\n\n it(\"检测到 cursor 之后出现新命令时,应发 resync 而不是静默结束\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n { id: \"clog_2\", created_at: \"2026-04-24T00:00:02Z\" },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi\n .fn()\n .mockResolvedValueOnce({\n requestId: \"req_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":97,"e":156,"m":1777163710956.9082,"t":"buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n { id: \"clog_2\", created_at: \"2026-04-24T00:00:02Z\" },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi\n .fn()\n .mockResolvedValueOnce({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n })\n .mockResolvedValueOnce({\n requestId: \"req_2\",\n traceId: \"trace_2\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }, { id: \"page_2\" }] },\n snapshot: {\n dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }, { id: \"page_2\" }] },\n tree: { items: [] },\n },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[0]).toMatchObject({ event: \"snapshot\" });\n expect(frames[1]).toMatchObject({\n event: \"resync\",\n payload: {\n kind: \"resync\",\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n projection: \"sidebar_tree\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"clog_2\",\n }),\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"检测到带 streamDelta 的单条新命令时,应直接发 delta\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),","v":"qBACvbIOTDzejhW+PG+TvUOLgj0ds2y9vNidPFU9jrtmWAg73dbcvdzKM73FHQY9YeuqPfOJfjxYrKA8EA9yvRdIPb0G7ZW8BdK7PDYYn7xPUY+8k/LAu17YWzqu5g+9s20UPbnG7z0iwaE71Q11Pb+q6DufOhs9ivViPXVoGD1CbPu8AffAu5pjI70Bbh+9KyF8vKiYsbzk6X47OtWCu0z6Bz1OBYg8iWQvPZDJl737z3Q8xsjCvNIRqD3CPAm7s/KHPcisC706mpm8YFZbvLVp2bz3YnY8n2fgPdUkuT3buSC8WEOEvaUUtrzEdd28Vr1xPMidqT20Zm88AZSlPDw+lj2IRV+8NDQ4vQRrIT0Odzc7NymEPOKlED21tak8RT/BPLIUlrwoIhi9KBRMPfQwBb31gke9ZiCqvEiBWz1wrsu8suTVvHefKT1w6fm86b87PaD38buXz0O92QuLOqXiFb1pz5Y9jfwyPWYOorsRd7O8DceCuqgvD73NLQa96/UBvE6zoDyBkei7xUsVPflnDLyogzm7AaVXPAK4hbwBbaS8FmHSPNUTIr1+6iq9PjyQvZ7s9bxulZA8HrgyPY3taL3DNRG9Di0kPZHMU7tZakI9Sd25vB2L9bxi4bc8USwSvRFAJL1TMYi8cV1zPQeXmj1969Q8nA/0u1GOuTwHSok9tqIZvWVWS7sABbU8qnrkvFyvzDy+PVs9p8/fOzZHzLyU4nO8dqf8PAQAojzAEjK8vUUmOxuh7bxJkbq92kVtPJ2W6rwMahm8FlIjvRSndb0bi8G7WPMZvMb1ZTzJt8C8lA2ROy3IJTwq9ti8A0siPQ6FFrxhA2Q6+LuiPDYzPT28QhQ8IB4SvZ0tp7rSFcG7J4MdvdUzRLupYCY9ycCWPK46Gbxk7c69/wElvVDwszr3weu8ewuKuiJfXzwiEWE8jBohPIM33DuZnKG8qIfLPANIWL17swE8fPIHPXOPdr2rmN+8GssdveKufL09ZNu8gnYlvcQ1szvO+Q+9jLTtvOHyAT1rwuS7fv4wvYqoaDyxHxm9vimbPAfzN7uV+v28ruJWO/NnBLymAIM8oGhjvbVdVj2nzym87t0XPcwvhb3J8CY9Fh6TPcW/bbx4hbg7xk4lPQQ6j7wJUby8N+DjO3K047wbHJq9gJkDPU7rHz0o8Tm9ftkEPCjJmDw+/LE83H4BPRRdmbxy4+g7LD/2O/qKyzu/LQ29RhGOvSsrTj3myEQ84yWPPLw9Iz1XmVu83uQCPcnS9DzcNf48SkocO70s+DrmJ1y8G3XkvAGFPLxie5q76E4muyNDQL2l53q82BUFORRZMr3dm1m8EnNQPRdtfT211Tw9r1CBveTrILttGza80fIAveY+/bxy/4e6H5u+PImWzzzJJTe94JYcvOZ4DL3J78W8MEmtvKyoOzsUFpq7fKaSvNLRXLw7DIg8FbvTPA/WTLxrmKc82coWO7ct3jtGmhm97pgiPJ14V7zMaa285J04vMDcvjwRsOK7xxCjPJ0EfLy4+ns85CIKPYZtZ73Te1+7pycuPeoPh72sMXQ9fw16PEQ1gDhLQeY8mq8dPZ7yTjvjBzu8lLbGu15cPz02+Xs9FZ8SPVVG6zxw+F+9ecMOPZ375Dyrlwy8T+NLvO04srsVhz68vtb2ulfaN7viuwu96/YIPfTzgDy5Uk45eqbtPOnnuDwSeHS8E0i1uhYZMr0+j266ElPjOy6hK7zHYfi7Fqu7PH7LyLtW3YE83AAVPW8MFD20ayc9u0L2vFn1z7qkdOs7ZvE7umG9CD0YRRS7OGbHPRGKcLxHLpm8nAMwPfWdnbwzlrw83Ci3PFB24LosBsK8WweQPSZI0zyYuSS9zV04PWAsFL2BNDU8bR4/PKafUz23uq47y+8SPebOlbtGZzE7bznnPNuIljyN
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":145,"e":204,"m":1777163710956.9082,"t":"id: \"clog_2\",\n }),\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"检测到带 streamDelta 的单条新命令时,应直接发 delta\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.node.archive\",\n payload: {\n documentId: \"page_2\",\n streamDelta: {\n op: \"remove_document\",\n documentId: \"page_2\",\n },\n },\n },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"clog_2\",\n }),\n data: {\n op: \"remove_document\",\n documentId: \"page_2\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":193,"e":252,"m":1777163710956.9082,"t":"expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"clog_2\",\n }),\n data: {\n op: \"remove_document\",\n documentId: \"page_2\",\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"只有 domain event 推进时,也应刷新 cursor 并触发 resync\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce({\n command_logs: [{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }],\n domain_events: [\n {\n event_id: \"evt_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });\n const loadSnapshot = vi\n .fn()\n .mockResolvedValueOnce({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n })\n .mockResolvedValueOnce({\n requestId: \"req_2\",\n traceId: \"trace_2\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),","v":"OVJOvA9WnTxe9Ri+ZFxnvT9tsj1E4Hm9WfxdPb/nAj2nV8k8grzAvVxD1bzgSW09voB+Pb8BoDw+2QU9nI4lveul/byvP8u8zroIPMm35zy3+gG8077JO/RU07swX+a8rw4uPck+7D024x47KIRoPZ/Vz7zkuE09Ce1kPR096zxaghu9l2cnvNSHFL2hRzq9BKFnPPMJHr3gSJu87tZFvEsWEj3QLx67x/EiPV4kU708Fsc8Ewtvu5l0uD1fp/Q83plrPWMdq7xw1KU8wG+cvN9w5DvDxOs8Xo77PaFDpz3xrhI9iCowvW8YCjxc/UC9uwAGPaDA1Dwm46q6/6U1PPY3jD3CxKU73keivXXzPz3GVoA7jc20u44gSD3kLtU8v9j0u4QQEDv5Vhi9CZvpPHf9YL0AsFi9f0RIvclhgj1HdAu9EWBDvAh3VD3jiSW8CBhHPciVM7lolv28EYkSPV7dQbzHPKk9TbpyPfdkGjtA2ku7OEJzvLFsw7zNJYk7ebGGvEnFWjwgtDY7djROPLKX7LtxL/08wtGCO5w8grwe9xe84lUxPW1Y1bxgz6e7Y/ADvcjra714DmK88aGcPQ5HVL3xoAW91ucUPNwsx7yMuCE9BDgFPAObI736yqI8E9cJvA71Nb2idQc8oj2kPde8mj3sd8s8OhkRvOdx8jz+86U8prFbvXEmpTxx+7E7cH2/vNjGRD34XnY9wJQDPbEvw7x0bKq7/0aEPbzfmrwFB9m7yLufPAK12by6co29+t2MPKIqiL3xOQ89lLuevBwzC71SVw483d7Uu1H8SjyqUMy8x+YMOTeizjxwB5M7HnFQPZl3RbzFFTa8MGYMPTbkbz0Y5467ZhP2vJ1sFD3/GrK8+iiGvcR+Rj0QAz89OX7pOyB/uDvgl7u9D2xJvZQljbs2ME29zMZnvOsofjtpQpg7r0ZXPJFURjxA8+K8T0EBPAbAG72cB5Q8VXc8O4Vdi70uAUW9EYYsvazf3ry0nnI7gtcdveTPZLz7zaG94jBhvVoa9jzkiSa7DUd0vAjtCDy+sUq9zcjwPICA+jpHgjK8XKfFPPMn9Lwnz/08GfJvvUQiiD1yb7G8edlNPRl6IL34O5Y8GAa5PYY7Nr0QjBM8Bc13PO+kLbwSNw68mA6sPBQu2bwp24K9jYLfPL3ZKD15PyC9i7jEPG43Kjr+nBQ9bEARPaTWR7ygSyI89B0yvDvUALts5RC90j+qvbbDMzwP32s8B/+ZPKfhIT3C2eY7zOC5PN0kgT0lOKY8LMCLvPyeezzLuK47M3KTvJnbR71HMCa9+wH+uHKkhbymUQm9iR7buqHSg7x8pA+9V4h3Pb8NiD00XzY9hrlmvXOWMbyaaGC8+Pg6vQv/hbzuELy6i6dpPMsRgbtm4bO8jM/6vOY2Wb3R7u+8JQy1u66Wv7t/KYU7FtltvDDnr7wkuCe87EnePJakqDxtJ788YOUVOz+1lDwV8fK8ciogu/HTrrwiMkG8FEgGvQ+ONT3Reda8FahYPF+rq7yDg/A8pNQ7vGcnCb2Gh7276qmIPR53Ub0dSLw83AQxPPAHQryIHQg9LFnyPJsm5TtVo7u8cr0fPDBxyTy6WXc9ZMAAPfl27zvH3Fa9Hq8ePeVItjvHZJC7M54TvQhou7xt+Ti9LfJMPJ0kq7xT2Gq9514FPTN8QT3Vnd86Isu/PFbKNj368jo6Kv3OukyPIL0spIM7Y7o0vKlu1zyw1S08HwPBPJWR4TyrPg09Xgc0PRSgZD1KasU7Al2pvNu9jjx8cPy7R7S5PAjFVD1BwUo8IjeJPe3AyjzpJFs8FksAPZBKcjl+F6M7WzPBO4K4F7tbefi8uKyBPVSYnjx6Zw29fgBpPNObNLwLZ4E61famPOgIvDz2rQ08MuQYPXtEfrz+gKy7YQ81PaQlQTtGwSi9eKnEPLaWEbxv/U89ttwRPfm8pzzCBzA9EUo/PPqQ7DvQBv28Rsmyu1LSyjy6GB
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":241,"e":300,"m":1777163710956.9082,"t":"snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"resync\",\n payload: {\n kind: \"resync\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"domain_event:evt_2\",\n }),\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"单条新 domain event 携带 streamDelta 时,应直接发 delta\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:01Z\",\n })\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: {\n command_name: \"tree.node.rename\",\n streamDelta: {\n op: \"upsert_document\",\n document: {\n id: \"page_2\",\n title: \"新标题\",\n },\n },\n },\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":289,"e":348,"m":1777163710956.9082,"t":"created_at: \"2026-04-24T00:00:02Z\",\n payload: {\n command_name: \"tree.node.rename\",\n streamDelta: {\n op: \"upsert_document\",\n document: {\n id: \"page_2\",\n title: \"新标题\",\n },\n },\n },\n },\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"domain_event:evt_2\",\n }),\n data: {\n op: \"upsert_document\",\n document: {\n id: \"page_2\",\n title: \"新标题\",\n },\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":337,"e":396,"m":1777163710956.9082,"t":"data: {\n op: \"upsert_document\",\n document: {\n id: \"page_2\",\n title: \"新标题\",\n },\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"单条资源 domain event 携带 upsert_assets 时,应直接发 delta\", async () => {\n const streamDelta = {\n op: \"upsert_assets\",\n upsertAssets: [\n {\n id: \"asset_1\",\n workspace_id: \"ws_1\",\n document_id: \"doc_target\",\n asset_type: \"file\",\n file_url: \"/file.pdf\",\n thumbnail_url: \"/file.pdf\",\n file_name: \"file.pdf\",\n file_size: 1024,\n mime_type: \"application/pdf\",\n created_at: \"2026-04-26T00:00:00Z\",\n updated_at: \"2026-04-26T00:00:00Z\",\n },\n ],\n };\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:01Z\",\n })\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: {\n schema: \"mnote.tree.domain_event\",\n eventType: \"tree.resource.moved\",\n streamDelta,\n },\n },\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":385,"e":444,"m":1777163710956.9082,"t":"{\n event_id: \"evt_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: {\n schema: \"mnote.tree.domain_event\",\n eventType: \"tree.resource.moved\",\n streamDelta,\n },\n },\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: streamDelta,\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"单条新 domain event 缺少可识别 streamDelta 时,应保守回退 resync\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":433,"e":492,"m":1777163710956.9082,"t":"const loadOverview = vi\n .fn()\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:01Z\",\n })\n .mockResolvedValueOnce({\n command_logs: [],\n domain_events: [\n {\n event_id: \"evt_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: {\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,\n eventType: \"tree.node.unknown\",\n },\n },\n {\n event_id: \"evt_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });\n const loadSnapshot = vi\n .fn()\n .mockResolvedValueOnce({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n })\n .mockResolvedValueOnce({\n requestId: \"req_2\",\n traceId: \"trace_2\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_2\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_2\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":481,"e":540,"m":1777163710956.9082,"t":"});\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"resync\",\n payload: {\n kind: \"resync\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"domain_event:evt_2\",\n }),\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"同一命令的 command log 与 domain event 同时推进且 delta 一致时,应发一次 delta\", async () => {\n const streamDelta = {\n op: \"upsert_document\",\n document: { id: \"page_2\", title: \"同一标题\" },\n };\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", command_id: \"cmd_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce({\n command_logs: [\n {\n id: \"clog_2\",\n command_id: \"cmd_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.node.rename\",\n payload: { streamDelta },\n },\n { id: \"clog_1\", command_id: \"cmd_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ],\n domain_events: [\n {\n event_id: \"evt_2\",\n command_id: \"cmd_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: { streamDelta },\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":529,"e":588,"m":1777163710956.9082,"t":"domain_events: [\n {\n event_id: \"evt_2\",\n command_id: \"cmd_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: { streamDelta },\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n cursor: JSON.stringify({\n createdAt: \"2026-04-24T00:00:02Z\",\n id: \"clog_2\",\n }),\n data: streamDelta,\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"上一帧 cursor 来自 command log 时,应按时间排除旧 domain event 后再做双写去重\", async () => {\n const streamDelta = {\n op: \"move_document\",\n documentId: \"page_2\",\n parentId: \"page_1\",\n sortOrder: 2,\n };\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", command_id: \"cmd_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce({\n command_logs: [\n {","v":"PFNrvB2KlTvukC6+2d5svYSsvj0BrVG9NGAqPaJRjzv/3AU9WR7CvZanF72UZlk9r47APQlaZjwzN8o8OzcyvZn9Nr39HHK7p6e3vI/KRT3Vo488SNNUvLEKSDsS3/28YPVEPRi2yz3NExs8EwN2PXSH67yT0Oc8fz0iPddAZj06zdG8aEJivAh+H70Jmki9j2+eO2r2srwIx768n0SKPD44Yj3zIKo7epgBPTuXYr2lQbY4/856vI7JTz03gpk8fVB7PeEcl7yygZc8yn0Mvazi/ruL9588lPv2Pbjukz2HPYM7L0Z2vATlYTx7UF+9lxdWPckZlTzr+YI8twN5Ow/1pD1iNHW84/movQyRCz3nBMQ85CGwPLy71DxSPjO8gbEWvPHwXrw3P/C8HGTcPLtVFr3OsoC95uoqvQwSFz0j/se80INvu4Mtij3MGTa9GI9SPbiZGbpBJtm8trHdPI9s4ry0gXA9n8NxPS4w7zxzkjq8nxJpvDSvF72YYHM8r7iqu0fF2zv4vlk83gIQPaWou7yeFhs8lWCqPPNMtjthREO7aqEcPXFRQr2Cnbm75bOLuziA/bzv24u8mYR5PXL2Ir06Woy8XwQmPWher7x/8zo9hJMpPNY3jb0GswY9KsQRO6UfUb3qVf+8oal+PYQOjz0BwNg8LVCCuZWBvjgFbpo8qgUIvYsUzby4zvg7tH2uvEd9JT1/tlg9XhaNPPJ7GL17ERm8HflnPYnwEjsmVq287iJfPIhLDL3Gkrm9nBziO1FMCb1TFTs9bvLgvGfPN71NdO47HLqyuxKkmTxyi7W8QVvSu3B2hjzYOx+8CRuSPF86mLvgCrG8QxEsPeYSEj2jfou8wisxvRa3AD1wky0878AtvZKXXz0+H409JgSLO1AyyTzn4by9pdNqvQrymLstbA+9zfrHO5uUJrr4J3e8e02dPC1cTT0UdQ695gY9vGHQYb3cz+i7zcvZO+67Jb25WlK9sLkfvUsFOr38F+A7masmveBimLwRl2a9OwtqvWXcvjweoBG9F2dNu+p6zTwkcGO9nJqPPE5aEbtqwhg8Uu77PNZTHr3A4XI967j7vKRXaT3Ugu28bUFFPQQlFL2FcCo8BCDsPS8nnrxA0aE7qMiIOqsXW7xx8bi8+TIiO4gwSryfXFe9gN7EvBRc2zxQj028pQwQPf7I1rs7TMo8p47tPDrBR7zN9JE8AHxKvHjszLzZrFO9nWyMvRPwwzwhcNk8YNHIPMxPDz3ezwq9HGHuPG9YXD0Z2pY8wE6JuqfW27xw+ou8mJ7pvP+FE73yNu283zEyvMSAc7y4EVi8YcvKOVDnxrxUxLa8p/AzPQe6Pj2QNoY96gNevQe1LjujRba64tW0vBLrADyY7nK6X1iKPA+OpDy/rXC82gGSO0EOfr19cfy8O3OPPK2ERTyGihA8uGEUvfItpbwn10i8WpdLPTXmoTtCohI9056aPIaKljz+Sy+96LtlPDpshLx5Ixq9fffevIidmDyN58+8p9aMOwWPxjtVawc9FKhovFKkgL3f9308jxUZPb+7M72Jiug8u2+ZPLs42rz4VuA8HDwZPGLgKLy0H+w772EvPXp45TtDp1k9Y+bPPHuICjuisiK96zVdPYWwObzsZIY8KrbHvLDeG73MY4O7bHjIvDAAbrwWsQS9+eliPXJPfj2VP5w715nSPGrELD0rQdO8K84hu07vGr17cZw8LYM9POJicjxUU628yzuSPDvwgzzeMb08xFL4PPHwhj06GsM8T0RvO3r4QDwe6Da58VnTO5mbMz3ipba5uOizPdOADD0mCZy8AD/mPJGY0bya5D+79uYQvArjmTnY0++8qofyPCqHQj09+Cu9EroXvLMJ+byitAc8UA8RPTrAuTyePr08wxO0PJ2ucbwmd4+7IgMCPfCScjsDaUW9BeNBPCxgXjpXkUQ9dEnbPHlQRjzm4k49TXfBPJlaozzU2785A6gjO9ywLTwS1tE8exgivDhSfL0dVBk9BEGcvO4HZTr/Zi49EqIFvZvuPrvrJNi8vlbnOQ+m7DsRtQk960i3O7LpiTu2+as8PHiCu9vTE72b6bG8gEbVutleTz2fgGS9TuCfvK55nDwOG786h2n0PPsrQb0RAiu9Zf7dPIpIUjz8Slo63WIXPYXgDb0
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":577,"e":636,"m":1777163710956.9082,"t":"documentId: \"page_2\",\n parentId: \"page_1\",\n sortOrder: 2,\n };\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", command_id: \"cmd_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce({\n command_logs: [\n {\n id: \"clog_2\",\n command_id: \"cmd_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.subtree.move\",\n payload: { streamDelta },\n },\n { id: \"clog_1\", command_id: \"cmd_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ],\n domain_events: [\n {\n event_id: \"evt_2\",\n command_id: \"cmd_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: { streamDelta },\n },\n {\n event_id: \"evt_1\",\n command_id: \"cmd_1\",\n created_at: \"2026-04-24T00:00:01Z\",\n payload: {\n streamDelta: {\n op: \"noop\",\n },\n },\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:02Z\",\n });\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":625,"e":684,"m":1777163710956.9082,"t":"const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: streamDelta,\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"command log 与 domain event 同时推进且 delta 不一致时,应回退 resync 避免漏发\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce({\n command_logs: [\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:03Z\",\n command_name: \"tree.node.rename\",\n payload: {\n streamDelta: {\n op: \"upsert_document\",\n document: { id: \"page_2\", title: \"命令标题\" },\n },\n },\n },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ],\n domain_events: [\n {\n event_id: \"evt_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n payload: {\n streamDelta: {\n op: \"remove_document\",\n documentId: \"page_3\",\n },\n },\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:03Z\",\n });","v":"/oZLvEOzAzytPxu+1A2MvTCZsD23sX69LYOLt5T5Rjt7h+k8AorhvXW2Br052UQ9ejiNPUfNWTySRZM8L7uDvcWy6ruSbHC8CZibuF7dtzyFqYg8ot9fPDTgJrxIN2K9889RPTbuAT7/51w8hdxwPX0rDr3osDE9V76HPcqDGz3i0CW9uc9Suy6/b71ZJmW9beNNO9httrx4SHy80M5gvJyZMz0Oc9C79efBPH0k/7xjd0E8v6USvEkpuz1pHUA9VHNjPXFpOr0KUdA8mSudu33pZLvlju67v83iPR5upD1mkNg8lonsvCevoLs1XTW9KxunPIZWIj3KkF47WGniPOhBhj0nAsa8qaWZvaw/jj1OmK08rPuzPI8yBD25dLA7HZj7u5wHsruL6Yy8t6gvPS8JSr0WA1u99GBqvZC7WT3fJaC8XOEivCPucT1Msri8yN0UPUttCztR2Ne6vHcEPW/8Obywi5s9MSKDPXVVYjztOom8yZFjvJtezLwm3i+8Gla9u+G87Twu1Nw7F1TQPLlt9rvELBk9D6BePAe2vLyclYG70OoyPYz7Eb2UBn68IUWtvDXEir07a7e8kdCGPVC+Jb0x77W8sRApPBoi+rwobyQ9yZzhO3ENJL0txIQ8bRE0vHQJJb3wpg68plebPfEemT0jCqQ8sXKgunOBTD219Z48pXNivdfbwLvYDCY8zwFPvDQjRz2TtCk9NeK1POBP97zDyQe7QeZ6PaGAWryGar+81tzYu4p4Cr2BN6G9OeXaPBEVhL1fejM9QRPvvEGESr0b4Ca8Xz1iOs4nizxT/sW6OkA2vOzjxzwS2Ky8hBX4PLRAj7wk2be7DxcKPcEpBT0gbUU8hyg+vRKygzzaeVa8xY5VvU0RkTziU4s98mM7vOqRjLvQqOm9y9KKvZcPCLuX+N+8Mgmzu9BZhjuBVge8GnOnu5QiyjtpKYi8cxyNOiLLKL02C0e8+keTPHXhdr10OUS9zEfsvFGiGb1vipA64uk+vTOBnbwKu369ngsgvbT7dzyNwpC8F4rrvEL7ajyChjK9R6/rPLPaabysLBW8okniO0Btg7ze6vI83gOEvevdQz2efz+9qGp8PT2KRb2HoZM8z9yXPUkXNb1Rqus7glYRujdiS7xYORy8V0rbO5TdoLyHHo+9nQWGPNNbqTzB6P+8b6nvPBUjWrzF0cw8YiYTuxy05bsnlGs8hgAVO6j5WLzYgCS9Qfa1ve6xizvm+sk8BFUePApRDD2RlZo8UYZWPRpCUT3nZN48GnyJvLfnDTyhomY7mlzmvHBGyLyBFiC9rLhovMdj7byT0CC9LEcwvBPc67xaWSg7TCIuPfVoVT3zqTI9B7OJvcXrJby7TVe7kXA5vcl0KjtZLcA7un4nPPBwVLwi5xi92GsSvPvLfb2/+dC8AgSrPKt0W7uoNX48rfrfvJFQk7xH7ou7a8yfPLHTWTyAKsw8uuqpPHTxXDwi9Ae90Uu+Ono03LzpV468NLXjvFRilzxXZ6y8ySZMuqfG1bzo8gw9u5SdO5nGSL0Ndmu8d+xsPSIhZL2/WUU9e0+1PEvq5LwwlvY8q6OHPPyio7x/yw28BvmrPLb+QjwCApY9O0prPSGiijywKBG9O7UqPWFBDTyBQP46YB0IvH0/0bztUgG8/S0uPIwYmLuQpjC9bzICPbBVIj1kiJ67gK9yPIv7VD3Jx5O8g0otu2A5H733LqU7NhFeOx4szDxs2wq8qHISPVHYFz1IVFE8RG0fPQpf+jxB/788TMcJvP+JF7vzY4K75qAxu52sBD1h2AQ8sUGiPdrAejxfaTw8vpkkPZYpAjyKyek7c4YjPOnc5LytMYm8X70dPRGnAT3X3zq9C9WsPIDAubwqA+I7dkXKPAVIEz0drPQ8FDohPQIIsbzj1D08JtCoPIfzmDwjtUy8tbLRPEz6lbwzfoE9ko7JPCNrPzzwWHQ9sqG5Oyy6DjvN1e287E2Lu6Df8rsOAME84xOuvHOOgL0XGA09a1VLOzfFzDv1STY9oXFSvbNVt7zm9Oy8NhPvPKZr6Lv8jjM9wfkhvCq0yrvmN2U8+gF5vJN4R71ZHna817f0u3VWOD0f2ae8t0aEu0SIvTw2Hr+8SJhSPBGlHL0avMS8Rcb6PGEYFrxHccW7nooBPUYxDb1W/jQ6SqYmPXiT5jzGRYk9eLwWPa2KMLyiToi98jPYPB4h6jvlu5Q90q4dPTgCvLzMYzW93sJJvXRkcT3HGdG7OLbs
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":673,"e":732,"m":1777163710956.9082,"t":"payload: {\n streamDelta: {\n op: \"remove_document\",\n documentId: \"page_3\",\n },\n },\n },\n ],\n has_more: false,\n next_cursor: null,\n generated_at: \"2026-04-24T00:00:03Z\",\n });\n const loadSnapshot = vi\n .fn()\n .mockResolvedValueOnce({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n })\n .mockResolvedValueOnce({\n requestId: \"req_2\",\n traceId: \"trace_2\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_2\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_2\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"resync\",\n payload: {\n kind: \"resync\",\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"单条新命令缺少可稳定解释的 streamDelta 时,应回退 resync\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.subtree.move\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":721,"e":780,"m":1777163710956.9082,"t":"it(\"单条新命令缺少可稳定解释的 streamDelta 时,应回退 resync\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.subtree.move\",\n payload: {\n documentId: \"page_2\",\n },\n },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi\n .fn()\n .mockResolvedValueOnce({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n })\n .mockResolvedValueOnce({\n requestId: \"req_2\",\n traceId: \"trace_2\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }, { id: \"page_2\" }] },\n snapshot: {\n dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }, { id: \"page_2\" }] },\n tree: { items: [] },\n },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"resync\",\n payload: {\n kind: \"resync\",\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"正文保存这类无树结构影响的命令应降级为 noop delta,而不是触发 resync\", async () => {\n const loadOverview = vi","v":"ebRhO/fh2zxgXCO+LWQovWVOVT0Qgoq92Mn1PEUuAb3rrzY80YO5vduAjbzwNl48hu8mPQwP27sCGLq8A+o3vS1htLtpJpa7VhG/PCzpHrzXX5e8fzsEvY0ytLzlBfm8V2jsPHqeAD5u36k8QdADPb0Q/TlTjPM8UWWvPe/k5Dvubpe8+7uROhK5db08dUa9uPiOvAMwErxEdxQ89ymTPL5g/jxbRbo8xwHiPOl3Rb3EE+Q8a7NKO9A3MT1Tu467ekdgPdwtiL07L9y82yLavDDQ2LzP5zK7pg7BPeb5gj34TFW7Pv/QvEX3ZrzXj0a9TBRGO/ANkj1GDlg8pqtzPWr3YD3Pn2q8P/IavVyXID2rQCe7uKjWusLrBT1SdRo8QHi8PDUHuryowiG9oIcuO+k4krz9hHq9M7UWvRbekj1HgYG9VgIivRqHdT2HW2g8iQ1ZPdDyM7yeFYm8ilrPutDRZr2eBLA9IJxiPVLUW7wAzpu8NPqbuyKU2rzkTAO89CTkvNP1Mjx9ljS8L5vLO6FSr7wWdHG8klG3vP3aXLyJ1C085Y9CPXrYer2ETyq9nXeIvQ+VmrxL/Dw9jOwgPSFCCL3ntAG9bU3RPD0l4jsBdJ49lWPxvIoKx7zzuaA8WG4VvafNv7wCi3S84u2PPXQFWD3U0xE90w7vu/AJ6DyeMCc954AEvb/CKDsXXy47uRrovDyMKz1CkDA9I4Tbu4I8xbzWFYa8etW5PLxVjzxkngW89rSIPLHW27xKZVm9fJqlPM5CHr0OjxM8Ahm6vGI+g70GUPW71QK/O3fGiLxPWbe80FCivP0IojxBYgW9a0oqPZfcAbtJiyY9NO+kPPq6JD07rZ08zvwsvfv9E7u7BxC9OrL+vPicn7ySFXY94pV1PAkVhryYcs29+iEGvRvrxTxQhK68jicaPVwotTyB1JU8TO/7u4OMW7zd9PG8xrm0u+tJbb1moqU8gxTUPLCbvb1UXbC7CScevTvxkr2Te9u8s6o1vbicVzsqkIS8F8vRu3UFLz0PkLM8+JhrvdfgEjzEERa9HsF8PCDusLvBnkO8lJ1FvFCK8rv1++G8v19CvTZReDyLDFm9VTWEPbZQWL2bqxA9up2NPRX6qLwSoPg6y8IOPXdcfryZCxe8W31FPHJ9ubzlv2O9sqUqPZJheDyanSe9NsaDOrincDvQ8BM9XhcXvbMNlbxjUrO62eR6PL1+wDpo/fi8C6nUvfWT57sw1vo7Ws/HPAV3bT0hrjE8qfR5PULo8zplYho9lJ8cu0ewIzw6F0q8WRPfvE2Q9LrhTpg7bQ+EPAk7VL1KoqG8qklYvIxqnLlisy+9hha7PDoVXT2RlWI9HZBwvQ4g6Lv63wM8GyWqvCS7e7z3yig8nrNpvN2sGj2e6ve8hYl1PJrrV73G7g29FDwcPKCF1rvUr9M8Lc0/vFabmrzF9+s7ZyzePMuQibsW2co42x2EvG2+BT05n9+82uCPPOvxmrt9ql68RfkJvbC7sjxnrEc8c8wNPcFRSLwqLvE8z/AKPVrjwLw6GJG8MIxwPIw9Qr3BVFc9f08KPezOSjyUKuw8bamtPEC6sjxnuSk8cMzQu7kFmT29RnI9fQQVPTYHSj00XVO9kJFOPYV6gTs2RJ48yakxvCiUBzmQyoS8GcBhO6bJoTwbykG91sNsPb21Mz3fias80M4OPbU12Tzyc7K8IwrDvBboory1QRs8E224vNQ/hDyhJcy5ASCFPL3EwzyzRtc67msnPdIh+jzUUII9HTFqvfoSCbyvAGY6GPQQPMQcIz0+qRO8dM6QPQ5lhDwNnni8LZJFPZHjqrzj0bk8ZqepPAla57wkwg69A7iNPdstjjwe3TK925JHPdXScr000B+6ixn5vKIW+DwqK1G8ZEAKPVjPgLy5wEc8vzbrPIEpDLZnwJO8tthXPUER0brs/KA9EsWiPM1lFT3ZobA84r9IPUA
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":769,"e":828,"m":1777163710956.9082,"t":"expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"resync\",\n payload: {\n kind: \"resync\",\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(2);\n });\n\n it(\"正文保存这类无树结构影响的命令应降级为 noop delta,而不是触发 resync\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"page.body.save\",\n payload: {\n documentId: \"page_1\",\n },\n },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [{ id: \"page_1\" }] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [{ id: \"page_1\" }] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: {\n op: \"noop\",\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":817,"e":876,"m":1777163710956.9082,"t":"expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: {\n op: \"noop\",\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"move 这类附带 move_document 的新命令应直接发 delta,而不是触发 resync\", async () => {\n const sidebarSnapshot = {\n activeWorkspaceId: \"ws_1\",\n workspaces: [],\n documents: [\n {\n id: \"page_1\",\n workspace_id: \"ws_1\",\n title: \"页面 1\",\n parent_id: null,\n sort_order: 0,\n access_scope: \"private\",\n is_starred: false,\n is_template: false,\n created_at: \"2026-04-24T00:00:00Z\",\n updated_at: \"2026-04-24T00:01:00Z\",\n },\n ],\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:workspace_root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernelSidebarTree: [],\n trashedDocuments: [],\n mediaAssets: [],\n mindmapDocs: [],\n mindmapAssets: [],\n mindmapAssetChildren: {},\n tableAssets: [],\n };\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":865,"e":924,"m":1777163710956.9082,"t":"mindmapAssets: [],\n mindmapAssetChildren: {},\n tableAssets: [],\n };\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.subtree.move\",\n payload: {\n documentId: \"page_1\",\n streamDelta: {\n op: \"move_document\",\n documentId: \"page_1\",\n parentId: null,\n sortOrder: 0,\n updatedAt: \"2026-04-24T00:01:00Z\",\n },\n },\n },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(2);\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: {\n op: \"move_document\",\n documentId: \"page_1\",\n parentId: null,\n sortOrder: 0,\n updatedAt: \"2026-04-24T00:01:00Z\",\n },\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":913,"e":972,"m":1777163710956.9082,"t":"expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: {\n op: \"move_document\",\n documentId: \"page_1\",\n parentId: null,\n sortOrder: 0,\n updatedAt: \"2026-04-24T00:01:00Z\",\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"copy 这类附带 upsert_documents 的新命令应保留批量文档字段\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValueOnce(\n buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]),\n )\n .mockResolvedValueOnce(\n buildOverview([\n {\n id: \"clog_2\",\n created_at: \"2026-04-24T00:00:02Z\",\n command_name: \"tree.subtree.copy\",\n payload: {\n streamDelta: {\n op: \"upsert_documents\",\n upsertDocuments: [\n {\n id: \"copy_1\",\n workspace_id: \"ws_1\",\n title: \"Copy\",\n parent_id: null,\n sort_order: 2,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-24T00:00:02Z\",\n updated_at: \"2026-04-24T00:00:02Z\",\n },\n ],\n },\n },\n },\n { id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":961,"e":1020,"m":1777163710956.9082,"t":"{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" },\n ]),\n );\n const loadSnapshot = vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { items: [] } },\n });\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot,\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames[1]).toMatchObject({\n event: \"delta\",\n payload: {\n kind: \"delta\",\n data: {\n op: \"upsert_documents\",\n upsertDocuments: [\n expect.objectContaining({\n id: \"copy_1\",\n workspace_id: \"ws_1\",\n }),\n ],\n },\n },\n });\n expect(loadSnapshot).toHaveBeenCalledTimes(1);\n });\n\n it(\"轮询期间没有新 cursor 时,不应额外发 resync\", async () => {\n const loadOverview = vi\n .fn()\n .mockResolvedValue(buildOverview([{ id: \"clog_1\", created_at: \"2026-04-24T00:00:01Z\" }]));\n\n const frames = await collectFrames(\n streamTreeFrames({\n workspaceId: \"ws_1\",\n pollMs: 1,\n maxPolls: 1,\n loadOverview,\n loadSnapshot: vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { items: [] } },\n }),\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.test.ts","s":1009,"e":1025,"m":1777163710956.9082,"t":"maxPolls: 1,\n loadOverview,\n loadSnapshot: vi.fn().mockResolvedValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n data: { activeWorkspaceId: \"ws_1\", documents: [] },\n snapshot: { dataset: { active_workspace_id: \"ws_1\", documents: [] }, tree: { items: [] } },\n }),\n sleep: vi.fn().mockResolvedValue(undefined),\n }),\n );\n\n expect(frames).toHaveLength(1);\n expect(frames[0]).toMatchObject({ event: \"snapshot\" });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":1,"e":60,"m":1777163745580.3542,"t":"import type { TreeStreamDeltaEvent } from \"./tree-delta\";\n\nexport type TreeStreamScope = \"workspace\" | \"subtree\";\nexport type TreeStreamProjection = \"sidebar_tree\" | \"page_tree\";\nexport type TreeStreamEventName = \"snapshot\" | \"delta\" | \"resync\";\n\nexport interface TreeStreamCommandLogCursorRow {\n id?: string | null;\n command_id?: string | null;\n commandId?: string | null;\n created_at?: string | null;\n command_name?: string | null;\n commandName?: string | null;\n payload?: unknown;\n}\n\nexport interface TreeStreamOverview {\n command_logs?: TreeStreamCommandLogCursorRow[] | null;\n domain_events?: unknown[] | null;\n next_cursor?: string | null;\n has_more?: boolean | null;\n generated_at?: string | null;\n}\n\nexport interface TreeStreamSnapshotPayload {\n requestId: string;\n traceId: string;\n data: unknown;\n snapshot: unknown;\n}\n\nexport interface TreeStreamEnvelope {\n kind: TreeStreamEventName;\n stream: TreeStreamScope;\n workspaceId: string;\n rootNodeId: string | null;\n cursor: string | null;\n projection: TreeStreamProjection;\n requestId: string;\n traceId: string;\n data: unknown;\n snapshot: unknown;\n overview: TreeStreamOverview;\n}\n\nexport interface TreeStreamFrame {\n event: TreeStreamEventName;\n payload: TreeStreamEnvelope;\n}\n\nexport interface StreamTreeFramesInput {\n workspaceId: string;\n rootNodeId?: string | null;\n initialCursor?: string | null;\n pollMs?: number;\n maxPolls?: number | null;\n loadOverview: () => Promise<TreeStreamOverview>;\n loadSnapshot: () => Promise<TreeStreamSnapshotPayload>;\n sleep?: (ms: number) => Promise<void>;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":49,"e":108,"m":1777163745580.3542,"t":"}\n\nexport interface StreamTreeFramesInput {\n workspaceId: string;\n rootNodeId?: string | null;\n initialCursor?: string | null;\n pollMs?: number;\n maxPolls?: number | null;\n loadOverview: () => Promise<TreeStreamOverview>;\n loadSnapshot: () => Promise<TreeStreamSnapshotPayload>;\n sleep?: (ms: number) => Promise<void>;\n}\n\ntype DecodedTreeStreamCursor = {\n createdAt: string;\n id: string;\n};\n\ntype TreeStreamDomainEventCursorRow = {\n id?: string | null;\n event_id?: string | null;\n command_id?: string | null;\n commandId?: string | null;\n created_at?: string | null;\n createdAt?: string | null;\n payload?: unknown;\n};\n\nconst TREE_STREAM_NOOP_COMMANDS = new Set([\n \"page.body.save\",\n \"page.layout.updateOptions\",\n \"documents.stats.update\",\n \"blocks.patch\",\n \"blocks.move\",\n \"blocks.embed\",\n]);\n\nfunction normalizeNodeId(value: string | null | undefined) {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n return normalized || null;\n}\n\nexport function resolveTreeStreamContract(input: {\n rootNodeId?: string | null;\n}): {\n stream: TreeStreamScope;\n projection: TreeStreamProjection;\n rootNodeId: string | null;\n} {\n const rootNodeId = normalizeNodeId(input.rootNodeId);\n if (rootNodeId) {\n return {\n stream: \"subtree\",\n projection: \"page_tree\",\n rootNodeId,\n };\n }\n return {\n stream: \"workspace\",\n projection: \"sidebar_tree\",","v":"dn02PD037DyVP+e9pRnNvT51FDvrtye9VB2rvCz+s7vMkbA8zcetvZ2sAb2YsgM9Lqm5PdIGrTxbRBo9HeobvZZ4SrxM55a9PXVePCn7Yz0muTa7mnsKvSK6xTzwuMW8n6uMPZUJmD1Uwrk8F4GTPPyIab0FXl499jX+PIP2dz3P4w+6EVlWPLyaib2ePNc7UmofvVUWQb1XAfi8KZwkPZ3i47yG5HK7mAu/vDxJTLxiQSw9L68wvW74zT3btqk8s3yDPRnPqL1MwAE8xBIDvPkAuzwPMIC8vQivPRoBVj05qe68fiwIvB2Bnjxivcm8AQwuvDdChT2bQkM7bnCfPUJjmj1IvQ69H9AUvTqVWT0txNo6s66bO9HgCT2pu2g9wyaJPGeSHb13AQO9h9xZPTfWULzcGlW9qdJnveC1Ej3ArMG8nbd7vNoikzshfxA9DxhJPR8df7w4gGK8RWkDvWkVEL1GnzU9AoE/PbFE57y92DE8pa4+vHiETr35LCE96Kb+Owz7lTu3mA87WM9zvD7xMT1gKxS9ueECPfVcgzxPTgo8fKJHPbBVoLoXb5W8/IX1vJAXRLyo88O8e3k0PRiToL0TLdO8wF5nPbs2mr01WR890BEivAKDjbyxRpM9rtm8vE5NYr152bw8yM1mPLDTgD1Gseo6kjTEvP7YIDwYk+C7AdVwvYygcL1CuTK9msC4vDv/0jyfwpw9EUNgPJXaqbzUyve8Uj/ePBucwrzoiHO78oN/u9lAm7238Xu8FYSCvLvaTr0+SLc9QeYMvawUGrwP/Wu7mKeKvPP0Bz24sbQ7rvh8PaetqDtAxZq9ZkkYPTGJg7zFnAm9uwMuu7zDRD33dms8RvtZvOa9Vz08K768ODAgvdXmazwzEJ48rGyVPKrqUTwLuT698XxsvekTjjoZuwQ8ElSxvPkhNr1Ls+w83JFFPDLEGTxzGDu93UJyu+fxh72WlU48U9IYu3IrPb15FR69oqwiPLFWkLxFRmE8RG0pvbxwPLuxLfK8V9ZSvXRtgLudt+S8e+E8vdCqUz1dj8C81GExPQYiW72UicK7exaSO82Ypbt6KBQ8PddfvUrXE70m0Ik8IiNPPUWhCL3+Qe67VtnGPahXkDzDv6I8Xsp6vA7imLvTmbU8PF4hvTKhrbzYrTG9po1Wu0musDz4qIa9WewtPYMEXD1Rjmw9z+sdPdE7x7wZyT88qUTYu8zwgrzQaQC9y85rvYh+IT3Abjc9cGKmvEKhLjzJVPc8WpBxPWycFTy++A86s8lHvNJMyry4uqo7y1UovZngLL15bIm72SIMvPnOOL2vAgQ9q3U6PST/F7wqHj49+ye/PB2DoD0+M+w8Y/hFvYBSDbySiJM7nqGCuz9+e71rokc8GRmpvDQoHT0Szgm97PdbvDYh9bx1IAq95uPvuxRjnDzvxLQ8yMfZvDwk2LtftNa8e0YzPZ0xmDzjioU8y/hFvO6/LDwj7BW945xIu6jCEb1KkKS8K0M3vJSVizyFwD69TmNCPezTUDxYGcy6AewevSRVVjyPoJa8iobWOsSO1Lxnck49G6YCvX7r0zxUiOI8b5QNvTQAAL0AbpK8lElCO1/W+TxSdIM9P8lWPbGb8ry3yNK87pLwu8gUDr1k4KY8eQGOPFhwH73EysG7l/M5u0W1HD3rLhm9KdghPUfjFT2rfqs7ttoCPaXg7bu89OK70tk4vVu/Uz3hBsc8R5EtvezRED34iNW7fGlEPGDKDb064D+8j1oZPf/EtDy7qS86j1Uuu0o2vLz26VM8PbHOvM3w/Tv38Vk7/zEfPTb8MD3gYRa9FNFuPTdoCzuZuIe7DdSDPENt9ja3EEm8k94UPZ4apTz59x+9moOxPO5LkTudc/e6Iy+JPErDYD2y2gw9fqcqOU8quzv0Ljg9FNcLPLgsYbx/6DI8LiYgu4nYw7ylwzc8VuwHPfAopbl2gSO86yXAvHOFPDyrXTe9sVISvFGmMzyQBu28pqTbvKn2ZL3uF7M8fs4JvIxV9DyCS6I904yFveHmCT1TafA8OIvdPP9bkrtOZg889cm0O+k/Cz1RGTk9BLEeu3Isbr0F9D07eYI9PHNq4zwqLwc9GkIOvWqGaDtKP/a88NIRPP8LXr1CHSq9oiQVPWmAt7xeJ4s7QfATPU9P57yQss467OT+O+zZEzszom49fselOk7EzjrjdPq80TrPPJi8KrzwBZY9W6kdPU9rprs6tVS9J1iMPD9u5TxLRQY8StnUOx5qRz3cvzk9e+/NPPYZcrxDtdo70BSGvZXz9btx6wY9JByEPQ61VjueIc68bBL+PCGmsLsXZFM8zIDzvJmXaz0MVJM98wJ4vWeYeDybjOe8ZJvLOxlrhD0xF4Q9/J9ovfOLTL1bP8Q8LmkMOwOBUTxqh/M8+JYJvbXNtz05eHe91FKJPN3dDj0IWrg7LR6kvPWjeDxn/Zc8Gk/Avc5Kh7zlvIG8lvYbvUx9RbxZs4O8JnqHPZe0DT2Pl
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":97,"e":156,"m":1777163745580.3542,"t":"} {\n const rootNodeId = normalizeNodeId(input.rootNodeId);\n if (rootNodeId) {\n return {\n stream: \"subtree\",\n projection: \"page_tree\",\n rootNodeId,\n };\n }\n return {\n stream: \"workspace\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n };\n}\n\nexport function encodeTreeStreamCursor(row: TreeStreamCommandLogCursorRow | null | undefined) {\n const id = typeof row?.id === \"string\" ? row.id.trim() : \"\";\n const createdAt = typeof row?.created_at === \"string\" ? row.created_at.trim() : \"\";\n if (!id || !createdAt) {\n return null;\n }\n return JSON.stringify({\n createdAt,\n id,\n });\n}\n\nfunction encodeTreeStreamDomainEventCursor(\n row: TreeStreamDomainEventCursorRow | null | undefined,\n) {\n const rawId =\n typeof row?.event_id === \"string\"\n ? row.event_id.trim()\n : typeof row?.id === \"string\"\n ? row.id.trim()\n : \"\";\n const createdAt =\n typeof row?.created_at === \"string\"\n ? row.created_at.trim()\n : typeof row?.createdAt === \"string\"\n ? row.createdAt.trim()\n : \"\";\n if (!rawId || !createdAt) {\n return null;\n }\n return JSON.stringify({\n createdAt,\n id: `domain_event:${rawId}`,\n });\n}\n\nfunction decodeTreeStreamCursor(raw: string | null | undefined): DecodedTreeStreamCursor | null {\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as {\n createdAt?: string | null;\n id?: string | null;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":145,"e":204,"m":1777163745580.3542,"t":"id: `domain_event:${rawId}`,\n });\n}\n\nfunction decodeTreeStreamCursor(raw: string | null | undefined): DecodedTreeStreamCursor | null {\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as {\n createdAt?: string | null;\n id?: string | null;\n };\n const createdAt = typeof parsed.createdAt === \"string\" ? parsed.createdAt.trim() : \"\";\n const id = typeof parsed.id === \"string\" ? parsed.id.trim() : \"\";\n return createdAt && id ? { createdAt, id } : null;\n } catch {\n return null;\n }\n}\n\nexport function resolveOverviewCursor(\n overview: TreeStreamOverview,\n fallback?: string | null,\n) {\n const commandRows = Array.isArray(overview.command_logs) ? overview.command_logs : [];\n const eventRows = Array.isArray(overview.domain_events)\n ? (overview.domain_events as TreeStreamDomainEventCursorRow[])\n : [];\n const commandCursor = encodeTreeStreamCursor(commandRows[0] ?? null);\n const domainEventCursor = encodeTreeStreamDomainEventCursor(eventRows[0] ?? null);\n\n if (!commandCursor) {\n return domainEventCursor ?? fallback ?? null;\n }\n if (!domainEventCursor) {\n return commandCursor ?? fallback ?? null;\n }\n\n const decodedCommandCursor = decodeTreeStreamCursor(commandCursor);\n const decodedDomainEventCursor = decodeTreeStreamCursor(domainEventCursor);\n if (!decodedCommandCursor) {\n return domainEventCursor;\n }\n if (!decodedDomainEventCursor) {\n return commandCursor;\n }\n\n return decodedDomainEventCursor.createdAt > decodedCommandCursor.createdAt\n ? domainEventCursor\n : commandCursor;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readCommandPayloadDelta(row: TreeStreamCommandLogCursorRow): TreeStreamDeltaEvent | null {\n const commandName =\n typeof row.command_name === \"string\"","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":193,"e":252,"m":1777163745580.3542,"t":"return decodedDomainEventCursor.createdAt > decodedCommandCursor.createdAt\n ? domainEventCursor\n : commandCursor;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readCommandPayloadDelta(row: TreeStreamCommandLogCursorRow): TreeStreamDeltaEvent | null {\n const commandName =\n typeof row.command_name === \"string\"\n ? row.command_name.trim()\n : typeof row.commandName === \"string\"\n ? row.commandName.trim()\n : \"\";\n if (commandName && TREE_STREAM_NOOP_COMMANDS.has(commandName)) {\n return {\n op: \"noop\",\n };\n }\n if (!isRecord(row.payload) || !(\"streamDelta\" in row.payload)) {\n return null;\n }\n const candidate = row.payload.streamDelta;\n if (!isRecord(candidate) || typeof candidate.op !== \"string\") {\n return null;\n }\n\n return {\n op: candidate.op as TreeStreamDeltaEvent[\"op\"],\n node: isRecord(candidate.node) ? (candidate.node as TreeStreamDeltaEvent[\"node\"]) : null,\n document: isRecord(candidate.document) ? (candidate.document as TreeStreamDeltaEvent[\"document\"]) : null,\n documentId: typeof candidate.documentId === \"string\" ? candidate.documentId : null,\n parentId: typeof candidate.parentId === \"string\" ? candidate.parentId : candidate.parentId === null ? null : undefined,\n sortOrder:\n typeof candidate.sortOrder === \"number\" && Number.isFinite(candidate.sortOrder)\n ? candidate.sortOrder\n : undefined,\n updatedAt: typeof candidate.updatedAt === \"string\" ? candidate.updatedAt : null,\n upsertDocuments: Array.isArray(candidate.upsertDocuments)\n ? (candidate.upsertDocuments as TreeStreamDeltaEvent[\"upsertDocuments\"])\n : null,\n upsertAssets: Array.isArray(candidate.upsertAssets)\n ? (candidate.upsertAssets as TreeStreamDeltaEvent[\"upsertAssets\"])\n : null,\n documents: Array.isArray(candidate.documents) ? (candidate.documents as TreeStreamDeltaEvent[\"documents\"]) : null,\n sidebar: isRecord(candidate.sidebar) ? (candidate.sidebar as TreeStreamDeltaEvent[\"sidebar\"]) : null,\n };\n}\n\nfunction readStreamDeltaCandidate(candidate: unknown): TreeStreamDeltaEvent | null {\n if (!isRecord(candidate) || typeof candidate.op !== \"string\") {\n return null;\n }\n\n return {\n op: candidate.op as TreeStreamDeltaEvent[\"op\"],\n node: isRecord(candidate.node) ? (candidate.node as TreeStreamDeltaEvent[\"node\"]) : null,\n document: isRecord(candidate.document) ? (candidate.document as TreeStreamDeltaEvent[\"document\"]) : null,","v":"jbaZPFH0P7uKr/O9TBjBvZCi9T12lxK90jp0vNmF3rw37LU8WmqFvaM9j72DUSI9JLniPb+K0bt6dEE8y6iQvQ+fxrtUk1m9cLrbPCP3DT1QeRQ9OL0/PSQZCzw3JRC9YtSLPbBl5ztAsdk7ERI1PJS4JrxGvVg8YCp+PPwPYjy8QTc96btaPFpO473xGGa8q3jVPLsjoTlRSSM9WItSOxlR+rxi1Xw7hEAXunLeerxEH+U80JqrOyybvj2Sirc8vQgrPUOMlb2S2Km6ak1ZPPTZoD0QmNi8Flh8PTpUFTxKBJQ5L/JwPNUF2Tz/rxs9EzUbPc0fjD1YcgG9tZCaPbp6rjxDve+8DdQVvdqu3jzLqWK8SGm2OFBiKD0mq068xyLSvF4FX7x97jS9TWyIPaZlbrzlG5W85fmxvNuuOj1beIm8Yr2CO6SdkD2ryX09mvjlPLRhHDwJ95Y7ybcpvECqGLzRLEc9NPSuPO1PYzutKE88oTBqvGGsgr3zvt88FOcxPLAtyDxW5+W8rmGXvCgXlTxKd365jGEDu6l2ZLu4WJW7zFZzPYkfzjzXlbc8ZbKlvEQ9H71+IRq9WbTEPaqmAb2eA1C9taIfPaPeg70sbQc6EiWhO9fzcbtIhZQ8JAc+vDnvibvXP7A7UFBPPY0EIT2/VPw846eEOczYGT0gQJU89RA9vd8OVb2Tpeu8q43Su5af1Tx+oAA9we4MPbhVYL3EvN86fyEvvEmWrLx1+6c8JpngvEASKL3hJ6u8pdrYPJG6N73BPok9eFyCvONPV71ofDk8oq7Duij+DT3Oabg851wkuyRsvjxCcMm8GS4jPQBKr7wauIw8m9FYOyliXz2Vi0A8sn/2vNqphTxiWqW8iHfLu3Idszv12UU7240LvP00xjzh+z29yW2dvfnNQjzIHxe9GF38ulCD77s1uwE9edBMu2Dnnjw5Q8i8ETWQPHHFh7yP21w9kwgNPQuUU70wh/u70GzuPLG7g7ySU+w8qkwqvS8Od72LoOq8cz9LvCHlVLvgKpq8qgiVvRDnvTxg6RA8q2MaPeE+Hr21uxi9eSiRvE+jQD0iWpI8ABKIvdhqkjxizgO9mScVPdmtiLwatR48cn6IPZxtmbzMZRI9TnUUve2iwLxnpAG50X8RumvSA7uAW6a9SnwQPB/LkTy626G9je//PCpQvj0AaqE9FPsZPXSjBr3LX+c8bsc8vEO+vLxrxCS96CrDvUce/roVMBk9LHNEPHCG/DuwBjM9cj1KPbS2Tz0OTDs8jbc/vcezrDzcWKg8BC+DvDzLqbwDYiO8
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":241,"e":300,"m":1777163745580.3542,"t":"};\n}\n\nfunction readStreamDeltaCandidate(candidate: unknown): TreeStreamDeltaEvent | null {\n if (!isRecord(candidate) || typeof candidate.op !== \"string\") {\n return null;\n }\n\n return {\n op: candidate.op as TreeStreamDeltaEvent[\"op\"],\n node: isRecord(candidate.node) ? (candidate.node as TreeStreamDeltaEvent[\"node\"]) : null,\n document: isRecord(candidate.document) ? (candidate.document as TreeStreamDeltaEvent[\"document\"]) : null,\n documentId: typeof candidate.documentId === \"string\" ? candidate.documentId : null,\n parentId: typeof candidate.parentId === \"string\" ? candidate.parentId : candidate.parentId === null ? null : undefined,\n sortOrder:\n typeof candidate.sortOrder === \"number\" && Number.isFinite(candidate.sortOrder)\n ? candidate.sortOrder\n : undefined,\n updatedAt: typeof candidate.updatedAt === \"string\" ? candidate.updatedAt : null,\n upsertDocuments: Array.isArray(candidate.upsertDocuments)\n ? (candidate.upsertDocuments as TreeStreamDeltaEvent[\"upsertDocuments\"])\n : null,\n upsertAssets: Array.isArray(candidate.upsertAssets)\n ? (candidate.upsertAssets as TreeStreamDeltaEvent[\"upsertAssets\"])\n : null,\n documents: Array.isArray(candidate.documents) ? (candidate.documents as TreeStreamDeltaEvent[\"documents\"]) : null,\n sidebar: isRecord(candidate.sidebar) ? (candidate.sidebar as TreeStreamDeltaEvent[\"sidebar\"]) : null,\n };\n}\n\nfunction readDomainEventPayloadDelta(row: TreeStreamDomainEventCursorRow): TreeStreamDeltaEvent | null {\n if (!isRecord(row.payload)) {\n return null;\n }\n return readStreamDeltaCandidate(row.payload.streamDelta ?? row.payload.stream_delta);\n}\n\nfunction readCommandRowCommandId(row: TreeStreamCommandLogCursorRow): string | null {\n const raw =\n typeof row.command_id === \"string\"\n ? row.command_id\n : typeof row.commandId === \"string\"\n ? row.commandId\n : typeof row.id === \"string\"\n ? row.id\n : \"\";\n const trimmed = raw.trim();\n return trimmed || null;\n}\n\nfunction readDomainEventCommandId(row: TreeStreamDomainEventCursorRow): string | null {\n const raw =\n typeof row.command_id === \"string\"\n ? row.command_id\n : typeof row.commandId === \"string\"\n ? row.commandId\n : \"\";\n const trimmed = raw.trim();\n return trimmed || null;\n}","v":"izzZO26WIr2uG++922G6valUtT1XLvi7yiEavdky3Dw8OP88KTGLvTLWcL203UM977G6PQnGdzxat828Orw2vSSvv7tGbY29ERQXPRuri7tNQ0Q8FGoDPQEmED0uZP68Rc+lPRvgaTz6tjk8qyUgO/XjG7xng4Y7tW5RPMtU5jznFio9n08WPMz5mL3a2ty8RngkPbftgrvHpR49/rpCu+PIBr2kDr88vUplPBMYNr0dFFO7wrTHuyllqD23hAQ93nsBPf0xzr04iFW8qy+VPJRsjD00rMC8w3iMPbX9lDs5eJg8KTH7O1rbkjzKgsU8bGd8PdXIbj1Uhse8MoDYPeYhqDzudUW9oWvxvCRtWTz/g608CdgLO/biWDxsxX660Jntuw9IUrxhxCu8R5g9PfhA/rwXCrC8HCMnvZcDZz1MZOy7LVIHPM9/iT1sj4I9LpUZPRYv7bt1OfO7EPdRvJVFsrxquDY95uAhPTI2mjy/diC8/uomPLmkLr1lPew8HRU3O4F2pDyV+xW8Cv75vFizzzweK8C5gVSxvJhTGDxiBaU7+JMnPfyQyjn6IQ09Z2LUu/NJKb3MFT+9E7udPd4vCL3CVRi9oOoaPWl+s72e+lK60IJqvOGFGTx8QiA93SiovHzYU7tQXTI7ulBdPWjpQj2T8e089hVavGjUYjyOguI8ZAd4vVszH70wsoS8fEgAvJy52TwN0e88bF2JPPlejr0369O7e3WuO8E8z7wu1q48IJ2ZvGli57yV9+K8xUqHPJB2Eb3yiW09SuOPvKUlVb0Cl6c8ULphvMQ61zzwZP08kV2bu1anBj1op9e8OTeFPaKAJb02CnS8n+tau3H8hT2fzB48pSu9vBOXtjyXtP68ThBvvLt+e7odAcA6d3VUu9DXWz1oKie9WCWJvQedxrsWlTy8RehCvOLJA7xBoWo8lhGxu2vmZTygV3q8S/a2PEGxK72XqW49M5fSPO9Ohb01WoW7hkt8PLLMwLxBmcY8xWBlvY4fgb200we9R4aGvHy/3LvyBAm9zZFVvWPjvjzGMaW824FxPQRTLr3eBwC9Md8fvH7Ayjytus48fTBYvatTLDw6qvk6LDMbPaU3I7zbPtU8GjOTPTSTjDvVEy89tEMzvQNujjs/a+e7kiY2vF+fzbsDZ4y9XKH5O52RLT35vZS9YaGXPGLakD14IT09reABPS1lH735AQ4937wUvZzk87z4vP28ewbVvXoDojuGlDU91zSpPL7Y4brSOmo9H8xTPdHwJj3DslS78CCGvTyBpTyk4o08FcwJvJuf9LuCI4u8JLdGvVE09zwuKCg8tuoFPdvA3rsXw8E8vJxoPH6kuT0Sv5g7K0S8vKM//by97i87VNNhuoX7br12+i09bY+ZvFj5OT1I92E71NWfvPzfGrypCWy9q3KQPAI10zzPypC5fFbgvGDPpDzNTu88QMsOPYPB4TyrpgA8zvn5uoutKD1zwNg6sOViPAM5EL0ccpu8+5zvvPNvBj1JtUi9PwEoPPiONjzb6pC8o+U8vNtOk7xlVyW9d945vBHo
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":289,"e":348,"m":1777163745580.3542,"t":"}\n\nfunction readDomainEventCommandId(row: TreeStreamDomainEventCursorRow): string | null {\n const raw =\n typeof row.command_id === \"string\"\n ? row.command_id\n : typeof row.commandId === \"string\"\n ? row.commandId\n : \"\";\n const trimmed = raw.trim();\n return trimmed || null;\n}\n\nfunction resolveMatchingCommandDomainEventDelta(input: {\n commandRows: TreeStreamCommandLogCursorRow[];\n domainEventRows: TreeStreamDomainEventCursorRow[];\n commandDrifted: boolean;\n domainEventDrifted: boolean;\n}): TreeStreamDeltaEvent | null {\n if (\n input.commandDrifted ||\n input.commandRows.length !== 1 ||\n input.domainEventRows.length !== 1\n ) {\n return null;\n }\n\n const commandId = readCommandRowCommandId(input.commandRows[0] ?? {});\n const eventCommandId = readDomainEventCommandId(input.domainEventRows[0] ?? {});\n if (!commandId || commandId !== eventCommandId) {\n return null;\n }\n\n const commandDelta = readCommandPayloadDelta(input.commandRows[0] ?? {});\n const eventDelta = readDomainEventPayloadDelta(input.domainEventRows[0] ?? {});\n if (!commandDelta || !eventDelta) {\n return null;\n }\n\n return JSON.stringify(commandDelta) === JSON.stringify(eventDelta) ? eventDelta : null;\n}\n\nfunction collectNewCommandLogs(input: {\n rows: TreeStreamCommandLogCursorRow[];\n previousCursor: string | null;\n}) {\n const previousCursor = decodeTreeStreamCursor(input.previousCursor);\n if (!previousCursor) {\n return {\n rows: input.rows,\n drifted: false,\n };\n }\n\n const previousIndex = input.rows.findIndex((row) => {\n const id = typeof row.id === \"string\" ? row.id.trim() : \"\";\n const createdAt = typeof row.created_at === \"string\" ? row.created_at.trim() : \"\";\n return id === previousCursor.id && createdAt === previousCursor.createdAt;\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":337,"e":396,"m":1777163745580.3542,"t":"return {\n rows: input.rows,\n drifted: false,\n };\n }\n\n const previousIndex = input.rows.findIndex((row) => {\n const id = typeof row.id === \"string\" ? row.id.trim() : \"\";\n const createdAt = typeof row.created_at === \"string\" ? row.created_at.trim() : \"\";\n return id === previousCursor.id && createdAt === previousCursor.createdAt;\n });\n\n if (previousIndex >= 0) {\n return {\n rows: input.rows.slice(0, previousIndex),\n drifted: false,\n };\n }\n\n const newerRows = input.rows.filter((row) => {\n const createdAt = typeof row.created_at === \"string\" ? row.created_at.trim() : \"\";\n return createdAt > previousCursor.createdAt;\n });\n if (newerRows.length < input.rows.length) {\n return {\n rows: newerRows,\n drifted: false,\n };\n }\n\n return {\n rows: input.rows,\n drifted: input.rows.length > 0,\n };\n}\n\nfunction collectNewDomainEvents(input: {\n rows: TreeStreamDomainEventCursorRow[];\n previousCursor: string | null;\n}) {\n const previousCursor = decodeTreeStreamCursor(input.previousCursor);\n if (!previousCursor) {\n return {\n rows: input.rows,\n drifted: false,\n };\n }\n\n const previousId = previousCursor.id.startsWith(\"domain_event:\")\n ? previousCursor.id.slice(\"domain_event:\".length)\n : previousCursor.id;\n const previousIndex = input.rows.findIndex((row) => {\n const id =\n typeof row.event_id === \"string\"\n ? row.event_id.trim()\n : typeof row.id === \"string\"\n ? row.id.trim()\n : \"\";\n const createdAt =\n typeof row.created_at === \"string\"","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":385,"e":444,"m":1777163745580.3542,"t":"const previousId = previousCursor.id.startsWith(\"domain_event:\")\n ? previousCursor.id.slice(\"domain_event:\".length)\n : previousCursor.id;\n const previousIndex = input.rows.findIndex((row) => {\n const id =\n typeof row.event_id === \"string\"\n ? row.event_id.trim()\n : typeof row.id === \"string\"\n ? row.id.trim()\n : \"\";\n const createdAt =\n typeof row.created_at === \"string\"\n ? row.created_at.trim()\n : typeof row.createdAt === \"string\"\n ? row.createdAt.trim()\n : \"\";\n return id === previousId && createdAt === previousCursor.createdAt;\n });\n\n if (previousIndex >= 0) {\n return {\n rows: input.rows.slice(0, previousIndex),\n drifted: false,\n };\n }\n\n const newerRows = input.rows.filter((row) => {\n const createdAt =\n typeof row.created_at === \"string\"\n ? row.created_at.trim()\n : typeof row.createdAt === \"string\"\n ? row.createdAt.trim()\n : \"\";\n return createdAt > previousCursor.createdAt;\n });\n if (newerRows.length < input.rows.length) {\n return {\n rows: newerRows,\n drifted: false,\n };\n }\n\n return {\n rows: input.rows,\n drifted: input.rows.length > 0,\n };\n}\n\nfunction buildTreeStreamEnvelope(input: {\n kind: TreeStreamEventName;\n workspaceId: string;\n rootNodeId: string | null;\n projection: TreeStreamProjection;\n cursor: string | null;\n overview: TreeStreamOverview;\n snapshot: TreeStreamSnapshotPayload;\n}): TreeStreamEnvelope {\n return {\n kind: input.kind,\n stream: input.rootNodeId ? \"subtree\" : \"workspace\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":433,"e":492,"m":1777163745580.3542,"t":"function buildTreeStreamEnvelope(input: {\n kind: TreeStreamEventName;\n workspaceId: string;\n rootNodeId: string | null;\n projection: TreeStreamProjection;\n cursor: string | null;\n overview: TreeStreamOverview;\n snapshot: TreeStreamSnapshotPayload;\n}): TreeStreamEnvelope {\n return {\n kind: input.kind,\n stream: input.rootNodeId ? \"subtree\" : \"workspace\",\n workspaceId: input.workspaceId,\n rootNodeId: input.rootNodeId,\n cursor: input.cursor,\n projection: input.projection,\n requestId: input.snapshot.requestId,\n traceId: input.snapshot.traceId,\n data: input.snapshot.data,\n snapshot: input.snapshot.snapshot,\n overview: input.overview,\n };\n}\n\nfunction buildTreeStreamDeltaEnvelope(input: {\n workspaceId: string;\n rootNodeId: string | null;\n projection: TreeStreamProjection;\n cursor: string | null;\n overview: TreeStreamOverview;\n snapshot: TreeStreamSnapshotPayload;\n delta: TreeStreamDeltaEvent;\n}): TreeStreamEnvelope {\n return {\n kind: \"delta\",\n stream: input.rootNodeId ? \"subtree\" : \"workspace\",\n workspaceId: input.workspaceId,\n rootNodeId: input.rootNodeId,\n cursor: input.cursor,\n projection: input.projection,\n requestId: input.snapshot.requestId,\n traceId: input.snapshot.traceId,\n data: input.delta,\n snapshot: null,\n overview: input.overview,\n };\n}\n\nasync function defaultSleep(ms: number) {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function* streamTreeFrames(\n input: StreamTreeFramesInput,\n): AsyncGenerator<TreeStreamFrame> {\n const contract = resolveTreeStreamContract({\n rootNodeId: input.rootNodeId,\n });\n const pollMs = Math.max(250, Math.floor(input.pollMs ?? 2000));\n const maxPolls =","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":481,"e":540,"m":1777163745580.3542,"t":"async function defaultSleep(ms: number) {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function* streamTreeFrames(\n input: StreamTreeFramesInput,\n): AsyncGenerator<TreeStreamFrame> {\n const contract = resolveTreeStreamContract({\n rootNodeId: input.rootNodeId,\n });\n const pollMs = Math.max(250, Math.floor(input.pollMs ?? 2000));\n const maxPolls =\n typeof input.maxPolls === \"number\" && Number.isFinite(input.maxPolls)\n ? Math.max(0, Math.floor(input.maxPolls))\n : null;\n const sleep = input.sleep ?? defaultSleep;\n\n let snapshot = await input.loadSnapshot();\n let overview = await input.loadOverview();\n let cursor = resolveOverviewCursor(overview, input.initialCursor ?? null);\n\n yield {\n event: \"snapshot\",\n payload: buildTreeStreamEnvelope({\n kind: \"snapshot\",\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n }),\n };\n\n let polls = 0;\n while (maxPolls === null || polls < maxPolls) {\n polls += 1;\n await sleep(pollMs);\n\n overview = await input.loadOverview();\n const nextCursor = resolveOverviewCursor(overview, cursor);\n if (nextCursor === cursor) {\n continue;\n }\n\n const rows = Array.isArray(overview.command_logs) ? overview.command_logs : [];\n const newRows = collectNewCommandLogs({\n rows,\n previousCursor: cursor,\n });\n const eventRows = Array.isArray(overview.domain_events)\n ? (overview.domain_events as TreeStreamDomainEventCursorRow[])\n : [];\n const newEventRows = collectNewDomainEvents({\n rows: eventRows,\n previousCursor: cursor,\n });\n const hasNewCommandRows = newRows.rows.length > 0;\n const hasNewDomainEventRows = newEventRows.rows.length > 0;\n if (hasNewCommandRows && hasNewDomainEventRows) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":529,"e":588,"m":1777163745580.3542,"t":"previousCursor: cursor,\n });\n const eventRows = Array.isArray(overview.domain_events)\n ? (overview.domain_events as TreeStreamDomainEventCursorRow[])\n : [];\n const newEventRows = collectNewDomainEvents({\n rows: eventRows,\n previousCursor: cursor,\n });\n const hasNewCommandRows = newRows.rows.length > 0;\n const hasNewDomainEventRows = newEventRows.rows.length > 0;\n if (hasNewCommandRows && hasNewDomainEventRows) {\n const delta = resolveMatchingCommandDomainEventDelta({\n commandRows: newRows.rows,\n domainEventRows: newEventRows.rows,\n commandDrifted: newRows.drifted,\n domainEventDrifted: newEventRows.drifted,\n });\n if (delta) {\n cursor = nextCursor;\n yield {\n event: \"delta\",\n payload: buildTreeStreamDeltaEnvelope({\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n delta,\n }),\n };\n continue;\n }\n\n snapshot = await input.loadSnapshot();\n cursor = nextCursor;\n yield {\n event: \"resync\",\n payload: buildTreeStreamEnvelope({\n kind: \"resync\",\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n }),\n };\n continue;\n }\n\n if (!newRows.drifted && newRows.rows.length === 1) {\n const delta = readCommandPayloadDelta(newRows.rows[0] ?? {});\n if (delta) {\n cursor = nextCursor;\n yield {\n event: \"delta\",\n payload: buildTreeStreamDeltaEnvelope({\n workspaceId: input.workspaceId,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":577,"e":636,"m":1777163745580.3542,"t":"};\n continue;\n }\n\n if (!newRows.drifted && newRows.rows.length === 1) {\n const delta = readCommandPayloadDelta(newRows.rows[0] ?? {});\n if (delta) {\n cursor = nextCursor;\n yield {\n event: \"delta\",\n payload: buildTreeStreamDeltaEnvelope({\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n delta,\n }),\n };\n continue;\n }\n }\n\n if (!newEventRows.drifted && newRows.rows.length === 0 && newEventRows.rows.length === 1) {\n const delta = readDomainEventPayloadDelta(newEventRows.rows[0] ?? {});\n if (delta) {\n cursor = nextCursor;\n yield {\n event: \"delta\",\n payload: buildTreeStreamDeltaEnvelope({\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n delta,\n }),\n };\n continue;\n }\n }\n\n snapshot = await input.loadSnapshot();\n cursor = nextCursor;\n\n yield {\n event: \"resync\",\n payload: buildTreeStreamEnvelope({\n kind: \"resync\",\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n }),\n };\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/server.ts","s":625,"e":638,"m":1777163745580.3542,"t":"event: \"resync\",\n payload: buildTreeStreamEnvelope({\n kind: \"resync\",\n workspaceId: input.workspaceId,\n rootNodeId: contract.rootNodeId,\n projection: contract.projection,\n cursor,\n overview,\n snapshot,\n }),\n };\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":1,"e":60,"m":1777250310501.2493,"t":"import { describe, expect, it } from \"vitest\";\nimport type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport {\n applyTreeStreamDelta,\n applyTreeStreamDeltaToProjectionState,\n} from \"./tree-delta\";\n\nconst baseSidebarData: SidebarInitialData = {\n activeWorkspaceId: \"ws_1\",\n workspaces: [],\n documents: [\n {\n id: \"root\",\n workspace_id: \"ws_1\",\n title: \"Root\",\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: null,\n },\n {\n id: \"child\",\n workspace_id: \"ws_1\",\n title: \"Child\",\n parent_id: \"root\",\n sort_order: 1,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: null,\n },\n ],\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [\n {\n rowId: \"doc:root\",\n rowKind: \"document\",\n nodeId: \"root\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"Root\",\n depth: 0,\n position: 0,\n childCount: 2,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\"expand\", \"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"root\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":49,"e":108,"m":1777250310501.2493,"t":"title: \"Root\",\n depth: 0,\n position: 0,\n childCount: 2,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\"expand\", \"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"root\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n {\n rowId: \"index:root\",\n rowKind: \"index\",\n nodeId: \"index:root\",\n parentNodeId: \"root\",\n nodeType: \"index\",\n projectionKind: \"file_tree\",\n title: \"index.md\",\n depth: 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"root\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n },\n iconHint: \"index\",\n },\n ],\n edges: [],\n },\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [\n {\n nodeId: \"root\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"sidebar_tree\",\n title: \"Root\",\n depth: 0,\n position: 0,\n childCount: 1,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\n \"expand\",\n \"open\",\n \"drag\",","v":"cF3JPHXyhj2gasG9gpS0vUa9tbwqNSq9jWTgvJPbFjxjSV+8ddbKu/r5OD34Xa28FrXSPUjARDv4YDE9ZoOrvCYdgb0QDEy9OxXePLRIR7qZRmq8gJVwvLLMj7yS8ly7XCsbPVkKOT3DbWe8MmygvBflzLxr/mM9uuNUPVWZLz0IqRO9QDVbPIWgQb11LgO8JfmLPQpDFzwA84k8QjMmPenjg73iK/S8rsXGvGxaNr2mRg+9ysRNvQ9qFj3UJos50NaxPRugAb1Tq6K83abFu1XRhj339vy8Xv/nPfrYzDwGBj28qE/tPE9oijzFshu9MFlOvJ2F2T3z9o06cNeyPf9oGj0K3Q48IcmHuzMZlTzULxC9xP0Ru2/XCz3NMKU8emfdvDLC7LyKkhK9ANAXPay7Hb0v5AW8VD3cvKdZGz1SAby8RGqZvPh2j7qph428SzYLPXSmYDxyf6I7vh7IO0lfk7zmMEQ9S4cOPU0TYjv7Ghy9/5SlPfX4Sr1kboq863XSPMARh7wesom87M8OvBjVEL2U9BA9yO86Pe5xxjxP1sk8ahLGPZj9fLx4yN68sBVKvFqWMr09wQE87r2rPBUbFL2ajKW9zpR2PTDYdr21vHE94Nqpu/AwxjwXYHU8CTtvOqVXF7s2PVM90SNVPVC/Oj2lCBa7ztKvvDmkqrykrwY9nVdIvYTzfryVs5G8MNuxvF4FHz2C71c9RtCDPdGUP732frS8GkfSPBLrpjue6i29mWjMO7XZFL3+Q6Q6XCoaOwrHmL2B+5c9xN1fvBruZb3amh48r1h1vSbUAz1C/JO9O/Y2PW0aHT36by699eFiPTLQlDwMJ9+7tSk2vGWXyTz9mjo9XPKKvLTjNj1xwN+8Q4f4vK8JhT0ExFy8YutBPE2gBD39Avy8sm+CvdJDFLwsUeW7BPfAvP6wSDykgZY92b4OPFzqOD3iN4C8OpUPPf197rzVLAw7RXoBOxfmVb3s5N+61smjPMbyiTvfYEO8xncMvTbNFb1IFs283m4AvHknD7vSPEK9aQyZvWRpmD1S4Bq9DFbjO0T3k70o0eC8RyQBPR4FCb33nE89a08UvbbdRjsWy4G7jc5QPYnYsrySMVA9viSRPWxrC73YKKc8wCboulK6nzwTUeq7i48NvaLAdTy+ozy9fEc3O8cOVLf7hni8UyThvOUfGD2+kgM9FH37OkTy/Ls16Po8XOtoPOFc3TtjCpC9hkKLvQzlWT1arno8Y23BvMNcGL2w2Z48wqCkPcATrLwjuwc98mQNvA3QHbsFdZu7C1qAvU7tjDsflXy7eIr8OxBuOb1wPsw870k7PdcGZbwcmQ88XRpEPQeAWz38Lsg8KH8gvWXiY7zaPiu9mUJDvGKGtL2OM688KrsCPKPiQbolvAa94qjevFTI67wQQYa9ApLUu658TT04q5k8k4AePUZ1v7zOmuK7XkxiPYUnZDvVRaY8JdvuPASsPz3353C9L0GsOt1/Sr0+B3K89KtbvJdsxTy36zm9gkEWPb8GVbp1R/881qlJPANqkbxl5mw8PANnPPmDFb10VIk8NQ7sPJRYBTz5jVI7Vq2Quy3Esrth5Gc8S/6EvGZToj3y5rU9gzUbPZpL47xwK1y93NMDPanaXrqhOf27T6QCPSTGB71z4GO93XEuvSQHDD0hY/u8XHP+PKykcDwM+8K8D36/PL2YqLxpDjs94kWivNErBL3dIzW8t2n0uw29PjxF8K+8lnCAPBp3wjrOadE78iIHvDsNTj0Temg88l9YvK3ECzyzqwI9j/SYPK9UvTrfRhg9hZgQPSkqKD0j2RC9EybxPDVETrx/m7c86GbDO5Gtury+UZ28vRCUPKOZQD0gmdm66G4uvAU9Kjz1/aQ8VxVMPKrFEz27EJ079VBUvMtoAL0JYKg5o766PLwp1rtDTYC9SH/uvLpyi7zbZwo9KRZkPWbx9zxfaqa7R2QOPSlhkTtp2lO9zxIyPfQVhjw1K028thP0vMJpJb0KEpU8DpwrPI9uPD1TILI60d5vvU/fXDxOJ209QHgCvcpnOz1X1kC85qIXvfK3Uj3Jbqw9EwQHvSDKxru8aya8TqETve10NbysWrE7q02AvI1Xlzyztla9XtGPPIG8DL3PX4283cz+POviADzb/II8TmkqPGrrvTyD/iw9EZ3cOpxzJ7zGMYw9p35vPI3IZbyEhOW8xvTcPHeXIr1lYIk9HXaCPC06Y72rM6i7a2m7OiFSmj3qWKe8c0J4vOKYXT36SQU96W4KvX+IzTxFZQo9skOKvC5vu7z4fx09p8Z8PUqPo7zD1YW7eCHjPCvNRrwEHxw82gfxvOgQBz2iZhQ9hpSkvT3LCzzE3H
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":97,"e":156,"m":1777250310501.2493,"t":"nodeType: \"page\",\n projectionKind: \"sidebar_tree\",\n title: \"Root\",\n depth: 0,\n position: 0,\n childCount: 1,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\n \"expand\",\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"root\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n {\n nodeId: \"child\",\n parentNodeId: \"root\",\n nodeType: \"page\",\n projectionKind: \"sidebar_tree\",\n title: \"Child\",\n depth: 1,\n position: 1,\n childCount: 0,\n expandable: false,\n expandedByDefault: true,\n capabilities: [\n \"open\",\n \"drag\",\n \"drop\",\n \"select\",\n \"create-child\",\n \"rename\",\n \"archive\",\n \"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"child\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":145,"e":204,"m":1777250310501.2493,"t":"\"restore\",\n \"context-menu\",\n \"reorder\",\n ],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"child\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n ],\n edges: [\n {\n id: \"edge:root:child:parent_of\",\n edgeType: \"parent_of\",\n workspaceId: \"ws_1\",\n fromNodeId: \"root\",\n toNodeId: \"child\",\n },\n ],\n },\n kernelSidebarTree: [],\n trashedDocuments: [],\n trashedMediaAssets: [],\n trashedMindmapAssets: [],\n trashedTableAssets: [],\n tableAssets: [],\n mindmapDocs: [],\n mindmapAssets: [],\n mindmapAssetChildren: {},\n mediaAssets: [],\n};\n\nconst fileTreeProjectionBase: SidebarInitialData = {\n ...baseSidebarData,\n mediaAssets: [\n {\n id: \"asset_pdf\",\n workspace_id: \"ws_1\",\n document_id: \"root\",\n asset_type: \"file\",\n file_url: \"/manual.pdf\",\n thumbnail_url: null,\n bucket: null,\n storage_path: \"documents/root/manual.pdf\",\n file_name: \"manual.pdf\",\n file_size: 1024,\n mime_type: \"application/pdf\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-18T00:00:00Z\",\n },\n {\n id: \"asset_book\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":193,"e":252,"m":1777250310501.2493,"t":"file_size: 1024,\n mime_type: \"application/pdf\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-18T00:00:00Z\",\n },\n {\n id: \"asset_book\",\n workspace_id: \"ws_1\",\n document_id: \"root\",\n asset_type: \"file\",\n file_url: \"/novel.epub\",\n thumbnail_url: null,\n bucket: null,\n storage_path: \"documents/root/novel.epub\",\n file_name: \"novel.epub\",\n file_size: 2048,\n mime_type: \"application/epub+zip\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-18T00:00:00Z\",\n },\n {\n id: \"asset_mindmap_child\",\n workspace_id: \"ws_1\",\n document_id: \"root\",\n asset_type: \"image\",\n file_url: \"/mindmap/concept.png\",\n thumbnail_url: null,\n bucket: null,\n storage_path: \"documents/root/mindmaps/asset_mindmap/concept.png\",\n file_name: \"concept.png\",\n file_size: 512,\n mime_type: \"image/png\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-18T00:00:00Z\",\n },\n ],\n tableAssets: [\n {\n id: \"asset_table\",\n workspace_id: \"ws_1\",\n document_id: \"root\",\n asset_type: \"luckysheet\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":241,"e":300,"m":1777250310501.2493,"t":"updated_at: \"2026-04-18T00:00:00Z\",\n },\n ],\n tableAssets: [\n {\n id: \"asset_table\",\n workspace_id: \"ws_1\",\n document_id: \"root\",\n asset_type: \"luckysheet\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: \"budget.luckysheet\",\n file_size: null,\n mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-18T00:00:00Z\",\n },\n ],\n mindmapAssets: [\n {\n id: \"asset_mindmap\",\n workspace_id: \"ws_1\",\n document_id: \"root\",\n asset_type: \"mindmap\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: \"mindmap.json\",\n file_size: null,\n mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-18T00:00:00Z\",\n },\n ],\n mindmapAssetChildren: {\n asset_mindmap: [\"asset_mindmap_child\"],\n },\n};\n\ndescribe(\"tree-stream/tree-delta\", () => {\n it(\"支持 upsert_document 重建 sidebar projection\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"upsert_document\",\n document: {\n id: \"leaf\",\n workspace_id: \"ws_1\",\n title: \"Leaf\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":289,"e":348,"m":1777250310501.2493,"t":"asset_mindmap: [\"asset_mindmap_child\"],\n },\n};\n\ndescribe(\"tree-stream/tree-delta\", () => {\n it(\"支持 upsert_document 重建 sidebar projection\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"upsert_document\",\n document: {\n id: \"leaf\",\n workspace_id: \"ws_1\",\n title: \"Leaf\",\n parent_id: \"child\",\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: null,\n },\n });\n\n expect(next.documents.map((item) => item.id)).toEqual([\"root\", \"child\", \"leaf\"]);\n expect(next.kernelSidebarProjection.items.map((item) => item.nodeId)).toEqual([\n \"root\",\n \"child\",\n \"leaf\",\n ]);\n });\n\n it(\"支持 remove_document 级联移除子树\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"remove_document\",\n documentId: \"root\",\n });\n\n expect(next.documents).toEqual([]);\n expect(next.kernelSidebarProjection.items).toEqual([]);\n });\n\n it(\"支持对已存在文档做局部 upsert patch,而不丢失原有排序字段\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"upsert_document\",\n document: {\n id: \"child\",\n title: \"Child Renamed\",\n updated_at: \"2026-04-18T00:05:00Z\",\n },\n });\n\n expect(next.documents).toHaveLength(2);\n expect(next.documents.find((item) => item.id === \"child\")).toMatchObject({\n id: \"child\",\n title: \"Child Renamed\",\n parent_id: \"root\",\n sort_order: 1,\n workspace_id: \"ws_1\",\n });\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":337,"e":396,"m":1777250310501.2493,"t":"});\n\n expect(next.documents).toHaveLength(2);\n expect(next.documents.find((item) => item.id === \"child\")).toMatchObject({\n id: \"child\",\n title: \"Child Renamed\",\n parent_id: \"root\",\n sort_order: 1,\n workspace_id: \"ws_1\",\n });\n });\n\n it(\"支持 upsert_documents 批量新增复制出的子树\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"upsert_documents\",\n upsertDocuments: [\n {\n id: \"copy_root\",\n workspace_id: \"ws_1\",\n title: \"Copy Root\",\n parent_id: null,\n sort_order: 2,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-18T00:10:00Z\",\n updated_at: \"2026-04-18T00:10:00Z\",\n },\n {\n id: \"copy_child\",\n workspace_id: \"ws_1\",\n title: \"Copy Child\",\n parent_id: \"copy_root\",\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-18T00:10:00Z\",\n updated_at: \"2026-04-18T00:10:00Z\",\n },\n ],\n });\n\n expect(next.documents.map((item) => item.id)).toEqual([\n \"root\",\n \"child\",\n \"copy_root\",\n \"copy_child\",\n ]);\n expect(next.kernelSidebarProjection.items.map((item) => item.nodeId)).toEqual([\n \"root\",\n \"child\",\n \"copy_root\",\n \"copy_child\",\n ]);\n expect(\n next.kernelSidebarProjection.items.find((item) => item.nodeId === \"copy_child\"),\n ).toMatchObject({\n parentNodeId: \"copy_root\",\n depth: 1,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":385,"e":444,"m":1777250310501.2493,"t":"]);\n expect(next.kernelSidebarProjection.items.map((item) => item.nodeId)).toEqual([\n \"root\",\n \"child\",\n \"copy_root\",\n \"copy_child\",\n ]);\n expect(\n next.kernelSidebarProjection.items.find((item) => item.nodeId === \"copy_child\"),\n ).toMatchObject({\n parentNodeId: \"copy_root\",\n depth: 1,\n });\n });\n\n it(\"支持 move_document 细粒度更新父节点与排序字段\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"move_document\",\n documentId: \"child\",\n parentId: null,\n sortOrder: 0,\n updatedAt: \"2026-04-18T00:10:00Z\",\n });\n\n expect(next.documents.find((item) => item.id === \"child\")).toMatchObject({\n id: \"child\",\n parent_id: null,\n sort_order: 0,\n updated_at: \"2026-04-18T00:10:00Z\",\n });\n expect(next.kernelSidebarProjection.items.map((item) => item.nodeId)).toEqual([\n \"root\",\n \"child\",\n ]);\n expect(\n next.kernelSidebarProjection.items.find((item) => item.nodeId === \"child\"),\n ).toMatchObject({\n parentNodeId: null,\n depth: 0,\n });\n });\n\n it(\"支持 replace_sidebar 直接切换到 resync snapshot\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"replace_sidebar\",\n sidebar: {\n activeWorkspaceId: \"ws_1\",\n workspaces: [],\n documents: [],\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":433,"e":492,"m":1777250310501.2493,"t":"documents: [],\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernelSidebarTree: [],\n trashedDocuments: [],\n trashedMediaAssets: [],\n trashedMindmapAssets: [],\n trashedTableAssets: [],\n tableAssets: [],\n mindmapDocs: [],\n mindmapAssets: [],\n mindmapAssetChildren: {},\n mediaAssets: [],\n },\n });\n\n expect(next.documents).toEqual([]);\n expect(next.kernelSidebarProjection.items).toEqual([]);\n });\n\n it(\"支持 noop delta 仅推进 cursor,不修改当前 sidebar snapshot\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"noop\",\n });\n\n expect(next).toEqual(baseSidebarData);\n });\n\n it(\"支持 resync_required delta 仅推进 cursor,等待后续 snapshot/resync\", () => {\n const next = applyTreeStreamDelta(baseSidebarData, {\n op: \"resync_required\",\n });\n\n expect(next).toEqual(baseSidebarData);\n });\n\n it(\"为 page_tree 定义统一 delta 应用边界,并可稳定派生页面行\", () => {\n const next = applyTreeStreamDeltaToProjectionState({\n projection: \"page_tree\",\n base: baseSidebarData,\n event: {\n op: \"upsert_document\",\n document: {\n id: \"leaf\",\n workspace_id: \"ws_1\",\n title: \"Leaf\",\n parent_id: \"child\",\n sort_order: 0,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":481,"e":540,"m":1777250310501.2493,"t":"it(\"为 page_tree 定义统一 delta 应用边界,并可稳定派生页面行\", () => {\n const next = applyTreeStreamDeltaToProjectionState({\n projection: \"page_tree\",\n base: baseSidebarData,\n event: {\n op: \"upsert_document\",\n document: {\n id: \"leaf\",\n workspace_id: \"ws_1\",\n title: \"Leaf\",\n parent_id: \"child\",\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: null,\n },\n },\n });\n\n expect(next.projection).toBe(\"page_tree\");\n expect(next.documents.map((item) => item.id)).toEqual([\"root\", \"child\", \"leaf\"]);\n expect(next.pageTreeItems.map((item) => item.nodeId)).toEqual([\"root\", \"child\", \"leaf\"]);\n expect(next.pageTreeItems.find((item) => item.nodeId === \"leaf\")).toMatchObject({\n parentNodeId: \"child\",\n depth: 2,\n title: \"Leaf\",\n });\n });\n\n it(\"为 file_tree 定义统一 delta 应用边界,并保留 doc/index/asset-folder/asset 行语义\", () => {\n const next = applyTreeStreamDeltaToProjectionState({\n projection: \"file_tree\",\n base: fileTreeProjectionBase,\n event: {\n op: \"replace_documents\",\n documents: [...fileTreeProjectionBase.documents],\n },\n });\n\n expect(next.projection).toBe(\"file_tree\");\n expect(next.fileTreeItems.map((item) => item.rowKind)).toEqual(\n expect.arrayContaining([\"document\", \"index\", \"asset_folder\", \"asset\"]),\n );\n expect(\n next.fileTreeItems.find((item) => item.resourceMeta.assetId === \"asset_mindmap\"),\n ).toMatchObject({\n rowKind: \"asset_folder\",\n iconHint: \"mindmap\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"mindmap\",\n assetKind: \"mindmap\",\n }),\n });\n expect(\n next.fileTreeItems.find((item) => item.resourceMeta.assetId === \"asset_pdf\"),\n ).toMatchObject({\n rowKind: \"asset\",\n iconHint: \"pdf\",","v":"ZdkVPSHcxTysFxq+UnOBvSl3Cj32wz+9GfrovM9eED2hhwa9LyeNveqJKbuBzwm8kaepPWd1dTshOOY8E56SvKj3aLzFfLS8o7C1PDWfvzvwe8W8G+IlPKYvDb36YJe8hFUsPU2zqj0zJTY7GRmkvDCIH7xBhz89LXlDPdXdVT35HZy83PDEO65gq70Kb4i9ShoSPdygDLy06j48wVO7PFouczym9828mAw5OT6Bqr2xFAU9H9u+vMix6z2TjFQ8t0l6PU6QQL3848O87uaoO/wLPz3mziG84CWOPZYgrT3EnAq8L9I1vXn7Dj1Y49m8mWq2O9RaeD3VnCQ8thGvPRjLXD1huxi8y+N9vXe8RDy90sY6XzhduREZTj024zs9BtjTOsrBtbwbRDC9TFtbu9MiybyVQTG9VtFAvbQ6Yz2zsh+9NB+CvBmzZz3odyo9jklzPeXh/bsKXna8yDE1PEgJL73+I2c9nWcNPWuWEjya87u7PoM/O2cYar2i6ic86GhTvJ8jBjy5IIe9+Wl+vIjM4rxkU/s7docaPbyg5TwAiDQ8LkKdPeuQtrt+2Tm9sb7ZvN+S67xjA+k8uNsZPdZjML1rSZC9RV5APVMwibuJeaE9DpFQujlfLLwjt9Y8o62evNS8OL3HVfw8pqq7PYXETD10k8Q8PfYpvf6xrTxTKcU8Fm8jvWCAs7xJpKc8MiNDu5aJ+zy8dos98FNUPSqTUb3B1kq8LanDPP/mzjsXP6+8lqsNPLewPr15PYK88d4WPavtgrwRLtM8qE0KvBMTgb0KJ828KTmpvBlBPDz1Vdi8wqRyvAuqaD0xDxG9brgHPU0mvrsA3OA8vhdFPfApEj23UTw8y6Bmu13gBD2l9BG90GVEvbcV6jwW+F09P/jZO7h3ILwukeO8stsovRvyZT3koo68VL5UvI1h/ztQUhM9dTsiOxmY4Txotju9Gi1lPBIngrxJYi899iRKOwgNjb0tRxq90ez8vF5yw7xd3eY8/RlTvep7AD2tYc28V6muvHqdCD17jio7aCAgvfQZvjz/4VS9vFrQPO53EL0S9WU7taNSu6W2M7w576a81pmcvdIGvDyV8m67oG51PRE/Ar1eOwE9OSlOPfzJg7yQaOc4QfsTPZGb7bxYA2m814KlO/RHNL3uq5+9NGJYvNIRvrmktpe99NhoPOe2Wz1+TvA87xfUPArDGbyFb5O8sx0GO1lGuLtDR1u9x5i4vbTXuTv0zyI9qnN6PPUYHj2W6yA9tEGgPUkjXTzylTE9HgeivHvnzbzeuJw8z6pSvIiZ07w0ObQ7cwEePVdUIL29iJu8Tqk8PR1drjtK9Kc7zrdIPYeIdD0g9Sg95hdWvVgcFL3pOwi9ROdMPDaAN7rings9OR9avNtgbz0PEhe96cE3vbzZsL1PckC9PGuavDP+6zwF9/Q7qAoZO3VdkLwGIx88589KOtnIs7xUtC48BFM4upSCJLscfOm8dqMIPEXPADs8Yui8aFsivaSmWT1P6xW9sM2kPEvCEr33pOQ88K1lOyxXw7wtehO9V+o5vdK2trxHgDw9aOldPcvVZTikHeA87TnEOyXVvruDKDE84bsLvIR7gD17SLg9Y3tsPIWturnt2TK9ARmpPQepQzuKY3G8tUQRvBIWJ72nPTS93mbLvDbNEjsOERi97UmgPEroJz3SNZ48bDrVukn5tTy1kcC89gfzvKABBb0Lkg48sHwxvfA7Gz1/tCi8okAtPXfH0jq0EC691h4CPaDL9jwmtca79M+iuT8dSDwjhio7YZ7FPIRDuzysrXs838tiPV+wkz1WFFi8
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":529,"e":588,"m":1777250310501.2493,"t":"rowKind: \"asset_folder\",\n iconHint: \"mindmap\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"mindmap\",\n assetKind: \"mindmap\",\n }),\n });\n expect(\n next.fileTreeItems.find((item) => item.resourceMeta.assetId === \"asset_pdf\"),\n ).toMatchObject({\n rowKind: \"asset\",\n iconHint: \"pdf\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"pdf\",\n assetKind: \"pdf\",\n }),\n });\n expect(\n next.fileTreeItems.find((item) => item.resourceMeta.assetId === \"asset_book\"),\n ).toMatchObject({\n rowKind: \"asset\",\n iconHint: \"book\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"book\",\n assetKind: \"book\",\n }),\n });\n expect(\n next.fileTreeItems.find((item) => item.resourceMeta.assetId === \"asset_table\"),\n ).toMatchObject({\n rowKind: \"asset\",\n iconHint: \"table\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"table\",\n assetKind: \"table\",\n }),\n });\n });\n\n it(\"file_tree fixture 覆盖搜索 hardening 需要的 index、asset-folder、mindmap child、book 与 pdf 资源类型\", () => {\n const next = applyTreeStreamDeltaToProjectionState({\n projection: \"file_tree\",\n base: fileTreeProjectionBase,\n event: {\n op: \"replace_documents\",\n documents: [...fileTreeProjectionBase.documents],\n },\n });\n const rowById = new Map(next.fileTreeItems.map((item) => [item.rowId, item]));\n\n expect(rowById.get(\"index:root\")).toMatchObject({\n rowKind: \"index\",\n title: \"index.md\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"index\",\n documentId: \"root\",\n }),\n });\n expect(rowById.get(\"asset-folder:asset_mindmap\")).toMatchObject({\n rowKind: \"asset_folder\",","v":"+8sePSdsHDy4LyS+P+dnvc9TAD09Sme9BXldu6I3Yz0eC8y85vMXvdZ+JDwGmGE8Bct6PXes97ts5cI8nLm3PCtVtLxoXO87YcJcPexjjTwgcqM8G/bhOiqh0jseLHO7f2zlPK1TrD115ms7VGxQPL4T77w9Dzw92tJOPXiFgjy9Cq+84p5LvSvY3L2Bqam9UAiuPdpiZjxa9pO7lGCBPPaEi7xP2Wi8cLBEvUzEE72CoUQ97qbYO8FWsz1Whu88DM6rPVNUzLylzyo8InJAPfKhVz2C+nG7vCayPZO/hD1XPSU9XY/PvMvRIz2ZtWu9h2yCPeCxBj1wyWe8DL9PPXUsRD1p38o8S0rFvH6n7Txkdis7cgLrvL3Wgz1BsQY9dBMyvKSZDT3uOTq9nsUOvBdVPb3Dn5285h7OvNZJTD14BJy7t/oTu4Zbmz1wjSI7q78XPYozyLs0FwC8zzNWPBGosbqBiF49gGZEPXv/Aj1WYBc8yXmovBdyer1JhXs83HSpu9jLCj1PZKi9c0kCvdoZ17qxsrQ8cl7vPPVAgTzekyu7GhscPYbgRrr5+Cm8oOQ2vdNYgrzK1rc7qloOPfv5BTvf7Qm9vOljvHT7vbyluxw929uVuvPKMLz2JrU8o92hvMdUkbynnWQ9gMV8PSEXTT2UoOA8Cs+dvI3UsTsCdN27xe+TvL2TqbtXVZ287bDyOl01xTw3Vnc9LkeTPcIVJ73kdsW88m/pPLBYNztjwKg83SjGPEzlD7zv9ky8BQFgvGG9Sb1MRcM8thQBvd5ZvL2g4Xg8aMpTvTMc8jtQvGy8rNuavKbMfj1CCU68PTL5u57DHTkBEXw8TKQePZTu6zqIgps8JwwsvPxqTj2JLKO4U5mfvczVSz1oNWs9ELOPPJDKojk6c+m80VZOvWB6Dzs2dQS8nCu0vHcuDLvZtkE9buq0vLT4+TwWwNO8LI+MPcWVT70BB249K8HPu07ZR72yZia9HMbHvK9VQrwxk2s7J7MXvT/9IzxIqSC90RegvbD4Gj1YaGQ8sSwIvRYtsruwijy9pIUIPH9NzLsZ2R09y2C8vPm5HTy63d08ASFuvb+fjj1dhBG9BfkDPYHHlrzzHMU8lGRIPehUKr0RJ1E7M2EQPenWq7sn1kY8Jh8RPTWO6bwDCTq9+yDivDbGGrxRAZ+8sHxdPBlol7wAkW89l29tPUpX0DxXktq8VHMOPTzAprsrkFu9GyGBvdN4ST2BMjw9vF+VvKywCj3v1C88Mb0/PeAkHz0n0jQ9yZo1vHsKBD1DMQI9DHr+POsKZ73sTMG86PHPPPnfO73KnfO7GkpfPRv7QD0N8YA8auxcPD+xQTw5F2M89+l5vX3OsLxHbrW8ZO3FOy/olLzQNKE7CSFNPLI4jj2w7IC8zquEvWH2gr0xDha9uiSMvJ0uIDvEIYS84zZWulCQizu9AYQ8dhnJPIrYKDy7ZfY8oSUYPaY4Jz2AOXC9fSyHvK9ehL1tHgG88/QBvWgtRD2XvJW9SFzQO5KyzrwIs9w4yl3XOuS4brzk61m8nH1du3y3ubz7ies87hHYPEY+7rz3f9M6AObeO8gRQzph0Lq8OGS2O9Exhj0pmKE9aXphPCDH47z87Hm9nyFMPGWUzbuKyIm8QLUJva2JeLpsX3a9Tzj1O+CL/bzVzuG8d+8svGLFvTznxf87I7ZlPRJ3wryMdHC8btDDvLem67whdAG9scbUvDE+ST0J43+8dBpPPdiS2jyUfuu8ArEXPSo1MTxGRpm85K+ovNCq/bwujP887I3YPDNxQD1rMBc9XgsEPY3czT13PlG8AvYzPVbnOjvYASa9jKB8PBGPP71RxUE7WwasPYqGmT2PrCS84PF0vfciarzjNqS8c9aDPPNoJTsltIA8ujLDPMm7V7wFdia8IYETPcAzXryDVDU9qq/wOr/JYr3EACY9ZdVKPc0Puzx/IQc9g66kO7ZA6zx+6Su9G228PBRoBD1urEE7B7A5vMC9lLuoHxW8OBG5vFwtCLs
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":577,"e":636,"m":1777250310501.2493,"t":"const rowById = new Map(next.fileTreeItems.map((item) => [item.rowId, item]));\n\n expect(rowById.get(\"index:root\")).toMatchObject({\n rowKind: \"index\",\n title: \"index.md\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"index\",\n documentId: \"root\",\n }),\n });\n expect(rowById.get(\"asset-folder:asset_mindmap\")).toMatchObject({\n rowKind: \"asset_folder\",\n title: \"mindmap\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"mindmap\",\n assetKind: \"mindmap\",\n }),\n });\n expect(rowById.get(\"asset:asset_mindmap_child\")).toMatchObject({\n rowKind: \"asset\",\n parentNodeId: \"asset-folder:asset_mindmap\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"asset\",\n assetKind: \"image\",\n }),\n });\n expect(rowById.get(\"asset:asset_book\")).toMatchObject({\n rowKind: \"asset\",\n iconHint: \"book\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"book\",\n assetKind: \"book\",\n }),\n });\n expect(rowById.get(\"asset:asset_pdf\")).toMatchObject({\n rowKind: \"asset\",\n iconHint: \"pdf\",\n resourceMeta: expect.objectContaining({\n resourceKind: \"pdf\",\n assetKind: \"pdf\",\n }),\n });\n });\n\n it(\"支持 upsert_assets 更新资源归属并重建 file_tree projection\", () => {\n const next = applyTreeStreamDeltaToProjectionState({\n projection: \"file_tree\",\n base: fileTreeProjectionBase,\n event: {\n op: \"upsert_assets\",\n upsertAssets: [\n {\n id: \"asset_pdf\",\n workspace_id: \"ws_1\",\n document_id: \"child\",\n asset_type: \"file\",\n file_url: \"/manual.pdf\",\n thumbnail_url: \"/manual.pdf\",\n bucket: null,\n storage_path: \"documents/child/manual.pdf\",","v":"WCJeOZQetDx0uBC+DNmmvYdtuzxXW/C8dBAUvfMs/Dz3DOu7UreevXi/abw4BXc9dhPgPYC0wbyJFPI82BFsuxyvGr0B2Wo7dI44PTL9XDyI6YE8/Ovfu2H4hTnYpw26lQsTPXsPxz3fcow8BpgCPdiiDb2PNOk8Lg+FPa5yCD255pK7LW69vIpE7b2DbDS9c8iFPb1JrTlzPn88yJa4vBfup7z49ou83yPZvJWmDr0he9M8Q9AkvQwj0T3QSxc9R5auPXyYA70YOl278pT3PNXVEj3irJO8c1bxPczosz3Ul2u6CHjOvABBAT1qpky9DY6mPEejBz3R2l06pV+IPd6Imz2da1I7vR5qvT0uCT37rBy9Axh1PNJUUz0E8B09TnuLOxBCn7zplSq9k3fiPNUoXr1Hq0u9fjodvXlq+jwJm/O8ZZIcPIk/cT0gk2G7qngSPW8tfbxh1Iw72AMRPRYC37zuDl09dD0PPchmHT1nzam8yJYZOwIeYL0FzCG88CpEvO8OgTt0ORe98nnbvBiaQLyFrAI9KZoFPWdWgTvm5ay6V8ipPU+QdLsdz2e80FU0vRJ0Ab0ROoa8AkDzPCsA3rwRB4C94xO/vLB1Hb0o4OA8cRT0vKNp9zuxacc7RqJXvY4aUbxPtI89N8u2PUHsTj1iJTY9qoOQO8YmDrsSZ5Y8xDn0vGzKjbysx4q8NPf8u24a1Dy5+VI9y73xPIM7K7216yW9gIojPZ+spDzlXnU6fofjO7Z4Db0dShu925/HPNMTab0F8B49h1k1uTYmPL06Ass7VldivZfOqzwbpoS8ubS8PL5uKj1f13S8thXNO6fhvLyFyhk9WIpIvFqE4TwFNMQ8GlapvL+X1zwW6OS8iru7vWESVD32i748KFLuOxNoOzzwLZe8FwyLvW6gkjv1BcO8GeaNvBsjnLzTMKU8YqSTu8eQOzvAOf68yfYgPee3fL1NmxE9spcCPXXX27xM6hG9VFMAvfzShjusTbY7tSEovb2O27u84+28UY+AvceAmjwl33s7z7lPvXBZMz0zEQu9wYN7PHsOU7ygOEM9Id+mu9MkYrsyMxY9J5SWveIwDT3uliW9oy8OPemUbry2hNA8de1qPUx0EL3B5tO7HR2duz7e67wEykq8/ONDPPbhKb0lunG946SKPLQT47vKJQK9RyTzPFXA2DrANS89FrjuPIIGnjyHL3W8lUrVPMEOETtNaJq9Tz+MvRbauTzmobA8SaJZvCmTqjxc7jo97z+KPWOt1jvYChI9/nQCvCspwDw2TBE9Pbq+u6BaDL0lZqm8n1qnPF+JFr3mdle8O0GtPNcfHjyv1NU8qk8SPOP8wjxrEso83dY7vfRDL7wOVOy8YCkwvPJAPr0GI5c734WPut3uUj2HfDy9KHY8vUbXYr3uTQG9oDDWOUVmtDtTX2A7Jh1JvA2e87t2i4Q7/Ch3PIn1nDx7ZaU82BMmPPMeEz023wa9bSnBvBjgp719jo+8s/j0vN010TyNVZa9RajbOzuQxryxsME8oDUKPcoY6Lzrv645nQsDPTSHB72hKVQ9p9eYPJEwl7kA/T09UAc+PAtv1zuvFc68kF6bPC876DyPG+E94VTJPOLbH7r6sFi9ZawbPd4G9Lw1KtY7nsFfPIft+LypdBi92gSKvAeYE7zhB/q8gyi1vH1S2jtEKgG8QBpAPWk7CbwEqYe8cnzVvFgH7bwBtTE8LaUWvEXtzzxXrK28ywUYPcb2Cj2qbQa9DFgAPT43EDwCCnq8Yloxu6JP57xk6hM8IOT8O2hM+zwfx6M8U9uHPbYBdz0eJWy87qByPWhdNbzIjQ29wLMsPa1CJr25DwO9L2iCPRtzJz2MhRe93OUcu0VlNrzHlDA7dHV/PM6lPT0/MCI9iWoXO8TWFrzi8pQ7U0TGOwCJrLuG+xI9dfw1u5VMV70yckY9eq2APTAHc7qT4Hc9WXbvPM3JpjyGJD+9nxXBOu
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.test.ts","s":625,"e":664,"m":1777250310501.2493,"t":"event: {\n op: \"upsert_assets\",\n upsertAssets: [\n {\n id: \"asset_pdf\",\n workspace_id: \"ws_1\",\n document_id: \"child\",\n asset_type: \"file\",\n file_url: \"/manual.pdf\",\n thumbnail_url: \"/manual.pdf\",\n bucket: null,\n storage_path: \"documents/child/manual.pdf\",\n file_name: \"manual.pdf\",\n file_size: 1024,\n mime_type: \"application/pdf\",\n ocr_text: null,\n ocr_status: null,\n created_at: \"2026-04-18T00:00:00Z\",\n updated_at: \"2026-04-26T00:00:00Z\",\n },\n ],\n },\n });\n\n expect(next.sidebar.mediaAssets?.find((asset) => asset.id === \"asset_pdf\")).toMatchObject({\n document_id: \"child\",\n updated_at: \"2026-04-26T00:00:00Z\",\n });\n expect(\n next.fileTreeItems.find((item) => item.resourceMeta.assetId === \"asset_pdf\"),\n ).toMatchObject({\n parentNodeId: \"child\",\n resourceMeta: expect.objectContaining({\n documentId: \"child\",\n resourceKind: \"pdf\",\n }),\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":1,"e":60,"m":1777248223078.1016,"t":"import type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport { buildKernelFileTreeProjection } from \"@/lib/kernel-file-tree\";\nimport type { SidebarDatasetListQueryResult } from \"@/lib/sidebar-data\";\nimport {\n buildSidebarDatasetListQueryResult,\n mapSidebarDatasetListQueryResultToInitialData,\n} from \"@/lib/sidebar-data\";\nimport type { DocumentRecord } from \"@/lib/documents\";\nimport {\n buildSidebarTreeFromKernelProjection,\n type KernelSidebarProjectionItem,\n} from \"@/lib/kernel-sidebar\";\nimport type { KernelFileTreeProjectionItem } from \"@/lib/kernel-file-tree\";\nimport {\n buildPageTreeProjectionItems,\n type PageTreeProjectionItem,\n} from \"@/lib/tree-projection\";\nimport type { WorkspaceSummary } from \"@/lib/workspaces\";\nimport type { MediaAsset } from \"@/types/media\";\n\nexport type TreeStreamDocumentPatch =\n Partial<DocumentRecord> & Pick<DocumentRecord, \"id\">;\n\nexport type TreeStreamDeltaOp =\n | \"noop\"\n | \"resync_required\"\n | \"upsert_document\"\n | \"upsert_documents\"\n | \"upsert_assets\"\n | \"remove_document\"\n | \"move_document\"\n | \"replace_documents\"\n | \"replace_sidebar\";\n\nexport type TreeStreamDeltaEvent = {\n op: TreeStreamDeltaOp;\n node?: TreeStreamDocumentPatch | null;\n document?: TreeStreamDocumentPatch | null;\n documentId?: string | null;\n parentId?: string | null;\n sortOrder?: number | null;\n updatedAt?: string | null;\n upsertDocuments?: TreeStreamDocumentPatch[] | null;\n upsertAssets?: MediaAsset[] | null;\n documents?: DocumentRecord[] | null;\n sidebar?: SidebarDatasetListQueryResult | SidebarInitialData | null;\n};\n\nexport type TreeRendererProjection = \"sidebar_tree\" | \"page_tree\" | \"file_tree\";\n\nexport type TreeRendererDeltaState = {\n projection: TreeRendererProjection;\n sidebar: SidebarInitialData;\n documents: DocumentRecord[];\n sidebarItems: KernelSidebarProjectionItem[];\n pageTreeItems: PageTreeProjectionItem[];\n fileTreeItems: KernelFileTreeProjectionItem[];\n};\n\nfunction cloneSidebarData(data: SidebarInitialData): SidebarInitialData {","v":"He+CPNeKXT3IsvG9GJWivRWSBT2ifni9v4cVvLsYFrxWnjS9BD7Su9Ug07yNvmk8O+a7PUcgaDwxYj49lWpJvZYiG70LwJC9rKjBOc9xiT2zJaO8e40fvRWFLDqpv5K9ZFuRPSCNkz3gQco8LEgCO94PYr3Mwhs9DNpWPXZy4LxNbto8PH95O57HwbxX68u8WqWkvLVQU7trXBM97jATPSjWr73TNYK8F1gNu32Syrz7FsY8tS/Ru0XPtD1D5rS8se6bPUHsOr3mMf88JoQNveSzwLtelzk8tjBuPVIvbbtqir07rAZFPBWXcDwa2dW8JQ7TvMZN8j0aa+68NsWlPaaoozyumd27eQgauxK5mj20tgC9/hsFvWyXTj0/KXU8UXMaPfDlj7wHPiS9aJeYuyh3hDzGXbq8TK+yO2131jzZT4e8m08+u1O5YDy2OAg9S+odvFajLj08CV+9HzS2vDwozbzRAE87tQVFPc5kQL0Sfs27xFbdPDR5/7zHxFS8cNUoO8O2yDzbgsK8dbMJvVDZ8jyyHDu9AXmKPJ4KjTxQ9Rs9+nWMPLF6J7yJEzm57QN8vPhfK72TANG7yrtbPVdtQr14+f682YxcPdnjk72sI448ue7XvPJNHz3r1x89uOdrvBi2Lr0mCbI77c8jPZxeRj3jnEK96W0nvMI/6DzGPB89wDEyvXLTWry1Hyq9sML9vG9i/Dz/Z9k9Mb2OPbHOhrxkAIu7OwoFPNmFALzybK08gjMFvfanib1BwZy78pZVPCZv/bwCXx89SMWoOaE1Ob3mvSG88tIkvdwK9jyAhB+9ut2IPQXglzyGu4a9dNtmPc2xujytyZo7gBjGvMOTVD1qrt+6w64TvXGQDz2TAfU8Sil2vMMj0bogsb48dN0QPdLxMj2avI+9wM9xvLusGrzx91a92KauPM1CjjzOsMg8H1Y0PJgUhjz4awG9G0XTvJzuUb1fxnY8VKpXuu3TXr1Dfy68PUmNPBwAFryNGjG8d/DbvFcC27w4V6a8541eOkBfXLzhXDW9446LvcIv+Tz+yea8v305PFSieL2fur+8FmHNvHZSTryMu2k8NAEOvUvnP7vC4Gu85ol1Pf8YGb2HC+k8Q2FYPS7klLzeMws91u2fO8oxyzowq7k8S4Nave9EDryBsne89pn5PA9tkrrlq069R/YjvNDzNz2r2DU99fgQPU1oGjwOkQ88uwiOu/M+N72UGfi8kyP+vFU/rTw5o0s7bpcTumOKgrwxu8Q8rn+SPaBI6jt4g6k78Xd7PGTdyDtkGcM86Ql7ve4zIzzy6sw6Ex0IueWITb2qy/08PPtOPRtmzbymwgc8ky0dPaONPT2kEdC8H7huvdL1Trz+Iz+9rsFTPAxQUb01SzK78D58vH76ezwx/BK9F32BvC0oKL34joW97akWPVjSHDxgij89LdEjvAViSryxVIa646EsPXURej1IKDs7/wipPGCogjw2EwK9bh6IPMwNqL2ZmYy9aZavukrOmztrahA8k+tMPXbVTzyh+es8jqy+vL/9qDoMALc8g1wdO2wSDL1MBa085jAHPR93Czx22GQ8JMKBvFJwRL2RyCu9yH01PAd6JT2Xxk49Ni4QPdAAjLtRt4i9LNKhu5lUUrw29U28nYiDPfTD7ryoPla9xhw6vXYrpz2zAFa7ubWXPEZA9Ttm65a88oWHPLoJFr0bD5U8bDiGvZvjrjydn6E7RtgRvUqgDT2v/vQ7ck2/PODLGz239a2826VvPV31YT3lgL07I+KCvN03TL34itk8f2sfveVYyDwgTci7YdtYPXQogD1BMza9ISgbPdFGNzy4yYy78jnDvLbQXrxSijC9Mi1GPUUm9
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":49,"e":108,"m":1777248223078.1016,"t":"export type TreeRendererProjection = \"sidebar_tree\" | \"page_tree\" | \"file_tree\";\n\nexport type TreeRendererDeltaState = {\n projection: TreeRendererProjection;\n sidebar: SidebarInitialData;\n documents: DocumentRecord[];\n sidebarItems: KernelSidebarProjectionItem[];\n pageTreeItems: PageTreeProjectionItem[];\n fileTreeItems: KernelFileTreeProjectionItem[];\n};\n\nfunction cloneSidebarData(data: SidebarInitialData): SidebarInitialData {\n return {\n ...data,\n workspaces: [...data.workspaces],\n documents: [...data.documents],\n kernelFileTreeProjection: {\n ...data.kernelFileTreeProjection,\n items: [...data.kernelFileTreeProjection.items],\n edges: [...data.kernelFileTreeProjection.edges],\n },\n kernelSidebarProjection: {\n ...data.kernelSidebarProjection,\n items: [...data.kernelSidebarProjection.items],\n edges: [...data.kernelSidebarProjection.edges],\n },\n kernelSidebarTree: [...data.kernelSidebarTree],\n trashedDocuments: [...data.trashedDocuments],\n trashedMediaAssets: [...(data.trashedMediaAssets ?? [])],\n trashedMindmapAssets: [...(data.trashedMindmapAssets ?? [])],\n trashedTableAssets: [...(data.trashedTableAssets ?? [])],\n mindmapDocs: [...(data.mindmapDocs ?? [])],\n mindmapAssets: [...(data.mindmapAssets ?? [])],\n mindmapAssetChildren: { ...(data.mindmapAssetChildren ?? {}) },\n tableAssets: [...(data.tableAssets ?? [])],\n mediaAssets: [...(data.mediaAssets ?? [])],\n };\n}\n\nfunction buildSidebarFromDocuments(input: {\n base: SidebarInitialData;\n documents: DocumentRecord[];\n}): SidebarInitialData {\n const queryResult = buildSidebarDatasetListQueryResult({\n activeWorkspaceId: input.base.activeWorkspaceId,\n workspaces: input.base.workspaces as WorkspaceSummary[],\n documents: input.documents,\n trashedDocuments: input.base.trashedDocuments,\n mindmaps: (input.base.mindmapAssets ?? []).map((asset) => ({\n mindmap_id: asset.id,\n workspace_id: asset.workspace_id,\n document_id: asset.document_id,\n created_at: asset.created_at,\n updated_at: asset.updated_at,\n deleted_at: asset.deleted_at ?? null,\n deleted_by: asset.deleted_by ?? null,\n })),\n mediaAssets: input.base.mediaAssets as MediaAsset[] | null,\n trashedMediaAssets: input.base.trashedMediaAssets as MediaAsset[] | null,\n tables: (input.base.tableAssets ?? []).map((asset) => ({","v":"pd0VPW21Wz0oUPC9ZW7Wvaq3hjse0ym9EukpvIwV1Tsy6ZK8e09lvAMZnLspgkc8GpzxPXSCkTzrfhc9aiwCvcUaOb1F06K9CBzHPHFUWD1lN4c5b9/ZvH+NRTwN5SO9rdsVPeR/iT2hJg48GUJGvHlEZb1MMYw9QtMbPcnqSj29Fr63wSIxu3B82rwCZFG8CXToN5W6a7zSOmA8Rl4cPd3ORb1Q3I68NRzcvFFbgbxQsqM8JO3BvNLH2j18rou7wklUPU+i1ryeUis9HZYnvIj+Az3Zb6M8sXmgPRXR4DxgmBK9qNaRvJfDpTw4/Bi9QFoVvEOYiz08yiY8lffRPU6ghT1jKci8+UsdvbrVPD2INdK8bz+fO4xlgD2okVM9xNMGPGcujLr5Gi+9u4oVPTjhajwpFdi8mtJmvbZ2Cj2eoTe9KegIvWvIHT1REcg8jHkbPV52QzzXFNi8RbTRvG4WH70PZOc82JUEPb8SAr1CvRU9g63iu8Ri5bwDfIs7tywmvNPJLrzDGvq8vBEQvb6xjzyCoaq8rKoSPRQ76jwEizg9o5ZCPGvWvzwuwQe9EZxMvHLlHrxwQUm8B7QfPdlKub3Uen684avlPKKsH71xqC89/O7zvO7thjoJPj49CA+NvPNvQL3NbDk9ir/0PICCMz3XG5U82VusvFoXBLylopc8oE8Vvad0C71o6re8a3GxvG9mKz18SKM9gDS2Pe6qA71ANK682xrRO6CxhbxhDLA7eAKTvDUFa73d/hq8VwzQvIs2ibwmaog9x4PKu/noUr3YOm67LK8jvdw2Tz3OU7K8O7eDPUjlqTvdxW+90EcWPYIbNTsSDI68r97/uyBWPT2TSpM8fWquvHoOGz33LmO7HKIFvfUO6zyYsJY6V4oVPZ2r4jwawBS942AmvauRZDziJ2u8vUliOv5nt7vFzSE990CkPLzZoTwSJkO94wydPOe/Tr2k1JE8BHliPEIky7zjh92842hfvHWAu7sK73m80xJovRuD3zvJycG8bdg0vV9iNjwRdQy94tGEvez3VD14RCy9YCoGPZn+gr0IXVy7ugMNPHJouby7kjU9CtRTvQe+lLwjoby7fwk5PbWy+bzJxNU7ESFnPbgAr7xUjRI9t+x5PF5sC71M8MY72oM4vdc3vLyeD5+8Bq0bPFvT2LujvgG9ihhOPMhAkT2nR6493FY3PSb1vLz9v0S8DlqDPPhUTzuIvkm9oqtbvZZm9zy8ad07eX4Avd/nFb0sMKM8DJKjPc/ZHLx1aP48XAfEOxxFlLz81Fy8dE5NvW6w/rt75XQ8ffQmvNd+l71Lgis94hEPPTU2jrtezkU9cSpdPXBaTj2iVVM83ou7vJnYvbyAsHy8PiyTPCUPlLwvZh+8Hm3yOwNWST3bi7u85n4SuwxVWr3kRla9KyyiOtAAdzzsW+U769c8vC1mobqGyS69Xd+CPQPlyzz8MgY9s4WMOrye5TtHepW9JCmVuwQ7Ar3JDk68Pz/HvC5GiDxiRlG8hv+K
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":97,"e":156,"m":1777248223078.1016,"t":"mindmaps: (input.base.mindmapAssets ?? []).map((asset) => ({\n mindmap_id: asset.id,\n workspace_id: asset.workspace_id,\n document_id: asset.document_id,\n created_at: asset.created_at,\n updated_at: asset.updated_at,\n deleted_at: asset.deleted_at ?? null,\n deleted_by: asset.deleted_by ?? null,\n })),\n mediaAssets: input.base.mediaAssets as MediaAsset[] | null,\n trashedMediaAssets: input.base.trashedMediaAssets as MediaAsset[] | null,\n tables: (input.base.tableAssets ?? []).map((asset) => ({\n id: asset.id,\n workspace_id: asset.workspace_id,\n document_id: asset.document_id,\n title: asset.file_name ?? null,\n created_at: asset.created_at,\n updated_at: asset.updated_at,\n deleted_at: asset.deleted_at ?? null,\n deleted_by: asset.deleted_by ?? null,\n purged_at: asset.purged_at ?? null,\n is_archived: Boolean(asset.deleted_at),\n })),\n });\n\n if (\n (input.base.mediaAssets?.length ?? 0) > 0 ||\n (input.base.mindmapAssets?.length ?? 0) > 0 ||\n (input.base.tableAssets?.length ?? 0) > 0 ||\n Object.keys(input.base.mindmapAssetChildren ?? {}).length > 0\n ) {\n // 说明:stream delta 只替换 documents 时,仍要保留已有资源树语义;\n // 否则 mindmap 子附件会在 resync 前退化成普通 asset。\n const nextFileTreeProjection = buildKernelFileTreeProjection({\n documents: input.documents,\n mediaAssets: input.base.mediaAssets,\n mindmapAssets: input.base.mindmapAssets,\n tableAssets: input.base.tableAssets,\n mindmapAssetChildren: input.base.mindmapAssetChildren,\n });\n queryResult.kernel_file_tree_projection = nextFileTreeProjection;\n queryResult.kernelFileTreeProjection = nextFileTreeProjection;\n queryResult.mindmap_asset_children = { ...(input.base.mindmapAssetChildren ?? {}) };\n }\n\n return mapSidebarDatasetListQueryResultToInitialData(queryResult);\n}\n\nfunction normalizeUpsertDocument(event: TreeStreamDeltaEvent): TreeStreamDocumentPatch | null {\n const candidate = event.node ?? event.document ?? null;\n if (!candidate || typeof candidate !== \"object\") {\n return null;\n }\n return typeof candidate.id === \"string\" && candidate.id.trim()\n ? ({ ...candidate, id: candidate.id.trim() } as TreeStreamDocumentPatch)\n : null;\n}\n\nfunction normalizeDocumentId(event: TreeStreamDeltaEvent): string | null {\n const candidate = typeof event.documentId === \"string\" ? event.documentId.trim() : \"\";","v":"2q6EPeFHNDw2kwe+tEOYvSnamz39vQO9X+w4PX+mFTwtn7s8wQ/fvO9Yv7zHs6U8hcjXPWpBcj3EBnK8Oi9rvBriaL3hoDi9i9eAPO8rpTzbisU8P0kDvGZpnD1aAku9jXOsPN8fiz2Lrwo9575ePNhWO7w0i4493sWCPSqIEj3TQtm7wCJVum8Cqr1Ffiy9RaLIPWtfvDy8x049hOD0ubQ2TbyrBZO8iJorvaaLKr17Jxw9x5qhuwWLxT095Um9kHqEPb7j37z5i8s7SpqIvBMkqD2Ru628L92pPfEgEz35dUY87mGAvCT2TD042aW8X4+OPR+sjzyi1Ki8Zs2wPQMMQT0sRUu8KhtSvRrjxTzF66G8cXUhPJixszy0r5W7ts61vG/UxzzCnmu9jhc7PQ1ogLu2keu7PhavvNq38DxVt8u8ArJ0vHA11j0YTiI9TgV5PZwS37vHq6G83IJCva1rTr0WKpg9AEdTPRr2mjyAQt06SGyfvHzeAL04FNA7geAkvKwlhTyGxwy9z5O6PDkRsLzrAhu8hEKZvEpdy7yqU4o8fpvTO8xkP71Ihv68IAUGvVE8Ebq2rm68hxWmvBE2Or1Y5jS71Kr2vIr+jb0pKzg9FS37uzXca7tvERI9599kvD2ACb2vu7A8N3H9u2PwZz3woeo8DKsGvePrtrw4Wa48WTFcvAbmA72ZrkS7gy2lvJcCJT0ehzY936lxPU0kM73y8r68ujBkvJTyqDq5ui49nxs1vAKO5Lsyyx69IJ9HvCNNhL3mKWE9kWNivGY9kL2DeHA828SYvIBgwzsZ8w08jLyju5ILQD1KYci8Ag5APID3Ozrz+ok8KMFlvJfL4Dz14pA8paMjvFjnUDzKDUw8zZNavWaISj3hpeM7FXU5Pc1STTx1dIa9/hA8u9TceTwc1Qm7VCTVuz4UGLrFlBM9P5SSvG/q9DxRcfi8t6xsPZoKbb0Q1UI8H+SOu/s0wrtkPri8MxOyvKq4uTq6O+A7q2qWvcG8gzzcGR+97VZRvZW28zy/1cc7EWxevdKeCT24sQu9t0nDPBQzjbzWvoQ865H0vAbQxrysqE89wg6zvHxbsziF7SY8xx8IPc+nRL03jI48jPtOPQrQDT1GXoE8QGAvPLDZBb2AtRq8CBtcPJZII72XLDa97vpYvAU13bxxDeS8XkIVPS5mNboIMIo9LskCPaSw0Lz99du84vigu1RafLzLHoq9W69yvRQoCj3SGxg8IyrkvERh5bt3rmQ7XzqHPXJEwzumzcY8a8G4vNN71DzJbZA88lebPGat7LyFkQO7qBkgvEu4Nr2JeGo8iP4bPEZKPLtb2cs8/z6sOy0p0zxTq/88QjUMvcoJFr2f7I+8tr82u/5xXbw7G+M86wYMPTzArTzBz8U7TDLgvB7h7bwxkim9PhyKvGTPMTyj
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":145,"e":204,"m":1777248223078.1016,"t":"function normalizeUpsertDocument(event: TreeStreamDeltaEvent): TreeStreamDocumentPatch | null {\n const candidate = event.node ?? event.document ?? null;\n if (!candidate || typeof candidate !== \"object\") {\n return null;\n }\n return typeof candidate.id === \"string\" && candidate.id.trim()\n ? ({ ...candidate, id: candidate.id.trim() } as TreeStreamDocumentPatch)\n : null;\n}\n\nfunction normalizeDocumentId(event: TreeStreamDeltaEvent): string | null {\n const candidate = typeof event.documentId === \"string\" ? event.documentId.trim() : \"\";\n return candidate || null;\n}\n\nfunction isCompleteDocumentRecord(value: TreeStreamDocumentPatch): value is DocumentRecord {\n return (\n typeof value.workspace_id === \"string\" &&\n typeof value.access_scope === \"string\" &&\n typeof value.is_template === \"boolean\" &&\n typeof value.created_at === \"string\" &&\n \"parent_id\" in value &&\n \"sort_order\" in value &&\n \"is_starred\" in value &&\n \"updated_at\" in value\n );\n}\n\nfunction isCompleteMediaAsset(value: unknown): value is MediaAsset {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const asset = value as MediaAsset;\n return (\n typeof asset.id === \"string\" &&\n typeof asset.workspace_id === \"string\" &&\n typeof asset.document_id === \"string\" &&\n typeof asset.asset_type === \"string\" &&\n typeof asset.created_at === \"string\" &&\n typeof asset.updated_at === \"string\" &&\n \"file_name\" in value &&\n \"file_url\" in value &&\n \"thumbnail_url\" in value &&\n \"file_size\" in value &&\n \"mime_type\" in value\n );\n}\n\nfunction buildSidebarFromAssets(input: {\n base: SidebarInitialData;\n mediaAssets: MediaAsset[];\n}): SidebarInitialData {\n const next = cloneSidebarData(input.base);\n next.mediaAssets = [...input.mediaAssets];\n next.kernelFileTreeProjection = buildKernelFileTreeProjection({\n documents: next.documents,\n mediaAssets: next.mediaAssets,\n mindmapAssets: next.mindmapAssets,\n tableAssets: next.tableAssets,\n mindmapAssetChildren: next.mindmapAssetChildren,","v":"30mQPJNwIb0BPPO9qz7AvT5Vvj0KejS9J/gIvN8UEjx3AAM9v7nHvaUefL0RFzA9JPnoPaU55zvxvtA8aHY1vezHbbx5Tz29ZFu9vB1AYD1OBCs8BjlAPXXrBTz0nQm9PSWZPaOSej2cFLM8dG9VPaa1UL39pQc9xR+BugrANT3dsQ49I/aLPAY1i73eujI73Z1kuaMMcDzVSJM8cugTvbk3lbxcuK48yMC9O6iWL71ZSnA9MGocvSiq4j3EZqI80ehUPU9Bd71pjYS7sKuNPEZSFT07yja9/GnDPZpedT2/fwU8vbphPAeP+Tyk9AQ9Y9I5PaC0kj1GGLm8JoCPPYkAGD169Wy9nAZjvZBJmjwGEsQ6eX+UO6VyKTy07x48/C1avcA5Tzv/1t685Yc+PaUVw7zEKIS8tnY7vUeKBT2v0qu8R1IGvJ0arz0Pg1I9GAIfPQjKF72z4Im8N+6KvEP+6rxIBkk9eTmHPaylqDw8sSW8YQODvIHqmL2nMVw9vClwPISzpzwAb4U8bW+sPD8jgrwHaca8Ek5JPDyjVTxxDoE8igWQPC1lE72uxTU9AtYlvRdCNb21r1W9q/CEPZJ/8LzB48K8/x+hOysjj70A/9g8DF3dOwhIUr2ptV88B4A0vX79zbyJfts8fFSAPeDcEj0I1w48V5pPPGeHgTwcvLo69myzvbccZL2FJWO8NMmxOqNDODvUlVA9tyqWPHYZHr0arRS8akYJPFtF7ru/ugg8esEdvBBlM70A2RW98RMFvLJTBb0oKCs9Bo9VvHaXbL3UThA9uzDru6gMhbsVIz48mrAPPYxRizxA3C29rEmSPOP4grzQCkK8dIdhu1N8TT3gsZ88wdGDvCbU0jyoViO7CoKqu7JlyTuRDBI9dPmPu1axr7s15kO9HRijvVFjdbyybye97dIMvDgjvbyGwqI8ezOGPKRfVDyNbRS9GkYDPCGfhb0+YBQ9j48bPJNsML3+qgy9q+xhPCKFEDx8ZR892JUYvQCyJb0FPw29t6rlvAJpYDuCCgW90JhVvaYmfLtEzha7Q6/XPOEA/ryM4Ss8fDWFuyfsUjw7eko8IyREvX0IDD1srxK6ULq5PFtKP739MhA9tsikPRwBM7rxZLs84z7LvFeFLL1+uso7Ecc5u8/Ev7xu2jO9CIknupXcpTxU0Xy9ONa6PMbFLj2Hjjs9PzxYPRwssDs54Uo7JPPdvFRixbw5UEa90WtfvUaADLzh6BY97tw6Ow71JT1hng49KG6LPfmaQT2fEUA8emjmvMgtkDtwP6A8wlpsOgqGxbxsad28VjNQvQgZHzxi6bs7yHAfPNYYuLzaYw87YHdnPEVJUT29CJE8mzGIvaQcFL2f1NC71hgdvNKLqrwy/a08zNhWvHKTHT1xugG9yPlQvdoe5LwOoiy9bHLNPML/FTxCjqE88UNNvbQx6Dugdc2630TFPLU4/jx+nHk8WDG+OYuMRTt2wWC8xIQqPKLoTr1p2ug7/5sTvS1zgjyk9pK93EWxPJxPDT171pA6qyDrPBoZEb3q0A69WOaePHE1oLzsiqU9fdqouxtsmzxIJfc8zlP2vMHATruUqNC80wGyPFpbLzxCShI9JRW5PLmsTbw2Sem6ai7JPAgoJ73C63I7E3ahPN9egL061G05crifvOJPf7xWZUy9W8KuOuLtwjuX0zg6pEIEPE646Dz5ts+8qpM6vTJ+rzzazns64ZCZvMrvRj1ovks8EJaTPB0a+zzPB5+8IuYBPWX/Lz2kzj48pzOsvPIjFz1u7288jqS8O9nTirlH/py8fJ28PTPSvj3bWU4766NJPQJPH
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":193,"e":252,"m":1777248223078.1016,"t":"function buildSidebarFromAssets(input: {\n base: SidebarInitialData;\n mediaAssets: MediaAsset[];\n}): SidebarInitialData {\n const next = cloneSidebarData(input.base);\n next.mediaAssets = [...input.mediaAssets];\n next.kernelFileTreeProjection = buildKernelFileTreeProjection({\n documents: next.documents,\n mediaAssets: next.mediaAssets,\n mindmapAssets: next.mindmapAssets,\n tableAssets: next.tableAssets,\n mindmapAssetChildren: next.mindmapAssetChildren,\n });\n return next;\n}\n\nexport function deriveTreeRendererDeltaState(input: {\n projection: TreeRendererProjection;\n sidebar: SidebarInitialData;\n}): TreeRendererDeltaState {\n const sidebar = input.sidebar;\n const pageTreeSource =\n sidebar.kernelSidebarTree.length > 0\n ? sidebar.kernelSidebarTree\n : buildSidebarTreeFromKernelProjection({\n records: sidebar.documents,\n projection: sidebar.kernelSidebarProjection,\n });\n\n return {\n projection: input.projection,\n sidebar,\n documents: [...sidebar.documents],\n sidebarItems: [...sidebar.kernelSidebarProjection.items],\n pageTreeItems: buildPageTreeProjectionItems(pageTreeSource),\n fileTreeItems: [...sidebar.kernelFileTreeProjection.items],\n };\n}\n\nexport function applyTreeStreamDelta(\n base: SidebarInitialData,\n event: TreeStreamDeltaEvent,\n): SidebarInitialData {\n if (event.op === \"noop\") {\n return base;\n }\n\n if (event.op === \"resync_required\") {\n return base;\n }\n\n if (event.op === \"replace_sidebar\" && event.sidebar) {\n if (\"activeWorkspaceId\" in event.sidebar) {\n return cloneSidebarData(event.sidebar as SidebarInitialData);\n }\n return mapSidebarDatasetListQueryResultToInitialData(event.sidebar as SidebarDatasetListQueryResult);\n }\n\n if (event.op === \"replace_documents\" && Array.isArray(event.documents)) {\n return buildSidebarFromDocuments({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":241,"e":300,"m":1777248223078.1016,"t":"return base;\n }\n\n if (event.op === \"replace_sidebar\" && event.sidebar) {\n if (\"activeWorkspaceId\" in event.sidebar) {\n return cloneSidebarData(event.sidebar as SidebarInitialData);\n }\n return mapSidebarDatasetListQueryResultToInitialData(event.sidebar as SidebarDatasetListQueryResult);\n }\n\n if (event.op === \"replace_documents\" && Array.isArray(event.documents)) {\n return buildSidebarFromDocuments({\n base,\n documents: [...event.documents],\n });\n }\n\n if (event.op === \"upsert_document\") {\n const documentPatch = normalizeUpsertDocument(event);\n if (!documentPatch) {\n return base;\n }\n const nextDocuments = [...base.documents];\n const existingIndex = nextDocuments.findIndex((item) => item.id === documentPatch.id);\n if (existingIndex >= 0) {\n nextDocuments[existingIndex] = {\n ...nextDocuments[existingIndex],\n ...documentPatch,\n };\n } else {\n if (!isCompleteDocumentRecord(documentPatch)) {\n return base;\n }\n nextDocuments.push(documentPatch);\n }\n return buildSidebarFromDocuments({\n base,\n documents: nextDocuments,\n });\n }\n\n if (event.op === \"upsert_documents\") {\n const patches = Array.isArray(event.upsertDocuments) ? event.upsertDocuments : [];\n if (patches.length === 0) {\n return base;\n }\n let changed = false;\n const nextDocuments = [...base.documents];\n for (const rawPatch of patches) {\n if (!rawPatch || typeof rawPatch.id !== \"string\" || !rawPatch.id.trim()) {\n continue;\n }\n const documentPatch = {\n ...rawPatch,\n id: rawPatch.id.trim(),\n } as TreeStreamDocumentPatch;\n const existingIndex = nextDocuments.findIndex((item) => item.id === documentPatch.id);\n if (existingIndex >= 0) {\n nextDocuments[existingIndex] = {\n ...nextDocuments[existingIndex],","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":289,"e":348,"m":1777248223078.1016,"t":"for (const rawPatch of patches) {\n if (!rawPatch || typeof rawPatch.id !== \"string\" || !rawPatch.id.trim()) {\n continue;\n }\n const documentPatch = {\n ...rawPatch,\n id: rawPatch.id.trim(),\n } as TreeStreamDocumentPatch;\n const existingIndex = nextDocuments.findIndex((item) => item.id === documentPatch.id);\n if (existingIndex >= 0) {\n nextDocuments[existingIndex] = {\n ...nextDocuments[existingIndex],\n ...documentPatch,\n };\n changed = true;\n continue;\n }\n if (!isCompleteDocumentRecord(documentPatch)) {\n continue;\n }\n nextDocuments.push(documentPatch);\n changed = true;\n }\n if (!changed) {\n return base;\n }\n return buildSidebarFromDocuments({\n base,\n documents: nextDocuments,\n });\n }\n\n if (event.op === \"remove_document\") {\n const documentId = normalizeDocumentId(event);\n if (!documentId) {\n return base;\n }\n const removedIds = new Set<string>([documentId]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const document of base.documents) {\n if (document.parent_id && removedIds.has(document.parent_id) && !removedIds.has(document.id)) {\n removedIds.add(document.id);\n changed = true;\n }\n }\n }\n return buildSidebarFromDocuments({\n base,\n documents: base.documents.filter((item) => !removedIds.has(item.id)),\n });\n }\n\n if (event.op === \"move_document\") {\n const documentId = normalizeDocumentId(event);\n if (!documentId) {\n return base;\n }\n const existingIndex = base.documents.findIndex((item) => item.id === documentId);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":337,"e":396,"m":1777248223078.1016,"t":"return buildSidebarFromDocuments({\n base,\n documents: base.documents.filter((item) => !removedIds.has(item.id)),\n });\n }\n\n if (event.op === \"move_document\") {\n const documentId = normalizeDocumentId(event);\n if (!documentId) {\n return base;\n }\n const existingIndex = base.documents.findIndex((item) => item.id === documentId);\n if (existingIndex < 0) {\n return base;\n }\n const nextDocuments = [...base.documents];\n const existing = nextDocuments[existingIndex]!;\n nextDocuments[existingIndex] = {\n ...existing,\n parent_id: \"parentId\" in event ? (event.parentId ?? null) : existing.parent_id,\n sort_order:\n typeof event.sortOrder === \"number\" && Number.isFinite(event.sortOrder)\n ? event.sortOrder\n : existing.sort_order,\n updated_at:\n typeof event.updatedAt === \"string\" && event.updatedAt.trim()\n ? event.updatedAt.trim()\n : existing.updated_at,\n };\n return buildSidebarFromDocuments({\n base,\n documents: nextDocuments,\n });\n }\n\n if (event.op === \"upsert_assets\") {\n const assets = Array.isArray(event.upsertAssets) ? event.upsertAssets : [];\n if (assets.length === 0) {\n return base;\n }\n let changed = false;\n const nextAssets = [...(base.mediaAssets ?? [])];\n for (const asset of assets) {\n if (!isCompleteMediaAsset(asset)) {\n continue;\n }\n const existingIndex = nextAssets.findIndex((item) => item.id === asset.id);\n if (existingIndex >= 0) {\n nextAssets[existingIndex] = {\n ...nextAssets[existingIndex],\n ...asset,\n };\n } else {\n nextAssets.push(asset);\n }\n changed = true;\n }\n if (!changed) {\n return base;\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-delta.ts","s":385,"e":416,"m":1777248223078.1016,"t":"nextAssets[existingIndex] = {\n ...nextAssets[existingIndex],\n ...asset,\n };\n } else {\n nextAssets.push(asset);\n }\n changed = true;\n }\n if (!changed) {\n return base;\n }\n return buildSidebarFromAssets({\n base,\n mediaAssets: nextAssets,\n });\n }\n\n return base;\n}\n\nexport function applyTreeStreamDeltaToProjectionState(input: {\n projection: TreeRendererProjection;\n base: SidebarInitialData;\n event: TreeStreamDeltaEvent;\n}): TreeRendererDeltaState {\n return deriveTreeRendererDeltaState({\n projection: input.projection,\n sidebar: applyTreeStreamDelta(input.base, input.event),\n });\n}","v":"Y9wAPdOlIz3b6fe9WsF/vdceLD3lHQ69Fe6zO8TjubtLKTE7RUyqvFPHi7yoLCY9NBOiPa5xcDzBN2M9cmtDu6eF7jtHU7S983rDu1yM2T0wTb48H5m5vAvXDjv8wvG8+7FBPZV41zxEHKQ88YoAvIgT4LxF2ok9F5kTPM8NkbzJAkW7B5WCvNOKbb3y0co8jm23vMOMf7wRzNG82pTAvFXzu7z+hzA9X7LFuztxBz1I1449wHWJPCt2qz3B3Ys8UaMcPQwOUb2hFxI91DV+PKHKgrvHI1E7RW+fPVrkYT34Y2g7WWV7vFqtGD0svlO9nBbkO88IfD2EjmY8y0h+PXg5nj1PxGy8dpPwvKOXYz0f7+u8Y0qMu5zVxzzk7ho9G03UO0MiLjwRIhG9HZXtu+xMpTw2qCK9rzVRvfiiCD1Lufy7OoXovL/xlj089Us8l6cyPZGugLs7ebm7LPvXO+TIEr19LTY9EsJOPeKmAL2e6PE8KPtovHsohr0s3gg8JYZxvPFs5DwCPDY8qDOQvJQa3Typb9C8xk4cu41zAr0CJtu8C7+KOyW67zwUnig8OtGAvO3AcDxsSj+5jZ5FPPhrMb2a46S8JCMNPUe7k71X3hg90C6NvMGEr7wCrYs9ZttsvXSYTrxDrOU85TqWPD2UST0p17c7XNZ2vMa6UTyF9Y07szutvbiqPr2zEgu8G2eZuwKvEjzEnJI9UwBePZnVL70c87+8sg81Pe6mPTxcUtA7XY+fOwKvqrx/tnC8EQ5rvRzl9zsipIw94dkYvWYEaL1ZGOE8QGmTvPwm/DzhjfC7BohVPQApiz1Fc2G9nEVuPIfdiTsIwnS8SnkqvCAiXT1NrKW77ZcpvaJYdzuWpR68/cB5vfrID7zgjSs9WFKGuxsDFT1u04q99Q0pvOk4sTvDyQ+7GxgtvGiE87ylses7rKfBO3RwvDzYX1K9K5yYO0z7jr1Sg/A8xiuMPOiUyrzIAYe8eiutPErJBT1kao+8VbgVvWcx4TuvZoG6NzmZvdYvpTx6uby8oyY9vbxR1Dyslju9uplKPXroqbqvk0+7Tw0CPUgnCj0fs4U8sNxDvdkRGTv21HM8WveVPMSE1bxjYhy9ldmbPZdnJ71WaoI8dWC0O1QjELyzah090KOBvDoPmLygveu8divius4zhLzdb2+8lFSBO791oDwskL491Jw8PMuuwLtJ2UI8AT3mu5kTzjxLlQM6+r0ivUslyzzKxbE8RaQivSpCYDwOnnS8/CbYPaaDwrrxfaM8GVocPKxMhLu77V87oEBzvMRiCr0GDF286sQQPSkJ57zw2EU9u/8HPcHeHr0N7iI9k2HxPLkDnTzBYeA8qPj1vNSQ97ydyCY8hMD2Oe7wDL3IDMq7T6dRPPWm6zxKL+I7NzjHvIRM37yvlsC8wxU9Og2yILyL8DY7bagTvdxODj3i6rS8mzmmPSDOybs13LA8PCvuOyeAF717BBO95kAjvCjiNr3PFR+8vzkwvRrxgTuQnw29Fd03Pba1XbzxGTo8Ho1hvP3DCD0xW4683uhTPO4bzzuNQpk8XHZqvfG/HrxHaD09ONsgvYHTY7wk3Fa9Fa5BPYQTBD30jSY9M5ktPecD6DvXRiC8qhH8ujamLryTbGs63CAIPOSE97zWZE+8dJmmvNZtRT10QiG946nZO8rYTj0u9pq8JLgFPTIDE70xjPy7+W9FvRgEIz3sDLG8YCTMvKWFTD3KTsW8eM5ruw1tZTtXVE+9UYdgPVoeYT3BJfY8h0DjvPrdmb32pRc91bHvvMIc+jsc0ZI8Ib3aPAsuWD3RhKK7BgF7PdnDJbzr44a7GukHPNC03LwagKY6YG97PFao0rzupmG9o+SJvIuOEj1BqQu8JvPKPPVr3zwOAwM9MBVfPKM3iryaLMs7MUqyPJwN3bxRotU8a/hNPLHOqbvlSdk8gNxRPEZVKjsQAEw6DNPRvE6oCj0YNfi7sbqeOtbzxjx2rhK9esydvZxNib03AsM8v0ssvbvE8Dx6+4A99C6PPEmEkjxs1o28SYgfPeQf6ztAg/07+9I1vLnW1zwLXUI9uPBxvSaxh70zbsU8/ZdZPf0a2TzBARG9ktRUvLcg47pK+CY8a/15PDGewb3w8fq8Nabxu2M1Pb1AXNU8QAmDugb5njwaUri897nKPI9SmrwSLcw8jjcBPGGQOrsNOSa9q22rPD3xqTyal6U9E9UqPdS0CrzCnS29Q1ZWuzeb6jzYQlo8/XbyPCizqj0jXSY9vokqPS2uEb184848BvWWvRfzXTnWlUc99MqdPRKwOL2AXz69ghKPPCVhk7welw09BVYeuZWhCD0eM+Q9I9yDvTvgsjuGJUy96YMzPPfxXz15B5o8SbOMvWU6e70T1sa7KwNSvKatO7ySfYM8JTwkvAJPfD0t45a8u4eqOzUZSDyaAZa85JscPK5i2jx5qo68IsybvbMK8rtNEgs9kc7VvNHT/bzoXAq8SuKUPX77ZT20fUu9LFMcvJRotjyOSgy9d+DoO7bsAj26QAK9hYjtO8ow9jyRbR0974lWPI61FL3+fUq9g+6QvSUYBb2gRYk8Tv7buV5vdLzmItk84UocvXd2ybsFuwC9hCtAvUMcPr2lTFc8MWW6u1N7Dr3P5Cg91YJevFPm4zwLd3i8Xmx0PDNX2LysdqM9Jg7UPOfrerwk2oY9r65BveylJL1miYM8xSvrPKBGJDzSYvG8JfPPvKrW0jyqHgS9fdldvANHgTxGj8K9kCIWvWjSwTw3Phi9cY6fO6yIkbyMplm971N+OxgJnLzYS3+95B2tvD7tajrEsRu9XN1aPFoc97yzleK842waO+AnB7zlCw29mhn3PEscmzydDls8B8OPO5dpADqwlOG8P2/su0gbwrs0mAY9Di5avarorTzeR3S8NiSivHFwXD1x0ak72dXXPE4F/LwnfgY8LWP1vPJHjbsYtZe83teTPAzyBr2Gpdm8qfVXPa04gT0qnbk84C29OjAQA71kjTE9XJxXPf9uuLwZjzQ9gAOQvDPHlLy3GB+9r+mJu082J70xywE8PnKfO8UoULqemTO9BoKgPLF8mTobL429LrAcu+FbRT2nqEi9pd6TvGAsDb1sDMW9kgG1PKheab1mpEK9ieUvPJLoTD3Itr28MdsCPWLjK7zrf1m9Un3jvPSiADvjCTG96tDjPJUdND29E0Q9FW6/vbzprLzonTM9NUkIOkiezDozcPQ8qAwsvUPhPr11EQo91+x3vFI75LtjwFQ9dTytvLPfg
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts","s":1,"e":60,"m":1777368453917.2385,"t":"import { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n buildWorkspaceTreeStreamUrl,\n normalizeTreeStreamSnapshot,\n parseTreeStreamMessage,\n} from \"./protocol\";\n\ndescribe(\"tree-stream/protocol\", () => {\n afterEach(() => {\n vi.unstubAllGlobals();\n });\n\n it(\"构造 workspace sidebar stream url\", () => {\n vi.stubGlobal(\"window\", {\n ...window,\n location: {\n ...window.location,\n origin: \"http://127.0.0.1:3000\",\n },\n });\n expect(\n buildWorkspaceTreeStreamUrl(\" ws_1 \", \"evt_9\"),\n ).toBe(\n \"http://127.0.0.1:3000/api/tree/events?workspaceId=ws_1&cursor=evt_9\",\n );\n });\n\n it(\"固定走同源 stream route\", () => {\n vi.stubGlobal(\"window\", {\n ...window,\n location: {\n ...window.location,\n origin: \"http://127.0.0.1:3000\",\n },\n });\n expect(\n buildWorkspaceTreeStreamUrl(\"ws_1\", null),\n ).toBe(\"http://127.0.0.1:3000/api/tree/events?workspaceId=ws_1\");\n });\n\n it(\"解析 snapshot / delta / resync 协议消息\", () => {\n expect(\n parseTreeStreamMessage({\n eventType: \"snapshot\",\n rawData: JSON.stringify({\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n cursor: \"evt_1\",\n projection: \"sidebar_tree\",\n data: {\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [],\n kernel_file_tree_projection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts","s":49,"e":108,"m":1777368453917.2385,"t":"projection: \"sidebar_tree\",\n data: {\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [],\n kernel_file_tree_projection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernel_sidebar_projection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n trashed_documents: [],\n media_assets: [],\n trashed_media_assets: [],\n mindmap_assets: [],\n trashed_mindmap_assets: [],\n table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n },\n }),\n }),\n ).toMatchObject({\n kind: \"snapshot\",\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n cursor: \"evt_1\",\n projection: \"sidebar_tree\",\n });\n\n expect(\n parseTreeStreamMessage({\n eventType: \"heartbeat\",\n rawData: JSON.stringify({\n kind: \"heartbeat\",\n workspaceId: \"ws_1\",\n cursor: \"evt_3\",\n }),\n }),\n ).toMatchObject({\n kind: \"heartbeat\",\n workspaceId: \"ws_1\",\n cursor: \"evt_3\",\n });\n\n expect(\n parseTreeStreamMessage({\n eventType: \"delta\",\n rawData: JSON.stringify({\n kind: \"delta\",\n workspace_id: \"ws_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts","s":97,"e":156,"m":1777368453917.2385,"t":").toMatchObject({\n kind: \"heartbeat\",\n workspaceId: \"ws_1\",\n cursor: \"evt_3\",\n });\n\n expect(\n parseTreeStreamMessage({\n eventType: \"delta\",\n rawData: JSON.stringify({\n kind: \"delta\",\n workspace_id: \"ws_1\",\n cursor: \"evt_2\",\n payload: { op: \"remove_document\", documentId: \"doc_1\" },\n }),\n }),\n ).toMatchObject({\n kind: \"delta\",\n workspaceId: \"ws_1\",\n cursor: \"evt_2\",\n data: { op: \"remove_document\", documentId: \"doc_1\" },\n });\n });\n\n it(\"把 sidebar.dataset.list snapshot 归一化成 SidebarInitialData\", () => {\n const snapshot = normalizeTreeStreamSnapshot({\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [],\n kernel_file_tree_projection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernel_sidebar_projection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n trashed_documents: [],\n media_assets: [],\n trashed_media_assets: [],\n mindmap_assets: [],\n trashed_mindmap_assets: [],\n table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n });\n\n expect(snapshot).toMatchObject({\n activeWorkspaceId: \"ws_1\",\n kernelFileTreeProjection: {\n projection: \"file_tree\",\n },\n kernelSidebarProjection: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts","s":145,"e":162,"m":1777368453917.2385,"t":"table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n });\n\n expect(snapshot).toMatchObject({\n activeWorkspaceId: \"ws_1\",\n kernelFileTreeProjection: {\n projection: \"file_tree\",\n },\n kernelSidebarProjection: {\n projection: \"sidebar_tree\",\n },\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":1,"e":60,"m":1778818257423.53,"t":"import { act, useEffect } from \"react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { useSidebarTreeStream } from \"./use-sidebar-tree-stream\";\nimport type { SidebarInitialData } from \"@/components/sidebar/types\";\n\ntype MockEventListener = (event: MessageEvent<string>) => void;\n\nclass MockEventSource {\n static instances: MockEventSource[] = [];\n\n readonly url: string;\n readonly withCredentials: boolean;\n readonly listeners = new Map<string, Set<MockEventListener>>();\n onmessage: MockEventListener | null = null;\n onerror: (() => void) | null = null;\n closed = false;\n\n constructor(url: string, options?: EventSourceInit) {\n this.url = url;\n this.withCredentials = Boolean(options?.withCredentials);\n MockEventSource.instances.push(this);\n }\n\n addEventListener(type: string, listener: EventListener) {\n const typedListener = listener as unknown as MockEventListener;\n const next = this.listeners.get(type) ?? new Set<MockEventListener>();\n next.add(typedListener);\n this.listeners.set(type, next);\n }\n\n removeEventListener(type: string, listener: EventListener) {\n const typedListener = listener as unknown as MockEventListener;\n this.listeners.get(type)?.delete(typedListener);\n }\n\n close() {\n this.closed = true;\n }\n\n emit(type: string, payload: unknown) {\n const event = {\n type,\n data: JSON.stringify(payload),\n } as MessageEvent<string>;\n this.listeners.get(type)?.forEach((listener) => listener(event));\n if (type === \"message\" && this.onmessage) {\n this.onmessage(event);\n }\n }\n}\n\nfunction flush() {\n return new Promise((resolve) => {\n setTimeout(resolve, 0);\n });\n}\n\nfunction buildInitialData(): SidebarInitialData {\n return {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":49,"e":108,"m":1778818257423.53,"t":"}\n }\n}\n\nfunction flush() {\n return new Promise((resolve) => {\n setTimeout(resolve, 0);\n });\n}\n\nfunction buildInitialData(): SidebarInitialData {\n return {\n activeWorkspaceId: \"ws_1\",\n workspaces: [],\n documents: [],\n kernelSidebarProjection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernelSidebarTree: [],\n kernelFileTreeProjection: {\n projectionId: \"kernel_projection:file_tree:workspace_root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n trashedDocuments: [],\n trashedMediaAssets: [],\n trashedMindmapAssets: [],\n trashedTableAssets: [],\n tableAssets: [],\n mindmapDocs: [],\n mindmapAssets: [],\n mindmapAssetChildren: {},\n mediaAssets: [],\n };\n}\n\nfunction buildSnapshotEnvelope(title = \"工作区首页\") {\n return {\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n cursor: \"evt_2\",\n projection: \"sidebar_tree\",\n data: {\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [\n {\n id: \"page_root\",\n workspace_id: \"ws_1\",\n title,\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":97,"e":156,"m":1778818257423.53,"t":"data: {\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [\n {\n id: \"page_root\",\n workspace_id: \"ws_1\",\n title,\n parent_id: null,\n sort_order: 0,\n is_starred: false,\n access_scope: \"private\",\n is_template: false,\n created_at: \"2026-04-24T00:00:00Z\",\n updated_at: \"2026-04-24T00:00:00Z\",\n },\n ],\n kernel_file_tree_projection: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n kernel_sidebar_projection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n trashed_documents: [],\n media_assets: [],\n trashed_media_assets: [],\n mindmap_assets: [],\n trashed_mindmap_assets: [],\n table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n },\n };\n}\n\nfunction Harness({ onState }: { onState: (state: ReturnType<typeof useSidebarTreeStream>) => void }) {\n const state = useSidebarTreeStream(buildInitialData());\n\n useEffect(() => {\n onState(state);\n }, [onState, state]);\n\n return null;\n}\n\ndescribe(\"useSidebarTreeStream\", () => {\n let container: HTMLDivElement;\n let root: Root;\n const onState = vi.fn();\n\n beforeEach(() => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":145,"e":204,"m":1778818257423.53,"t":"onState(state);\n }, [onState, state]);\n\n return null;\n}\n\ndescribe(\"useSidebarTreeStream\", () => {\n let container: HTMLDivElement;\n let root: Root;\n const onState = vi.fn();\n\n beforeEach(() => {\n (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =\n true;\n vi.stubGlobal(\"window\", {\n ...window,\n location: {\n ...window.location,\n origin: \"http://127.0.0.1:3000\",\n },\n });\n MockEventSource.instances = [];\n vi.stubGlobal(\"EventSource\", MockEventSource as unknown as typeof EventSource);\n container = document.createElement(\"div\");\n document.body.appendChild(container);\n root = createRoot(container);\n onState.mockClear();\n });\n\n afterEach(() => {\n act(() => {\n root.unmount();\n });\n container.remove();\n });\n\n it(\"收到带 cursor 的 snapshot 后不应重建 EventSource\", async () => {\n await act(async () => {\n root.render(<Harness onState={onState} />);\n await flush();\n await flush();\n });\n\n expect(MockEventSource.instances).toHaveLength(1);\n\n await act(async () => {\n MockEventSource.instances[0]?.emit(\"snapshot\", {\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n cursor: \"evt_2\",\n projection: \"sidebar_tree\",\n data: {\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [],\n kernel_sidebar_projection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":193,"e":252,"m":1778818257423.53,"t":"workspaceId: \"ws_1\",\n cursor: \"evt_2\",\n projection: \"sidebar_tree\",\n data: {\n active_workspace_id: \"ws_1\",\n workspaces: [],\n documents: [],\n kernel_sidebar_projection: {\n projectionId: \"kernel_projection:sidebar_tree:workspace_root\",\n projection: \"sidebar_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n trashed_documents: [],\n media_assets: [],\n trashed_media_assets: [],\n mindmap_assets: [],\n trashed_mindmap_assets: [],\n table_assets: [],\n trashed_table_assets: [],\n mindmap_docs: [],\n mindmap_asset_children: {},\n },\n });\n await flush();\n await flush();\n });\n\n expect(MockEventSource.instances).toHaveLength(1);\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n cursor: \"evt_2\",\n status: \"live\",\n }),\n );\n });\n\n it(\"首帧前连接报错时应进入 fallback\", async () => {\n await act(async () => {\n root.render(<Harness onState={onState} />);\n await flush();\n await flush();\n });\n\n expect(MockEventSource.instances).toHaveLength(1);\n\n await act(async () => {\n MockEventSource.instances[0]?.onerror?.();\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n data: null,\n status: \"fallback\",\n cursor: null,\n error: expect.any(Error),\n }),","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":241,"e":300,"m":1778818257423.53,"t":"MockEventSource.instances[0]?.onerror?.();\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n data: null,\n status: \"fallback\",\n cursor: null,\n error: expect.any(Error),\n }),\n );\n expect(MockEventSource.instances[0]?.closed).toBe(true);\n });\n\n it(\"resync_required delta 只推进 cursor,后续 resync 才替换数据\", async () => {\n await act(async () => {\n root.render(<Harness onState={onState} />);\n await flush();\n await flush();\n });\n\n expect(MockEventSource.instances).toHaveLength(1);\n\n await act(async () => {\n MockEventSource.instances[0]?.emit(\"snapshot\", buildSnapshotEnvelope(\"旧标题\"));\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"live\",\n cursor: \"evt_2\",\n data: expect.objectContaining({\n documents: [expect.objectContaining({ title: \"旧标题\" })],\n }),\n }),\n );\n\n await act(async () => {\n MockEventSource.instances[0]?.emit(\"delta\", {\n stream: \"workspace\",\n workspaceId: \"ws_1\",\n cursor: \"evt_3\",\n projection: \"sidebar_tree\",\n data: {\n op: \"resync_required\",\n reason: \"documents_empty_trash\",\n },\n });\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"live\",\n cursor: \"evt_3\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":289,"e":348,"m":1778818257423.53,"t":"op: \"resync_required\",\n reason: \"documents_empty_trash\",\n },\n });\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"live\",\n cursor: \"evt_3\",\n data: expect.objectContaining({\n documents: [expect.objectContaining({ title: \"旧标题\" })],\n }),\n }),\n );\n\n await act(async () => {\n MockEventSource.instances[0]?.emit(\"resync\", buildSnapshotEnvelope(\"新标题\"));\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"live\",\n cursor: \"evt_2\",\n data: expect.objectContaining({\n documents: [expect.objectContaining({ title: \"新标题\" })],\n }),\n }),\n );\n });\n\n it(\"收到 snapshot 后连接中断也应切到 fallback,并保留最近一次 stream 数据\", async () => {\n await act(async () => {\n root.render(<Harness onState={onState} />);\n await flush();\n await flush();\n });\n\n expect(MockEventSource.instances).toHaveLength(1);\n\n await act(async () => {\n MockEventSource.instances[0]?.emit(\"snapshot\", buildSnapshotEnvelope(\"来自 stream 的标题\"));\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"live\",\n cursor: \"evt_2\",\n data: expect.objectContaining({\n documents: [expect.objectContaining({ title: \"来自 stream 的标题\" })],\n }),\n }),\n );","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx","s":337,"e":368,"m":1778818257423.53,"t":"});\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"live\",\n cursor: \"evt_2\",\n data: expect.objectContaining({\n documents: [expect.objectContaining({ title: \"来自 stream 的标题\" })],\n }),\n }),\n );\n\n await act(async () => {\n MockEventSource.instances[0]?.onerror?.();\n await flush();\n await flush();\n });\n\n expect(onState).toHaveBeenLastCalledWith(\n expect.objectContaining({\n status: \"fallback\",\n cursor: \"evt_2\",\n error: expect.any(Error),\n data: expect.objectContaining({\n documents: [expect.objectContaining({ title: \"来自 stream 的标题\" })],\n }),\n }),\n );\n expect(MockEventSource.instances[0]?.closed).toBe(true);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.ts","s":1,"e":60,"m":1777074446839.6677,"t":"\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport {\n buildWorkspaceTreeStreamUrl,\n normalizeTreeStreamSnapshot,\n parseTreeStreamMessage,\n} from \"@/lib/tree-stream/protocol\";\nimport { applyTreeStreamDelta, type TreeStreamDeltaEvent } from \"@/lib/tree-stream/tree-delta\";\n\nexport interface SidebarTreeStreamState {\n data: SidebarInitialData | null;\n status: \"idle\" | \"connecting\" | \"live\" | \"fallback\";\n cursor: string | null;\n error: Error | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction normalizeDeltaEvent(input: unknown): TreeStreamDeltaEvent | null {\n if (!isRecord(input) || typeof input.op !== \"string\") {\n return null;\n }\n return {\n op: input.op as TreeStreamDeltaEvent[\"op\"],\n node: isRecord(input.node) ? (input.node as TreeStreamDeltaEvent[\"node\"]) : null,\n document: isRecord(input.document) ? (input.document as TreeStreamDeltaEvent[\"document\"]) : null,\n documentId: typeof input.documentId === \"string\" ? input.documentId : null,\n documents: Array.isArray(input.documents) ? (input.documents as TreeStreamDeltaEvent[\"documents\"]) : null,\n sidebar: isRecord(input.sidebar) ? (input.sidebar as TreeStreamDeltaEvent[\"sidebar\"]) : null,\n };\n}\n\nexport function useSidebarTreeStream(initialData: SidebarInitialData): SidebarTreeStreamState {\n const workspaceId = initialData.activeWorkspaceId;\n const streamEnabled = Boolean(workspaceId);\n const cursorRef = useRef<string | null>(null);\n\n const [state, setState] = useState<SidebarTreeStreamState>({\n data: null,\n status: streamEnabled ? \"connecting\" : \"idle\",\n cursor: null,\n error: null,\n });\n const eventSourceRef = useRef<EventSource | null>(null);\n\n useEffect(() => {\n cursorRef.current = state.cursor;\n }, [state.cursor]);\n\n useEffect(() => {\n if (!streamEnabled) {\n cursorRef.current = null;\n setState({\n data: null,\n status: \"idle\",\n cursor: null,","v":"65r3PPe3kTsCQ+W9kprKvaValj3dSIS9wwmqO6sMp7uxMRI9y4WbvfryfL1m3C89w+KnPdr+dbzGzIE8x/xgvcy6QjzL6Dm9dIafO279lzx2ckq8X3VcvdZmTT3g55+84AQ/PVMcdD115Ho8KG86PZHVt72JTfI8qUfgPDKRgT30h8a4dZ/7PEmRbr2RxWo8b1BrO8g0m7ydfq07mcEGPaI1a72v2Y+8BKSJO2ndFr2qjRc9+QrsvJ2F7D2K3L08sh1HPZu2Nr2JegY9DRoRvVDvETnyrNS8wm7lPahgXD1jEoY6wX4sPUs1wDyco2q9xduLPE40jT16nsI8ywOzPWC4jD3ub9+8A1BhvUrKQD1gANo7Y2lDPbXXKT0tvZk6iv9yPb1DG70cDXW8JagzPQ9ulLwaroG9Hm/xvEPrjDzF93+8RCehPMFXq7pd0sI8Z4E1PR8oZbsN1iG9HwYuvcH2Tb1wvMk869JPPfpfQb3VPAU9SqqON3SlZL3uGBs8drojvVy4oLuCdwE9OsqevLDLE7xT+1k7o9aSvLGL0zvsRqo8/Rw1PWpGKrzce1c844iDvGzhcL2umWG8RTVCPRD7Nb31xTG9GkwCPSNCfL18mgs76aGoO4T0GrxI8ps8BQmLO2FxBL0uGdq794DrOlCZij32O4Y8J50HO7nwFjwD52I86i+Hva0Dmr3ofiC9PwrcvEERq7y8UIc9JFFxPbl35LxFxU69ee2xPKF7sbyCtL482QYqO62TdL0QHSw7SJemPI91ULwyoqA9sTrzOc0Zt7wDGHg8YGYRvUr2VT35i8q87KSRPWpgWjzXvm+9+TNhPcdwFrwNUoO8pE2cvILQlT2l6m27hPMXvWuL8TwCuw67Q6Q6vPVJ9TyQ0pk6oJhlPJ/IIj3UQnu9L5xLvZtsJL1+JCK8ibJwPKNGFDu5jpg6bTvPPH2tkDxHJlq9sCEnu5mFmb2p/Os6+lT4OLYGT71EhJO6bA60PPGgxrzO+9g8fRwivbggFrydvQ+9fpDivErIk7wBPCK9yBNWvfqn5DtIjDu9SwuJPMPUV73Hmwq8s/SkPGn7GTzXROY8GduivW8rx7xkJlS8MZFAPTVhD7t0BJw6km7HPVn/KbxsGiw9l3GYvNP9F735qqy7geOWvBXgCr0ZimC9qyIfPVKiJT2qaEm9VHJ6PZrhFz1C7BU96xM4PUoiVr2S4W08a3HoOjKtEL1HsQy9xTLZuwgVtDzcPlY9a7u6PIfWlzwmmiU9kcBVPZsGHDxjga68l4GMvKZpzbrERZs8qOKWvD8YvbyaBPE7eGxYvEaiHjnmbNc7AsaTPBzk4LtFoh09RU8TPUCNhj2l7K270U9fvZ6IMLzX2dK8Q0gEvRxvjb2KKsM8itD9Oyfll7z5b668OYkXvRlp2LyP6qy87qoFu6gCpTu0c5M7iBSBvelJxzuKZCa9fC57PPqoMT0t6Ls8Gjl0O4b8EDxT/ca84H6Zu3zHzbz9eOG8/o04vUyS5zw7Dj+8TXcGPXWiHTzogYk85kAIvR9AwLz1Fbu7+Xq0PDnFTr1eXU49UvKFvDoVL7oowfk7yrUeveRKwLyYeVC9nfTPPMU5Cz3g+1g9qFZAPbWJjbwPhjc80s7hvLCfILxPdiS7itukPMQIkL0NymO8+yqFvK+PAz2bx768ZUeePb3PJTzZOpW7BOKTPBe1ETwVh/W7oKhXvbjtAD36S6I6TeZ3vJo14Dzk7La7pmocPC
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.ts","s":49,"e":108,"m":1777074446839.6677,"t":"useEffect(() => {\n cursorRef.current = state.cursor;\n }, [state.cursor]);\n\n useEffect(() => {\n if (!streamEnabled) {\n cursorRef.current = null;\n setState({\n data: null,\n status: \"idle\",\n cursor: null,\n error: null,\n });\n return undefined;\n }\n\n let cancelled = false;\n let eventSource: EventSource | null = null;\n\n const handleMessage = (event: MessageEvent<string>) => {\n const envelope = parseTreeStreamMessage({\n rawData: event.data,\n eventType: event.type,\n });\n if (!envelope) {\n return;\n }\n\n setState((previous) => {\n const nextCursor = envelope.cursor ?? previous.cursor;\n\n if (envelope.kind === \"snapshot\" || envelope.kind === \"resync\") {\n const snapshot = normalizeTreeStreamSnapshot(envelope.data);\n if (!snapshot) {\n return {\n ...previous,\n cursor: nextCursor,\n };\n }\n return {\n data: snapshot,\n status: \"live\",\n cursor: nextCursor,\n error: null,\n };\n }\n\n if (envelope.kind === \"delta\" && previous.data) {\n const deltaEvent = normalizeDeltaEvent(envelope.data);\n if (!deltaEvent) {\n return {\n ...previous,\n cursor: nextCursor,\n };\n }\n return {\n data: applyTreeStreamDelta(previous.data, deltaEvent),\n status: \"live\",\n cursor: nextCursor,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.ts","s":97,"e":156,"m":1777074446839.6677,"t":"if (envelope.kind === \"delta\" && previous.data) {\n const deltaEvent = normalizeDeltaEvent(envelope.data);\n if (!deltaEvent) {\n return {\n ...previous,\n cursor: nextCursor,\n };\n }\n return {\n data: applyTreeStreamDelta(previous.data, deltaEvent),\n status: \"live\",\n cursor: nextCursor,\n error: null,\n };\n }\n\n return {\n ...previous,\n cursor: nextCursor,\n };\n });\n };\n\n const handleError = () => {\n setState((previous) => ({\n ...previous,\n status: \"fallback\",\n error: previous.error ?? new Error(\"tree stream 连接失败\"),\n }));\n eventSource?.close();\n if (eventSourceRef.current === eventSource) {\n eventSourceRef.current = null;\n }\n };\n\n if (cancelled) {\n return undefined;\n }\n\n const url = buildWorkspaceTreeStreamUrl(workspaceId, cursorRef.current);\n eventSource = new EventSource(url, { withCredentials: true });\n eventSourceRef.current = eventSource;\n eventSource.addEventListener(\"snapshot\", handleMessage as EventListener);\n eventSource.addEventListener(\"delta\", handleMessage as EventListener);\n eventSource.addEventListener(\"resync\", handleMessage as EventListener);\n eventSource.onmessage = handleMessage;\n eventSource.onerror = handleError;\n\n return () => {\n cancelled = true;\n eventSource?.removeEventListener(\"snapshot\", handleMessage as EventListener);\n eventSource?.removeEventListener(\"delta\", handleMessage as EventListener);\n eventSource?.removeEventListener(\"resync\", handleMessage as EventListener);\n eventSource?.close();\n if (eventSourceRef.current === eventSource) {\n eventSourceRef.current = null;\n }\n };\n }, [streamEnabled, workspaceId]);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.ts","s":145,"e":159,"m":1777074446839.6677,"t":"return () => {\n cancelled = true;\n eventSource?.removeEventListener(\"snapshot\", handleMessage as EventListener);\n eventSource?.removeEventListener(\"delta\", handleMessage as EventListener);\n eventSource?.removeEventListener(\"resync\", handleMessage as EventListener);\n eventSource?.close();\n if (eventSourceRef.current === eventSource) {\n eventSourceRef.current = null;\n }\n };\n }, [streamEnabled, workspaceId]);\n\n return state;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/document-ai-orchestrator.test.ts","s":1,"e":60,"m":1777693689004.9893,"t":"import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst { mockBuildForwardHeaders } = vi.hoisted(() => ({\n mockBuildForwardHeaders: vi.fn(async () => new Headers({ \"x-forwarded-for\": \"127.0.0.1\" })),\n}));\n\nvi.mock(\"@/lib/runtime-config\", () => ({\n getMnoteRuntimeConfig: () => ({ backendUrl: \"http://backend.test\" }),\n}));\n\nvi.mock(\"@/lib/server/forward-headers\", () => ({\n buildForwardHeaders: mockBuildForwardHeaders,\n}));\n\nimport { startDocumentAiOrchestratorRun } from \"./document-ai-orchestrator\";\n\ndescribe(\"startDocumentAiOrchestratorRun\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n mockBuildForwardHeaders.mockClear();\n delete process.env.BACKEND_URL;\n delete process.env.BACKEND_INTERNAL_URL;\n delete process.env.MNOTE_AI_ORCHESTRATOR_API_KEY;\n });\n\n it(\"应把 leptos-tiptap 的 block 级 AI 上下文透传给 sidecar\", async () => {\n const fetchMock = vi.fn(async () =>\n new Response('event: ready\\ndata: {\"ok\":true}\\n\\n', {\n headers: { \"Content-Type\": \"text/event-stream; charset=utf-8\" },\n }),\n );\n vi.stubGlobal(\"fetch\", fetchMock);\n\n await startDocumentAiOrchestratorRun({\n userId: \"user-1\",\n payload: {\n maxSteps: 8,\n messages: [{ role: \"user\", content: \"改写当前块\" }],\n context: {\n source: \"leptos-tiptap-island\",\n action: \"ask_ai\",\n documentId: \"doc-1\",\n workspaceId: \"ws-1\",\n selectedBlockId: \"block-1\",\n selectedUids: [\"block-1\"],\n selectedText: \"旧段落\",\n selection: { currentBlockId: \"block-1\", state: { from: 1, to: 4 } },\n tiptapDocument: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n documentBlocks: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n },\n options: {\n ai: {\n modelKey: \"gpt-5.3-codex\",\n profileId: \"page_writer_polish\",\n sessionId: \"doc_ai:doc-1:session-1\",\n },\n },\n },\n });","v":"NhX2ORrvDj0laf+9hmnMvcRxqz1ZTTe9A3CivLz70TxRcaK7yM8qvbYu9bywOBU9bRVBPTz6drsEujw8H9yWvaa2WTupD/W8WoJ8PYN1fLoPVdw8wOBYvbYPbTwFvou8pVl/PQPQ/TyPWf673XZQPZBzT70YBZ084fX/PBhgozwHJfg8RPy7PNf7F73lvCa9sxSqvF5hT7wOGJG9sn3GPCn3Kjzgoh68ZIYnPMJPzLzbEz09FjyoPBUATj2zkcQ7KUkBPWqgkb2lQx49pQHKuxVr47woisC7ipIEPhBQUj35pMO80m/LvGa14TzMdj6848izvO33GT3bcwW9gT+lPT+cWj0fiDO91yonvWw3mj2dGjy9vhFrPBtdMz0QNJY8X5csPLGO07weE4W9qSSJPMZtkbyiBeG8mumMPBRpjz0FrUe9tQSlvLxUED1ig+M7Rz4sPYNOgbzhZk68vlKzuZvMM72oh4g93vgFPQeuy7yqPVe8XeN5vAOs97xvmLC7H0FWvXH9lrx0ng27RgWQvMChtzy/TFE73IMSu0uDL71+xRq72CV8PbkYHLyuEwS8iBtaPDlzmLxRKYY8mWaIPba+q7zIQfq8Ifu3PDS7Qr0Sh8a7z3ESPQ/IXL16nxA9FO8fvd3Fvrxvywu9cKw7POF0XT0edgs8Gl4BvYupHrrRx0Q9SxGHvUmPHLwiVHe8kLTbvJEkMz2QwZo9LjuEPXtGprxe6UC9mFi2PJeG0DnbE048o+K9vAPz8LzCGUu8IXyePJTLN7xKc2U97XyCvCSPpLw76Y8890pRvdmwkD0CcyM8z4HKPMva8zzQQCK8NDpluz4ofDwoeEk7jsD2PCzobT28PSS8UwZzvX7mhz3A9VA8d/nzOpUE/bkkbGA9u4UtPQ5vhD1aZg69VBYSvRvmcrs68pU8p01LvRvcQbyX75w8gPEWvMLuAzxGiJS79xqGPIODxL1GZ9M7QSkvvHj2Yb3VMDO94knivNdcA700TLE8amwEPFJghLuL83S9MhpbvZtnx7weuIa8IfeovVcYrzw5DwG9j1OMPL82kbwdlSM8cT+VPJr4CTyXXI46dRiWvVQotzz9xkK9WhdXPEbxNL1aIHw8IQdXPYB2i7wEuIY8QuJOPUV2KLwGi+E8yufnPAKd87vkbwq9QcoavEkwID3fKrW8n9vlPHtqeTxeop88A4oIPR/A3TzkFpE8pvjZvI4hwrwoaE29tXGbvWZnyTyb1RU900LwO5ABczwUWf48LJ0+Pa+0A7w2PsE8iZnlvN20GrvHuUK64L2RvEqta70DHB29lSQlvGSUn7zt3bS7bEulPM7rFL3c/RO8NwpTPeJgED3e3P480N6AvQeO4zyk+Tm81DDEvIxh6zzlpaw8Eb0VvfS5AD3LBLY8obLDvI3Qs7wLscu69/esu9PLeLyHGZ48ZZLNvJ/l2jym4QC9MkEvPGSGND3DRRM8kzgvuo4as7sb3ma99QaPvAIIgL1Hy1m9u72TvBvMEjuFxz28bXWMPDGyJr0e7t48M7N+vBYokbylwLs7jcuvPA+kUb2O4qo8P1BYPBlUbDyJsuY7CKw6PG43fLyNVCe9q0TPu5+KNDw/VIo9RCGPPQ9LDr2EAC69vl2nPCfgfry1BSK8ToA8vYfeZL265gm98uz7u7CgCTy2eKa83Y7yO+1BDD0VnPU8CTMTvL5NVrylMpm8VWbivDtAEjyl2GA8JXgVvc+MWj2ytNk7h7QHPdwDtzwx4Ku8yzeKPbruNTsffho9CVdvvRFkw7zlQsc8A2ejOgd9rjwDTdU84yDAPKWCXj2rCOC8OcnjPKhJcz1x5Sm9oMeKvLKAm
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/document-ai-orchestrator.test.ts","s":49,"e":80,"m":1777693689004.9893,"t":"documentBlocks: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n },\n options: {\n ai: {\n modelKey: \"gpt-5.3-codex\",\n profileId: \"page_writer_polish\",\n sessionId: \"doc_ai:doc-1:session-1\",\n },\n },\n },\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n \"http://backend.test/api/v1/ai-agent/document/run\",\n expect.objectContaining({ method: \"POST\" }),\n );\n const body = JSON.parse(String(fetchMock.mock.calls[0]?.[1]?.body));\n expect(body.context).toMatchObject({\n source: \"leptos-tiptap-island\",\n action: \"ask_ai\",\n documentId: \"doc-1\",\n workspaceId: \"ws-1\",\n selectedBlockId: \"block-1\",\n selectedUids: [\"block-1\"],\n selectedText: \"旧段落\",\n selection: { currentBlockId: \"block-1\", state: { from: 1, to: 4 } },\n tiptapDocument: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n documentBlocks: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/document-ai-orchestrator.ts","s":1,"e":60,"m":1777693689004.8645,"t":"import { getMnoteRuntimeConfig } from \"@/lib/runtime-config\";\nimport { buildForwardHeaders } from \"@/lib/server/forward-headers\";\nimport { pickLeptosTiptapRuntimePageOptions } from \"@/lib/documents/page-option-semantics\";\nimport type { DocumentAiCapabilityConfig } from \"@/lib/ai-agent/document-config\";\nimport type { PageOptionsState } from \"@/types/page-options\";\n\ntype AgentMessage = { role: \"user\" | \"assistant\"; content: string };\n\ntype RequestPayload = {\n maxSteps?: number;\n messages: AgentMessage[];\n context?: {\n source?: string;\n action?: string;\n documentId?: string;\n workspaceId?: string;\n selectedBlockId?: string;\n selectedBlockIndex?: number;\n selectedUids?: string[];\n selectedText?: string;\n selection?: unknown;\n tiptapDocument?: unknown;\n documentBlocks?: unknown;\n pageOptions?: PageOptionsState;\n node?: unknown;\n subtree?: unknown;\n outline?: unknown;\n evidence?: unknown;\n };\n options?: {\n ai?: {\n model?: string;\n modelKey?: string;\n profileId?: string;\n sessionId?: string;\n };\n };\n};\n\nfunction resolveBackendUrl(): string | null {\n const cfg = getMnoteRuntimeConfig();\n const backendUrl =\n process.env.BACKEND_INTERNAL_URL || process.env.BACKEND_URL || cfg.backendUrl;\n return backendUrl?.trim().replace(/\\/+$/, \"\") || null;\n}\n\nfunction buildErrorMessage(payload: unknown, fallback: string): string {\n if (payload && typeof payload === \"object\" && \"detail\" in payload) {\n return String((payload as Record<string, unknown>).detail ?? fallback);\n }\n if (payload && typeof payload === \"object\" && \"message\" in payload) {\n return String((payload as Record<string, unknown>).message ?? fallback);\n }\n if (payload && typeof payload === \"object\" && \"error\" in payload) {\n return String((payload as Record<string, unknown>).error ?? fallback);\n }\n return fallback;\n}\n\nexport async function startDocumentAiOrchestratorRun(input: {","v":"6zm0POFiCz39zae9ZqPVvRdnnT3k9Ea9WvZZu6ukKr20EUI9yEYbvRq+67yoipu7mbyvPemAKT0CnGk92ttavdKE4Ljmgvq8Qp1+PGhQTrxQ1R490QrvvFnPIT3/WhS7x+OsPeGEQz0n5Ty7cEaOu0hnfL2XO3c7mAjbPF+lET2uNYI8vzyMPEYKPLw3Pro7QylAvBfMEr3REkG9E+9HPQt/3LwoUxW8FqlHPI3gLDtib948W4EhvdGTxj2SxnM8kqA5Paw1hr2znc48OItAuX3mfrwi2z07tfsNPpxoSDxto4C8R7+NuhnbAT3gMJq8SOyUPLI4vz3UyU68e3KFPWoHkDwxphe9cb5svUqRuT0W0SO9u84LPNeMCz3K5t08rUofPGwO7rqOMXK976TQPBdMi7vvxFu994iWPPQW9Dw/oHm9Qnw3vI4rRDwB2zw7EUFAPQUqGrxA4Ya93BQavZ7ITL1e5to8MV5LPUiKAb2i5si7j7U6vUiLCL1TCOM84QMtvEicZDzp6sy7On0AvcFvQ7x1p2a7Mmu0O4mIAzybyIG85FpAPfd+3jrLwce7VQCAOzrUt7zS7M+7dfCpPUT/fb1/4Ne6IlRSPI53U73aj5c81wlSPAHsYDxbiTI9gu0YvXt4Pb1wjN68KAWuPHVgoj2B+u88YPmGvPtbDD20p8Q8VZOZvZGbW70uiRG9lMk5PFnwBz1sb289m5Y+PQjhNL3nSBG9SYNBPVWowDyATto884PMvGlCSb19+vu8G1Kgu15hnjwXGX49MIJpPG7AJr07DMi7munevEQB/Tx3gRs89LIwPSGO5Dw4eBO9P/tHPPuyiLypwiW8W6VEvTzWtz0xC9I7P5Gkvb44HT2IR7y7bwANPFc98jxPKxs9hsV6PEEJAz048Ty9tugIvaobH7ygR8c46bMavcZZqrsHl2g8mPYfO2Y0sTwEobS7fETdOyNMnL1ovyI8QMchvBJyIb2JMAS9YnBJPO1/wrzIhbw7qToDvWFdJ7yeDGG991NcvIAW7LxRIEe9lA7Jvc4XrTyXxoq7RJowPcGH57s16488LMqZPNkmILyHm6m89qWAvcSt6Lt59AC9w49XPfbN57xM9mI8cgK6Pd4sGz0Wz5Y8x7+DvC6Woryl6B49EzK8vKVpqzpVZly9aXDdPO+ULT3ocTq9h6J8PX3KJj2wRH08zW8oPWZVWLuzzyA9+RXYvBffw7zYhEa9eHqIvQrn4jyhRTQ8dRiVPBELR7zL9AU9YalNPaw4oTzXQzq8HMW1vBjWgTpcmJq8v0SWvHYVpLs6oEq702wSvYmLXr3cF0W8SeFFPYGr17kqIwY9KetQPLw6Wj1N1MW8LpKTvSo2BzwiPF+8hi+bO/cCSLxkKzo8FHdYPDbasTxzqDm803wauwSWSrs5x1a8+VALvJTZADuhM2o8wRe7O8vpVDxbFjG9EJlKPXq0Pj0M87Y8yUujPPzW7zuqrsu8CHL6vNA4i72oCCq9I9ARvR+Z0DznsK68sYq7PC7cFL1Sw4o88mRCO7NeM73QCim7mSshPWnMAb1eenU9udqqPKWucjbZ9PE8RHgbvI9qG70GPpG9BXuYPGgLLj08sPU8khWWPfTWm7z0Q3U8hqZtvFAqGb20nlU8z3CrPNSxYb2u/wS8vgByvOWABT3yV7u53//XPP5CIjy60Bi89V+EPMHAG70QUiy9P90+vT5d0DyXD0o8CwTdvJecMz37zz+7ok6qOxO0Fby/vbC86HZaPeLx57so0Aw9f8M2vbLaEb0p8fS8u0FgvDoogj0RP4M7i4wsOyESRT3jNai84omDPYy6AT2hUsi8l38GPG/Cobxy3xe9x4gRPR5Oij1S2JG9Zmv2PJe6U71zPPK86rL7PBX8mrx2D6o7VZYJPastf7wyHMQ8GcoPu67tMb39KN08MLerOyA5
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/document-ai-orchestrator.ts","s":49,"e":108,"m":1777693689004.8645,"t":"return String((payload as Record<string, unknown>).detail ?? fallback);\n }\n if (payload && typeof payload === \"object\" && \"message\" in payload) {\n return String((payload as Record<string, unknown>).message ?? fallback);\n }\n if (payload && typeof payload === \"object\" && \"error\" in payload) {\n return String((payload as Record<string, unknown>).error ?? fallback);\n }\n return fallback;\n}\n\nexport async function startDocumentAiOrchestratorRun(input: {\n request?: Request;\n userId: string;\n payload: RequestPayload;\n}): Promise<Response> {\n const backendUrl = resolveBackendUrl();\n if (!backendUrl) {\n throw new Error(\"未配置 BACKEND_URL\");\n }\n\n const headers = await buildForwardHeaders(input.request);\n headers.set(\"Content-Type\", \"application/json\");\n const apiKey = (process.env.MNOTE_AI_ORCHESTRATOR_API_KEY || \"\").trim();\n if (apiKey) {\n headers.set(\"x-mnote-ai-key\", apiKey);\n }\n\n const response = await fetch(`${backendUrl}/api/v1/ai-agent/document/run`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n userId: input.userId,\n sessionId: String(input.payload.options?.ai?.sessionId ?? \"\").trim() || null,\n model: String(input.payload.options?.ai?.model ?? \"\").trim() || null,\n modelKey: String(input.payload.options?.ai?.modelKey ?? \"\").trim() || null,\n profileId: String(input.payload.options?.ai?.profileId ?? \"\").trim() || null,\n maxSteps: input.payload.maxSteps,\n messages: input.payload.messages,\n context: {\n source: input.payload.context?.source ?? null,\n action: input.payload.context?.action ?? null,\n documentId: input.payload.context?.documentId ?? null,\n workspaceId: input.payload.context?.workspaceId ?? null,\n selectedBlockId: input.payload.context?.selectedBlockId ?? null,\n selectedBlockIndex: input.payload.context?.selectedBlockIndex ?? null,\n selectedUids: input.payload.context?.selectedUids ?? null,\n selectedText: input.payload.context?.selectedText ?? null,\n selection: input.payload.context?.selection ?? null,\n tiptapDocument: input.payload.context?.tiptapDocument ?? null,\n documentBlocks: input.payload.context?.documentBlocks ?? null,\n node: input.payload.context?.node ?? null,\n subtree: input.payload.context?.subtree ?? null,\n outline: input.payload.context?.outline ?? null,\n evidence: input.payload.context?.evidence ?? null,\n pageOptions: input.payload.context?.pageOptions ?? null,\n editorRuntimePageOptions: input.payload.context?.pageOptions\n ? pickLeptosTiptapRuntimePageOptions(input.payload.context.pageOptions)\n : null,\n },","v":"xyHkPCXpVbyFdNe9K1e4vdKhsj3OXzG90OexvBDXAL1qZAQ9Md5DvU/AVb2bKnM8T+PKPYkEnjzJ2Rg9JtqBvcsvFj3kul29Y1WuPLu4PzvZOEc9buQzPC41dbvfCrW8V4iGPdPNODwnw4o8S6GUPPYjbL3ipBM9TmZqPPTOyDt5NQG8QR1GvNYLgL1rI4y85ocfulOgNbroFoO7MdzHvDx9cDz2qzK9TpdyuJVqxjwySCM9rLXEO8KT2D2Orko9PEg5PcSwr70sIdE8GYHIPHssEj3mu+u8xv3UPagJk7snI9O78vJdvPI7Sjy/sUK79ZyEPKbZ3j3Mt8s7MVaUPSuHHz3QRFi9GKCEvYY9hz0zN628AVoyvKgTQj3Iyps7CPSxvMMai7zTKF699sgVPWrePbxhoFe9qOeVvCXwOD3zfDq8lalTvHLtcT06tPg8+4EbPaAtCb1b9v68HjypvCpbh71rOV4989RNPSFc77xDqeS8aA9VvdrA7by0WH48GEIQvWx2uTomr6a8/GiOO2AUQTuG8IU8t2qEPDFHSrxMIX68NnyJPV6NLD0omSY8LBmAPJR2ULxdOp+8CtNoPb0YeL2dphy83No7PWRqVL0J1548VLOKuhErALw7Ewg911IDvXwFqLz/JHi8WvomPYo0Gz34bgQ9FcvCvM9vCD01/g09PDGBvczMFL17Ty+9hoJFPKRAGD0xYcA8VDQXPS3tab3aipW8aun6PBQ5UDzHaB48BR1JOyvIirw7BDu9kPUsvPOFMTyHW4M98rqOu6DOgr09McC8GuedvI8X/Dxto2883hZwPBM0+jy2+bq8MjXXPM1Ig7yBsc07STXEPIg0gT0i+iQ9bNUfvRT/PD2USwK9cTCpPB+lx7xYyhs9w+z9O1J5jzyE6Ue9XJFVvcl9Jz1V/RO8aSTQu5f7UTxPVTQ8CFsOvTMIBD2fRsK8jl7RPMEOhb3PEhA9VTMIPREdlb2UuOK8xJwkPIzO17zO2JA8lM8ovGKl5brLEkm8e8chvYPvi7wtbSC8WJOIvWsL5TwKJWK8qWyCPRjfhrxdZGG8Kkg+PK7BUT34wQ68OiyXvUf3oDum+O28/W0+PVTqE71NJac5F1qqPcn8Irx2N7A8lji3uyMYRrzrAUE8HUiGO82+njoXv5e9+BlhO8T4yTsEvSS9Fc64PO/RVj
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/document-ai-orchestrator.ts","s":97,"e":152,"m":1777693689004.8645,"t":"selection: input.payload.context?.selection ?? null,\n tiptapDocument: input.payload.context?.tiptapDocument ?? null,\n documentBlocks: input.payload.context?.documentBlocks ?? null,\n node: input.payload.context?.node ?? null,\n subtree: input.payload.context?.subtree ?? null,\n outline: input.payload.context?.outline ?? null,\n evidence: input.payload.context?.evidence ?? null,\n pageOptions: input.payload.context?.pageOptions ?? null,\n editorRuntimePageOptions: input.payload.context?.pageOptions\n ? pickLeptosTiptapRuntimePageOptions(input.payload.context.pageOptions)\n : null,\n },\n }),\n cache: \"no-store\",\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => null);\n throw new Error(buildErrorMessage(payload, `AI orchestrator 请求失败:HTTP ${response.status}`));\n }\n\n if (!response.body) {\n throw new Error(\"AI orchestrator 未返回事件流\");\n }\n\n return response;\n}\n\nexport async function fetchDocumentAiOrchestratorConfig(input?: {\n request?: Request;\n}): Promise<DocumentAiCapabilityConfig> {\n const backendUrl = resolveBackendUrl();\n if (!backendUrl) {\n throw new Error(\"未配置 BACKEND_URL\");\n }\n\n const headers = await buildForwardHeaders(input?.request);\n const apiKey = (process.env.MNOTE_AI_ORCHESTRATOR_API_KEY || \"\").trim();\n if (apiKey) {\n headers.set(\"x-mnote-ai-key\", apiKey);\n }\n\n const response = await fetch(`${backendUrl}/api/v1/ai-agent/document/config`, {\n method: \"GET\",\n headers,\n cache: \"no-store\",\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => null);\n throw new Error(buildErrorMessage(payload, `AI orchestrator config 请求失败:HTTP ${response.status}`));\n }\n\n return (await response.json()) as DocumentAiCapabilityConfig;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/forward-headers.ts","s":1,"e":56,"m":1776880970589.118,"t":"import { headers } from \"next/headers\";\nimport { convexAuthNextjsToken } from \"@convex-dev/auth/nextjs/server\";\nimport { isDevAuthEnabled } from \"@/lib/auth/devUser\";\nimport { getAuthContext } from \"@/lib/auth/authContext\";\n\nfunction copyHeaderIfPresent(target: Headers, source: Headers, name: string) {\n const value = source.get(name);\n if (value) {\n target.set(name, value);\n }\n}\n\nexport async function buildForwardHeaders(request?: Request): Promise<Headers> {\n const source = request?.headers ?? new Headers(await headers());\n const forwarded = new Headers();\n\n copyHeaderIfPresent(forwarded, source, \"cookie\");\n copyHeaderIfPresent(forwarded, source, \"authorization\");\n copyHeaderIfPresent(forwarded, source, \"x-request-id\");\n copyHeaderIfPresent(forwarded, source, \"x-trace-id\");\n copyHeaderIfPresent(forwarded, source, \"x-session-id\");\n copyHeaderIfPresent(forwarded, source, \"x-mnote-workspace-id\");\n copyHeaderIfPresent(forwarded, source, \"x-mnote-source-channel\");\n copyHeaderIfPresent(forwarded, source, \"x-mnote-source-client\");\n copyHeaderIfPresent(forwarded, source, \"x-mnote-actor-id\");\n copyHeaderIfPresent(forwarded, source, \"x-mnote-actor-type\");\n copyHeaderIfPresent(forwarded, source, \"user-agent\");\n\n if (!forwarded.has(\"authorization\") && !isDevAuthEnabled()) {\n const token = await convexAuthNextjsToken();\n if (token?.trim()) {\n forwarded.set(\"authorization\", `Bearer ${token.trim()}`);\n }\n }\n\n if (!forwarded.has(\"x-mnote-source-channel\")) {\n forwarded.set(\"x-mnote-source-channel\", request ? \"next_route\" : \"next_server_component\");\n }\n if (!forwarded.has(\"x-mnote-source-client\")) {\n forwarded.set(\"x-mnote-source-client\", \"wolai-frontend\");\n }\n if (!forwarded.has(\"x-mnote-actor-id\")) {\n try {\n const auth = await getAuthContext();\n if (auth.userId?.trim()) {\n forwarded.set(\"x-mnote-actor-id\", auth.userId.trim());\n forwarded.set(\"x-mnote-actor-type\", \"user\");\n }\n } catch {\n // 说明:未登录或当前上下文无法解析用户时,继续走已有 header / admin fallback。\n }\n }\n\n return forwarded;\n}","v":"/kYXvOE30zwxXtO9kaakvbr2Mz0/eoi9c285vBHbDr3028Y80iBXvV5fY73wk5c9kg4KPhjPE7xTGE89q9bPvMzej7uXmxa9sq7ZO6UDgju0Vyc8QEMfvSkEcj3vNRK9RLyGPc5e2jwWcIQ8NxcMPWbfjL1yTIq6VganPMM8PT1/vB+8c4sxvTPCKb3RQ6A8zo/TvPieIb0/aLS6MIn6uxVonTqUz8q8eoSrvG7uqry5/gQ9E0ZxvW7Qmz1EPmk93FStPdQDkr2I8I483AMnvTiTyLx+QES8s9rsPYQEYTxKxS88EV2KPFGaSj1EhCO9KVg4Pc5ztj0psho8YgErPf64dT3KOY69KwZWvTFqyD2zRUO9LSuTPe6GET0JngE9rVnQPDtN9rwYHCC9Y6KlPIsLhDwAmpa9nHKJu+PJDz1b4Ru9eT3yO9yHRTtfTeK8FyeYPQWVzrybm+G8z+YHPSW2Tb3dzkQ9XaInPYowR70Xv3M7gYPmOsAlLr3T3rO8RALfvGNukTubvIC777CjvKS1Pzzcvle85Ed1OmpfjbtDV1e7lnFSPYDhLzyV1IM805EHPZT6Or0au9+8lDJzPPHiQr1/wuC8ZgyPOTQR/ryW5WI84LYEvCpFJzzEkno9IY/UvLyOS73xxQi8Se7PPF8StD3yKFI96vOYvLqZtjxOMwY9SFukvS0TAL2TgVq9OV92uwqP3zx6AAM9y6eGPOJ5Dr2yDMy8wG07PQW80zs9dGk9nKSDPDmEvbxgBwe9aQq1POhrcbwDnow9rON/vHIJELtHptc65jtwvIjh3zwDJFI8Q3hNPfJHFz0k8ii9c26mPJs9Q71DT6I8Svs4vbXpij1X1ks8Qhzlu1uBQD2h+LU803sRvdaeCLyD9RM8GA7zOw0xWT3hjAu9zd4RvYAED7yLza28pPtFu4azTT1b0sU5o2EYvfqcJDwLfQe9BCyGPHNXsr1k4Ec9S1h2Pcv2Eb2jL7m7QGKLvZxHuLzs2dM7/hMOvSDlsDzxdJe8mgYMvV3nmDx6Fiu9owa4vdUm5jxidCi9UbnVPCPFUrzImPQ8ITVEPc535jxECBw9Ybh9vRH+NT0u95C8LV35PAoPg7zEC4I7tuKOPROKbDtRwjK8FPukvNvJ0bwZfzs985EfuZYPHrwXSEi92k4mPQicGT2JZRm9BeHSPKCmJry2ulw9NwuLvEgB47wZFQK8f2erukcXELxb9Bu9XwhVvQfjOLuY65K8WrTjOyirBDsT8IM9HhUyPVSRr7uLZDs8RMNzvJgfgDxRw/m8d9eFvKHuJ73itZa8WQxmPBxeNr2mZiK5uG0pPez2YbuxnAE904tRPF6teD2g8z28tNa6vb/MZDw4OAO8b1GJvEzEf72PrRe8SnkOu8SGqbvGZbu92bTxO6px3ruUHpe85ghLvLrWJTwDjL67RPdUvT5ACD10Wxi7zgJdPcom1zvAuwM9BebPuzQFyTySCXe8opSsO0Hwqr2nBMO8PLH6vDjbBr1dgIY7W6cpPIrQULyVvvk8EOnSPHUcNL0hvQg93xnyPPFMHbwaz9k8096wuZwCuDxYVac9dLrKOZ8QX7yaPgi9IEnWPFsACD0SbYo9IRWvPKzj/bqGRCu8aCRgPH3ZLr3yRC87ySLEPD15Yjs/bxm9ZbPtPFLnBj1fWH6781yOPELUCjwZgsI8tgPkPFrq5rsAmDq9LMZdvP8qkzv4Lyy7HttFPODpRD3+ojW9gNbFPK/gJ
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/kernel-file-tree.test.ts","s":1,"e":60,"m":1777161381402.8752,"t":"import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { ConvexHttpClient } from \"convex/browser\";\nimport { resolveKernelFileTreeProjection } from \"./kernel-file-tree\";\n\nconst mockBuildDocumentBridgeContextWithActor = vi.fn();\nconst mockBuildDocumentQueryEnvelope = vi.fn();\nconst mockExecuteRustBridgeQuery = vi.fn();\n\nvi.mock(\"@/lib/documents/bridge\", () => ({\n buildDocumentBridgeContextWithActor: (...args: unknown[]) =>\n mockBuildDocumentBridgeContextWithActor(...args),\n buildDocumentQueryEnvelope: (...args: unknown[]) => mockBuildDocumentQueryEnvelope(...args),\n}));\n\nvi.mock(\"@/lib/documents/rust-runtime\", () => ({\n executeRustBridgeQuery: (...args: unknown[]) => mockExecuteRustBridgeQuery(...args),\n}));\n\ndescribe(\"resolveKernelFileTreeProjection\", () => {\n beforeEach(() => {\n mockBuildDocumentBridgeContextWithActor.mockReset().mockReturnValue({\n requestId: \"req_1\",\n traceId: \"trace_1\",\n });\n mockBuildDocumentQueryEnvelope.mockReset().mockImplementation((input) => input);\n mockExecuteRustBridgeQuery.mockReset().mockResolvedValue({\n projectionId: \"kernel_projection:file_tree:page_root\",\n projection: \"file_tree\",\n rootNodeId: \"page_root\",\n items: [],\n edges: [],\n });\n });\n\n it(\"把搜索词传入 Rust kernel.project_view,而不是交给宿主裁剪\", async () => {\n await resolveKernelFileTreeProjection({\n client: { query: vi.fn() } as unknown as ConvexHttpClient,\n request: new Request(\"http://127.0.0.1:3000/api/tree/projections/file\"),\n workspaceId: \"ws_1\",\n actor: {\n actorType: \"user\",\n actorId: \"user_1\",\n sessionId: null,\n },\n dataset: {\n active_workspace_id: \"ws_1\",\n documents: [],\n },\n rootNodeId: \"page_root\",\n depth: 2,\n query: \" 预算 \",\n maxResults: 12,\n });\n\n expect(mockBuildDocumentQueryEnvelope).toHaveBeenCalledWith({\n name: \"kernel.project_view\",\n payload: expect.objectContaining({\n projection: \"file_tree\",\n workspaceId: \"ws_1\",\n rootNodeId: \"page_root\",","v":"rkUAPdKngTxsEQm+7nyXvTSZXj2fWGC9R+Vyva0ICz2e3nC8IUfyO1C7dLyJD9Y8i4wzPV1pD7ylI+q8TO1gvfudhDza2Q+93745Paid1buGKgO9D/vavFDwzLsOZNq7UNaPPdsrVz00JKy8vbj9PDeDpbw/XUs9eZiLPVYMejy7g5K8imyevEj/Ub1lJha9+7n+u5RUKDzkHmG8f5JgPJJiNr1yZ3i8LiOLvJrBL7xaxv089R9/PL8/Vj0Rsa+7f9yMPS/MIb2E/oM8nbTUvEElczzxQxS8kVn2Pazf0Tw5SKG8IQEHvEGN2TxJ/BS9G8QVvXrlGj3IMOa8rGa6Pa0WCD2k1Ds8qm8kvQ9AfT3tTH29AviDu1Q5Rz18sW88NWvLO0+4e72SL4S9h2J/PDu9nbxQYCe9s4J5PGl+Wj0lntG7RNx0PJfLqTz7l9s8gggaPQfRCbzGjHG8S6VPPN+SiLyKEzo9etA2PdNLfrwooWe8jWMDPVayWb3Nq8i8VfNUvVAm/DzMUxS9lQ/mO0znGD0MN208M3jmO1ajC71xvA88OTV3PfhS5byt0OC523Feu+HJcb2uTK+8JzovPfKpH71CNKG93++sPNF8Qb3xlnE6qCeivKoVm7umEQ09auAFvKT847wVnKq72880PU1BgT3A6Y87vaA/vcRBY7wF1Io9yAA9vS0FTTxumRu8Ix6zvLwttTzdozg95DhQPSxTgrwQ+oy8w8kfPTXWmDw+vAo80/o5vOxxMb0Fywa72F09PFAbq7z4BzE9JbylvCFHi7xljoC81XRFvRSseD315N+8AIQBPcoX+zzmFF693aS8PMFp2Tze/Ao8j1dCPWcMFz3E9NG7K3jAvH+LjT2lQha8irpOvQF+BrxoRKc8C8o4PaB0Yz2pk9M7T306vRJTrbxamay8mDVjvfSpc7wwlpk8ORjDvBBOfDxc4oa76Q6WPDCG7Lz88Rc9eIIJO7rokr0aTrm8iIalPCdfoLypLUM891eovGu6T7yXwUG9UYQ6vWl1vrzBnb28pVJPvRfQBj0hci293mmQPMC4Ir3Jcli7BRCpPBYGqrxSJd08LSOkvdD1Fj3tEFq9py1PPedDHr14okU9M2ByPXeALb2xHro8KiFRPQSkbLyD6Tw9BoqAu/41Ebt8Bki9j0y0uzbr5jxe8Ii9gPe1PEhxgD28v/I87XsePOl0JDxTtKi7T9lAO2PRvrsYXWq9R3S5vVfP3TwBw0U9WzSGPANxpTtkhHg8Nug6PYpK4Tv/XYs80ns/u1cJlTs/++y7yw4YvL34Wb3OwyK6nc8vPMultrzsBUY9SZt9PBxID73iLcS7QmeGPUFvij0EPCU4SRo+vUW0kDrKOT+9aCfXvGJibb2cFgY9LDwbvcsQJjxkofa7MVswvZmGorwJ6gW8lwE6vAPTDzygjOw8pqS6vD1FYTw7KfC8CklsPAruUj1mDP+8F+8JvF1kBT3bOCC9VVXNu++m3b0Yvo29AP7EvJidFj1mZDK94pvQPJ4QFby7cSE90CSpvFvfV7x5l4S8q0xEPISZSL2lRoc9sS2TPA2Zezyxw5M8KX1SPNM2wTx3Uv287LyTvHhaSzwIN4Y9qQP/PE9aIr3GM6e96QwmPct0gLwmn9G8Sww8vcLjR72qBJK9UDUuvW4WmTzWqPS8+OGxu27mMTx5iTM9a784Oxw/o7wOjp28/iqqvLKhSrz4a2w8q0OtvN4lXz3yybc5JGYWPbDv9jwCHqm80q5UPTVcW
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/kernel-file-tree.test.ts","s":49,"e":69,"m":1777161381402.8752,"t":"rootNodeId: \"page_root\",\n depth: 2,\n query: \" 预算 \",\n maxResults: 12,\n });\n\n expect(mockBuildDocumentQueryEnvelope).toHaveBeenCalledWith({\n name: \"kernel.project_view\",\n payload: expect.objectContaining({\n projection: \"file_tree\",\n workspaceId: \"ws_1\",\n rootNodeId: \"page_root\",\n depth: 2,\n query: \"预算\",\n maxResults: 12,\n }),\n });\n expect(mockExecuteRustBridgeQuery).toHaveBeenCalledTimes(1);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/kernel-file-tree.ts","s":1,"e":60,"m":1777161587442.5288,"t":"import type { ConvexHttpClient } from \"convex/browser\";\nimport type { SidebarDatasetListQueryResult } from \"@/lib/sidebar-data\";\nimport type { KernelFileTreeProjection } from \"@/lib/kernel-file-tree\";\nimport {\n buildDocumentBridgeContextWithActor,\n buildDocumentQueryEnvelope,\n type BridgeActor,\n} from \"@/lib/documents/bridge\";\nimport { executeRustBridgeQuery } from \"@/lib/documents/rust-runtime\";\n\nexport async function resolveKernelFileTreeProjection(input: {\n client: ConvexHttpClient;\n request: Request;\n workspaceId: string;\n actor: BridgeActor;\n dataset: SidebarDatasetListQueryResult;\n rootNodeId?: string | null;\n depth?: number | null;\n query?: string | null;\n maxResults?: number | null;\n}): Promise<KernelFileTreeProjection> {\n const context = buildDocumentBridgeContextWithActor({\n request: input.request,\n actor: input.actor,\n workspaceId: input.workspaceId,\n });\n const query = input.query?.trim() || null;\n const maxResults =\n typeof input.maxResults === \"number\" && Number.isFinite(input.maxResults)\n ? Math.max(1, Math.floor(input.maxResults))\n : null;\n\n return executeRustBridgeQuery<KernelFileTreeProjection>({\n context,\n envelope: buildDocumentQueryEnvelope({\n name: \"kernel.project_view\",\n payload: {\n projection: \"file_tree\",\n workspaceId: input.workspaceId,\n rootNodeId: input.rootNodeId ?? null,\n depth: input.depth ?? null,\n query,\n maxResults,\n includeEdges: true,\n includeContent: false,\n nodeTypes: [\"page\"],\n },\n }),\n data: input.dataset as unknown as Record<string, unknown>,\n });\n}\n\nexport function attachKernelFileTreeProjection<T extends SidebarDatasetListQueryResult>(input: {\n dataset: T;\n projection: KernelFileTreeProjection;\n}): T {\n return {\n ...input.dataset,\n kernel_file_tree_projection: input.projection,\n };","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/kernel-file-tree.ts","s":49,"e":62,"m":1777161587442.5288,"t":"data: input.dataset as unknown as Record<string, unknown>,\n });\n}\n\nexport function attachKernelFileTreeProjection<T extends SidebarDatasetListQueryResult>(input: {\n dataset: T;\n projection: KernelFileTreeProjection;\n}): T {\n return {\n ...input.dataset,\n kernel_file_tree_projection: input.projection,\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/local-paths.ts","s":1,"e":32,"m":1773495901192.8645,"t":"import \"server-only\";\n\nimport path from \"path\";\n\n/**\n * 本地文件路径策略(服务端专用)\n *\n * 目标:\n * - 开发/传统模式:继续使用 `process.cwd()/public/*`(便于本地调试与静态访问)。\n * - 桌面端(Electron):通过注入 `MNOTE_DATA_DIR=<安装目录>\\\\data`,把可变数据\n * 放到安装目录下(而不是 resources/app.asar),避免权限与覆盖问题。\n */\n\nfunction cleanEnvValue(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const v = value.trim();\n return v.length > 0 ? v : null;\n}\n\nexport function getDocumentsBaseDir(): string {\n const dataDir = cleanEnvValue(process.env.MNOTE_DATA_DIR);\n if (dataDir) return path.join(dataDir, \"documents\");\n return path.join(process.cwd(), \"public\", \"documents\");\n}\n\nexport function getLegacyMindmapsBaseDir(): string {\n const dataDir = cleanEnvValue(process.env.MNOTE_DATA_DIR);\n if (dataDir) return path.join(dataDir, \"mindmaps\");\n return path.join(process.cwd(), \"public\", \"mindmaps\");\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mindmap-files.ts","s":1,"e":60,"m":1773495901206.186,"t":"import \"server-only\";\n\nimport path from \"path\";\nimport { promises as fs } from \"fs\";\nimport type { MediaAsset } from \"@/types/media\";\nimport { getDocumentsBaseDir, getLegacyMindmapsBaseDir } from \"@/lib/server/local-paths\";\n\nconst tryAccess = async (file: string) => {\n try {\n await fs.access(file);\n return true;\n } catch {\n return false;\n }\n};\n\nexport async function detectLocalMindmapDocs(docIds: string[]): Promise<string[]> {\n const results: string[] = [];\n const preferredBaseDir = getDocumentsBaseDir();\n const legacyBaseDir = getLegacyMindmapsBaseDir();\n for (const id of docIds) {\n const folder = path.join(preferredBaseDir, id);\n const preferredLegacy = path.join(folder, \"mindmap.json\");\n const legacy = path.join(legacyBaseDir, id, \"mindmap.json\");\n let has = false;\n if ((await tryAccess(preferredLegacy)) || (await tryAccess(legacy))) {\n has = true;\n } else {\n try {\n const entries = await fs.readdir(folder);\n has = entries.some((name) => /^mindmap-.+\\.json$/i.test(name));\n } catch {\n has = false;\n }\n }\n if (has) {\n results.push(id);\n }\n }\n return results;\n}\n\nexport type LocalMindmapFile = {\n documentId: string;\n mindmapId: string;\n fileName: string;\n source: \"preferred\" | \"legacy\";\n};\n\nexport async function detectLocalMindmapFiles(docIds: string[]): Promise<LocalMindmapFile[]> {\n const results: LocalMindmapFile[] = [];\n const preferredBaseDir = getDocumentsBaseDir();\n const legacyBaseDir = getLegacyMindmapsBaseDir();\n for (const id of docIds) {\n const folder = path.join(preferredBaseDir, id);\n try {\n const entries = await fs.readdir(folder);\n for (const name of entries) {\n if (name === \"mindmap.json\") {\n // mindmap.json 属于旧版单文件导图:mindmapId 必须包含 docId,避免不同页面间 ID 冲突","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mindmap-files.ts","s":49,"e":108,"m":1773495901206.186,"t":"export async function detectLocalMindmapFiles(docIds: string[]): Promise<LocalMindmapFile[]> {\n const results: LocalMindmapFile[] = [];\n const preferredBaseDir = getDocumentsBaseDir();\n const legacyBaseDir = getLegacyMindmapsBaseDir();\n for (const id of docIds) {\n const folder = path.join(preferredBaseDir, id);\n try {\n const entries = await fs.readdir(folder);\n for (const name of entries) {\n if (name === \"mindmap.json\") {\n // mindmap.json 属于旧版单文件导图:mindmapId 必须包含 docId,避免不同页面间 ID 冲突\n results.push({\n documentId: id,\n mindmapId: `legacy-${id}`,\n fileName: name,\n source: \"preferred\",\n });\n continue;\n }\n const m = /^mindmap-(.+)\\.json$/i.exec(name);\n if (m && m[1]) {\n results.push({ documentId: id, mindmapId: m[1], fileName: name, source: \"preferred\" });\n }\n }\n } catch {\n // ignore\n }\n\n // 旧目录(仅支持 mindmap.json)\n const legacy = path.join(legacyBaseDir, id, \"mindmap.json\");\n if (await tryAccess(legacy)) {\n results.push({\n documentId: id,\n mindmapId: `legacy-${id}`,\n fileName: \"mindmap.json\",\n source: \"legacy\",\n });\n }\n }\n return results;\n}\n\nfunction extractMindmapImageAssetIdsFromData(input: unknown): string[] {\n const root = (() => {\n if (!input || typeof input !== \"object\") return input;\n const record = input;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (record && typeof record === \"object\" && \"root\" in (record as any)) ? (record as any).root : input;\n })();\n\n const ids: string[] = [];\n const seen = new Set<string>();\n\n const push = (value: unknown) => {\n if (typeof value !== \"string\") return;\n if (!value.startsWith(\"asset:\")) return;\n const id = value.slice(\"asset:\".length).trim();\n if (!id) return;\n if (seen.has(id)) return;","v":"Vz9UPTzACzwDIdS93rS1vQ1+Tz3Vh5698R+NvKuMhTwR4Z48bhsNvQK0v7ypezg99XT8PbAh7DxO1g89zFL9vOmb9roi2ky9SED6O/AsxTyXkqs8nhTTOvxCzjwf5TM8V/LKPSRHUz0LlDk9FVCPOksdiL1sQow9VEQJu4bkWT3VpLW6/ChKuxyjsL1OmB+8LNE7u03f8LybU188KxMUPISDdLwjfpY8iOPJumZ4A7xjaIg9IroxveBNej0JTao7lfN9PRtduL3vXq+8iIdSPHo1ozyPAAY7bnbBPbxbRz3genO641DlOu90tDwLvqA8i4L1PDK6lT3boFy8uV5bPWFBdj0m14u9pPrauv/ZyD1PLEQ6HbEFux3rhj0mEY682imoPM8HvrztoN28V5wUPfudHzzDejS96ygAvXzPuD2ZElS9nlgovQ/w0zsWv608haw3PQaPdL1EZUg81eaovKwO8bwmu4s9tfFqPGZPUr13MUo8vEUJvYZfgr2UleC7yNeHu5H6zzyIOK+8ikPgvOrZ4DyByZG82ix7PEyeiLxbNhE8WqDdPPxGLj3fkH68orqBvGosh7zevrm63wZePX6bdL0ffgc7HUPEOi1FsrwD23Y6qxMOvUCTo7pEhKo8A9MRvArZBL1dL5u8HhexPEGBuzwymR89yc00PBcDNjy+Kfo89T01vaYber3JUIy8Qz8dO43h6Tz7caM9knWxPAPTZr3Wre28ga3yPGUWj7qDACk9EhKTu4M8Tr0zdgM7LedVvRBF67sVFEc9z2Iyvbvbbr1NxNM6yE56vI+IJ7xupQ08ArgOPQcu1Txs0Dy9LXo9PGsMuzk+VoG8FYHdu9KJsjxtmks9GHKPvdrK5zwNbfm8IuBXvZ3w+TsABiI9VbZoPGjckTwncJu9w560vHupLDt1QgY54KWyPHXW7rsduPI7F6y7vIxH3jwqvxK9R0nJPD8ykb1MV4E9n104PONUOr3C3WK8Te2VvJNdLTuYBga8MoQLvWB0Bj1DFLC89ygmvfCvNT3uAYO8rk2KvTQhUDzVwPy8yv4YPTP2Hr2DrfO7wht/O0ZpmLumJ7q8JmiGvcgZYTwtzfq81iEmPUgwRL1rW2q8Xki+Pd5kx7vUUQQ6/IdzPM2vprzX8nM8oVvdu3HPxrx/KJe8zhrSPIdQnTtd4xW90TX1PL4K7zwnHVE9rTP4O2hmqryvHWa8PkATvHAc5Lw8cQa9vVq1vQO0ED0WoWy8NF4yvYm/Z7zQOIA7vrDKPTScfTx4KJo8dsmFvDor0rz4dYO8o6/Supgqu7uG9qw7vIKEvHnfrrxCnYY7a5EYPCZ3hzxR44Q9BChiO+0Tiz2oAiU91gyFvTfhLzttCfM8n5PlPJK2P72IB4Q7HrkuPJFp5zzpgT69yAfVOgWBzbyjv8e8ahagPMblmzq3zvQ6ZXrwvGMbsjy8o/68c/lPPYf1prpHSvw8EbJMPD/XhTw22128PnUXvcMSqrwB/Ui87S7LvFb1jzw1Saq8DJdFPcRPhjuAnLw7fgzaPLKJVbx4Gb28kY3uPM2HWLxvLYY81t4Pva5GFj2u/Ks8IanZu4QCGr3YQmW9fBZoPXtTaT1uXIA9e4sHPWATNryx3Ii84HKWvOO+EL3WAYM8R8OeO8SuVTz6mxC9PQIOvSpF7Dyh/xS9T6TPPIn0OD3wXwI7L4I+PbFz5ruTDBW9f3Y2vaCbSD1YgV27YuoKvZFqJz1pVmy8338ku5GQHb3/BPi8e67VO2hHBzxOj5M9afUxvSb4D71XWTA8DhHDvLC2rjsmp0i8irWHPY4xAT0XqlG9E07aPD81aLxulzW8+VSaPISyq7yStvG8mht9PWyryzxNaSS9AukCPCMUYL2YPP+8T/9RO7E20TzZJZm7LHt+PA4niTwBm468YBr
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mindmap-files.ts","s":97,"e":156,"m":1773495901206.186,"t":"return (record && typeof record === \"object\" && \"root\" in (record as any)) ? (record as any).root : input;\n })();\n\n const ids: string[] = [];\n const seen = new Set<string>();\n\n const push = (value: unknown) => {\n if (typeof value !== \"string\") return;\n if (!value.startsWith(\"asset:\")) return;\n const id = value.slice(\"asset:\".length).trim();\n if (!id) return;\n if (seen.has(id)) return;\n seen.add(id);\n ids.push(id);\n };\n\n const get = (obj: unknown, key: string): unknown => {\n if (!obj || typeof obj !== \"object\") return undefined;\n return (obj as Record<string, unknown>)[key];\n };\n\n const walk = (node: unknown) => {\n if (!node || typeof node !== \"object\") return;\n\n const data = get(node, \"data\");\n const image = get(node, \"image\");\n\n // 常见:node.data.image = \"asset:xxx\"\n push(get(data, \"image\"));\n\n // 兼容:node.image = \"asset:xxx\"\n push(image);\n\n // 兼容:node.image.url = \"asset:xxx\"\n push(get(image, \"url\"));\n\n // 兼容:node.data.image.url = \"asset:xxx\"\n push(get(get(data, \"image\"), \"url\"));\n\n const children = get(node, \"children\");\n if (Array.isArray(children)) {\n children.forEach(walk);\n }\n };\n\n walk(root);\n return ids;\n}\n\ntype TrashedMindmapMeta = {\n docId: string;\n mindmapId: string;\n originalFileName: string;\n originalPath: string;\n trashedFileName: string;\n deleted_at: string;\n};\n\nasync function tryReadJsonFile<T>(file: string): Promise<T | null> {\n try {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mindmap-files.ts","s":145,"e":204,"m":1773495901206.186,"t":"type TrashedMindmapMeta = {\n docId: string;\n mindmapId: string;\n originalFileName: string;\n originalPath: string;\n trashedFileName: string;\n deleted_at: string;\n};\n\nasync function tryReadJsonFile<T>(file: string): Promise<T | null> {\n try {\n const content = await fs.readFile(file, \"utf8\");\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport async function detectLocalMindmapImageAssetIdsByMindmapId(\n files: LocalMindmapFile[],\n): Promise<Record<string, string[]>> {\n const mapping: Record<string, string[]> = {};\n const preferredBaseDir = getDocumentsBaseDir();\n const legacyBaseDir = getLegacyMindmapsBaseDir();\n\n for (const item of files) {\n const baseDir = item.source === \"legacy\" ? legacyBaseDir : preferredBaseDir;\n const filePath = path.join(baseDir, item.documentId, item.fileName);\n const data = await tryReadJsonFile<unknown>(filePath);\n if (!data) continue;\n const ids = extractMindmapImageAssetIdsFromData(data);\n if (ids.length > 0) {\n mapping[item.mindmapId] = ids;\n }\n }\n\n return mapping;\n}\n\nasync function listTrashMetasForFolder(folder: string): Promise<TrashedMindmapMeta[]> {\n const trashDir = path.join(folder, \".trash\");\n try {\n const entries = await fs.readdir(trashDir);\n const metas: TrashedMindmapMeta[] = [];\n for (const name of entries) {\n if (!name.endsWith(\".deleted.json\")) continue;\n const metaPath = path.join(trashDir, name);\n const meta = await tryReadJsonFile<TrashedMindmapMeta>(metaPath);\n if (meta?.docId && meta?.mindmapId && meta?.trashedFileName && meta?.deleted_at) {\n // 若原路径已存在(用户撤销/恢复),则不再展示为垃圾桶记录,避免堆积。\n try {\n await fs.access(meta.originalPath);\n await fs.rm(path.join(trashDir, meta.trashedFileName), { force: true });\n await fs.rm(metaPath, { force: true });\n continue;\n } catch {\n // ignore\n }\n metas.push(meta);","v":"SwB1PVlPE7w0lNC9TrmxvSZ4ij3tbIu9C4UPvCAyjrutIxc8GrmEvQSwHb3JtBe7Nb3KPY+/Jz0SyCk8bRhevaPUqby6SgO9GlTdO2P8uzrZD4w81C06PLPxUz2Hj/W8rkSwPZI1PD2ljhc9/KnkPFmrib3zdvE8xPDOPC+KLT2QLbE8j4a0u354nr1Oeze8c2VYPJLulTsgynC7GhchO9x8Dr30f0w71NmLOwceubw24Yk9Q0k0vd38gD3JAqE8u7u+PVryk71cQFU8anIyPEndOzyYc3S8foe2PQFHEz10o9O7wWqevGbQIjzF1ui8PTTluxIznD05WDa89lKVPYSbJT1ozTu9hDgbvetbXD27Ok+8xcQGvQ9rcz36F1c7I0sFPT7N0bw8tgu9hxtvPYoe47yql3i9s4YevSnzhj0PFnW98gyqvAIUmTzyJXg9p/KtPJ6vN71+MBS7K9JUvH1ZMLyDTHE9y2IvPQA3trysr4Q8pXXwvBCZEr0IFyk9RK+FvDgICz02uY28IaXuvCQt0Tx+LHK8gVisPHs/vTxbAIi6/6NTPJ+pYT2kLSm7TuUpvdHijrzwol88m7Z1PbxKzb1Vbvy8NdEgPbYOOr1cxzs83Uw2vNHqzbseN+Q8DFxCvQXyj7wq8Li89sozPaxN1Tzkwwa76GoZPDfq/jzB6xU9gPCTvWsoV72NGKK8zccYvKWZ5TzhQlo9KiPqO+uuBL0Tmd68RvLSO4eECr3LyRc95xZJvXWdxLw5QZ68acGxu3Q3sLyFLTk9hM/qvJ9HPb0qsIS74LfLu+nBvDu8FWE8m+X1PIaj0DxgQki9KxHhPK38Przw4/G8RdQ/vNO8R7sA4Fw9VWwyvUBf4zwTNwy9xSQAvENQDTzdmAs9H2bRPMbHBjx/7Je9LG08vQUQrDy7jXe7HRgeuW4Q7bzAzrc8amklvX7H57uxya+8zIcmPIg5kr261jk9BCzvPGQpHb12e9e7QyADO2Xlyjsz+8q8g+cfvJv4lbxND/28jqSkvOn7yTzNuqG8L0aevaxSMLw1h7u8Ea4wPe05XL0pYPs6bm+bu8D4jjuCvPC8TvpVveHrDL0N5ji9XhWCPPGUN71Dfhe8X7eTPcv3B71/RrI7sSgDvEmpxLwQSA47JjQ5vddFmzy7ZS69mKMpPa7GrDwWHQi9a/PHPJjFBz3lY+c8USCsPGc4mbwUi1+8YwizOhMYSL0tWa28xHjMvbAY2zxSDNM7tj4zvbLvxDyFZRY9jVHYPXv3TzwFzgQ9/IgNvSGl4zwm1iS87qM/vdRP3jtkUs871JJAvRoV8rz4CAe8ByJ2PEkLuztKPB89ez8RPHlGjj3HBjQ9te0XvdNiyTzLjke6odfPOfGaDL36YpU8FnyyPEW9OzwYZU29BmAvvEayh7wn0IW9EoMIPTSeUrsEI5M8D+ntvCeC2ruejJq61OtCPfjm1zwZKU08qekEPBV79TxAV5288lKfO3JvprxvQJM70o+LvDNJmzuJJ9G8btZJPQGxkzwAKVy7VoVyPNopujtXTf+8UzrSPMTHnbxdIVs9f/gWvCSPcD1ssaQ8xVs8vVZEYb2FSaK9CT99PYNA3jy/Z6k95awmPTx1xTrbC6q8g+2UPEXEJb1yCOI8xYnOPIS1t7zCv5m7MmruO4jy4jyUNJw7/WQ6PVdrUj0MCby7FKWtPJF+rjwpCwm91gzpvFRUJT1L/SC8xYsDvW7Apj0IMyI7J1ftOz4f0LzLksa8EGPIPM/YqjxMTng9s/ECvdjyPr3ahp480lajvJQyFzyvzYo7gjNkPW81Cj03xxi8bweqPehrgLzPoX28kaZrPdhu67wLD5S8UPhUPf3JET3d5BS9yt8OPMM8D71ZnIC9jeR4vAY6RD1VYaQ7EOKRPCuL
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mindmap-files.ts","s":193,"e":252,"m":1773495901206.186,"t":"const meta = await tryReadJsonFile<TrashedMindmapMeta>(metaPath);\n if (meta?.docId && meta?.mindmapId && meta?.trashedFileName && meta?.deleted_at) {\n // 若原路径已存在(用户撤销/恢复),则不再展示为垃圾桶记录,避免堆积。\n try {\n await fs.access(meta.originalPath);\n await fs.rm(path.join(trashDir, meta.trashedFileName), { force: true });\n await fs.rm(metaPath, { force: true });\n continue;\n } catch {\n // ignore\n }\n metas.push(meta);\n }\n }\n return metas;\n } catch {\n return [];\n }\n}\n\nexport async function detectLocalTrashedMindmapAssets(\n workspaceId: string,\n docIds: string[],\n): Promise<MediaAsset[]> {\n const results: MediaAsset[] = [];\n const preferredBaseDir = getDocumentsBaseDir();\n const legacyBaseDir = getLegacyMindmapsBaseDir();\n\n for (const docId of docIds) {\n const preferredFolder = path.join(preferredBaseDir, docId);\n const legacyFolder = path.join(legacyBaseDir, docId);\n const metas = [\n ...(await listTrashMetasForFolder(preferredFolder)),\n ...(await listTrashMetasForFolder(legacyFolder)),\n ];\n\n metas.forEach((meta) => {\n results.push({\n id: meta.mindmapId,\n workspace_id: workspaceId,\n document_id: docId,\n asset_type: \"mindmap\",\n file_url: null,\n thumbnail_url: null,\n bucket: null,\n storage_path: null,\n file_name: meta.originalFileName,\n file_size: null,\n mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n deleted_at: meta.deleted_at,\n deleted_by: null,\n purged_at: null,\n signed_url: null,\n created_at: \"\",\n updated_at: \"\",\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mindmap-files.ts","s":241,"e":260,"m":1773495901206.186,"t":"mime_type: \"application/json\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n deleted_at: meta.deleted_at,\n deleted_by: null,\n purged_at: null,\n signed_url: null,\n created_at: \"\",\n updated_at: \"\",\n });\n });\n }\n\n results.sort((a, b) => (b.deleted_at ?? \"\").localeCompare(a.deleted_at ?? \"\"));\n return results;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.test.ts","s":1,"e":60,"m":1778355539132.2737,"t":"import { EventEmitter } from \"node:events\";\nimport { PassThrough } from \"node:stream\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { PageOptionsState } from \"@/types/page-options\";\n\nconst {\n mockSpawn,\n mockBuildDocumentBridgeContext,\n mockBuildDocumentCommandEnvelope,\n mockExecutePageWriteBridgeCommand,\n} = vi.hoisted(() => ({\n mockSpawn: vi.fn(),\n mockBuildDocumentBridgeContext: vi.fn(),\n mockBuildDocumentCommandEnvelope: vi.fn(),\n mockExecutePageWriteBridgeCommand: vi.fn(),\n}));\n\nvi.mock(\"node:child_process\", () => ({\n default: {\n spawn: mockSpawn,\n },\n spawn: mockSpawn,\n}));\n\nvi.mock(\"next/server\", () => ({\n NextResponse: class NextResponse extends Response {\n static json(body: unknown, init?: ResponseInit) {\n return new Response(JSON.stringify(body), {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(init?.headers ?? {}),\n },\n });\n }\n },\n}));\n\nvi.mock(\"@/lib/documents/bridge\", () => ({\n buildDocumentBridgeContext: mockBuildDocumentBridgeContext,\n buildDocumentCommandEnvelope: mockBuildDocumentCommandEnvelope,\n}));\n\nvi.mock(\"@/lib/documents/page-write-command-adapter\", () => ({\n executePageWriteBridgeCommand: mockExecutePageWriteBridgeCommand,\n}));\n\nimport {\n extractPageOptionsPatchFromAiMessage,\n startMnoteCliAgentHostRun,\n} from \"./mnote-cli-agent-host\";\n\nfunction buildPageOptions(overrides: Partial<PageOptionsState> = {}): PageOptionsState {\n return {\n wideLayout: false,\n smallText: false,\n showHeadingNumbers: false,\n showToc: false,\n showStructure: false,\n protectEditing: false,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.test.ts","s":49,"e":108,"m":1778355539132.2737,"t":"extractPageOptionsPatchFromAiMessage,\n startMnoteCliAgentHostRun,\n} from \"./mnote-cli-agent-host\";\n\nfunction buildPageOptions(overrides: Partial<PageOptionsState> = {}): PageOptionsState {\n return {\n wideLayout: false,\n smallText: false,\n showHeadingNumbers: false,\n showToc: false,\n showStructure: false,\n protectEditing: false,\n showWordCount: true,\n collapseBacklinks: false,\n pageFont: \"default\",\n layoutDensity: \"normal\",\n hideChildPages: false,\n showBlockRefCount: false,\n embedDefaultBlockId: null,\n ...overrides,\n };\n}\n\nfunction createMockChild(stdoutText: string) {\n const child = new EventEmitter() as EventEmitter & {\n stdout: PassThrough;\n stderr: PassThrough;\n kill: ReturnType<typeof vi.fn>;\n };\n child.stdout = new PassThrough();\n child.stderr = new PassThrough();\n child.kill = vi.fn();\n setTimeout(() => {\n child.stdout.end(stdoutText);\n child.stderr.end(\"\");\n child.emit(\"close\", 0);\n }, 0);\n return child;\n}\n\ndescribe(\"startMnoteCliAgentHostRun\", () => {\n beforeEach(() => {\n mockSpawn.mockReset();\n mockBuildDocumentBridgeContext.mockReset();\n mockBuildDocumentCommandEnvelope.mockReset();\n mockExecutePageWriteBridgeCommand.mockReset();\n delete process.env.DEV_USER_ID;\n delete process.env.DEV_USER_EMAIL;\n delete process.env.DEV_USER_NAME;\n });\n\n it(\"启动 mnote-cli 时应把当前 Web 用户作为默认 CLI 写入身份下发\", async () => {\n mockSpawn.mockImplementation(() => createMockChild('{\"ok\":true}\\n'));\n\n const response = await startMnoteCliAgentHostRun({\n request: new Request(\"http://127.0.0.1:3000/api/ai-agent/run\"),\n userId: \"a4b72c17-49e3-46d3-8456-24a0a7044d64\",\n userEmail: \"dev@mnote.local\",\n userName: \"开发用户\",\n payload: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.test.ts","s":97,"e":156,"m":1778355539132.2737,"t":"delete process.env.DEV_USER_NAME;\n });\n\n it(\"启动 mnote-cli 时应把当前 Web 用户作为默认 CLI 写入身份下发\", async () => {\n mockSpawn.mockImplementation(() => createMockChild('{\"ok\":true}\\n'));\n\n const response = await startMnoteCliAgentHostRun({\n request: new Request(\"http://127.0.0.1:3000/api/ai-agent/run\"),\n userId: \"a4b72c17-49e3-46d3-8456-24a0a7044d64\",\n userEmail: \"dev@mnote.local\",\n userName: \"开发用户\",\n payload: {\n stream: false,\n messages: [{ role: \"user\", content: \"写入测试页\" }],\n context: {\n documentId: \"doc-1\",\n workspaceId: \"ws_req_1778035004501_15\",\n },\n },\n });\n\n expect(response.status).toBe(200);\n expect(mockSpawn).toHaveBeenCalledWith(\n \"cargo\",\n expect.arrayContaining([\n \"--args-json\",\n expect.stringContaining('\"workspaceId\":\"ws_req_1778035004501_15\"'),\n ]),\n expect.objectContaining({\n env: expect.objectContaining({\n DEV_USER_ID: \"a4b72c17-49e3-46d3-8456-24a0a7044d64\",\n DEV_USER_EMAIL: \"dev@mnote.local\",\n DEV_USER_NAME: \"开发用户\",\n MNOTE_CLI_ALLOW_CREATE_PAGE: \"1\",\n MNOTE_CLI_ALLOW_EDIT: \"1\",\n }),\n }),\n );\n });\n\n it(\"应把当前页面 workspaceId 传入 CLI argsJson,避免 agent 写入错误工作空间\", async () => {\n mockSpawn.mockImplementation(() => createMockChild('{\"ok\":true}\\n'));\n\n await startMnoteCliAgentHostRun({\n request: new Request(\"http://127.0.0.1:3000/api/ai-agent/run\"),\n userId: \"a4b72c17-49e3-46d3-8456-24a0a7044d64\",\n userEmail: \"dev@mnote.local\",\n userName: \"开发用户\",\n payload: {\n stream: false,\n messages: [{ role: \"user\", content: \"在当前空间写测试页\" }],\n context: {\n documentId: \"tree_1778036320856_1\",\n workspaceId: \"ws_req_1778035004501_15\",\n },\n },\n });\n\n const args = mockSpawn.mock.calls[0]?.[1] as string[];\n const argsJson = args[args.indexOf(\"--args-json\") + 1];","v":"Q6okPYNZGbs32fi9YcFqvevylj2uSWG9GpqvvLzO3Dt1daw8jVDdvMFOf73K+7E9gviHPVmbqzwyNBc9Gc+Vvf2hk7wby3y8uLE6PF0UhbzEtFY92zWWvFcwDD0rI6K9cKVvPRoTrzzUtLA8R+kiPVh9jbwDg748S79ZPUt9AT2CxP64oljkOsWoq7129He9w7+/PGvg8js90Cu9JRkJvXkeFD0B+QC9kacDPYayCb02MwE9TBoYvPjupT3p7Js8B8s6POrptb2scLI8JZSxvFtLJr1bkUW8YyaFPSJel7pnbou8FNUuvK8b27wDFmq9G8U+PYjZBD0b0Pw84WyEPRYVrD24WhK9kGp3vVOpmj0PS5Y8WIMKPZfDCj27SVk9zMQhvDOvsDvECYi7reBJPA0Jw7xwYSe9z/iJvNNgUT3i/d68+luivMiDaD2yGwu6CofHPNqqXr1WNJS8CR8jvYCHPb1/e0w99EeLPE0dOrycwOo70szZO8x0h715eP+8T4mTvCKbVjy7Sgq9AUi8uwPwfjyqXJo7DlW4vLBLNb3KznY8Jox4Pd1N07tj9Bs8HBQOu3KYK7yvNsU88db8PHf39bw9Z+28odGwPGGibDlgf0Q9O5uau9zb1bxUrss8xqK+u4z1tbx3/Xw8pMNkPWAhkj07aAI8jYvcvOHjwjwiwvw83CZ7vZhmVjsCxn87CPXkvHSEDj3TkYu82tI6PS3wlr1oZwW904/hOz/e2rztrxY9Vqo7uQyrXbxzzIq6lU0FvHDwNr0KzYs9VriGvInC27yb5Om7GxEPvOw6EjwoSjS8DOPNvC/xez3IkHW7GS6vu3kIIjyl7Nw8CjCBPRaY8zzCKek8cHHBvPBGiz1iAJq8rUfbuxqoJjwyvgY9vbGMPAB7YjwNbaO9C5pGvesVk7tILIk8Ox+OvKZ/lDx5b148VMqtvAgCQDyq57+80y3ePA+XH73A5QE9HqBQPBJsUr0fnRm8FyCdOxeoqLxVHSC5dLc4vRT56Twjl8m8bXEavSpBjDws+pC8FhwVvWKUp7tb3r+8SyaDPaG3urx3Quk7dP4FvQFF5Lq3LCI9FEGWvcXIULyXsRk8ayMePQeWrL3T/QW8LlKKPWnBwjsPIku9g+TsOk7hY7ztnQi6ZctMPNvt4ryHMoa9w/0hPI4WLLz9Ry+9OhDePOPcPjya2wk9oGH+PEf7YbyOtJy8u6mfPC8aQL2Gfea73kz4vOLHPz1iqxk94Di+vLi7SD2IExM98TqpPYY0UrwsU8k9QW6OO9/5DD3+gEC8R3BVO4a3HL1KzGu9t+YTvPMdPL2XR4+8lK+YPP79iLy+hy68QpMIPV/lOD0bA1c99yjivCk0WjvWP0Y8xzrWu3g9XDz51E68UxBFPEkbFj3nsCy966OWOzrdW73Y6wq9O8kFPPLXYT3n3BI96cQzPF6LET0FWcq8wmWLPbTNBD0E+KU8obf5PFkn9btR8mq84KsGPFscQbwmLye7WUryvPgaabyoGRW9KolwPAAlybyG3yk8nicPPGtL47w5IEk95FcBvFq/Yr1ig109RC8EvR5T+rxTawo8PcW/t5xxR7pHjiu987oNPcTMBzvXLYM9OpSLPWOR27xF8jO83twSPfCsAj1gYAa94cyDvJ89Ar0x85u8CR8xPB7EbTxyIhg6Rg4pPSBBgD07bEs8iTZ2PXLNnDwEA0W8Ckk0vfNGi7varPE8azG7OxRdGT1Gt/w63MZvPXmfpbxYGy68FsO6OpCGkrzSMkw9J/w1vWbv+j
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.test.ts","s":145,"e":204,"m":1778355539132.2737,"t":"payload: {\n stream: false,\n messages: [{ role: \"user\", content: \"在当前空间写测试页\" }],\n context: {\n documentId: \"tree_1778036320856_1\",\n workspaceId: \"ws_req_1778035004501_15\",\n },\n },\n });\n\n const args = mockSpawn.mock.calls[0]?.[1] as string[];\n const argsJson = args[args.indexOf(\"--args-json\") + 1];\n expect(JSON.parse(argsJson)).toMatchObject({\n documentId: \"tree_1778036320856_1\",\n workspaceId: \"ws_req_1778035004501_15\",\n });\n });\n\n it(\"应从自然语言页面设置请求中提取 wired patch\", () => {\n expect(\n extractPageOptionsPatchFromAiMessage({\n messages: [{ role: \"user\", content: \"请显示目录,改成紧凑排版,并切换成宋体\" }],\n currentPageOptions: buildPageOptions(),\n }),\n ).toEqual({\n showToc: true,\n layoutDensity: \"compact\",\n pageFont: \"song\",\n });\n });\n\n it(\"命中页面设置 patch 时应直接发结构化 tool_result,而不是启动 cargo\", async () => {\n mockBuildDocumentBridgeContext.mockResolvedValue({\n workspaceId: \"ws-1\",\n requestId: \"req-1\",\n traceId: \"trace-1\",\n actor: {\n actorType: \"user\",\n actorId: \"user-1\",\n sessionId: null,\n },\n source: {\n channel: \"next-route\",\n client: \"wolai-frontend\",\n },\n deploymentId: null,\n projectId: null,\n tenantId: null,\n authToken: null,\n idempotencyKey: null,\n validateOnly: false,\n dryRun: false,\n });\n mockBuildDocumentCommandEnvelope.mockImplementation((input) => ({\n ...input,\n commandId: \"cmd-1\",\n idempotencyKey: null,\n actor: input.context.actor,\n source: input.context.source,\n target: input.target ?? null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.test.ts","s":193,"e":245,"m":1778355539132.2737,"t":"authToken: null,\n idempotencyKey: null,\n validateOnly: false,\n dryRun: false,\n });\n mockBuildDocumentCommandEnvelope.mockImplementation((input) => ({\n ...input,\n commandId: \"cmd-1\",\n idempotencyKey: null,\n actor: input.context.actor,\n source: input.context.source,\n target: input.target ?? null,\n preflightData: null,\n reason: input.reason ?? null,\n refs: input.refs ?? [],\n dryRun: input.context.dryRun,\n validateOnly: input.context.validateOnly,\n }));\n mockExecutePageWriteBridgeCommand.mockResolvedValue({\n requestId: \"req-1\",\n traceId: \"trace-1\",\n commandId: \"cmd-1\",\n commandName: \"page.layout.updateOptions\",\n revision: null,\n conflictDetectionKey: null,\n });\n\n const response = await startMnoteCliAgentHostRun({\n request: new Request(\"http://127.0.0.1:3000/api/ai-agent/run\"),\n userId: \"user-1\",\n payload: {\n stream: true,\n messages: [{ role: \"user\", content: \"请显示目录,并切换成紧凑排版\" }],\n context: {\n documentId: \"doc-1\",\n workspaceId: \"ws-1\",\n pageOptions: buildPageOptions(),\n },\n },\n });\n\n const text = await response.text();\n\n expect(mockSpawn).not.toHaveBeenCalled();\n expect(mockExecutePageWriteBridgeCommand).toHaveBeenCalledTimes(1);\n expect(text).toContain(\"event: tool_call\");\n expect(text).toContain('\"tool\":\"page_options_patch\"');\n expect(text).toContain('\"action\":\"update_page_options\"');\n expect(text).toContain('\"showToc\":true');\n expect(text).toContain('\"layoutDensity\":\"compact\"');\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":1,"e":60,"m":1778355614589.1711,"t":"import { spawn } from \"node:child_process\";\nimport { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { NextResponse } from \"next/server\";\nimport type { PageOptionsState } from \"@/types/page-options\";\nimport { pickLeptosTiptapRuntimePageOptions } from \"@/lib/documents/page-option-semantics\";\nimport { PAGE_OPTION_SEMANTICS } from \"@/lib/documents/page-option-semantics\";\nimport {\n assertOptionsPatch,\n buildDocumentBridgeContext,\n buildDocumentCommandEnvelope,\n} from \"@/lib/documents/bridge\";\nimport { PAGE_COMMAND_NAMES } from \"@/lib/documents/page-command-contract\";\nimport { executePageWriteBridgeCommand } from \"@/lib/documents/page-write-command-adapter\";\n\ntype AgentMessage = { role: \"user\" | \"assistant\"; content: string };\n\nexport type MnoteCliAgentRunPayload = {\n stream?: boolean;\n maxSteps?: number;\n scope?: string;\n messages: AgentMessage[];\n context?: {\n documentId?: string;\n workspaceId?: string;\n documentBlocks?: unknown;\n pageOptions?: PageOptionsState;\n node?: unknown;\n subtree?: unknown;\n outline?: unknown;\n evidence?: unknown;\n selectedUids?: string[];\n };\n options?: {\n ai?: {\n provider?: string;\n sessionId?: string;\n modelKey?: string;\n profileId?: string;\n model?: string;\n };\n };\n};\n\ntype CliRunResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nconst CLI_HOST_TIMEOUT_MS = 30_000;\nconst PAGE_OPTIONS_TOOL_NAME = \"page_options_patch\";\n\nconst toSseFrame = (event: string, data: unknown) => {\n const json = JSON.stringify(data ?? null);\n return `event: ${event}\\ndata: ${json}\\n\\n`;\n};\n\nconst AI_WRITABLE_BOOLEAN_PAGE_OPTIONS = [\n \"wideLayout\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":49,"e":108,"m":1778355614589.1711,"t":"};\n\nconst CLI_HOST_TIMEOUT_MS = 30_000;\nconst PAGE_OPTIONS_TOOL_NAME = \"page_options_patch\";\n\nconst toSseFrame = (event: string, data: unknown) => {\n const json = JSON.stringify(data ?? null);\n return `event: ${event}\\ndata: ${json}\\n\\n`;\n};\n\nconst AI_WRITABLE_BOOLEAN_PAGE_OPTIONS = [\n \"wideLayout\",\n \"smallText\",\n \"showHeadingNumbers\",\n \"showToc\",\n \"showWordCount\",\n \"collapseBacklinks\",\n \"hideChildPages\",\n] as const satisfies ReadonlyArray<keyof PageOptionsState>;\n\nconst AI_WRITABLE_PAGE_FONT_VALUES = [\"default\", \"song\", \"kai\"] as const;\nconst AI_WRITABLE_LAYOUT_DENSITY_VALUES = [\"compact\", \"normal\", \"spacious\"] as const;\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeAiWritablePageOptionsPatch(value: unknown): Partial<PageOptionsState> | null {\n if (!isPlainRecord(value)) {\n return null;\n }\n\n const patch: Partial<PageOptionsState> = {};\n for (const key of AI_WRITABLE_BOOLEAN_PAGE_OPTIONS) {\n if (PAGE_OPTION_SEMANTICS[key].runtimeSupport !== \"wired\") {\n continue;\n }\n const nextValue = value[key];\n if (typeof nextValue === \"boolean\") {\n patch[key] = nextValue;\n }\n }\n\n const rawPageFont = value.pageFont;\n if (\n PAGE_OPTION_SEMANTICS.pageFont.runtimeSupport === \"wired\" &&\n typeof rawPageFont === \"string\" &&\n (AI_WRITABLE_PAGE_FONT_VALUES as readonly string[]).includes(rawPageFont)\n ) {\n patch.pageFont = rawPageFont;\n }\n\n const rawLayoutDensity = value.layoutDensity;\n if (\n PAGE_OPTION_SEMANTICS.layoutDensity.runtimeSupport === \"wired\" &&\n typeof rawLayoutDensity === \"string\" &&\n (AI_WRITABLE_LAYOUT_DENSITY_VALUES as readonly string[]).includes(rawLayoutDensity)\n ) {\n patch.layoutDensity = rawLayoutDensity;\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":97,"e":156,"m":1778355614589.1711,"t":") {\n patch.pageFont = rawPageFont;\n }\n\n const rawLayoutDensity = value.layoutDensity;\n if (\n PAGE_OPTION_SEMANTICS.layoutDensity.runtimeSupport === \"wired\" &&\n typeof rawLayoutDensity === \"string\" &&\n (AI_WRITABLE_LAYOUT_DENSITY_VALUES as readonly string[]).includes(rawLayoutDensity)\n ) {\n patch.layoutDensity = rawLayoutDensity;\n }\n\n const rawEmbedDefaultBlockId = value.embedDefaultBlockId;\n if (PAGE_OPTION_SEMANTICS.embedDefaultBlockId.runtimeSupport === \"wired\") {\n if (rawEmbedDefaultBlockId === null) {\n patch.embedDefaultBlockId = null;\n } else if (typeof rawEmbedDefaultBlockId === \"string\" && rawEmbedDefaultBlockId.trim()) {\n patch.embedDefaultBlockId = rawEmbedDefaultBlockId.trim();\n }\n }\n\n if (Object.keys(patch).length === 0) {\n return null;\n }\n assertOptionsPatch(patch);\n return patch;\n}\n\nfunction readLatestUserMessage(messages: AgentMessage[]): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message?.role === \"user\" && String(message.content ?? \"\").trim()) {\n return String(message.content);\n }\n }\n return \"\";\n}\n\nfunction extractStructuredPageOptionsPatch(text: string): Partial<PageOptionsState> | null {\n const tagged = text.match(/<update_page_options>([\\s\\S]*?)<\\/update_page_options>/i);\n const candidates = [tagged?.[1] ?? \"\", text];\n\n for (const candidate of candidates) {\n const trimmed = candidate.trim();\n if (!trimmed) {\n continue;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!isPlainRecord(parsed)) {\n continue;\n }\n const payload =\n String(parsed.action ?? \"\") === \"update_page_options\" && isPlainRecord(parsed.pageOptionsPatch)\n ? parsed.pageOptionsPatch\n : parsed;\n const normalized = normalizeAiWritablePageOptionsPatch(payload);\n if (normalized) {\n return normalized;","v":"J/KxPYm1Er1Rv+u9qfzVvbvRdT3yWRe9I+QqvUzP+zzGiLc9Ln2FvbJ9jrwxLsg7uGUnPTy1NzwZjF88zXEBvaAmDrw40pO8M0PxPEeNqbsPLJc9+zGTPDwddDwvQWe9qzGMPSnObz3Nj9882K0XPVspX73Shd47zZ1GPAcK6jzZK4E8Ra+7vPS9nL0yUa+8tTPpPDhlTryR+mG77fzTuwYr3TzuGQW7tkegu4lxJ73vTY09mjw2vcsLAz5bmC09/YDOPUp9xb0ypcm8h4SAPIHXIT0X2Va9kW3kPWLMWT04J/M7FoYMvFcvRjyCGDc72nwbPeV5bj1+Z469FWCNPfn1qDyb/d27/pYDver/0TxsuBI7+OAuvEgAHTwxSDI9H8SJvQCKvjxtAFe97OHsPMJQXrzu9Mo60Xp4vdldFDzmYfe8sVhFvGpZaz28Wiw8cdImPRfM27yDqIA5E+3UOj2rIr3Y4Bo9qSrDPLy+/TuMXy07qbayvL97UL3cJSg9k2N5vJiBHzu6tR+9vvpEvP0CbDsw11w8xWFUPDVs37zK/8+8XbyvPemJkj1516S89GnguwnogbycluK8cjHSPKu7rbwWJYK9TDyDPBRSRr1c4jI9Y9AWvOKDOTzXluA7yOPBvNAWkrwlM728+lVJPY0m7TscmC265R4bu2kARD2x9N48hcWavW8U9bzQ6xi8AIPCPJYiXz3bfMw8+W0ZPW2zE73tdeq79s5JuywvY7yVbbC7glUdvU8gZ7xnIBU8aWpDPE6DHr1ONqQ8cS8IvdHhhrzUGgO8QhiYvAQh9Tt/lhU9Po+GPEsRljsvIH68/jstPYsWs7s5VuS4FlQbPVVOQD0dEWQ8HDusvdVDBT3YpxS9Ux4uPTEYZjxfnjs9MBn5ukg1rjtB+Ea9KaR6vVvRhzzHrUg8lNveu5SXYrw4xUM9VMkYvY3lLTx7RwC9BgccvRfKFL3yJ1898nyIvM/VO7xD2d28nggaPWf+cr1DK1U84Fu5vLxErbz1X+m7qgq8vBk8WLvD9xO9Q62rvceXKT0GslI8qKBSPZgwXr2CaUK772RFuzpFfjqVsAG9NNw0vdJFXTwDLpQ79JNCPQjAzLwwfhM9AiCHPXu6gbxmuRc9fpoJO6Bzprx4csO8XckCvJOlMTxrlpi9J7M9PPQTJD2zQZ68+nEHPbQqizwOJTk9M35QPbRsjLx10Vs8eyX7vDidHLxslcE6RR2TvTn8Lz2c9QU90eaLvCuiYj1sdwA9uNdnPbxFHT2d+zI9ezHeu5Rm/DyEAlE95HtLPXBZGjwrOlQ8GnDkvAyRqbtiVSO97P6EPbgFUTwv03E8s339PEuFkz1gw8s8tX4+vaPdI705Qkg849gzPG9XY7uR3u88AtcJPN3L/jzwpQa9BU4xvRbsmrzWzx69fAXqO6BzxjkSHbk8mKrGO/IeeTzk6e88NDVOPQ8U0DxBiDK8tLu9PCA6C7w4c+28J0nJvAJfpLyRSdi8iNmEvD3F7TzC+4y9AyrAu8BC07xeIE69A8ccvJzTfrxKQhi9Pd4PO8UVjru8e4s9AjOpPDCGHD0v+TA90gU3vUe89LySEca8zAL2vLu1Vj2p9Bg9jPFgPTt6VjwRk3u8IHMivDbVr7zc7DM926MLu6+aFL3XVRA9szwhuqewML1wPIe9rO+qPD3ixbsYnny85GQNPciyKrw6T/a7Ad/3vLqLFz0BAAG9WfmYPBL5MT2Z0w280P4aPZJrcrvoqie8kMe9PHFK3LumLKY8K02PvesoWrx/s5O8yGuFvBSgsjoB2B89AK6yPBLnlT3KJ0u9xpgEPW2juzyN8a+6d/wkPQqWE70CwgC9PNjAPOJ4Kj19fMq8ru04PGy327wRlCu9NhM2PZhxFD2yZBo9kOjEPE1U3Dp+h9Y8kK4LPXtPsbx5S1S8woeUO6hgvbySPRM9ve2RPb
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":145,"e":204,"m":1778355614589.1711,"t":"try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!isPlainRecord(parsed)) {\n continue;\n }\n const payload =\n String(parsed.action ?? \"\") === \"update_page_options\" && isPlainRecord(parsed.pageOptionsPatch)\n ? parsed.pageOptionsPatch\n : parsed;\n const normalized = normalizeAiWritablePageOptionsPatch(payload);\n if (normalized) {\n return normalized;\n }\n } catch {\n // ignore\n }\n }\n\n return null;\n}\n\nfunction extractNaturalLanguagePageOptionsPatch(text: string): Partial<PageOptionsState> | null {\n const normalizedText = text.trim();\n if (!normalizedText) {\n return null;\n }\n\n const patch: Partial<PageOptionsState> = {};\n\n if (/(显示|打开|开启).*(目录|标题目录)|显示标题目录/.test(normalizedText)) {\n patch.showToc = true;\n } else if (/(隐藏|关闭).*(目录|标题目录)|关闭标题目录/.test(normalizedText)) {\n patch.showToc = false;\n }\n\n if (/(开启|打开|启用|改成|切换成).*(宽版|宽布局|自适应宽度)|使用宽版/.test(normalizedText)) {\n patch.wideLayout = true;\n } else if (/(关闭|取消|恢复).*(宽版|宽布局|自适应宽度)|恢复标准宽度/.test(normalizedText)) {\n patch.wideLayout = false;\n }\n\n if (/(开启|打开|启用|改成|切换成).*(小字体)|使用小字体/.test(normalizedText)) {\n patch.smallText = true;\n } else if (/(关闭|取消|恢复).*(小字体)|恢复正常字体大小/.test(normalizedText)) {\n patch.smallText = false;\n }\n\n if (/(显示|打开|开启).*(标题编号|标题自动编号)/.test(normalizedText)) {\n patch.showHeadingNumbers = true;\n } else if (/(隐藏|关闭).*(标题编号|标题自动编号)/.test(normalizedText)) {\n patch.showHeadingNumbers = false;\n }\n\n if (/宋体/.test(normalizedText)) {\n patch.pageFont = \"song\";\n } else if (/楷体/.test(normalizedText)) {\n patch.pageFont = \"kai\";\n } else if (/(默认字体|恢复默认字体)/.test(normalizedText)) {\n patch.pageFont = \"default\";\n }","v":"0B+oPdOyirwAUOi9rGnMvUvlUj3ylyG9kwUTvWwPIj3FH449SHe6vbdAobxnk448MU0xPZu53jyTnMw7LSQYvcog77uKZHW9dGBSOONJJbskLAM95QqLPEA6uTqVXZO9y8GGPWgdLz1zmE08pakjPRt2eL0Ioco8IzVnO8sidTygzqw80CmsvBFdaL0j9wa9/SSAPWfADr3VYQ+9UGtYvAbINjziubm7AWPWuwbkOb364UU9v4hKvfFB6T1TnBk9K665Pe6I6r1vy7m8SiZWPJO51TwE+Ju9xQf9Pb1mYT3boY86RwUIuiShTDzsx5m7lxG/PDLeXj2wjUO9H8akPWzWizwkhA69ND0avWF+8Dyw6kk8sk60u4QH3zwj4wo9A/gmvQAJN7w5xBe9fQMyPHHGCb1SRKS8UosovWv5FD26yXW9I/HAvFKhKT1p5e88Y1dUPcRfFb3ETqU64aMSvWgcNb3Awko9hn4GPWXHw7yrNya8Et6tvBRX5bzTUys9uKLku5DxIrwSF+e7eQvxvBSxpbtLpRA9Xe4vu/X4mbwaQGO8KETAPQPeJj3Q8mW8tZkQvIb0Ub2JGhK8hx4uPYMNLr0rCZ69KDcEPdr0V70/tYk912HuuhOLBDwCWOm72D32vHtZUjvfG6a86ItKPRZ80jzkQa28ZPonvUT+Pj197847jNS8vZdbN7xncqk6wCDWPJgLQT0NHzY8jq1BPT6tx7zL72G6QqYJPCmoyLz/SaK6AgwJvaa0Cr2EJoG8tOXSPEZiTL1GDgo9F3E2vHduibypWau7/L6TuyRAlzwscFw86GepO0CpLj27Qua8qFSAPZCYaLx0hgA6d6arPBx2SD0v6gc9U6Wavbz1FT22dtu84G08PPvRmzztv149JZ2su5R/0Dylq4u9pJRPvc0zkjsCzg09lrUQvXVQTDywqN886Z/ovLV8Cjw7kYe8IyQWvXmYurxJRTA90iVCvPsiwLxFJDC8VUrEPAz+Pr3My/g87uf4vMQD6bwGp8W7q4SMu9XHmbwzMwu9Yi2gvXytNT3cdyi5Y7aAPaz7c73BTpK8EQiqvKVbDb340N+8Cf1yvdfolLxHSMQ76VZdPRYD7Lt+gP08fJGSPc11gbtbzRI9b4wDPMwflLy3S2i8OOrfvJmAU7yVK7C9hGMKPZHDAj0lph69SPJ8PFi7kTzrt/88lyO9PJ/pszsf2DM7kqDfu7EMlTzBpae8JLyvvZRBJj2Os2I9ZBOsu116Hj2InaA8Xm3IPTg9MzxmT1Y9lWAYvBDtLD28N5I8+RUhPZn63zwX66Y7kBwTO3p2tLxnFRe9AiCKPX9uxLvRFwg97JU1PeepoT0kUu48QgKJvF4kA70CaKg7hao2PDD0ArzOhxM9iZYgPBz1pzt2dOu7xQO/vOeMOryD8GO9lBqqu5VOFTy9Nn48/ehzPAKtDD1XgkO7UUw4PcRG8Dx0dHg8KcbHPDz4Nb1EO6y88iAtOxgLJb1NZ0K8xE0zvRTJXbyr0+O8bWU/PAs8p7xKd0y9jxAsvMRyZrxxQfa8zIYgPAXdaLx4ep89HWu6PGKLMD0x9Ss9c6MRvQzFY73B1Bm9ziNYOw6ucj2823A9WbqMPcZqyTytqz68hlikPGPL4Lz60YA9FDbKPFZUKr3vz6M8ZEyJu1i/qbxHvTi9ub/MPOr8xrpvklu8Gj3aPFNwjrweZmi8reL8vN/fkjwUoOe841Z0vMbXHD1GD9+8QcSYPBmxB7krVoe84JSjPGOsNDzxuB09ejxnva2cPLtjH0m8Aj3iuqdlyzwDicc87xKfPICDbj0FckG9meIJPcHkjDztZmS8PewgPdP4wbyB9jS9NXYiPGYl
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":193,"e":252,"m":1778355614589.1711,"t":"patch.showHeadingNumbers = true;\n } else if (/(隐藏|关闭).*(标题编号|标题自动编号)/.test(normalizedText)) {\n patch.showHeadingNumbers = false;\n }\n\n if (/宋体/.test(normalizedText)) {\n patch.pageFont = \"song\";\n } else if (/楷体/.test(normalizedText)) {\n patch.pageFont = \"kai\";\n } else if (/(默认字体|恢复默认字体)/.test(normalizedText)) {\n patch.pageFont = \"default\";\n }\n\n if (/紧凑/.test(normalizedText)) {\n patch.layoutDensity = \"compact\";\n } else if (/(宽松|疏朗)/.test(normalizedText)) {\n patch.layoutDensity = \"spacious\";\n } else if (/(默认间距|标准间距|正常间距)/.test(normalizedText)) {\n patch.layoutDensity = \"normal\";\n }\n\n return Object.keys(patch).length > 0 ? patch : null;\n}\n\nexport function extractPageOptionsPatchFromAiMessage(input: {\n messages: AgentMessage[];\n currentPageOptions?: PageOptionsState | null;\n}): Partial<PageOptionsState> | null {\n void input.currentPageOptions;\n const latestUserMessage = readLatestUserMessage(input.messages);\n return (\n extractStructuredPageOptionsPatch(latestUserMessage) ??\n extractNaturalLanguagePageOptionsPatch(latestUserMessage)\n );\n}\n\nfunction describePageOptionsPatch(patch: Partial<PageOptionsState>): string {\n const labels: string[] = [];\n if (\"showToc\" in patch) labels.push(patch.showToc ? \"显示目录\" : \"隐藏目录\");\n if (\"wideLayout\" in patch) labels.push(patch.wideLayout ? \"启用宽版\" : \"关闭宽版\");\n if (\"smallText\" in patch) labels.push(patch.smallText ? \"启用小字体\" : \"关闭小字体\");\n if (\"showHeadingNumbers\" in patch) {\n labels.push(patch.showHeadingNumbers ? \"显示标题编号\" : \"隐藏标题编号\");\n }\n if (\"pageFont\" in patch) {\n labels.push(\n patch.pageFont === \"song\" ? \"切换为宋体\" : patch.pageFont === \"kai\" ? \"切换为楷体\" : \"恢复默认字体\",\n );\n }\n if (\"layoutDensity\" in patch) {\n labels.push(\n patch.layoutDensity === \"compact\"\n ? \"切换为紧凑排版\"\n : patch.layoutDensity === \"spacious\"\n ? \"切换为宽松排版\"\n : \"恢复标准排版\",\n );\n }\n if (\"embedDefaultBlockId\" in patch) {\n labels.push(patch.embedDefaultBlockId ? \"更新嵌入默认位置\" : \"清除嵌入默认位置\");","v":"1VBzParKMbwaVQS+GBbrvdNliDyNdA29Nd65vNWuMzyw3Eg9UTiWvfMfgLxwsxQ9WUZTPWYIQD2M1Qg7yBMWvcWzibxlZUe9yLxPPM7gAzvx3oc914+JPOhLabxUToC9s/CKPSGCOj1KRlo975CBPUK0Db18rd88hKFdPNnSDDwz+8k6+ZVBvZfNkb3depm8QIJSPDrziLtBGIs8DUTnuWG8wTyyggA9GCX5unvFrbyCvKA9UiUtvdMZsT1Al2w9/RTGPV57tr1Rhva8axc3O8AO6jw5hw+95JGtPdNDiz2fOa+8tsIavb2dFz0IfuO8le4QvHRZqT1dB0O9451wPS9vKj0a17c6QzRAPEYJcLwidom8RoeMPODngTzonRs957GeuvZAWTwMaTW9aVkxPeahr7xLJbq8n85SvS2ozjsaVZC8Hvy1PMz/Kz2VkN880qUuPU8RQ70rBos82jKNvG4ROL1JFHE9WRMWPZK8D73teY28FrOBvN/9EL27Mok8uTTZOxQ7SjxXcjW8jpm3vEizTDutRZA77BVgvJfjE731HB29vIGZPYCskT1bTcK6IbSWvNWOiLydJnm8WsrYPBUzqLzcBHi8L3ySPAhRTb3dk4M8lMztvJoFlbz6Bw48rUuCuwMFKr1dIjU8wRB4PHcw0TyytUo8J3/OvBb0/zziAxQ8HQWXvQw1xLw3kW47scyOPBZ3LT0djD49XNQiPd+cizszpoW82BIBvTLWF71pK6O8cT1uu9dqnbw+EDO8XQkQPFCxBL3Ja4I9BZfKvCmpT7299MW7MxnTvOEob7sRo8U8u3FcPcDBqzyrNqq84c10PDk3rLsvS1G8Gto/PIbNGj1K1AM9Q2hOveXKGT3XghS9BtlwO8iKaTwiCF89zqLJu+Jl3jyvNNC9r74UvUAX7zyJ5ns78Dl8uzRyBrueJMc8JvnEvLbH4DzOMUu9apBFvCwour3WcQc98A8zPCq5Fr3kRpK8Sk4mPZApgL0knMQ8ybQVvcIV9zyIqSa8gkYxvUVnRTy5zC69KuR8vVk+kDyN2AK8h2FYPRR5RL2W6yM75Zm2POU7GrsZaI28yEYTvVdKPry0YlW8SWxlPWNKTr31mP08+zRoPcigRr2zqhs9puzkPKYEhrwRVuS8bM4DPNYkp7x4bH693zA9OzSkNz2osFu6S8MTPUO4B7y22wg9uJMyPKqXFb0bQxo9WImtvPxB5Lwubqy7acCTvSqxDT2icyU9mIf2vL3zUD3TcNI74zyjPWQ/rjxq7n490528u6t7gjxPrz89m5mvPCrEdzromE+7rPDnvDujHTz5JsK8IRVrPR2ECztuSUU9GE4dPaL1Zz2FHAI9bgkTvQ5nGbwCVA48ECKPPPEiAb1HQaM8c60GOdNwmzyWiTC92+URvQHq9ru0T2W9O4DNPN3/8rwoYdU807fHvKiPnDxfK+S76e4vPZGz1Dzg2tG7o47tPN5X0jxFpay8NQsUvR6Q87yrRa28lIVZvNP8GzzBhqq8Lu2BPI4337whbDO99ZIZvAqlKz06OZC8ZLeKPEKs5Tybzlo9xVX7vGnhMT3OD
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":241,"e":300,"m":1778355614589.1711,"t":"}\n if (\"layoutDensity\" in patch) {\n labels.push(\n patch.layoutDensity === \"compact\"\n ? \"切换为紧凑排版\"\n : patch.layoutDensity === \"spacious\"\n ? \"切换为宽松排版\"\n : \"恢复标准排版\",\n );\n }\n if (\"embedDefaultBlockId\" in patch) {\n labels.push(patch.embedDefaultBlockId ? \"更新嵌入默认位置\" : \"清除嵌入默认位置\");\n }\n if (\"showWordCount\" in patch) labels.push(patch.showWordCount ? \"显示字数统计\" : \"隐藏字数统计\");\n if (\"collapseBacklinks\" in patch) {\n labels.push(patch.collapseBacklinks ? \"折叠反向引用\" : \"展开反向引用\");\n }\n if (\"hideChildPages\" in patch) labels.push(patch.hideChildPages ? \"隐藏子页面\" : \"显示子页面\");\n return labels.length > 0 ? `已更新页面设置:${labels.join(\",\")}。` : \"已更新页面设置。\";\n}\n\nasync function pathExists(targetPath: string) {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveRepoRoot() {\n let dir = path.resolve(process.cwd());\n for (let i = 0; i < 8; i += 1) {\n if (await pathExists(path.join(dir, \"rust\", \"Cargo.toml\"))) {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return path.resolve(process.cwd(), \"..\");\n}\n\nfunction buildCliArgs(input: { repoRoot: string; userId: string; payload: MnoteCliAgentRunPayload }) {\n const sessionId = String(input.payload.options?.ai?.sessionId ?? \"\").trim() || `ai-${Date.now()}`;\n const documentId = String(input.payload.context?.documentId ?? \"\").trim() || \"current\";\n const workspaceId = String(input.payload.context?.workspaceId ?? \"\").trim() || null;\n const argsJson = JSON.stringify({\n pageId: documentId,\n documentId,\n workspaceId,\n provider: input.payload.options?.ai?.provider ?? null,\n modelKey: input.payload.options?.ai?.modelKey ?? null,\n profileId: input.payload.options?.ai?.profileId ?? null,\n selectedUids: input.payload.context?.selectedUids ?? null,\n pageOptions: input.payload.context?.pageOptions ?? null,\n editorRuntimePageOptions: input.payload.context?.pageOptions\n ? pickLeptosTiptapRuntimePageOptions(input.payload.context.pageOptions)\n : null,\n });","v":"C8KYPTIZh7wtJAW+QrGvvUbngT1+n3K9GLGevCrdDzxuzLs8AVlovfkQOzuYi3s8CCU7PbEVhzzB4oU8WC8JvYs3/ryVnP+8GTjoPPHhorzdb4g9SLlQPP5LcjxeUy+9CTi0PY1cdD3wwX09bAQjPW/tR710HbI8BzrbO76w2zwCZnU8sjk/vT6OY72bqhu9WeHmPBnYcDu5re87ijjqujR0Ez0iimM8SBKCPDx7Jr3BSnc9IJgcvaF8rj3x8DI9BrvtPcJvuL3a3Om8dvRMPFLXWjyQgue801eZPa0mpT3gbYQ8z1PNvAd03jxUvZa86J1wPMufpz2Kyy69Z5B5PcOtHj0fvIw8bTdjvFyahDwk9SS85EmhvEY90TyZFhs83L/DvAszPTyRz4C9q+MZPSUVN7xybWa90D8PvdYL1Dwhqfi8QfiTPFMYdD1AdZ48LAmSPOQmpLwHUcG8zyn8O3+2Tb0VZ0U9cgIrPdLD/LxGDOW86CMCvRvgHb2RqAI8DCD1uf79UTxdJ428/yTTvEfEMrxBsIA7xGUZOuUovLzgrV69YnOZPVafgz2mXhq7nMqkvIAwtbykbEi8Hh2OPDlBV7zwe1W8Vi9XPY/CQr1TZXE8EA22vCt0MLxp5Aw8ttpwvMXrGb1mHqC8EA4UPe4uKj2aKCw9RqvhvNL79Dy3oig9pO+vvUodY7ypU427HXLHPKW7Qz0vMhI9qhc4PThXHr1pZoC8GtF+O/+h07xxURS8U959vGv1yzra+3K8CLVzOpF5Ab1U4w49xehGOlM2Qb2qGx46F0cAvYlxFTwHgZ88MlRQPEKZbTyus4O8stxpPIuHDLybETK8JMUlPKGDWz1tABI9y9hYva+hIj1eVA69HDbRPL7ArDx2fVY9x2QbvD/tDTzSUre9rvcXvROwXjwtS6K7Md6lu4c1Nrp50508HOArvYO9Mz3sRCS9A1IhvIcBg70XnIo9pEfOuwz38bwRfBy8Ngr1PE7opr1rSle7UJLgvMNd8TvU6967Y0n0vB5hljzrpQ29rZOPvQfw+zx4Mr+8op1/PRsCdL2vj4q7NakcPZszRryeRRy8rDEMvSIGAz3Bt7m8HS9zPQLaFb1jBhU9GLGGPXT0O70GWgk99LubPNJ5Prz5qtK8Zb4TPCrPtzyTv3e9VIsQPIu0TT1GH6q8nD/QPFotTTxu2wg9N5K6PI5UhL07owk9JLEAvQPglLxnVVE78mjMvVfraTpPSAk8CjEBvcF0RD2a3+w8o/ZfPZhcDD1C8yc98oVZvF2/3zwJgFg9zCA4PCT5HLtFy9o8QPZbvNeWHDwV5xa928w5Pbd3RjwLVO47m7TgPCWVmT27AQI8l3AZvT9nDr36RwE8kdxqO22q8LyGCCo8JfrUuxLrAD0IJge9G1HQvJlyFDxqIeG8Y3gkOzKsobqzupc8IrHvvI+gjjyV59w7twZCPbYp+jxO5ye7/IEbPV2l8zxfHpO8JQrYu1Xh67y8ppq8TaMVvQ1nDz21S0O9WyWKPAs9hrwmgrO8/j7OPNpw9jwtOVQ4fnevuw9ZDLyhmW09okp8vDMTJT22mxI9v7ssvK
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":289,"e":348,"m":1778355614589.1711,"t":"pageId: documentId,\n documentId,\n workspaceId,\n provider: input.payload.options?.ai?.provider ?? null,\n modelKey: input.payload.options?.ai?.modelKey ?? null,\n profileId: input.payload.options?.ai?.profileId ?? null,\n selectedUids: input.payload.context?.selectedUids ?? null,\n pageOptions: input.payload.context?.pageOptions ?? null,\n editorRuntimePageOptions: input.payload.context?.pageOptions\n ? pickLeptosTiptapRuntimePageOptions(input.payload.context.pageOptions)\n : null,\n });\n\n return [\n \"run\",\n \"--quiet\",\n \"--manifest-path\",\n path.join(input.repoRoot, \"rust\", \"Cargo.toml\"),\n \"-p\",\n \"mnote-cli\",\n \"--\",\n \"--json\",\n \"--validate-only\",\n \"--dry-run\",\n \"--actor-id\",\n input.userId,\n \"--actor-type\",\n \"user\",\n \"--session-id\",\n sessionId,\n \"--reason\",\n \"ai-agent-run:mnote-cli-host\",\n \"tool\",\n \"run\",\n \"--tool-name\",\n \"doc_get\",\n \"--kind\",\n \"query\",\n \"--mode\",\n \"explain-plan\",\n \"--args-json\",\n argsJson,\n ];\n}\n\nasync function runMnoteCli(input: {\n userId: string;\n userEmail?: string;\n userName?: string;\n payload: MnoteCliAgentRunPayload;\n}): Promise<CliRunResult> {\n const repoRoot = await resolveRepoRoot();\n const args = buildCliArgs({ repoRoot, userId: input.userId, payload: input.payload });\n\n return new Promise<CliRunResult>((resolve, reject) => {\n const child = spawn(\"cargo\", args, {\n cwd: repoRoot,\n env: {\n ...process.env,\n CARGO_TERM_COLOR: \"never\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":337,"e":396,"m":1778355614589.1711,"t":"userName?: string;\n payload: MnoteCliAgentRunPayload;\n}): Promise<CliRunResult> {\n const repoRoot = await resolveRepoRoot();\n const args = buildCliArgs({ repoRoot, userId: input.userId, payload: input.payload });\n\n return new Promise<CliRunResult>((resolve, reject) => {\n const child = spawn(\"cargo\", args, {\n cwd: repoRoot,\n env: {\n ...process.env,\n CARGO_TERM_COLOR: \"never\",\n RUSTUP_TOOLCHAIN: process.env.RUSTUP_TOOLCHAIN?.trim() || \"1.89.0\",\n DEV_USER_ID: input.userId,\n DEV_USER_EMAIL: input.userEmail?.trim() || process.env.DEV_USER_EMAIL || \"dev@mnote.local\",\n DEV_USER_NAME: input.userName?.trim() || process.env.DEV_USER_NAME || \"开发用户\",\n MNOTE_CLI_ALLOW_CREATE_PAGE: process.env.MNOTE_CLI_ALLOW_CREATE_PAGE || \"1\",\n MNOTE_CLI_ALLOW_EDIT: process.env.MNOTE_CLI_ALLOW_EDIT || \"1\",\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGKILL\");\n }, CLI_HOST_TIMEOUT_MS);\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n child.on(\"close\", (code) => {\n clearTimeout(timeout);\n if (timedOut) {\n reject(new Error(\"mnote-cli host 执行超时\"));\n return;\n }\n resolve({ code, stdout, stderr });\n });\n });\n}\n\nasync function executeAiPageOptionsPatch(input: {\n request: Request;\n payload: MnoteCliAgentRunPayload;\n patch: Partial<PageOptionsState>;\n}) {\n const documentId = String(input.payload.context?.documentId ?? \"\").trim();\n const workspaceId = String(input.payload.context?.workspaceId ?? \"\").trim() || null;","v":"1gs0PWa9srzNWv29dfvjvdNliz0LTEu9TTouvYWLlLw10sW7WZKbvXFehr1TrzI97NCDPdEGELsDfAA9BF6SvfUzdDwKVRG9nWDLPEoMdzwOrxQ955aWvC6hvjwyL2e9kAOnPTiwSj1Gh708ddxOPWBXIr1ak0I9VvFIPA+7hTxc6wU8uldEvQ1mrL3CO069U3Q3PO5RIr0in168WUEGvUH02jumBn28vwgVPKg6+LwqOX89ZzW2vEKBvj3T91w9H+t4PZpvAr7M7Hu8qyPwu+qGorwQSgG9T9HJPVdP+jwUYDi8FjETu8guWryHghM7LoowPTohgT1SCla8UAG5PU2Lgz1jFD69wGtYvTulZz2E9sk81owZPV0lhD20S3C8xDKgvKN4sTug9Iq8rTPLPFig8LzPZBe9ECwOvfi39Dy5m7q67ReovEveDD3zEwS8UoWaPGjTKL0Re728y7LsvPtonb380js9P6ZyPePcZrxUMOW8kHhIumRYhL2/DUe8eDa5uyETPTyewoK8U5lnvJ9x1Dt++is9q4/Qu2pPE7vm1Iq7VV9lPZvJ/Dxc3xQ9J8k7PeYT3rw4v5m88EFbPQgZC71/mgG9YjuJPaZaQ73erQ89gXHYvNVZ2LzPr2Q92RnWvMJOQL1jk4m7JUFePb47AT0z6Dg97XGTvPA8/jypX5c8i+9kvemhxbzyrZy7nMITPMJlXzxUmdk8auilPNRxcr1B/t68b6nmPDR/KDxSnpY5i6lMvaISZbz2TIe856Zgu4iTKr1L5IQ9+8squ+JrHr31YDs8Dcd3u9anNT0ZjIM8ql6+PNT8ST010Yq8aTH0PCawu7wP9wY9xFGdPH6SDD2cygA9B2OTva99gD2+LhG96qf4u3KeZLsz1YI9UiU6vLDqYDwHXXO95hSNvfMjczxPQle7IHX4vABsFDt1guM8UpeLvBjGIz2MEhi95Xt+O43BTr3WYhA9SAtEvJ56qbzirIS8+WtNO5ELSb15mh07VF8uvXTPgDuL07684uLyvAS8Cjxr9bG8k7V7vVk7VzyjFWi87Z43PcfUCL11XgK9nFONvEjgYTw+1lo8sH6uvfPwyTzbbBa9rAI/PVKaprzspEY9Y47cPSkTHLywPxu8rDnlO/eV8bwrvNC8x4ehPGnOC7yBdIa99hkOPOSKGD2CHmK9TvISPTCeED2BDiU93vsbPYsBKjoO9iO8J143vOn2T7yoox29O5afvZFx4TwS3Do9WV3SvEHZfTx3KiI9RW+EPX9y7bsEBC09KTmLOTpZCD2E6B88HqN5u0AUQbxsEyu8P0/Wu1CvLjszhRW9O7Mruxb627xKV4M8a74mPMoFmz1YsC09+ukCvb1StbqYXIc8BkrjvMcrgbyILKY83ylsvOicgDxeBhq9vNhBvWKYCb0urCK8ogCQPJ8dozxpRUg8cVcIvccG2Dx0fqo8g1wmPVCMKD2w2/w7zhSGPGPb0bvAdcW8exAJPLqc17w0vII8JwEZvYyxxjt3Vzi9ZyMIPT7aQLyS2ke7F3j2PPUXnztD/bA8fGvJu6FnwryU03s9yqxwPPinuDy3ulY9DpJFuyk0GbzdW2m9nJRMPJUBPT174Q89p6naPJw+L7wmBKm7F9CwPJ+kgrwNF5u8+I5FvAuUVr1cthQ9kqLuunS+qzuaSIG9mG0oPQtHtzzGeoU85NL5PAGgg7y76cG8r1UQvdnG1DythDK85zynvCc9Mz2CVTy83i+5PMyqujvO2wq9l/2bO6Dam7zKvdc7vtNUvSbiH734sIa7FLe4vLMIGD017e477z+yPZ19vztKIh+8VgcQPZzTEby4ig+7RvgyPZEqmbxC1828V9mWPS1gCD1imCy9LezYPCkkhTpYFk46jtLRO7hZCD
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":385,"e":444,"m":1778355614589.1711,"t":"resolve({ code, stdout, stderr });\n });\n });\n}\n\nasync function executeAiPageOptionsPatch(input: {\n request: Request;\n payload: MnoteCliAgentRunPayload;\n patch: Partial<PageOptionsState>;\n}) {\n const documentId = String(input.payload.context?.documentId ?? \"\").trim();\n const workspaceId = String(input.payload.context?.workspaceId ?? \"\").trim() || null;\n const bridgeContext = await buildDocumentBridgeContext({\n request: input.request,\n workspaceId,\n });\n const envelope = buildDocumentCommandEnvelope({\n name: PAGE_COMMAND_NAMES.updateLayout,\n payload: {\n documentId,\n workspaceId,\n options: input.patch,\n },\n context: bridgeContext,\n target: {\n workspaceId,\n pageId: documentId,\n },\n reason: \"ai-agent-run:mnote-cli-host:update-page-options\",\n refs: [\"mnote-cli-host\", \"page_options_patch\"],\n });\n const result = await executePageWriteBridgeCommand({\n context: bridgeContext,\n envelope,\n });\n return {\n documentId,\n patch: input.patch,\n meta: {\n requestId: result.requestId,\n traceId: result.traceId,\n commandId: result.commandId,\n commandName: result.commandName,\n },\n assistantText: describePageOptionsPatch(input.patch),\n };\n}\n\nexport async function startMnoteCliAgentHostRun(input: {\n request: Request;\n userId: string;\n userEmail?: string;\n userName?: string;\n payload: MnoteCliAgentRunPayload;\n}): Promise<Response> {\n const pageOptionsPatch = extractPageOptionsPatchFromAiMessage({\n messages: input.payload.messages,\n currentPageOptions: input.payload.context?.pageOptions ?? null,\n });\n const shouldHandlePageOptionsPatch =","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":433,"e":492,"m":1778355614589.1711,"t":"export async function startMnoteCliAgentHostRun(input: {\n request: Request;\n userId: string;\n userEmail?: string;\n userName?: string;\n payload: MnoteCliAgentRunPayload;\n}): Promise<Response> {\n const pageOptionsPatch = extractPageOptionsPatchFromAiMessage({\n messages: input.payload.messages,\n currentPageOptions: input.payload.context?.pageOptions ?? null,\n });\n const shouldHandlePageOptionsPatch =\n pageOptionsPatch &&\n String(input.payload.context?.documentId ?? \"\").trim() &&\n String(input.payload.context?.workspaceId ?? \"\").trim();\n\n if (shouldHandlePageOptionsPatch) {\n const toolCallId = `${PAGE_OPTIONS_TOOL_NAME}_${Date.now()}`;\n const toolArgs = {\n documentId: String(input.payload.context?.documentId ?? \"\").trim(),\n pageOptionsPatch,\n };\n if (!input.payload.stream) {\n const result = await executeAiPageOptionsPatch({\n request: input.request,\n payload: input.payload,\n patch: pageOptionsPatch,\n });\n return NextResponse.json({\n ok: true,\n bridgeOwner: \"mnote-cli\",\n text: result.assistantText,\n toolResult: {\n action: \"update_page_options\",\n documentId: result.documentId,\n pageOptionsPatch: result.patch,\n meta: result.meta,\n },\n });\n }\n\n const body = new ReadableStream<Uint8Array>({\n async start(controller) {\n const encoder = new TextEncoder();\n controller.enqueue(encoder.encode(toSseFrame(\"ready\", { ok: true, bridgeOwner: \"mnote-cli\" })));\n controller.enqueue(\n encoder.encode(\n toSseFrame(\"tool_call\", {\n id: toolCallId,\n tool: PAGE_OPTIONS_TOOL_NAME,\n args: toolArgs,\n }),\n ),\n );\n const startedAt = Date.now();\n try {\n const result = await executeAiPageOptionsPatch({\n request: input.request,\n payload: input.payload,\n patch: pageOptionsPatch,","v":"WXPxPM88V7y+ga29bbStvT+NOj0Tk529I+zRvK7NSLxdGnI95j9FvTi5krzgW+48s+LVPbo01TxyeA89gjUOvY4cqzxqTnq9C+Kmu+Y3yzwkdyM94aFAvXkNzTz81S69M6uzPYQYBD2F/TU9RckcPUa0pb1kaoE9T3VcOqP8Aj2lE+47MVnavFggDL37P667CzaHvNIvXL0Iz029gKKEvIwWJ7zcEGi8jb0CPaBc9zvsym09OFQMvaxLrz2DPTo9zX4cPSy8wb29Ha27VG3muvylHLzDDQe8yDnvPVKuiz07yvY6/zLPvPO44jtDNAa9MNQfOi/Bzj3UHZg8+8mHPXHIjT1xS0K90HYOvK5YqD3ZyoK8jWEhPcp3ST26Xjk8hRiVurfaRzsMheS8w7AIPT5eybuj0Hm91SA7vcaEWD1OR4q9/AkVvSoKCDzoOwG7RpwCPV72eL1bpUW84mgBvfTRSr1hank9wSMpPXtjUb3BQBq8d8kxvfdwHb11cyA6SnMPvZ5AiTxaNZQ8+6DWu2KMGDwJqV841NnBu/bP0rw1kw+8Tp5SPZk3Az0OdMS8iptgPFjmQ7xPkbO7LroIPcO6j72hsE48NOY9PWfcZLyQv2E7Sc5yvB66d7yCoUM93JV6vNhbzbwFB/y80F5MPf0KUT3vLS89Kd0SvPjwRz2MxvA8+YFpvTYwiryYPse8suiWOhzk9jy0AAM9ZG+ePMCUIb1JMHe8kfwyPRnsArw7Ces8w4bhvM/xE73XQIS8IGlfvezAgzzR3FU96OGNvOdVurwlF/i8Jwnruyci2Tyxpsw8EdbIPALVdD0EDTi9UDTkOwzTE7whX4+8FJlqPNoXOj0LzF49UK6GvQ9KMj3PVxi9fCNiuxaEEbzCdbA8ADsjvNJ7mjwXloK9nCtSvfOHmjwimGq7IjbJu1d7HDwykao8YRbovDUFITw56Bq9LnNPO0z7vL1ETxI9GnajPLe0Nr0mYfS7mPVYvGUCzrzp15S8GoMfveHBdDxObQa9vx1AvS7NBDw1tT+9cl1gvV3i+DxY3NO8Tz6CPcQHDr0aIZY8HKKCPEjxkTxM/DC8MgylvWKeHDwBMAm8RK4yPfx5Er1/Kmi82vbQPcfhurz0ude7Ot7Muse8Ab0PhQw98csxvO1VJDzbYqq8ejUtPSuiEzySvHa9l/bxPHy/RD1sas88kYObPAtfFb2U2ry5NIMUPMIp0LymPga8Fk2RvU8GmDzaRQc84MVsvFXvoTzLlc48gL7IPX0JpjuhUWw8CnQOvInYQDyGq2S6nHn/O9yZOryyfhS82YVavLzyoLzeXYO80OuiPKgYYLxyPz091c9DPK1PgT0BStg8X+9cvZ0rsjzWsB49v0FPu5BDu7x2mVg53IMcvVEsuDwM+lm9zt1wvDryS7yXRAS9DFisPMtS1LpkzPw7s4xjvX8CujyEKJu88BiFPREyJ7pYNhI8dUWAPE73izzZLty8RTJUvDeqAb3Zds+70ArCvP+C4bxrggK9a8FRPWmcuLwt8vC6oNNOOoMSbzu31jK8w0PaPMhMm7vRoSY9ThIZvf+YBT3EcEA9K+EivJl0Ub3aN4u9N1IAPUcuoj2k3mg9ms5YPW0B0rsN7go79Xg/PC23pbzYgQI9AADbPOtdMrxFd7O8eGvzvGRoFT32/uO86pw/Pb1bHT2RBUc73UzMPL9Xs7ymD6e8TXwLveo0Lj3lYYm85khRveav9DxMAdo7WTfPO5NDk7zMN+q8OnDFPLNu4DkYVWs9DOODvXDn27zeq+a8CtYsvYWRQDxO8Qu7rOXoPDKHSDxgvlS9/EbLPMpqtzse1zK8pmbPPG9wNrpFF5W8eCc5PaZSAT2a3X29sKqoPE0sIb3x0eW8G1RaPDm7SDzRcbA7h2RTP
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":481,"e":540,"m":1778355614589.1711,"t":"id: toolCallId,\n tool: PAGE_OPTIONS_TOOL_NAME,\n args: toolArgs,\n }),\n ),\n );\n const startedAt = Date.now();\n try {\n const result = await executeAiPageOptionsPatch({\n request: input.request,\n payload: input.payload,\n patch: pageOptionsPatch,\n });\n const toolResult = {\n action: \"update_page_options\",\n documentId: result.documentId,\n pageOptionsPatch: result.patch,\n meta: result.meta,\n };\n controller.enqueue(\n encoder.encode(\n toSseFrame(\"tool_result\", {\n id: toolCallId,\n tool: PAGE_OPTIONS_TOOL_NAME,\n ok: true,\n ms: Math.max(0, Date.now() - startedAt),\n result: toolResult,\n }),\n ),\n );\n controller.enqueue(encoder.encode(toSseFrame(\"assistant_message\", { text: result.assistantText })));\n controller.enqueue(\n encoder.encode(toSseFrame(\"completion\", { ok: true, text: result.assistantText, steps: 1 })),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n controller.enqueue(\n encoder.encode(\n toSseFrame(\"tool_result\", {\n id: toolCallId,\n tool: PAGE_OPTIONS_TOOL_NAME,\n ok: false,\n ms: Math.max(0, Date.now() - startedAt),\n result: { error: message },\n }),\n ),\n );\n controller.enqueue(encoder.encode(toSseFrame(\"error\", { ok: false, message })));\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",","v":"Q+5xO8r47zuZgbu9UXinvd3gtz1s2AO9e5PHvLB3lDt2Q+K8iIXJvZMiaL2yaRg9LSu1PRHhKD1TTYg9Za8lvTi5NLy1cUi9DOt3vE8jGj0meZI8cQCFvLipaj2cwrW8iq+cPbzEOj0ylGO71/t9Pc39Db0XnBg9rYnKPHsnPrxO8FE9eucnvQzlGL0tsuY7GPX2O9au5rxBIjy9yiAJPHfc1jzUkfM8jGSiOyRBLL1Jc0M9bDErvb6MxD26pQY9F0ojPYzpar1BvJA8zwa4vNAAsTynAJ282HbvPdb1gT07r/S8lzEOvZYFBDxcYYS9jiHnPO4chz2Xzy880YDrPDNzkj2KxMe8iqTwvMRqBD0yxiC9SM4DPARvDj1fuLQ86s+Zu/FKkjzDabS8vsSqPPymyrzZFO28jlmRvAazPTyL24i9sok9vd2XMD36jdO8wvT5PD09nryHXXa9K7HQPC+eO72aWHQ9MEEoPPiiVLx4yD29VIMPvZCgqLyKuO47Kwd8PL7Bvjw9L5w8A/KWPFqZSrvlwt680j7svKNRULyZjkq8s8nDPSDUB713+jq9Tfw1u+Gd+7tuTa28yYm9O7kmTL0riYe9PcMhPRaemLxzWv480AmHvKg/o7waWsw8vmQ0vX1yibu3czC6MRmzPdrOnj34nGg9WgxBvVMn5Tw1i8W8tJguvTYhHbzp+IK8Eh98Oof7+jwVoyw9/YRwPYClS73XKvW8XARmPast9zpwRli745wUvQV5P724pDq9g/D+PC/R8bw5geQ875Wru8oS9bwWwvQ6ywxZO2gkrjvJZyQ9eTQSPIipnT0CDoE8QENCPQUG/Twen0I9ShwNvEEGXT0Y3TM9OooPvR4zVrkmunc80dJBvUBK2bzWYYA8yb0Ova64qTzg+ba9XIQ4vVnHzTxQL7I8zMKnvUTyujxBl5I8mOIevRie87oHTe28bPy2O4f4M70Q+BU9sYAPPDKSXby/LEG79rFvvCCd0bxqbFI7aYeavZgfx7w2RZ+9pMi5vAiu1zwkdwq9oCFfvIm+OjzxDGy8xXokPSMQCL26FA073uHsPI42mTzvulU8GcONvcaAjLyTNZ28olRlPbVlNL0yDjE87v7FPZ7MLjuMOOG8O8UlO0AGhbxuF5k8+BOKPFhkc7uO/6W9WRKhuza4sjxeXF29wQoCvM3/TzwbnCY9clWBPUvSqLy2tmM8fGC8PAJAB73vsIi8CDlqvXHQKzxfY1G85OQQvRg4Yj1/ghG85ragPTUzsbsQAiQ9vxofvPGgXD3r+f28knowvRwXCryfkp28l3qivIu5KL3hvhm8jc2DPc75i7wyOcI8BWiEPRxUGj3CVDo9ZdTIvJZUhLuNyLu8gREcO0IGSLyr5bI7av6YusMzDz25B/y8aDdevZ6zrbzyXA695MPJO7lbI7xUfIy66EpGvZ/jGD1s3Ig7TuSdPc9RsjsJWOM8wSapPLlu3zwJmw29eeh+vJgkJL1i2TI8TIIrvAt0BD3QOUW9oxupPEAeub1ngna8UcocPCmabTv645E7J/+ZPC4/+LvF+qw9mC8uvRW0ejzbbiI8v7rcOnsMHLx8DgW9sd9pPHanez17E1E99f9QPfYvRzymJyO8nOREPWhN4LuP2+M8RbMMPEQdL7326Na8WymdvLGgdLvjApK8yWPIO1vlZbs+vcq8cFYZPTrMxrwuAG88DWAEvcM+CzxKDYi8RXmNO5OgWDytWpY8+jiTPG1SFj3N6m69dCarPByxnzxzAIE9o4QLvdK7hrxHCSG9yWb9vLYhE7sHm8u7q/SIPfSMaDx0HPs6RE5SPUIzVbwtEZE80lMaPaXGEr3GmhW9bjhEPeKwOj2FT
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":529,"e":588,"m":1778355614589.1711,"t":"} finally {\n controller.close();\n }\n },\n });\n\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n \"x-mnote-ai-execution-owner\": \"mnote-cli\",\n },\n });\n }\n\n const run = runMnoteCli({\n userId: input.userId,\n userEmail: input.userEmail,\n userName: input.userName,\n payload: input.payload,\n });\n\n if (!input.payload.stream) {\n const result = await run;\n if (result.code !== 0) {\n return NextResponse.json({ error: result.stderr || \"mnote-cli 执行失败\" }, { status: 500 });\n }\n return NextResponse.json({\n ok: true,\n bridgeOwner: \"mnote-cli\",\n text: result.stdout.trim(),\n });\n }\n\n const body = new ReadableStream<Uint8Array>({\n async start(controller) {\n const encoder = new TextEncoder();\n controller.enqueue(encoder.encode(toSseFrame(\"ready\", { ok: true, bridgeOwner: \"mnote-cli\" })));\n try {\n const result = await run;\n if (result.code !== 0) {\n controller.enqueue(\n encoder.encode(toSseFrame(\"error\", { ok: false, message: result.stderr || \"mnote-cli 执行失败\" })),\n );\n } else {\n const text = result.stdout.trim() || \"mnote-cli 无输出\";\n controller.enqueue(encoder.encode(toSseFrame(\"assistant_message\", { text })));\n controller.enqueue(encoder.encode(toSseFrame(\"completion\", { ok: true, text, steps: 1 })));\n }\n } catch (error) {\n controller.enqueue(\n encoder.encode(toSseFrame(\"error\", { ok: false, message: error instanceof Error ? error.message : String(error) })),\n );\n } finally {\n controller.close();\n }\n },\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/mnote-cli-agent-host.ts","s":577,"e":600,"m":1778355614589.1711,"t":"controller.enqueue(encoder.encode(toSseFrame(\"assistant_message\", { text })));\n controller.enqueue(encoder.encode(toSseFrame(\"completion\", { ok: true, text, steps: 1 })));\n }\n } catch (error) {\n controller.enqueue(\n encoder.encode(toSseFrame(\"error\", { ok: false, message: error instanceof Error ? error.message : String(error) })),\n );\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n \"x-mnote-ai-execution-owner\": \"mnote-cli\",\n },\n });\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/sidebar-data.ts","s":1,"e":60,"m":1776916598549.44,"t":"import { randomUUID } from \"crypto\";\nimport type { ConvexHttpClient } from \"convex/browser\";\nimport type { FunctionReference } from \"convex/server\";\nimport type { SidebarInitialData } from \"@/components/sidebar/types\";\nimport type { DocumentRecord } from \"@/lib/documents\";\nimport { api } from \"@/lib/convex/api\";\nimport {\n mapSidebarDatasetListQueryResultToInitialData,\n type SidebarDatasetListQueryResult,\n} from \"@/lib/sidebar-data\";\nimport type { WorkspaceSummary } from \"@/lib/workspaces\";\nimport {\n attachKernelFileTreeProjection,\n resolveKernelFileTreeProjection,\n} from \"@/lib/server/kernel-file-tree\";\nimport type { AuthContext } from \"@/lib/auth/types\";\n\ntype LoadSidebarDataFromConvexInput = {\n client: ConvexHttpClient;\n auth: AuthContext;\n fallbackName: string;\n requestedWorkspaceId?: string | null;\n};\n\ntype LoadSidebarDataFromConvexResult = {\n workspaces: WorkspaceSummary[];\n activeWorkspaceId: string;\n targetWorkspaceId: string | null;\n sidebarDataset: SidebarDatasetListQueryResult | null;\n sidebarInitialData: SidebarInitialData | null;\n documents: DocumentRecord[];\n};\n\nconst sidebarDatasetListQuery = ((api as unknown as Record<string, unknown>).sidebar as\n | Record<string, unknown>\n | undefined)?.datasetList as FunctionReference<\n \"query\",\n \"public\",\n { workspaceId: string },\n SidebarDatasetListQueryResult\n>;\n\nexport async function loadSidebarDataFromConvex(\n input: LoadSidebarDataFromConvexInput,\n): Promise<LoadSidebarDataFromConvexResult> {\n const bootstrap = await input.client.mutation(api.workspaces.ensureDefaultWorkspace, {\n fallbackName: input.fallbackName,\n workspaceIdIfCreate: randomUUID(),\n });\n\n const workspaces = bootstrap.workspaces;\n const activeWorkspaceId = bootstrap.activeWorkspaceId;\n const targetWorkspaceId = input.requestedWorkspaceId?.trim() || activeWorkspaceId || null;\n\n if (!targetWorkspaceId) {\n return {\n workspaces,\n activeWorkspaceId,\n targetWorkspaceId: null,\n sidebarDataset: null,","v":"Xw30PKGcij0G3vK9yRiRvZosuz21ihW9uHbxOM++kLwrEos8serqvDBVXL1FT1Y90M23PTOgTr1uF6E6XTSVvZRZEzzR0XK9h9T1PMyZnjwQBYa8pPRavS6+1zyWnVK9WHuqPV6egjxTb5c8BJ1TPB3bBr1OBs88FZcYvJcoLj3uSUE7dAi1PM0xjr30e2y7ZCmsPJLfpzxokVk7sngCPSD0FL1pSbw8L7fovPjLALw9yg09pKWLvDNlRD1ADYK73nulPUrYqb3ERDs97eUFuxvM9DyK3QU893fYPY81vjxMFBO9CSSZuWtVBz1EQhK97JukPMVxjz1FP5g83Ba9PRwUaj2Q0Yy5zBi0vKyHlz1+f9W8YqagPMirIz1uihM9U/MqPa9fRL1GVGa9RhASPenZ8TuZjFe9utGDOgk1BjyvmGS9FId+vFuUGDtlHYQ8UI6BPdv4BTuOX6C9m6SHvQ7U+7zDvVA9VBMLPesagr1svQw7197bPKaJk73bTrQ8kvbjvI2yvjzioUC7qQIAu9vZnjrspjC9MM//NwH6TruzFv67bF8OPTzHIruZWmq8hqVMvCIaK73/mhG8FHtrPWgTfr337D+9HgsWPc/wG72w8uy8L7sNOUVOWDwsXio9Z+6vvEMtUr3fZTy8H6sAPbSoLj2dyeo8xtCwu/tlBj1WSYM9K0uBvWyGIr1nKQS8C2ULvVbaDT3dix09bgNUPZXRE73aFI28WHO0PPgy0Lw1lao8LpRtvDhvL71z44o8aEiYO4DhTL1SvGw9cRgLO0pBKbx8Ybo6002EvXeCOz3nSpk8c9N1PXUUAjz4iva8iWZ2PULtZDrH0H07bonHuzJWUD3SBIi73H0SvWxLNz0Npx+7n/MHvYNzizwa06I8Dfn2PJkriz2NW6K8/AkFvaj367zedwq9yP2QPPYp7TwVAV48jIXJOwCpFT296VK9dzDsPC2Jdr3j1sY76q3APFtCNbyes+u7Toi/PFLZZrzepva7wYVUvWbxOzwJTeu8uSRlvLsL1bsnPPe8buW+vcfSMT077c68wOcYPcqbML2G0N67sDSKPIC+wzwMIck6yUx1vYqIojv8Hfm8EOVdPE9LCr3EWyw9Y0WsPYRpArz18LY88SFAvLCgmLxqQSc9IHHWvG+iVDqcCES8DcVSPRgK+TwdUmW9+kmKPEdAGj3SnoA9LyKGOeO3dL1S7IA8/t9iu54ooLx5PUO9fZxtvbEcNzyitQk8ptqwO2AcHrwU9p88BqR+PSKkSbxCu5O8BEG8vIBwGD0AJ4O9X7P0vFLngLyzj8m6sUxBvVfyy7wsYlU8j2jAPFRz0rxQe5U80zTOuqEfMj2YnR68tZ6ivXbGxzterBa93BaJOs6za705zak8vyIevMzPBz0sTAi9yF9ovI0F+bxeCQS9RX2xPNPR0blMnO887bJHvHa4QDx5SP28NE0rPXTPKD1M4Vo7aaKUu2qMZLlyQBK9GQQUvekWqb3ZYBu9Z6BFvSLLnzuxUMK8987MPAzrl7uqo3S7of20PILEXbw1ifM8DorcPCOt0ryJfXI9GqoiOwT4rrv6IUA9pIcqPBFbhDu3rxG9pdZDO73duTxxkqE91VGIPaQgUbzjToi8PRgqOw7rR730gIW7vJH6PPRg5rwpmUq8lrLZO3P2Uj2K/IO8+5D6PNGwgzsBDCc76D1oPPyAQL1DMoS9Z+AWvdmtM7xMlEG8Pj4uvNXoqjyVnHW85dvmuV4qozvWv9W8cng6PXgLrrnluvs8zaB/vbIbmr1J19e8kY38O/WJ7DxEnrq6ruHwPGtE+DyrW329iC9BPXnrZTx5Ajm9XugaulAr+jtIQYC9iptZPWOcPz2hGTa9yCgAPcqMsLy1E9M7NOJ7vOyjHDzuXsU8T2IkPS
|
|||
|
|
{"p":"wolai-frontend/src/lib/server/sidebar-data.ts","s":49,"e":99,"m":1776916598549.44,"t":"});\n\n const workspaces = bootstrap.workspaces;\n const activeWorkspaceId = bootstrap.activeWorkspaceId;\n const targetWorkspaceId = input.requestedWorkspaceId?.trim() || activeWorkspaceId || null;\n\n if (!targetWorkspaceId) {\n return {\n workspaces,\n activeWorkspaceId,\n targetWorkspaceId: null,\n sidebarDataset: null,\n sidebarInitialData: null,\n documents: [],\n };\n }\n\n // 说明:SSR 首屏阶段必须优先保证“可进入页面”。\n // mnote-web compat sidebar 仍处于渐进接入期,若这里优先走远端/Rust 兼容接口,\n // 一旦 actor/header 权限链不一致,就会把整个 (app) layout 阻塞住,表现为“登录后进不去页面”。\n // 因此服务端首屏一律先走稳定的 Convex 直查;mnote-web 仅允许用于客户端树壳渐进增强。\n const sidebarDataset = (await input.client.query(sidebarDatasetListQuery, {\n workspaceId: targetWorkspaceId,\n })) as SidebarDatasetListQueryResult;\n const syntheticRequest = new Request(`http://127.0.0.1:3000/api/sidebar?workspaceId=${targetWorkspaceId}`);\n const sidebarDatasetWithFileTree = attachKernelFileTreeProjection({\n dataset: sidebarDataset,\n projection: await resolveKernelFileTreeProjection({\n client: input.client,\n request: syntheticRequest,\n workspaceId: targetWorkspaceId,\n actor: {\n actorType: \"user\",\n actorId: input.auth.userId,\n sessionId: null,\n },\n dataset: sidebarDataset,\n }),\n });\n const normalizedDocuments = (sidebarDatasetWithFileTree.documents ?? []) as DocumentRecord[];\n\n return {\n workspaces: sidebarDatasetWithFileTree.workspaces ?? workspaces,\n activeWorkspaceId,\n targetWorkspaceId,\n sidebarDataset: sidebarDatasetWithFileTree,\n sidebarInitialData: mapSidebarDatasetListQueryResultToInitialData(sidebarDatasetWithFileTree),\n documents: normalizedDocuments,\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/record-recent.ts","s":1,"e":15,"m":1773495901125.8638,"t":"export async function recordRecentPage(workspaceId: string | null, documentId: string) {\n if (!workspaceId) {\n return;\n }\n try {\n await fetch(\"/api/search/recent\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ workspaceId, documentId }),\n });\n } catch (error) {\n console.error(\"recordRecentPage failed\", error);\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/request.test.ts","s":1,"e":60,"m":1777380064855.8035,"t":"import { describe, expect, it } from \"vitest\";\nimport { SEARCH_REQUEST_TRANSPORT_CONTRACT, buildSearchRequest } from \"./request\";\n\ndescribe(\"buildSearchRequest\", () => {\n it(\"combines标题过滤与时间范围\", () => {\n const payload = buildSearchRequest({\n workspaceId: \"ws-1\",\n activeDocumentId: \"doc-1\",\n query: \"demo\",\n filters: {\n titleOnly: true,\n exact: false,\n onlyCurrentPage: false,\n includeOcr: false,\n timeField: \"updated\",\n customRange: undefined,\n },\n timeRange: \"7d\",\n });\n\n expect(payload).not.toBeNull();\n expect(payload?.filters.titleOnly).toBe(true);\n expect(payload?.filters.timeRange).toBe(\"7d\");\n });\n\n it(\"自动重置仅当前页面过滤条件\", () => {\n const payload = buildSearchRequest({\n workspaceId: \"ws-2\",\n activeDocumentId: null,\n query: \"\",\n filters: {\n titleOnly: false,\n exact: false,\n onlyCurrentPage: true,\n includeOcr: false,\n timeField: \"created\",\n customRange: { from: \"2025-02-01\", to: \"2025-02-07\" },\n },\n timeRange: \"any\",\n });\n\n expect(payload?.filters.onlyCurrentPage).toBe(false);\n expect(payload?.documentId).toBeUndefined();\n });\n\n it(\"固定搜索请求将由 Rust Web search.documents transport 拥有\", () => {\n const payload = buildSearchRequest({\n workspaceId: \"ws-3\",\n activeDocumentId: \"doc-3\",\n query: \"Rust Web\",\n filters: {\n titleOnly: false,\n exact: true,\n onlyCurrentPage: true,\n includeOcr: true,\n timeField: \"updated\",\n customRange: undefined,\n },\n timeRange: \"any\",\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/request.test.ts","s":49,"e":86,"m":1777380064855.8035,"t":"activeDocumentId: \"doc-3\",\n query: \"Rust Web\",\n filters: {\n titleOnly: false,\n exact: true,\n onlyCurrentPage: true,\n includeOcr: true,\n timeField: \"updated\",\n customRange: undefined,\n },\n timeRange: \"any\",\n });\n\n expect(payload).toMatchObject({\n workspaceId: \"ws-3\",\n documentId: \"doc-3\",\n query: \"Rust Web\",\n filters: {\n exact: true,\n includeOcr: true,\n onlyCurrentPage: true,\n },\n });\n });\n});\n\n\ndescribe(\"SEARCH_REQUEST_TRANSPORT_CONTRACT\", () => {\n it(\"搜索请求 contract 固定为 Rust Web transport\", () => {\n expect(SEARCH_REQUEST_TRANSPORT_CONTRACT).toEqual({\n shellOwner: \"mnote-web\",\n queryName: \"search.documents\",\n endpoint: \"/api/search/documents\",\n runtimeRole: \"rust_web_transport\",\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/request.ts","s":1,"e":46,"m":1777380064855.6667,"t":"import type {\n DocumentSearchFilters,\n DocumentSearchRequest,\n DocumentSearchTimeRange,\n} from \"@/types/search\";\n\nexport const SEARCH_REQUEST_TRANSPORT_CONTRACT = {\n shellOwner: \"mnote-web\",\n queryName: \"search.documents\",\n endpoint: \"/api/search/documents\",\n runtimeRole: \"rust_web_transport\",\n} as const;\n\ninterface BuildSearchRequestArgs {\n workspaceId: string | null;\n activeDocumentId: string | null;\n query: string;\n filters: Omit<DocumentSearchFilters, \"timeRange\">;\n timeRange: DocumentSearchTimeRange;\n}\n\nexport function buildSearchRequest({\n workspaceId,\n activeDocumentId,\n query,\n filters,\n timeRange,\n}: BuildSearchRequestArgs): DocumentSearchRequest | null {\n if (!workspaceId) {\n return null;\n }\n\n const normalizedFilters: DocumentSearchFilters = {\n ...filters,\n timeRange,\n onlyCurrentPage: filters.onlyCurrentPage && Boolean(activeDocumentId),\n };\n\n return {\n workspaceId,\n documentId: normalizedFilters.onlyCurrentPage ? activeDocumentId ?? undefined : undefined,\n query,\n filters: normalizedFilters,\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":1,"e":60,"m":1776341732431.2847,"t":"import \"server-only\";\n\nimport { api } from \"@/lib/convex/api\";\nimport { getAuthedConvexClient } from \"@/lib/convex/route\";\nimport {\n buildDocumentBridgeContext,\n buildDocumentQueryEnvelope,\n DocumentBridgeError,\n} from \"@/lib/documents/bridge\";\nimport { executeRustBridgeQuery } from \"@/lib/documents/rust-runtime\";\nimport type { DocumentSearchFilters, DocumentSearchRequest, DocumentSearchResponse, DocumentSearchResult } from \"@/types/search\";\n\nconst MAX_LIMIT = 50;\n\nconst DEFAULT_FILTERS: DocumentSearchFilters = {\n titleOnly: false,\n exact: false,\n onlyCurrentPage: false,\n includeOcr: false,\n timeRange: \"any\",\n timeField: \"updated\",\n};\n\nfunction parseDateToIso(value: string | undefined): string | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n const date = new Date(raw);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n return date.toISOString();\n}\n\ntype SearchDocumentsRustResult = {\n results: Array<{\n id: string;\n title: string;\n snippet: string;\n updatedAt?: string | null;\n createdAt?: string | null;\n matchField: \"title\" | \"content\" | \"recent\";\n hasOcr: boolean;\n publicPath: string;\n score: number;\n nodeId?: string | null;\n subtreeRootId?: string | null;\n evidence?: Array<{\n kind: string;\n nodeId?: string | null;\n snippet: string;\n }>;\n }>;\n enqueueAssetIds?: string[];\n};\n\ntype SearchRecentRustResult = {\n items: Array<{\n documentId: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":49,"e":108,"m":1776341732431.2847,"t":"evidence?: Array<{\n kind: string;\n nodeId?: string | null;\n snippet: string;\n }>;\n }>;\n enqueueAssetIds?: string[];\n};\n\ntype SearchRecentRustResult = {\n items: Array<{\n documentId: string;\n }>;\n};\n\ntype SearchDocumentRow = {\n id: string;\n workspace_id?: string | null;\n title?: string | null;\n raw_text?: string | null;\n created_at?: string | null;\n updated_at?: string | null;\n};\n\ntype SearchMindmapRow = {\n document_id?: string | null;\n data?: unknown;\n};\n\ntype SearchTableRow = {\n id: string;\n document_id?: string | null;\n title?: string | null;\n};\n\ntype SearchTableContentRow = {\n table_id?: string | null;\n document_id?: string | null;\n row_hash?: string | null;\n};\n\ntype SearchAssetRow = {\n id: string;\n document_id?: string | null;\n asset_type?: string | null;\n file_name?: string | null;\n mime_type?: string | null;\n ocr_text?: string | null;\n ocr_status?: string | null;\n};\n\ntype RecentRow = {\n document_id: string;\n workspace_id: string;\n last_accessed_at: string;\n};\n\nfunction normalizeWorkspaceId(workspaceId: string | null | undefined) {\n const normalized = typeof workspaceId === \"string\" ? workspaceId.trim() : \"\";\n if (!normalized) {","v":"dTeCPbVMvTyjPRW+xxvovYEGrz1kK9+8mNE9PO1/JD3m7/08P2tGvcQ+H70bd2s8YhG2PYp5/TzxLpK89ZSOvWccDb2GLDC93ydjPMZQqjw92n86QKCCu8qgyDkaXDC8Avo7PYlKRT1wsu06hL5BPbjzpLxo8a88HwObPMzVtTyX3A097LvROtRouL3a5ke9dXxiPbp3+jyDZhE9TiGxPDgRH7wWpi49b/9fvAG0c70IyUk8u5kGvRIInD3sfEQ99Y13PaHFeb0M3eI8fuiLvW32sz1P1Lw6BwsAPh092zwbOhC9KpEOPGANtTz2r028Pm3dPN5VcT3sWHO9fa0bPfVy0zoHzfS83tArvbMogTtKGRi5sGEOvQwRXz36lKS7PUIwPHKq1rtOaDi9v8KMPaImgLz/SDI5pAUwvTRkyTwkGa88/Ebyummgljw7+8w8E9JSPUs4QL1nPQK8TdE9vU3AKLtks6A9HW9fPXMMo7yT05W81TECPJJ0/Lyrk4Y9xiWqO8GhuTvdvCy9o5IVvEBFF733Pn68F7MDPX+rrjxUAKq8EWSDPSx7tbwnckQ8xQ6cvdIUS71NlKW8uwyBPfHUab0i6AA7bU6WPD9eir1lAuo82Ct2vG6SMLwQjn88tSE9vff4KrxLzjC8+kuSPUUTTTtKz1u8QYz7u8JV7Tqwp0c6MxNsvWlVYL1V5bG8msYYvQezT7qp3DU9tXbgPPaSu7xey9C8lMdCvI6Lu7vIYyE8DgBDvNOHIb0HfCi9NbQsPZJRxrwZ6IQ9Ik5HPNRIA73OtQ49jblCvboyDj0gfha8X8KBPJXfYDv5Jm+8GL9ePPxmU7sfBqw86l3Vu30QMT1J8z48gRDCvH3lDj1aOQS9AgBnuz1jGjxeBR89I4PYu7qGzTyETZi9KYC+vO0wfrt2B6i8Goc7vD6jl7wQuTQ90bwtvWrZCj18gwW9J33OvDHgBb3DbsE8atzBvGW/wTxEHBW9WCHqPHuiSbyu0mU8csYqvd/rjL0s/ti8W4s3vTwK3jwtXNa8kGqqvYkMpTumiqa7CPUVPfaIqLxjoB28aAMlveGHybyS9Ym8YBwxvaq9jLw/IsC8Etv7PPh+Ib3Dyv08cSusPXzO6zt85Ik8mir/OzRNwLu2Sn07EO8BvZA5v7uvyoa9qJa+uzwzFj0SeFG9/Al9PCjQCz2rhAg8VgR7PeN4ML1JZGs79Lssvd95Qr0qel29zh6VvfhshjysKso8NSZBvFKi2DzFqwY9nJXWO39wLj1T6ta7zOwuvTrl9TzhnZO8gVoevRtSJj173x68IKRfvT+roL21mIk83usTPT9eA73YUso8yfokPb6KPT2OCJ48Za0QvQFsn7zlPRG7tj0dPZoFm7zOGgc9axO3OyVl0DyNC5K7rOGNvT03bL0oIHi9bclauyUu3js8RwQ9HSwwO9MIF7zlIfa7yYRzPIkIIT2ox8w8qPqgvBX21Tysaqu8ZpMzOwraC7242Yg8OaWHvaA1njyn9UG9n50+PU87d7xe3CK9CeguvVLBbzxbzIM8IGyPPJY9n7vgfI49xnyou6K8pDy3+QI97RjMvOkLn7vFrxu9qHqFPKZuWT2i/5w9dLJEPYt2CT1og3274Q/mO1snjr2tUf08BBdGvE1+vrx20R683IOtuj0E9brkFLa8WZkyPWGPWDyrylQ8vKTVPMWbxryIPZu8OMU3vT/Jezy5kA28i6jOPFFjDz3pbOy7cfUXvGEs+byouYM6UStoPV1VmjzFge07PGN1vF0jGr22bvg8NSazOrjlYz3Y7yS7louBPfysoj1F7G287uqEPa7NBr3L5X878N+RPUsJ/rymrjC9O8WWPVjuPT0JE687hVniPFb30blc6aw7IS9/OipzWz3gI9Y8SzdRvKXVpLvzKqi8k2sVPdn+QDtGHJY8Jwk3vaNixryA96o8B4cwPe/dTTxc6w09XZwdPI5Plrzu/l874D43vW4vIj2VKak7SfeiO86ZlL0NRgI9QRnnuzsbgLwkfKw914FivX1JhD1UZ6c8YCyUu/9+wbvLqb07nuvVvGrx1Tzkd+o8Euh/u7AdYTxarJG9HJEQvRdl+DuFqIi7ivHAvKp/mjz1Dwg8UpqwPKPJhr0exHc76MNDPYL4hbwrxKE8EH3sPPPvFL1nroy8xfM7PT0nCL264pk9OrBQPA2POb1Hz1O9hJLDO5T0lDsCKJc9MxmfPCrif7uj1y69w3cTPSNh9zuLe+47wVppu7iU6jxldgs9rH4APZh6jD3JePq6sRe2vRpyyjyJs6k8Z7WUPWQCmDwKSGY8qPS2PGm8jzx2c0s9sDjwvHyThj1j9ZU83BBJvVd4/Dx/5hG8nWJzPOpOQj2dkrQ8Gv8RvVICK709ojg9CQStu5IRNT35d3k8wM7IvPOP8T1vgmC9OSJBvS2wuzzfZBW71AKavA0Y8zc1x1k8phUlvSYynzzgYbO8J9MmvVaSvjvKJgO90E8wPZ6Aaz1A7eW8CJgvPEskIj25hFe9qT8SPQ0LwDxzIMa8qj3sPF6fybyG6h89qawpvCFEeb1daVy9BTFYvbRHML1fYq08RQ+Wu1fKbbx/afk8G5/COnsBZT0ljvq8psKNO6bhmbx9kZa9I9cMvSGoUrwrrrQ8XokFvL79Vrqhg9281CzQPGJtQrqC2C06xlBSvDf+i7zL+N48cAalvS/Y3bz6dmi8
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":97,"e":156,"m":1776341732431.2847,"t":"ocr_status?: string | null;\n};\n\ntype RecentRow = {\n document_id: string;\n workspace_id: string;\n last_accessed_at: string;\n};\n\nfunction normalizeWorkspaceId(workspaceId: string | null | undefined) {\n const normalized = typeof workspaceId === \"string\" ? workspaceId.trim() : \"\";\n if (!normalized) {\n throw new DocumentBridgeError(\"缺少 workspaceId\", 400, \"VALIDATION_ERROR\");\n }\n return normalized;\n}\n\nfunction normalizeQuery(value: string | null | undefined) {\n return String(value ?? \"\").trim();\n}\n\nfunction normalizeLimit(value: number | null | undefined) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return 30;\n }\n return Math.max(1, Math.min(Math.floor(value), MAX_LIMIT));\n}\n\nfunction normalizeDocumentId(value: string | null | undefined) {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n return normalized || null;\n}\n\nfunction normalizeFilters(input: DocumentSearchRequest[\"filters\"] | undefined): DocumentSearchFilters {\n return {\n ...DEFAULT_FILTERS,\n ...input,\n };\n}\n\nfunction mapRecentRowsToResults(input: {\n documentIds: string[];\n docs: SearchDocumentRow[];\n}): DocumentSearchResult[] {\n const docMap = new Map(input.docs.map((item) => [item.id, item]));\n return input.documentIds\n .map((documentId) => docMap.get(documentId))\n .filter((item): item is NonNullable<typeof item> => Boolean(item))\n .map((item) => ({\n id: item.id,\n title: item.title ?? \"无标题\",\n snippet: \"\",\n updatedAt: item.updated_at ?? null,\n createdAt: item.created_at ?? null,\n matchField: \"recent\",\n hasOcr: false,\n publicPath: `/documents/${item.id}`,\n score: 0,\n nodeId: item.id,\n subtreeRootId: item.id,","v":"YYSiPDMmkLzoRw6+65TOvTpojT15JN28bHpDOzr9kzwVhws9hxphvbJe/7zHtWU9G6HIPYD4lzkSnAY9Wl9QvQIg4bxb5my9fsqeO6u+jDxLsfU8AgKXPMPrLbyrLKM8UjXYPYHhkz2fXze8Uv8ZPXJknb0FITA9YR4GPbssdD00U/I8iQv3vKVzbr2fBMu8ZGeGPdHBszzYMv48nDDPuqounjuk+eQ7fZiHPHhIX71T2g09Re0Gvfq8RT19pMo88+63Pe5scL1YZFE7UM7kvNRoWz3qja08W9zNPVmCGj0wDHK9ee+PvA5NyDu4sZM7bCVuPJVorD0UqCe9Oa2RPRqU8jwCwCu9uqHIvFOmwjx6z4u43orEvEeEtzwMnH260+JWu715IrxWq5C9A+EqPao1Ab0l20S9MBuUvITjbT2BX2U7u8OxuohhcD0z7jQ8uVFjPSlRH7yvedU8ROSfvGsuGr0iz409tKloPXeXXLt40R29sSwQPBVeo7zlaFA9IgxTO6di4Txc4xm9erxTve/6Trvl56m88CgrPAZUb7vHfBw8ueV/PRoc5jvOIFS8mzRBvaRHTb1s7DS91VyAPQRe6LyH2Y28OGpvPGs8b727Txc9lSZzvEBhG71HpAw9c+DBvKje2Lwq3OM8U238PFOPJD39c8o8KDSiu7Kf6zqokWE9U0srvUgqNr1E4Fg8OKGuvCZITTy27h88SgpIPRXUdLwLipY5ziCcvMvtP71riUc9jfGovNEHIr1uDgK9D5/rPBORcL3bBmw9LgSJPKXt6zz3pZm8xJWUvF/5t7olj428//gUPIqtFLyY+xe9Dqr+O57virvbHNS7+7nGO+DkNT0fhGM8UNC9vJCCOD0Heyy9KWFDvW3eyjyzorw895ZXu9r4qDyxIBm9ap+WvUkZtzu7foK9qws+vMmg5bwY2+A8zVeSvJ8Pbj0pn968GlR2O3ZHnb0nnF89VCKPu5OK2bwfAwa95ctZPO/5B70eMJc8b1M+u0AvgL2yWLu8LqdivUnFnjvZvaW8AwOEvao9njyrY1a866b1PPrs1rwJqHc8NV3LOnDXLr1jcx68cMdxvV2cCrtHQJY7p2kPPR4IpLv69cI8dVrBPTyDsrwXRII7uwuJOTqaNrwoXNm6I0vGu0y43LtcxH295IRFPH7XZj05lNu8u/F8PJsvUj3Xt908c7snPU44pL08kxU8nFvOvMNl1LsqO1S9GSKZvYTF6Dx7OVU9/hwEvVQr1jsh80E9j59VPYtNWzzwiVG86d18ugbHsjw1ezk8C70TveSQfztGcya62fVKvfY0k7ycHim8w7ALPUCoTbxF1Rc8+4CRPGpriT2aD6Q7qoaovLqvIr1LyB29dU1buQebobyElIA8kqvGO/9zbT2o8QW9pTNyvfM2N7xD10e99c5IuiQQBj3Mh6c8SEGsPNQnNLu0jXS8ncCgPE6KZz3bjZ68O1vnvMWwuTuN30G9fZMdPabITb243+W7y5OPvDL/JTy3iIu931I+PWc3wLvY7m68V4J2PJtMwbvI0Ra8gAdKPbfWh7yGNWQ9oESGvM3aOj3IYzc9cRV8vMm6pbxQY9W8pf3mOxBbMD1IhGU91uM0PfxiBLwdU1C9cpGIPM/Aq7ygkDM9azrtup/TmLxeD6w8tWgBvW24RbvVzsW7wMgbPTGpxTuFGem7yQgVPUFZmTwZJ+m8oxj1vF9OOT3YDu68RhEOvZSnhTzWsQw6z8QqPbo/v7yYBKQ7bAjoPN/g1Lu9iMq7JHgXO+4XU7zNoQU8YmscvAu1HLxnJDY8z9aoPYq9jT3sYqI6koY7PVM0YL12Djm8CrfIPEF9Cb3nrBy9GsepPB1qWD37SLq8fU6qPMc7bbzWkhI8pMwIPc7UKD1peTQ8JuD3PMYX67sOPvw7xx4APfQFe7oWSZG7xtJVvbc3n7wa3oW7v24kPVrG4rxQnjE6eZ3pPEV4jbx834e9WAl2vNrZEj2Riue6JQMRPBiagb31K687hiOzuwYGVzpgV4o9pZuivYT0Rj3aA428WuVouvUmxryGRdc76Gd+vSKuAD3KUoy84aTTO14kBb3trMm7oFZNPFnnMzwvroq7pnvgPK6eYjxDSY68HoXMO9vhf71tOqK8VZYBPTn5UL1PBwo8OGypPDYLFL1L
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":145,"e":204,"m":1776341732431.2847,"t":".map((item) => ({\n id: item.id,\n title: item.title ?? \"无标题\",\n snippet: \"\",\n updatedAt: item.updated_at ?? null,\n createdAt: item.created_at ?? null,\n matchField: \"recent\",\n hasOcr: false,\n publicPath: `/documents/${item.id}`,\n score: 0,\n nodeId: item.id,\n subtreeRootId: item.id,\n evidence: [\n {\n kind: \"recent\",\n nodeId: item.id,\n snippet: item.title ?? \"最近访问页面\",\n },\n ],\n }));\n}\n\nfunction mapRustResultsToResponse(\n result: SearchDocumentsRustResult,\n): DocumentSearchResult[] {\n return (result.results ?? []).map((item) => ({\n id: item.id,\n title: item.title ?? \"无标题\",\n snippet: item.snippet,\n updatedAt: item.updatedAt ?? null,\n createdAt: item.createdAt ?? null,\n matchField: item.matchField,\n hasOcr: Boolean(item.hasOcr),\n publicPath: item.publicPath,\n score: item.score,\n nodeId: item.nodeId ?? item.id,\n subtreeRootId: item.subtreeRootId ?? item.id,\n evidence:\n Array.isArray(item.evidence) && item.evidence.length > 0\n ? item.evidence\n : [\n {\n kind: item.matchField,\n nodeId: item.nodeId ?? item.id,\n snippet: item.snippet || item.title || \"命中文档\",\n },\n ],\n }));\n}\n\nasync function enqueueOcrJobs(assetIds: string[]) {\n if (assetIds.length === 0) {\n return;\n }\n const { auth, client } = await getAuthedConvexClient();\n await Promise.all(\n assetIds.slice(0, 3).map((assetId) =>\n client.mutation(api.mediaAssets.enqueueExtractText, {\n userId: auth.userId,\n id: assetId,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":193,"e":252,"m":1776341732431.2847,"t":"}\n\nasync function enqueueOcrJobs(assetIds: string[]) {\n if (assetIds.length === 0) {\n return;\n }\n const { auth, client } = await getAuthedConvexClient();\n await Promise.all(\n assetIds.slice(0, 3).map((assetId) =>\n client.mutation(api.mediaAssets.enqueueExtractText, {\n userId: auth.userId,\n id: assetId,\n }).catch(() => null),\n ),\n );\n}\n\nasync function loadRecentResults(input: {\n request: Request;\n workspaceId: string;\n docs: SearchDocumentRow[];\n}): Promise<DocumentSearchResult[]> {\n const { client } = await getAuthedConvexClient();\n const context = await buildDocumentBridgeContext({\n request: input.request,\n workspaceId: input.workspaceId,\n });\n const envelope = buildDocumentQueryEnvelope({\n name: \"search.recent\",\n payload: {\n workspaceId: input.workspaceId,\n limit: 10,\n cursor: null,\n },\n });\n const recentRows = (await client.query(api.recents.listByWorkspace, {\n userId: context.actor.actorId,\n workspaceId: input.workspaceId,\n limit: 10,\n })) as RecentRow[];\n const result = await executeRustBridgeQuery<SearchRecentRustResult>({\n context,\n envelope,\n data: {\n recents: recentRows.map((row) => ({\n documentId: row.document_id,\n workspaceId: row.workspace_id,\n lastAccessedAt: row.last_accessed_at,\n })),\n },\n });\n\n return mapRecentRowsToResults({\n documentIds: (result.items ?? []).map((item) => item.documentId),\n docs: input.docs,\n });\n}\n\nexport async function executeDocumentSearchQuery(input: {\n request: Request;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":241,"e":300,"m":1776341732431.2847,"t":"})),\n },\n });\n\n return mapRecentRowsToResults({\n documentIds: (result.items ?? []).map((item) => item.documentId),\n docs: input.docs,\n });\n}\n\nexport async function executeDocumentSearchQuery(input: {\n request: Request;\n payload: DocumentSearchRequest;\n}): Promise<{\n response: DocumentSearchResponse;\n meta: {\n requestId: string;\n traceId: string;\n queryName: string;\n };\n}> {\n const workspaceId = normalizeWorkspaceId(input.payload.workspaceId);\n const normalizedQuery = normalizeQuery(input.payload.query);\n const filters = normalizeFilters(input.payload.filters);\n const limit = normalizeLimit(input.payload.limit);\n const documentId = filters.onlyCurrentPage ? normalizeDocumentId(input.payload.documentId) : null;\n const { client } = await getAuthedConvexClient();\n const context = await buildDocumentBridgeContext({\n request: input.request,\n workspaceId,\n });\n const customRangeFrom = parseDateToIso(filters.customRange?.from);\n const customRangeTo = parseDateToIso(filters.customRange?.to);\n\n const docs = (await client.query(api.documents.listSearchDataByWorkspace, {\n workspaceId,\n })) as SearchDocumentRow[];\n const recent = await loadRecentResults({\n request: input.request,\n workspaceId,\n docs,\n });\n\n if (!normalizedQuery) {\n return {\n response: {\n results: [],\n recent,\n },\n meta: {\n requestId: context.requestId,\n traceId: context.traceId,\n queryName: \"search.documents\",\n },\n };\n }\n\n const [mindmaps, tables, tableRows, assets] = (await Promise.all([\n client.query(api.mindmaps.listByWorkspace, { workspaceId, includeDeleted: false }).catch(() => []),\n client.query(api.tables.listByWorkspaceForSearch, {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":289,"e":348,"m":1776341732431.2847,"t":"},\n meta: {\n requestId: context.requestId,\n traceId: context.traceId,\n queryName: \"search.documents\",\n },\n };\n }\n\n const [mindmaps, tables, tableRows, assets] = (await Promise.all([\n client.query(api.mindmaps.listByWorkspace, { workspaceId, includeDeleted: false }).catch(() => []),\n client.query(api.tables.listByWorkspaceForSearch, {\n userId: context.actor.actorId,\n workspaceId,\n includeArchived: false,\n limit: 3000,\n }).catch(() => []),\n client.query(api.tables.listRowsByWorkspaceForSearch, {\n userId: context.actor.actorId,\n workspaceId,\n limit: 8000,\n }).catch(() => []),\n client.query(api.mediaAssets.listSearchDataByWorkspace, {\n userId: context.actor.actorId,\n workspaceId,\n includeDeleted: false,\n limit: 5000,\n }).catch(() => []),\n ])) as [SearchMindmapRow[], SearchTableRow[], SearchTableContentRow[], SearchAssetRow[]];\n\n const envelope = buildDocumentQueryEnvelope({\n name: \"search.documents\",\n payload: {\n query: normalizedQuery,\n workspaceId,\n pageId: documentId,\n limit,\n cursor: null,\n titleOnly: filters.titleOnly,\n exact: filters.exact,\n includeOcr: filters.includeOcr,\n timeRange: filters.timeRange,\n timeField: filters.timeField,\n customRangeFrom,\n customRangeTo,\n },\n });\n\n const result = await executeRustBridgeQuery<SearchDocumentsRustResult>({\n context,\n envelope,\n data: {\n documents: docs.map((item) => ({\n id: item.id,\n workspaceId: item.workspace_id ?? workspaceId,\n title: item.title ?? null,\n rawText: item.raw_text ?? null,\n createdAt: item.created_at ?? null,\n updatedAt: item.updated_at ?? null,\n })),","v":"ejJyO81hQj1PYdW9iGvOvQFodj29KUa9KuInO7IeFrtE0RM9X9ZoveCezbwM0i09TQ7TPYLpP7xIzcg7ua0WvVmCEL3xXi29RkpGPCRGNzw0ICg7RSlDvGLTbj0PKQC9HeX4u7G6Hj33/0W80CQOPQSTJ7160Fo8Xr21PE0U6DwR+no8718rvPwVc719Zsm9Ijo/PSTF4Dy2H169PGWXPGWdhz09dMs78D+9vMbee70c+SY9NEo8vf2FmT30mvc7UT2VPXJbE77/rm082QiXvPnVnDwhzQO8v6bNPd2IET2q8ES8++RxuqCNYTsJpnG9IygyPciJWDzqFKs86eUFPrownj2YTHK79ovHvRPsGj2f1wi8chnguiRwwjsl63Y84DW+vOUg0Tx3Gfm8/USWPUZzd7277NK8vbALvTJ/mzyUBcq8VlvuvBzwRT1Whhm7QVRGPdouY7zFU1S97dFWvZ14xrylsx09dYvNOynI9LstZx09rryiO/Re8Lyod4Y8kX10vNYn/7y00PS877KeO4MxB726vqc86+Hxu/7v8DvQcXm8dfsJPenxrrzGQg49VYLPu6otCr25H/27NjQ2Pd/cEL1U7Ri9aRoivKW5vLxGUgY9TdlEPQAg+bxvvaI89ToIvIoGJzyV1K88a/iSPTeIjzwLxEo9S4nAvHZK6DxoOcE7oOoEvVfUSb10g7u8JGJDPKEXDz2IWQm8kCY8PUlfmL3Gk5S8HsDuO4TtlryBS/W7zwadvFE7HrzUTy29fx3tuQ1NnL1XAUM8NFiLPGLZlrzbUdM82gQIvZtVHT3/ZcU8YeoMPRv9cT2hiRm8ASDyPEsJp7zpsKc8Xw8KPbdp6Tz9GVg9MLNDvdQrhzxaH188JyO+O7/mXTwL5RA9JZW5u6nJrjwR3Hq9vQBtvRegdrziKwY8unTqu2wurjxTeFo9PdZXvSnznjoKwhq9GbaJu2zO273yx7g8sPCBPH7sKbvTEMm7s/SvvFpZybzwSNo8XZ1ivTqrtzpRRaC9Tng6vP08ZT0m+Qa9Do0pvLirBz2fBC693dNNO4uTDr14nhE83sBKvDuBqLyBVfo8rK6TvTs1jzzNOtS8tqdHPbYiVDxYsJs6nqeMPRkrEb09euo8HnwpPFo3O71kTOC7s6eiu1QiEr0RYGe934ruPPwoPz3M+zy9alcnPd1oyzzDxl48KK1fPVsFNDvFnci8vbWgumxMhDv3PkK9OoiLvVSTjTyHNRY9rDMaO5pRGj1vFFI96r+7PSWYNDyr40E9wzXVO/wBDz3OEeu8GxZXO+7Mnbzldh29iTGFvRttjby0Rse8rB+ZPJymH7zARiK7sb6gPBpQAj3ef8084cubvQ48mTxsjxK8DKTDvErDgzufwQY8p9nZPIMYejzXCyu90ZjvvM5/Yb0gZw29IGMru1DNYzy5Huk8pfwhvKLHjTzXN388ZfAlvO8BuTyHUBs9bf9JuaY1KLxDzSy8LZyZvNbuMr0sXB68PqrEvNlAtbxVwIO9co8yPW1ijL0bY7M7CvUFPfCElbz8MWI8q2suPTQAvrxWaYM94216uhS7DbwdAa08Id7Ru04IzbwtH7w7D9iYvMR9ND1sIbo9JoZ8Pdk5QzzYwRC8y19MPbrfZ737ucc8UzUjuSG0u7wd6F27FTXOOwmvpDxV+/c8oCiNPc+MkjxVEoM8lcWTPEaWtTwMmxW8fanjvH2KhbzqFSS9S21IuxS7Qz218ke9bUUYuzA1CrzfhHI8HX9bPYOASb3DJrI8ldpIvSKqSL1ulvw8ZN+kPPeWVjyQ8fM8sw9APG6XGrpENri8IlQ7PTDW1Lzq+uM72LY9PU1aWb0hPBK9VhmFPaRj8Txm4n29o7Hsu1bHCb1f5so5yJnpvOYHPD3FHDI9rYXAPKNEkrxq5x+8iGs2PRAQK7xhAks8ZsMGvSjM+zs2X+A8veEPPQW1nLwLyPo8uOIHPb1MHD0DpqS8l+WCO4AVYD3m7LI8Xi1xvc1KgL23trE8dGIwvJWFfryt04Y9oLYjO2jZ9rd/ZKg8wXtRPKue9Lxa++k8gjogvcWYnDyG1h67E0bPvLOUkzxzFMq8EXFMO8gwXjyPC986y/Qwu+ALi7x5HCW8XDA4PQ/4
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/search-query-adapter.ts","s":337,"e":389,"m":1776341732431.2847,"t":"const result = await executeRustBridgeQuery<SearchDocumentsRustResult>({\n context,\n envelope,\n data: {\n documents: docs.map((item) => ({\n id: item.id,\n workspaceId: item.workspace_id ?? workspaceId,\n title: item.title ?? null,\n rawText: item.raw_text ?? null,\n createdAt: item.created_at ?? null,\n updatedAt: item.updated_at ?? null,\n })),\n mindmaps: mindmaps.map((item) => ({\n documentId: item.document_id ?? \"\",\n data: item.data ?? null,\n })),\n tables: tables.map((item) => ({\n id: item.id,\n documentId: item.document_id ?? \"\",\n title: item.title ?? null,\n })),\n tableRows: tableRows.map((item) => ({\n tableId: item.table_id ?? \"\",\n documentId: item.document_id ?? \"\",\n rowHash: item.row_hash ?? null,\n })),\n assets: assets.map((item) => ({\n id: item.id,\n documentId: item.document_id ?? \"\",\n assetType: item.asset_type ?? null,\n fileName: item.file_name ?? null,\n mimeType: item.mime_type ?? null,\n ocrText: item.ocr_text ?? null,\n ocrStatus: item.ocr_status ?? null,\n })),\n },\n });\n\n await enqueueOcrJobs(result.enqueueAssetIds ?? []);\n\n return {\n response: {\n results: mapRustResultsToResponse(result),\n recent,\n },\n meta: {\n requestId: context.requestId,\n traceId: context.traceId,\n queryName: envelope.name,\n },\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/shortcuts.test.ts","s":1,"e":18,"m":1773495901152.4185,"t":"import { describe, expect, it } from \"vitest\";\nimport { resolveSearchOpenMode } from \"./shortcuts\";\n\ndescribe(\"resolveSearchOpenMode\", () => {\n it(\"Ctrl/Cmd+Enter 打开新窗口\", () => {\n expect(resolveSearchOpenMode({ ctrlKey: true })).toBe(\"new-window\");\n expect(resolveSearchOpenMode({ metaKey: true, altKey: true })).toBe(\"new-window\");\n });\n\n it(\"Alt+Enter 打开右侧预览\", () => {\n expect(resolveSearchOpenMode({ altKey: true })).toBe(\"sidebar\");\n });\n\n it(\"默认回车在当前窗口打开\", () => {\n expect(resolveSearchOpenMode({})).toBe(\"main\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/shortcuts.ts","s":1,"e":18,"m":1773495901165.8643,"t":"export type SearchOpenMode = \"main\" | \"new-window\" | \"sidebar\";\n\ninterface ShortcutLikeEvent {\n metaKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n}\n\nexport const resolveSearchOpenMode = (event: ShortcutLikeEvent): SearchOpenMode => {\n if (event.metaKey || event.ctrlKey) {\n return \"new-window\";\n }\n if (event.altKey) {\n return \"sidebar\";\n }\n return \"main\";\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/snippet.test.ts","s":1,"e":15,"m":1773495901171.8643,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildSnippet } from \"./snippet\";\n\ndescribe(\"buildSnippet\", () => {\n it(\"命中关键字时高亮 OCR 片段\", () => {\n const snippet = buildSnippet(\"图像 OCR 测试文本,用于高亮\", \"OCR\");\n expect(snippet).toContain(\"<mark>OCR</mark>\");\n });\n\n it(\"无关键字时返回截断文本\", () => {\n const snippet = buildSnippet(\"一段很长的文字用于测试截断逻辑\", null);\n expect(snippet.endsWith(\"…\") || snippet.length <= 120).toBe(true);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/search/snippet.ts","s":1,"e":25,"m":1773495901178.336,"t":"const escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\nconst escapeRegExp = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nexport const buildSnippet = (text: string | null, keyword: string | null): string => {\n const source = (text ?? \"\").trim();\n if (!source) {\n return \"暂无正文内容\";\n }\n const safeSource = escapeHtml(source);\n if (!keyword) {\n return `${safeSource.slice(0, 120)}${safeSource.length > 120 ? \"…\" : \"\"}`;\n }\n const pattern = new RegExp(escapeRegExp(keyword), \"gi\");\n const match = pattern.exec(safeSource);\n if (!match) {\n return `${safeSource.slice(0, 120)}${safeSource.length > 120 ? \"…\" : \"\"}`;\n }\n const start = Math.max(0, match.index - 20);\n const end = Math.min(safeSource.length, match.index + keyword.length + 80);\n const segment = safeSource.slice(start, end);\n return segment.replace(pattern, (found) => `<mark>${found}</mark>`);\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.test.ts","s":1,"e":60,"m":1778599634625.124,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n buildOnlyOfficeAssetOpenUrl,\n buildOnlyOfficeCallbackUrl,\n buildOnlyOfficeForcesaveUrl,\n buildOnlyOfficeOpenFileId,\n docTypeFromExt,\n inferOnlyOfficeFileType,\n resolveOnlyOfficeDocumentUrl,\n} from \"@/lib/onlyoffice/client-session\";\n\ndescribe(\"onlyoffice client session helpers\", () => {\n it(\"docTypeFromExt maps office extensions\", () => {\n expect(docTypeFromExt(\"docx\")).toBe(\"word\");\n expect(docTypeFromExt(\"xlsx\")).toBe(\"cell\");\n expect(docTypeFromExt(\"pptx\")).toBe(\"slide\");\n expect(docTypeFromExt(\"pdf\")).toBe(\"word\");\n });\n\n it(\"inferOnlyOfficeFileType detects only true Office assets from file name and MIME\", () => {\n expect(inferOnlyOfficeFileType(\"demo.pptx\", null)).toBe(\"pptx\");\n expect(inferOnlyOfficeFileType(\"demo\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\")).toBe(\"docx\");\n expect(inferOnlyOfficeFileType(\"demo\", \"application/pdf\")).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.png\", \"image/png\")).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.pdf\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.toml\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.json\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.yaml\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.yml\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.md\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.txt\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.ts\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.js\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.py\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.rs\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.go\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.html\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.css\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.vue\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.svelte\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.proto\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.graphql\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.gradle\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.tf\", null)).toBeNull();\n expect(inferOnlyOfficeFileType(\"demo.pdf\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\")).toBeNull();\n expect(inferOnlyOfficeFileType(\"Dockerfile\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\")).toBeNull();\n expect(inferOnlyOfficeFileType(\".gitignore\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\")).toBeNull();\n });\n\n it(\"buildOnlyOfficeAssetOpenUrl keeps attachment identity for callback writeback\", () => {\n const result = buildOnlyOfficeAssetOpenUrl({\n origin: \"https://mnote.example.com\",\n fileUrl: \"https://storage.example.com/demo.pptx?token=abc\",\n fileName: \"2023自我介绍PPT_李爱波0831.pptx\",\n fileType: \"pptx\",\n assetId: \"asset_ppt_1\",\n documentId: \"doc_1\",\n mode: \"edit\",\n });","v":"hvlBPaHtjLuvdg++8caavbNbkT2VEL28VDgJvUJJLD2MMoI7TzCJvQyMhbx6Bzo9EMqIPcWglLyqu868+EcJvfiSXjz3Cwm9Ap0fPemSe7uCbk+8xbxIvXRPPbujYaW8Z8+kPYNIJz0hH226AkxpPUF6C70sFWo8wi6vPa62Ej0SqyY9n1OpvOIC/Lzm8w69yMamOS4bjTumYFa9teAgPWogorxkZtS8wxOGOD4DSL0Kaz89k10MO+vQMT1SfSo98+76PElL07yZye47uiT8vOu9s7vG0iE9YTMdPt9f8zyd0IO8cM3WPHrcDz1R80W83z7lPOGljrwoJGa8mGq+Pd3NgD1Rww69QVcmve31hjzCEuC8kjz4PIzTLj34hsk8u55iu0XTJr341wC9wFzzuwxFZbySGSi9qvvfu0PEMD2jAye9FP3+PNktKT2PoBs8UsQOPfjGd7xGSmQ8GZpQu4Y47LxmQZU9Kmw6PctS1byldIw8cFS/vLPRLb165Ca8iEDyuz7qhDplO5e8yhAFvanCzTxapIs8z5+tvG061LxNl1g8pDSmPQdGFrzVUvQ8IWoKPTBDCr1GeuI8BO9cPV
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.test.ts","s":49,"e":108,"m":1778599634625.124,"t":"it(\"buildOnlyOfficeAssetOpenUrl keeps attachment identity for callback writeback\", () => {\n const result = buildOnlyOfficeAssetOpenUrl({\n origin: \"https://mnote.example.com\",\n fileUrl: \"https://storage.example.com/demo.pptx?token=abc\",\n fileName: \"2023自我介绍PPT_李爱波0831.pptx\",\n fileType: \"pptx\",\n assetId: \"asset_ppt_1\",\n documentId: \"doc_1\",\n mode: \"edit\",\n });\n\n expect(result).toBe(\n \"https://mnote.example.com/onlyoffice?fileUrl=https%3A%2F%2Fstorage.example.com%2Fdemo.pptx%3Ftoken%3Dabc&fileName=2023%E8%87%AA%E6%88%91%E4%BB%8B%E7%BB%8DPPT_%E6%9D%8E%E7%88%B1%E6%B3%A20831.pptx&fileType=pptx&assetId=asset_ppt_1&documentId=doc_1&mode=edit\",\n );\n });\n\n it(\"resolveOnlyOfficeDocumentUrl wraps signed url with proxy\", () => {\n const result = resolveOnlyOfficeDocumentUrl({\n effectiveFileUrl: \"https://public.example.com/storage/v1/object/sign/documents/a.docx?token=abc\",\n proxyOrigin: \"https://app.example.com\",\n storageHostOverride: \"\",\n runtimeSupabaseUrl: \"https://public.example.com\",\n useConvex: false,\n });\n expect(result).toContain(\"https://app.example.com/api/onlyoffice/proxy?u=\");\n });\n\n it(\"buildOnlyOfficeCallbackUrl keeps asset and user\", () => {\n const result = buildOnlyOfficeCallbackUrl({\n callbackOrigin: \"http://host.docker.internal:3000\",\n proxyOrigin: \"\",\n windowOrigin: \"https://app.example.com\",\n assetId: \"asset_1\",\n userId: \"user_1\",\n });\n expect(result).toBe(\n \"http://host.docker.internal:3000/api/onlyoffice/callback?assetId=asset_1&userId=user_1\",\n );\n });\n\n it(\"buildOnlyOfficeForcesaveUrl keeps key\", () => {\n const result = buildOnlyOfficeForcesaveUrl({\n windowOrigin: \"https://app.example.com\",\n assetId: \"asset_1\",\n key: \"doc_key_1\",\n });\n expect(result).toBe(\n \"https://app.example.com/api/onlyoffice/forcesave?assetId=asset_1&key=doc_key_1\",\n );\n });\n\n it(\"buildOnlyOfficeOpenFileId prefers asset id\", () => {\n expect(\n buildOnlyOfficeOpenFileId({\n assetId: \"asset_1\",\n docKey: \"doc_key_1\",\n resolvedFileUrl: \"https://app.example.com/file.docx\",\n fileName: \"file.docx\",\n }),","v":"QyJPPaDGWzy8xAm+NGeNvW6vhj3m+3O9KntBvCXSVT2/I/c85bm9vXXFkL2YvQI9uzqgPU5XSbzY9p49OIFCvB8SgTxozkO8J7w4PSGnsDw38yW8P3VDvDl7S70zboC8bpBcPfizKj3G9FM8QUeqPFodJL1X/aE7wNDdPJftFT2d3AG6GgeYvE8BvL2ToLa9gwaLPOUxhrxfzZi8HX30PCkzSjxxFB88rHJVO2QxpbzhSYQ87mu7vNFhcT11XOU8GXrNPUTaXL2pw667h9BSvahuAryrHoW8iNfvPX2HKT23niE8f4vUOxQUqrsFqzK9xjANPdtD0jyZ8VG8Jt7hPTnepj2YdiK9JeBnvI0EED26n7Y802vBPHkhHj3KbhM9J2TkvNLoL72JSYQ5m1Ckui8BajwsVoq9OrU0vCX77DwAY8S8i33/u1zQ7jwpbCQ8ChNHPcoIajwGjI870l81Oo9Hmr2y0ck95H7sPCHK+LzNrde8oojaOeRdH724qB675tM9PKZGczuNc+i8v3btvJbMibyvlr48GjmvvK7APLzF/go9RBK0PWdSMLxw6BA9xI3rPGC1nrwcBr88g3Q/PTEH1Dp64mu9FFMfPVe2xzvkzyo9944ive3YEbu7J6I8cs0CvcIzu7xdNmu8rjaPPQEL5Tx2DRg8npizvDk4CTxxkqI6iPMovUiCCL0ozFG8HGCTvBh8HDyXoWY9kBnNPFMhjb2Qvbm8Mrx6PEW3BTvUPS47NR+xPAA9qLxmsQK9YU+ZvHPJy7wH+3s9gmRjvHPahbxcD7Y8hn+cu/XlzDpqA/s7BkoCu3UKHT1MQoa8VlqtPB1Jvzmoni09IKU4PYE4Az01bH088JkpvGmQoz0pMxG9YxQ6vcwmLD1D10Q9M+QUvTqfkTwLEZ68TFc5vbe6ubwnxgs9G2+KPHzIMLuzJpc8e+PGvBixyTzZwDG98GWQPF5lbb3LGkw9azgdOlJzQ73ttso8Z5SBOz+0Y7tkF9a7XIKPvclcvzzFLou8znZDvXWAzzyoHyC85+8GvUWFBz35xwu9VRQxPeOtyLxMj0q800tIOyc1SjuS+xo4owOtvas4xTsEKAS8zbYhPUs1N721FCk8RTDAPXDDeLyujwO96ylFPdvahrx5kTm8VIzmuGwzjryWAZW9VXbUvIKByDxOjMS8BCZmPbo7njx3Tg4892rbPFqSfbxPtx49LebEOlJaMDzgWV+9fLySvftQEj0CUB49I22QPJkN4DzHYrU8eNYIPaBPvLsufcw848cRvEvo77rr8II68CjVvBVOKb3rJP27cxyVu7jYJr3/14q8yhV0PF2JvTpgIq86ujhNPSA45jyfQUE9KGVYvTqjfrxEBsa8boXauw2hIb1JT4M6VJUCve9XLz2Exiu9hs18vWsdgb1pPLm883yZvAyzuDxD6wI9EFqQu2uVcT1JKRG8r82dPRsTAD2f/5Y87EoTPLuKH7wTqM+8G58cvN6vCb3Te1E3CUhgvdHQADyLCSG9mJMEvCGk5rzr19g7naqOPCol4bu5HVc8bjwJvJjAD70Tzg49saLBPI8qdrzVgV67msRFPD/EH705h8y8yY6tPK3Mej30p1c9m9iUPBPyQzy
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.test.ts","s":97,"e":112,"m":1778599634625.124,"t":"\"https://app.example.com/api/onlyoffice/forcesave?assetId=asset_1&key=doc_key_1\",\n );\n });\n\n it(\"buildOnlyOfficeOpenFileId prefers asset id\", () => {\n expect(\n buildOnlyOfficeOpenFileId({\n assetId: \"asset_1\",\n docKey: \"doc_key_1\",\n resolvedFileUrl: \"https://app.example.com/file.docx\",\n fileName: \"file.docx\",\n }),\n ).toBe(\"asset_1\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.ts","s":1,"e":60,"m":1778599616352.8916,"t":"import { rewriteToPublicOrigin } from \"@/lib/url/rewritePublicOrigin\";\n\nexport const hashOnlyOfficeKey = (input: string) => {\n let hash = 0;\n for (let i = 0; i < input.length; i += 1) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString();\n};\n\nexport const base64UrlEncodeUtf8 = (input: string) => {\n const bytes = new TextEncoder().encode(input);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 1) {\n binary += String.fromCharCode(bytes[i] as number);\n }\n return btoa(binary).replace(/=/g, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n};\n\nexport const docTypeFromExt = (ext: string) => {\n const word = [\"doc\", \"docx\", \"odt\", \"rtf\"];\n const slide = [\"ppt\", \"pptx\", \"odp\"];\n const sheet = [\"xls\", \"xlsx\", \"ods\", \"csv\"];\n if (word.includes(ext)) return \"word\";\n if (slide.includes(ext)) return \"slide\";\n if (sheet.includes(ext)) return \"cell\";\n return \"word\";\n};\n\nexport const inferOnlyOfficeFileType = (fileName: string | null | undefined, mimeType: string | null | undefined) => {\n const name = (fileName ?? \"\").trim().toLowerCase();\n const mt = (mimeType ?? \"\").trim().toLowerCase();\n const ext = name.includes(\".\") ? name.split(\".\").pop() ?? \"\" : \"\";\n const officeExts = [\"doc\", \"docx\", \"odt\", \"rtf\", \"ppt\", \"pptx\", \"odp\", \"xls\", \"xlsx\", \"ods\", \"csv\"];\n const nonOfficeFileNames = [\n \".dockerignore\",\n \".editorconfig\",\n \".env\",\n \".eslintrc\",\n \".gitattributes\",\n \".gitignore\",\n \".npmrc\",\n \".prettierrc\",\n \"cmakelists.txt\",\n \"dockerfile\",\n \"gemfile\",\n \"makefile\",\n \"procfile\",\n \"rakefile\",\n ];\n const nonOfficeExts = [\n \"pdf\",\n \"toml\",\n \"json\",\n \"jsonc\",\n \"json5\",\n \"yaml\",\n \"yml\",\n \"md\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.ts","s":49,"e":108,"m":1778599616352.8916,"t":"\"procfile\",\n \"rakefile\",\n ];\n const nonOfficeExts = [\n \"pdf\",\n \"toml\",\n \"json\",\n \"jsonc\",\n \"json5\",\n \"yaml\",\n \"yml\",\n \"md\",\n \"markdown\",\n \"txt\",\n \"ini\",\n \"env\",\n \"xml\",\n \"ts\",\n \"tsx\",\n \"js\",\n \"jsx\",\n \"mjs\",\n \"cjs\",\n \"py\",\n \"rs\",\n \"go\",\n \"html\",\n \"htm\",\n \"css\",\n \"scss\",\n \"less\",\n \"vue\",\n \"svelte\",\n \"astro\",\n \"java\",\n \"c\",\n \"cpp\",\n \"h\",\n \"hpp\",\n \"cs\",\n \"php\",\n \"rb\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"sql\",\n \"lock\",\n \"log\",\n \"proto\",\n \"graphql\",\n \"gql\",\n \"prisma\",\n \"tf\",\n \"tfvars\",\n \"hcl\",\n \"nix\",\n \"gradle\",\n ];\n if (officeExts.includes(ext)) return ext;\n if (nonOfficeFileNames.includes(name)) return null;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.ts","s":97,"e":156,"m":1778599616352.8916,"t":"\"proto\",\n \"graphql\",\n \"gql\",\n \"prisma\",\n \"tf\",\n \"tfvars\",\n \"hcl\",\n \"nix\",\n \"gradle\",\n ];\n if (officeExts.includes(ext)) return ext;\n if (nonOfficeFileNames.includes(name)) return null;\n if (nonOfficeExts.includes(ext)) return null;\n if (mt.includes(\"wordprocessingml\")) return \"docx\";\n if (mt.includes(\"presentationml\")) return \"pptx\";\n if (mt.includes(\"spreadsheetml\")) return \"xlsx\";\n return null;\n};\n\nexport function buildOnlyOfficeAssetOpenUrl(input: {\n origin: string;\n fileUrl: string;\n fileName: string;\n fileType: string;\n assetId?: string | null;\n documentId?: string | null;\n mode?: \"view\" | \"edit\";\n}): string {\n const target = new URL(\"/onlyoffice\", input.origin);\n target.searchParams.set(\"fileUrl\", input.fileUrl);\n target.searchParams.set(\"fileName\", input.fileName);\n target.searchParams.set(\"fileType\", input.fileType);\n if (input.assetId) target.searchParams.set(\"assetId\", input.assetId);\n if (input.documentId) target.searchParams.set(\"documentId\", input.documentId);\n target.searchParams.set(\"mode\", input.mode ?? \"edit\");\n return target.toString();\n}\n\nexport function resolveOnlyOfficeDocumentUrl(input: {\n effectiveFileUrl: string;\n proxyOrigin: string;\n storageHostOverride: string;\n runtimeSupabaseUrl: string;\n useConvex: boolean;\n}): string {\n const { effectiveFileUrl, proxyOrigin, storageHostOverride, runtimeSupabaseUrl, useConvex } = input;\n if (!effectiveFileUrl) return \"\";\n\n const isConvexStorageUrl = (() => {\n try {\n const u = new URL(effectiveFileUrl);\n return u.pathname.startsWith(\"/api/storage/\");\n } catch {\n return false;\n }\n })();\n\n let base =\n storageHostOverride || useConvex || isConvexStorageUrl\n ? effectiveFileUrl","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.ts","s":145,"e":204,"m":1778599616352.8916,"t":"const isConvexStorageUrl = (() => {\n try {\n const u = new URL(effectiveFileUrl);\n return u.pathname.startsWith(\"/api/storage/\");\n } catch {\n return false;\n }\n })();\n\n let base =\n storageHostOverride || useConvex || isConvexStorageUrl\n ? effectiveFileUrl\n : rewriteToPublicOrigin(effectiveFileUrl, runtimeSupabaseUrl);\n try {\n const raw = new URL(base);\n let alreadyProxy = raw.pathname.includes(\"/api/onlyoffice/proxy\");\n const isLocalHost =\n raw.hostname === \"127.0.0.1\" || raw.hostname === \"localhost\" || raw.hostname === \"host.docker.internal\";\n\n if (alreadyProxy && proxyOrigin) {\n const po = new URL(proxyOrigin);\n raw.protocol = po.protocol;\n raw.host = po.host;\n base = raw.toString();\n }\n\n if (!alreadyProxy && proxyOrigin && isLocalHost) {\n const proxy = new URL(\"/api/onlyoffice/proxy\", proxyOrigin || window.location.origin);\n proxy.searchParams.set(\"u\", base64UrlEncodeUtf8(base));\n base = proxy.toString();\n alreadyProxy = true;\n }\n if (!alreadyProxy && raw.searchParams.has(\"token\")) {\n const proxy = new URL(\"/api/onlyoffice/proxy\", proxyOrigin || window.location.origin);\n proxy.searchParams.set(\"u\", base64UrlEncodeUtf8(base));\n base = proxy.toString();\n alreadyProxy = true;\n }\n\n const u = new URL(base);\n if (!storageHostOverride || alreadyProxy) return u.toString();\n\n if (/^https?:\\/\\//i.test(storageHostOverride)) {\n const ov = new URL(storageHostOverride);\n u.protocol = ov.protocol;\n u.host = ov.host;\n return u.toString();\n }\n\n u.hostname = storageHostOverride;\n return u.toString();\n } catch {\n return base;\n }\n}\n\nexport function buildOnlyOfficeCallbackUrl(input: {\n callbackOrigin: string;\n proxyOrigin: string;\n windowOrigin: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/client-session.ts","s":193,"e":234,"m":1778599616352.8916,"t":"u.hostname = storageHostOverride;\n return u.toString();\n } catch {\n return base;\n }\n}\n\nexport function buildOnlyOfficeCallbackUrl(input: {\n callbackOrigin: string;\n proxyOrigin: string;\n windowOrigin: string;\n assetId: string;\n userId: string;\n}): string {\n const base = input.callbackOrigin || input.proxyOrigin || input.windowOrigin;\n const callback = new URL(\"/api/onlyoffice/callback\", base);\n if (input.assetId) callback.searchParams.set(\"assetId\", input.assetId);\n if (input.userId) callback.searchParams.set(\"userId\", input.userId);\n return callback.toString();\n}\n\nexport function buildOnlyOfficeForcesaveUrl(input: {\n windowOrigin: string;\n assetId: string;\n key: string;\n}): string {\n const url = new URL(\"/api/onlyoffice/forcesave\", input.windowOrigin);\n url.searchParams.set(\"assetId\", input.assetId);\n url.searchParams.set(\"key\", input.key);\n return url.toString();\n}\n\nexport function buildOnlyOfficeOpenFileId(input: {\n assetId: string;\n docKey: string;\n resolvedFileUrl: string;\n fileName: string;\n}): string {\n return input.assetId || `onlyoffice_${input.docKey || hashOnlyOfficeKey(`${input.resolvedFileUrl}-${input.fileName}`)}`;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/internal-url.ts","s":1,"e":60,"m":1776426825588.8555,"t":"const DEFAULT_ONLYOFFICE_INTERNAL_URL = \"http://127.0.0.1:8082\";\nconst ONLYOFFICE_PROBE_PATH = \"/web-apps/apps/api/documents/api.js\";\nconst RESOLVE_CACHE_TTL_MS = 30_000;\n\nconst DEFAULT_ONLYOFFICE_INTERNAL_URL_CANDIDATES = [\n DEFAULT_ONLYOFFICE_INTERNAL_URL,\n \"http://127.0.0.1:8081\",\n \"http://localhost:8082\",\n \"http://localhost:8081\",\n];\n\nlet cachedOnlyOfficeInternalUrl = \"\";\nlet cachedOnlyOfficeInternalUrlAt = 0;\nlet pendingOnlyOfficeInternalUrl: Promise<string> | null = null;\n\nconst normalizeOnlyOfficeInternalUrl = (raw?: string | null) => {\n const value = String(raw || \"\").trim().replace(/\\/+$/, \"\");\n if (!value) return \"\";\n try {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return \"\";\n return url.toString().replace(/\\/+$/, \"\");\n } catch {\n return \"\";\n }\n};\n\nconst getOnlyOfficeInternalUrlCandidates = () => {\n const candidates: string[] = [];\n const push = (value?: string | null) => {\n const normalized = normalizeOnlyOfficeInternalUrl(value);\n if (!normalized) return;\n if (!candidates.includes(normalized)) candidates.push(normalized);\n };\n\n push(process.env.ONLYOFFICE_INTERNAL_URL);\n\n for (const raw of String(process.env.ONLYOFFICE_INTERNAL_URL_CANDIDATES || \"\").split(\",\")) {\n push(raw);\n }\n\n for (const value of DEFAULT_ONLYOFFICE_INTERNAL_URL_CANDIDATES) {\n push(value);\n }\n\n return candidates.length > 0 ? candidates : [DEFAULT_ONLYOFFICE_INTERNAL_URL];\n};\n\nconst probeOnlyOfficeInternalUrl = async (candidate: string) => {\n try {\n const probeUrl = new URL(ONLYOFFICE_PROBE_PATH, `${candidate}/`);\n const response = await fetch(probeUrl, {\n method: \"HEAD\",\n redirect: \"follow\",\n cache: \"no-store\",\n signal: AbortSignal.timeout(2_500),\n });\n return response.ok;\n } catch {\n return false;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/internal-url.ts","s":49,"e":93,"m":1776426825588.8555,"t":"const probeOnlyOfficeInternalUrl = async (candidate: string) => {\n try {\n const probeUrl = new URL(ONLYOFFICE_PROBE_PATH, `${candidate}/`);\n const response = await fetch(probeUrl, {\n method: \"HEAD\",\n redirect: \"follow\",\n cache: \"no-store\",\n signal: AbortSignal.timeout(2_500),\n });\n return response.ok;\n } catch {\n return false;\n }\n};\n\nexport const resolveOnlyOfficeInternalUrl = async () => {\n const now = Date.now();\n if (cachedOnlyOfficeInternalUrl && now - cachedOnlyOfficeInternalUrlAt < RESOLVE_CACHE_TTL_MS) {\n return cachedOnlyOfficeInternalUrl;\n }\n\n if (pendingOnlyOfficeInternalUrl) {\n return pendingOnlyOfficeInternalUrl;\n }\n\n pendingOnlyOfficeInternalUrl = (async () => {\n const candidates = getOnlyOfficeInternalUrlCandidates();\n for (const candidate of candidates) {\n if (await probeOnlyOfficeInternalUrl(candidate)) {\n return candidate;\n }\n }\n return candidates[0] || DEFAULT_ONLYOFFICE_INTERNAL_URL;\n })();\n\n try {\n const resolved = await pendingOnlyOfficeInternalUrl;\n cachedOnlyOfficeInternalUrl = resolved;\n cachedOnlyOfficeInternalUrlAt = Date.now();\n return resolved;\n } finally {\n pendingOnlyOfficeInternalUrl = null;\n }\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/rust-adapter.ts","s":1,"e":60,"m":1776239508437.8945,"t":"import type { MnoteRuntimeConfig } from \"@/lib/runtime-config\";\nimport {\n buildDocumentBridgeContextWithActor,\n type BridgeContext,\n type BridgeTarget,\n} from \"@/lib/documents/bridge\";\nimport { executeRustBridgeTool } from \"@/lib/documents/rust-runtime\";\n\ntype OnlyOfficeHeader = {\n name: string;\n value: string;\n};\n\ntype OnlyOfficeServiceActorInput = {\n actorId?: string;\n actorType?: string;\n sessionId?: string | null;\n workspaceId?: string | null;\n sourceChannel: string;\n sourceClient: string;\n idempotencyKey?: string | null;\n};\n\nexport type OnlyOfficeSignResult = {\n token: string | null;\n documentToken: string | null;\n editorConfigToken: string | null;\n};\n\nexport type OnlyOfficeProxyPreparationResult = {\n targetUrl: string;\n forwardHeaders: OnlyOfficeHeader[];\n};\n\nexport type OnlyOfficeCallbackPreparationResult = {\n shouldWrite: boolean;\n downloadUrl: string | null;\n idempotencyKey: string | null;\n locator: {\n assetId: string;\n workspaceId: string | null;\n documentId: string | null;\n };\n session: {\n sessionId: string;\n assetId: string;\n workspaceId: string | null;\n documentId: string | null;\n userId: string | null;\n };\n};\n\nexport type OnlyOfficeForcesavePreparationResult = {\n requests: Array<{\n via: string;\n url: string;\n method: string;\n headers: OnlyOfficeHeader[];\n bodyJson: string;\n }>;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/rust-adapter.ts","s":49,"e":108,"m":1776239508437.8945,"t":"userId: string | null;\n };\n};\n\nexport type OnlyOfficeForcesavePreparationResult = {\n requests: Array<{\n via: string;\n url: string;\n method: string;\n headers: OnlyOfficeHeader[];\n bodyJson: string;\n }>;\n};\n\nfunction buildOnlyOfficeServiceContext(request: Request, input: OnlyOfficeServiceActorInput): BridgeContext {\n return buildDocumentBridgeContextWithActor({\n request,\n workspaceId: input.workspaceId ?? null,\n actor: {\n actorType: input.actorType ?? \"service\",\n actorId: input.actorId?.trim() || \"onlyoffice-service\",\n sessionId: input.sessionId ?? null,\n },\n source: {\n channel: input.sourceChannel,\n client: input.sourceClient,\n },\n idempotencyKey: input.idempotencyKey ?? null,\n });\n}\n\nasync function runOnlyOfficeTool<TResult>(input: {\n request: Request;\n toolName:\n | \"onlyoffice_session_resolve\"\n | \"onlyoffice_sign\"\n | \"onlyoffice_prepare_proxy\"\n | \"onlyoffice_prepare_callback\"\n | \"onlyoffice_prepare_forcesave\";\n args?: Record<string, unknown>;\n data?: Record<string, unknown>;\n target?: BridgeTarget | null;\n actor?: Partial<OnlyOfficeServiceActorInput>;\n}): Promise<TResult> {\n const context = buildOnlyOfficeServiceContext(input.request, {\n actorId: input.actor?.actorId,\n actorType: input.actor?.actorType,\n sessionId: input.actor?.sessionId ?? null,\n workspaceId: input.actor?.workspaceId ?? null,\n sourceChannel: input.actor?.sourceChannel?.trim() || `onlyoffice:${input.toolName}`,\n sourceClient: input.actor?.sourceClient?.trim() || \"wolai-frontend\",\n idempotencyKey: input.actor?.idempotencyKey ?? null,\n });\n const result = await executeRustBridgeTool<TResult>({\n context,\n toolName: input.toolName,\n invocationKind: \"job\",\n args: input.args ?? {},\n data: input.data ?? {},\n target: input.target ?? null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/rust-adapter.ts","s":97,"e":156,"m":1776239508437.8945,"t":"workspaceId: input.actor?.workspaceId ?? null,\n sourceChannel: input.actor?.sourceChannel?.trim() || `onlyoffice:${input.toolName}`,\n sourceClient: input.actor?.sourceClient?.trim() || \"wolai-frontend\",\n idempotencyKey: input.actor?.idempotencyKey ?? null,\n });\n const result = await executeRustBridgeTool<TResult>({\n context,\n toolName: input.toolName,\n invocationKind: \"job\",\n args: input.args ?? {},\n data: input.data ?? {},\n target: input.target ?? null,\n mode: \"result\",\n });\n return result.result;\n}\n\nexport async function signOnlyOfficeConfig(input: {\n request: Request;\n config: Record<string, unknown>;\n secret?: string | null;\n}): Promise<OnlyOfficeSignResult> {\n return await runOnlyOfficeTool<OnlyOfficeSignResult>({\n request: input.request,\n toolName: \"onlyoffice_sign\",\n data: {\n config: input.config,\n secret: input.secret ?? \"\",\n },\n actor: {\n sourceChannel: \"onlyoffice-sign\",\n sourceClient: \"onlyoffice-sign-route\",\n },\n });\n}\n\nexport async function prepareOnlyOfficeProxyRequest(input: {\n request: Request;\n encodedUrl: string;\n method: \"GET\" | \"HEAD\";\n range: string | null;\n runtimeConfig: MnoteRuntimeConfig;\n}): Promise<OnlyOfficeProxyPreparationResult> {\n return await runOnlyOfficeTool<OnlyOfficeProxyPreparationResult>({\n request: input.request,\n toolName: \"onlyoffice_prepare_proxy\",\n data: {\n encodedUrl: input.encodedUrl,\n method: input.method,\n range: input.range,\n supabaseUrl: input.runtimeConfig.supabaseUrl ?? \"\",\n supabaseInternalUrl:\n input.runtimeConfig.supabaseInternalUrl ?? process.env.SUPABASE_INTERNAL_URL ?? \"\",\n onlyofficeStorageHostOverride: input.runtimeConfig.onlyofficeStorageHostOverride ?? \"\",\n convexOrigin:\n process.env.CONVEX_SELF_HOSTED_URL ?? process.env.NEXT_PUBLIC_CONVEX_URL ?? \"\",\n supabaseAnonKey: input.runtimeConfig.supabaseAnonKey ?? \"\",\n },\n actor: {\n sourceChannel: \"onlyoffice-proxy\",","v":"H6wMvRSwCD17X9S97+GMvco6hD3Ump+9HL/yPMtZgLxpWzQ9tcRxvdpA57zH0HI9Q3XDPQafxDwci+Q8hj4wvbkoTD1aBT69ugJhPOSLAbwycr+5ArQ3vYR0bD1p/+C8tBmlPQ0W8DoHIcg8Tiw4PS1er7wH0Y89R/GOPEuIhj3NiDQ9OvuxO5LMh73YFhq93qGZupaDPz0UNVi8TUtQOUlfrLwcG+k8pyEmPHR72Dz8JTc9gi6rvEoSbDwZeVk960f7PCwMqb0WTgK7fVn9vJWlf7yqnPS81+e8PQU7nTzD9IC72jO+PJ8cDz38/A29UKgiPTpZaT3roX48RH2uPWlKnT2/epq8uF8bvcI0Yz39TYM8PakvPLLx2jyQdYE7wS7Ru+xjHr3yed+7KGZSPXFGWbyDu3C9scUSvfwfVj1fRF28/D4DvRIA6zxNehA9YgsZPPzlLr2fHAe8H3REvaURdr3Tb4U9uRNMPUkA4Ttjn4Q88T7dvMl0Rr0tSRg8NccrvOLp6Tyseqc8H1hTvXyNrzzobcA70Y8OvcqcAL3uf068nbxEPXuKR7yLPds6VM7ivIBlwLx4Lc28Woo0PXuAd71tayW9t75GPbTlaL3d2cQ8r5CzPGHdlzoK04k9oXbavDm9nrzMkmE6jGORPAY/gj2NBls9XgNrvNZzDD3jLa26QSc9vaK717uDFwa9uY9DvQD0vjqOxgk9z6/dPClZrL3BBEm9w9XkPBJAmry6B5A9y35JPHciBb22gCi9veIpvTurBb2N9UI9s/vSOykzrDzetVc7xlaXu0JWNz1cPEY9/NiwPOMoWz0AWSa9JNKsPIlMIT2otlk7WtX4O0OMyjwgfCq8HSdDvexp5TzptQq9lMiOvFTlITxmLGI8d/zcvGKcdj0K7n29iwh9vTsu9bzPHaw7rUEpu7a30TxlaII8A12qvHAClDyI1VK9zSxQPG7/nb1GS2c87HfSPOeBqbsnrYC8lbpTvLPvsjuTfxO8SQlpvfUgCjwUgSm9MIcgvau7pDubh8K8nH7nvFT6gTwOPlq9diuRPASRIb1T1UG7qKhMPP/gaDw0ZQI911ufvfsIxjzA5kA8hBuLPBbEqbznOzS8IwiqPRVXj7xmuLE8mitAu6BrGrwjzTY7dKcCvWh4c7zstDS9vHgdPf5zlz0Es7i9wzaePLn3WT2WtCY9/C8APB1tG72O0YM8/csOvcX0Wryv7Pm8Ql20vT9dGLxXSFA9QDw/uoJ44Tv9HgQ9wdnBPeLluLwUy+W7uWP7vO8DvLsXVFK8R6eevCAAIb2j1BG9S+S0vA3uo7yeEoA83+aHO9JSrLz4NLI8hq8Mu40GvDzKR9g8U5hfvZF9nDxAOg08MzBcPbmac72sct+7jjTgu1nwRz1imPi8IfeRvJ9VLbxie8a88agEPQSQqDtssIk8dRESvVUnRbu64FK8QbQ2PbLGqTyKafY7dmJAPN7/Fj3rhvI6yDJRPYiQCr2IgD86LC/4vC7PijyO2Xq860d6PBz6Vzwysf+8ZvKavPzgE7zBT1Y8YWCBPGx7Dr3J8po9NXXHvNslEDi0F/E8EBhkvGO907p0YXC8TN0qPFnlaj3rBYs9lZqUPSfewLsUf0e8VLkhOxbExrw9BM88DVgAPdZ0BL0Ve3A8+aR8vMXGIT01j765OGktPCM7UzyMChU8NI0DPVooP7nWxIK9hJXUvCWtMzyqKaG8IKsSvRRkSz30zfC8+xUYvXIBFj0WUsS8O3MjPYzBLzz8Ghw9RzAovQZbrrw2oru82oIGvanfHzyYEp86sQ0WPYPRkjubOUq9KuPIPPEwEr3ERFO8nd8cPUmk/ryuNfW8u10iPeqWnDy/W0G9KdszPO+MSb3L1Ho7gp
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/rust-adapter.ts","s":145,"e":204,"m":1776239508437.8945,"t":"method: input.method,\n range: input.range,\n supabaseUrl: input.runtimeConfig.supabaseUrl ?? \"\",\n supabaseInternalUrl:\n input.runtimeConfig.supabaseInternalUrl ?? process.env.SUPABASE_INTERNAL_URL ?? \"\",\n onlyofficeStorageHostOverride: input.runtimeConfig.onlyofficeStorageHostOverride ?? \"\",\n convexOrigin:\n process.env.CONVEX_SELF_HOSTED_URL ?? process.env.NEXT_PUBLIC_CONVEX_URL ?? \"\",\n supabaseAnonKey: input.runtimeConfig.supabaseAnonKey ?? \"\",\n },\n actor: {\n sourceChannel: \"onlyoffice-proxy\",\n sourceClient: \"onlyoffice-proxy-route\",\n },\n });\n}\n\nexport async function prepareOnlyOfficeCallback(input: {\n request: Request;\n assetId: string;\n documentId?: string | null;\n workspaceId?: string | null;\n userId?: string | null;\n sessionId?: string | null;\n status: number;\n url?: string | null;\n key?: string | null;\n onlyofficeInternalUrl: string;\n}): Promise<OnlyOfficeCallbackPreparationResult> {\n return await runOnlyOfficeTool<OnlyOfficeCallbackPreparationResult>({\n request: input.request,\n toolName: \"onlyoffice_prepare_callback\",\n data: {\n assetId: input.assetId,\n documentId: input.documentId ?? null,\n workspaceId: input.workspaceId ?? null,\n userId: input.userId ?? null,\n sessionId: input.sessionId ?? \"onlyoffice-callback\",\n status: input.status,\n url: input.url ?? null,\n key: input.key ?? null,\n onlyofficeInternalUrl: input.onlyofficeInternalUrl,\n },\n actor: {\n actorId: input.userId?.trim() || \"onlyoffice-callback\",\n sessionId: \"onlyoffice-callback\",\n workspaceId: input.workspaceId ?? null,\n idempotencyKey: input.key ?? null,\n sourceChannel: \"onlyoffice-callback\",\n sourceClient: \"onlyoffice-document-server\",\n },\n target: {\n workspaceId: input.workspaceId ?? null,\n pageId: input.documentId ?? null,\n blockId: input.assetId,\n },\n });\n}\n\nexport async function prepareOnlyOfficeForcesave(input: {","v":"2AwDvbzM3TwdNqW9vvs/vRth1z3b6YS9e/K1PMPSPjzEv149LdQuvYbg3bxzODY9KB0IPqWkyjwisgQ9orJZvXnw/DxCeHG9mnuGPMGq0ToE9Gs7cylGvSl5kj0YcGi84hI3PZcFL7wnoYU8R/q0PGwhX70tpEU9aFURvPjjbT07k8E8iUF+vDeiPb1sTqw7s8GavIjlILlY9gO9biejPLi9vTp6WIU60jC2PGcvwTwobbo8hXUjveQ7ID1NaEU9Z7Y4PPkQEr1oiMA8QWgZvTt6mLyDQES8OLfZPXGCyjxYQb68km78O/VsFj1RpJC9nTW0PIW8YT3DWRI9wZ2WPfYhlj1EGyy8c3IhvZUChj0je0a8dkjzPBvwlTyN1es6TYEsvCG5bL1W1Ae9O4YzPWDobzs6oJu9S4tavIZtsz3uhFe9V4MJvbRiorw0jLY8nx38PJNCy7yHdz+8IJ8UvQ0Itrx7THE9vy+xPNCLpLvmSoY80G06vbWZYL18etI8PkMRvXabAT0jpRg9lf8GvYfxWjz/Iag84ndRvABUdr3zzP+8JsEmPd24rTyBV+S8hH2tu9ZIK7ztjC684SbCPEral70RwRI8XUorPe0wXLz0chM96Md+OxNxxbuCYZM9KidYvDcpQbzYYQg8NrcIPH/JVD09v4Y9Lzu+vFxO+TyjmN081IdfvSUXOryRGhK9e/MHvUKNNDw5Fks9soUOPcgZQ72Srla9tk2VPLrnt7zag1Y9o8oVPPfEAb1Z36y8HfMSvfyf9zx5+TQ9Xo6tu7cZpDsZFc+7/1gUvC2dWj1wcfo8XhB4PL4liT01EhS9GxUCPUFWtDwV4zi8zs6dvFlrWz23itc7faAKvdLPUjzDjHe9kQPMvKGRFTwHNCY8ICyau+rrEj3hOZe95fBEvcpTj7w+EB28AJivOhMK3zzMbw49auiOvF9fKDz484i9wQkePbcKyL1K8708n07MPG921LyMWze8IKCtOwvUZ7unlQa94XlCverjsbrSKhO9U1ZKvdRZhjyq86+85xMzvQ3jYj17C2G9IwJiPXVlsLwsXbM85NfhPCb/TTsj66U8tB2ZvWCfpTwlxIi8OTACPciwCb3BtDm8as+5PTYrX7sWiky8ctnoOpB2crxm7MU8SqwjvZlbMjxmZTK9R6i1PMUy7Ty4bVq9XwuZPKlOjj1zf0I97P/CPPFHUL3aOkQ9uXxOvG/ip7wA2I+8486YvRSM0rvRep+8KdMjuzK8ojyoSUk9m7+9PTwFhrz8VO68trwFvZk6LL1oePe8ul8KvaAfNr3X5zu9kIQ8vECxpLz/Yv67T9sdPDH/tbzkABM9kWqhuFznMj0lelo9J0UFvUlDtzymZAI9gaQYPRIOWb2xGwS9WJwKPLWYez0q5Q69k6DcvDOmPrw2koC9n82WPNWDMLz61qs7dpmBvTf0yDw1vvW8qcBePWGKAD3v4IM8fW5ZPAoLCz1aXFY8+pf6PDWWt7ylKMG6bNRMvZbeG7zOSEA8yF3FPAmFcTxZrHs71uPovOhTjbxNCrM858e7PJdiubwDJB895PFOvZ6CyjwxYNs8pR4YvUiD4jvz4hC9XNAuuy8hFz0r7Tw9k4MuPYoGOLynPVw8ParhvCvz3bySJdk7Y6rKPJY9mbyZzU68bqAFvcn26zy7Sqw75WwnPRnHQD0jRNY7ELkKPdTGJbx++Xu988FQvYn52jwVyNO7MPz4vJ9VOj0ehQI7PjuUvIsnJ7yIdsS7duBYPStEijww9pQ9dIlJvbVPUb13WE693uUMvYpw57yCkWs8zGQuPfjHoDybVm29xDgiPN9lOrycw+27RVY8PThBDLzswLK87igVPZWPAzulVFu9IE4OulV/D710uua8ems/Og/
|
|||
|
|
{"p":"wolai-frontend/src/lib/onlyoffice/rust-adapter.ts","s":193,"e":238,"m":1776239508437.8945,"t":"sourceChannel: \"onlyoffice-callback\",\n sourceClient: \"onlyoffice-document-server\",\n },\n target: {\n workspaceId: input.workspaceId ?? null,\n pageId: input.documentId ?? null,\n blockId: input.assetId,\n },\n });\n}\n\nexport async function prepareOnlyOfficeForcesave(input: {\n request: Request;\n assetId: string;\n key: string;\n onlyofficeInternalUrl: string;\n secret?: string | null;\n actorId?: string;\n workspaceId?: string | null;\n documentId?: string | null;\n}): Promise<OnlyOfficeForcesavePreparationResult> {\n return await runOnlyOfficeTool<OnlyOfficeForcesavePreparationResult>({\n request: input.request,\n toolName: \"onlyoffice_prepare_forcesave\",\n data: {\n assetId: input.assetId,\n key: input.key,\n onlyofficeInternalUrl: input.onlyofficeInternalUrl,\n secret: input.secret ?? \"\",\n },\n actor: {\n actorId: input.actorId?.trim() || \"onlyoffice-forcesave\",\n sessionId: \"onlyoffice-forcesave\",\n workspaceId: input.workspaceId ?? null,\n idempotencyKey: input.key,\n sourceChannel: \"onlyoffice-forcesave\",\n sourceClient: \"onlyoffice-forcesave-route\",\n },\n target: {\n workspaceId: input.workspaceId ?? null,\n pageId: input.documentId ?? null,\n blockId: input.assetId,\n },\n });\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mnote-web/internal-url.ts","s":1,"e":60,"m":1776951250026.5708,"t":"import \"server-only\";\n\nconst DEFAULT_MNOTE_WEB_INTERNAL_URL = \"http://127.0.0.1:3104\";\nconst DEFAULT_MNOTE_WEB_INTERNAL_URL_CANDIDATES = [\n DEFAULT_MNOTE_WEB_INTERNAL_URL,\n \"http://localhost:3104\",\n];\nconst MNOTE_WEB_PROBE_PATH = \"/health\";\nconst RESOLVE_CACHE_TTL_MS = 30_000;\n\nlet cachedMnoteWebInternalUrl = \"\";\nlet cachedMnoteWebInternalUrlAt = 0;\nlet pendingMnoteWebInternalUrl: Promise<string> | null = null;\n\nconst normalizeMnoteWebInternalUrl = (raw?: string | null) => {\n const value = String(raw || \"\").trim().replace(/\\/+$/, \"\");\n if (!value) return \"\";\n try {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return \"\";\n }\n return url.toString().replace(/\\/+$/, \"\");\n } catch {\n return \"\";\n }\n};\n\nconst getMnoteWebInternalUrlCandidates = () => {\n const candidates: string[] = [];\n const push = (value?: string | null) => {\n const normalized = normalizeMnoteWebInternalUrl(value);\n if (!normalized) return;\n if (!candidates.includes(normalized)) {\n candidates.push(normalized);\n }\n };\n\n push(process.env.MNOTE_WEB_INTERNAL_URL);\n\n for (const raw of String(process.env.MNOTE_WEB_INTERNAL_URL_CANDIDATES || \"\").split(\",\")) {\n push(raw);\n }\n\n for (const candidate of DEFAULT_MNOTE_WEB_INTERNAL_URL_CANDIDATES) {\n push(candidate);\n }\n\n return candidates.length > 0 ? candidates : [DEFAULT_MNOTE_WEB_INTERNAL_URL];\n};\n\nconst probeMnoteWebInternalUrl = async (candidate: string) => {\n try {\n const url = new URL(MNOTE_WEB_PROBE_PATH, `${candidate}/`);\n const response = await fetch(url, {\n method: \"GET\",\n redirect: \"follow\",\n cache: \"no-store\",\n signal: AbortSignal.timeout(2_500),\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mnote-web/internal-url.ts","s":49,"e":96,"m":1776951250026.5708,"t":"return candidates.length > 0 ? candidates : [DEFAULT_MNOTE_WEB_INTERNAL_URL];\n};\n\nconst probeMnoteWebInternalUrl = async (candidate: string) => {\n try {\n const url = new URL(MNOTE_WEB_PROBE_PATH, `${candidate}/`);\n const response = await fetch(url, {\n method: \"GET\",\n redirect: \"follow\",\n cache: \"no-store\",\n signal: AbortSignal.timeout(2_500),\n });\n return response.ok;\n } catch {\n return false;\n }\n};\n\nexport const resolveMnoteWebInternalUrl = async () => {\n const now = Date.now();\n if (cachedMnoteWebInternalUrl && now - cachedMnoteWebInternalUrlAt < RESOLVE_CACHE_TTL_MS) {\n return cachedMnoteWebInternalUrl;\n }\n\n if (pendingMnoteWebInternalUrl) {\n return pendingMnoteWebInternalUrl;\n }\n\n pendingMnoteWebInternalUrl = (async () => {\n const candidates = getMnoteWebInternalUrlCandidates();\n for (const candidate of candidates) {\n if (await probeMnoteWebInternalUrl(candidate)) {\n return candidate;\n }\n }\n return candidates[0] || DEFAULT_MNOTE_WEB_INTERNAL_URL;\n })();\n\n try {\n const resolved = await pendingMnoteWebInternalUrl;\n cachedMnoteWebInternalUrl = resolved;\n cachedMnoteWebInternalUrlAt = Date.now();\n return resolved;\n } finally {\n pendingMnoteWebInternalUrl = null;\n }\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.test.ts","s":1,"e":60,"m":1778491178825.9175,"t":"import { describe, expect, it, vi } from \"vitest\";\nimport {\n createMindmapAdapterProjectionEndpoint,\n createMindmapCommandApplyEndpoint,\n executeMindmapCommandApply,\n executeMindmapCommandApplyAndRefreshProjection,\n executeMindmapDataPutAndRefreshProjection,\n isMindmapAdapterProjection,\n requestMindmapAdapterProjection,\n} from \"./leptos-mindmap-adapter\";\nimport { createFallbackMindmapAdapterProjection } from \"./simple-mind-map-bridge\";\n\ndescribe(\"leptos-mindmap adapter projection\", () => {\n it(\"识别 adapter projection contract\", () => {\n const projection = createFallbackMindmapAdapterProjection({ mindmapId: \"mind_1\" });\n expect(isMindmapAdapterProjection(projection)).toBe(true);\n expect(isMindmapAdapterProjection({ ...projection, runtime: \"other\" })).toBe(false);\n });\n\n it(\"构建 simple_mind_map_scene 查询 endpoint\", () => {\n expect(createMindmapAdapterProjectionEndpoint(\"doc 1\", \"mind/1\")).toBe(\n \"/api/mindmap/doc%201/mind%2F1?view=simple_mind_map_scene&queryName=mindmap.simple_mind_map_scene.get\",\n );\n expect(createMindmapCommandApplyEndpoint(\"doc 1\", \"mind/1\")).toBe(\n \"/api/mindmap/doc%201/mind%2F1\",\n );\n });\n\n it(\"从 result wrapper 中读取 projection\", async () => {\n const projection = createFallbackMindmapAdapterProjection({ mindmapId: \"mind_1\" });\n const fetcher = vi.fn(async () => ({\n ok: true,\n json: async () => ({ result: projection }),\n })) as unknown as typeof fetch;\n\n await expect(\n requestMindmapAdapterProjection({\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",\n fetcher,\n }),\n ).resolves.toEqual(projection);\n });\n\n it(\"command apply 成功后可刷新 adapter projection\", async () => {\n const projection = createFallbackMindmapAdapterProjection({ mindmapId: \"mind_1\", kernelRevision: 12 });\n const fetcher = vi\n .fn()\n .mockResolvedValueOnce({\n ok: true,\n json: async () => ({ ok: true, kernelRevision: 11 }),\n })\n .mockResolvedValueOnce({\n ok: true,\n json: async () => ({ result: projection }),\n }) as unknown as typeof fetch;\n\n await expect(\n executeMindmapCommandApplyAndRefreshProjection({\n documentId: \"doc_1\",","v":"2d95PHSNbDxD0B6+Eb+1vX/lUz0mLk29yVqqvLsxKT2usro7Xz82vTgBEr3Dhlw9EH5SPRBFkbxDMLi8QJ3qvOd7hzw6gz29CUg5PdCP0jtglHa8D42DvP3BTzxtrf+8mYs1PXhacz2xplm7rlA6PU53yLxr56M8JOqNPW5kvDxBQ/c8RKfFvO1Whb3kxU+9ZS4YPJA9frxiM/y82OWDO12YirsnFvy8QrMTvLNmyrzBkY09DzvpPArcMj3vciw8LQ0cPWKSNL2NUFg6mfUKO0vMozy86PI7WHEcPq33gj0yJF683zPfvIO9Ej3bYJy6Dr5nvE/p3zyKL5i7+rCEPTi9gj0RsBa8K9ppvY9Utj2Vllq9THe1PB+gGz3Hl+U7fMijPFIzOL2ghlW9rtAEPOsEYrx54x+93QwhvaEvLj0M6yy9ksPtOQtCbD08CjM8SR0vPUd4jrxqmkE8uQ2iPM2KCr2HwaE9/LAaPYIUE7yePC683ZuGvDaxUL1kx+q8pIAnvYJiXLoSry68uDiMvHeJ1DyvX9s8XOaevBXaH732wNC8nMatPV8iujyCeIk72QkOuxd9Vr0myki8Lr4bPQUpBb341GW9LQFju7uthr1IICY7W//ZPGUh67t7XFQ9pPFdu7Mr+7t3phe7WNsZPTzCGD0dqNM8LquavOjw8rvZ5Qw9OPZWvZYr2Tvq1r06o+gBvZDmJT3qLHE9IlgwPUusObznQO28jx3yPEP21jwRNQs9Adw5vDbFiLzxjbO8cyobvE3cR72BS3A9wIVWvV/uJryvkIw8HshivRGKbT2GQy08j7oUPdi6yzypv7u8Dh7rO9kfnjxV08c8kJj3PNDgLD0Aeye8T+9IvULqWj2JLs273dOdvTxjmDyHMd88PDt7PMX+aj2UbjG9xIgRvcGQuzvFVS288C0cvU8nVLz2lEU8xrwyvfPfpzzUHRA7I6jdPFQUoL24WHM8yJ6oO7ZcdL0wv2y8sCp4vGiCfbz99Jg69x1OvNZvoDxOtEa91jmRvUwI9rwNB3K8cjRJvU18AzwLii29hAu8Oyj637wq3Eg8lS2NPFDJhDvNjRE9HnpSvTQgtjysBUi9kdniPG740LzGtMk8/XI4PeuQiLwPmNg8wzlBPecOj7xTRQI9Q5LaPJr+xLwo/0i9jAHBvEOLBD14bPK87bpAPV3ARTgbrQU9PLxyPCrJizt7pVe8uchVvP4juTtTXDS9RCeKveHyyTwWnoI9rL9UPHY8gLuKqmg8d5lDPYo6kTuqsE0870PPO0toQLsNmJg7yjBputRMgb0+lpi841jjPKzg2Lw4iY483e+kPHIK+LxQmNC75JraPPzqPz2lAAE95luLvfIkNTwjqAm9UPTmvLFxuryFiCo9H0eMvF4cOD0sNbQ8NYQ7veYpt7w9b3M87pr5PPPQWbvHkIs7xgUPvSW2zjyRb4y8oaWxPJZZ5TzgyZg8K5GhvAxoPDvDx0+9fnMxveBQpb08R0e9bsawvG0RxrqW/7u8M4Xzu3r8D73lEMm74+YhvXpJSDx/PBi8lQMgPFISKb0gDmQ9rWJjPKhocTwpjFQ8o0ZJPGixn7sjJSe958k0PLUY9TzgELo9B906PbWRWby6rFO9EVjGPDGcg7
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.test.ts","s":49,"e":108,"m":1778491178825.9175,"t":".mockResolvedValueOnce({\n ok: true,\n json: async () => ({ ok: true, kernelRevision: 11 }),\n })\n .mockResolvedValueOnce({\n ok: true,\n json: async () => ({ result: projection }),\n }) as unknown as typeof fetch;\n\n await expect(\n executeMindmapCommandApplyAndRefreshProjection({\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",\n commands: [{ type: \"updateText\", mindmapId: \"mind_1\", nodeId: \"root\", text: \"新标题\" }],\n projectionRevision: 10,\n fetcher,\n }),\n ).resolves.toEqual(projection);\n expect(fetcher).toHaveBeenNthCalledWith(\n 1,\n \"/api/mindmap/doc_1/mind_1\",\n expect.objectContaining({\n method: \"POST\",\n body: expect.stringContaining('\"commandName\":\"mindmap.command.apply\"'),\n }),\n );\n });\n\n it(\"command apply 失败时抛出可定位 command_failed 错误\", async () => {\n const fetcher = vi.fn(async () => ({\n ok: false,\n status: 409,\n json: async () => ({ error: \"revision_conflict\" }),\n })) as unknown as typeof fetch;\n\n await expect(\n executeMindmapCommandApply({\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",\n commands: [{ type: \"deleteNode\", mindmapId: \"mind_1\", nodeId: \"node_1\" }],\n fetcher,\n }),\n ).rejects.toMatchObject({ code: \"command_failed\", status: 409, message: \"command_failed:409:revision_conflict\" });\n });\n\n it(\"data put 失败时透出 route 错误细节\", async () => {\n const fetcher = vi.fn(async () => ({\n ok: false,\n status: 400,\n json: async () => ({ error: \"mindmap_put_failed\", details: [\"missing_root_uid\"] }),\n })) as unknown as typeof fetch;\n\n await expect(\n executeMindmapDataPutAndRefreshProjection({\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",\n data: { data: { text: \"中心主题\" }, children: [] },\n fetcher,\n }),\n ).rejects.toMatchObject({ code: \"command_failed\", status: 400, message: \"command_failed:400:mindmap_put_failed\" });","v":"lIrpuzCR2TwbQBa+2ZNwvU8+0T3/gGu9PT++uiwDhztt5o88Bh96vXOaa70+VEM9L4G/PXO26zwUvr88FuoDvQ0NAD3F2qC8nLTnPJxBQjyBDby7PowhO9LxAjzLFJm8AIpRPSFFyTyXLzo8EecLPB9vA72Vug89ZPCJPEExezxht7s831bYurWs9r1IJ2G92vwLPV6CQ73AXIQ8ZnGTvAkmtDx9b6G8QDPUO8NIQb2IwxI9sH52u6fNaT3bPjo9mAJ8PX0eer0Bx8Q8j6SJuzKjVT3QexK9xXLiPZqIYj2BxSQ8/JjXvHFYL7zyBbu8MCS1PMFbHT2qHZE8R+ViPev+qz19E4o6iUw8vTGFxT1nZ9S7qoVougNJWD299Kq8R6lNPMhY5rvfxOq8HBfQPA/awbvaE0O9lbhUvQ/0iT2MiIm8mD6dvLtCSz1rsXo8japPPca7l7xJiZK7Jo4LPeRXCL0ceqs9AKh5PNuwTzy7inW8tx+RvLUcd72QwBW9h44mveSvzDsbyOK8juW1POOd/Dt44hM90vfcvEtSK70N+P68BpSIPatn7jzr0925obxeOMuygr2tOwu8aHIpPUaNzbxY40a9JjY5PGrOcb1Z8ME7bO4nPbjGLTtFVis9RsB4vM4qw7weiIW8NUUmPU3uiDwVHAI9oF8SvYXAHjwratM8mmfEvLthkrxvPCY77wZTvQO5BD05nUM9STmEPdDDQr1XDB29ijksO6ArXby3NWs97FhTu8tfVrywmdW899OTvOcoRL0Xz1U9Frs4vfPOB706FJQ8OPaQvMyc/zsV0CU9CWpBPKi2VT0fWsG85Ws3PVBACz20mrc8Jn/iPFtwIj2qIVg8GXidvT+PMT17mJS8B5pLvejgmTxxEDA9P1kmPKxXYj0Nmeu8uP+gvF3/QDx2cFG8r2faOzkFAj1Uuxw965hmvfWcxDp0PwS9kXPbPCTdPb00JiA9kVD/O2Fqpr2Qh1u6PnBuvBbYr7oygrO7tsiUvZGpDbxWWyG9s6BovYfXwTwWn266/uRovXEVTjuGDn29LsLWPHXXVbvSefk7yODuuzKgkjymCus8UJeEvYUhJj0mqSO9oIKqPSe4fbyutG87TE+YPdk587yCnQM8rbWFPOPOLr1oF5w87ZTAPP9AWbxiEj29yz6TvKk/qzxuGuu8nPy3PJ5aTzvsqiQ95ICqPAiWory6F+G8+C0avIsa/bxjbtq8f3zMvSzfVDtEQ/s78bCrOrC1fjyV0n48os9YPXsw9DxnQuw8lW8vvMbwIzwA6O263a2+u7pybb2VOqg7eVl3O6TlyrxEynq7FeuNPMZWNbyrSug7PgkBu6d7HT00uA89SXAmveQE3jw5x5A77GkOvSWcz7w+Kbc87F0vu3/eFz0sx6+8yW7rvMumyLwdzRq87W33PF9gZzwMipo7IsFzvDu60jnSrY48Ow/6PGajwbsb1U09KN/BuxgpxTxXNWa8UDmhvJ/xK73atq28Eozcu9Yh1zxus5y8tfVyvGqADr2l8AQ7Fn9rvInO/7sELcO8FE2Nu2jnBb1jR3I9AGMovA/L1zyLLVG7ybcPPK8D0bzGMwS96FshPQKbWz1FzGI9CdcMPGQF6LzCdwu9kEPXPD8Oq7nlr7Q7ubkmvflSprvcfim86qZovXwqjznavK284uZuPauyVj2Vaio9bdG/PIObvTvhxVu95qeNvBg7lbzl+tS726t+O9s3gT2k4me8Ryk3PXg3Dbw4ab68DrBsPbe8fLvoexU92F6wvJHXKLoAZFm8bWpevNl0XD2m93+80j5KPQps7Dx2Zf+8x3Y
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.test.ts","s":97,"e":111,"m":1778491178825.9175,"t":"status: 400,\n json: async () => ({ error: \"mindmap_put_failed\", details: [\"missing_root_uid\"] }),\n })) as unknown as typeof fetch;\n\n await expect(\n executeMindmapDataPutAndRefreshProjection({\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",\n data: { data: { text: \"中心主题\" }, children: [] },\n fetcher,\n }),\n ).rejects.toMatchObject({ code: \"command_failed\", status: 400, message: \"command_failed:400:mindmap_put_failed\" });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts","s":1,"e":60,"m":1778645763929.0535,"t":"import {\n createSimpleMindMapBridge,\n type MindmapAdapterProjection,\n type SimpleMindMapBridge,\n type SimpleMindMapBridgeEvent,\n type SimpleMindMapPluginName,\n} from \"./simple-mind-map-bridge\";\nimport type { MindmapCompatPayloadPatch, MindmapKernelCommand } from \"./mindmap-command-diff\";\n\nexport type {\n MindmapAdapterProjection,\n SimpleMindMapBridge,\n SimpleMindMapBridgeEvent,\n} from \"./simple-mind-map-bridge\";\n\nexport type LeptosMindmapAdapterOptions = {\n el: HTMLElement;\n projection: MindmapAdapterProjection;\n mode?: \"edit\" | \"readonly\";\n pluginNames?: SimpleMindMapPluginName[];\n runtimeOptions?: Record<string, unknown>;\n onEvent?: (event: SimpleMindMapBridgeEvent) => void;\n};\n\nexport type RequestMindmapAdapterProjectionInput = {\n documentId: string;\n mindmapId: string;\n endpoint?: string;\n fetcher?: typeof fetch;\n};\n\nexport type MindmapCommandApplyInput = {\n documentId: string;\n mindmapId: string;\n commands: Array<MindmapKernelCommand | MindmapCompatPayloadPatch>;\n projectionRevision?: number | null;\n endpoint?: string;\n fetcher?: typeof fetch;\n};\n\nexport type MindmapDataPutInput = {\n documentId: string;\n mindmapId: string;\n data: unknown;\n projectionEndpoint?: string;\n endpoint?: string;\n fetcher?: typeof fetch;\n};\n\nexport type MindmapCommandApplyResult = {\n ok: true;\n kernelRevision: number | null;\n raw: unknown;\n};\n\nexport class MindmapCommandBridgeError extends Error {\n readonly code: \"command_failed\";\n readonly status: number | null;\n\n constructor(message: string, status: number | null = null) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts","s":49,"e":108,"m":1778645763929.0535,"t":"export type MindmapCommandApplyResult = {\n ok: true;\n kernelRevision: number | null;\n raw: unknown;\n};\n\nexport class MindmapCommandBridgeError extends Error {\n readonly code: \"command_failed\";\n readonly status: number | null;\n\n constructor(message: string, status: number | null = null) {\n super(message);\n this.name = \"MindmapCommandBridgeError\";\n this.code = \"command_failed\";\n this.status = status;\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst readErrorDetailFromPayload = (raw: unknown): string => {\n if (!isRecord(raw)) return \"\";\n const detail = [raw.error, raw.message, raw.details]\n .map((value) => {\n if (typeof value === \"string\") return value.trim();\n if (Array.isArray(value) && value.length > 0) return value.join(\"|\");\n return \"\";\n })\n .find(Boolean);\n return detail ? `:${detail}` : \"\";\n};\n\nconst readErrorDetail = async (response: Response): Promise<string> => {\n if (typeof response.text !== \"function\") {\n const raw = (await response.json().catch(() => null)) as unknown;\n return readErrorDetailFromPayload(raw);\n }\n const rawText = await response.text().catch(() => \"\");\n if (!rawText.trim()) return \"\";\n try {\n return readErrorDetailFromPayload(JSON.parse(rawText) as unknown) || `:${rawText.trim()}`;\n } catch {\n return `:${rawText.trim()}`;\n }\n};\n\nexport const isMindmapAdapterProjection = (value: unknown): value is MindmapAdapterProjection => {\n if (!isRecord(value)) return false;\n return (\n value.schema === \"mnote.mindmap.simple_mind_map_scene.v1\" &&\n value.runtime === \"simple-mind-map\" &&\n \"root\" in value &&\n typeof value.kernelRevision === \"number\"\n );\n};\n\nexport const createMindmapAdapterProjectionEndpoint = (documentId: string, mindmapId: string) => {\n const doc = encodeURIComponent(documentId);","v":"8ckJPS73ObwLG+K9p5XNvQrChT2ORS69eLgUvYyoi7ztplk9jVJhvdDNT709SRI9nzi9PaqOTTwq9DE9kRPEvOI2P7sofoa9RfaZPH1xHD15ak49WRztu+6R3jzRYo28E1E7PbM/lzyyMg+8ck2HPLRgXr19SnA8xLVpPNuypTxn4l086/KYuynl0L0y9Ji8YA/uvKlD8bwrWxQ8VD+2PG8rZTw0AMq8eX0QvRbkn7wQB5s94A9TvOeW3D3xlP48wElxPYpfir0IO0k9nFtEvRu5Xz1uS1k7t73BPWJI0jxru2u9qJ5kvPtmYbz0Lhq9qvbEPOYssD1J0LM79od8PYIsIj0Lqle8uvpXvQhhwD0peJy7a0oBu92T+jzibce7V1KPO5ZiRb1cSzu9nqdQPVTRNzyYdIe9v/tmveikVj0ndMW8XWKVvMDcDD0VLuQ8+dozPWH9yryMMxC8EgQmu9cpS73BYio9BZ8pPX58WbxL6o88khZ/vDIFO70jKtc84e3lvKymGD0vAYA6UqN6vJzYID0p5Ci9NZpLPCoRQb2mNk48qd1HPd7bdD3G6528Fu8evEtYML29AXS86A9FPb3Rkb1rgYG8fCRoPF3HQL0zzxo9XuJ5OxRqlzuZbyE9NDPevDnE4LxAU+y6O4bsPBICFT1ZoLk8x5rrPEmdqTx2hCU8tyeCvTUbZb06mNQ85aoZPJmGpzxyJRM95x45PQHZjLze0Re81Ffgu4GwEr0jdiU8VqkGvJ8Gzrx/SC08/kjXO1NhEL2MLHk9ezvcvOoCQbwGFNe78J6AvGoexDzmfTY5041MPRpc7jw7s6K8exWRPLNxNbzDu5C7G23XO3Sh4DwZ0t880k2rvQPX6jy/RJi8kU8VvXa93jzbGuY8LyOtPISNZDoRaIS97Ft6vTdBED0YaHA7MsJtOiypEL3AAGk8A0sBvFcxizsb6G69hYgJvBB3rr3d+T09UegmPYHChbvA8mi73CiRPNljFTz0Iw89GPMTvX/GLLzvM4m8vKdOvUu/iLxdvBK9tF7JvVKFwrtf0fO7MwXKPFtP7bxJMYw8XYaovM1q6TvAENQ85VByveUfFL32eDm9KE92PUT9Tr3o99O7YlCgPdRN1ryBy0U8UCEYO5rpxbsBMDS7axunuyud0LtrwGC9z/ngu0L9RjyYGd68pFuKPaZrzjyahnU9TT1IPVpgDr1THHs62dFCvIeABb14C0S8ZPGDvenOhTxRDtY8gH9nvGSWybzC7R89i8+IPS4WCjy71cw8HnMYvDITebxidx88TPEnvfCIkbzP5Hq6z9UZvb5C/7wahZU82O6DPFoF+7owgcw8tA6RPKEGeT3gRtc8tWrPvJUUljwGtCs5QUcMvMPTXbzuxys9Bc4YPMRvAj36pzO81Pl1vLs0aLwzFcS8SzX2PFr777w4/pg8k0ekvO4mBjzwzj47/2zQPGccWjyRADg8N1JzuSbtpbrNQ1K95CQgveXGC72GZnu8rjoWO1D6+TtEfAO9NqN9vFcJkLz9poy8Ri2Vu/v1NLynSj69TGNGPb7MpDooQdM81nb9vFbW9DywFSa7RvjDvDhmV7xpaU69OUC2PEbpDz3E93U946lIPfdsmLzfYnC8lqSevBUM97vjLWA7nZqZvFcbJ71+pf27cWLuvAOwIDn7qA+9LrqyPGeQGT1tfmW8I11BPY+bqbzPwg69pZkrvQllYD22p1w74pKtvM8vkj1M8b28Qhn7OzFHObw91G68u/k6PbuFfLyGmoW6fSN6vPSdTr3Ngti7c53ZvKJqvrqS3p88D6fHPJn7RD39bBu9QqUzPWrtBDy/y2S5md0XPG2/6rw/5UW970s0PQVtmTzhmta8tFxYPFInjzwsH5y8dHEWvL1U3zu41hM98a4dPGmWZbyU6wA7X3pePNimhTyn2IM84ZrXvNNe8zvgw3o8/+MzPY3iWrwRBsQ8
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts","s":97,"e":156,"m":1778645763929.0535,"t":"export const isMindmapAdapterProjection = (value: unknown): value is MindmapAdapterProjection => {\n if (!isRecord(value)) return false;\n return (\n value.schema === \"mnote.mindmap.simple_mind_map_scene.v1\" &&\n value.runtime === \"simple-mind-map\" &&\n \"root\" in value &&\n typeof value.kernelRevision === \"number\"\n );\n};\n\nexport const createMindmapAdapterProjectionEndpoint = (documentId: string, mindmapId: string) => {\n const doc = encodeURIComponent(documentId);\n const map = encodeURIComponent(mindmapId);\n return `/api/mindmap/${doc}/${map}?view=simple_mind_map_scene&queryName=mindmap.simple_mind_map_scene.get`;\n};\n\nexport const createMindmapCommandApplyEndpoint = (documentId: string, mindmapId: string) => {\n const doc = encodeURIComponent(documentId);\n const map = encodeURIComponent(mindmapId);\n return `/api/mindmap/${doc}/${map}`;\n};\n\nexport const requestMindmapAdapterProjection = async (\n input: RequestMindmapAdapterProjectionInput,\n): Promise<MindmapAdapterProjection> => {\n const fetcher = input.fetcher ?? fetch;\n const endpoint = input.endpoint ?? createMindmapAdapterProjectionEndpoint(input.documentId, input.mindmapId);\n const response = await fetcher(endpoint, {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n throw new Error(`projection_load_failed:${response.status}`);\n }\n const payload = (await response.json()) as unknown;\n const projection = isRecord(payload) && \"result\" in payload ? payload.result : payload;\n if (!isMindmapAdapterProjection(projection)) {\n throw new Error(\"projection_load_failed:invalid_adapter_projection\");\n }\n return projection;\n};\n\nconst readKernelRevision = (value: unknown): number | null => {\n if (!isRecord(value)) return null;\n const candidates = [\n value.kernelRevision,\n value.projectionRevision,\n isRecord(value.result) ? value.result.kernelRevision : null,\n isRecord(value.result) ? value.result.projectionRevision : null,\n ];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) return candidate;\n }\n return null;\n};\n\nexport const executeMindmapCommandApply = async (\n input: MindmapCommandApplyInput,\n): Promise<MindmapCommandApplyResult> => {\n if (input.commands.length === 0) {\n throw new MindmapCommandBridgeError(\"command_failed:empty_commands\");","v":"ZvMXPUNTm7xyl9O9IxneveTHDD1hG4i8gJJyvbTMIjuKcwc9VWK7vDdJV73KY0Q9Q7XRPRm9TDxLUJw8Mi8PvBKogDxvGDa9GIC/PHbZNT1XAFg93dufvDzRUj1cLde8DGutPVGJ+zxkPnM8l6QMPDxLHb35QTM9Hs9kPK2FFT13Wmc76Pj3ui1OyL3gLCu9uEmOO6xMbLyZHUM7RIAiu5+1wLuN9DG9APY0vXCgtbso8W09R+3uu7dkuT1RziA9q4B3PYyYn70eIRc9GOFUPD67kj0lQjO8iF6mPTYvvDxe8My8mrj1u3SmtzwyHxW8mn+kPCGQNT0RT4M8sb+LPdckiz1emo+8145UvXErxj3aLqK8zvpDPKbI3TztOYM7/kAzvPp6lLx1Qne9+PNXPRQa/zs8F3S9o+uRvSSSVT1Nlhe9117FukLhjj3Q/fy7crd+PZMcgrxpMj08VM4/PKrlL72YrQ49iKpwPIiToTzst9w8s90JvUBqMb083Jk89bo8vYjEOD10Uwe8aTzOu2ja5jwzA0+8fnyRPBplLL1qzfY7ZzEzPXNfjz3gdGm8M+HSOxKB7rzodZu8JCANPe4zhr2v0MC8H1KAuWGgNb25yTs8tMmmu9slxTyDMBE9m/lDvFvdxrtkFAW8xoeTPOQu7zyx6zo9A/hQPL8bBrwGYPo8NtYyvT50Ub3STwA7m30VPcE9sTzY3eU8P09DPWNl/rxELBS9mZmPOhxD2jrzi5Y7AdRDvNiFdrxquIW8LT2nu/j8Y71Fb2A9PrVdvamXXbwIT4i8gbpyvJaM5TwIu5M8zp1bPVtK7zyxhTK9kUEruztNkLySUae8MQ2Qu5QyjzzmAag8AE07vcp8CD1Z3rK7XxxMvbBCpzysXLg8r82APF+ZRTyvfFS914VXvfWYhjyuyUy8KstXu1+nFL2vYoc8w59KvKsYbzyOqO+88RX2PLdoiL3kdo09AG0SPWJKvrtqVKS767etuaYg9zvuY2I87fAPvR0mBjteG/28MLlHvTG4nLwmG668PUqjvTX5RDw+iv+6RV4CPSWtNb1JWO86Bz0VPE+SYLu3/h89F5afvWFVM7vfKFC9/4FiPaWmBr3x5428erxLPfqBzrzKlR48f4UGO8BJD73X2Im7OrkhPHfco7w+oQi9sSSTO1jAOrxfbe28nrKlPQoh4zwhbHw9zb5HPevM1LwbK9O6HKMUPFXvgbxn2au8bC+lvf3QGT3kYRc9wW6Iu1Wd8Lr7sUM9nfqjPZimZzybIgo99pcEvCfuDLzUmn48l1I4PDQOR73McEE6pHi0vDu2Or2BW6Q8vjO5PBIgkTtO8CA9LeXjOqfblT0hAJ08Kyv8vATq9julB0M7AczmvOoDRrzL4f88qPpEvOSZZj2SzKG8XIalPMbdvrwJGqa7lOSoPIvxorxBFna78gAYvT6hpDwybV28Ch8ePVeqiTxx7IM8OqqUPH5yTTtMsle9ebp9vesCnL3cwbi8Hl5yvLRwCzwc+TK9Cv4VO/B1KbwjZqK8t927Os0ACryJeG
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts","s":145,"e":204,"m":1778645763929.0535,"t":"];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) return candidate;\n }\n return null;\n};\n\nexport const executeMindmapCommandApply = async (\n input: MindmapCommandApplyInput,\n): Promise<MindmapCommandApplyResult> => {\n if (input.commands.length === 0) {\n throw new MindmapCommandBridgeError(\"command_failed:empty_commands\");\n }\n const fetcher = input.fetcher ?? fetch;\n const endpoint = input.endpoint ?? createMindmapCommandApplyEndpoint(input.documentId, input.mindmapId);\n const requestBody = JSON.stringify({\n commandName: \"mindmap.command.apply\",\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n commands: input.commands,\n projectionRevision: input.projectionRevision ?? null,\n });\n const response = await fetcher(endpoint, {\n method: \"POST\",\n keepalive: requestBody.length <= 60_000,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: requestBody,\n });\n const raw = (await response.json().catch(() => null)) as unknown;\n if (!response.ok) {\n const detail = readErrorDetailFromPayload(raw);\n throw new MindmapCommandBridgeError(\n `command_failed:${response.status}${detail}`,\n response.status,\n );\n }\n return {\n ok: true,\n kernelRevision: readKernelRevision(raw),\n raw,\n };\n};\n\nexport const executeMindmapCommandApplyAndRefreshProjection = async (\n input: MindmapCommandApplyInput & { projectionEndpoint?: string },\n): Promise<MindmapAdapterProjection> => {\n await executeMindmapCommandApply(input);\n return requestMindmapAdapterProjection({\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n endpoint: input.projectionEndpoint,\n fetcher: input.fetcher,\n });\n};\n\nexport const executeMindmapDataPutAndRefreshProjection = async (\n input: MindmapDataPutInput,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts","s":193,"e":240,"m":1778645763929.0535,"t":"): Promise<MindmapAdapterProjection> => {\n await executeMindmapCommandApply(input);\n return requestMindmapAdapterProjection({\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n endpoint: input.projectionEndpoint,\n fetcher: input.fetcher,\n });\n};\n\nexport const executeMindmapDataPutAndRefreshProjection = async (\n input: MindmapDataPutInput,\n): Promise<MindmapAdapterProjection> => {\n const fetcher = input.fetcher ?? fetch;\n const endpoint = input.endpoint ?? createMindmapCommandApplyEndpoint(input.documentId, input.mindmapId);\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n data: input.data,\n createOnly: false,\n }),\n });\n if (!response.ok) {\n const detail = await readErrorDetail(response);\n throw new MindmapCommandBridgeError(`command_failed:${response.status}${detail}`, response.status);\n }\n await response.json().catch(() => null);\n return requestMindmapAdapterProjection({\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n endpoint: input.projectionEndpoint,\n fetcher,\n });\n};\n\nexport const createLeptosMindmapAdapter = async (\n input: LeptosMindmapAdapterOptions,\n): Promise<SimpleMindMapBridge> => {\n if (!isMindmapAdapterProjection(input.projection)) {\n throw new Error(\"adapter_init_failed:invalid_projection\");\n }\n return createSimpleMindMapBridge(input);\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-action-map.test.ts","s":1,"e":60,"m":1778688996967.2717,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n getMindmapActionMapping,\n listMindmapActionMappings,\n mapMindmapActionToCommand,\n} from \"./mindmap-action-map\";\n\ndescribe(\"mindmap action map\", () => {\n it(\"把核心节点动作映射到 runtime command 和 kernel command\", () => {\n expect(mapMindmapActionToCommand({ actionId: \"insertChild\", mindmapId: \"mind_1\", activeNodeId: \"node_1\" })).toEqual({\n runtimeCommand: \"INSERT_CHILD_NODE\",\n command: {\n type: \"insertChild\",\n mindmapId: \"mind_1\",\n parentNodeId: \"node_1\",\n node: { text: \"新节点\" },\n },\n });\n expect(\n mapMindmapActionToCommand({ actionId: \"insertSiblingAfter\", mindmapId: \"mind_1\", activeNodeId: \"node_1\" }),\n ).toEqual({\n runtimeCommand: \"INSERT_NODE\",\n command: {\n type: \"insertSiblingAfter\",\n mindmapId: \"mind_1\",\n targetNodeId: \"node_1\",\n node: { text: \"新节点\" },\n },\n });\n expect(mapMindmapActionToCommand({ actionId: \"deleteNode\", mindmapId: \"mind_1\", activeNodeId: \"node_1\" })).toEqual({\n runtimeCommand: \"REMOVE_NODE\",\n command: { type: \"deleteNode\", mindmapId: \"mind_1\", nodeId: \"node_1\" },\n });\n });\n\n it(\"把视图动作映射到 localView,不依赖 active node\", () => {\n expect(getMindmapActionMapping(\"centerRoot\")).toMatchObject({ target: \"localView\", runtimeMethod: \"centerRoot\" });\n expect(getMindmapActionMapping(\"zoomIn\")).toMatchObject({ target: \"localView\", runtimeMethod: \"zoomIn\" });\n expect(getMindmapActionMapping(\"zoomOut\")).toMatchObject({ target: \"localView\", runtimeMethod: \"zoomOut\" });\n expect(getMindmapActionMapping(\"fitView\")).toMatchObject({ target: \"localView\", runtimeMethod: \"fitView\" });\n expect(getMindmapActionMapping(\"fullscreenCanvas\")).toMatchObject({ target: \"localView\", requiresActiveNode: false });\n expect(getMindmapActionMapping(\"fullscreenPage\")).toMatchObject({ target: \"localView\", requiresActiveNode: false });\n expect(getMindmapActionMapping(\"exitFullscreen\")).toMatchObject({ target: \"localView\", requiresActiveNode: false });\n expect(getMindmapActionMapping(\"showMenu\")).toMatchObject({ target: \"localView\", requiresActiveNode: false });\n });\n\n it(\"全屏动作不产生 kernel command,readonly 下仍可使用\", () => {\n expect(mapMindmapActionToCommand({ actionId: \"fullscreenCanvas\", mindmapId: \"mind_1\" })).toEqual({});\n expect(mapMindmapActionToCommand({ actionId: \"fullscreenPage\", mindmapId: \"mind_1\" })).toEqual({});\n expect(mapMindmapActionToCommand({ actionId: \"exitFullscreen\", mindmapId: \"mind_1\" })).toEqual({});\n expect(mapMindmapActionToCommand({ actionId: \"showMenu\", mindmapId: \"mind_1\" })).toEqual({});\n expect(getMindmapActionMapping(\"fullscreenCanvas\")).toMatchObject({ readonlyAllowed: true });\n expect(getMindmapActionMapping(\"fullscreenPage\")).toMatchObject({ readonlyAllowed: true });\n expect(getMindmapActionMapping(\"exitFullscreen\")).toMatchObject({ readonlyAllowed: true });\n expect(getMindmapActionMapping(\"showMenu\")).toMatchObject({ readonlyAllowed: true });\n });\n\n it(\"导出能力暂缓时不下发未受控 runtime command\", () => {\n expect(getMindmapActionMapping(\"export\")).toMatchObject({ target: \"localView\", readonlyAllowed: true });\n expect(getMindmapActionMapping(\"export\")?.runtimeCommand).toBeUndefined();","v":"mgABPDqd3TwK4SO+rrFYva4Kwz1zTlq9cZMmu7BSIj19Rr+7qyBHvc3BT7zPEGk9Vp9XPS8XOTwBYc68mvxoveJ+Gbs53SS9mFNYPA9UYzwxWZW8owhjvPByPDyQHQ690vCtPSeSRj0UATs8clcOPeIhjLuvcfM8c7yuPbC1OLxILa48gQunvLz8iL0TZD+9PTyyO0wapDwpYDy8Jn1XPMEsSLwS/My71Sazugz9Tr0IFEs9U9LkPDYWmDwmPT87F7pOPU3/aL3g8Ju8Qf8svQM8LjxKN1u8mPQlPuKwJj211/Y7rFaOulZZhDzKvU+9z+Xgu5NDuDwTNwe9IxBSPetWqT21QoC8o5stvRZ/iz2yB2u9On5rPVAoAz1JxLS844EkvBwAYb0jonq9Yb9KvBsGc7w/rf28bmv
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-action-map.test.ts","s":49,"e":107,"m":1778688996967.2717,"t":"expect(mapMindmapActionToCommand({ actionId: \"fullscreenPage\", mindmapId: \"mind_1\" })).toEqual({});\n expect(mapMindmapActionToCommand({ actionId: \"exitFullscreen\", mindmapId: \"mind_1\" })).toEqual({});\n expect(mapMindmapActionToCommand({ actionId: \"showMenu\", mindmapId: \"mind_1\" })).toEqual({});\n expect(getMindmapActionMapping(\"fullscreenCanvas\")).toMatchObject({ readonlyAllowed: true });\n expect(getMindmapActionMapping(\"fullscreenPage\")).toMatchObject({ readonlyAllowed: true });\n expect(getMindmapActionMapping(\"exitFullscreen\")).toMatchObject({ readonlyAllowed: true });\n expect(getMindmapActionMapping(\"showMenu\")).toMatchObject({ readonlyAllowed: true });\n });\n\n it(\"导出能力暂缓时不下发未受控 runtime command\", () => {\n expect(getMindmapActionMapping(\"export\")).toMatchObject({ target: \"localView\", readonlyAllowed: true });\n expect(getMindmapActionMapping(\"export\")?.runtimeCommand).toBeUndefined();\n expect(mapMindmapActionToCommand({ actionId: \"export\", mindmapId: \"mind_1\" })).toEqual({});\n });\n\n it(\"把主题、结构和扩展字段映射到 kernel/compat\", () => {\n expect(mapMindmapActionToCommand({ actionId: \"setTheme\", mindmapId: \"mind_1\", value: \"classic4\" })).toEqual({\n command: { type: \"setTheme\", mindmapId: \"mind_1\", theme: \"classic4\" },\n });\n expect(mapMindmapActionToCommand({ actionId: \"setLayout\", mindmapId: \"mind_1\", value: \"logicalStructure\" })).toEqual({\n command: { type: \"setLayout\", mindmapId: \"mind_1\", layout: \"logicalStructure\" },\n });\n expect(mapMindmapActionToCommand({ actionId: \"note\", mindmapId: \"mind_1\", activeNodeId: \"node_1\", value: \"备注\" })).toEqual({\n command: {\n type: \"compatPayloadPatch\",\n mindmapId: \"mind_1\",\n path: \"nodes.node_1.data.note\",\n value: \"备注\",\n source: \"toolbar\",\n actionId: \"note\",\n },\n });\n expect(\n mapMindmapActionToCommand({\n actionId: \"painter\",\n mindmapId: \"mind_1\",\n activeNodeId: \"node_1\",\n value: { fillColor: \"#dbeafe\" },\n source: \"sidebar\",\n }),\n ).toEqual({\n command: {\n type: \"compatPayloadPatch\",\n mindmapId: \"mind_1\",\n path: \"nodes.node_1.data.style\",\n value: { fillColor: \"#dbeafe\" },\n source: \"sidebar\",\n actionId: \"painter\",\n },\n });\n });\n\n it(\"所有 action id 映射唯一\", () => {\n const mappings = listMindmapActionMappings();\n const ids = mappings.map((mapping) => mapping.actionId);\n expect(new Set(ids).size).toBe(ids.length);\n });\n});","v":"K8qBvDucMD0JbAu+JRtHvb8Rkz1W8Eq9blPFPC5hHz3P3JG8QZykvRFWibzhP4Q9kGd0PYMEND2O0lI9haTgvJD38LwDuCe9963JPOT1Ej0ZGM67lvHfu4Bz37yle4O9mp6IPYtv4jxEXSY8wk/NPP2TKb2ESoc8wzM6Pf/JtrvcxMu7YTIFvMW0zL1NFoK9x0HFPLYpx7xMC1m5H+pdOz6DV7yOpzi8WmLguxWiSr0oxkc9i+X3OrYBND3YuYE8UmqZPUHaJb29e6C7NL4Wvau68TzP7b66r9UbPlSRhz1kjyg9IRfhvF1WV7vP1om9W2bdPAnt9jzV2qO8Hj3ZPD1poT2N/rE7eZIvvDuhmz04iLK8np4uPLIcQD0cSo28lc6su/0bGL3Z6Q69fdncO7Nn/7rbCtC8sfqZO/0jUz2FfgC99l3COvYVbD2pMRY8m1y/OHN7tzxGKMW7hMzgO26W+Dp0Nc49wU0CPaoqGLwhm/m8Nq6GvBBX7rxxg2W97JMCvUG0vDw/Y0M6x8Neuy/W4zw6qQE9ezm6u7gAEL0+UMu7lBaSPcoHu7tBedM8h7ZKvMhilb2AEiU7plDxPOOyRrze2ky9rz5kPKBvJb1GiLM8UGMUOxdAHTkZiko9b5KYu9BWDr1iBp08WMJcPeAbVD3OCLg88IrdvFSxUjuwogy9MF7SvBkOjDywJRc8untRvfi9ZzyZ6pE8CVl4PRLZ67yjewK9gjaSPGSsvrzUygA9TR0bPGPU4bzR5/C8xxubvLSNi71ZSYU9+Q+qvCJxOb0DOdk8tFlEvX38Dj08Sd+7W/4KPSX/0jyENpy7qdqGPOQHGzz4iWu8ZHTrPD4HID2Zlhg82iLcu1xsLz23lza9uC+uvQubozyTyB49qOMGOwrmID0fV2y9E2OgvPIVIb2ZvDy8Lup9vLVu3bqXaBM9qS5ouykaljwjuv+8RGbpOxsnb71n6oU9LvvOu/vnnr3K1wu9W2sKPMeYtbhyjky8Huc1vV1oATy502O9yWBmvTHrgDzBeYm8byvJvHA/J7wq0B69qDENPP0oTrwfpcs737dPvINlPLtjiTo9RLwfvRK5CD30Fcy8Kmq0PU93erykFG67v0ycPfE8Jr1VULQ703jRPLEnHDr+oZo8Y9WVPKyBrbxsUd68kx4xu05lhjx5/yK9aCYUPQEU9ryIzqs8V98CPfxvMTz6d987QT2HPCZjyTtBXxO9H1ZxvW6xQT
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-action-map.ts","s":1,"e":60,"m":1778688996967.2717,"t":"import {\n createCompatPayloadPatch,\n createLayoutCommand,\n createThemeCommand,\n createToolbarKernelCommand,\n type MindmapCompatPayloadPatch,\n type MindmapKernelCommand,\n type MindmapNodeInput,\n} from \"./mindmap-command-diff\";\nimport type { MindmapUiActionId } from \"./mindmap-ui-schema\";\n\nexport type MindmapActionTarget = \"runtimeCommand\" | \"kernelCommand\" | \"compatPatch\" | \"localView\";\n\nexport type MindmapRuntimeViewMethod = \"centerRoot\" | \"zoomIn\" | \"zoomOut\" | \"fitView\";\n\nexport type MindmapActionMapping = {\n actionId: MindmapUiActionId;\n target: MindmapActionTarget;\n runtimeCommand?: string;\n runtimeMethod?: MindmapRuntimeViewMethod;\n requiresActiveNode: boolean;\n readonlyAllowed: boolean;\n compatPath?: (activeNodeId: string | null) => string | null;\n};\n\nexport type MindmapActionCommandInput = {\n actionId: MindmapUiActionId;\n mindmapId: string;\n activeNodeId?: string | null;\n value?: unknown;\n node?: MindmapNodeInput;\n themeConfig?: unknown;\n source?: MindmapCompatPayloadPatch[\"source\"];\n runtimeRevision?: number | null;\n kernelRevision?: number | null;\n};\n\nexport type MindmapActionCommandResult = {\n runtimeCommand?: string;\n command?: MindmapKernelCommand | MindmapCompatPayloadPatch;\n};\n\nconst nodeDataPath = (field: string) => (activeNodeId: string | null): string | null =>\n activeNodeId ? `nodes.${activeNodeId}.data.${field}` : null;\n\nconst mappings: MindmapActionMapping[] = [\n { actionId: \"undo\", target: \"runtimeCommand\", runtimeCommand: \"BACK\", requiresActiveNode: false, readonlyAllowed: false },\n { actionId: \"redo\", target: \"runtimeCommand\", runtimeCommand: \"FORWARD\", requiresActiveNode: false, readonlyAllowed: false },\n { actionId: \"editNode\", target: \"localView\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"insertSiblingAfter\", target: \"runtimeCommand\", runtimeCommand: \"INSERT_NODE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"insertChild\", target: \"runtimeCommand\", runtimeCommand: \"INSERT_CHILD_NODE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"deleteNode\", target: \"runtimeCommand\", runtimeCommand: \"REMOVE_NODE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"summary\", target: \"runtimeCommand\", runtimeCommand: \"ADD_GENERALIZATION\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"associativeLine\", target: \"compatPatch\", runtimeCommand: \"ADD_ASSOCIATIVE_LINE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"setTheme\", target: \"kernelCommand\", requiresActiveNode: false, readonlyAllowed: false },\n { actionId: \"setLayout\", target: \"kernelCommand\", requiresActiveNode: false, readonlyAllowed: false },\n { actionId: \"tag\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"tag\") },\n { actionId: \"hyperlink\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"hyperlink\") },\n { actionId: \"note\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"note\") },\n { actionId: \"image\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"image\") },","v":"wN9mPES6OT2jD/q9DvavvWjAtz266G29Um2wvPmeSjxx+S889NlVvc2kgL3bd4o9mtn2PaVV47wabt08jdWwOli6EbxBV5W9EmQ4Pa8fZj3MEZs88NxUvAR0sz0df7e97o0DPAUHjTyd8DU9GmDAvIe/db2Vu7Y8DQR7PXpAyTxXGp08Zr6Uu861k70K0Q07cnJXOwaSYLu+NH483QpIPYhWDbuCQ8g745qzvI9rdr1zBe48Udd3O8YdXz25hng8O7ItPSq6gr0+ibs8shm5vMY90zyppL+8ZYIEPsDEAj0tIrS7wPQKvbXyOz3rZLu8t4ctvPKMMz0WGAu9k5+NPbmx1TzLd3K8Nd1gvR7VlT0aK4C8cGnWPBKDmTxFh5C8dKUZPBfcw7xHFWW9/BuFPDGOvDxB7Ei9GHGjvOLqezwxgEK9RqaZPP2+Mz1PMWA8NikaPW4Akzz6Q127UFHTvG4T87yELT89Lu/QPOf0C72Y4ia85tcoPNAdLb2bgiA8AqUevT2GQzyp+OU8yEsbvU5P4zy+RjC9nFeWPG4qFL12qcQ6ZBsGPa5CxLvIPY27OotRPDUrNb0V
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-action-map.ts","s":49,"e":90,"m":1778688996967.2717,"t":"{ actionId: \"editNode\", target: \"localView\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"insertSiblingAfter\", target: \"runtimeCommand\", runtimeCommand: \"INSERT_NODE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"insertChild\", target: \"runtimeCommand\", runtimeCommand: \"INSERT_CHILD_NODE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"deleteNode\", target: \"runtimeCommand\", runtimeCommand: \"REMOVE_NODE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"summary\", target: \"runtimeCommand\", runtimeCommand: \"ADD_GENERALIZATION\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"associativeLine\", target: \"compatPatch\", runtimeCommand: \"ADD_ASSOCIATIVE_LINE\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"setTheme\", target: \"kernelCommand\", requiresActiveNode: false, readonlyAllowed: false },\n { actionId: \"setLayout\", target: \"kernelCommand\", requiresActiveNode: false, readonlyAllowed: false },\n { actionId: \"tag\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"tag\") },\n { actionId: \"hyperlink\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"hyperlink\") },\n { actionId: \"note\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"note\") },\n { actionId: \"image\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"image\") },\n { actionId: \"icon\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"icon\") },\n { actionId: \"formula\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"formula\") },\n { actionId: \"painter\", target: \"compatPatch\", requiresActiveNode: true, readonlyAllowed: false, compatPath: nodeDataPath(\"style\") },\n { actionId: \"import\", target: \"compatPatch\", requiresActiveNode: false, readonlyAllowed: false, compatPath: () => \"import\" },\n // 导出能力暂缓:UI state 会禁用该入口,这里不能继续下发未受控的 runtime EXPORT 命令。\n { actionId: \"export\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"centerRoot\", target: \"localView\", runtimeMethod: \"centerRoot\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"zoomIn\", target: \"localView\", runtimeMethod: \"zoomIn\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"zoomOut\", target: \"localView\", runtimeMethod: \"zoomOut\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"fitView\", target: \"localView\", runtimeMethod: \"fitView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"fullscreenCanvas\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"fullscreenPage\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"exitFullscreen\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"search\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"showMenu\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n { actionId: \"expandCollapse\", target: \"localView\", requiresActiveNode: true, readonlyAllowed: false },\n { actionId: \"copyNodeText\", target: \"localView\", requiresActiveNode: true, readonlyAllowed: true },\n { actionId: \"readonly\", target: \"localView\", requiresActiveNode: false, readonlyAllowed: true },\n];\n\nexport const listMindmapActionMappings = (): MindmapActionMapping[] => mappings;\n\nexport const getMindmapActionMapping = (actionId: MindmapUiActionId): MindmapActionMapping | null =>\n
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-action-map.ts","s":91,"e":108,"m":1778688996967.2717,"t":"export const mapMindmapActionToCommand = (input: MindmapActionCommandInput): MindmapActionCommandResult | null => {\n const mapping = getMindmapActionMapping(input.actionId);\n if (!mapping) return null;\n\n const activeNodeId = readActiveNodeId(input.activeNodeId);\n if (mapping.requiresActiveNode && !activeNodeId) return null;\n\n if (input.actionId === \"setTheme\") {\n return { command: createThemeCommand(input.mindmapId, input.value, input.themeConfig) };\n }\n if (input.actionId === \"setLayout\") {\n return { command: createLayoutCommand(input.mindmapId, input.value) };\n }\n if (input.actionId === \"editNode\") {\n return {\n command: {\n type: \"updateText\",\n mindmapId: input.mindmapId,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-action-map.ts","s":97,"e":147,"m":1778688996967.2717,"t":"if (input.actionId === \"setTheme\") {\n return { command: createThemeCommand(input.mindmapId, input.value, input.themeConfig) };\n }\n if (input.actionId === \"setLayout\") {\n return { command: createLayoutCommand(input.mindmapId, input.value) };\n }\n if (input.actionId === \"editNode\") {\n return {\n command: {\n type: \"updateText\",\n mindmapId: input.mindmapId,\n nodeId: activeNodeId ?? \"root\",\n text: typeof input.value === \"string\" ? input.value : \"\",\n },\n };\n }\n\n if (mapping.runtimeCommand && [\"INSERT_CHILD_NODE\", \"INSERT_NODE\", \"DELETE_NODE\", \"REMOVE_NODE\"].includes(mapping.runtimeCommand)) {\n const command = createToolbarKernelCommand({\n mindmapId: input.mindmapId,\n runtimeCommand: mapping.runtimeCommand,\n activeNodeId,\n newNode: input.node,\n });\n return command ? { runtimeCommand: mapping.runtimeCommand, command } : { runtimeCommand: mapping.runtimeCommand };\n }\n\n if (mapping.compatPath) {\n const path = mapping.compatPath(activeNodeId);\n if (!path) return null;\n return {\n command: createCompatPayloadPatch({\n mindmapId: input.mindmapId,\n path,\n value: input.value ?? true,\n source: input.source ?? \"toolbar\",\n actionId: input.actionId,\n runtimeRevision: input.runtimeRevision,\n kernelRevision: input.kernelRevision,\n }),\n };\n }\n\n if (mapping.runtimeCommand) {\n return { runtimeCommand: mapping.runtimeCommand };\n }\n\n return {};\n};","v":"SMYPPVbqk7xktbu93vS2vVMsoj1LCIG9X34TvS6EAzs35KE8f9uQvQk2y7zC6r08zWSgPU/EpjzRcd48GdXUvCf+rjwqZri8btBpPQDv8zzBwXg9jX94vOT/tDyU8hO9SZ2VPUyfET2QvQc9cymXPGxJQr2oM5s8xxmpu8VEDj1Mj+Y8ZIVfvCyODL5aYU+8i105Pfq+aLyY2Ao80+AsvCwvKT0CfdY7lYcAvb2NubwiI0E9wDQ1vU5hsj3Lyw89Xo61PRS6rL3ES3O8LHP+vDHdIz2s/gy9hganPYhigj0dI/48rb7nvHAu0DxhLSW8ozj9PBKQPj1+sUW97aBjPSlVeDwi3jq84N8pvdIVjD1ahOc8zeqWOZpXezzXyIu89wN5vG4iWL2TqFa9qNdbPUcSQTxh+Ae9cBoCvUP1Lj1WBoK73kxaPAK5nz1i3oQ7wobtu+dXrDx/xu07nqqoPLpGsbvPqfs8pyp3OzY3pzxtBns8Es0yPK+eM706pkG6XplLPE+1lzzKEyw9JZrQvM9xzTwxMn28GMwiOrSqfbxLw+S8+eLpPEpAiD271R+9XttCvbCRYb2a0hK9utCTPNuovLqIrAa9OB6fPHJML72vog08eJXsuw1sMrnyyi49FWujvFFTP72mhaC8YaC/PEXZKD3D1j88i3gAvVwyjTyzHak81qhNvbelgr1vHWS8XktnPEii2Tx6SbY8SmW5PLvAL70sEyW9242IPBPp97xMKdy6DlQIvff1ybxR49K8Q+xgOrvMh71X+6M86eHqvB/Yc7z5K027h/sIvYxMNjyMXZA9JzVIPd0EPzxj2QO9PSBcPW+XGzwLKQC9Eu0bvNpcOj2VpvO8957bvKAOmzz/MIy79JZDvDuyzTyvlF08PzpqPCX54js072W9AehTveyzfLz2gT69VQDpPMNB5bxeLDI82xNJPOy4KT3StYG8oYuJO5esz7wXYoo9qFfAu3yLNbztFdC8AoAevM+MD73L44A8yLwFvTBQUb3PMYW8ktRhvT8S67ydcbm87YozvQ887jweMda76jtPPT8AEr3YwNO61E/UPKvUsDzu3x49+9Kbvdr1sTzC+E690UVEPSzWnLyOuly7yCyhPbL9b7vDAxQ9wN2eO4GpJ73t1xe9xxDvu1EYFzxMX2O99Oo3PGnIfjv95Ly87/sfPVV/6jw/Uyw9zT8sPQzSHr1r0IU8Ju3ovBHCvrsPGFw8NRK4veuK3jxmzgc8IlSpvOXa8Tw5aWs9/EtuPcWNLz2eorg7jUSSvGNbSrz7ank9XUxVPFLo47yPKxw8B9iGvFNQX7wn8SC8VRBHPS7la7xDJOQ7PGn1u7qhhj0CCtU8rc6ivLpWGLyiP6a8heS0vKmtI7vVALY8ar2hvDVWxDxMZp+8KTIPvaq6Er15rvs7v8fsPMq8tTzkKzA8O+kTvdit8ToKv9g7sTzBPNYETLw/2AU9rT1tPZFqHzym7di8YmrGOrXHK71zGLO8OagRvWenqjzKW4K9RVOfPFDlYjtsQ8c6heMHPKNACDys1yq9asq5vHtsj7xwlFE9QORBOx/GcDy3m8K7NBaRvMeMEDsA8xK9eOBdPNIufD28hCM9mHAYPQ4ChTxGUj68j6eFPOlwFb00JSk9MOlsuo/Yvrx/COY8m3N8vEz53bwOhOo7+Nx6PGEBjLsDZ8U8FWCQPImgo7xHkCG9Em+uvbAAl7u6Ces6/jz9PGhniT0vn9K7EFCFvGkq8Ttr+6u8gE7bPFMG9TwCv+g8EMdnvA0H1LzTgia9dNOAvC270DvDxW68z/W6Pc/ajT0B+Ni817CQPI76sjxkNKQ8CeYzPVOUmbwafg+90l/EPOEEKz1WZAG9sQjJvNFEqbz/wRa7EKQ0PWelFT3nkG09wgYkPc4lVDyfgPQ8PXgHvGermrytQAu7sN0UvQMD27z4iHc9L56LPZwUWzydiI47zcJuvB5EpTwHwAu9bgCmO0cD5jxMb0K9KJZCvQNjdLyHdR881zgNPNtL4jzr4zI96P3TvJ06lrzMSKg8Iq3PPFdtl7wqLsY8wh52u11tiz1CR5A9JFdLOxWyVL2AFCG9kZycPPUTpTyW5D09VqOgPN2fHzxIWii9ljeqPJDxFL3uDOq7vYnHPG2tOT2DGAK8KSZ4PEudU7xt3EC8+/k0PV8yxjw53Gs9IGEnvRgHxTp7mmS933/aPNPADD30Lpc97EjmPCyr8bscb+W8SA1jPAzp/Tx40s+8ANcGPRPBmz0jsoq7wGcoPSPqJz33U8o8fVWgvc5HIjy80yc9tY5xPRZj2zvx1E69KgXpPKG8XL3OaCo8KFwLvez3Wj3f/jU9+iyKvMA/+Dv6R7q8+PDoOyodeD2E1og9jYU2vZaSwrzRxxY8UNP7vKt/E
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.test.ts","s":1,"e":60,"m":1778506368629.5134,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n applyMindmapCommandsLocally,\n applyMetadataOnlyMindmapCommands,\n isLocallyApplicableMindmapCommandSet,\n isMetadataOnlyMindmapCommandSet,\n} from \"./mindmap-command-apply-local\";\n\ndescribe(\"mindmap command apply local\", () => {\n it(\"识别 metadata-only 命令集合\", () => {\n expect(\n isMetadataOnlyMindmapCommandSet([\n { type: \"setLayout\", mindmapId: \"mind_1\", layout: \"mindMap\" },\n { type: \"setTheme\", mindmapId: \"mind_1\", theme: \"dark\" },\n { type: \"patchView\", mindmapId: \"mind_1\", patch: { state: { scale: 1.2 } } },\n { type: \"compatPayloadPatch\", mindmapId: \"mind_1\", path: \"root.data.fillColor\", value: \"#dbeafe\" },\n ]),\n ).toBe(true);\n expect(\n isMetadataOnlyMindmapCommandSet([\n { type: \"insertChild\", mindmapId: \"mind_1\", parentNodeId: \"root\", node: { text: \"新节点\" } },\n ]),\n ).toBe(false);\n });\n\n it(\"把 layout/theme/view/compat patch 合并回完整 mindmap blob\", () => {\n const result = applyMetadataOnlyMindmapCommands(\n {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [{ data: { uid: \"node_1\", text: \"子节点\" }, children: [] }],\n layout: \"logicalStructure\",\n theme: \"classic\",\n themeConfig: { lineColor: \"#60a5fa\" },\n view: { state: { scale: 1 } },\n compatPayload: { source: \"compat-blob\" },\n },\n [\n { type: \"setLayout\", mindmapId: \"mind_1\", layout: \"mindMap\" },\n { type: \"setTheme\", mindmapId: \"mind_1\", theme: \"dark\" },\n { type: \"patchView\", mindmapId: \"mind_1\", patch: { state: { scale: 1.25, x: 10 } } },\n { type: \"compatPayloadPatch\", mindmapId: \"mind_1\", path: \"nodes.node_1.data.fillColor\", value: \"#dbeafe\" },\n { type: \"compatPayloadPatch\", mindmapId: \"mind_1\", path: \"style.map.backgroundColor\", value: \"#0f172a\" },\n ],\n );\n\n expect(result.errors).toEqual([]);\n expect(result.applied).toBe(5);\n expect(result.data.layout).toBe(\"mindMap\");\n expect(result.data.theme).toBe(\"dark\");\n expect(result.data.view).toEqual({ state: { scale: 1.25, x: 10 } });\n expect(result.data.children[0].data.fillColor).toBe(\"#dbeafe\");\n expect(result.data.compatPayload).toEqual({\n source: \"compat-blob\",\n style: {\n map: {\n backgroundColor: \"#0f172a\",\n },\n },\n });\n });","v":"BintPDymmzz/uh6+LAypvTlupz2/rgy9bKEKu7iSbD1zUUw8rD59vWA//rtMWks9Me6FPUBoXDxRbgK9wltCvSdFfrzAGBi9Wu01Pc9GOjwS/ju85kLrvC3yfzzOIiW9stxmPR3zhz3IWUM8fBM+PYnJebwm3Nw8h5HAPZBMrzzS7Z88a5iQvLJNEL29vA69RnqwuzDKMzyo5c68gAsMPecYJbwlwDW7HlpevLEDfL25ueo8mFsSPU+7Lj0b0c886O4SParkFb3xQTi8j+dxvA+MOD0O/ou7j5whPgU2Ij3BnB+8FbipO9XT1Dx2jgm9M+YTOxSBpzx9+A+9sF6nPbnblj2/zKu8ZLR2vcwIKj1NN4y973oDPXfO9Ty4Lhu8VDcUvBIVI717xXC9KVK6OgLjZ7z8DeG8hXSOvHwrMT3S5YW9Cn7EPGXVOD2fuqI89WDuPGzkqDqRPb881U0rPNvVGb333rY9YU/dPPnE+7z3b6S8pR4UvVA3Qr2+YRG9QQ/bvETTELwiF6Y7ORoWvL5XtTy5YBk7aZ+zvEl1RbzKm8S8gxy0PeaQibyb6KE8FKRVua6+8bzjqNa771GKPH9oL7sRlku8jI+KuuVfU73nxbs8iMlGPFKwHb3h+zc9AbCJPJZHm7zO3K88jnUQPWnWFD06Fq08IlYSvQmgB7xnMjA7crQOvdJvGruDtHW7UCg9vRPhbzwOziY9vNdNPb/+SbxSWKy800EKvDDyYbuXlVM8m409O3rRZLzFa1G7gx+wOmP0k73elYs92PLjvM36m7yei308YEBJvf94Sz2hpQ68qgDHu2IIUzso7328EiyBPMLqAj18heA75WxHPHVsJD3GpgA8J24Svb/HQD39sHA8YoCWvaCNET1b3J88vJm+uzxihj1+3ma9yZHTvIY0Brz3OyI6FyjSvHCq3Lr/J5Q8wooUvQvA2Tznrjm82jnVPPfNgr0lIu08zRuTuxtNVL0PA1W8kCRXvG+oGb3T/B08yAkrvfZ8zTzh7E69Fya1vZekwLyJUcy7Yxxkvads87r+I7e8kQGfPIkvd7ycTVm88xx1PFzjQbspZAU9BcRzvWernzyJok69WZ05PZzTGb2BtxI9d4J7PeozEL3+VIE8PEpdPY/mjrzwuVw9rPUXPQBRjrwwKkG9RQwLvd/VLj3K8bK72QwdPRNZAr3Nwyk9ui7+O1PrETxMaQm8K5pBPM0VfrxC7ei8zZWdvZxFlDy6niY9CbWruwUr9DycTIW7iowNPTHouzwNhzc7CSIGO2yQYzwO/js8VE14PFbvg73EOyC9QAmAvCjFLrxZzZU8N8cRPWB4TTo88qa8TV1MPYyNFD0IuAY9VqdXvQc6Ajz2R0y9A0pcvPsFVLwYU5s83XaovB+O6jwYIhA9b4yqvF2ILr1AmEq7x
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.test.ts","s":49,"e":108,"m":1778506368629.5134,"t":"expect(result.data.theme).toBe(\"dark\");\n expect(result.data.view).toEqual({ state: { scale: 1.25, x: 10 } });\n expect(result.data.children[0].data.fillColor).toBe(\"#dbeafe\");\n expect(result.data.compatPayload).toEqual({\n source: \"compat-blob\",\n style: {\n map: {\n backgroundColor: \"#0f172a\",\n },\n },\n });\n });\n\n it(\"识别可本地应用的结构命令集合\", () => {\n expect(\n isLocallyApplicableMindmapCommandSet([\n { type: \"updateText\", mindmapId: \"mind_1\", nodeId: \"node_1\", text: \"改名\" },\n { type: \"insertChild\", mindmapId: \"mind_1\", parentNodeId: \"node_1\", node: { uid: \"node_2\", text: \"子节点\" } },\n { type: \"insertSiblingAfter\", mindmapId: \"mind_1\", targetNodeId: \"node_1\", node: { uid: \"node_3\", text: \"同级\" } },\n { type: \"deleteNode\", mindmapId: \"mind_1\", nodeId: \"node_3\" },\n ]),\n ).toBe(true);\n expect(\n isLocallyApplicableMindmapCommandSet([\n { type: \"moveNode\", mindmapId: \"mind_1\", nodeId: \"node_1\", newParentNodeId: \"root\" },\n ]),\n ).toBe(false);\n });\n\n it(\"可本地应用 update/insert/delete 到 mindmap tree,避免每次都整块重挂载\", () => {\n const result = applyMindmapCommandsLocally(\n {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [\n {\n data: { uid: \"node_1\", text: \"节点 1\" },\n children: [],\n },\n {\n data: { uid: \"node_2\", text: \"节点 2\" },\n children: [],\n },\n ],\n layout: \"logicalStructure\",\n theme: \"default\",\n },\n [\n { type: \"updateText\", mindmapId: \"mind_1\", nodeId: \"node_1\", text: \"节点 1A\" },\n {\n type: \"insertChild\",\n mindmapId: \"mind_1\",\n parentNodeId: \"node_1\",\n node: { uid: \"node_1_child\", text: \"子节点 A\" },\n },\n {\n type: \"insertSiblingAfter\",\n mindmapId: \"mind_1\",\n targetNodeId: \"node_1\",\n node: { uid: \"node_1_sibling\", text: \"同级 A\" },\n },","v":"rFfbuqfy8DwFdfu96IelvWDuKj2AS/y8rFGRPGbEBz1jA8U7F5vPvemmD7xFU4Q9OMOoPcU52TxwzGE8naxevLBSRr3t7Ke84KC2PFYJBT2UK9y8aXWyO3Wo4bt3eGy9TiWoPO63eT00bOA8iooDPF2IJr0lllQ9ROqLPaG7Dj0FhrC8lEtWvM5azr0oM9a8MZnaPAWwdTxAOxs9sQzsPGB7/brX6aU68yfVu6IWgr3Uko48nw8YvFP5zz1eIPG7gL8zPW+zYr2AZrG7RWsGPO/wxD1Giny8oarkPTI/gz2SrJc73rDfvJhAqTsG1lO9QqBlPVf4aj3A9B47zBlNPVLyuD0KKp28WOFUvenEVj1KdCm9wcoRvFZpUj0w4dA8yAElvBPVojydoaO83bVXvJWwvbsg0ru8SfMAu3FvXD2SRAi9qvX1O4b3jzxbJ9E8nBo7vBGveTzbS6u48AHUvEGQVL1LXM89bdolPX+ou7x87BK9ASMZvZaDr7yD+9e8nni6vPXm9DvyeYY7JBuoO+y4a7u9Yjm8B5L7u7TWUjs4uNk5upmfPccyEr1TGzg5pJQYve8IQL2dsym9acy+POq/PL3G/fm8Sy/TO+HwNL2qDyY9kPIPvUIIUzz52Jo81ugvPWKpU71C8GQ9BGg9Pb3Btzzrb708u0MLvSRlq7zTnDy8YLRLvarSN71KBRM8b643vSXd8Ty77Ss8wveOPTzPebxGiUu8xkyFPGqQ3jmD3hw9gJyDPKs8B715Sh48UZQNu/Kusb1asYU9H+msuxWiDr1WW3E8OLjDvMuwNjyKwoO6ejpTPG0lbbzqGtW7B9+7PMkolDxQSMW6JPfAPA8+Xz30m1k9uaXVvK5ZHD3OnsS6zxfKvVY9fT1f9665MMZlPAATND0wLm69xpXzvFzK3LsOaG88wcgZPMLFvLsamjE9a7cluu8noTw5imk7CQbPPJAgGL1upaY81vEvumU677y2xAi9/FeTvOo07bumdws96PZ1vTOcuTzbTvW84DaBvcIT7jxwAfe7sD44vZBmJ700IC488En8OzkMHb2+PNu6mVciu26tiDu5rkg9Ts+SvQDv4jwO2Ie8AAK2PQAmA73jiEs8bNSHPYq6Br1fHPs7ed1CPZgVU7yGHV89ErdHPFUeQr0zHii9sp2lPD04qDt7Wxm9Yx2iuulnFbyzjF09kN6pPLoylTtP3w69nOyaunexjbzY4N+7XylOvenyBz2mU3U8l9/7Oy5RPT1ZT4E8ON+zPL6KCT0f5ps8gGlGvDbCTTyZKzU9SWAAPdMbVL0M5Ky8jobEu3aLC7xZuY67thRGPS9QijxEiDU6CeezPIbHBT1vo2I8wgVuvZ7Q5rwAoIS9xDecO57BuLwXwPQ73Gm9vIHkizx1YUS8rS2LvWi/Wr00iW68x1J5vHt/b7yt3sw8wSldvHNRi7xHYqq8XMchPfUUyzxEg7g8NMOUPBWqfTz477S8pKPuuuQHYb2+Auq8vhWDvcAfcz1zggi9AXiRuy79Er0dhIC8uDixvE7jcDwfSg29CWz/PAqrz7trJrA9tbcVPN12/rviJAg94uQZPWbklzvyawC9olAWvOLKbT3T3rU9yFLMPI6Z2LwOjfa8aGaePNatfTxXvKe7PRBLvW8l3TtuQIa9a4jPvJiyAb0aXim9SzkKPeQdpTxrU/I8h4d3PRSgQLyx39W79T3vu2suyLzWhQc8910DvXWl
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.test.ts","s":97,"e":122,"m":1778506368629.5134,"t":"{\n type: \"insertChild\",\n mindmapId: \"mind_1\",\n parentNodeId: \"node_1\",\n node: { uid: \"node_1_child\", text: \"子节点 A\" },\n },\n {\n type: \"insertSiblingAfter\",\n mindmapId: \"mind_1\",\n targetNodeId: \"node_1\",\n node: { uid: \"node_1_sibling\", text: \"同级 A\" },\n },\n { type: \"deleteNode\", mindmapId: \"mind_1\", nodeId: \"node_2\" },\n ],\n );\n\n expect(result.errors).toEqual([]);\n expect(result.applied).toBe(4);\n expect(result.data.children).toHaveLength(2);\n expect(result.data.children[0].data.text).toBe(\"节点 1A\");\n expect(result.data.children[0].children[0].data.uid).toBe(\"node_1_child\");\n expect(result.data.children[1].data.uid).toBe(\"node_1_sibling\");\n expect(result.data.children[1].data.text).toBe(\"同级 A\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.ts","s":1,"e":60,"m":1778506345309.2224,"t":"import type { MindmapCompatPayloadPatch, MindmapKernelCommand } from \"./mindmap-command-diff\";\n\nconst defaultMindmapData = {\n data: { text: \"中心主题\" },\n children: [],\n};\n\ntype MetadataOnlyMindmapCommand =\n | Extract<MindmapKernelCommand, { type: \"setLayout\" | \"setTheme\" | \"patchView\" }>\n | MindmapCompatPayloadPatch;\n\ntype LocallyApplicableMindmapCommand =\n | Exclude<MindmapKernelCommand, { type: \"moveNode\" }>\n | MindmapCompatPayloadPatch;\n\ntype ApplyMetadataOnlyMindmapCommandsResult = {\n applied: number;\n data: Record<string, unknown>;\n errors: string[];\n};\n\ntype ApplyMindmapCommandsLocallyResult = ApplyMetadataOnlyMindmapCommandsResult;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst ensureMindmapBlob = (value: unknown): Record<string, unknown> => {\n const next = isRecord(value) ? cloneJson(value) : cloneJson(defaultMindmapData);\n if (!isRecord(next.data)) next.data = { text: \"中心主题\" };\n if (!Array.isArray(next.children)) next.children = [];\n return next;\n};\n\nconst mergeJsonObject = (base: unknown, patch: unknown): unknown => {\n if (!isRecord(base)) return cloneJson(patch);\n if (!isRecord(patch)) return cloneJson(patch);\n const next = { ...base };\n Object.entries(patch).forEach(([key, value]) => {\n if (value === null) {\n delete next[key];\n return;\n }\n next[key] = isRecord(next[key]) && isRecord(value) ? mergeJsonObject(next[key], value) : cloneJson(value);\n });\n return next;\n};\n\nconst setNestedPath = (root: Record<string, unknown>, path: string, value: unknown): boolean => {\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) return false;\n let current: Record<string, unknown> = root;\n for (const segment of segments.slice(0, -1)) {\n if (!isRecord(current[segment])) current[segment] = {};\n current = current[segment] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = cloneJson(value);\n return true;\n};","v":"9eJPPYvH/ztRWPi9ZF0CvgxJkz0TiPy7/Um3O32ynDv1lLy7k+tQvcFgb73jokc9x96sPaakGjxRrV48YHwJvP7uBLvXhCy9bBAzPFhPAz0QpoM9hL0NPXo0Pz31raC90zylPStqZD0wSA09thhTOsi6Yr0+RDo9jxgqPRWj5DzVE2885lQdPDMO9r1MoKW8mBTvPAxLobzq39s8SgUFPWv1zTuw0nm8M6rCvNW+u70+6gQ9sQogvQL6mD3a/FK7kVONPQ3cir2ECaI6gvZiu3emqz38Wbi8IRnNPQTdRj3vT+i8sFptvM+icjxXDAA8aI9YPHDYCj1eGHq9ko4uPftXATyf0Me6bQiSvcXWkD1h7FG9KX9avAZ6uzoqMTO9RMKxPERS2rqAt7G9g0+TPH2OPTtBExO89imsvJdVoTwFzyK9wmlaPNgLVT2aTgU7TiVTPLDgEbqNODS8Lv4qO1+XKrybNJs9uTBkvH4AG7zmXXS8WnwjuzhzKb2aoSM8ieV2uds15DsRfVY7QMykvAcjZzpXP9e8L++guy2iijrCZa68p6KJPdPqLjzzPya8ECIEvf0Mb70nlU87+umXOyHK8rwvE5+8qOHNu0KHWb2njNO8Me+aPNRIiDwzPeQ83MMHPC+VP715Ew67c3tNPXIgrDwzIM88kg1lvJulnzzuBAE9RhcvvYVKSr0haTk8TNYEPTDcEzwDNrI8/8ApPScOB7xLn8G84iTZO1Jvvbq5sDM89/TbvFSw/DumIZS7MMRMPBGymr2uwuE8FvgLvV+SZr1NVGI7a756vGifFz0Hbrg8lz/iPAZjdTxW4jk7DqEYPR3t/LvJfGc8CI8RvR7MXj1PY888AJtVvZgjNT356V49+vBBvWbwQj1t+gI9p91Ru7yMSz2RxUy9is4IvHeLJDx9Ho28ngKeuU9DeTzKP2c8QgUpvfrzJT1N12G7ZJXSO8j0Ib1XcRE94qo8OwWphTxKnRo7OYaQvCOBxDsIGV48OuFLve0Eobz1tHe92IBZvdaiUrwPQkC8AZN5vQT2eDy2l/e7B1uROzKux7xKJpO8k6+iPJg5Vbw5+Y48RUVivaJZ9jsCPG69Sf5mPUnbgL3TsfQ8CZ6APc1ZsLoRPdQ8lyNZPIeWbr1jYr04tRWBPGv+Fb2xAZG9HP/JOxYanTx4thi7rr2mPQ6zPTl0BVY9HikwPCFIpDviwJW8IdZLvK6cUL2BXb28QOBpvWlm0TuzvoA8zGi6u1Iv97p/TN486SqiPTzo1TxLnCq8k8Q4Oy34OTy8ueE82TCHPPONtry/Wmm7wIw2vWrGg7xM09G8j99cPERMRLzTOVw7iqRoPDgKMj0W8aI8ATGAvaWVlDt9yR69sqBuO7X3rzkrC2U9mX4TPUazDj0WoJi8474pvGMZw7yPS6c82Q4mPHk9E7zeZFe83vcePAdl+jwwWkQ7AWAwO3Z4STwkgC89VmAZPeXYFbyO0P+86nJDvXqfQb2O0xG9ycGavNZxBzygYO27lnlivO+vxby9jHc6Gf5evEVt1jtoQBW933nXu5/E8zzbVQk9RZwXu7SUkTyy0i28w1v/vNJtBTx0rwa9N5YaPIEfFD3hhK49jSD9PNh9TTxZAbS7nwwrPbQ/d705g3s9nrM0vFc2mryC+wQ8EVOdvADrc7zeH4K8xxBNuwk71Dx534E7tks0PYxOCb2I0ha9Xu1QvYNiLT2C7v08qLHmO1l8zD049PE6gKqvPCEdgjt8qse8PhVNPah+mbx94NU
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.ts","s":49,"e":108,"m":1778506345309.2224,"t":"const setNestedPath = (root: Record<string, unknown>, path: string, value: unknown): boolean => {\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) return false;\n let current: Record<string, unknown> = root;\n for (const segment of segments.slice(0, -1)) {\n if (!isRecord(current[segment])) current[segment] = {};\n current = current[segment] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = cloneJson(value);\n return true;\n};\n\nconst findMindmapNodeByUid = (node: unknown, uid: string): Record<string, unknown> | null => {\n if (!isRecord(node)) return null;\n const data = isRecord(node.data) ? node.data : null;\n if (typeof data?.uid === \"string\" && data.uid === uid) return node;\n const children = Array.isArray(node.children) ? node.children : [];\n for (const child of children) {\n const found = findMindmapNodeByUid(child, uid);\n if (found) return found;\n }\n return null;\n};\n\nconst findMindmapNodeContainerByUid = (\n nodes: unknown[],\n uid: string,\n): { parentChildren: Record<string, unknown>[]; index: number } | null => {\n for (let index = 0; index < nodes.length; index += 1) {\n const candidate = nodes[index];\n if (!isRecord(candidate)) continue;\n const data = isRecord(candidate.data) ? candidate.data : null;\n if (typeof data?.uid === \"string\" && data.uid === uid) {\n return {\n parentChildren: nodes as Record<string, unknown>[],\n index,\n };\n }\n const children = Array.isArray(candidate.children) ? candidate.children : [];\n const found = findMindmapNodeContainerByUid(children, uid);\n if (found) return found;\n }\n return null;\n};\n\nconst createMindmapNodeRecord = (node: {\n uid?: string;\n text: string;\n hyperlink?: string;\n note?: string;\n refs?: unknown[];\n}): Record<string, unknown> => ({\n data: {\n uid: node.uid ?? `node_${Date.now().toString(36)}`,\n text: node.text,\n ...(typeof node.hyperlink === \"string\" ? { hyperlink: node.hyperlink } : {}),\n ...(typeof node.note === \"string\" ? { note: node.note } : {}),\n ...(Array.isArray(node.refs) ? { refs: cloneJson(node.refs) } : {}),\n },","v":"6O9fPbpZ1Lv8adG9ay/qvVWkfT3dOTu9QAosvUBfyzwzkMM8XM41ve6VGL0VLIQ90IeRPb+JfzzUG/Q79sn/vIYA+7sZpIk7QYmBPVyzNrxwhQc9rAWhPBMQvDwMv8685o+1PTRXET30GJY8eVkVvK3M27zuLJy6RM4XvC5+6jy96/M8DhGJPNLqA74GcIe92TlmPerYDLxVdnA8mBXpvK0PRjwfCBK7SQ4SvdY6ur3nUx49oRg5vcq7BD5Beho8khOVPfZqub0l6AO8EDcJPYlPPT2uvuC8q2mhPdsDOz0bJo88BxLeuoS73jz9U/Q8Ywu1PABH5TyCXii929qkPda1rTzgkw+9I9J3veYnVD1IEKY8o7ZiOgP9FD1UZWK7YQqSvJueN7w/fBC9FKgyPaRU57wN+QS95W83vYegez0dMme8pLfwuy/MSD00wYw8lwS4PEuetruMixq8SOu8OuDZqrzyZls9PE6IOpQFJrxeGfg87VySu+tWTL3YRkQ8Cr9wvDP8Oz3atbW8BxyPvKrZBz1kvsq6LqovPNSTCbyR8k08ySaLPXChFz025Km8Ny/bu+uWD722IpC8kIUFPT6N17wm+Ey9+sSRPN84lryqs888e96DvKfNoDyfjQ28xzXavAWQp7sPEvO88o2NPa/KUDw7a089ceYpvAe2CD0n5C89C7RMve2oT70Pfvi6LX8YPVqjzDuELaA8BXv+PG4lQb31NpO8aZKuuyjl/DmaP6k8/Zp/vNX5MLxd3Cu9HPICPdiLUr0aS6M8V+88vRHFXL21uSs8svmmuiPvyjytlPc7rN/YPCqj8Ds+GQS8CdQiPb9Rl7zG8dI7CEySPNw5BDxbFOI8wSq3vNxdcjx9Es28a7NNvYXLpTy6B848z1mOPEWWxTzU6FW9uCt1vXh1ebsGDTm6v8uHvN/gMjy4nMw8Vcx+u21AOzyyyoC8uBOEO7QBlbpJObQ9qdgaPZLmr7xZbzO8bOGEO8b07DlX2bE8P+tyvSg6Y72Ru2a9BxqEvB78hjvWTYe8vPg/vb0hvDwgCpS5RzfRPC5qGL24S428nVP7O5p9hzwr1sy6vtxivd+xCz1D4Um9k5JWPe/bFL2cj8Y89/54PefX87wKB+U836mQura13Lwg3Wm9ooThPAPNTLxcCiK9RnpbPIYi0zwrwLu95UOMPQr3NT126j49oRCSPYR0fLznrdk771v6vBpBJ7yMFxW9GjvuvRVKvTxQzVA81Ko5PEU8UzztxJA9heAMPeCutzyBGbg8LqZVvCAPKrzfCgQ9g1qrvJW+ibzC/3o8IXf+u7wcPDxvHtO8jn+lPEFWoLrOgm48BjHiOzV4rT2n1Ss8SzH1vG0jA7ztJFi72e6PvM4AOr0dr4Y8AB3BvA8gMj2BSz68Cb8ZvXMqbL3KoZs6nl9wvKXKsLkbYEu8QKziu+ZBPzz17dQ8OffnuyaxPTwd94E8pLREPWLrOLzbfJG86CsGvNk16rw0CGg8mU4avZvORj3jXGC9RnM6PK94CLuQLYS8vOAcPSJNUTvNNUy9OMzhu8Mz2zv2LJU9Y07iPKqlXjxCl4Y6jSu7vNxkKrxC/Qm9IzXvvBB6BD1ZBk89H/n1PEDwSTwwe3C8PbuNPJNGJL16NAM9LELdvAQXgr1QcPA8GW1sO6KHCb2NSJC89UKVuygR+bwLsKc8maCnPEF+F7xHlzi9cIo9vUNXQDxQYRi8ptgCO4jGGD1eooa8mnACPf6GC71Xy
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.ts","s":97,"e":156,"m":1778506345309.2224,"t":"text: string;\n hyperlink?: string;\n note?: string;\n refs?: unknown[];\n}): Record<string, unknown> => ({\n data: {\n uid: node.uid ?? `node_${Date.now().toString(36)}`,\n text: node.text,\n ...(typeof node.hyperlink === \"string\" ? { hyperlink: node.hyperlink } : {}),\n ...(typeof node.note === \"string\" ? { note: node.note } : {}),\n ...(Array.isArray(node.refs) ? { refs: cloneJson(node.refs) } : {}),\n },\n children: [],\n});\n\nconst applyCompatPayloadPatch = (root: Record<string, unknown>, command: MindmapCompatPayloadPatch): boolean => {\n const path = String(command.path || \"\").trim();\n if (!path) return false;\n\n if (path.startsWith(\"root.data.\")) {\n const field = path.slice(\"root.data.\".length);\n const rootData = isRecord(root.data) ? root.data : (root.data = {});\n return setNestedPath(rootData as Record<string, unknown>, field, command.value);\n }\n\n if (path.startsWith(\"nodes.\")) {\n const [, uid, scope, ...rest] = path.split(\".\");\n if (!uid || scope !== \"data\" || rest.length === 0) return false;\n const node = findMindmapNodeByUid(root, uid);\n if (!node) return false;\n const nodeData = isRecord(node.data) ? node.data : (node.data = {});\n return setNestedPath(nodeData as Record<string, unknown>, rest.join(\".\"), command.value);\n }\n\n const compatPayload = isRecord(root.compatPayload) ? root.compatPayload : (root.compatPayload = {});\n return setNestedPath(compatPayload as Record<string, unknown>, path, command.value);\n};\n\nexport const isMetadataOnlyMindmapCommandSet = (commands: unknown[]): commands is MetadataOnlyMindmapCommand[] =>\n Array.isArray(commands) &&\n commands.every((command) => {\n if (!isRecord(command) || typeof command.type !== \"string\") return false;\n return [\"setLayout\", \"setTheme\", \"patchView\", \"compatPayloadPatch\"].includes(command.type);\n });\n\nexport const isLocallyApplicableMindmapCommandSet = (\n commands: unknown[],\n): commands is LocallyApplicableMindmapCommand[] =>\n Array.isArray(commands) &&\n commands.every((command) => {\n if (!isRecord(command) || typeof command.type !== \"string\") return false;\n return [\n \"updateText\",\n \"insertChild\",\n \"insertSiblingAfter\",\n \"deleteNode\",\n \"setLayout\",\n \"setTheme\",\n \"patchView\",\n \"compatPayloadPatch\",","v":"tNRHPZYXvzupfQa+XSb5vaO1qD0X56a9ot3ovISj9DxITxw8rzqPvVEmmrwwglA9X3mXPUPMczw9yCY9BigOvfi44zwOyLi7QUnjPMbXyrpty7Q887dEPEM+VLz0uRy9X8CiPQTW3Tzgtae7sYkEvSPYLL1K0mY6TMYyu0R0GzwB0ti81kAHPAZ8ur1yIWa9JVakPDKcnrxKT968rBXgPLM2FD27OFa8GowTvXiOgr023eI8XBJFvTS5sD0VPUU8lcWmPT2kRL0Ge5w8R0eYO1tJ2zypVc68dhvbPbGkBz1T/uA8CyrWvDE2Tz1XUXm84PYMPRp8fz0cNYG9b1WHPRCdSj05rf28eUeWvVhnlj29GuQ7Wjn3O6eSHz1uQgO9Zbfru9LY/Lx/8hS9z20qPCgGxbwfOJC8tax2vT2Hij3nvGk7nlS1O1TYjT1eMLM8LBDtPPtVNbxV8gG95dWcu2uWM721jUA9ONLVPPnrqznpBzE8xo8mPL3EJL2A5UU8spP1vIM+4jvTYGm7ZOyCvT3uJDxhdEa9gEAEPbCaUrw6kc429WWjPXy5+DzzvWE7LzZ4OvlaX71l70q8SiXRPPSLr7ztcR+9XNvfPCQMDr1zKBU9EjFoO8xyE7w18MM8Pxe3u7uvhjxyOfy851siPQNtlLv4O9i7/lsLPB9sAT37pb88mUgZvQ7xjb3Zhby8hou5O+39xzs6L5k8Eg23Pca9cr3U5OK8MS2outnJEL0BgLs89qkevdNAlLwhPiy9kHwvOk5sbL1N6y89mZzMvIcw27wwTlm8x6FWvF30cjzHjn670fgGPdgGXDxmbW88bAFpPfQ8Bb3Mflu86yYOPTjcljyl6sk7GtFPvccqVT1glkG8qrkMvW6UHz2nNlU9RSqsPDHGCj3jcqK9zsHavN3PQzwv7kg77G7BvA2RJDwQpQI9Ack9vB62kzzZPxK8Wg95vP+0HL0vo6U9zTaDPDeCEL0Qjfg89lrfvH3HDLxhSGg8yggMvbNxob3P89a8Eh1rvQ7PPLxdzdy8g+sBvTq8szxEzAO8sVUqPVRLybwb4CW9q7KgOSjEh7u+CJS8KnSEvcncV7o2dE69GnClPZXDT7yAS988JDWHPRzZmbw02oE8J6UDO5ciKbvtjVS9gvv3O5iqt7wyGja9l/EfPCwhgztgbDO9hDi2Pd8aFzxYQIY8eNVKPfeX1rtG5j48DFkLvUN4Cb2kXRy9Q+DQve4gBj3Kbva8lStPO7v+lLwS5pc9pCWJPRChkzyxq4k6dWbnO4IGTLwAH6483B0cvV+Vs7zaqpY8aJAVPcaFQrzr72284jpOPejaZTwfP8c8xILpPG3K0T2CL5w8Ea/Nuj/vWzqtU2I6t/hpuweMAr1C4IE6yXeKvGXZCT2wAgm9FikKvUaIIb1LXXA8ZvakvJNazjyAJkY77RszPOZ2Xzz+VSQ8l6CNvJMBSjsnHaE8XnZOPSwf87vLiT69NCnoO7X48rzf9Bi9jHESvZKqZD3kBn296gOpPEOImbxntK88996PPJYupLudQw69DrEJPFjl1Tn8klQ9RvTHP
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.ts","s":145,"e":204,"m":1778506345309.2224,"t":"Array.isArray(commands) &&\n commands.every((command) => {\n if (!isRecord(command) || typeof command.type !== \"string\") return false;\n return [\n \"updateText\",\n \"insertChild\",\n \"insertSiblingAfter\",\n \"deleteNode\",\n \"setLayout\",\n \"setTheme\",\n \"patchView\",\n \"compatPayloadPatch\",\n ].includes(command.type);\n });\n\nexport const applyMetadataOnlyMindmapCommands = (\n currentData: unknown,\n commands: MetadataOnlyMindmapCommand[],\n): ApplyMetadataOnlyMindmapCommandsResult => {\n const nextData = ensureMindmapBlob(currentData);\n const errors: string[] = [];\n let applied = 0;\n\n commands.forEach((command) => {\n if (command.type === \"setLayout\") {\n nextData.layout = cloneJson(command.layout);\n applied += 1;\n return;\n }\n if (command.type === \"setTheme\") {\n nextData.theme = cloneJson(command.theme);\n if (command.themeConfig !== undefined && command.themeConfig !== null) {\n nextData.themeConfig = cloneJson(command.themeConfig);\n }\n applied += 1;\n return;\n }\n if (command.type === \"patchView\") {\n nextData.view = mergeJsonObject(nextData.view ?? {}, command.patch) as Record<string, unknown>;\n applied += 1;\n return;\n }\n if (command.type === \"compatPayloadPatch\") {\n if (applyCompatPayloadPatch(nextData, command)) {\n applied += 1;\n } else {\n errors.push(`无法应用 compatPayloadPatch:${command.path}`);\n }\n }\n });\n\n return {\n applied,\n data: nextData,\n errors,\n };\n};\n\nexport const applyMindmapCommandsLocally = (\n currentData: unknown,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.ts","s":193,"e":252,"m":1778506345309.2224,"t":"}\n });\n\n return {\n applied,\n data: nextData,\n errors,\n };\n};\n\nexport const applyMindmapCommandsLocally = (\n currentData: unknown,\n commands: LocallyApplicableMindmapCommand[],\n): ApplyMindmapCommandsLocallyResult => {\n const nextData = ensureMindmapBlob(currentData);\n const errors: string[] = [];\n let applied = 0;\n\n commands.forEach((command) => {\n if (command.type === \"setLayout\" || command.type === \"setTheme\" || command.type === \"patchView\" || command.type === \"compatPayloadPatch\") {\n const result = applyMetadataOnlyMindmapCommands(nextData, [command]);\n Object.assign(nextData, result.data);\n applied += result.applied;\n errors.push(...result.errors);\n return;\n }\n\n if (command.type === \"updateText\") {\n const node = findMindmapNodeByUid(nextData, command.nodeId);\n if (!node) {\n errors.push(`未找到节点:${command.nodeId}`);\n return;\n }\n const data = isRecord(node.data) ? node.data : (node.data = {});\n data.text = command.text;\n applied += 1;\n return;\n }\n\n if (command.type === \"insertChild\") {\n const parent = findMindmapNodeByUid(nextData, command.parentNodeId);\n if (!parent) {\n errors.push(`未找到父节点:${command.parentNodeId}`);\n return;\n }\n const children = Array.isArray(parent.children) ? parent.children : (parent.children = []);\n children.push(createMindmapNodeRecord(command.node));\n applied += 1;\n return;\n }\n\n if (command.type === \"insertSiblingAfter\") {\n const container = findMindmapNodeContainerByUid([nextData], command.targetNodeId);\n if (!container) {\n errors.push(`未找到同级节点:${command.targetNodeId}`);\n return;\n }\n if (container.parentChildren[container.index] === nextData) {\n errors.push(\"根节点不支持插入同级节点\");\n return;","v":"F3liPcEQy7xvqgC+s43Wva+XnT2JeQy9TTQXvRh6Bzx5m5Y8mISPvXp/Ir2JJIM9tZKLPSLPmjwz3AA9dimGvLBDgjwG7EG8vtQNPapNOz1jAIo92+mUun9dNrxuQTK9UQabPQaxgD1o7oS7YKoBPXPBQ713tQQ9hq4mvDle8zig0ww7VHDsvMEjoL00MT698nchvHvQKL0OCfM8PF8CvAqsDD1UeiW8XrULvUEdJL0rUio9lze3vFamvT20zBc9C9GzPbiJyb3GnAA94Zc9vHXWOz3WaXS8c+yjPfdDTD0kSpC8rOn+vCY6/Dz42pq8K2ioPDbwTj1XX5S8I1QrPWVhQT2ilQ68fEfVvPzqrj2v0oQ8im+FO6vDZz1qyz+8rKUvPFGRRbwJt1C9+s3RPF303rwdOim9BlppvSLTXz0uHY68nyYBvGQIlT2gQQu9jNoOPLhiTLtSWmU63DoHPdF4H70Fxj89GAedO/ICqLyCjaU8PGyOPEYVPL0Ycxw8EM89u67clTxzYUk8vvp/vD/csTxcWf68wqGRPEESm7wUEJe8s7qCPbgClz2RIr07XlgXvGfNKL3JP3W8i0GKPXs3vry3/DW9y+EjPbLtE70Sx2E7QZ9RvMDUcbwrgAI9AFicvIMGqTvLdoS8WHT2PO481Dwh97I8ont+PKYi8Tyf7oU8m2kevcRqUL1D5Yo7PuRtPBa3nbvDQD89JTYnPc/ZWL2z1TC9e9hIPCLgm7z68LQ8McPLu/vh/bxnWFi7/N4dPBSIRb3CkAU9IOsLvUKIbb3Rxso73mjSvOYLUD0lOQs9JxoYPbwkID3u56Y6lTPgPPCEPrxksyA82CDxOy32RT0hvJ66DuWAvXe+XD1JvW85h50+vQlYzbtYcns9NLsRPT4hyjywEH29JRVOvabTFTynLim3gQECu8ydBDwkzgw9iiXOvKssZD2FZAy9ohqZu4gJFb0k/mI99bKVPNfnyrzBVAm8niS5u2DTw7zaRjE8QspWveR1qbuBfOI8a0O/vEBQjzvLY6C8sOCavefyuDuwIVu9NPm6PA9Thr1cvIa8V0Z0u3kw0TwgqGQ8f4llvSFPsDy7ipW9ttiJPXFtBbyq1tg5CvqZPVw2I72jYqY8yA/4PEZ/5bzo93+70iRZPCg82bzfDzy9vis4uwlJrbw+Vry8SvxUPYBexTzXM2A9TF7GPAtbw7tvs+E8aVMEvFgGDL1E4ru8ZNGfvf3SAT0VBLO7JVPHvBjYuDyyqY+6lB8sPV2s1TxkPYg8mObDvObRXzwjPYQ8OVMfvLJHDb1pnoc8bu2cu9/Sg7zdnDk8MzFFPHuaCbyh41Y90dkXPUKncz25Bl49LicJvTKKCjzOpr47uc80PNUW2Lxhz608TUZ3PCP9sjwAKgO9LF0MPEwz1rzS/by78WOnPN0847toHgQ8WsmDu0NHDD1lkaQ8O9hVO1snoTwh4wA9BUMiPWS15DryIwi94Z5hvTXrQr0znY28eyH9PB9n6DzJUR29blnyOw9czLyX8pC788vEPHdZfzs5NxS9+JWwuvKq0jvPpEM9Jhe+vD680zvga5U8yQipvA/LmrwM1wq9++QHPPCweD3P9RM9jhiSPBXXnbzGTrC8sTGgPHvn0bxQdpo89uQavWBfN71pwkM8V027vPNSHrtROHq9iVdAvEPGKD0Zmfc8Ak0YPd3/6Ls6jra80IyWvSn7Bj2ieDU70CcoOhGMcT0u1iW9CIoSPc0F2Dwu1xC9OywEPSawpbzeILs8TcE/vcGwg712JTQ72BfYvKlDlzyVSYW8qmJmPZ2wiTxKc1S970GdPKgQ3TyvuCQ94pcIPaCdjrwHF+C8St4sPZQUrzwyUCO8zxOAvPI4JLxB0Fy7ExrUOks2RzyoOig9Dm5NPEcdTDnxiAE85T+bPNS0MDzocUU8a8GyPJPFnrxGU1Q8kuiiPci4tzz3hco8LHrDvOcRjTynDbi8cq6rPGnHfbpm
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-apply-local.ts","s":241,"e":280,"m":1778506345309.2224,"t":"return;\n }\n\n if (command.type === \"insertSiblingAfter\") {\n const container = findMindmapNodeContainerByUid([nextData], command.targetNodeId);\n if (!container) {\n errors.push(`未找到同级节点:${command.targetNodeId}`);\n return;\n }\n if (container.parentChildren[container.index] === nextData) {\n errors.push(\"根节点不支持插入同级节点\");\n return;\n }\n container.parentChildren.splice(container.index + 1, 0, createMindmapNodeRecord(command.node));\n applied += 1;\n return;\n }\n\n if (command.type === \"deleteNode\") {\n const container = findMindmapNodeContainerByUid([nextData], command.nodeId);\n if (!container) {\n errors.push(`未找到删除节点:${command.nodeId}`);\n return;\n }\n if (container.parentChildren[container.index] === nextData) {\n errors.push(\"根节点不支持删除\");\n return;\n }\n container.parentChildren.splice(container.index, 1);\n applied += 1;\n }\n });\n\n return {\n applied,\n data: nextData,\n errors,\n };\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.test.ts","s":1,"e":60,"m":1778469876413.0076,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n createCompatPayloadPatch,\n createLayoutCommand,\n createThemeCommand,\n createToolbarKernelCommand,\n createViewPatchCommand,\n diffMindmapRuntimeDataToKernelCommands,\n} from \"./mindmap-command-diff\";\n\ndescribe(\"mindmap command bridge mapping\", () => {\n it(\"把明确 toolbar 动作映射到 kernel command\", () => {\n expect(\n createToolbarKernelCommand({\n mindmapId: \"mind_1\",\n runtimeCommand: \"INSERT_CHILD_NODE\",\n activeNodeId: \"node_1\",\n }),\n ).toEqual({\n type: \"insertChild\",\n mindmapId: \"mind_1\",\n parentNodeId: \"node_1\",\n node: { text: \"新节点\" },\n });\n\n expect(\n createToolbarKernelCommand({\n mindmapId: \"mind_1\",\n runtimeCommand: \"REMOVE_NODE\",\n activeNodeId: \"node_2\",\n }),\n ).toEqual({\n type: \"deleteNode\",\n mindmapId: \"mind_1\",\n nodeId: \"node_2\",\n });\n });\n\n it(\"把暂未语义化的 toolbar 动作落入 compatPayload patch\", () => {\n expect(\n createToolbarKernelCommand({\n mindmapId: \"mind_1\",\n runtimeCommand: \"ADD_GENERALIZATION\",\n activeNodeId: \"node_1\",\n }),\n ).toEqual({\n type: \"compatPayloadPatch\",\n mindmapId: \"mind_1\",\n path: \"root.data.generalization\",\n value: { text: \"概要\" },\n source: \"toolbar\",\n });\n });\n\n it(\"构建 view/theme/layout 和通用 compat patch command\", () => {\n expect(createViewPatchCommand(\"mind_1\", { scale: 0.9 })).toEqual({\n type: \"patchView\",\n mindmapId: \"mind_1\",\n patch: { scale: 0.9 },\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.test.ts","s":49,"e":108,"m":1778469876413.0076,"t":"path: \"root.data.generalization\",\n value: { text: \"概要\" },\n source: \"toolbar\",\n });\n });\n\n it(\"构建 view/theme/layout 和通用 compat patch command\", () => {\n expect(createViewPatchCommand(\"mind_1\", { scale: 0.9 })).toEqual({\n type: \"patchView\",\n mindmapId: \"mind_1\",\n patch: { scale: 0.9 },\n });\n expect(createThemeCommand(\"mind_1\", \"classic4\", { root: true })).toEqual({\n type: \"setTheme\",\n mindmapId: \"mind_1\",\n theme: \"classic4\",\n themeConfig: { root: true },\n });\n expect(createLayoutCommand(\"mind_1\", \"logicalStructure\")).toEqual({\n type: \"setLayout\",\n mindmapId: \"mind_1\",\n layout: \"logicalStructure\",\n });\n expect(\n createCompatPayloadPatch({\n mindmapId: \"mind_1\",\n path: \"root.data.image\",\n value: \"asset:img_1\",\n source: \"sidebar\",\n actionId: \"image\",\n runtimeRevision: 7,\n kernelRevision: 3,\n }),\n ).toEqual({\n type: \"compatPayloadPatch\",\n mindmapId: \"mind_1\",\n path: \"root.data.image\",\n value: \"asset:img_1\",\n source: \"sidebar\",\n actionId: \"image\",\n runtimeRevision: 7,\n kernelRevision: 3,\n });\n });\n\n it(\"从 data_change diff 识别文本、插入、删除、移动和 compat 字段\", () => {\n const previous = {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [\n { data: { uid: \"a\", text: \"A\", image: \"asset:old\" }, children: [] },\n { data: { uid: \"b\", text: \"B\" }, children: [] },\n ],\n };\n const next = {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [\n {\n data: { uid: \"a\", text: \"A2\", image: \"asset:new\" },\n children: [{ data: { uid: \"c\", text: \"C\" }, children: [] }],\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.test.ts","s":97,"e":156,"m":1778469876413.0076,"t":"children: [\n { data: { uid: \"a\", text: \"A\", image: \"asset:old\" }, children: [] },\n { data: { uid: \"b\", text: \"B\" }, children: [] },\n ],\n };\n const next = {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [\n {\n data: { uid: \"a\", text: \"A2\", image: \"asset:new\" },\n children: [{ data: { uid: \"c\", text: \"C\" }, children: [] }],\n },\n ],\n };\n\n expect(\n diffMindmapRuntimeDataToKernelCommands({\n mindmapId: \"mind_1\",\n previous,\n next,\n }),\n ).toEqual({\n commands: [\n { type: \"updateText\", mindmapId: \"mind_1\", nodeId: \"a\", text: \"A2\" },\n {\n type: \"insertChild\",\n mindmapId: \"mind_1\",\n parentNodeId: \"a\",\n node: { uid: \"c\", text: \"C\" },\n },\n { type: \"deleteNode\", mindmapId: \"mind_1\", nodeId: \"b\" },\n ],\n compatPatches: [\n {\n type: \"compatPayloadPatch\",\n mindmapId: \"mind_1\",\n path: \"nodes.a.data.image\",\n value: \"asset:new\",\n source: \"adapter-diff\",\n },\n ],\n });\n });\n\n it(\"从 data_change diff 识别节点移动\", () => {\n const previous = {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [\n { data: { uid: \"a\", text: \"A\" }, children: [] },\n { data: { uid: \"b\", text: \"B\" }, children: [] },\n ],\n };\n const next = {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [{ data: { uid: \"a\", text: \"A\" }, children: [{ data: { uid: \"b\", text: \"B\" }, children: [] }] }],\n };\n\n expect(\n diffMindmapRuntimeDataToKernelCommands({\n mindmapId: \"mind_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.test.ts","s":145,"e":169,"m":1778469876413.0076,"t":"{ data: { uid: \"a\", text: \"A\" }, children: [] },\n { data: { uid: \"b\", text: \"B\" }, children: [] },\n ],\n };\n const next = {\n data: { uid: \"root\", text: \"KMIND\" },\n children: [{ data: { uid: \"a\", text: \"A\" }, children: [{ data: { uid: \"b\", text: \"B\" }, children: [] }] }],\n };\n\n expect(\n diffMindmapRuntimeDataToKernelCommands({\n mindmapId: \"mind_1\",\n previous,\n next,\n }).commands,\n ).toContainEqual({\n type: \"moveNode\",\n mindmapId: \"mind_1\",\n nodeId: \"b\",\n newParentNodeId: \"a\",\n order: 0,\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts","s":1,"e":60,"m":1778469876413.0076,"t":"import { canonicalizeMindmapData, type MindMapData } from \"./mindmap-projection\";\n\nexport type MindmapNodeInput = {\n uid?: string;\n text: string;\n hyperlink?: string;\n note?: string;\n refs?: unknown[];\n};\n\nexport type MindmapKernelCommand =\n | { type: \"updateText\"; mindmapId: string; nodeId: string; text: string }\n | { type: \"insertChild\"; mindmapId: string; parentNodeId: string; node: MindmapNodeInput }\n | { type: \"insertSiblingAfter\"; mindmapId: string; targetNodeId: string; node: MindmapNodeInput }\n | { type: \"deleteNode\"; mindmapId: string; nodeId: string }\n | { type: \"moveNode\"; mindmapId: string; nodeId: string; newParentNodeId: string; order?: number }\n | { type: \"patchView\"; mindmapId: string; patch: Record<string, unknown> }\n | { type: \"setLayout\"; mindmapId: string; layout: unknown }\n | { type: \"setTheme\"; mindmapId: string; theme: unknown; themeConfig?: unknown };\n\nexport type MindmapCompatPayloadPatch = {\n type: \"compatPayloadPatch\";\n mindmapId: string;\n path: string;\n value: unknown;\n source: \"toolbar\" | \"sidebar\" | \"runtime-event\" | \"adapter-diff\";\n actionId?: string;\n runtimeRevision?: number | null;\n kernelRevision?: number | null;\n};\n\nexport type MindmapCommandDiffResult = {\n commands: MindmapKernelCommand[];\n compatPatches: MindmapCompatPayloadPatch[];\n};\n\nexport type ToolbarCommandInput = {\n mindmapId: string;\n runtimeCommand: string;\n activeNodeId?: string | null;\n newNode?: MindmapNodeInput;\n layout?: unknown;\n theme?: unknown;\n themeConfig?: unknown;\n};\n\nconst defaultNode = (node?: MindmapNodeInput): MindmapNodeInput => ({\n text: node?.text?.trim() || \"新节点\",\n ...(node?.uid ? { uid: node.uid } : {}),\n ...(node?.hyperlink ? { hyperlink: node.hyperlink } : {}),\n ...(node?.note ? { note: node.note } : {}),\n ...(node?.refs ? { refs: node.refs } : {}),\n});\n\nexport const createToolbarKernelCommand = (\n input: ToolbarCommandInput,\n): MindmapKernelCommand | MindmapCompatPayloadPatch | null => {\n const activeNodeId = input.activeNodeId?.trim();\n switch (input.runtimeCommand) {\n case \"INSERT_CHILD_NODE\":","v":"oJiOPSuOZz3r7c69FPGwvZ6sKj290u68YWB7vBDDnzrd1LY8zzkXvdzAyjvds4s829zcPcbs7Dull948zbgevW7UEjtso5S91Ep3PC1SIz1ZMwU81L0CvRyOkj3B03G9Fie9PJveKT0C6Uo9pJ3pvDmqYb2wAg091osoPZI4BD2TjAO9sDu1PBZoW73cjCU8O1SvPDNSn7wnZfQ7ZQQ/PSQcU709BmE7AtyjvOfdF72Pb189pnlDu4aWkT2G8D88ZbFrPdseO73qqw09yknyO0MxSD00UeG74YQFPsoC+jyaD0m8QlMKvejWBT0Nbeu8AoY5vM1enD1Ek4S8N22yPeNsrjwrpgS9LNp4vWn+mj0mmHC8rpvZu9MLFj1LYiE8avq7PP2VBbv7gXa9TxcBPYPewDw1OA29sv8pvUvkfTyr7QG9bUo6Om37Az0hYAg8/YQcPRuz8jxF2za87fEFvZBFQb2DLTA9Ys8pPRBuWr1woqS8kvRluWMeBr3TQWu8H6rDvLomozx/Fqy7pj45vWMc/TwseYa98EhCvAC+dLzUGbq8Uy9tPcECDb1pepW87l8au6bS0Lwwxja9JsY7PDykMr12aj08oKEDPKb3d70+hIU8IdloPFGKdjvxfqQ9mhlxPBHyVb01fKQ8zl71PIDNEz1A2Cw7UpWSvDh3KbyJbM66YTBdvXNOU72iIFm7RLoSPdbmuToMnUk9sY+WPYfoCLwAJ/u8scGGPArqpbsaYQE913AFvYXweLyDfp+8Nk9jvIgvPL1dKpc9KAtrvG2WUb3YqFw8DoYHvZHLHj11IAY8RNlePXzkojztVgS9rVezPNR0nzw87iO8UIE5vaRTRT30nKY8VNFSvbanzjwbFZQ8PbafvW5Z/DwnKDI8XZIPvH+m/TzfLTO9FRLyO4KXsjoaR8u7bQybO9E1GzkizSw9BdUKvOIYazzQMOu8ktXfOttY2r3D8p08iTk3OyvlNTpO2hC74ZCwO2g5AjwlJb08jwNVvXH7mzyVl5a9Zd1FvbACMbwm9Sm9sHiVvc7uxDzlveK7TdXGPIeX1LyLAGg8pg93PGI2IL1cZ9o83gEevSbvzbvkFg29PZUJPc+HGb3cMh48PvJ4PTGfNTsaeQg9/60HO8/uV7yMKpk8MvfGOyoRML0i0ve8Cv+APLbkAbz6kCS82YNTPSPeujwtWoE9UzhoPO/tSzwRxrs6YdK6PDraTLxwZAm9unjxvDhSED1El7Y8kOsKPBqVyrznVRo9Z9WnPZ0G4Lsp0Ey8LNuIPD4ftbwp/048M9Mkvb6ZA72JbNa8/noJvLG/Pr1xgf07IugdPUlyvjtZ9Nw899qRPP+HNz27z0g850/rvGzZJrz7n5680IYguzn5Nb2g0kU9XDwJPJf4ED1XB7e8TpNTvFuaG73mwqK7FKsJPLOPuDyF0088jSOXu3JrdztKCBS9zfT7PDpIWjwLChA78CsOPdHjybzTuim9+KEVvf6ae71yK3G9IHh+vU3mwjtjh0O7XhLKPP8zVzzgpMA4OcwbvcbFXTx7j028uce8PBV82Tsu96Q8PJmrvJtyuDxXNJq7Np7qu9JLdLwLSkS9GBSnPC9QUz1c0t89l0s/PV6Q+TsggK47Om0AvCqorbxNInM8ZNiFu2p9G70TELO7vKoAveuzoD1TSZa8FagTPVshAT0F9Ki8FvsyPaoNa739ZDK9L1a8vPyYWz1on7g82UqGvHbUVz1lk8G75IpXu/p/wzohLc+6UzGAPew7qTxWi7c87DoOvVIuCb0ip7O7xRLxv
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts","s":49,"e":108,"m":1778469876413.0076,"t":"...(node?.uid ? { uid: node.uid } : {}),\n ...(node?.hyperlink ? { hyperlink: node.hyperlink } : {}),\n ...(node?.note ? { note: node.note } : {}),\n ...(node?.refs ? { refs: node.refs } : {}),\n});\n\nexport const createToolbarKernelCommand = (\n input: ToolbarCommandInput,\n): MindmapKernelCommand | MindmapCompatPayloadPatch | null => {\n const activeNodeId = input.activeNodeId?.trim();\n switch (input.runtimeCommand) {\n case \"INSERT_CHILD_NODE\":\n if (!activeNodeId) return null;\n return {\n type: \"insertChild\",\n mindmapId: input.mindmapId,\n parentNodeId: activeNodeId,\n node: defaultNode(input.newNode),\n };\n case \"INSERT_NODE\":\n if (!activeNodeId) return null;\n return {\n type: \"insertSiblingAfter\",\n mindmapId: input.mindmapId,\n targetNodeId: activeNodeId,\n node: defaultNode(input.newNode),\n };\n case \"REMOVE_NODE\":\n case \"DELETE_NODE\":\n if (!activeNodeId) return null;\n return { type: \"deleteNode\", mindmapId: input.mindmapId, nodeId: activeNodeId };\n case \"ADD_GENERALIZATION\":\n return {\n type: \"compatPayloadPatch\",\n mindmapId: input.mindmapId,\n path: \"root.data.generalization\",\n value: { text: \"概要\" },\n source: \"toolbar\",\n };\n case \"ADD_OUTER_FRAME\":\n return {\n type: \"compatPayloadPatch\",\n mindmapId: input.mindmapId,\n path: \"outerFrame\",\n value: { enabled: true, activeNodeId },\n source: \"toolbar\",\n };\n default:\n return null;\n }\n};\n\nexport const createViewPatchCommand = (\n mindmapId: string,\n patch: Record<string, unknown>,\n): MindmapKernelCommand => ({\n type: \"patchView\",\n mindmapId,\n patch,\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts","s":97,"e":156,"m":1778469876413.0076,"t":"return null;\n }\n};\n\nexport const createViewPatchCommand = (\n mindmapId: string,\n patch: Record<string, unknown>,\n): MindmapKernelCommand => ({\n type: \"patchView\",\n mindmapId,\n patch,\n});\n\nexport const createThemeCommand = (\n mindmapId: string,\n theme: unknown,\n themeConfig?: unknown,\n): MindmapKernelCommand => ({\n type: \"setTheme\",\n mindmapId,\n theme,\n themeConfig,\n});\n\nexport const createLayoutCommand = (mindmapId: string, layout: unknown): MindmapKernelCommand => ({\n type: \"setLayout\",\n mindmapId,\n layout,\n});\n\nexport const createCompatPayloadPatch = (input: {\n mindmapId: string;\n path: string;\n value: unknown;\n source: MindmapCompatPayloadPatch[\"source\"];\n actionId?: string;\n runtimeRevision?: number | null;\n kernelRevision?: number | null;\n}): MindmapCompatPayloadPatch => ({\n type: \"compatPayloadPatch\",\n mindmapId: input.mindmapId,\n path: input.path,\n value: input.value,\n source: input.source,\n ...(input.actionId ? { actionId: input.actionId } : {}),\n ...(typeof input.runtimeRevision === \"number\" ? { runtimeRevision: input.runtimeRevision } : {}),\n ...(typeof input.kernelRevision === \"number\" ? { kernelRevision: input.kernelRevision } : {}),\n});\n\ntype IndexedRuntimeNode = {\n uid: string;\n parentUid: string | null;\n order: number;\n text: string;\n data: Record<string, unknown>;\n node: MindMapData;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts","s":145,"e":204,"m":1778469876413.0076,"t":"type IndexedRuntimeNode = {\n uid: string;\n parentUid: string | null;\n order: number;\n text: string;\n data: Record<string, unknown>;\n node: MindMapData;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst readNodeUid = (node: MindMapData, fallback: string): string => {\n const uid = node.data?.uid;\n return typeof uid === \"string\" && uid.trim() ? uid.trim() : fallback;\n};\n\nconst readNodeText = (node: MindMapData): string => {\n const text = node.data?.text;\n return typeof text === \"string\" ? text : String(text ?? \"\");\n};\n\nconst indexMindmapRuntimeTree = (input: unknown): Map<string, IndexedRuntimeNode> => {\n const root = canonicalizeMindmapData(input);\n const index = new Map<string, IndexedRuntimeNode>();\n const visit = (node: MindMapData, parentUid: string | null, order: number, path: string) => {\n const uid = readNodeUid(node, path);\n const data = isRecord(node.data) ? node.data : {};\n index.set(uid, {\n uid,\n parentUid,\n order,\n text: readNodeText(node),\n data,\n node,\n });\n const children = Array.isArray(node.children) ? node.children : [];\n children.forEach((child, childIndex) => {\n visit(canonicalizeMindmapData(child), uid, childIndex, `${path}.${childIndex}`);\n });\n };\n visit(root, null, 0, \"root\");\n return index;\n};\n\nconst serializeComparable = (value: unknown): string => JSON.stringify(value ?? null);\n\nconst buildNodeInputFromRuntimeNode = (node: IndexedRuntimeNode): MindmapNodeInput => ({\n uid: node.uid,\n text: node.text || \"新节点\",\n ...(typeof node.data.hyperlink === \"string\" ? { hyperlink: node.data.hyperlink } : {}),\n ...(typeof node.data.note === \"string\" ? { note: node.data.note } : {}),\n ...(Array.isArray(node.data.refs) ? { refs: node.data.refs } : {}),\n});\n\nconst pushCompatDataPatches = (\n mindmapId: string,\n prev: IndexedRuntimeNode,\n next: IndexedRuntimeNode,","v":"tNOlPAg09rkXCNC9FvULvi1Nnz2kszy9hYKKvMPbJ7xejco8iT+PvYciEL0aZyA9xCu/PcS5EjzK5LU8Vox7vTf0urvYzEE8FtwwPeedvzsYVaY8yjnMPEW/RDzDbRS90BoNPR7VgD205AQ89McZu8sSCr1SKuk7KjCAOzOB/zy29PI8Ef8VPdPFzL1aYZS7QUR5PG8t4LvHKy097ukZPIQXkLza/NO8U4cvOsjNq705ydk8K7I0ve8rCj5g6Is7t/eaPQNzNL2CjNw8d4WYPMspdj3ssma9L4HYPYZVJD05SBS9w5jTO7luFz2u4fg8D+AvPHvmrj0XdhS9buhaPTt33DxZyCS9SM+bvUxucD2qJOy7D9qvvPJyVjwQBIw6pDNluzHXoLw59+i8Dnc6Pd9u2Lw2eQ+9vdBwve2F+zzd0Yu8bTiNvGAxND2iKEE9j+2WPG26Xbw5lkk7SXaqu9RhML1i8+w8CWwYPXzjg7ya6/+8ha2gPCluEb2uJo08toikvLiMSD0U5KO8p0/ovHAEpDzo+zO9G/qLOlBYBbwJODM7W3RTPQN2EjwNHq27wMHSvPVGb70zClC98U9LPXUxpLzhMRS96VfMO9na/7xHcjY9mAQEPcPFE7wlohi7+eQDvP8xPjsI3PM7S62BPYF367vS5Cm8BzW2u8eDAj1Bt0Y9SutKvd2Anr1D9jy8EJU9PAOYoDv1Myg9isdxPYb4KL1TOxe98QuCvJABkLybWlI7PyoTvSzYI709Gh29cdElPUV8YL35i0Q9aN29vLyqPL1XZUa8KFx5OxLqYDza/8a7l1D2PISeArv1TO06wEU+PdPqYDyEw1k6HzOPPIHKMjynIt874kJWvWm8vDotUpQ8Hpe9vABPnDuDdBc979ZXPFd6nzyq6Uu9/atHvTH6oDuADKW8jTc7vLKexLpSiuw8ObttPBrxzLtdEpi82LKcOoqHXL3ToRQ9iZq4PDtyvLzG8XG8VZbxu+wauTyf8CE9gBhCvbVIbL3z8X+9szUUvOdzWDy+HwW9P8glvWKLUzz0h9A8JnrQOxGGH714pE287W7EvL5Y2TwTzt27TGqVvfR5STtjuCy9c2KBPa6d17wxZjY9+7GQPSxEpLzMACY91tYAvAj5y7wMMy69wx6JORJUgLwLAC29Ru+oPJeyrTxViK2963MfPSFCdD3Li/M8D8imPRzVID2eEr87zWktPAMzYL1ANiO9H+qCvb+dSzztPyS8JyIxPNk5CTy1wF09rIwXPfVyojwSSmC7UHWvu8TvIrvsO289Tgx9vTqX/rt/O1c8iH5LvG4hVDu3WP68Shj2PJIuyzsmjIC7PBmju37VqT2Gp/g7JN1evSCsbDxVBnG8YyXcupq7Ab2ccII8n6GDvAaMSj35SgW8Ry5gveCrObxZQjM7fDjXOwCqVzxzOxk8w16nu3zUs7ydARk7owuOukgGMT33duy6u3XOPIuPPLz0oiK94qQEvLHyyLxZ34O7opgXvd8xYj287i29PtWHPPGktLzoJ4a8EcJSPOcTxrmPbAK9hRFjPHDF17yS5b09++VjPRbn6Dxb/C29MP8nvIuvN7xBM4S91o7AvNTMjDz+rok9a6JSPTlWFTyeOSm9R62IujQBvrxMkWI74ijYu8Kmhb0Vi6s87RYUvRGqt7x05ey8acrHPIVlBrx2uE48iGCgPDUAfbyAAzS9iwoyvY7jYj2WPoY8xGFkuTBOpz2f7hQ9TdE9PbyjbLy8ajK8KZYZPf3gnzynCFo8U1hFvdD+vLuC6Km75RStvMfkAD0k8pw8GUJ1PZFcCT1KSqK8h4q/PFdGnrwppxS88pspPTyrN70NKze9ANgEPepnKD0HfZG8NipPOxyU3bybHhS9w8W0PGvpWT19QDk96fu7PHYEP72Kj+A
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts","s":193,"e":252,"m":1778469876413.0076,"t":"const buildNodeInputFromRuntimeNode = (node: IndexedRuntimeNode): MindmapNodeInput => ({\n uid: node.uid,\n text: node.text || \"新节点\",\n ...(typeof node.data.hyperlink === \"string\" ? { hyperlink: node.data.hyperlink } : {}),\n ...(typeof node.data.note === \"string\" ? { note: node.data.note } : {}),\n ...(Array.isArray(node.data.refs) ? { refs: node.data.refs } : {}),\n});\n\nconst pushCompatDataPatches = (\n mindmapId: string,\n prev: IndexedRuntimeNode,\n next: IndexedRuntimeNode,\n compatPatches: MindmapCompatPayloadPatch[],\n) => {\n const semanticKeys = new Set([\"uid\", \"text\", \"refs\"]);\n const keys = new Set([...Object.keys(prev.data), ...Object.keys(next.data)]);\n keys.forEach((key) => {\n if (semanticKeys.has(key)) return;\n if (serializeComparable(prev.data[key]) === serializeComparable(next.data[key])) return;\n compatPatches.push(\n createCompatPayloadPatch({\n mindmapId,\n path: `nodes.${next.uid}.data.${key}`,\n value: next.data[key],\n source: \"adapter-diff\",\n }),\n );\n });\n};\n\nexport const diffMindmapRuntimeDataToKernelCommands = (input: {\n mindmapId: string;\n previous: unknown;\n next: unknown;\n}): MindmapCommandDiffResult => {\n const previousIndex = indexMindmapRuntimeTree(input.previous);\n const nextIndex = indexMindmapRuntimeTree(input.next);\n const commands: MindmapKernelCommand[] = [];\n const compatPatches: MindmapCompatPayloadPatch[] = [];\n\n nextIndex.forEach((nextNode, uid) => {\n const previousNode = previousIndex.get(uid);\n if (!previousNode) {\n const previousSibling = Array.from(nextIndex.values()).find(\n (candidate) =>\n candidate.parentUid === nextNode.parentUid &&\n candidate.order === nextNode.order - 1 &&\n previousIndex.has(candidate.uid),\n );\n if (previousSibling) {\n commands.push({\n type: \"insertSiblingAfter\",\n mindmapId: input.mindmapId,\n targetNodeId: previousSibling.uid,\n node: buildNodeInputFromRuntimeNode(nextNode),\n });\n } else if (nextNode.parentUid) {\n commands.push({\n type: \"insertChild\",\n mindmapId: input.mindmapId,","v":"hdmoPKfo0zsRc/e91+gFvhuuoT3n3G299e6nvDElmzx2tG27XIyRvVc26rwY8ks9HUeFPTiulTx1AoM9O+SzvAUPZjuFfJW85K08PRVwuDzdqTI9Bkh8Ox78m7wFSI69UBxZPSjwbT1/7og8QNKjvP2DCr1Xm9s8B78fPNFF3DwdTaU8Yp0fuW+7yL3XyxO9b6ivPIMkBb2Wh5s6KbNNOvA6AzxpULy7UbccObFPjL25iSk9CrgZvVJB5D3FTPE8tX6sPSb3qr0ptAc8A6MoPLcmfzx8bzC9GGLCPTjtgD2a57k7rb3jvGUDHT1GCpO8+G3ou3nrdT0ETh297allPeEMWz1HlgW9FeFvvb9rrz0JQSy6gqTCOngDBj3Ap/K62bmbO+RzFr1FN4y8irjvPIQwBbwcXWW99KSDvQqkID3T0wW93HnNvOhnrj22Llk81X74PF49GLwoyPQ6HGJLPAGJGb07+bE82SfePFV26LxNLyo7+ilDPL6ldL0sSUC8i9iJvCSCwzwk3Ic6nc41vW68sDwy5Hm9pG8eOonHDbxOAM27sgN6PUzSeTyX8da6znibuhojS73gzh+9WBdSPYuEfrx2trm8YGqnPGeitbzXfyk9D1Mtu9m9Y7zYzm88Uo42vGPeBLvJ15O8Kl8iPdE+WzuIyBo89v1RvKiOfTy87RA9Y+IovfMsd72KAoQ7vGQ9PP/WCzzSg/Y8zct3PU6hXL3sBhO96VfvO8ESAb2YcRI8OkvivIjulrx03DC9XV7DOjKGQL26+kA9WX8AvLslUL0M1Dg7nHPBvEr+MDtm0ag8xrbvPDZrkTxiwHK7ihfnPDl4pbtCfqu6kUiVPIucwTu5I6O6eP6SvVSrVzzmzs67PXsnvSo72Dt534I9d9cSPHpP6DynE6K9bfNQvVLrKbyQb2S8cFAjvAuN1TylRgY9HJiqvL9jgLvRPbu8+k3quzUGn71pnaQ9jtP2PD9Y5LyzsE67/9+PvAP0+Tq+fOM8yldevXXNA70bKju9QKIFveQ90zw/RM28lBc6vSjDkTyT3iS8Op3DPHA0PL0ydsa8eClwvOQKzTwd5YW8u72YvR4vMj1S6jq9Fe24PdMCTbw/kAw9wQeLPRw66bxy8gU91ll2PAYq0rzfzCO93q9Nuk+c5rxm3U29chbNPOKHBrwACIq9EiZ+PTDvCz2/9Zs8lBk+PUVRajy7nLU7l+QuvHRnHL343AG9RduhvZ6XoDxokZa8j48EPPC9rTwyHnU9IAqWPfw2KryVbUA8uB8XPEoAIrxkdh899aMkvVw7tbx67XG8ble7O+9tiLuMffm8S/+tPA6NIjxkEgK5RLkSvMH2tD3BGro814cfvb6sb7y52nU8VQF6Od0fCL3JU3M8BXjSvHASeD32I/a85nACvSFgBb28/hA8aXKLPEpL6DyqjgE73sdhO+sphjzpsS076xdrvH8xkzqfBqA83q0lPZ5j9LwF2DC9OFyLvKsfzLw7HUC8Ua4OvdUBPT2YbTq9OojBPJ56drwClqU7+FwIPOVnLjzdaSy9qp44u0PP2bxM0Jg9rqzBPInvrzzws++7IcMZPB9HAL3RiR297FBQu+1XBD0jvWU958ASPaWdxjyFWaa8l0rSO96E27yoFQs6meQnvMH4hL2UbkU8yms3vVXYnjxlaEq9Q7oAPFY29DxNFRY967hvPASdibtaHiS98NpdvX7/JT2p0L+8Kw6
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts","s":241,"e":293,"m":1778469876413.0076,"t":");\n if (previousSibling) {\n commands.push({\n type: \"insertSiblingAfter\",\n mindmapId: input.mindmapId,\n targetNodeId: previousSibling.uid,\n node: buildNodeInputFromRuntimeNode(nextNode),\n });\n } else if (nextNode.parentUid) {\n commands.push({\n type: \"insertChild\",\n mindmapId: input.mindmapId,\n parentNodeId: nextNode.parentUid,\n node: buildNodeInputFromRuntimeNode(nextNode),\n });\n }\n return;\n }\n\n if (previousNode.text !== nextNode.text) {\n commands.push({\n type: \"updateText\",\n mindmapId: input.mindmapId,\n nodeId: uid,\n text: nextNode.text,\n });\n }\n\n if (\n previousNode.parentUid !== nextNode.parentUid ||\n previousNode.order !== nextNode.order\n ) {\n commands.push({\n type: \"moveNode\",\n mindmapId: input.mindmapId,\n nodeId: uid,\n newParentNodeId: nextNode.parentUid ?? \"\",\n order: nextNode.order,\n });\n }\n\n pushCompatDataPatches(input.mindmapId, previousNode, nextNode, compatPatches);\n });\n\n previousIndex.forEach((previousNode, uid) => {\n if (!nextIndex.has(uid) && previousNode.parentUid) {\n commands.push({ type: \"deleteNode\", mindmapId: input.mindmapId, nodeId: uid });\n }\n });\n\n return { commands, compatPatches };\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-initial-sync.test.ts","s":1,"e":31,"m":1778540603961.099,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildInitialMindmapAssetRefreshPayload } from \"./mindmap-initial-sync\";\n\ndescribe(\"buildInitialMindmapAssetRefreshPayload\", () => {\n it(\"远端 createOnly 成功时返回文件树刷新 payload\", () => {\n expect(\n buildInitialMindmapAssetRefreshPayload({\n ok: true,\n docId: \"doc-1\",\n mindmapId: \"mind-1\",\n }),\n ).toEqual({\n id: \"mind-1\",\n document_id: \"doc-1\",\n asset_type: \"mindmap\",\n file_name: \"mindmap-mind-1.json\",\n file_url: \"/documents/doc-1/mindmap-mind-1.json\",\n });\n });\n\n it(\"远端 createOnly 失败时不应伪造文件树刷新事件\", () => {\n expect(\n buildInitialMindmapAssetRefreshPayload({\n ok: false,\n docId: \"doc-1\",\n mindmapId: \"mind-1\",\n }),\n ).toBeNull();\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-initial-sync.ts","s":1,"e":26,"m":1778540730992.721,"t":"export type InitialMindmapAssetRefreshPayload = {\n id: string;\n document_id: string;\n asset_type: \"mindmap\";\n file_name: string;\n file_url: string;\n};\n\nexport function buildInitialMindmapAssetRefreshPayload(input: {\n ok: boolean;\n docId: string;\n mindmapId: string;\n}): InitialMindmapAssetRefreshPayload | null {\n if (!input.ok) {\n return null;\n }\n const fileName = `mindmap-${input.mindmapId}.json`;\n return {\n id: input.mindmapId,\n document_id: input.docId,\n asset_type: \"mindmap\",\n file_name: fileName,\n file_url: `/documents/${input.docId}/${fileName}`,\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":1,"e":60,"m":1778497748182.916,"t":"// 说明:这里保留的是 legacy/blob compat projection 工具,服务导图导入、\n// 旧 React mindmap 参考实现和独立页兼容。Phase 6 文档页默认编辑主链\n// 使用 Rust kernel projection 与 simple-mind-map adapter projection。\nexport type MindMapData = {\n data: Record<string, unknown>;\n children?: unknown[];\n};\n\nexport type MindmapRouteMeta = {\n requestId?: string;\n traceId?: string;\n workspaceId?: string | null;\n documentId?: string;\n pageId?: string;\n mindmapId?: string;\n attachmentId?: string;\n updatedAt?: string | null;\n};\n\nexport type MindmapProjectionNode = {\n uid: string;\n text: string;\n depth: number;\n childCount: number;\n};\n\nexport type MindmapProjection = {\n schema: \"mnote.mindmap_projection.v1\";\n projectionId: string;\n projection: \"mindmap_subtree\";\n source: string;\n owner: string;\n documentId: string;\n mindmapId: string;\n rootNodeId: string | null;\n title: string;\n nodeCount: number;\n nodes: MindmapProjectionNode[];\n data: MindMapData;\n meta: MindmapRouteMeta | null;\n};\n\nexport type MindmapEditorSceneNode = MindmapProjectionNode & {\n id: string;\n parentId: string | null;\n};\n\nexport type MindmapEditorSceneEdge = {\n id: string;\n source: string;\n target: string;\n};\n\nexport type MindmapEditorScene = {\n schema: \"mnote.mindmap_editor_scene.v1\";\n source: string;\n owner: string;\n documentId: string;\n mindmapId: string;\n rootNodeId: string | null;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":49,"e":108,"m":1778497748182.916,"t":"id: string;\n source: string;\n target: string;\n};\n\nexport type MindmapEditorScene = {\n schema: \"mnote.mindmap_editor_scene.v1\";\n source: string;\n owner: string;\n documentId: string;\n mindmapId: string;\n rootNodeId: string | null;\n title: string;\n nodes: MindmapEditorSceneNode[];\n edges: MindmapEditorSceneEdge[];\n capabilities: {\n canEditText: boolean;\n canAddChild: boolean;\n canAddSiblingAfter: boolean;\n canDeleteNode: boolean;\n };\n data: MindMapData;\n meta: MindmapRouteMeta | null;\n};\n\nexport type MindmapSimpleMindMapScene = {\n schema: \"mnote.mindmap.simple_mind_map_scene.v1\";\n runtime: \"simple-mind-map\";\n documentId: string;\n mindmapId: string;\n rootNodeId: string | null;\n root: MindMapData;\n layout: unknown;\n theme: unknown;\n themeConfig: unknown;\n view: unknown;\n config: unknown;\n compatPayload: unknown;\n kernelRevision: number;\n source: string;\n owner: string;\n meta: MindmapRouteMeta | null;\n};\n\nexport const defaultMindmapData: MindMapData = {\n data: { text: \"中心主题\" },\n children: [],\n};\n\nexport const DEFAULT_MINDMAP_LAYOUT = \"logicalStructure\";\nexport const DEFAULT_MINDMAP_THEME = \"default\";\n\nexport const createDefaultMindmapThemeConfig = (): Record<string, unknown> => ({\n lineColor: \"#7aa2ff\",\n lineStyle: \"curve\",\n rootLineKeepSameInCurve: true,\n rootLineStartPositionKeepSameInCurve: true,\n generalizationLineColor: \"#ef6a5b\",\n backgroundColor: \"#f6f8fc\",\n root: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":97,"e":156,"m":1778497748182.916,"t":"export const DEFAULT_MINDMAP_LAYOUT = \"logicalStructure\";\nexport const DEFAULT_MINDMAP_THEME = \"default\";\n\nexport const createDefaultMindmapThemeConfig = (): Record<string, unknown> => ({\n lineColor: \"#7aa2ff\",\n lineStyle: \"curve\",\n rootLineKeepSameInCurve: true,\n rootLineStartPositionKeepSameInCurve: true,\n generalizationLineColor: \"#ef6a5b\",\n backgroundColor: \"#f6f8fc\",\n root: {\n fillColor: \"#e25563\",\n color: \"#ffffff\",\n fontWeight: \"bold\",\n borderColor: \"transparent\",\n borderWidth: 0,\n borderRadius: 8,\n },\n second: {\n fillColor: \"#4f7df3\",\n color: \"#ffffff\",\n borderColor: \"transparent\",\n borderWidth: 0,\n borderRadius: 8,\n },\n node: {\n fillColor: \"transparent\",\n color: \"#315aa9\",\n borderColor: \"transparent\",\n borderWidth: 0,\n },\n generalization: {\n fillColor: \"#ffffff\",\n color: \"#ef6a5b\",\n borderColor: \"#ef6a5b\",\n borderWidth: 1,\n borderRadius: 8,\n },\n});\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n// simple-mind-map 在文本字段缺失时会直接崩溃,这里统一做兜底归一化。\nexport const normalizeMindmapData = (input: unknown): unknown => {\n if (!input || typeof input !== \"object\") return defaultMindmapData;\n const root = (input as { root?: unknown }).root ?? input;\n\n const walk = (node: unknown) => {\n if (!isRecord(node)) return;\n const data = isRecord(node.data) ? node.data : {};\n node.data = data;\n const rawText = data.text;\n data.text = typeof rawText === \"string\" ? rawText : String(rawText ?? \"\");\n\n const gen = data.generalization;\n const fixGen = (value: unknown) => {\n if (!isRecord(value)) return;\n const text = value.text;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":145,"e":204,"m":1778497748182.916,"t":"const walk = (node: unknown) => {\n if (!isRecord(node)) return;\n const data = isRecord(node.data) ? node.data : {};\n node.data = data;\n const rawText = data.text;\n data.text = typeof rawText === \"string\" ? rawText : String(rawText ?? \"\");\n\n const gen = data.generalization;\n const fixGen = (value: unknown) => {\n if (!isRecord(value)) return;\n const text = value.text;\n value.text = typeof text === \"string\" ? text : String(text ?? \"\");\n };\n\n if (Array.isArray(gen)) gen.forEach(fixGen);\n else fixGen(gen);\n\n if (Array.isArray(node.children)) {\n node.children.forEach(walk);\n }\n };\n\n walk(root);\n return input;\n};\n\n// 持久化/初始化统一使用根节点对象,避免 wrapper 误传给 simple-mind-map。\nexport const canonicalizeMindmapData = (input: unknown): MindMapData => {\n const normalized = (normalizeMindmapData(input) ?? defaultMindmapData) as Record<string, unknown>;\n const root =\n normalized && typeof normalized === \"object\" && \"root\" in normalized\n ? normalized.root\n : normalized;\n return (normalizeMindmapData(root) ?? defaultMindmapData) as MindMapData;\n};\n\nexport const extractMindmapTitle = (input: unknown): string => {\n const canonical = canonicalizeMindmapData(input);\n const text = canonical?.data?.text;\n if (typeof text === \"string\" && text.trim()) {\n return text.trim();\n }\n return \"未命名导图\";\n};\n\nexport const summarizeMindmapProjectionNodes = (input: unknown): MindmapProjectionNode[] => {\n const root = canonicalizeMindmapData(input);\n const queue: Array<{ node: MindMapData; depth: number }> = [{ node: root, depth: 0 }];\n const nodes: MindmapProjectionNode[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) break;\n const uidRaw = current.node?.data?.uid;\n const textRaw = current.node?.data?.text;\n const children = Array.isArray(current.node?.children) ? current.node.children : [];\n nodes.push({\n uid:\n typeof uidRaw === \"string\" && uidRaw.trim()","v":"QYf2POYeN7x0BgW+tBD3vWDmdD1nkZO8AfWvO+Tx3Dy+xQU9je/tvKjlCL1O0S498xadPQHiUTyY0KE8v00rvWKynrzFdg+9beEZPelNLDwXDGQ9QwT4PCSuLD1TnTa9+QyZPTSdvzyyh1c8ZmS0uyyJ37xz6hc9caacPP7D/Twvd106GnCwPA6ouL33Nhi9GaznPNmw87yZsvI86Y6NO28zFT0mr9W8H4/DvD6zKb0OAoA9m/WkvCXpEz4ten26FiBrPbSznr2Efmy8rqoSvEvXFz0gRJi77riWPdzNUT2sJgo9TPgpvV9ISz0ybpS8lMV8PBjgUj3WXvK8NhxOPZWBTD3oIAW9jWBnvfKPnz1qaQC7U6s9O0kU2zx2zoq6xsT3u4dyHLwOOOW8qtVgPTUNkzrd6p+8NudkvbVfcz1csne9QX1XvDzZiz23HbU7bE5EPSQSPrznera74Co4OxXrE70XdEI99iiDu0S36bxu7cg8JFsIvMnVh70/FOC59JgUvZx8gj0whYG7KHPvvExnxzzZXUG92r4wup58Cb09DF880VkxPXQMQD1crJ287ZxTOkmfu7zCgFY8k0R2PHNOtLx20/O88e/qO0SKtbwMwqo8qUqpvL/fIj0Vpgi7hvsgvE9BrLt1ACG9gRsFPbBdMjsE7sU89WYhvJkogTzlDP48KBKdvSmdLr3eVJU8BiLnPJM4LTwHhro8Ca17PdeDbb12HKS6+46EOe2jY7tjCYA8e2btvEH937wOucO8EWSlPIoEG71ypjk96lGMvRTIVb3ku4e8QTFWvFhp9Dxi5Es7u7Y/PSZ2ljxXcPm7yQMkPDQ1HLzaJYS8gFzXPLIsFzz8/XC8oXOcvaq0tDyo9RG8PA0ivcjpgDxk/Vg9TasBPcVxPLvDxJq9Z+QgvcHG2jp8Jvg7FuypvCtZs7ytk+08FUmQvG7yJ7wgH+i86LKtOxD6E705P6g9J5MBPWYgIrzO8yu7nlfcvHsBQ7pRcBI9UDyBvTuv0LvoKyy9TTK7vAzrqztOO/q8LkmOvWXqiDzMrCS8qH0LPUrTZb2jxQi8Qsk1vHi+XDyf4Je8AUJYvQbLszxX2we9Mk+wPQlpmLzNHa888xFPPb83CL3uK688e1qAPHP3+bxNjSy9rvabPAe0t7wc5Ha9nOn7uhhg8jumn5q9rDqKPdIcGD1pAww9SstgPelmirodnbM8BaWyu9OWCbsUH0S9uDOivWaVAT0BTaq8lcJDPDtZS7wcp2E9zjCEPegO3TwM2Oo8oWorOAcfP7zDO0k9Bl1/vIFcErwZ/aE8jYdeu6cuirttw068c28ZPUvPnjuChCM8EgiTOqywqz02sek8f+A9vZJvNruod/C8TrlQOt4YCb2T07Q6NR3fvBRkMT06+YE79kN2vMNhPb1EQwM9rJSOPI7X8bv2QmO8jq0TO9MRmLv5sKG7yU+GPFYETbz6rsQ7j89uPZjww7x6zku93TvpvBEAEr0FdDa8NwguvUIeFz10HSy9AmSEO3tk57w5dii9Po9bvFiY3boZeTW985M1PHyKGTyTTKA9k1oKPTqGbTw3B/W84txNvPMsJ7zXT9O8ctp8u5T/hTwBjVQ9oKsvPRN4PzwFegu9vHyiPPLLL70dF5k5nGYevXxiPr1MNuY86GruvIVSMbzD8WC9KjsgvG8hADxoy0w80O4RPQkVa7yTQWe8ENh9vYXa2zwyhs05UEr7OwTWPD0TbAG8FcIMPVP3+LsPGCS96AcFPdQsrDzg4V67kIImvRVRFb2Vm+W8mj7zOy1p9zrkx988OJQIPbnX3Tz4enC9dYS3uyPXFTxzfTW76rUhPVmCKr08oRm9wEJIPd3Dx
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":193,"e":252,"m":1778497748182.916,"t":"const queue: Array<{ node: MindMapData; depth: number }> = [{ node: root, depth: 0 }];\n const nodes: MindmapProjectionNode[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) break;\n const uidRaw = current.node?.data?.uid;\n const textRaw = current.node?.data?.text;\n const children = Array.isArray(current.node?.children) ? current.node.children : [];\n nodes.push({\n uid:\n typeof uidRaw === \"string\" && uidRaw.trim()\n ? uidRaw\n : `depth:${current.depth}:index:${nodes.length}`,\n text: typeof textRaw === \"string\" && textRaw.trim() ? textRaw.trim() : \"未命名节点\",\n depth: current.depth,\n childCount: children.length,\n });\n children.forEach((child) => {\n queue.push({\n node: canonicalizeMindmapData(child),\n depth: current.depth + 1,\n });\n });\n }\n\n return nodes;\n};\n\nexport const buildMindmapProjection = (input: {\n documentId: string;\n mindmapId: string;\n data: unknown;\n source?: string;\n owner?: string;\n meta?: unknown;\n}): MindmapProjection => {\n const data = canonicalizeMindmapData(input.data);\n const nodes = summarizeMindmapProjectionNodes(data);\n const meta = isRecord(input.meta) ? (input.meta as MindmapRouteMeta) : null;\n const rootNodeId = nodes[0]?.uid ?? null;\n\n return {\n schema: \"mnote.mindmap_projection.v1\",\n projectionId: `mindmap_projection:${input.documentId}:${input.mindmapId}`,\n projection: \"mindmap_subtree\",\n source: input.source ?? \"rust-kernel\",\n owner: input.owner ?? \"rust-kernel\",\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n rootNodeId,\n title: extractMindmapTitle(data),\n nodeCount: nodes.length,\n nodes,\n data,\n meta,\n };\n};\n\nexport const buildMindmapEditorScene = (input: {","v":"aZ5IPHvRoDzOkP29n/kQvmcGSz1zvrC861KAuwQNsTsK0009JAiivKtdBr32gbA9CVGGPSu5OzxqKhw9gvskvU7NBb3C1jG8+9UcPetQ+7poE0k98ohOu4FT6Du2OVS96iL+PBWScz1Fh9Y7zYRavBWRAL2o0Ek9kHkBPUwlKj2hAE28iRswO3NJeL1pGLW8/SeZPKTrwLwqldM8Ym8OvAGtgbzIlxC9ocOdvP1s77za1cc8yfwwvPAs6T3698I8kEY2Pc0sxb3HUBM9fw72O3WiQDxy+5+82Di7Pb9eWD0J+EG84a+XPO88YD29pHy8qqvlPF41Tz2oVtm89s2qPYfEqD2If7S8TR4UvQEkwz3aJa28DrwBPWeOwLpbc3s8ookQvWTnxLwlTLW8LPCUPdxZorzynJa8BMouvVO+Gj29/Zm9fo+fvMbs8jxHZ9w7tlSrPGxCNTz+dLW7Qqt+u8/IOb1e2UM9TMfKPMZK8Lz7bM085W/XPIundb2GWRq7Au7GvGkFKT0tJyE77eoNvLYnojy0AlW8/87YO8RMaL3JLrc8LFMMPWar8roRwwC8SvgOvEd46Lz7xBa9RJ7SO5k3lL262oi8touGPI1sY7pPD1k96NeVvNEqUzySma27zfJfvL6/mLxga9E6lbFoPZinFz1XKwA96aOCvKyFAz0Djau5N623vLKAQb2ZQmW8uJV1O5q6Lrvm7uY8MGUxPXLCO70BR+W8n1kBPCNtmjwpW1Y8HDAovejBEb2aywm9HA2LOjJBZ72Nr0o9Vl0HvQKxg70me9e8r2hGvCLVaj0FbYW8WYpcPb1hHzyEzi28YOq5PDuIFL0cqLo51ZpEPO+RtjxCWxi81Il6vWCvED3b4aK8VWhtvaVWHj0Q/xU9tX2jPCQ5ez37TJC9ANAuvev+4rxDdhK8FJ+xvHWaCrxB0oo9hs4IPFGOOjwGBC+9WkAGPfh3i70IWoQ9WcGoPNbKNDxo2wS968VFO9/ZOTyD5RE9WHK4vcRYtzpj8uq8E0VXvA3KlTy4cge9EOuPvUdXJz0rkSK9S/AqPf+fhb1kkGk8n+qsvGSzKTz4URQ928mjvUASuDzGlQy9UhGlPTAwp7xiLsQ8kL9DPVGVA72fwVM8rXSTOxLTz7zUbKi8utQAvFEbzLyjDPW8D2KBPVXGArxDpMy92MAWPetN+zy4tO88NbX5PI86wzwAKgA8g5RpO4SIpzwD5029LIGCvVPXkjz1C7u7WMTZvNWauTu2UYg9Qk6uPTto17gEO6g8bOsvPB50F7y/s8I8EmZBvGuDDL2yW5O8sT3LvFV3H70DdEW4RVZlvBZWN7x+YVk667yRPD+v5j0zPC88AUiovS0p+zvu+Cw8hJCRvLDwSL231SY8bUzZPO66zzxg7tW7iKSavDEmyrzm8lM8+N2vu1R6xLuEdM07+B0ovZalk7wUPri8tQ7VO44rKD0tAQA7O/JLPVS9Trx8juW80qbNvIS7Hr3Tk7a8/p/lvMQaBD1C4zW9ekYCPH8zZLwHI0I8VSeBPAwBlDx/BsK8cMaaPKPacrxqb7g96rbbPEgmLbq/dIk8DURAu1H4EL1goki9lPevu8l+Az1vFYU9PU12PRDX3riBd+a8sK/Nu0riGb1r7su7aIPzvO779Lzq1P25A8AGveN4qzw/taq8HBX+uzwczbsFAnY8/Q6aPL84Er1IvrO8oAZZvRbWGD0b/i68mYWKPJ3zUT3wDxS8hR85OxMmgzsI6ay89T8TPYNmzjva8cK8WmP3vHGrg72MI6m8HsGwO3tWszxJ88s8pWlCPU3m47x9Uh+9q9+RPI2ewTtJoRO73EwyPWUDLL2xHA69UAmBPXdvxDyIeQ+9iqcAPM0sAL13r9C8MJDPvI7CjDznPyM9C5YTOy4fjrv3N188IzQ1PcUTALx/6UI8Z0IiveT/W7q6Tm08vnWHPa8H/TvR6pQ9ZfPhvINaTjtR2p69iV2fOwXMbzxRL3A7zxWUvSVVZ73Xl2I9n+/tvOVpKj0+F0M9f7Akvcq2vDwbwva7nog3PJ0ayzrB2Lc8CJmFvCNjAbpiEqM8SqsEvA13+bwMIii881i
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":241,"e":300,"m":1778497748182.916,"t":"documentId: input.documentId,\n mindmapId: input.mindmapId,\n rootNodeId,\n title: extractMindmapTitle(data),\n nodeCount: nodes.length,\n nodes,\n data,\n meta,\n };\n};\n\nexport const buildMindmapEditorScene = (input: {\n documentId: string;\n mindmapId: string;\n rootNodeId?: string | null;\n data: unknown;\n source?: string;\n owner?: string;\n meta?: unknown;\n}): MindmapEditorScene => {\n const data = canonicalizeMindmapData(input.data);\n const meta = isRecord(input.meta) ? (input.meta as MindmapRouteMeta) : null;\n const nodes: MindmapEditorSceneNode[] = [];\n const edges: MindmapEditorSceneEdge[] = [];\n\n const walk = (node: MindMapData, depth: number, parentId: string | null) => {\n const uidRaw = node?.data?.uid;\n const textRaw = node?.data?.text;\n const id =\n typeof uidRaw === \"string\" && uidRaw.trim()\n ? uidRaw.trim()\n : `depth:${depth}:index:${nodes.length}`;\n const children = Array.isArray(node?.children) ? node.children : [];\n nodes.push({\n id,\n uid: id,\n text: typeof textRaw === \"string\" && textRaw.trim() ? textRaw.trim() : \"未命名节点\",\n depth,\n childCount: children.length,\n parentId,\n });\n if (parentId) {\n edges.push({\n id: `${parentId}->${id}`,\n source: parentId,\n target: id,\n });\n }\n children.forEach((child) => {\n walk(canonicalizeMindmapData(child), depth + 1, id);\n });\n };\n\n walk(data, 0, null);\n const fallbackRootId = nodes[0]?.id ?? null;\n const rootNodeId = input.rootNodeId && input.rootNodeId.trim() ? input.rootNodeId.trim() : fallbackRootId;\n\n return {\n schema: \"mnote.mindmap_editor_scene.v1\",\n source: input.source ?? \"rust-kernel\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":289,"e":348,"m":1778497748182.916,"t":"children.forEach((child) => {\n walk(canonicalizeMindmapData(child), depth + 1, id);\n });\n };\n\n walk(data, 0, null);\n const fallbackRootId = nodes[0]?.id ?? null;\n const rootNodeId = input.rootNodeId && input.rootNodeId.trim() ? input.rootNodeId.trim() : fallbackRootId;\n\n return {\n schema: \"mnote.mindmap_editor_scene.v1\",\n source: input.source ?? \"rust-kernel\",\n owner: input.owner ?? \"rust-kernel\",\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n rootNodeId,\n title: extractMindmapTitle(data),\n nodes,\n edges,\n capabilities: {\n canEditText: true,\n canAddChild: true,\n canAddSiblingAfter: true,\n canDeleteNode: true,\n },\n data,\n meta,\n };\n};\n\nexport const buildMindmapSimpleMindMapScene = (input: {\n documentId: string;\n mindmapId: string;\n data: unknown;\n source?: string;\n owner?: string;\n meta?: unknown;\n}): MindmapSimpleMindMapScene => {\n const root = canonicalizeMindmapData(input.data);\n const meta = isRecord(input.meta) ? (input.meta as MindmapRouteMeta) : null;\n const rootNodeIdRaw = root?.data?.uid;\n const rootNodeId = typeof rootNodeIdRaw === \"string\" && rootNodeIdRaw.trim() ? rootNodeIdRaw.trim() : \"root\";\n if (!root.data.uid) {\n root.data.uid = rootNodeId;\n }\n\n return {\n schema: \"mnote.mindmap.simple_mind_map_scene.v1\",\n runtime: \"simple-mind-map\",\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n rootNodeId,\n root,\n layout: DEFAULT_MINDMAP_LAYOUT,\n theme: DEFAULT_MINDMAP_THEME,\n themeConfig: createDefaultMindmapThemeConfig(),\n view: { x: 0, y: 0, scale: 1 },\n config: {},\n compatPayload: {},\n kernelRevision: 1,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-projection.ts","s":337,"e":354,"m":1778497748182.916,"t":"runtime: \"simple-mind-map\",\n documentId: input.documentId,\n mindmapId: input.mindmapId,\n rootNodeId,\n root,\n layout: DEFAULT_MINDMAP_LAYOUT,\n theme: DEFAULT_MINDMAP_THEME,\n themeConfig: createDefaultMindmapThemeConfig(),\n view: { x: 0, y: 0, scale: 1 },\n config: {},\n compatPayload: {},\n kernelRevision: 1,\n source: input.source ?? \"rust-kernel\",\n owner: input.owner ?? \"rust-kernel\",\n meta,\n };\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-shortcuts.test.ts","s":1,"e":41,"m":1778506398734.8892,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n resolveMindmapShortcutAction,\n shouldInterceptMindmapShortcut,\n} from \"./mindmap-shortcuts\";\n\ndescribe(\"mindmap shortcuts\", () => {\n it(\"把基础快捷键解析为导图动作\", () => {\n expect(resolveMindmapShortcutAction({ key: \"Enter\" })).toBe(\"insertSiblingAfter\");\n expect(resolveMindmapShortcutAction({ key: \"Tab\" })).toBe(\"insertChild\");\n expect(resolveMindmapShortcutAction({ key: \"Delete\" })).toBe(\"deleteNode\");\n expect(resolveMindmapShortcutAction({ key: \"F2\" })).toBe(\"editNode\");\n expect(resolveMindmapShortcutAction({ key: \"Enter\", ctrlKey: true })).toBeNull();\n });\n\n it(\"已进入 mindmap 时即使暂时没有 active node,也要拦截危险按键,避免 ProseMirror 误删整个 block\", () => {\n expect(\n shouldInterceptMindmapShortcut({\n debugChromeEnabled: false,\n bridgeReady: true,\n readonly: false,\n isComposing: false,\n isEditableTarget: false,\n targetInsideRoot: false,\n keyboardShortcutArmed: true,\n }),\n ).toBe(true);\n expect(\n shouldInterceptMindmapShortcut({\n debugChromeEnabled: false,\n bridgeReady: true,\n readonly: false,\n isComposing: false,\n isEditableTarget: false,\n targetInsideRoot: false,\n keyboardShortcutArmed: false,\n }),\n ).toBe(false);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-shortcuts.ts","s":1,"e":41,"m":1778506385980.73,"t":"import type { MindmapUiActionId } from \"./mindmap-ui-schema\";\n\ntype MindmapShortcutEventLike = {\n key: string;\n shiftKey?: boolean;\n ctrlKey?: boolean;\n metaKey?: boolean;\n altKey?: boolean;\n};\n\nexport type MindmapShortcutGateInput = {\n debugChromeEnabled: boolean;\n bridgeReady: boolean;\n readonly: boolean;\n isComposing: boolean;\n isEditableTarget: boolean;\n targetInsideRoot: boolean;\n keyboardShortcutArmed: boolean;\n};\n\nexport const resolveMindmapShortcutAction = (\n event: MindmapShortcutEventLike,\n): MindmapUiActionId | null => {\n if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return null;\n if (event.key === \"Enter\") return \"insertSiblingAfter\";\n if (event.key === \"Tab\" || event.key === \"Insert\") return \"insertChild\";\n if (event.key === \"Delete\" || event.key === \"Backspace\") return \"deleteNode\";\n if (event.key === \"F2\") return \"editNode\";\n return null;\n};\n\nexport const shouldInterceptMindmapShortcut = (\n input: MindmapShortcutGateInput,\n): boolean => {\n if (input.debugChromeEnabled) return false;\n if (!input.bridgeReady || input.readonly || input.isComposing) return false;\n if (input.isEditableTarget) return false;\n if (input.targetInsideRoot) return true;\n return input.keyboardShortcutArmed;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.test.ts","s":1,"e":60,"m":1778495651424.7449,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n MINDMAP_TOOLBAR_MORE_ACTION_ID,\n MINDMAP_DEBUG_CHROME_QUERY_PARAM,\n isMindmapDebugChromeEnabled,\n mindmapDefaultUiSchema,\n mindmapToolbarFileActionOrder,\n mindmapToolbarPrimaryActionOrder,\n} from \"./mindmap-ui-schema\";\nimport { getMindmapActionMapping } from \"./mindmap-action-map\";\n\ndescribe(\"mindmap UI schema\", () => {\n it(\"默认 schema 暴露第一阶段 UI shell 分区\", () => {\n expect(mindmapDefaultUiSchema.toolbarGroups.map((group) => group.id)).toEqual([\n \"history\",\n \"node\",\n \"insert\",\n \"file\",\n \"view\",\n ]);\n expect(mindmapDefaultUiSchema.sidebarPanels.map((panel) => panel.id)).toEqual([\n \"nodeStyle\",\n \"baseStyle\",\n \"theme\",\n \"structure\",\n \"outline\",\n \"shortcutKey\",\n \"settings\",\n ]);\n expect(mindmapDefaultUiSchema.navigatorItems.map((item) => item.id)).toEqual([\n \"stats\",\n \"centerRoot\",\n \"search\",\n \"zoomOut\",\n \"zoom\",\n \"zoomIn\",\n \"fullscreen\",\n \"readonly\",\n ]);\n });\n\n it(\"默认不启用旧手写 chrome,只有显式 debug 参数才启用\", () => {\n expect(MINDMAP_DEBUG_CHROME_QUERY_PARAM).toBe(\"mnoteMindmapDebugChrome\");\n expect(isMindmapDebugChromeEnabled(\"http://127.0.0.1:3000/documents/doc_1\")).toBe(false);\n expect(\n isMindmapDebugChromeEnabled(\"http://127.0.0.1:3000/documents/doc_1?mnoteMindmapDebugChrome=1\"),\n ).toBe(true);\n expect(\n isMindmapDebugChromeEnabled(\"http://127.0.0.1:3000/documents/doc_1?mnoteMindmapDebugChrome=true\"),\n ).toBe(true);\n });\n\n it(\"toolbar action id 不重复\", () => {\n const actionIds = mindmapDefaultUiSchema.toolbarGroups.flatMap((group) => group.actions);\n expect(new Set(actionIds).size).toBe(actionIds.length);\n });\n\n it(\"单行 toolbar 主按钮顺序对齐 lx-doc/KMind\", () => {\n expect([...mindmapToolbarPrimaryActionOrder, MINDMAP_TOOLBAR_MORE_ACTION_ID]).toEqual([\n \"undo\",","v":"QSzBPAcysDwUoRu+gCBQvbzesz0Enx+9/QeePEsonj3eA9C7iW6dvCXfdrxA6hY9iq0/PWeU8Ltpwpg7hVJgvarYIrz5XgK9eQ0JPeeU0zyhw4S89428vPQcWLylQrO8SC17PQ7wXD2267W7umhDPVCvorusZu88S4pJPQxokjyoztQ8mbKvvMtxYr0qRL28GpiIOvJ8Pzs6ah29dTzrPDWXkTs9gKi7is8cvK2eKr0D5Yg9m0POPKylLD2cTNU8NRBBPTcdHb2HDCQ8/2lqvYygXj1J02i6FS0KPpaO5jzahwM9jF38vFyvSz1K39C8wZP0u75rNzphKdS8Z5agPf7HcT0eTVy6fOl+vX7cOz1mO8y8Ar3OO0iqCj0DZpY8SKD7u16wMb1wkoy9dzMzu/gMD7vpkAm9mBMIPCo1KD1vaYe9+D9QO16XRj2cshs9Q36uPKHAgDt0Ym48eZFOO00P7by1B549K983PYiFQr1U43g7r0XUvJKBCL3y3/i8FscQvWRBqju/PBG9kdiwu4Z+9Tzs2Hy8gXnlvNJztbw926I7YjpwPa3+fLucTo273fw6u39UJL0eG2y7pXMiPWdoJbtQtDG7Jx8TPE4HTL3B1e48GfsQPU+dc731ck89T7atPEhwwbziiKu77h4iPXkviz3lNZc8YBoJvUEyrDuqHiU9vB5DvcuUgbzEGqc7pv2vvA11ID3quYM9UkqAPdWdcrx9Gw68sSrkO48DtboC9O8807JSPEEElLwVZtO8cj/8O/DYPb1BPzw9cXCgux+X67vSMNW8s+RTvWayVT0X3Fu8r9e8u3ZTozzzEOi8yLaJPEcpwjzZ57E7etjZPJuzLj06aTK8TXCnvBNHjD3isl884upwvT4qSjx9c0g8pXPPPOxETD2xd3+9LWnjvEDWjjtx29+8GZ/yvFDjGrzw5B88uCnlvAg7bzzw9Ym8pjMaPHDTj73aVlM9fIKSvGmtgb2y8p68/0ScvPacDb15ztM74FoOvc9CJT0WjXO9QW2DvXPuHr1b/4I8fMOLvcHGQzzcgUy8CNj1PKc+abxaCEm8J1b3t1I0g7x0LrE7VC+JvdTQCD3Vrma98DcQPZgyuLzFLu08ScNwPbAsvrypTJs8RNTfPIyjdTsm3DU9gLC5PBYaR7wC9xq9xzG4vFb5Aj01gYG88LPcPClwIbshR748fdg3PAxKhjpDUJS7Tlnaux/LALzlsQq9Iv+evbeenzxBMRY985uFPMeQjzyaCR48kJDYPPzOKDvlvPC7F2nXOwirXjy7NIQ83sMqvA1Kfr1b2HK9lb2GPC7gn7zXs1k8dpw+PX7D47lJGUS98TdBPeoL/zwojL08RINOvVua5rsgbFa9LbMLvMTWpbx295U8oj23vEvUST0HqNo85l5KvbpChr0ys5o8/4kuvEROEjwjbBO7OycNvVBVHDyckQe9UcdHPUsNhz16kF28LJn/O+IWdDyarC29pTLivF0MnL0YUVW9eK/vvGIqKj3YmsC8zgtIPJ5QP72b2eA7PocuvSmAojxdl0W8q3WSu8unC72poYw9/egMPFTHqjwQ/Ys8cxGwPEFjjDxDpza96vKTvP8+ET15pIo9NJvmPFAR2LwyyV29zxNbPZ1epjuKwlc8fauSvTwYjL0SzLm9INUvvXUvRDuTCVy9IkA/PTu10zzLKiI9gYCgu6hyebz73I28X0EUve4LLbywJ7081R9Fu0s7/Tx0Hgy8MS6HPP85szxd6/K750GgPY1dxTyHHR25HtlJvVk8PjwjIcq6J1PmvDQanTwt7RY7NhYHPepZQz12bES9QX2YPCGPZj1afAq9USLJu/wSvrz6Qz+9my5FPd09BT3+fXe92lotPWwQ
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.test.ts","s":49,"e":108,"m":1778495651424.7449,"t":"isMindmapDebugChromeEnabled(\"http://127.0.0.1:3000/documents/doc_1?mnoteMindmapDebugChrome=true\"),\n ).toBe(true);\n });\n\n it(\"toolbar action id 不重复\", () => {\n const actionIds = mindmapDefaultUiSchema.toolbarGroups.flatMap((group) => group.actions);\n expect(new Set(actionIds).size).toBe(actionIds.length);\n });\n\n it(\"单行 toolbar 主按钮顺序对齐 lx-doc/KMind\", () => {\n expect([...mindmapToolbarPrimaryActionOrder, MINDMAP_TOOLBAR_MORE_ACTION_ID]).toEqual([\n \"undo\",\n \"redo\",\n \"editNode\",\n \"insertSiblingAfter\",\n \"deleteNode\",\n \"insertChild\",\n \"tag\",\n \"hyperlink\",\n \"note\",\n \"image\",\n \"icon\",\n \"summary\",\n \"associativeLine\",\n \"formula\",\n \"more\",\n ]);\n });\n\n it(\"toolbar 元信息包含图标、短标签、长标签、优先级和溢出归类\", () => {\n const primaryMeta = mindmapToolbarPrimaryActionOrder.map((actionId) => mindmapDefaultUiSchema.toolbarActionMeta[actionId]);\n expect(primaryMeta.map((meta) => meta.priority)).toEqual([...primaryMeta.map((meta) => meta.priority)].sort((a, b) => a - b));\n expect(primaryMeta.every((meta) => meta.cluster === \"main\")).toBe(true);\n expect(primaryMeta.every((meta) => meta.iconKey && meta.shortLabel && meta.longLabel && meta.overflowGroup)).toBe(true);\n });\n\n it(\"导入导出属于右侧独立 toolbar cluster\", () => {\n expect([...mindmapToolbarFileActionOrder]).toEqual([\"import\", \"export\"]);\n expect(mindmapToolbarFileActionOrder.map((actionId) => mindmapDefaultUiSchema.toolbarActionMeta[actionId].cluster)).toEqual([\n \"file\",\n \"file\",\n ]);\n });\n\n it(\"默认 schema 中所有 action 都有 action map 映射\", () => {\n const actionIds = [\n ...mindmapDefaultUiSchema.toolbarGroups.flatMap((group) => group.actions),\n ...mindmapDefaultUiSchema.navigatorItems.flatMap((item) => (item.actionId ? [item.actionId] : [])),\n ...mindmapDefaultUiSchema.contextMenuItems.map((item) => item.actionId),\n ];\n\n expect(actionIds.filter((actionId) => getMindmapActionMapping(actionId) === null)).toEqual([]);\n });\n\n it(\"toolbar 真实可见 action 都有 action map,more 仅作为 shell 虚拟按钮\", () => {\n const visibleActionIds = [\n ...mindmapToolbarPrimaryActionOrder,\n ...mindmapToolbarFileActionOrder,\n ];","v":"KTEdPW43ET3HDAG+fO69vFh1lT1v3pG9ga5sPd1HdD07H+a8zOIWvSmoH73eVKI8OUhLPaR4qTyHdpc9pBSMvZOZyLvWhjg8avvBPDOFhDxQ/YO5jxgEPAQuKL0qJxm9a755PVJ4MT2xiwg8BCDiPEN5Arsql9E8aniwPJ6XqDxsxqC8KdT1u9CAyL2HPaK9ob14PQ47QbwH/q681qUCPSZigDsTceo7HXYpvKLug700o8I9p8pgvNja4z34k/I8YoSwPRaqZb3DZ6u60TGQvfU/qD0QUqC8RhpIPdLuJT332Sk9aGAdvSglHj03soq9jn5kPIvemDxztfC8WxuIPfHRvDwqDT89dSnyvOQbgTyyqik9YHp5vR0hOTwqOKk8mw8iPIko6TyHli+9O1UBPYk+iTs7eda8N6lMO0SvKT2OZ1O9jJhgvN9fgD1YSrw8VOPGPK0biTxkDHW8JFt6OwOxe72zzXM9MJ5JPc35v7s2CbK7xbjvuHhVDL1RKVu8fryDOmBUPz14lie9RhJpPPJcmDuuuI47ko6ru3dJ4TzlSsY82E0tPXB5UzwS+0m8oF9JvdBC1bzj/j+7/ysbPOZEhbwWbIU79QMKPQutZryRLo495BghPMS94bz2Kz490fH3PD/SJ70wWAy9+CiFPd5P3DzC+eu7coRLvea/njwXIxs91dRivYipgLwzjJI8LnZPPI3diT3my3k90DPFPREatLythZm8Ms9MO5GFQL2cB4u6R3jbPKulkTvc7pW8bCVfPHViX71CB6s8NbFhOqHax7xgWd28jtrxvAPgoLovNKe7hl0KvK1FRz3RKA69cu++PLfgCDxxKZg8psZ/PVYk4DxlHyO7YjPSuvKmSj14TBi9xh29vMuF7juCccU88slaPdOoh7sR6sK9HIpSvVTu0zy3ekm8XjDUPIsAtrpPYy899qvoOpSbC7z4+8u8Ip2hPBF0CL3xm5k9GEkjvDyzM72gGIS8lXYQvIFPCzv0iAo9mHdVvXfKBT3L9wq9egwqvWFt9rxVtL48pTluvS8t3TuIepO8dNAgPSysIb2PWxW9pcUdvEvhzbwobzS7ktOtvZI5Ujw0vSm88Oh1Pb+7O7zzY9+7wXtrPdkJHb2S85g8MRP+u/lzWLzuZtq7C+WBPB9K7Lzp7NW86gVEO7mKu7tuBGu8ExRKO6mExDzdWh49+bgvPHecj7tL7iK9IjAQO8Bug7u2N3C8j+uBvcJYyzzCUqs8ZbkqvOx09DsyrjA9zkUJPcft37pMQxw98GKkPAm9jrztcFE9JXKmvP3tQL3qmIq8kBcWPVWXgLx9f+i85V1aPfnt9DyIpQ+9W94IPc5iFz2eaFo9kaOGvNqPgr15Gw+9gdg2Olg2HryH+YI8HXVWuxAhqj2fD8y8hKFFvbGWmr0I4Ga8mM5ovI4FET1GlXi8vCUQunKaiLtjN8W7aU4tPXRXvztkr5K7T6nUPIWgrrzP3TC9FzDxvENPXL2xoha8itTxvHn43Dpd6tO8bW85PTiLFL
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.test.ts","s":97,"e":156,"m":1778495651424.7449,"t":"...mindmapDefaultUiSchema.contextMenuItems.map((item) => item.actionId),\n ];\n\n expect(actionIds.filter((actionId) => getMindmapActionMapping(actionId) === null)).toEqual([]);\n });\n\n it(\"toolbar 真实可见 action 都有 action map,more 仅作为 shell 虚拟按钮\", () => {\n const visibleActionIds = [\n ...mindmapToolbarPrimaryActionOrder,\n ...mindmapToolbarFileActionOrder,\n ];\n\n expect(visibleActionIds.filter((actionId) => getMindmapActionMapping(actionId) === null)).toEqual([]);\n expect(mindmapDefaultUiSchema.toolbarActionMeta).not.toHaveProperty(MINDMAP_TOOLBAR_MORE_ACTION_ID);\n });\n\n it(\"第一阶段 context menu 覆盖节点和画布动作\", () => {\n expect(mindmapDefaultUiSchema.contextMenuItems.filter((item) => item.requiresNode).map((item) => item.actionId)).toEqual([\n \"insertChild\",\n \"insertSiblingAfter\",\n \"deleteNode\",\n \"summary\",\n \"associativeLine\",\n \"expandCollapse\",\n \"copyNodeText\",\n ]);\n expect(mindmapDefaultUiSchema.contextMenuItems.filter((item) => !item.requiresNode).map((item) => item.actionId)).toEqual([\n \"centerRoot\",\n \"fitView\",\n \"search\",\n \"readonly\",\n \"showMenu\",\n ]);\n });\n\n it(\"第一阶段 sidebar panel 数量受控\", () => {\n expect(mindmapDefaultUiSchema.sidebarPanels).toHaveLength(7);\n });\n\n it(\"第一阶段 sidebar 暴露主题、结构和 compat patch 选项\", () => {\n const themePanel = mindmapDefaultUiSchema.sidebarPanels.find((panel) => panel.id === \"theme\");\n expect(themePanel?.options.map((option) => option.value)).toEqual([\"classic\", \"classic4\", \"simple\", \"dark\"]);\n\n const structurePanel = mindmapDefaultUiSchema.sidebarPanels.find((panel) => panel.id === \"structure\");\n expect(structurePanel?.options.map((option) => option.value)).toEqual([\n \"logicalStructure\",\n \"mindMap\",\n \"organizationStructure\",\n \"catalogOrganization\",\n \"timeline\",\n \"fishbone\",\n ]);\n expect(structurePanel?.options.every((option) => option.controlType === \"layoutCard\")).toBe(true);\n\n const nodeStylePanel = mindmapDefaultUiSchema.sidebarPanels.find((panel) => panel.id === \"nodeStyle\");\n const baseStylePanel = mindmapDefaultUiSchema.sidebarPanels.find((panel) => panel.id === \"baseStyle\");\n expect(nodeStylePanel?.options.every((option) => Boolean(option.compatPath))).toBe(true);\n expect(baseStylePanel?.options.every((option) => Boolean(option.compatPath))).toBe(true);\n });","v":"Z3oiPcZlXDs33wq+V/TfvF1Hsz37ASy9CHQ7PbgFPz1NaQa7CDduvVlaH72k6rM8pEFvPY+qCT0JZc08CCmKvaXfO7wOAbQ8RZqJO+TmXTvC4ws9IV5GPK5GHbzbBu+8fgaMPYX6OD3e0eo7kOBKPVT9RTvJTSA9jZGKvAn+4TpXutU6dnwbvTiB5b1CPd299wycPZBxU7v857e8dRupPJ3qjbxmNcM6pCueu59ib70zT7o9DvTfvIvqyz3P3R89Q5XFPY3sWr3vGvO8xKoQvSOewD0TsU29PLt4PRhHND2JChI9mKeXvPVQXz2sADi9ZITuO40ZsDy0LM68aMSSPV4ztTymSlw9qUYUvdVa/Dsg9qM8XMbVvFmlszzVT9E8BErMvLRoAD2YSzS9b+7pPE+jpbxZprG8nzMSvB6pEj18GxG9TFUVuyvUZj295788OsQuPRl4gzsI0YO8C35mPDZHSb3nLBs9PQkSPZ35qjwEL6c62EGZO43Fer0JJFw8oC3IvIieKT2ApOK8lnqdO0VEgTy0FA09XX7iu0UdpjwqRPM7rNBzPXe98zxlhGS70prVvL0sRr3zxs46azpVPLNt27so/Yq8k3KmPMaFNr1WLUk9DBCePCCoi7pnZF09FA70PB5viLzJ1pa82xN5Pa0SMzwPb908+O1GvZk7/zz7NE89RdsjvabLYLyFQRw8KyiZO3Czbz0/KKQ9aoWaPYCDxbwaNsq8s8OEPBkfHr0g8cg7aYBAPHi5QLsR4G68TelYPDk0pL0PQlE8DVsdu9PDHb2v78q8VmZPvReanDxhxcw7JCp3PF2bXT1g+iG8lSCaPD++iryDNmK714ZnPYUxLT2gTts8K+6/uzfhaj1b5US9bRYqvZERbzyoG7w8pVYbPR6Aw7uhL7S9G9JOveamAj0eBHu8wa+NPKQOOjs6Gwc90MRqvFirGTylHwG96p6fPOQPCL01C3o9vXGbu5//Fr0x4C69LzLKvGRMtLuIbXI8u4UevRcsPD0rkr28mOtevahuqLy+lO25Doj5vLaiUTx9BGK8s5ctPZhpUL3FhMi8LC4HvYQWAry4B7S7LxOVvY0P6DwjTxo8YvFjPYT/0rz6UDY7FrhDPUnD07yTzmc80s73vCugJ7ztPkW8RXvBPAvr57seNp+8aPBwvLddnjxVe/O8Yc8sO5o0WDyHcgE925k9PacwRbs8+Ju7HaUmvGOdPjyrdhm8AjGjvdzbPD22XPE8TtkwvB5nvDz6ZhU9JU8ePSkmHTxWtuE8mIqWu8X5FDyPbnM9KgbtPEZLVb1rUJK8khrwPB4+6bsVVBK9Cq5ePRffB7ya+ls7MtOOPBC9Dz2CZlE9Q6ZLvTkUIL2Iu7
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.test.ts","s":145,"e":178,"m":1778495651424.7449,"t":"\"catalogOrganization\",\n \"timeline\",\n \"fishbone\",\n ]);\n expect(structurePanel?.options.every((option) => option.controlType === \"layoutCard\")).toBe(true);\n\n const nodeStylePanel = mindmapDefaultUiSchema.sidebarPanels.find((panel) => panel.id === \"nodeStyle\");\n const baseStylePanel = mindmapDefaultUiSchema.sidebarPanels.find((panel) => panel.id === \"baseStyle\");\n expect(nodeStylePanel?.options.every((option) => Boolean(option.compatPath))).toBe(true);\n expect(baseStylePanel?.options.every((option) => Boolean(option.compatPath))).toBe(true);\n });\n\n it(\"每个 sidebar option 要么可写,要么显式标记只读\", () => {\n const options = mindmapDefaultUiSchema.sidebarPanels.flatMap((panel) => panel.options);\n expect(options.length).toBeGreaterThan(0);\n expect(options.every((option) => option.actionId !== null || option.readonly === true)).toBe(true);\n });\n\n it(\"可写 sidebar option 必须能映射到 compat patch 或 kernel command\", () => {\n const writableOptions = mindmapDefaultUiSchema.sidebarPanels.flatMap((panel) =>\n panel.options.filter((option) => option.readonly !== true),\n );\n expect(writableOptions.length).toBeGreaterThan(0);\n expect(\n writableOptions.every((option) => {\n if (option.compatPath) return true;\n if (!option.actionId) return false;\n const mapping = getMindmapActionMapping(option.actionId);\n return mapping?.target === \"kernelCommand\" || mapping?.target === \"compatPatch\";\n }),\n ).toBe(true);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":1,"e":60,"m":1778497092829.736,"t":"export const MINDMAP_DEBUG_CHROME_QUERY_PARAM = \"mnoteMindmapDebugChrome\";\n\nexport type MindmapUiActionId =\n | \"undo\"\n | \"redo\"\n | \"editNode\"\n | \"insertSiblingAfter\"\n | \"insertChild\"\n | \"deleteNode\"\n | \"tag\"\n | \"hyperlink\"\n | \"note\"\n | \"image\"\n | \"icon\"\n | \"summary\"\n | \"associativeLine\"\n | \"formula\"\n | \"painter\"\n | \"import\"\n | \"export\"\n | \"setTheme\"\n | \"setLayout\"\n | \"zoomIn\"\n | \"zoomOut\"\n | \"fitView\"\n | \"centerRoot\"\n | \"fullscreenCanvas\"\n | \"fullscreenPage\"\n | \"exitFullscreen\"\n | \"search\"\n | \"showMenu\"\n | \"expandCollapse\"\n | \"copyNodeText\"\n | \"readonly\";\n\nexport const MINDMAP_TOOLBAR_MORE_ACTION_ID = \"more\" as const;\n\nexport type MindmapToolbarVirtualActionId = typeof MINDMAP_TOOLBAR_MORE_ACTION_ID;\n\nexport type MindmapToolbarActionId = MindmapUiActionId | MindmapToolbarVirtualActionId;\n\nexport type MindmapToolbarActionCluster = \"main\" | \"file\" | \"view\";\n\nexport type MindmapToolbarOverflowGroup = \"history\" | \"node\" | \"insert\" | \"file\" | \"view\";\n\nexport type MindmapToolbarActionMeta = {\n id: MindmapUiActionId;\n iconKey: string;\n shortLabel: string;\n longLabel: string;\n priority: number;\n overflowGroup: MindmapToolbarOverflowGroup;\n cluster: MindmapToolbarActionCluster;\n};\n\nexport type MindmapToolbarGroup = {\n id: MindmapToolbarOverflowGroup;\n label: string;\n actions: MindmapUiActionId[];\n collapsePriority: number;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":49,"e":108,"m":1778497092829.736,"t":"shortLabel: string;\n longLabel: string;\n priority: number;\n overflowGroup: MindmapToolbarOverflowGroup;\n cluster: MindmapToolbarActionCluster;\n};\n\nexport type MindmapToolbarGroup = {\n id: MindmapToolbarOverflowGroup;\n label: string;\n actions: MindmapUiActionId[];\n collapsePriority: number;\n};\n\nexport type MindmapSidebarPanel = {\n id: MindmapSidebarPanelId;\n kind: MindmapSidebarPanelId;\n label: string;\n icon: string;\n runtimeCapability: string;\n phase: 1;\n options: MindmapSidebarOption[];\n};\n\nexport type MindmapSidebarPanelId =\n | \"nodeStyle\"\n | \"baseStyle\"\n | \"theme\"\n | \"structure\"\n | \"outline\"\n | \"shortcutKey\"\n | \"settings\";\n\nexport type MindmapSidebarOptionControlType =\n | \"button\"\n | \"swatch\"\n | \"segmented\"\n | \"slider\"\n | \"numberInput\"\n | \"select\"\n | \"layoutCard\"\n | \"treeItem\"\n | \"toggle\";\n\nexport type MindmapSidebarOption = {\n id: string;\n label: string;\n actionId: MindmapUiActionId | null;\n value: unknown;\n controlType: MindmapSidebarOptionControlType;\n preview?: string;\n description?: string;\n readonly?: boolean;\n compatPath?: string;\n};\n\nexport type MindmapNavigatorItem = {\n id: \"stats\" | \"centerRoot\" | \"search\" | \"zoomOut\" | \"zoom\" | \"zoomIn\" | \"fullscreen\" | \"readonly\";\n label: string;\n actionId: MindmapUiActionId | null;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":97,"e":156,"m":1778497092829.736,"t":"value: unknown;\n controlType: MindmapSidebarOptionControlType;\n preview?: string;\n description?: string;\n readonly?: boolean;\n compatPath?: string;\n};\n\nexport type MindmapNavigatorItem = {\n id: \"stats\" | \"centerRoot\" | \"search\" | \"zoomOut\" | \"zoom\" | \"zoomIn\" | \"fullscreen\" | \"readonly\";\n label: string;\n actionId: MindmapUiActionId | null;\n readOnly: boolean;\n displayMode: \"text\" | \"button\" | \"input\";\n};\n\nexport type MindmapContextMenuItem = {\n id: string;\n label: string;\n actionId: MindmapUiActionId;\n requiresNode: boolean;\n phase: 1;\n};\n\nexport type MindmapUiSchema = {\n toolbarGroups: MindmapToolbarGroup[];\n toolbarActionMeta: Record<MindmapUiActionId, MindmapToolbarActionMeta>;\n sidebarPanels: MindmapSidebarPanel[];\n navigatorItems: MindmapNavigatorItem[];\n contextMenuItems: MindmapContextMenuItem[];\n};\n\nexport const mindmapToolbarPrimaryActionOrder = [\n \"undo\",\n \"redo\",\n \"editNode\",\n \"insertSiblingAfter\",\n \"deleteNode\",\n \"insertChild\",\n \"tag\",\n \"hyperlink\",\n \"note\",\n \"image\",\n \"icon\",\n \"summary\",\n \"associativeLine\",\n \"formula\",\n] as const satisfies readonly MindmapUiActionId[];\n\nexport const mindmapToolbarFileActionOrder = [\"import\", \"export\"] as const satisfies readonly MindmapUiActionId[];\n\nconst createToolbarActionMeta = (\n id: MindmapUiActionId,\n iconKey: string,\n shortLabel: string,\n longLabel: string,\n priority: number,\n overflowGroup: MindmapToolbarOverflowGroup,\n cluster: MindmapToolbarActionCluster,\n): MindmapToolbarActionMeta => ({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":145,"e":204,"m":1778497092829.736,"t":"export const mindmapToolbarFileActionOrder = [\"import\", \"export\"] as const satisfies readonly MindmapUiActionId[];\n\nconst createToolbarActionMeta = (\n id: MindmapUiActionId,\n iconKey: string,\n shortLabel: string,\n longLabel: string,\n priority: number,\n overflowGroup: MindmapToolbarOverflowGroup,\n cluster: MindmapToolbarActionCluster,\n): MindmapToolbarActionMeta => ({\n id,\n iconKey,\n shortLabel,\n longLabel,\n priority,\n overflowGroup,\n cluster,\n});\n\nexport const mindmapDefaultUiSchema: MindmapUiSchema = {\n toolbarGroups: [\n {\n id: \"history\",\n label: \"历史\",\n actions: [\"undo\", \"redo\"],\n collapsePriority: 4,\n },\n {\n id: \"node\",\n label: \"节点\",\n actions: [\"editNode\", \"insertSiblingAfter\", \"deleteNode\", \"insertChild\"],\n collapsePriority: 1,\n },\n {\n id: \"insert\",\n label: \"插入\",\n actions: [\"tag\", \"hyperlink\", \"note\", \"image\", \"icon\", \"summary\", \"associativeLine\", \"formula\"],\n collapsePriority: 2,\n },\n {\n id: \"file\",\n label: \"文件\",\n actions: [\"import\", \"export\"],\n collapsePriority: 5,\n },\n {\n id: \"view\",\n label: \"视图\",\n actions: [\"painter\", \"centerRoot\", \"zoomOut\", \"zoomIn\", \"search\", \"readonly\"],\n collapsePriority: 3,\n },\n ],\n toolbarActionMeta: {\n undo: createToolbarActionMeta(\"undo\", \"undo\", \"撤销\", \"撤销\", 10, \"history\", \"main\"),\n redo: createToolbarActionMeta(\"redo\", \"redo\", \"重做\", \"重做\", 20, \"history\", \"main\"),\n editNode: createToolbarActionMeta(\"editNode\", \"type\", \"编辑\", \"编辑节点\", 30, \"node\", \"main\"),\n insertSiblingAfter: createToolbarActionMeta(\"insertSiblingAfter\", \"sibling\", \"同级\", \"插入同级节点\", 40, \"node\", \"main\"),\n deleteNode: createToolbarActionMeta(\"deleteNode\", \"trash\", \"删除\", \"删除节点\", 50, \"node\", \"main\"),","v":"MkQEvF++6zyffva9LETmvclqij2fZLa9RfdJvQTtoDx9drM8HiFUvcDNOr27yaI923HTPYE0aryJaXY9fZ9GOywasbw0eSS9SlMBPYWqSz3JCNI8LxHQvNqbuDsa/5q8hto2PfskJD30JUM7PkUEvRIrkb1pScg8kyUnPY8D+zwGh+27SR0YvbZGgL1StsS7mWCHvON/Ar1iAp282ebfPKPDlLuSWgI9w1u0PGbUUb0MZ5E96L9QvWydwz0+98Q63UaIPYjonL2CiyA9XKHIvHwTeLuEEDW8mVOmPavMgz3KMiq9C8Y3vf4bBz10gRq9eYMrvC/4jD2759i8r5V1PWADkj3FwRu92d5yvJHF2T1JbTo8iI2APCpUJD1d7JQ7J6KcPHJWZb2eD1O9DisrPcOjfjyLu3+9xwrGvO6PHT3eZk69c0PWvP7zQz15OnC8L4csPXdyorz1kwg8gJXnvGaKgL3Yp+E8D3UOPQPEEb0MVWQ8JS0APeTP77yeolC8d/CounTvuTwH3Ya8fOoovcVN1jxumD+9vbcBu4O9Dr2WYHA8Ve8BPCwaQj1/0j+7gTiPu5KErLyg9Nu8DyERPSuDaL38A+K8cqMPPQyYFL3KPSM9blCDvH2i+7wpU8w8ecmovL7PJr1OcWq88Kd2PTow9zyLSWA8S6IAPJASmDwn+PI6DieUvTvpgL0KGS48s2QpPAVDNj2u9+A817n9PMKYaL0SjEC8d9dePCH7EL2cUoy7yYSNPLaP3rwbsso7e0SwvCt6EL15AdU87/euvJ+en7yagaq8RwyKu+jrUD3r5tK8ZupsPV11DjxajTW8zjzyPGmhJL1W5Ic7JpQ8Owz1FT0LRjS78YNFvTf8Sj2vkeS8XvfpvDi9Ez3MbMQ8mZv7O+K7ArzAYJW9f8VPveI1QDyFDNA7UbRuvBUJrLw5Suw8jspkvLyg9bzonn29TFplvOPSCb6eA4g9bGQePcpQLzx1tjQ8B8CUO4B/Z7zVJjs827tMOt0EwTxByxk7/p8ovM4FPT1zdcQ6mL6ovbv5frsQUki8elu/uxgMG73lzZY7ZWRcvXKtgbspvK87t853vWUZKrwhXRS9HXp1PYUXcr19Shc8mDOzPTrgAL13QJm7jwrDPHvfuDvjxai79G0qPEALB72Qsvu7axeSPE9QgbxuvB+9IedHPZTHiDsklh89kdIIPdN/GTwJiAE6cZvwu2a1obtv5ri8NolmvbB1Kz2tRG68MePFvF/KdrzV+jA9jYGtPcH4v7uzUak8Tc6DPKCWuTvVow885wFDvY5UqbzSeRQ885fqvF3PK734YKQ8Kafduw+ScjwZiR49d4eXPI95Tj1VYxs9mE4UvW9OdDz5zOA8gvCBPK24B72XH1i8hYFtO6Z6ljzGIWK96EJJPNlwCb1blk88HlpXvBzjE7wKmCM8R0pEvYSaJzwD01e7BLRJOwKL5jwJdx49KVxjO++FtLsHokG9JT4YvPp8I73Fuxc7il+RvIpVITxvt0m9yKV0PJ7NTbxFYIk8ZTrgPBh/2rrN9iW9fhRPPeDIgzyJw1Q9CG3cuxS+RT3q3Kc8J1yzu3H3ebwCjju9eXcqux44Ej0nDKo9XyR+PXajvTu5Ywy9NfcXvfVfk7wC2r68WUStvA4UlbxAPW68uNflvLpMmD1zDIC8/U0NPL7KED0ynyi8rZwkPe5tWbwnlIC8mD/uvLjiLz1r9XU4omAyvEPJ5zxuIUy9kYyjPBxmB7q2v6G8LnWAPPfwsbxw3hK8dlWCvQnAv73IsBY81Ks1vdhlqDwDth4772OTPUMv3byYGtK8bjJqPXkZfzx4q7e7daLvOe8VKzx7IXC9gLNTPdElRDyUJ1O9A+CsPLYHZTx63FO8qL/OvNYDkzzxxg89LMtuvLkLTzwccfy7bmmJO1wqhzwz7pM7YVRFuk5AJj
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":193,"e":243,"m":1778497092829.736,"t":"id: \"view\",\n label: \"视图\",\n actions: [\"painter\", \"centerRoot\", \"zoomOut\", \"zoomIn\", \"search\", \"readonly\"],\n collapsePriority: 3,\n },\n ],\n toolbarActionMeta: {\n undo: createToolbarActionMeta(\"undo\", \"undo\", \"撤销\", \"撤销\", 10, \"history\", \"main\"),\n redo: createToolbarActionMeta(\"redo\", \"redo\", \"重做\", \"重做\", 20, \"history\", \"main\"),\n editNode: createToolbarActionMeta(\"editNode\", \"type\", \"编辑\", \"编辑节点\", 30, \"node\", \"main\"),\n insertSiblingAfter: createToolbarActionMeta(\"insertSiblingAfter\", \"sibling\", \"同级\", \"插入同级节点\", 40, \"node\", \"main\"),\n deleteNode: createToolbarActionMeta(\"deleteNode\", \"trash\", \"删除\", \"删除节点\", 50, \"node\", \"main\"),\n insertChild: createToolbarActionMeta(\"insertChild\", \"child\", \"子级\", \"插入子节点\", 60, \"node\", \"main\"),\n tag: createToolbarActionMeta(\"tag\", \"tag\", \"标签\", \"标签\", 70, \"insert\", \"main\"),\n hyperlink: createToolbarActionMeta(\"hyperlink\", \"link\", \"链接\", \"超链接\", 80, \"insert\", \"main\"),\n note: createToolbarActionMeta(\"note\", \"note\", \"备注\", \"备注\", 90, \"insert\", \"main\"),\n image: createToolbarActionMeta(\"image\", \"image\", \"图片\", \"图片\", 100, \"insert\", \"main\"),\n icon: createToolbarActionMeta(\"icon\", \"smile\", \"图标\", \"图标\", 110, \"insert\", \"main\"),\n summary: createToolbarActionMeta(\"summary\", \"summary\", \"概要\", \"概要\", 120, \"insert\", \"main\"),\n associativeLine: createToolbarActionMeta(\"associativeLine\", \"route\", \"关联\", \"关联线\", 130, \"insert\", \"main\"),\n formula: createToolbarActionMeta(\"formula\", \"formula\", \"公式\", \"公式\", 140, \"insert\", \"main\"),\n painter: createToolbarActionMeta(\"painter\", \"paintbrush\", \"格式\", \"格式刷\", 210, \"view\", \"view\"),\n import: createToolbarActionMeta(\"import\", \"import\", \"导入\", \"导入\", 310, \"file\", \"file\"),\n export: createToolbarActionMeta(\"export\", \"export\", \"导出\", \"导出\", 320, \"file\", \"file\"),\n setTheme: createToolbarActionMeta(\"setTheme\", \"palette\", \"主题\", \"主题\", 410, \"view\", \"view\"),\n setLayout: createToolbarActionMeta(\"setLayout\", \"layout\", \"结构\", \"结构\", 420, \"view\", \"view\"),\n zoomIn: createToolbarActionMeta(\"zoomIn\", \"zoom-in\", \"放大\", \"放大\", 510, \"view\", \"view\"),\n zoomOut: createToolbarActionMeta(\"zoomOut\", \"zoom-out\", \"缩小\", \"缩小\", 500, \"view\", \"view\"),\n fitView: createToolbarActionMeta(\"fitView\", \"fit\", \"适应\", \"适应画布\", 520, \"view\", \"view\"),\n centerRoot: createToolbarActionMeta(\"centerRoot\", \"target\", \"回根\", \"回到根节点\", 490, \"view\", \"view\"),\n fullscreenCanvas: createToolbarActionMeta(\"fullscreenCanvas\", \"fullscreen\", \"全屏\", \"全屏查看\", 550, \"view\", \"view\"),\n fullscreenPage: createToolbarActionMeta(\"fullscreenPage\", \"fullscreen-page\", \"全页\", \"全屏编辑\", 560, \"view\", \"view\"),\n exitFullscreen: createToolbarActionMeta(\"exitFullscreen\", \"exit-fullscreen\", \"退出\", \"退出全屏\", 570, \"view\", \"view\"),\n search: createToolbarActionMeta(\"search\", \"search\", \"搜索\", \"搜索\", 530, \"view\", \"view\"),\n showMenu: createToolbarActionMeta(\"showMenu\", \"menu\", \"菜单\", \"显示菜单\", 580, \"view\", \"view\"),\n expandCollapse: createToolbarActionMeta(\"expandCollapse\", \"expand\", \"展开\", \"展开/收起\", 610, \"view\", \"view\"),\n copyNodeText: createToolbarActionMeta(\"copyNodeText\", \"copy\", \"复制\", \"复制文本\", 620, \"view\", \"view\"),\n readonly: createToolbarActionMeta(\"readonly\", \"lock\", \"只读\", \"只读\", 540, \"view\", \"view\"),\n },\n sidebarPanels: [\n {\n id: \"nodeStyle\",\n kind: \
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":244,"e":252,"m":1778497092829.736,"t":" { id: \"node-text-dark\", label: \"深色文字\", actionId: \"painter\", value: \"#0f172a\", controlType: \"swatch\", preview: \"#0f172a\", compatPath: \"nodes.$active.data.color\" },\n { id: \"node-text-blue\", label: \"蓝色文字\", actionId: \"painter\", value: \"#1d4ed8\", controlType: \"swatch\", preview: \"#1d4ed8\", compatPath: \"nodes.$active.data.color\" },\n { id: \"node-font-14\", label: \"14 px\", actionId: \"painter\", value: 14, controlType: \"segmented\", compatPath: \"nodes.$active.data.fontSize\" },\n { id: \"node-font-18\", label: \"18 px\", actionId: \"painter\", value: 18, controlType: \"segmented\", compatPath: \"nodes.$active.data.fontSize\" },\n { id: \"node-font-bold\", label: \"加粗\", actionId: \"painter\", value: true, controlType: \"toggle\", compatPath: \"nodes.$active.data.fontWeight\" },\n { id: \"node-font-italic\", label: \"斜体\", actionId: \"painter\", value: true, controlType: \"toggle\", compatPath: \"nodes.$active.data.fontStyle\" },\n { id: \"node-shape-round\", label: \"圆角矩形\", actionId: \"painter\", value: \"roundedRectangle\", controlType: \"button\", compatPath: \"nodes.$active.data.shape\" },\n { id: \"node-shape-rect\", label: \"矩形\", actionId: \"painter\", value: \"rectangle\", controlType: \"button\", compatPath: \"nodes.$active.data.shape\" },\n { id: \"node-border-blue\", label: \"蓝色边框\", actionId: \"painter\", value: \"#60a5fa\", controlType: \"swatch\", preview: \"#60a5fa\", compatPath: \"nodes.$active.data.borderColor\" },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":241,"e":282,"m":1778497092829.736,"t":"{ id: \"node-fill-blue\", label: \"海蓝\", actionId: \"painter\", value: \"#dbeafe\", controlType: \"swatch\", preview: \"#dbeafe\", compatPath: \"nodes.$active.data.fillColor\" },\n { id: \"node-fill-green\", label: \"薄荷\", actionId: \"painter\", value: \"#dcfce7\", controlType: \"swatch\", preview: \"#dcfce7\", compatPath: \"nodes.$active.data.fillColor\" },\n { id: \"node-fill-amber\", label: \"暖黄\", actionId: \"painter\", value: \"#fef3c7\", controlType: \"swatch\", preview: \"#fef3c7\", compatPath: \"nodes.$active.data.fillColor\" },\n { id: \"node-text-dark\", label: \"深色文字\", actionId: \"painter\", value: \"#0f172a\", controlType: \"swatch\", preview: \"#0f172a\", compatPath: \"nodes.$active.data.color\" },\n { id: \"node-text-blue\", label: \"蓝色文字\", actionId: \"painter\", value: \"#1d4ed8\", controlType: \"swatch\", preview: \"#1d4ed8\", compatPath: \"nodes.$active.data.color\" },\n { id: \"node-font-14\", label: \"14 px\", actionId: \"painter\", value: 14, controlType: \"segmented\", compatPath: \"nodes.$active.data.fontSize\" },\n { id: \"node-font-18\", label: \"18 px\", actionId: \"painter\", value: 18, controlType: \"segmented\", compatPath: \"nodes.$active.data.fontSize\" },\n { id: \"node-font-bold\", label: \"加粗\", actionId: \"painter\", value: true, controlType: \"toggle\", compatPath: \"nodes.$active.data.fontWeight\" },\n { id: \"node-font-italic\", label: \"斜体\", actionId: \"painter\", value: true, controlType: \"toggle\", compatPath: \"nodes.$active.data.fontStyle\" },\n { id: \"node-shape-round\", label: \"圆角矩形\", actionId: \"painter\", value: \"roundedRectangle\", controlType: \"button\", compatPath: \"nodes.$active.data.shape\" },\n { id: \"node-shape-rect\", label: \"矩形\", actionId: \"painter\", value: \"rectangle\", controlType: \"button\", compatPath: \"nodes.$active.data.shape\" },\n { id: \"node-border-blue\", label: \"蓝色边框\", actionId: \"painter\", value: \"#60a5fa\", controlType: \"swatch\", preview: \"#60a5fa\", compatPath: \"nodes.$active.data.borderColor\" },\n { id: \"node-line-teal\", label: \"青色分支线\", actionId: \"painter\", value: \"#14b8a6\", controlType: \"swatch\", preview: \"#14b8a6\", compatPath: \"nodes.$active.data.lineColor\" },\n { id: \"node-line-width-2\", label: \"边线 2\", actionId: \"painter\", value: 2, controlType: \"segmented\", compatPath: \"nodes.$active.data.lineWidth\" },\n ],\n },\n {\n id: \"baseStyle\",\n kind: \"baseStyle\",\n label: \"导图样式\",\n icon: \"sliders\",\n runtimeCapability: \"base-style\",\n phase: 1,\n options: [\n { id: \"base-curve-line\", label: \"曲线\", actionId: \"painter\", value: \"curve\", controlType: \"segmented\", compatPath: \"style.map.lineStyle\" },\n { id: \"base-direct-line\", label: \"直线\", actionId: \"painter\", value: \"straight\", controlType: \"segmented\", compatPath: \"style.map.lineStyle\" },\n { id: \"base-rainbow-lines\", label: \"彩虹线条\", actionId: \"painter\", value: { enabled: true }, controlType: \"toggle\", compatPath: \"style.map.rainbowLines\" },\n { id: \"base-line-width-2\", label: \"线宽 2\", actionId: \"painter\", value: 2, controlType: \"segmented\", compatPath: \"style.map.lineWidth\" },\n { id: \"base-line-width-4\", label: \"线宽 4\", actionId: \"painter\", value: 4, controlType: \"segmented\", compatPath: \"style.map.lineWidth\" },\n { id: \"base-background-light\", label: \"浅色背景\", actionId: \"painter\", value: \"#f8fafc\", controlType: \"swatch\", preview: \"#f8fafc\", compatPath: \"style.map.backgroundColor\" },\n { id: \"base-node-spacing-36\", label: \"节点间距 36\", actionId: \"painter\", value: 36, controlType: \"numberInput\", compatPath: \"style.map.nodeSpacing\" },\n { id: \"base-summary-bracket\", label
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":283,"e":300,"m":1778497092829.736,"t":" { id: \"theme-classic\", label: \"Classic\", actionId: \"setTheme\", value: \"classic\", controlType: \"swatch\", preview: \"#60a5fa\", description: \"默认主题\" },\n { id: \"theme-classic4\", label: \"KMind\", actionId: \"setTheme\", value: \"classic4\", controlType: \"swatch\", preview: \"#22c55e\", description: \"KMind-like\" },\n { id: \"theme-simple\", label: \"Simple\", actionId: \"setTheme\", value: \"simple\", controlType: \"swatch\", preview: \"#f59e0b\", description: \"轻量主题\" },\n { id: \"theme-dark\", label: \"Dark\", actionId: \"setTheme\", value: \"dark\", controlType: \"swatch\", preview: \"#334155\", description: \"深色主题\" },\n ],\n },\n {\n id: \"structure\",\n kind: \"structure\",\n label: \"结构\",\n icon: \"layout\",\n runtimeCapability: \"layout\",\n phase: 1,\n options: [\n { id: \"layout-logical\", label: \"逻辑结构图\", actionId: \"setLayout\", value: \"logicalStructure\", controlType: \"layoutCard\", preview: \"logicalStructure\" },\n { id: \"layout-mind-map\", label: \"思维导图\", actionId: \"setLayout\", value: \"mindMap\", controlType: \"layoutCard\", preview: \"mindMap\" },\n { id: \"layout-organization\", label: \"组织结构图\", actionId: \"setLayout\", value: \"organizationStructure\", controlType: \"layoutCard\", preview: \"organizationStructure\" },\n { id: \"layout-catalog\", label: \"目录组织图\", actionId: \"setLayout\", value: \"catalogOrganization\", controlType: \"layoutCard\", preview: \"catalogOrganization\" },","v":"owtNvWCFIT2OHBK+v++qvV8tcrtFUui8xLe6PG/aBLwZLw68bPXYvSHjK7xUw4U49P7aPdTuDj1Rx+Q8vZwjvRPg2bxLLJ680+eHPaSfUz2Fhcy7jd48ve1O2bsMY1a9am0HPbCDEz3fWAI9LIWbPEBWo701BvQ8Hq0TPGmhLTw0UXM8ekPkO/MitDxFYTe9W+aYu2fNSzwqooq7kdQ8PXvI0DzemK89I7CEPJ3pIL2CeMS7wPcAvUWrFz3XLAW8ElM4PVfpbTzkDJe7UFVLvA8Zvz0j7Vu9oqClPWFf3TtwsUu9MA0lPTq/HD3PBG48eExpu0xM5D3orpY8CSSEPM2+mT39Wem8UBjeuwmKLLwPjzS9T4JIvZeG1TuQ1R69BlAcu5hHIr2VRTi9jfAoPTFn7rsDS8q8UY5gPMOfHz2R8ig8XP1zvGbQLj2Hon48EPRQPXKqHT1QSyi8EdswvLrXob3w7ik9TlMzvAPciLzdMPq9H1n6O3u9JL0oM0o84YE7vQ5wED2Wewc8bg0eu24j4LwKs+W7khFSPC9tJr3yOgy989yGPZ+HIr2ClW+8YlzovP50mryKDdq7VbExvIhzVb3tuQ49eiQ5PbpVIr23To49VjWQvRf48LxaODc9o93SO3iCIrwVh0s9wNiuPF5fMz3SECs8EGievFuyL73EThI8dCaWvZ9GvLwJNCo9r0lkvAYVrryKhfo7jwmYPSW26TuEmgC9ur5IvPCKfLu903e8AAmCPAuMZryJFs689oHwOjoGiL1OvoQ9Ca6NvAhfir3KMGg8VKN1vEj/oDw7wxy9OmWSPF8qaLsH8RK90acyPSViJD3mIVy9+wVDPKuIxzxmXSq5nJw9vMs59rtOPes8AoMdvQRfL7zmYyU9Ee9IOyEzYT1hM0y97RcQPVRJsLx2LaI81rdRvIv3Xb3CkYo9pXr+vJju9zxJEUC9ZNeRvFYnDL3rALY6dAxavJMm3ryg+0c8ZZu1PNPJPL3rlQ48Agu3vPtVjT1qsn+8NN5VvW/QJj1DkVu9NBKLva9EBTzaaSE9T6ScvH2ylbwaYwe9w4dovNCpUjwDK2k9bwWlvYaeOLxxFMA6k+jOPYOaJ73BcVM8H2BsPUTF2DuUO9y8sdwHPTcS3TzIsyM837OLPBm9Lb2GZVG9S91ePMbSBDs+gDQ8rW7ku2xUn7x9ryo9TEfTPJggu7yiMiY9qN2vPAyM57yl5si8uB6lvdA8ZD3+oI48BLwQOwFDQj0VfKW8RQDFPPul1Ttmknc8ZxmUOyLDGLqLxF898aGoPDKZjLxruWy8TvRSO0r9/bxSSVc7IWt4PWDrnrrQdzA8r97rPAMVAT0lbcQ8hYgzvZi3sbqUP928zjyTvAeDHbyvyrU7UZufvBhWYTy9Gdm4Izmpu+H2cr29sIC7e7/8vC1CHb1qN++7BuUWvJKgnTxyZFa97eIDPSU0nTyexYk8D7fiu5rEQj0esDe9+lRkPZrKZTxfUi69nvcfvYTYED0OXM8863m8PICs0Lo1v+08wyitvDtLwrq6vBi9Q02APQJ7OL0pxkM4vRb/vI4n3LyBs448KryRPAwd/7tZkjC8fwRnPEoEoj2yO1E9R/aZvOX2MDxiYCa9OpHxO4O/yLsL99+7QEodvDoLID1b8dS85Kt/vYR1KDyE0QW8bYoqPY8Z4Dz9cIa8gaQ/Peuyv7kdn2+7jtmWvJiou7zxLa487chmvISWHj3X4dY6TFrXO/nYKDyvMIe8+lGnPUMYXT1IkIG8297mOwRhQzxb61Y9a2eCvOd5hTodXmE8tjDVPI/JnD0tPrm8+yAePSY1M71r1n67mOUFvLbrjDxGMzu8HCIHvbhDTzx60gm9V/8GPbFUBTsdXLi8LE6ruyAxYjxszjE8qtewPCGcNj2Lrjk9wiqSOz1+mz2/O9e8nQcXvVJlYDxNHI49cvuFPPpifTxRxsQ7c1AJvLblRzzsszM7i3D5PBROlDwqYIU8d4bePLPItb1aOws9RHjkO8fFKj2NMM6879snvbYLLLtpUOo7I8+SPBSQjzwZU9A8nFGIvb3Abz22Mew8KngJvZVSjjglSQc9CtoXvCXy5LoxVdO81PPPPBOvdzzkPqi9R4uwPN4Py71hdOS88V31POwem7z1BDA97Zomu+JFeLwmzkS9pa4xPdFyf72aqLw8xTm1u0SgAD1/Fo286OhpvPduNTzG2YM9sEPgvJOEz7ztvGy6hDqRPEU7cj0f7AC74OG1vMBXxDzJfam8FuKCPfusET2qszs8vCkpvdtP/jpr/I86LbcdPX2vj73d8GC8EaJFu515m7opH3o8MTvzvLQsYjzwHTE9jrNrvSsNATwMEwm9Cm
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":289,"e":348,"m":1778497092829.736,"t":"{\n id: \"structure\",\n kind: \"structure\",\n label: \"结构\",\n icon: \"layout\",\n runtimeCapability: \"layout\",\n phase: 1,\n options: [\n { id: \"layout-logical\", label: \"逻辑结构图\", actionId: \"setLayout\", value: \"logicalStructure\", controlType: \"layoutCard\", preview: \"logicalStructure\" },\n { id: \"layout-mind-map\", label: \"思维导图\", actionId: \"setLayout\", value: \"mindMap\", controlType: \"layoutCard\", preview: \"mindMap\" },\n { id: \"layout-organization\", label: \"组织结构图\", actionId: \"setLayout\", value: \"organizationStructure\", controlType: \"layoutCard\", preview: \"organizationStructure\" },\n { id: \"layout-catalog\", label: \"目录组织图\", actionId: \"setLayout\", value: \"catalogOrganization\", controlType: \"layoutCard\", preview: \"catalogOrganization\" },\n { id: \"layout-timeline\", label: \"时间轴\", actionId: \"setLayout\", value: \"timeline\", controlType: \"layoutCard\", preview: \"timeline\" },\n { id: \"layout-fishbone\", label: \"鱼骨图\", actionId: \"setLayout\", value: \"fishbone\", controlType: \"layoutCard\", preview: \"fishbone\" },\n ],\n },\n {\n id: \"outline\",\n kind: \"outline\",\n label: \"大纲\",\n icon: \"list-tree\",\n runtimeCapability: \"outline\",\n phase: 1,\n options: [],\n },\n {\n id: \"shortcutKey\",\n kind: \"shortcutKey\",\n label: \"快捷键\",\n icon: \"sparkles\",\n runtimeCapability: \"shortcut-key\",\n phase: 1,\n options: [\n { id: \"shortcut-insert-child\", label: \"Tab\", description: \"插入子节点\", actionId: null, value: null, controlType: \"treeItem\", readonly: true },\n { id: \"shortcut-insert-sibling\", label: \"Enter\", description: \"插入同级节点\", actionId: null, value: null, controlType: \"treeItem\", readonly: true },\n { id: \"shortcut-delete\", label: \"Delete\", description: \"删除节点\", actionId: null, value: null, controlType: \"treeItem\", readonly: true },\n ],\n },\n {\n id: \"settings\",\n kind: \"settings\",\n label: \"设置\",\n icon: \"hexagon\",\n runtimeCapability: \"settings\",\n phase: 1,\n options: [\n { id: \"settings-readonly-hint\", label: \"只读模式\", description: \"导航栏切换\", actionId: null, value: null, controlType: \"toggle\", readonly: true },\n { id: \"settings-mouse\", label: \"鼠标行为\", description: \"左键选中,右键拖拽\", actionId: null, value: \"leftSelectRightDrag\", controlType: \"select\", readonly: true },\n ],\n },\n ],\n navigatorItems: [\n { id: \"stats\", label: \"统计\", actionId: null, readOnly: true, displayMode: \"text\" },\n { id: \"centerRoot\", label: \"回根节点\", actionId: \"centerRoot\", readOnly: true, displayMode: \"button\" },\n { id: \"search\", label: \"搜索\", actionId: \"search\", readOnly: true, displayMode: \"button\" },\n { id: \"zoomOut\", label: \"缩小\", actionId: \"zoomOut\", readOnly: true, displayMode: \"button\" },\n { id: \"zoom\", label: \"缩放\", actionId: null, readOnly: true, displayMode: \"input\" },\n { id: \"zoomIn\", label: \"放大\", actionId: \"zoomIn\", readOnly: true, displayMode: \"button\" },\n { id: \"fullscreen\", label: \"全屏\", actionId: \"fullscreenCanvas\", readOnly: true, displayMode: \"button\" },\n { id: \"readonly\", label: \"只读\", actionId: \"readonly\", readOnly: true, displayMode: \"button\" },","v":"qZ90vYq8nD2Rg7u9g8Glvc//YD3E5pu9jV/IPKsoP7xQaIQ8JlPcvaoEiTyVKQY7Iy/kPdDEBj1LnHw726EAvXifjrxX5AO9dB10PZZEyzxZTve8KXzbPBQh5rrTkAy8k7TdOoQrGD1fhio9DMDaO/bChb33sWA9yngYPRcqwDwHQgw9y7GWu6Yg27wiRW+9J9cRPLtGETylIoi7sS/2Or5VNrvBayw91om1O9dsnr0gCbS8Ocp3vcBhhj2tySK8elK9O0PaPDww9d28SDIounOEZT2UTkK9mO/jPT+bwj06IfW8Z6IqPW2Kij3QAGM8arSVPKjrzD1XbIo8LKVFPZufcT1N7BC9OMKmvHlJZrzc0Lq8U1
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts","s":337,"e":374,"m":1778497092829.736,"t":"],\n },\n ],\n navigatorItems: [\n { id: \"stats\", label: \"统计\", actionId: null, readOnly: true, displayMode: \"text\" },\n { id: \"centerRoot\", label: \"回根节点\", actionId: \"centerRoot\", readOnly: true, displayMode: \"button\" },\n { id: \"search\", label: \"搜索\", actionId: \"search\", readOnly: true, displayMode: \"button\" },\n { id: \"zoomOut\", label: \"缩小\", actionId: \"zoomOut\", readOnly: true, displayMode: \"button\" },\n { id: \"zoom\", label: \"缩放\", actionId: null, readOnly: true, displayMode: \"input\" },\n { id: \"zoomIn\", label: \"放大\", actionId: \"zoomIn\", readOnly: true, displayMode: \"button\" },\n { id: \"fullscreen\", label: \"全屏\", actionId: \"fullscreenCanvas\", readOnly: true, displayMode: \"button\" },\n { id: \"readonly\", label: \"只读\", actionId: \"readonly\", readOnly: true, displayMode: \"button\" },\n ],\n contextMenuItems: [\n { id: \"insertChild\", label: \"插入子节点\", actionId: \"insertChild\", requiresNode: true, phase: 1 },\n { id: \"insertSiblingAfter\", label: \"插入同级节点\", actionId: \"insertSiblingAfter\", requiresNode: true, phase: 1 },\n { id: \"deleteNode\", label: \"删除节点\", actionId: \"deleteNode\", requiresNode: true, phase: 1 },\n { id: \"summary\", label: \"概要\", actionId: \"summary\", requiresNode: true, phase: 1 },\n { id: \"associativeLine\", label: \"关联线\", actionId: \"associativeLine\", requiresNode: true, phase: 1 },\n { id: \"expandCollapse\", label: \"展开/收起\", actionId: \"expandCollapse\", requiresNode: true, phase: 1 },\n { id: \"copyNodeText\", label: \"复制文本\", actionId: \"copyNodeText\", requiresNode: true, phase: 1 },\n { id: \"centerRoot\", label: \"回根节点\", actionId: \"centerRoot\", requiresNode: false, phase: 1 },\n { id: \"fitView\", label: \"适应画布\", actionId: \"fitView\", requiresNode: false, phase: 1 },\n { id: \"search\", label: \"搜索\", actionId: \"search\", requiresNode: false, phase: 1 },\n { id: \"readonly\", label: \"只读切换\", actionId: \"readonly\", requiresNode: false, phase: 1 },\n { id: \"showMenu\", label: \"显示菜单\", actionId: \"showMenu\", requiresNode: false, phase: 1 },\n ],\n};\n\nexport const isMindmapDebugChromeEnabled = (href: string): boolean => {\n try {\n const value = new URL(href).searchParams.get(MINDMAP_DEBUG_CHROME_QUERY_PARAM);\n return value === \"1\" || value === \"true\";\n } catch {\n return false;\n }\n};","v":"z7Suu6w5Hz2eMvq9W525vYQYzj0UEXO99DwvvOs7ozvJcsQ7xB7VvTmKxLylQZg9Oir8Pd7AjTwuSeY8aexovSp4mbwr/Cy9GuZwPSJsLT31WoC6rjHJPIJaqztajp+88C4xPaYBTD2/UTY7IXN3PQl4Q72sVx09roxOu1vZzTyw0iK894CrvMesbb2nZrS8+1LjvBE1ojysSTE8I7oRPSf+JzzoAzo9koFlPDG8Bb2nx1Q9XJoYvfgySj1dLQI9jvsHPdvQWryAu5k8leIeu0l/aD0F9Ni84qrqPQC8JD3OBzm9qajsvNobRDwKzBC9rPB3PMZViD1UHQu9v+mZPAzq0D1xTiK8kgsQvTDPrTwjJZe84GhrPMHjTz3X8j48CplEO+WfjrwpHo29DWkUPYYEdrxc+X69Y2zpvCAQhj0Vc5e8LzAtvRSydzx4bZc8/449PcPFo7zfAqU7IvjivDyfPL3s6xQ94M1IPcjinjyYDMy8EzE6Paw45LxOp8s63gIHuhE0Jjx4HcQ7g9I9vOuj6bvK55o87WHGu1uzMLxrM568ndc+PaKiljpdRxa8IVCnvKLtar0XnSu9ETQvPY1807xcpoi9iIfOPGPtTb1BjRU9KA2jvDe3dr1Ftis8oKmWvAeiqrrDz/U8NAOvPW+uAz3sbOc7MSipO4aVqjz6ikS86hCSvftwAb36ZC28tHxnvQcbtzspFDM95gs7PRgtbr1nRyo83QnzOiFfTr0dBqC8js1cOyGS9bzZDAO9r5FKPCDxj70MVCw9ECuwuuA/nrxtwL+8RRWZvKzoPz0Hla+8vb3lPI62cLymEcq6GEF+PVZ57TuGgGC8D/YOvQUtPD0V1na8Ln4bvOVKCTx0C1K8+vYevbEBgzwQlqI8EolovPvGmruLkrC98jEXvdHE7TyNqN+8QsBUvQtGWDuOQkW85uCuPB+q8zttdqK93ssjvJ5uzb0IqoU9UPQtPFdnkbwG5hC8Kl1LPXZqcLwddlg8tIiEvHWQsDqIFJ+9+3SMu4brnTxqivi7/i6DvRPu1DwnqUy9BDrTPI0yPLzMGzi8sjKrvHZuE7xZAAA9CUZZvXipLr0YKHw8RhM7PR3HCr0gqdE82kR0PZwh07yQEAG9bO0XPadXdTzBzqu8cui5PLYUX7x0gk+9blt+POFEIj1DEG68mwkZPfd+zTxQwGg96VEjPbBJ8rxf8yg8mUgMvVXkLryny9q8WW9uvQnvWD0yPoI8HDgSvX0z8jxGw7o7bo2YPbIshrwCG748sZfTvH8LoDxgovY6oUjCvPC8t7uQ2gG9xqKOvNF+jbxpONK5R8a6PG0zyTv8HT09mD+FPfdUgD3A+5Y9Lq8fvYht3Tt2w867aK63vIgfcL23Pps8S2DvPOfbxjt0jsu8usABvVEucL0T2oC92rqwvAJhZ7vIWBw8qn0Lv
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.test.ts","s":1,"e":60,"m":1778688996967.2717,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n createDefaultMindmapShellInteractionState,\n deriveMindmapUiState,\n reduceMindmapChromeVisibility,\n} from \"./mindmap-ui-state\";\n\ndescribe(\"mindmap UI state\", () => {\n it(\"无 active node 时禁用节点编辑动作,但保留视图动作\", () => {\n const state = deriveMindmapUiState({ activeNodeId: null, readonly: false });\n\n expect(state.disabledActions.insertChild).toBe(true);\n expect(state.disabledActions.insertSiblingAfter).toBe(true);\n expect(state.disabledActions.deleteNode).toBe(true);\n expect(state.disabledActions.expandCollapse).toBe(true);\n expect(state.disabledActions.zoomIn).toBe(false);\n expect(state.disabledActions.centerRoot).toBe(false);\n expect(state.disabledActions.fullscreenCanvas).toBe(false);\n expect(state.disabledActions.exitFullscreen).toBe(false);\n });\n\n it(\"readonly 时禁用编辑动作,保留搜索和视图动作\", () => {\n const state = deriveMindmapUiState({ activeNodeId: \"node_1\", readonly: true });\n\n expect(state.disabledActions.insertChild).toBe(true);\n expect(state.disabledActions.note).toBe(true);\n expect(state.disabledActions.setTheme).toBe(true);\n expect(state.disabledActions.expandCollapse).toBe(true);\n expect(state.disabledActions.copyNodeText).toBe(false);\n expect(state.disabledActions.search).toBe(false);\n expect(state.disabledActions.zoomOut).toBe(false);\n expect(state.disabledActions.fullscreenCanvas).toBe(false);\n expect(state.disabledActions.fullscreenPage).toBe(false);\n });\n\n it(\"缺少 runtime capability 时禁用对应 action\", () => {\n const state = deriveMindmapUiState({\n activeNodeId: \"node_1\",\n readonly: false,\n runtimeCapabilities: [\"runtimeCommand\", \"kernelCommand\"],\n });\n\n expect(state.disabledActions.note).toBe(true);\n expect(state.disabledActions.insertChild).toBe(false);\n });\n\n it(\"导出能力暂缓时在 UI state 中保持禁用\", () => {\n const state = deriveMindmapUiState({ activeNodeId: \"node_1\", readonly: false });\n\n expect(state.disabledActions.export).toBe(true);\n });\n\n it(\"派生默认 shell state,给 Leptos shell 提供稳定合同\", () => {\n const state = deriveMindmapUiState({\n activeNodeId: \"node_1\",\n readonly: true,\n shell: {\n chromeVisibility: \"hiddenByPointerLeave\",\n toolbarOverflow: {\n availableWidth: 640,","v":"MXygPMGrBbtX5h2+nFGFvYUiuD29J0i9JI5UuwzNVT39ayI9MPsovbleQDqPlnQ9YKJZPRfaRLyNyRu9/agyvWmtUDtg/ee8bvYcPfN8N7zJJWy8gb+LvMQEJ7zCKZC8ebOMPWxghT1BI4q8ngwuPV2qhbwuQAE9/FKtPe5jaLsGcuQ8yOCnvC/YkL2PYLK8e7krvLfjxDvOQoO8hLzaPNZ6Prx4nGa83GNJvG02Qb107209ap8GPVwqYT1YwG66UPEKPUfnY70NY8u8vDUcvFRb0DzWitC8eW8xPgUAFT1L7oy8kmBpu8hjAT3hIqy8H1KLPMgfErqftse8+SGlPVeHkj0BPdq8OvoqvWzuhz1Kjxy9qN6DPbU/7DwBTZ27SnV2vCitkb2c+/K8ljrqO43Mt7yqHAy9kHJiuW0MVz1+WhW9mURcvPM8dD19LMg8hSElPYIfsLyxX4o8M7QkvG+nHL0n17o9L1ZPPe/wJb3p1I88h7PRuvekS70CBgm9p1kuveQ9gDxXMgq8I5SEux/8HT2O6Qe9lOBDvfXVEr123zm7u26SPYpWe7xUpNw76SDQuXpUEb26yp68sRpLPWvt/zZqwde8blN/vJz7Qr2AUNQ8/K9jPCpcTL1r6Kc82vRgPCH1AzrEIks82OwtPf/Ffj135S88pvekvIG4Abzw9Zo7nuIjvd4RDLqFBL07RSctvTjroTzgYSk9TJAWPW2xu7zECgS9sN/1uHPmZzwCd588gq+qPK5mCL3G+iK8O7jKPE4WV71zHy89Nr3kvLGU+rzgKkm824IuvcL8OD1RAZq8tpTRO5JATzq/zvu855aUPNY4njz6+pY8J9/WPM+Rbz2TWGY85W0ovdNPQD1OnNQ6M/qzvSsMgDw/oEE81u9kPI2IIT0bhHu98rbVvO+WmDtuUSo77/YDvcdic7x6Ryi7eWS7vOHgEz3OLmG8wyKAPArJo71CPzs9dcouPAqGYb0lV/W8IQepvBXK47z8Afu5omfAvDd+CDxIiHu9J15/vdeejryb33M8zrZmvcU0CTzZ3Ma8bhPkPDMshroqk3u8i2g8vBStDLwYg587db1wvSpNCT2CAmC9Dug9PUz+Or3bMi09PBGDPeSd0LzjtRc8At5RPXNh1juU3Cs9R/wdPdCXubxltB69nC/avG5iMz3T3R69N99XPc3ZHLyM1aA8n+DGO3IYpLuGmCG7WLRNu35AjbvdLze9RnCBveeg/jug4Sk99f0zPIC3mTxzWoi7YUZtPS3gv7t4v6K8x5EDO/3oMzwJ02s8NA4vvE+aU72tvxS9c9VUvL1DHrwBF8E8RN7KPOcJZ7xtcV28idwXPXNMcz29b9Q85k6IvVDWFzx6KSG9JQKKumu0O711XKA87qg+vRhNzDw3wQs9eiCyvD5KFL1hVHM8rUkaPL98jLytSmQ8xPjHvJWRuDzB4IK8Vuo4PdmcWT2pgbe75O
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.test.ts","s":49,"e":108,"m":1778688996967.2717,"t":"expect(state.disabledActions.export).toBe(true);\n });\n\n it(\"派生默认 shell state,给 Leptos shell 提供稳定合同\", () => {\n const state = deriveMindmapUiState({\n activeNodeId: \"node_1\",\n readonly: true,\n shell: {\n chromeVisibility: \"hiddenByPointerLeave\",\n toolbarOverflow: {\n availableWidth: 640,\n visibleActionIds: [\"undo\", \"redo\"],\n overflowActionIds: [\"image\"],\n moreOpen: true,\n },\n fullscreen: {\n mode: \"canvas\",\n isFullscreen: true,\n apiAvailable: false,\n },\n sidebar: {\n triggerVisible: false,\n panelOpen: false,\n activePanelId: \"structure\",\n collapsedByToggle: true,\n },\n navigator: {\n searchOpen: true,\n minimapOpen: true,\n zoomPercent: 138.4,\n },\n },\n });\n\n expect(state.shell.chromeVisibility).toBe(\"hiddenByPointerLeave\");\n expect(state.shell.toolbarOverflow).toMatchObject({\n availableWidth: 640,\n visibleActionIds: [\"undo\", \"redo\"],\n overflowActionIds: [\"image\"],\n moreOpen: true,\n });\n expect(state.shell.fullscreen).toMatchObject({\n mode: \"canvas\",\n isFullscreen: true,\n target: \"mindmap-root\",\n apiAvailable: false,\n });\n expect(state.shell.sidebar).toMatchObject({\n triggerVisible: false,\n panelOpen: false,\n activePanelId: \"structure\",\n drawerWidth: 300,\n collapsedByToggle: true,\n });\n expect(state.shell.navigator).toMatchObject({\n searchOpen: true,\n minimapOpen: true,\n readonly: true,\n zoomPercent: 138,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.test.ts","s":97,"e":146,"m":1778688996967.2717,"t":"expect(state.shell.sidebar).toMatchObject({\n triggerVisible: false,\n panelOpen: false,\n activePanelId: \"structure\",\n drawerWidth: 300,\n collapsedByToggle: true,\n });\n expect(state.shell.navigator).toMatchObject({\n searchOpen: true,\n minimapOpen: true,\n readonly: true,\n zoomPercent: 138,\n mouseBehavior: \"leftSelectRightDrag\",\n });\n });\n\n it(\"鼠标移出隐藏 chrome,鼠标移入不自动恢复,点击才恢复\", () => {\n const hidden = reduceMindmapChromeVisibility(\"visible\", \"pointerLeave\");\n expect(hidden).toBe(\"hiddenByPointerLeave\");\n expect(reduceMindmapChromeVisibility(hidden, \"pointerEnter\")).toBe(\"hiddenByPointerLeave\");\n expect(reduceMindmapChromeVisibility(hidden, \"restoreClick\")).toBe(\"visible\");\n });\n\n it(\"sidebar 隐藏触发条后保留最近 active panel\", () => {\n const state = createDefaultMindmapShellInteractionState({\n sidebar: {\n triggerVisible: false,\n panelOpen: false,\n activePanelId: \"structure\",\n collapsedByToggle: true,\n },\n });\n\n expect(state.sidebar.triggerVisible).toBe(false);\n expect(state.sidebar.panelOpen).toBe(false);\n expect(state.sidebar.activePanelId).toBe(\"structure\");\n expect(state.sidebar.collapsedByToggle).toBe(true);\n\n const restored = createDefaultMindmapShellInteractionState({\n sidebar: {\n ...state.sidebar,\n triggerVisible: true,\n panelOpen: true,\n collapsedByToggle: false,\n },\n });\n expect(restored.sidebar.activePanelId).toBe(\"structure\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts","s":1,"e":60,"m":1778504167974.0461,"t":"import { getMindmapActionMapping, listMindmapActionMappings, type MindmapActionTarget } from \"./mindmap-action-map\";\nimport { mindmapDefaultUiSchema, type MindmapUiActionId } from \"./mindmap-ui-schema\";\n\nexport type MindmapRuntimeCapability = MindmapActionTarget;\n\nexport type MindmapChromeVisibilityState =\n | \"visible\"\n | \"hiddenByPointerLeave\"\n | \"hiddenByToggle\"\n | \"hiddenByFullscreen\";\n\nexport type MindmapToolbarOverflowState = {\n availableWidth: number | null;\n visibleActionIds: MindmapUiActionId[];\n overflowActionIds: MindmapUiActionId[];\n moreOpen: boolean;\n};\n\nexport type MindmapFullscreenState = {\n mode: \"none\" | \"canvas\" | \"page\";\n isFullscreen: boolean;\n target: \"mindmap-root\" | \"document-body\";\n apiAvailable: boolean;\n};\n\nexport type MindmapSidebarState = {\n triggerVisible: boolean;\n panelOpen: boolean;\n activePanelId: string | null;\n drawerWidth: number;\n collapsedByToggle: boolean;\n};\n\nexport type MindmapNavigatorState = {\n searchOpen: boolean;\n minimapOpen: boolean;\n readonly: boolean;\n zoomPercent: number;\n mouseBehavior: \"leftSelectRightDrag\" | \"leftDragRightMenu\";\n};\n\nexport type MindmapShellInteractionState = {\n chromeVisibility: MindmapChromeVisibilityState;\n toolbarOverflow: MindmapToolbarOverflowState;\n fullscreen: MindmapFullscreenState;\n sidebar: MindmapSidebarState;\n navigator: MindmapNavigatorState;\n};\n\nexport type MindmapUiStateInput = {\n activeNodeId?: string | null;\n readonly: boolean;\n runtimeCapabilities?: MindmapRuntimeCapability[];\n shell?: PartialMindmapShellInteractionState;\n};\n\nexport type MindmapUiState = {\n activeNodeId: string | null;\n readonly: boolean;\n disabledActions: Record<MindmapUiActionId, boolean>;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts","s":49,"e":108,"m":1778504167974.0461,"t":"export type MindmapUiStateInput = {\n activeNodeId?: string | null;\n readonly: boolean;\n runtimeCapabilities?: MindmapRuntimeCapability[];\n shell?: PartialMindmapShellInteractionState;\n};\n\nexport type MindmapUiState = {\n activeNodeId: string | null;\n readonly: boolean;\n disabledActions: Record<MindmapUiActionId, boolean>;\n shell: MindmapShellInteractionState;\n};\n\nexport type PartialMindmapShellInteractionState = {\n chromeVisibility?: MindmapChromeVisibilityState;\n toolbarOverflow?: Partial<MindmapToolbarOverflowState>;\n fullscreen?: Partial<MindmapFullscreenState>;\n sidebar?: Partial<MindmapSidebarState>;\n navigator?: Partial<MindmapNavigatorState>;\n};\n\nexport type MindmapChromeVisibilityEvent =\n | \"pointerLeave\"\n | \"pointerEnter\"\n | \"restoreClick\"\n | \"hideToggle\"\n | \"showToggle\"\n | \"enterFullscreen\"\n | \"exitFullscreen\";\n\nconst allActionIds = (): MindmapUiActionId[] => {\n const ids = [\n ...mindmapDefaultUiSchema.toolbarGroups.flatMap((group) => group.actions),\n ...mindmapDefaultUiSchema.navigatorItems.flatMap((item) => (item.actionId ? [item.actionId] : [])),\n ...mindmapDefaultUiSchema.contextMenuItems.map((item) => item.actionId),\n ...listMindmapActionMappings().map((mapping) => mapping.actionId),\n ];\n return [...new Set(ids)];\n};\n\nconst normalizeActiveNodeId = (value: string | null | undefined): string | null => {\n const trimmed = value?.trim();\n return trimmed ? trimmed : null;\n};\n\nconst normalizeZoomPercent = (value: number | undefined): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return 100;\n return Math.max(10, Math.min(500, Math.round(value)));\n};\n\nconst unsupportedActionIds = new Set<MindmapUiActionId>([\n \"tag\",\n \"hyperlink\",\n \"note\",\n \"image\",\n \"icon\",\n \"associativeLine\",\n \"formula\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts","s":97,"e":156,"m":1778504167974.0461,"t":"if (typeof value !== \"number\" || !Number.isFinite(value)) return 100;\n return Math.max(10, Math.min(500, Math.round(value)));\n};\n\nconst unsupportedActionIds = new Set<MindmapUiActionId>([\n \"tag\",\n \"hyperlink\",\n \"note\",\n \"image\",\n \"icon\",\n \"associativeLine\",\n \"formula\",\n \"import\",\n \"export\",\n]);\n\nexport const createDefaultMindmapShellInteractionState = (\n input: PartialMindmapShellInteractionState = {},\n): MindmapShellInteractionState => ({\n chromeVisibility: input.chromeVisibility ?? \"visible\",\n toolbarOverflow: {\n availableWidth: input.toolbarOverflow?.availableWidth ?? null,\n visibleActionIds: input.toolbarOverflow?.visibleActionIds ?? [],\n overflowActionIds: input.toolbarOverflow?.overflowActionIds ?? [],\n moreOpen: input.toolbarOverflow?.moreOpen ?? false,\n },\n fullscreen: {\n mode: input.fullscreen?.mode ?? \"none\",\n isFullscreen: input.fullscreen?.isFullscreen ?? false,\n target: input.fullscreen?.target ?? \"mindmap-root\",\n apiAvailable: input.fullscreen?.apiAvailable ?? true,\n },\n sidebar: {\n triggerVisible: input.sidebar?.triggerVisible ?? true,\n panelOpen: input.sidebar?.panelOpen ?? true,\n activePanelId: input.sidebar?.activePanelId ?? mindmapDefaultUiSchema.sidebarPanels[0]?.id ?? null,\n drawerWidth: input.sidebar?.drawerWidth ?? 300,\n collapsedByToggle: input.sidebar?.collapsedByToggle ?? false,\n },\n navigator: {\n searchOpen: input.navigator?.searchOpen ?? false,\n minimapOpen: input.navigator?.minimapOpen ?? false,\n readonly: input.navigator?.readonly ?? false,\n zoomPercent: normalizeZoomPercent(input.navigator?.zoomPercent),\n mouseBehavior: input.navigator?.mouseBehavior ?? \"leftSelectRightDrag\",\n },\n});\n\nexport const reduceMindmapChromeVisibility = (\n state: MindmapChromeVisibilityState,\n event: MindmapChromeVisibilityEvent,\n): MindmapChromeVisibilityState => {\n if (event === \"pointerLeave\") return \"hiddenByPointerLeave\";\n if (event === \"pointerEnter\") return state;\n if (event === \"restoreClick\") return \"visible\";\n if (event === \"hideToggle\") return \"hiddenByToggle\";\n if (event === \"showToggle\") return \"visible\";\n if (event === \"enterFullscreen\") return state === \"visible\" ? \"visible\" : \"hiddenByFullscreen\";\n if (event === \"exitFullscreen\") return state === \"hiddenByFullscreen\" ? \"visible\" : state;\n return state;","v":"L+DkPFQ3yTw+VvK9oZblvVROlD3rHna9uWcBvSLFBT3rF7g8eCeKvfZuRb3vvxo9n938PePqBj0s6CY9OjA/vCwIITsHN5299BoKPSgwQT2c0Ug963GWO9aezrxykz+9ct2APaS5hz1eIiq8BrZMPGuCJ71qTYE9VkE/vXh/jDy6cQS7RvMVvdzhxr16pU68gGGOO9yairzZ3Ek8Lm0WvIlH2Dx6g5S8mnt+vPqhA703lFw9GM2evFiCAD43bXI9hdyAPXchbb0vbxS8rPsvPOnuJj3bAjW9D17JPQiNPD1Lide7qoXdvNK0/jyhLZK8nMbau9qsrTwgSVq9WBc+PTRiWj1bWtA7c+mMvWbmlj1HgNc6evDXO5QZpDz2S4K8GsPQvJQXLb07YEC96ZuCPUfCJD2qBmS9ghMOvURbhj3OxY+8XeObvC0vlz3l6Ok8YJeKPFvC0DxdT4Q7o7/zPKPED73M/1w9xN/3u2ndE71dY+w7v0SBvHZrZr0EezQ8z3iFuslsljwVdSg80Uibu+ChLj184m69op0RPMWfIL32Uqm7UqnjPC5oaz3T2AO9QH3pOrP/H739gBS74V7UPLpMN70UFvm8p0EhO2YlTbzIw+Q8V0yGO0kD3LvYNZc80R11PCSxqrx+iUS8DhwKPcTHKDx5u2E8twRIvCsGrjzNggo9Psw5vYI4kb0HCi+83OVpPDpbLzw+IiE93G6mPbMz6Lxdqdq7w0YduyrdhLynYw+8w8V8vAbYrrwsibc8BuNAOzzIir2WQQk97+R8u/8rM7wxS0q8x+ZUvTf8lTyvVqw8RFR1Pbl7yjvcn3W8d2gRPYxz1bu05re8QHDfPFvZDD388Ju8j4WRvdhFozv374y69NM4vH7kBD1dWxo9vnflvKtmhrxoiJe9/pNLvSryETzj8xC9aERfO6jvory19fu6a0qDO/tzfTxJbtq8avvCPOYYWb1fKpI9UFLlO9WEkDw18pu8ra8lPE6b+ru1VSg8W3Wru5qpVDyc7Ea82wynvVGVR7ySKvG826OFvUZOmTxMNI07Z+PCPOcvP72tWx29BVfxuCXtlzz//Cc8hYCpvQHNiDw5gxK9NjKdPVy2Q72IQae8dC+HPaR4/bxIp+q8KSqbPJjq4by14cQ6hq4QvAx89DvigXG9W1uLPEOZPjz/ky+99RlsPXTo9zyfe5E9hBaGPbfqZL0CUiG79D70u+PWrTwvg/w79D4rvb9d8zwKg1274fCkvDVdbzzlFyY98LaIPRlbMDptBP+7dBh/O2Ilczz/5do8AZrVvDOsLr15doA7JLU0vb8x8rwWSnW5Z4ZJPSexEr2yaIm8IIZCPcALjD2vYZM7eqB6vHZuc7wf5OW7NAzGvITGQTxbKVu77BESvOJxET0dwRG9fcIdvdoZQb0Qndw7kUo+uvYilLzMLpU8N8mXvKLWoDx4IxS85YGmPPypmTxA5IQ7ijYnPaSsfbwxbfe8a/r3vIydS72eDwO9ac5gvAfDozxItny9p
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts","s":145,"e":203,"m":1778504167974.0461,"t":"export const reduceMindmapChromeVisibility = (\n state: MindmapChromeVisibilityState,\n event: MindmapChromeVisibilityEvent,\n): MindmapChromeVisibilityState => {\n if (event === \"pointerLeave\") return \"hiddenByPointerLeave\";\n if (event === \"pointerEnter\") return state;\n if (event === \"restoreClick\") return \"visible\";\n if (event === \"hideToggle\") return \"hiddenByToggle\";\n if (event === \"showToggle\") return \"visible\";\n if (event === \"enterFullscreen\") return state === \"visible\" ? \"visible\" : \"hiddenByFullscreen\";\n if (event === \"exitFullscreen\") return state === \"hiddenByFullscreen\" ? \"visible\" : state;\n return state;\n};\n\nexport const deriveMindmapUiState = (input: MindmapUiStateInput): MindmapUiState => {\n const activeNodeId = normalizeActiveNodeId(input.activeNodeId);\n const capabilities = input.runtimeCapabilities ? new Set<MindmapRuntimeCapability>(input.runtimeCapabilities) : null;\n const disabledActions = {} as Record<MindmapUiActionId, boolean>;\n const shell = createDefaultMindmapShellInteractionState({\n ...input.shell,\n navigator: {\n ...input.shell?.navigator,\n readonly: input.readonly,\n },\n });\n\n allActionIds().forEach((actionId) => {\n const mapping = getMindmapActionMapping(actionId);\n if (!mapping) {\n disabledActions[actionId] = true;\n return;\n }\n if (mapping.requiresActiveNode && !activeNodeId) {\n disabledActions[actionId] = true;\n return;\n }\n if (input.readonly && !mapping.readonlyAllowed) {\n disabledActions[actionId] = true;\n return;\n }\n if (capabilities && !capabilities.has(mapping.target)) {\n disabledActions[actionId] = true;\n return;\n }\n if (unsupportedActionIds.has(actionId)) {\n disabledActions[actionId] = true;\n return;\n }\n disabledActions[actionId] = false;\n });\n\n return {\n activeNodeId,\n readonly: input.readonly,\n disabledActions,\n shell,\n };\n};","v":"CvXFPKk41LwaMNG9PbvSvUBXQD2jfTy9g8pQvcku2zwkaHo9P/BzveDENb01xV49ADO7PRpiGDwJDxY9RB9lvJ3iATwMdxy9An2zPLwriz2CRVY9PYv1O3VoeTytDTG8q+W8PVv3YT3NDp48xPLuPJZxWL1swS49EunXO+2BSzyRRDU8B0Qgvbw8xb3irh+9XYgAvZBLHL29Csq8Iv0GvcRdZDz8B+Q76rcZvQz/grwml7Q9Hlo4PB5F1D3mWaw8ETduPeLVtb3koXk8eOhWO1bh7zxwJCy99Q+4PbyKZT0aoQK9IVJPvA0cKTyNkBS95WNTvLmsrDzwJfK8w0hYPQeqGT3eLDe9h0FgvcPmwD3Byes7IKgIPeaZ7TxD39Q7lqX1vIW1Ub1buNu8KjTwPP8ZjTt6t129h6ARvYGNdj0Fhpy8gwo+vU76lD0eq1i87CJDPYYAgLySka67dd2wOzae4rwasR89d4YSPbSNm7s0nhE9T3H2PH5QgL0LrjM8g5nwvM3gxTwheCU9kLGHvDEF2DxTBg29MrCOPByyIb1khGo8LiXlPDS89TxOAm685QXeOoEsULxY+Ue9ZABSPfRRGr3/RMu8uS0WPDUhJb2e0as7ew+2vIqJAbvEhCU9FuQJvZbLAr2uU7K85lFFPUot6zwGmR49NVxZvG+GuzzUpGU8Ts1+veoBH71VWC270QgoPUum2zzd4CI9AyduPJU3F71G8Fi8FD4OPbqt47u1k5W79V1HPMjTGr2Vi6+8JC6HvHUoLr3dAjE9feWJvUQTyLyNczA6RMd1vEpm5zzdFYo8qwhtPRtiCT2FHfC8z5FLO85wzry8Y+28GtZYPP55WD1YwzU7M4sgvbQbET0Gye+81p27vFw5bzxYOCw9l2kcvAMXBrrNj1q9q0aIvXBjobyUwJa7dFQqvI4cJL2McqI8F5CkvLlRmTz2Gym9A0R8ufiAmr2DuaI9XEIOPej59rrnjjS9tigwPHdX3rqS6cA8r9vGu+Injjwxuju8dVhzvY+yWbx6xZ+8eam8vW589zg9A1K8aGPwPNk0ar0QOma7MLjCuzCFpTyY25g8itmhvYfE/Tsv+8G8he8bPeAGV72J/Yu8ftGpPYWH9rzeWzG66m1eO1NdqLyzfZU8Szf/O0yojLwQUu2826zyu9IXVLySwOa8nVp3PeGnzTzmvkc9tt5XPda1tLw9Bo084HWtvBo+1DwuJRI7LcBDvQgZHj1fPYE8OixSvD/10jzb/sU8eBDYPZph0buPfwg9ZW6XPEJ4ibxzsr88QOJ3vMpf4LwYKfS7pfByvJhinbwBseA7HRkgPP3eCr1HHb08xDPrO17uWT3tLmI9w41tvZtTJjweIfk8LN8CvNt3lrzlWzG7/lQVvfm9BD1mWAO97yPcu7F3Vr3oTu67aE99PIxBvruTfT88/7ppvZ+WkTxGiNg8AQgwPQ5tNzyHYEA8GcB+PLPFzbx0wOa8tuOkvJ66kb1egkw7/nlMPPmV1jtux129Tdy1Ox/AnrtQXVY8YRW8PCs9ODzRVRm91tw1PX9mSrsTUl09BszAvNUvhzyQQsM8cCBHvVmBvbpltEy9z6FSPJ/OCj3yDT89ewrpPAkrtDvBdkE82tdpvO4IkLw+vk08gDmNvPJnOb0HKGQ8RPb1vIro1TwQ1AK9a5YOvPI3Aj0J5tI79+bRO1KKHDr1irC84lttvUZYST2b/vy67GCOvIQKYj03O6i8/WDWulCVcLyfKhK9mLU4PUZe6Dm5klM7xyNLvMglYL1TpiM8DysKvdopn7ynPiG7HptAPTUaPT18/yC9tQcePVPCpDxeHUs8CT/WPKXqLr2QsvO8xI1hPWH90zyVFYK90dwEPFKEAjxS23a8fTypPO1Y6TwGzBc9cBKQucmK0LvfWeI8ciolPHGwgrwIJlk8T1Wru5g7EzwAtqo8DvIkPYL/iTrDc3g9pP
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapLocalStore.ts","s":1,"e":60,"m":1778395128227.066,"t":"import \"server-only\";\n\nimport path from \"path\";\nimport { promises as fs } from \"fs\";\nimport { getDocumentsBaseDir, getLegacyMindmapsBaseDir } from \"@/lib/server/local-paths\";\n\nexport function resolveMindmapFileName(mindmapId: string) {\n if (mindmapId === \"legacy\" || mindmapId.startsWith(\"legacy-\")) {\n return \"mindmap.json\";\n }\n return `mindmap-${mindmapId}.json`;\n}\n\nasync function ensureDir(dir: string) {\n await fs.mkdir(dir, { recursive: true });\n}\n\nasync function ensureIndexFile(folder: string, title = \"无标题\") {\n const indexFile = path.join(folder, \"index.md\");\n try {\n await fs.access(indexFile);\n } catch {\n await fs.writeFile(indexFile, `# ${title}\\n`, \"utf8\");\n }\n}\n\nasync function tryReadJson(file: string) {\n try {\n const content = await fs.readFile(file, \"utf8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nexport type ReadMindmapResult =\n | { ok: true; data: any; source: \"preferred\" | \"legacy\" }\n | { ok: false; data: null; source: null };\n\nexport async function readMindmapLocal(docId: string, mindmapId: string): Promise<ReadMindmapResult> {\n const preferredBaseDir = getDocumentsBaseDir();\n const legacyBaseDir = getLegacyMindmapsBaseDir();\n const preferredFolder = path.join(preferredBaseDir, docId);\n const preferredFile = path.join(preferredFolder, resolveMindmapFileName(mindmapId));\n const preferredLegacy = path.join(preferredFolder, \"mindmap.json\");\n const legacyDirFile =\n path.basename(preferredFile) === \"mindmap.json\"\n ? path.join(legacyBaseDir, docId, \"mindmap.json\")\n : null;\n\n const data =\n (await tryReadJson(preferredFile)) ??\n (await tryReadJson(preferredLegacy)) ??\n (legacyDirFile ? await tryReadJson(legacyDirFile) : null);\n\n if (data) return { ok: true, data, source: \"preferred\" };\n return { ok: false, data: null, source: null };\n}\n\nexport async function writeMindmapLocal(","v":"c40cPZJErTxXQv695KCkvfeyMj0pV2e9C1vNvKjRq7vicD0830ZMvTZ72bwX9uU8Ffr0PflM2Tx6l4S8MJz0uytfnbw7px+9KzbKPP2VqLulXt47RKyhO3IJkj3/pH28v5a+Pb5RET0xEig9Ecm4uykntb2vy5M99C46PKNGlzxnsLo8iDIavFLIE72Ossu7wh3UvA2JDr0N1Dm8js99Ov+6SL06RjC7Adu0u0umnrzcG2Q9f+9Zvc0YWD1u7Os8BWWZPfTeRb3jGRs8D4aYvP8qXzz6HWU8RjCxPXeyHT0Lbpi6ytm5O0aCTDxqOU08f3MbPRI0Wj2i/Wg8mCW1PSpuPT1QdS29EJl3vX1TrD3jacc7H9d9uWoGUD0u9pw7qCLhPEChlL0fAW29OoMOPWOGlrwQyIm9yyTmvLgkSD0/VpS9I8efPKFf1rpJd7I7i4gVPT6jbLyMjTK8qrUAOxJ4obxmj1g90qiVPDRXIb1nC0886WKAvItOk70X29k7inwHvfgImjzf2pI8sElHvU/6ojyxg7Y6o5EZvDPWET1RyDI8xfjHOlhXUT07Gl48d4M0PNFGBb1ZlQY95NEnPTnJJL32daG7djksPbrYUL0gSDA8NWi1O/ysl7xuO2c9zdSNPD8/k711wKW8oMorPWGmhD0egg49bhqLvCXRzzy8vQ09B5lWvWicWb3cHuG7AM/+vPH9+DzZMKQ9xdi1u43qg7y+3pW86ZJZPC19krytnS89IZrGvG7eprxl0Zk8nmZwvUY8A73gG4M9ZIbHvL0EerzcgcU7cfLmvG8j6zyTSb48aVshPSwyjTzLVGC9suLtPC3xKrpipc28bxLmvKEceT2BjiI977YAvTyAmzydmni8duT4vPU0MT2P9v48qxK8PBWaBz0SrpO9FNfSvF1CTLyUjQE8CrHIu9rMy7x4DUy8c+Qkvdg2Szt1PSy9/9PJPFAs1b0rk0Y9F+jgPLW0RL1M2Sc8f3jROzdZ2byX3EK8uW4QvVNFt7w6O/C8wnIYvexzfTva4Ii8f4atvaeUyLsVCfm89Mo2PXEyvLxp6xY9DlpWPaBPkzi7sNq68gk+vUEZqjqvGju9xbutPCzzAr1dygG6PZHKPU1BuLyUn3o6AMODvIvpxjpuNmC75kSOvBczJzwkPw+9b40WPP8OJD2CkAi9e6LnPMkd9DtSKpg9pNBWPO4mTL3naqg690kbvffYCb2OeO+8EDr3vXRAn7qJAko9PxTCu0PiHzwmjhQ9ZTWcPTGlMD1wxJu809OcvH5PF70Zhaa8i58evKjsSby5NLA7zCRXvIuO17z/QfC7TfaoPF7u4DzrYtU8jI4cPKdocz0jMV47FC9rvTWbLTxHwIi7Lxq7uqwQjb0zpVE8oKfNudii0jxk8uK8gbOgPLdpErtTH469grfZPB9q/bt8CAG8BXkhvf4oRjwF2LA6aypLPbfWLT0l6Qs93FOSPC1Uez0Cn068R8+juBureL22ZJW8VtKvvHnmq7xjlxW97mYzPGUwVbwy7LY7aTiCPEq3g7z6zCS5Bu1uOJoyN7z8iks93CqSvKWdfDzMR2w8lsX3vPCjjLyWU5m9cktmPSZH1Tz925U9y8RFPXoITb3Gqli8F9U5u84MT71rfv48zznju9cQTbzDLA695ICSuhtNAD0WXNM8Ut5tPY9fAz3BWu08wOVjPHd3oLykjZ+9UPg3vW4QAD3oIeW89p7rvCzAKT0TW4m8fF7KugjJPDtAUh+8SMjEPGl3V7xc7Dc9TlEzvUzvar1Y5k+8JofrvLjiibwDggm8Gt82PSZN3TwIMVW9s67ePKqzLj16fiK9tNz6PBf4mLw7eU69iUMDPVFYRz3f2y69Fvi3PLtkB73E5MA6Zpg7O4yjiTwkOIs7mpqiPIn0lDvfN4Y8nB3pPKgcobzCzjA98PSNvB+1pLtimhs9eKsoPS0t4rt0cUY8zX4cPJbp2DrYNkG9jO40PFFPwLo
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapLocalStore.ts","s":49,"e":73,"m":1778395128227.066,"t":": null;\n\n const data =\n (await tryReadJson(preferredFile)) ??\n (await tryReadJson(preferredLegacy)) ??\n (legacyDirFile ? await tryReadJson(legacyDirFile) : null);\n\n if (data) return { ok: true, data, source: \"preferred\" };\n return { ok: false, data: null, source: null };\n}\n\nexport async function writeMindmapLocal(\n docId: string,\n mindmapId: string,\n data: unknown,\n docTitle: string,\n) {\n const folder = path.join(getDocumentsBaseDir(), docId);\n const file = path.join(folder, resolveMindmapFileName(mindmapId));\n await ensureDir(folder);\n await ensureIndexFile(folder, docTitle || \"无标题\");\n await fs.writeFile(file, JSON.stringify(data ?? { data: { text: \"中心主题\" }, children: [] }, null, 2), \"utf8\");\n return { folder, file };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapOps.ts","s":1,"e":60,"m":1776252513515.9155,"t":"import \"server-only\";\n\nexport type NodeRef = {\n kind: \"pdf\" | \"docx\" | \"pptx\" | \"url\";\n assetId?: string;\n fileUrl?: string;\n page?: number; // 1-based\n slide?: number; // 1-based\n title?: string;\n snippet?: string;\n};\n\nexport type MindmapNodeData = {\n uid?: string;\n text?: string;\n hyperlink?: string;\n note?: string;\n refs?: NodeRef[];\n [k: string]: unknown;\n};\n\nexport type MindmapTreeNode = {\n data: MindmapNodeData;\n children?: MindmapTreeNode[];\n [k: string]: unknown;\n};\n\nexport type MindmapOp =\n | {\n op: \"addChild\";\n parentUid: string;\n node: { uid?: string; text: string; hyperlink?: string; refs?: NodeRef[]; note?: string };\n }\n | {\n op: \"addSiblingAfter\";\n targetUid: string;\n node: { uid?: string; text: string; hyperlink?: string; refs?: NodeRef[]; note?: string };\n }\n | { op: \"updateText\"; uid: string; text: string }\n | { op: \"setHyperlink\"; uid: string; hyperlink: string | null }\n | { op: \"setRefs\"; uid: string; refs: NodeRef[] }\n | { op: \"appendNote\"; uid: string; markdown: string }\n | { op: \"deleteNode\"; uid: string };\n\nexport type MindmapOpErrorKind = \"rejected\" | \"failed\";\n\nconst createUid = () => {\n const anyCrypto = globalThis.crypto as unknown as { randomUUID?: () => string } | undefined;\n if (anyCrypto?.randomUUID) return anyCrypto.randomUUID();\n return Math.random().toString(36).slice(2);\n};\n\nexport const ensureMindmapUids = (root: MindmapTreeNode) => {\n const walk = (node: MindmapTreeNode) => {\n if (!node.data) node.data = {};\n if (!node.data.uid) node.data.uid = createUid();\n if (typeof node.data.text !== \"string\") node.data.text = String(node.data.text ?? \"新节点\");\n if (!Array.isArray(node.children)) node.children = [];\n node.children.forEach(walk);\n };","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapOps.ts","s":49,"e":108,"m":1776252513515.9155,"t":"if (anyCrypto?.randomUUID) return anyCrypto.randomUUID();\n return Math.random().toString(36).slice(2);\n};\n\nexport const ensureMindmapUids = (root: MindmapTreeNode) => {\n const walk = (node: MindmapTreeNode) => {\n if (!node.data) node.data = {};\n if (!node.data.uid) node.data.uid = createUid();\n if (typeof node.data.text !== \"string\") node.data.text = String(node.data.text ?? \"新节点\");\n if (!Array.isArray(node.children)) node.children = [];\n node.children.forEach(walk);\n };\n walk(root);\n return root;\n};\n\ntype Indexed = {\n node: MindmapTreeNode;\n parent: MindmapTreeNode | null;\n index: number;\n};\n\nconst buildIndex = (root: MindmapTreeNode) => {\n const map = new Map<string, Indexed>();\n const walk = (node: MindmapTreeNode, parent: MindmapTreeNode | null) => {\n const uid = String(node?.data?.uid || \"\");\n if (uid) map.set(uid, { node, parent, index: -1 });\n const children = Array.isArray(node.children) ? node.children : [];\n children.forEach((child, idx) => {\n const cuid = String(child?.data?.uid || \"\");\n if (cuid) map.set(cuid, { node: child, parent: node, index: idx });\n walk(child, node);\n });\n };\n walk(root, null);\n return map;\n};\n\nconst safeUrlOrNull = (value: unknown) => {\n const s = typeof value === \"string\" ? value.trim() : \"\";\n if (!s) return null;\n try {\n const u = new URL(s);\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") return null;\n return u.toString();\n } catch {\n return null;\n }\n};\n\nexport const classifyMindmapOpErrors = (errors: string[]): MindmapOpErrorKind | null => {\n if (!Array.isArray(errors) || errors.length === 0) return null;\n const rejectedPatterns = [\n \"无效 op\",\n \"找不到\",\n \"不能删除根节点\",\n \"不支持的 op\",\n ];\n const rejectedOnly = errors.every((error) =>\n rejectedPatterns.some((pattern) => String(error || \"\").includes(pattern)),","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapOps.ts","s":97,"e":156,"m":1776252513515.9155,"t":"};\n\nexport const classifyMindmapOpErrors = (errors: string[]): MindmapOpErrorKind | null => {\n if (!Array.isArray(errors) || errors.length === 0) return null;\n const rejectedPatterns = [\n \"无效 op\",\n \"找不到\",\n \"不能删除根节点\",\n \"不支持的 op\",\n ];\n const rejectedOnly = errors.every((error) =>\n rejectedPatterns.some((pattern) => String(error || \"\").includes(pattern)),\n );\n return rejectedOnly ? \"rejected\" : \"failed\";\n};\n\nexport const applyMindmapOps = (\n raw: unknown,\n ops: MindmapOp[],\n): { data: MindmapTreeNode; applied: number; errors: string[] } => {\n const root = (raw && typeof raw === \"object\" ? (raw as MindmapTreeNode) : null) ?? {\n data: { text: \"中心主题\" },\n children: [],\n };\n ensureMindmapUids(root);\n\n const errors: string[] = [];\n let applied = 0;\n\n for (const op of ops) {\n ensureMindmapUids(root);\n const index = buildIndex(root);\n\n if (!op || typeof op !== \"object\" || !(\"op\" in op)) {\n errors.push(\"无效 op\");\n continue;\n }\n\n if (op.op === \"addChild\") {\n const parent = index.get(op.parentUid)?.node ?? null;\n if (!parent) {\n errors.push(`addChild: 找不到 parentUid=${op.parentUid}`);\n continue;\n }\n if (!Array.isArray(parent.children)) parent.children = [];\n const uid = op.node.uid || createUid();\n parent.children.push({\n data: {\n uid,\n text: String(op.node.text ?? \"新节点\"),\n ...(op.node.note ? { note: String(op.node.note) } : {}),\n ...(op.node.refs ? { refs: op.node.refs } : {}),\n ...(op.node.hyperlink ? { hyperlink: safeUrlOrNull(op.node.hyperlink) ?? undefined } : {}),\n },\n children: [],\n });\n applied += 1;\n continue;\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapOps.ts","s":145,"e":204,"m":1776252513515.9155,"t":"uid,\n text: String(op.node.text ?? \"新节点\"),\n ...(op.node.note ? { note: String(op.node.note) } : {}),\n ...(op.node.refs ? { refs: op.node.refs } : {}),\n ...(op.node.hyperlink ? { hyperlink: safeUrlOrNull(op.node.hyperlink) ?? undefined } : {}),\n },\n children: [],\n });\n applied += 1;\n continue;\n }\n\n if (op.op === \"addSiblingAfter\") {\n const hit = index.get(op.targetUid);\n if (!hit?.parent) {\n errors.push(`addSiblingAfter: 找不到 targetUid=${op.targetUid} 或无父节点(不能对根节点加同级)`);\n continue;\n }\n if (!Array.isArray(hit.parent.children)) hit.parent.children = [];\n const uid = op.node.uid || createUid();\n const insertAt = Math.max(0, Math.min(hit.parent.children.length, hit.index + 1));\n hit.parent.children.splice(insertAt, 0, {\n data: {\n uid,\n text: String(op.node.text ?? \"新节点\"),\n ...(op.node.note ? { note: String(op.node.note) } : {}),\n ...(op.node.refs ? { refs: op.node.refs } : {}),\n ...(op.node.hyperlink ? { hyperlink: safeUrlOrNull(op.node.hyperlink) ?? undefined } : {}),\n },\n children: [],\n });\n applied += 1;\n continue;\n }\n\n if (op.op === \"updateText\") {\n const hit = index.get(op.uid)?.node ?? null;\n if (!hit) {\n errors.push(`updateText: 找不到 uid=${op.uid}`);\n continue;\n }\n hit.data = hit.data || {};\n hit.data.text = String(op.text ?? \"\");\n applied += 1;\n continue;\n }\n\n if (op.op === \"setHyperlink\") {\n const hit = index.get(op.uid)?.node ?? null;\n if (!hit) {\n errors.push(`setHyperlink: 找不到 uid=${op.uid}`);\n continue;\n }\n hit.data = hit.data || {};\n const url = safeUrlOrNull(op.hyperlink);\n if (!url) {\n delete (hit.data as any).hyperlink;\n } else {\n hit.data.hyperlink = url;\n }","v":"7HkTPX3UNjwVZQG+/snBvYDVnD16/DC9SK87OuTLaD1yUb48NMC5vZf6PjxbXqM865iAPa16jDucrMo8TKVTvQXrK7yyzB864AECPFBrfzyEdag82OjaPPmaq7ywTGW9KbR/PepgST1uqPw7B1Ftu07yZL2FniY8guOmPCuCorvgUdu7eDWuOu4aw73VYWy7g4MKPVeuuTss5pg7DjzRPDByYzxeti68PAkTPcEjmL1Dgqs88S72vIw5uT0nVxI9VOXuPQqXKL080jC9Kwb7u3isqzz8ap+9WxatPY4SPT3H2uG86EChvCGJNT0dL726YubqPKwjqD0IfJO8SzvGPEEJgD05Z+a8LbVFvRrlKj0zvSC89PpxOVeSBz0niuU8/6Q5vIy7F7sjeg+9PJ4OPeHD4LzdneC8BFZHvTjEmj3DvAG8dwhpvCgaiT3h1X086Nr7PBkvFr1eoUu8XLCYu7fjsL1BZKY8hlYaPV5Ai7yy6Tu970eVPGlVc72fPuO8eKf0vE335zrB4Ga8LFXvvDioV7yg04e9ic8Lug6yvrwLSxu8/vjDPeNhrTxFQ5M6o72DvC1jLb0JPB29tnfaPFMzn7vJPgu9OzgnPZ/pnbxUOaI9yY2TOtFPT72MGIW7VvfuvHPdBT3Tv2c71KsVPX8/cz3BVXK89AxIvC5ymjy/SRU8OndQvdxjDL2UdVy8WDKFOVAhizp5oVk7Cd1PPVFqLL3/XSm9ktBKvbQ5Ir2vbhk7XH0rvH4DJ709I2G97Kf/PFb9JL3k6kw9vke2OXaVTL2iBMi8gDTIvHkvPbwnBla8ANKoPO7NhLsUxEC6QjcvPRqQFLz73VQ8N+afu6LsErzXdps8zJRyvZGs6zvaBpK7ao0kvX/Kf7yOYV095yamO1WdjDyGS3m9MmtjvElz/zwzNbS8m3zTOwBV0TxisRc9xYbjOifU2zpiC967tGCxvG4Su73ikYI9Aa/+O/ZWwLwfyrS7TqRhvE988DtIZ/Y8di+MvAjnI70o+ka9ST/qOiaJiDzqixy9PudzvZzb5zysADO8QS7BPC/tK72VNMy7gaBsu5szerpBMV+9urJCvT6A4jzAzE+9lAPSPWBCq7za9B09K2tnPa/WzbxF4Ms8Gp8HPV+Z17uLM1G91KbQPDOJHL15n5S9GeQRO1N50zyLh9u8MJ0HPTHeozs0Wx89u+UyPcg8RTxdscY8mbdQOyc1lLzIJtq8qq3FvbiDmjzPdAq9i+InvLG8ED0tNE49iOOXPUSzB73TcgA90IP5PBGhBzxG7J08omApvZK0LrwYIka95nXGPM/jIrxjXOK8SllPPWHzijyfpUw8psLTPD2osj1Ox7k8qmSwvOiJgry2Fik7GmFDPOP+Jb2xN568VKsavfPOJz2Vz2K84MBCvfScIruTqa2743BKvDwmcDzuk4Q8ghHiOzJyijoThei7FFeHPEwlxzxl3Vs8bBoLPbo/Orxknoe9wZdCPK4SvLwvKvo7pb9CvT3yXD2tJq68fSvWO1ZfyLxyo6I87zpLPDDq17vPPvi8S78OuufBCru1q5U9a1lUPSdWVjy5hSg8OE00PANrNb2J8IK9XJCxu4YFTz2s4Yg9aOoVPUbaCjzzgGK9V85xPP7nprzvtrU7gfomvd1mBr2xCUI8V0lAvab8kDzejHq9gNEHPS1xAT0UJ2C7LSEaPOaxujwnMwi9U7hZvTrICD3ADT27u1G9vEejED2HIuU7pTkoPCcWJ7xBR447nrcBPQpyGT1JvRo99LNgvX/z7Txoc+U8jWp/u6UTGD3Z/ik9M8KtPcxc0TzoMs278zwgOrXrHbwhTnM8pfqAPDx+ZLwZkto6yunlPBmFjTzvR/s7EffFPAch7rz0J8u8D43HPOypPrx0M5s8ts7EPJ7eqLuJdhy8QMprPWvWyjwod8
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapOps.ts","s":193,"e":252,"m":1776252513515.9155,"t":"const hit = index.get(op.uid)?.node ?? null;\n if (!hit) {\n errors.push(`setHyperlink: 找不到 uid=${op.uid}`);\n continue;\n }\n hit.data = hit.data || {};\n const url = safeUrlOrNull(op.hyperlink);\n if (!url) {\n delete (hit.data as any).hyperlink;\n } else {\n hit.data.hyperlink = url;\n }\n applied += 1;\n continue;\n }\n\n if (op.op === \"setRefs\") {\n const hit = index.get(op.uid)?.node ?? null;\n if (!hit) {\n errors.push(`setRefs: 找不到 uid=${op.uid}`);\n continue;\n }\n hit.data = hit.data || {};\n hit.data.refs = Array.isArray(op.refs) ? op.refs : [];\n applied += 1;\n continue;\n }\n\n if (op.op === \"appendNote\") {\n const hit = index.get(op.uid)?.node ?? null;\n if (!hit) {\n errors.push(`appendNote: 找不到 uid=${op.uid}`);\n continue;\n }\n hit.data = hit.data || {};\n const prev = typeof hit.data.note === \"string\" ? hit.data.note : \"\";\n const next = String(op.markdown ?? \"\");\n hit.data.note = prev ? `${prev}\\n\\n${next}` : next;\n applied += 1;\n continue;\n }\n\n if (op.op === \"deleteNode\") {\n const hit = index.get(op.uid);\n if (!hit) {\n errors.push(`deleteNode: 找不到 uid=${op.uid}`);\n continue;\n }\n if (!hit.parent) {\n errors.push(\"deleteNode: 不能删除根节点\");\n continue;\n }\n if (!Array.isArray(hit.parent.children)) hit.parent.children = [];\n hit.parent.children = hit.parent.children.filter((c) => String(c?.data?.uid || \"\") !== op.uid);\n applied += 1;\n continue;\n }\n\n errors.push(`不支持的 op: ${(op as any).op}`);\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapOps.ts","s":241,"e":257,"m":1776252513515.9155,"t":"if (!hit.parent) {\n errors.push(\"deleteNode: 不能删除根节点\");\n continue;\n }\n if (!Array.isArray(hit.parent.children)) hit.parent.children = [];\n hit.parent.children = hit.parent.children.filter((c) => String(c?.data?.uid || \"\") !== op.uid);\n applied += 1;\n continue;\n }\n\n errors.push(`不支持的 op: ${(op as any).op}`);\n }\n\n ensureMindmapUids(root);\n return { data: root, applied, errors };\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/mindmapRouteMeta.ts","s":1,"e":57,"m":1776156450198.092,"t":"import { randomUUID } from \"crypto\";\n\nexport type MindmapRouteMeta = {\n requestId: string;\n traceId: string;\n workspaceId: string | null;\n documentId: string;\n pageId: string;\n mindmapId: string;\n attachmentId: string;\n ownerUserId: string;\n source: \"convex\";\n};\n\nfunction readHeaderValue(headerList: Headers, ...candidates: string[]): string | null {\n for (const candidate of candidates) {\n const value = headerList.get(candidate);\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction makeFallbackId(prefix: string): string {\n return `${prefix}_${randomUUID()}`;\n}\n\nexport function buildMindmapRouteMeta(\n request: Request,\n input: {\n workspaceId?: string | null;\n documentId: string;\n mindmapId: string;\n ownerUserId: string;\n },\n): MindmapRouteMeta {\n const requestId =\n readHeaderValue(request.headers, \"x-request-id\", \"x-mnote-request-id\") ??\n makeFallbackId(\"req\");\n const traceId =\n readHeaderValue(request.headers, \"x-trace-id\", \"x-mnote-trace-id\", \"x-request-id\") ??\n makeFallbackId(\"trace\");\n\n return {\n requestId,\n traceId,\n workspaceId: input.workspaceId?.trim() || null,\n documentId: input.documentId,\n pageId: input.documentId,\n mindmapId: input.mindmapId,\n attachmentId: input.mindmapId,\n ownerUserId: input.ownerUserId,\n source: \"convex\",\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.test.ts","s":1,"e":60,"m":1778497754330.9927,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n SIMPLE_MIND_MAP_BRIDGE_EVENTS,\n SIMPLE_MIND_MAP_REQUIRED_PLUGINS,\n buildSimpleMindMapOptions,\n createFallbackMindmapAdapterProjection,\n createSafeMindmapCommandExecutor,\n defaultSimpleMindMapPluginNames,\n} from \"./simple-mind-map-bridge\";\n\ndescribe(\"simple-mind-map bridge contract\", () => {\n it(\"登记 Phase 6 第一阶段必需插件和事件\", () => {\n expect(SIMPLE_MIND_MAP_REQUIRED_PLUGINS).toEqual([\n \"Drag\",\n \"KeyboardNavigation\",\n \"Export\",\n \"Select\",\n \"AssociativeLine\",\n \"Search\",\n \"OuterFrame\",\n ]);\n expect(defaultSimpleMindMapPluginNames()).toEqual(\n expect.arrayContaining([\"Scrollbar\", \"MiniMap\", \"Painter\", \"Formula\"]),\n );\n expect(defaultSimpleMindMapPluginNames()).not.toContain(\"RichText\");\n expect(SIMPLE_MIND_MAP_BRIDGE_EVENTS).toEqual([\n \"data_change\",\n \"view_data_change\",\n \"node_active\",\n \"back_forward\",\n \"scale\",\n \"translate\",\n ]);\n });\n\n it(\"从 adapter projection 构建 simple-mind-map 初始化参数\", () => {\n const projection = createFallbackMindmapAdapterProjection({\n mindmapId: \"mind_1\",\n root: { data: { text: \"KMIND\" }, children: [] },\n kernelRevision: 7,\n });\n const options = buildSimpleMindMapOptions({\n el: {} as HTMLElement,\n projection: {\n ...projection,\n theme: { template: \"classic4\" },\n themeConfig: { root: { fillColor: \"#c62828\" } },\n view: { state: { scale: 0.8, x: 1, y: 2 }, transform: { scaleX: 0.8, scaleY: 0.8 } },\n },\n });\n\n expect(options.data).toEqual({ data: { text: \"KMIND\" }, children: [] });\n expect(options.layout).toBe(\"logicalStructure\");\n expect(options.theme).toBe(\"classic4\");\n expect(options.themeConfig).toEqual({ root: { fillColor: \"#c62828\" } });\n expect(options.viewData).toEqual({ state: { scale: 0.8, x: 1, y: 2 }, transform: { scaleX: 0.8, scaleY: 0.8 } });\n });\n\n it(\"fallback projection 默认使用 KMind 风格主题与右向逻辑结构\", () => {\n const projection = createFallbackMindmapAdapterProjection({","v":"1hnSPNaA6jxfyx2+AD2ovWCKkD3wfha9DnbWvF+hUz0YzX08yx8/vefFnLzeahM9DOcHPYqVrbyyL8i85AO4vNwNfDwWxSW9KBhPPZDiyju+f5O8qhgDveDm1bprMqy8Ea8tPT19cT2GP9C85jBBPYf+BL2ICjw8zoG3PV3X0jy4S5c8Ltq1vEUeZr0+Z9a81pPyuzdngDyqM8q8YvYYvFqQ5Lv4g6a8T4QrvN27ubwIi4c9kg6RPJuMXj1S/LA7V94zPQGUr7wHPhW8eXYMOplVCT1MVlG74WInPpWvWD03mAq9tqAKvKwXPj1ME+S7rAy2vJ4o5Tx83A+94YqePRUXnD0Q6QW99yCAvSAfaj19dmi9jDDpPH6zzTwFxzQ8I3MfvMNaVL0So4+9n9FmvJQxbbxDFxK9vMpBvOy6HD3dXD29DnyJu9akWj05Eh88f0zuPMOnIruTHgI8vDxsujdgLb0dpq49gYTyPAcZpLzSCdm8pMF2vPA8Pb1d0yi9DTscvSqQG7z/eZS7h/SNvOZadzwhRPs7UQh/vOVuJ707VxO9S3m0Pe1Virx23AW8o2CEvJWyDr1fA2G8zqblPNSH7rxHGgy9OZ1SO4HbYb0QHK08QdE0uQgJy7xsD+I85PMgvF0I87uFSGc8k/cYPQXQJj0rSro87lukvKivijvEJzA8XXtjveRyVbvZoTY8V34KvWkb5DtWXFI9JI6GPVuOULyQfjC9BEG7PNM4Pj1ltek8LgeFPE/L6bxX+zG9mZwvuV//Pr0RsH89QC0XvXxmybzGYRW6JF5BvUCJXj1L/Rc8aryuPCDNCTycPoy8gxjwPA2cQjym1V48OoeRPGqBTD15dna8iB89vfEqLj1gI2G8s1mQvT4qeTy8AtI8R35jOwvYgD073ju9QiiUvP1iRzz1Jh08nGwfvSom0bx2Nk+7yQIEvYon2jyKilg7AvlCPPm4Sr0x3tw8OwyrO/lAiL02tXO8lxWTvICEAL0xv6I7CgCuvPYODz1/I3G9NO2WvRXZAb1gswi81padvQCNBD0xqr+8mvnkPLRLqLxLzaG79FXlOwvyNbw/S6E8c4WMvR6NBDy8fnu9uq0zPb/dNL1sR8Y8v8xlPaxH37t5jLs8hNNCPSTSmrzpuMo8QG/iPFcZ97yET2O9Rxg+vNw5/DzYRNe85WQKPYrutjs9goo8cQkxO1bDYzyNBbo8lojGO+9Doznxie+8ZJ4+vQp9kzzAvDY96LvePMn0Az3jgpe7kWUcPVY0r7vJXec6BqhaPGTn7bqfdiU72WvXu28+gL0kF/G8p8bvPE+z8rxdERs9CTIBPT2o3btB2De8SvUpPXHyPz1gbzw88h1cvUu4JTzpjzm9SYxTO2a1HL0Sugk9NgGyvIYZLz1jc/k7Z+lhvTIOQb23sUc8Hd1fPOwj+ru7vB08kA6nvPR9Mj2Bo7S8HQtEPbjqIj0hDvm7jOQ2O1R++zsU2Di9xKp5vAKaqL0/Xj+9NQMQvXAkCD0Z0cC8BHMCvIAjKb2oFDw7K5LRvIN3qDzZ54e8chgAu2SVDb2Gg2U9yC84PK3FGjxzSnE8csnau0aKrTvRC9q8C/Ptu9uBKz35Yrs9PtCHPW7dg7wZ1Ea9AX/6PJw8Bby1/uu7qidHvfqvVL2Geq69cub0vDOBQzzqqDu9iB/ePDsuIT3F5zA9BMNUOkT4mryBD9W848HHvE
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.test.ts","s":49,"e":108,"m":1778497754330.9927,"t":"},\n });\n\n expect(options.data).toEqual({ data: { text: \"KMIND\" }, children: [] });\n expect(options.layout).toBe(\"logicalStructure\");\n expect(options.theme).toBe(\"classic4\");\n expect(options.themeConfig).toEqual({ root: { fillColor: \"#c62828\" } });\n expect(options.viewData).toEqual({ state: { scale: 0.8, x: 1, y: 2 }, transform: { scaleX: 0.8, scaleY: 0.8 } });\n });\n\n it(\"fallback projection 默认使用 KMind 风格主题与右向逻辑结构\", () => {\n const projection = createFallbackMindmapAdapterProjection({\n mindmapId: \"mind_1\",\n root: { data: { text: \"KMIND\" }, children: [] },\n });\n\n expect(projection.layout).toBe(\"logicalStructure\");\n expect(projection.theme).toBe(\"default\");\n expect(projection.themeConfig).toMatchObject({\n lineStyle: \"curve\",\n root: {\n fillColor: \"#e25563\",\n color: \"#ffffff\",\n fontWeight: \"bold\",\n },\n second: {\n fillColor: \"#4f7df3\",\n color: \"#ffffff\",\n },\n node: {\n color: \"#315aa9\",\n },\n generalizationLineColor: \"#ef6a5b\",\n });\n });\n\n it(\"保留 runtimeOptions 中的 fit 设置,避免初始导图被裁切\", () => {\n const projection = createFallbackMindmapAdapterProjection({\n mindmapId: \"mind_1\",\n root: { data: { text: \"KMIND\" }, children: [] },\n kernelRevision: 7,\n });\n\n expect(\n buildSimpleMindMapOptions({\n el: {} as HTMLElement,\n projection,\n }).fit,\n ).toBe(true);\n expect(\n buildSimpleMindMapOptions({\n el: {} as HTMLElement,\n projection,\n runtimeOptions: { fit: false },\n }).fit,\n ).toBe(false);\n });\n\n it(\"忽略无效 viewData,避免 simple-mind-map 读取 viewData.state 时崩溃\", () => {\n const projection = createFallbackMindmapAdapterProjection({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.test.ts","s":97,"e":136,"m":1778497754330.9927,"t":").toBe(true);\n expect(\n buildSimpleMindMapOptions({\n el: {} as HTMLElement,\n projection,\n runtimeOptions: { fit: false },\n }).fit,\n ).toBe(false);\n });\n\n it(\"忽略无效 viewData,避免 simple-mind-map 读取 viewData.state 时崩溃\", () => {\n const projection = createFallbackMindmapAdapterProjection({\n mindmapId: \"mind_1\",\n root: { data: { text: \"KMIND\" }, children: [] },\n kernelRevision: 7,\n });\n const options = buildSimpleMindMapOptions({\n el: {} as HTMLElement,\n projection: { ...projection, view: {} },\n });\n\n expect(options.viewData).toBeNull();\n });\n\n it(\"安全命令包装只允许受控 runtime command\", () => {\n const calls: unknown[][] = [];\n const exec = createSafeMindmapCommandExecutor({\n execCommand: (...args) => calls.push(args),\n });\n\n expect(exec(\"INSERT_CHILD_NODE\", \"node_1\")).toMatchObject({ ok: true });\n expect(exec(\"SAVE_FULL_BLOB\", { data: {} })).toEqual({\n ok: false,\n command: \"SAVE_FULL_BLOB\",\n error: \"unsupported_command\",\n });\n expect(calls).toEqual([[\"INSERT_CHILD_NODE\", \"node_1\"]]);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":1,"e":60,"m":1778649500089.8625,"t":"import {\n canonicalizeMindmapData,\n createDefaultMindmapThemeConfig,\n DEFAULT_MINDMAP_LAYOUT,\n DEFAULT_MINDMAP_THEME,\n defaultMindmapData,\n type MindMapData,\n} from \"./mindmap-projection\";\n\nexport type MindmapAdapterProjection = {\n schema: \"mnote.mindmap.simple_mind_map_scene.v1\";\n runtime: \"simple-mind-map\" | string;\n root: unknown;\n layout?: unknown;\n theme?: unknown;\n themeConfig?: unknown;\n view?: unknown;\n config?: unknown;\n compatPayload?: unknown;\n kernelRevision: number;\n};\n\nexport type SimpleMindMapInstance = {\n execCommand?: (command: string, ...args: unknown[]) => unknown;\n destroy?: () => void;\n getData?: (withConfig?: boolean) => unknown;\n getLayout?: () => unknown;\n getTheme?: () => unknown;\n getThemeConfig?: (prop?: unknown) => unknown;\n on?: (event: string, handler: (...args: unknown[]) => void) => void;\n off?: (event: string, handler: (...args: unknown[]) => void) => void;\n setData?: (data: unknown) => void;\n setLayout?: (layout: unknown, notRender?: boolean) => void;\n setMode?: (mode: \"edit\" | \"readonly\") => void;\n setTheme?: (theme: unknown, notRender?: boolean) => void;\n setThemeConfig?: (config: Record<string, unknown>, notRender?: boolean) => void;\n updateData?: (data: unknown) => void;\n updateConfig?: (config?: Record<string, unknown>) => void;\n view?: {\n scale?: number;\n enlarge?: () => void;\n narrow?: () => void;\n getTransformData?: () => unknown;\n setScale?: (scale: number, cx: number, cy: number) => void;\n fit?: () => void;\n };\n renderer?: {\n setRootNodeCenter?: () => void;\n textEdit?: {\n hideEditTextBox?: () => void;\n isShowTextEdit?: () => boolean;\n };\n clearActiveNodeList?: () => void;\n addNodeToActiveList?: (node: unknown, skipBeforeEvent?: boolean) => void;\n emitNodeActiveEvent?: (node?: unknown, activeNodeList?: unknown[]) => void;\n findNodeByUid?: (uid: string) => unknown;\n activeNodeList?: unknown[];\n lastActiveNodeList?: unknown[];\n root?: unknown;\n renderTree?: { _node?: unknown };","v":"NWyEPBVbFz2EecG9FTfRvbpjCj2ILAK9GXSlvCTR5DyF5ZY7J7oUvRLdYb2BAj49jaDYPSidtzm3FDQ9REY7vQK++roRYIi9dT9rO4O6Hj0ufyW85WR4vHn1zT1CdGO9xHznPHJ/qjtC0qA8lO+tuxTyHr2Ev4U9fo5qPXdCET3xLxm8xX0RPBRhYb0JzpO8bedkPHpaxrzZMyo9iFPuPCBdF7xZXQe9naEMvT7+F73QIRs8XEwyPOgdtD0h0cm8KBuEPP4rkL1v+R09L/9mvW92kz25ULY8nhPkPTlWODxX71a7Os0dvVtZiT3ILzG8IkZnvJ6phD1BKqo6XXqwPZMeGTzkvZy8YcKavdypsT1I8s281S2bPOIGyDy5Mbu7G4CwPL2ZPrv4Wlq9hsYePZzotDxNtDS9a4rHvDveKj1wqB+9SQEtPNgTNT2w8EO8014HPcxkOTx/r+W7BMsevHYXIr2r81A98w0CPSDINb0PYbi8N8Atu2yGP70GegW85Q5IvUpDMD1tzRE89ZWPvGYXmzvVO+C84Z7bO+HqKr0F4Vm8Dc9iPTp2lbzn4EU7tI+2PMOk8LyvCH287L3/u5ZST71E7Zk8WwyUPJk7ZL35qog8KkQ5PLN/Tz0Da4I9piviu6riMb3MZxg98b50uh68Mz0RV0M8Sjqmu1AhczsT3xY93wyYvXgwO709wEa8sUW1PLQ0szzIECM9zJpfPY1a2ryAtX28fGQmPZYMBD25ysw87YR8vGshxrwlTbq8gLRnPMmaFb201qk9wdgivYF5QL3DaNU8RUDZvKdPYT3HpH28QJGGPRaRRj30wpy89k2KPPU3wDxuud68XcoaveSfQz1uLa27NE4GvR1gOD1VBOc8HGehvdnnIT3gojM7DdJKu9uhHT1Hg/e8lYuKuxCadzxmiAm8m5BwvHZkQjxmaoQ80jiku3QSxTzp1g+8zWrWPLz+Nr2Fpas83fW9u8arOLzFddM8/35ovEd+h7wwzO88LYUovWdvwjzUXnu9ENJNvXO5gLsrBsu8k+2uvQsaMTuzASm9ld2BPNMuXryg7WS83aURPEedg7zf1wQ9J2wdvRql/jpe1cW8taVLPYCjPL3MJjo8eXMoPZiCCTxgDLA86ELKPMVSF71107s52qsCPR2TBr11pXS9IWUivaWHI7w6nY+8dwZ9PX930zzF/4M9zMbxPE0GBDwtCAw9DEp7PMHaOrzuIwO9WB8+vXq+3Tw9cbE87oYfvFDnUr2lzcE8HhuHPTbNh7wDdnM8FrvMO77EyLyMKVU8VRiuvLfd8rzeYzK8//3iuaVd57xxy2o9ONDbPLPN0rxONKc8NA26PAgoYz0Bo9A8x+kAvU9FPDtzpca80V2SvDbyIzxJEmQ9v1ALPV5Jbzyv7Qe8MkCNvA6l7bwmx3I7x+S8PIuKCTzOV1Q8gYjfvKPB7jsBFNK8qMvtPOdVwTw8sRY9X/HqPNcuczuWOmq99znpvP3kdr1HZku9v1swvdFbfDzuzaM8ec6kulkKtry7chO9QUlYvVRd1ztqIwi8hrX6PPj99zuHI4I8AAxUu2y1trqheUi8dPvoO8JC4TuXVKs6dnAuPd6FCj1pv449nR0kPWYqMLwLRVY8+Y7BPAZHtLyLj5A7Wh2XvDPsOr0rDNO8d25MvZxxVT3oUgW9KUe9PC4SDj1AFJ28np8GPWLZD73NeTq9+hBAvTwYOj18ke08r/IAvHzNrD3WkaW6wveMPLpvl7v0buW82kVFPY6DtDr1wzk8LB/xvESXUb0uoYm8SJhHvSqKcDxHCP+6ms2kuzaAFT2vpUa9Nr4fPRBax7pHGGu87xi1vMkTi7zOCiO9wvsTPeYaCbxO
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":49,"e":108,"m":1778649500089.8625,"t":"textEdit?: {\n hideEditTextBox?: () => void;\n isShowTextEdit?: () => boolean;\n };\n clearActiveNodeList?: () => void;\n addNodeToActiveList?: (node: unknown, skipBeforeEvent?: boolean) => void;\n emitNodeActiveEvent?: (node?: unknown, activeNodeList?: unknown[]) => void;\n findNodeByUid?: (uid: string) => unknown;\n activeNodeList?: unknown[];\n lastActiveNodeList?: unknown[];\n root?: unknown;\n renderTree?: { _node?: unknown };\n };\n};\n\nexport type SimpleMindMapCtor = new (options: Record<string, unknown>) => SimpleMindMapInstance;\n\nexport type SimpleMindMapRuntime = {\n MindMap: SimpleMindMapCtor;\n registeredPlugins: string[];\n};\n\nexport type SimpleMindMapBridgeEventName =\n | \"data_change\"\n | \"view_data_change\"\n | \"node_active\"\n | \"back_forward\"\n | \"scale\"\n | \"translate\";\n\nexport type SimpleMindMapBridgeEvent = {\n type: SimpleMindMapBridgeEventName;\n args: unknown[];\n snapshot?: unknown;\n kernelRevision: number;\n};\n\nexport type SimpleMindMapBridge = {\n instance: SimpleMindMapInstance;\n execCommand: (command: string, ...args: unknown[]) => SimpleMindMapSafeCommandResult;\n getSnapshot: () => unknown;\n refreshProjection?: (reason?: string) => Promise<void>;\n destroy: () => void;\n};\n\nexport type SimpleMindMapSafeCommandResult =\n | { ok: true; command: string; result: unknown }\n | { ok: false; command: string; error: \"unsupported_command\" | \"runtime_unavailable\" | \"command_failed\" };\n\nexport const SIMPLE_MIND_MAP_REQUIRED_PLUGINS = [\n \"Drag\",\n \"KeyboardNavigation\",\n \"Export\",\n \"Select\",\n \"AssociativeLine\",\n \"Search\",\n \"OuterFrame\",\n] as const;\n\nexport const SIMPLE_MIND_MAP_OPTIONAL_PLUGINS = [","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":97,"e":156,"m":1778649500089.8625,"t":"export const SIMPLE_MIND_MAP_REQUIRED_PLUGINS = [\n \"Drag\",\n \"KeyboardNavigation\",\n \"Export\",\n \"Select\",\n \"AssociativeLine\",\n \"Search\",\n \"OuterFrame\",\n] as const;\n\nexport const SIMPLE_MIND_MAP_OPTIONAL_PLUGINS = [\n // RichText 会把纯文本节点转成 HTML 字符串;Phase 6.1 先保护 kernel 文本语义。\n \"Scrollbar\",\n \"MiniMap\",\n \"Painter\",\n \"Formula\",\n] as const;\n\nexport const SIMPLE_MIND_MAP_BRIDGE_EVENTS: SimpleMindMapBridgeEventName[] = [\n \"data_change\",\n \"view_data_change\",\n \"node_active\",\n \"back_forward\",\n \"scale\",\n \"translate\",\n];\n\nexport const SIMPLE_MIND_MAP_SAFE_COMMANDS = new Set([\n \"BACK\",\n \"FORWARD\",\n \"INSERT_NODE\",\n \"INSERT_CHILD_NODE\",\n \"REMOVE_NODE\",\n \"DELETE_NODE\",\n \"ADD_GENERALIZATION\",\n \"ADD_OUTER_FRAME\",\n \"SET_NOTATION\",\n]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst readString = (value: unknown, fallback: string): string => {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n if (isRecord(value)) {\n const template = value.template;\n if (typeof template === \"string\" && template.trim()) return template.trim();\n }\n return fallback;\n};\n\nconst readRecord = (value: unknown): Record<string, unknown> => {\n if (isRecord(value)) return value;\n return {};\n};\n\nconst readThemeConfig = (value: unknown): Record<string, unknown> => {\n if (!isRecord(value) || Object.keys(value).length === 0) return createDefaultMindmapThemeConfig();\n return value;","v":"s2MYPSNz6DtTTPa9RPP6vSr2hDyWUoq98jpwvfbt9zzNebo5Igk6vQV5bb1ERw09qWlrPccCIbz7gko9N0NivDftKTxlk9y8hWKTvOXxiz2n6Pc8o9ETvAfXhLvc7Sa9ifCCPd9coTyr2Y48qFIJPTvP7bxslVU9wbzIPH1TAzpPVwe8nfbuux8kzL1rnES9hm9Fu2Kr6zumSFg8lSqCvMzlLblWExC8YqAIvZupPbs1oMY9QrymvE55zT1O6xW6/imRPdMQtr3VmJg8BbkiPGZ3Bj1J5WG9u/OWPYxuIT0U9su8lT46umwy4zwPvBi9/RTavC9Isj2CBFW9ZRpKPUjtVD2cYwy9aBwlvThQ5D0Qk/+8WFwHPLe5uDy3vSQ9MYssvYR4ory9nIC90+9kPNQUvjvCgGC9qZgovBokyTxEDB+9sSQjvEkTVD3xRu08p6u+POQDTrxEF388IBvrPPhhEr3DhaA8x02NPI2ljrz9+0c8D8qZPAWKGr3WoHm8VKpdvPwGPz3Ijn47u4MZvfl6Gj0/bjq9xzn1PPxFJ73ksoU772kYPVg1RT0wFxC8Wyaqu7GDi7xPz/a7uCZiPU0El732T8+8T0VSPLuOBr1BESE9rre+vBQpjLxljVM7NpcPvDQsEL2vRqa7O4SBPWIfgjxDaDg8TyAzu8XCDz0c7dQ8PNRsvYX7TL2SpyA85/C0PEDNfDxxpSE9nysVPax0Fr3wMSG8e3KFPDBaqzym+N842v6pvPZ8UryIZwe9mHUCPPSzg73ok3s9o4I1vT9U07yAs0K8BE2pOx1czTxXZ5Q7N99oPTXUljz6AgS9laBaubgUvLw8WAq9o7kkPBabyzwGhoo8uikpvbZHmzz2ad674xIOvY5DqTteZks9JBJxPOoRTjtX0L+9/x42vT1Q5jz+wPW7Es6jO542Ir0f25I8rV6rucd4Z7x4D/W8qaesvLdfcb0JU5w9Waf8PI+OqrxriIY8ig6vPCROnLyY1jY9Wa3FvHR71Tx2cFa88JEHvXcWsTspK6i8a+C1vTIEmjyoss06zCgmPB8gzLyv1Ji8sHmKvHO0LTzwPQi8liWXvRs8A73IuRS9fqKEPeHvU72iI6W7UpY3PZuUvLzJJeE6QOmWPNpwTrxmveQ7Uzw6vF+Rqby4nxC9TGwlPeNiqTzZc069//s7PYQcgjwgm/08C2r4PCFOETwIa8Y8v68sPPJwcrwiQ/e8yTAfvQ3v4Tz0vk481qOqOwiIazz5jRw9weeaPeUj7zsV5109ACxoPH9jkbzbo1A8qvzGvDBlNb2+xLK7SgSnvL3x0ryF14w8Sk5PPF1ynzoZzBs9Lt2HPHrSeD1Bmt48uLVnvR38A7sEJpG8QT8fPOEBxLz04wY866vRvHTDAz1ysh2917Jtu1VLFr2qA6E6smSyPNvyQ70x8788owfrvB2dSzzLD0662hwdPSSSfTzi5Cy7Mm0wPb8e9Lw5//+8OQcxvZGEir1hO728kVEOvAz4EbyJolS97MYJPLKv5rzZwFK8w4SBO/8vpLsBMxS9+IDUPOZqbrvXPzs9mVqrPJy4CD3pEhA8nlQVvVUM3bw3uk29k7qHPK8NHDwbtz89K+waPatZFzx9s+W7NGCRPPjsIDp9oI48MtV+vNqVXL3e93+7hCgIvIDqqjyJgx+9HM/tOl65VT0Q7gG8RkmBPD7DlLsKZn28y2AyvcZsMj27zhA88KZxu9dGoz11CkO9c54JPRjx5DsfcYS94xQ9PIa0rbphahk8QMnZvGRoWr2OIoY8/3U9u+bTWju7hLk7CAcEPTDqBzw+aNS8mYMLPd624DzuIe87l9yjPGEbg72JLTy93II2Pcc8nDwMLES9adcCPIukBDz8qsS8D82Lu5AVoTx3l6489mEjvKLcizyX0UE8YbHqPNx3qDsubyU9EP0evHdjJzz3L488+LmPPe98Qzv9rhI9LkXSOzCLlzwdtkW94UTXPHAYGjv2pki9bw8QvUmpD7z0S6U8APtWvBfrTT00AX09f+JmvaWnsTwWtl46u9ZyOoykSLzwLvE8eKyLPAWxuTxm6DA9JqhevGWJvr1ehiw7/EztvHooID0FJWQ8Kl0pvNSuJD3fc508oAwRvFN9ab2IGSm9NmAkPTa2HTynor27JpCQOyEbjrz82dW86rdXPeZLEjsEmYM8hzHOPFQ9ebzbMDS9k8RPPeYeJDwuY6A9dZ+vPJI7Tz1BneG88tcLvSeHFj2Zf/W8bWUVPEk0tD1hCiY9FLPrOw3p8TsKsgc8ADB4vSr/Kj32dvc7md2FPVZSgLx
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":145,"e":204,"m":1778649500089.8625,"t":"}\n return fallback;\n};\n\nconst readRecord = (value: unknown): Record<string, unknown> => {\n if (isRecord(value)) return value;\n return {};\n};\n\nconst readThemeConfig = (value: unknown): Record<string, unknown> => {\n if (!isRecord(value) || Object.keys(value).length === 0) return createDefaultMindmapThemeConfig();\n return value;\n};\n\nconst readViewData = (value: unknown): Record<string, unknown> | null => {\n if (!isRecord(value) || !isRecord(value.state)) return null;\n return {\n ...value,\n state: value.state,\n transform: isRecord(value.transform) ? value.transform : {},\n };\n};\n\nexport const buildSimpleMindMapOptions = (input: {\n el: HTMLElement;\n projection: MindmapAdapterProjection;\n runtimeOptions?: Record<string, unknown>;\n}): Record<string, unknown> => {\n const root = canonicalizeMindmapData(input.projection.root ?? defaultMindmapData);\n const config = readRecord(input.projection.config);\n const runtimeOptions = readRecord(input.runtimeOptions);\n return {\n ...config,\n ...runtimeOptions,\n el: input.el,\n data: root,\n fit:\n typeof runtimeOptions.fit === \"boolean\"\n ? runtimeOptions.fit\n : typeof config.fit === \"boolean\"\n ? config.fit\n : true,\n layout: readString(input.projection.layout, DEFAULT_MINDMAP_LAYOUT),\n theme: readString(input.projection.theme, DEFAULT_MINDMAP_THEME),\n themeConfig: readThemeConfig(input.projection.themeConfig),\n viewData: readViewData(input.projection.view),\n initRootNodePosition: [\"center\", \"center\"],\n };\n};\n\nconst pluginImporters = {\n Drag: () => import(\"simple-mind-map/src/plugins/Drag.js\"),\n KeyboardNavigation: () => import(\"simple-mind-map/src/plugins/KeyboardNavigation.js\"),\n Export: () => import(\"simple-mind-map/src/plugins/Export.js\"),\n Select: () => import(\"simple-mind-map/src/plugins/Select.js\"),\n AssociativeLine: () => import(\"simple-mind-map/src/plugins/AssociativeLine.js\"),\n Search: () => import(\"simple-mind-map/src/plugins/Search.js\"),\n OuterFrame: () => import(\"simple-mind-map/src/plugins/OuterFrame.js\"),\n Scrollbar: () => import(\"simple-mind-map/src/plugins/Scrollbar.js\"),\n MiniMap: () => import(\"simple-mind-map/src/plugins/MiniMap.js\"),","v":"lxgfPd5B1Txhwe29fZ7pvc/lNz2kz2C9xfEtvNu4BDx8nOk8lVyjvXaIs70nU5U8JjilPeru+DznsTo8Y3r8u2ehRTxp+gG7zepfPXjprLt3yiU9rhsIvC0dpbuD2qG7z0JOPQEc+Ty1+kK8MUVKPSMJ1LyLd/U8P92PPAZjCz2IqoY81EImPCw+zr2ordO81vrhPHbSxrts38A74tcRvNOE8zuhTEK8LYbGvK18SLyhHYM92t7vvDFCBz74UwS8pVwEPSGfab1gtcA8g4giPJz6hz1MZhS9UTCOPcHWKzz3XIK8Y+aGPC6lIT0a49y8tT2xPLPDEj1DYvq8Kw+xPYjpNT1kAzy8boBzvfuGjD2/TQq9KMe/O4iQwzvLJiA80Q0+vAx0Fb3mQz69NYkPPUgooTvhFBi9TgczvRKEZjtGm9y8ZxXlvISynj1BQxM6T1FWPaOWiDu22da765cKPVDKab0yyyY99LK2u4FAkTyhZ448tYvtuwrvh72oQ5c7SFZtvKLfLz2B6BG96OxMvYCoBLueiRs7LJXFOUfIs7ywAbM7QJeuPZPECT143ri75yKiPNc15bzjFE697O8uPb4bB72iUZa9UgknPCTfZ72liIc8zg0vPISYBT15Cro8pgQTvZGPRLxguEC89QY4PdfpizxvDgY9d7+DvK5k6Dwo1TE9VcVQvX2Wab3XFB+6THehPJtXBD0/JjY9KkBUPfs/87xa5eO8Uz4BPeQfxDzITno77zGSPLh58rxzvlS9UTu0PBWQCr0P2SU9fu1hvejFS72W91q6hLPDvDDKuzzTLHk84K/5PJTXKzxG4ou8Ggp6PWB4dbyyVmc8GjIVPWzPSD1/VA29MEMLvZJ+gTwF1x69DayUvOq4OTtgZK48mJdmvEwvmzy1goO92cBsvVgbjDw6Rzc8Zj2Lu4NHRry9ToC7o3MKvcpq3DzKnyO8hQwtPVDvxrtD5Tc9Q+7uPJJCZbynqOK8ALJ/PJK2rjwjE+U8SjhRvbOo4Dyeu0e86BlEvcrOL70cvLS7YEiJvTAGDj2SZ2q8tCK1PLB78bylu0q8P6GUu50D7jwYFMc8DuuUvQvQPbwAp/27XcOMPTLYRb1DefQ8JKYWPaaeRzulUmI81+sKPLgwDb0pq1680t+mu4jeAL0ca4e9Hpm5PIH9tTxeMA+9O8GIPdCwRz1PF589TBsYPenhB7zMa/o8kO0dvetCArzxqyW9D3E0vfFnJTxW4nI7DWmlPPY4RTxHsBE9aHn4PMVlUTyMpI88881KPNnFq7wvDb88fTuyvFfyJ73Y0ho9TxkNO4qPD71tiM87PMr4PGkVjbuQRDY9XBJtPIAzjj3OnEe6j+HKvJbMDzv1L968NBTGvDpdNb2p0ak8zwbtOvTkRj08MVW8KIhSvZYBgLxkzOe6KqTFu8k/o7zordC6hPA2vUbA4zy6bUA959X0PHJRAz3rd+W8GjXePEIRPrw7Eje9007MvB19jb3qBxO9CcNMvWDlQzzMvYK9BfXru4K+Nr39msi7Hr8ZuuWdUrxxOUi9VSR+PIAxdrwNaoA92YW2POC0ojzLFpI688BkvaZNVDsrS9K87AGgO3PdMz20iGw9komOPDSGwbzZyEO8gdB/PERrvry5vQq9x5JFurMhXb3ARbY7KJOwO4qkvbslfvC8a4o
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":193,"e":252,"m":1778649500089.8625,"t":"};\n\nconst pluginImporters = {\n Drag: () => import(\"simple-mind-map/src/plugins/Drag.js\"),\n KeyboardNavigation: () => import(\"simple-mind-map/src/plugins/KeyboardNavigation.js\"),\n Export: () => import(\"simple-mind-map/src/plugins/Export.js\"),\n Select: () => import(\"simple-mind-map/src/plugins/Select.js\"),\n AssociativeLine: () => import(\"simple-mind-map/src/plugins/AssociativeLine.js\"),\n Search: () => import(\"simple-mind-map/src/plugins/Search.js\"),\n OuterFrame: () => import(\"simple-mind-map/src/plugins/OuterFrame.js\"),\n Scrollbar: () => import(\"simple-mind-map/src/plugins/Scrollbar.js\"),\n MiniMap: () => import(\"simple-mind-map/src/plugins/MiniMap.js\"),\n Painter: () => import(\"simple-mind-map/src/plugins/Painter.js\"),\n Formula: () => import(\"simple-mind-map/src/plugins/Formula.js\"),\n} satisfies Record<string, () => Promise<{ default: unknown }>>;\n\nexport type SimpleMindMapPluginName = keyof typeof pluginImporters;\n\nexport const defaultSimpleMindMapPluginNames = (): SimpleMindMapPluginName[] => [\n ...SIMPLE_MIND_MAP_REQUIRED_PLUGINS,\n ...SIMPLE_MIND_MAP_OPTIONAL_PLUGINS,\n];\n\nexport const loadSimpleMindMapRuntime = async (\n pluginNames: SimpleMindMapPluginName[] = defaultSimpleMindMapPluginNames(),\n): Promise<SimpleMindMapRuntime> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"simple_mind_map_browser_required\");\n }\n\n const [{ default: MindMap }, pluginModules] = await Promise.all([\n import(\"simple-mind-map\"),\n Promise.all(pluginNames.map(async (name) => [name, (await pluginImporters[name]()).default] as const)),\n ]);\n\n const MindMapCtor = MindMap as unknown as SimpleMindMapCtor & {\n hasPlugin?: (plugin: unknown) => number;\n usePlugin?: (plugin: unknown) => unknown;\n };\n\n const registeredPlugins: string[] = [];\n pluginModules.forEach(([name, plugin]) => {\n if (!plugin || typeof MindMapCtor.usePlugin !== \"function\") return;\n const registered =\n typeof MindMapCtor.hasPlugin === \"function\" ? MindMapCtor.hasPlugin(plugin) !== -1 : false;\n if (!registered) {\n MindMapCtor.usePlugin(plugin);\n }\n registeredPlugins.push(name);\n });\n\n return {\n MindMap: MindMapCtor,\n registeredPlugins,\n };\n};\n\nexport const createSafeMindmapCommandExecutor =\n (instance: SimpleMindMapInstance) =>\n (command: string, ...args: unknown[]): SimpleMindMapSafeCommandResult => {","v":"LPeuPLvB77vB0tK9Q6LMveq2CT0AJKm9gj2mOxuS5zzmxcs8+zNivR3tur2aRYw8jft7PcpkCT2OOPw8vJ8tvD/tgjqMBP68K4wgPTY6nrvaDHs6qNsPvWlNvTyoGgO99KCePbo7bT0x8eA8CHSePMCps7uGhRc9YJVMPLId3DwYzzU8Mc2vPLVYkL1EsKK9MggFPZmsML0EwLe7zLCGPHU2AT0ldR+9Firtu3PjXL1jZpw9ng0vvNYBzT0kkL86yTyAPZpHrL0XgsA8dKbGvIk4Hz1TfRm9tZqWPdH7Dz27h5I8MfEyOvFI+TxhPJY75RFTPJyzCD1D4ci8JgWxPa3nQj0FmyS8Vi0kvXUQnz33SNs8f5CiPEhlzjxqH228CilSPTCF1bwYo0O9BvfTPAQMXDwwi3W8VSUuvZezuTxgtei8jWigvMu+kD1vCqa8NMNdPY9CjLyPs7W7UXjTPMngjb2scQA9szYKvKRGVLoGcJE8DwazPKHC5bySrwa9Lm+DvAT1RT2OivG8yzUPvWBoBbwo97a8tbyfPO7rFDxv7vg8NLoHPZ9MljwdzJi5tncMPcS5Lr1lgIi8WmiHPJZXv7zOwwK9P/XsPDTm/7yiwqg7iaFVPYS72DzF00c9T47pvD+WL7zSo8u8NtQJPZWFOzwMiCk8v1ffu93uZDwYs3s9KOsuvc3RRr2Tino8leEiPYHhCD2QTog9pFJyPW25GL0LpAe9eWTzPJzjAL1aVPI77zNRutCEn7wzfRm92ByPvPCEkb3gvQ49i5xvvfFbnr2BHMc63Vr9ubKPRDuMOMA7XmXJPHmuVj0K3p+8dljsPOk6IrxQazm8iFJqPaje7rjqOUa9ghkavX+oiD0E/5K8XoWiOI0pfztSITA9tSwOvHOXBj3wCje9OTHbvGjwcDu4I5U8GceQvBrBhTwyuGA8ZFeTvEaZtTxN2v28JjcxPU5eKL1uOls9zQ4jPBITILwtpJS8BZNsvOtbTrwCct08Y2UKvSDYuTwf2we9pCVNvaMsTL2Xew+9qxeJvTCxazy8wQS97KwlPekLJL1SH4a86Q6cvPhUpjxbIne8nhuFvfinRTtQjkG8Pi+PPc5il7yO/Cs80KEkPSyfgLwzTCM8rmzYvBdp4rw04h+9jbTpPP12Or082xS9CuaHO/vmuTzVx2a9NIJfPecWxzxomUk9X3+TPG+w5jr3gH67JvsrvUMBSTs7LVO9UTGFvc5L+zwo4xI8BvAKPOdFrTv5Fwc9vuxvPTNuZTwIzFk88laqO6+xo7wQO0A9P0FtvBTpAb3EsRc8cp7rPOESH71Q0MO8/w8JPTO/KDyuAQg8Y6V1vEK7Xj1XVdU8AXBRvbymw7wzCQQ8qNmTvLe+A730zRM98cmPu9Rnlz0aAeS880adu7aBCr00HmK826UKvVRU1TyqD2c8qMjTvIkOMj0Avkc9TDekPCtos7uun9087MWEPI1TKrsLq1K9
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":241,"e":300,"m":1778649500089.8625,"t":"registeredPlugins.push(name);\n });\n\n return {\n MindMap: MindMapCtor,\n registeredPlugins,\n };\n};\n\nexport const createSafeMindmapCommandExecutor =\n (instance: SimpleMindMapInstance) =>\n (command: string, ...args: unknown[]): SimpleMindMapSafeCommandResult => {\n if (!SIMPLE_MIND_MAP_SAFE_COMMANDS.has(command)) {\n return { ok: false, command, error: \"unsupported_command\" };\n }\n if (typeof instance.execCommand !== \"function\") {\n return { ok: false, command, error: \"runtime_unavailable\" };\n }\n try {\n return { ok: true, command, result: instance.execCommand(command, ...args) };\n } catch {\n return { ok: false, command, error: \"command_failed\" };\n }\n };\n\nexport const attachSimpleMindMapEventListeners = (input: {\n instance: SimpleMindMapInstance;\n projection: MindmapAdapterProjection;\n onEvent?: (event: SimpleMindMapBridgeEvent) => void;\n}): (() => void) => {\n const cleanup: Array<() => void> = [];\n SIMPLE_MIND_MAP_BRIDGE_EVENTS.forEach((eventName) => {\n const handler = (...args: unknown[]) => {\n const snapshot =\n eventName === \"data_change\"\n ? input.instance.getData?.()\n : eventName === \"view_data_change\"\n ? input.instance.getData?.(true) ?? input.instance.getData?.()\n : undefined;\n input.onEvent?.({\n type: eventName,\n args,\n snapshot,\n kernelRevision: input.projection.kernelRevision,\n });\n };\n input.instance.on?.(eventName, handler);\n cleanup.push(() => input.instance.off?.(eventName, handler));\n });\n return () => cleanup.splice(0).forEach((dispose) => dispose());\n};\n\nexport const createSimpleMindMapBridge = async (input: {\n el: HTMLElement;\n projection: MindmapAdapterProjection;\n pluginNames?: SimpleMindMapPluginName[];\n runtimeOptions?: Record<string, unknown>;\n mode?: \"edit\" | \"readonly\";\n onEvent?: (event: SimpleMindMapBridgeEvent) => void;\n}): Promise<SimpleMindMapBridge> => {","v":"RF0pPWQfMjxXM9W9oTXevTrjBT1GyVK9eQN/vOAA1TwL8qk8wyj6vLA5h72oC+Y8x8l8PSrOLz1wLEU9JA2TvJYVFz2cz0+9wsrlPJ52Aj0/EIY9gLEPvTHpKz0JV1K8Gc+cPbzyOT0Ej3C8VHK+OhGi/zoiERw9cLsGPB9+Uj11MZA7bkR1vO4hiL2dpie9sHu/PBoJSL1iAIy8WJwWPIJ3YjxLG0y8AHTUupBr6rzR5049atCIvOXdzD1UdDw9P1BlPW09pr3IOT094gXBvGeTWDwpNw68+8uLPVTdxzwWZ5o8vcPkudBMHT3lDD+9Gxb0u8ugaT0JkE8770+CPXCx6DxbHFi8n58zvY2QqD3NgYI7020YuQ8BrDzKUgy6MFAkPXAH/7zTZAm9Pek9PTIHQ7z73h29Uap+vTEzQj1qRY+8FRCRvAYQiT0/6+q8r7ZBPVf/v7yxMzG8DNw+PcRKDL1tUV09l/eZPL4sS7ueZ9o8HqF0POCHV70dGQ08xRTjvLu8ND0Uv/+66J1cu5DlRjxdwu28LDY3Pe3ACryc4w48aA+ZPXR3Iz1zI0O8+oFaPAr1/bwf3eQ87koKPW7p8byvYRa9jCSCOzviRL1OJTA9psgcPNtdvDuROwM99K0evd/Hg7zxUIu9bQj3PNHWljzTAqY8LAWGvNEy5To4dyE9QOtwvYsGUb2NugE8RPI0PXsjmjxS/oI9Nx5MPVp1Wb1eDyS99VRBPehoCb3hUBe8wFc/vD8k2bwbe4m86UoOvK3aZb0xRnM9yZWJvbzSRb01aHk7mdd2vH5SGDwzFqG74QNAPUeqIz2/Q2i8cN10PN0JMDuShJi8dajqPBkpxTs8nNi8nLnLvUsY+Dy3RcG8LST5vGIPfDxvGHA9yNeTPPnJ7jvt75e9rdyFvaGyrTzraM47HlNPvP/NXbyjeK88/QQwvYXOYby5foG9ZL6oO0Ele71zcE89+iKyPBeQQzwb+zQ84W72OzEAIjzYSiY9hCO1vIXCxzqZukG8ZmovvaOnCrurZbE7cWWZvXuCoTthKLS8tZGAPOuUZ73zV7a8lDoxvPN2rjxJBiE872CYvQD9FzwIX828XP6HPat5srwnG3W7e5e4PdgyV73tXVw8bPoSvHRAprzt+aS7kYnzuk6WQLwMYo29XecVu5UjtruzVEu9hyWcPar5ST1zQko9cLfKPCUI6bs4IuA88JPkvMcZ6bxKHAC9oDOXvYX6Ij2IExc7v7ObvGsAhbzTtRA9M0WSPVx0xzto1xU92nmKvOr0fbwJFow7uLgZvfjUqLzeKFM7q+Cpuw6zHrly4Yg7wPzlu9WrO7w/Bys91u79O0Sohj2lZnM9R0pFvWC9j7sDLIM865riOqC7a7wzWs88Yls6u3FV7jxbDNa8T9EYPG1u6Lww8cm8cJ6YPIjGGTz1vFI8mIvDvAMd6jzRoL08CQ8oPXlnNbzOsRg9Qz8bPWtd4TkifG+9Q74TvT3CB715Rgq9E0ZYPK7YHzy7vze9QRQYPY26wLxeXpK86GbfvEdzmDxc2hy9P6HLPPUpgLwqUVs9ffOsvLW81Dzozs+7iZ3EurS/e7wkZw29qyvpO+VQyTwYAP48qhsMPdIpAzvYnba80a95PM+13rv/atS8fgO9vLnY7ry7owE9kt/cvD58TD0hymm9IQFru6e0ST2hpAK8oi0RPPfxXjoGlUW9GbcovdXKEj149Ds8o6+VuxnDcD3YmAW8ZswOPVrivrzlNlG9dvIDPTTGWTxbqpI8xd1YvcAChb1o2dI79qsSvXgLajsxv+S7p1PYPAXdeTwNZAi9RZ//PM7DDj1mVRG8mA4LPQDP87zmZQy9b6YdPYUuqTyErh+9uG+pPMBbjzt+oY+713Q0Pd9Ycjx49JU7iqZzPN4o+byrLWE5/bMDvN7uuDyDmms8+
|
|||
|
|
{"p":"wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts","s":289,"e":347,"m":1778649500089.8625,"t":"});\n return () => cleanup.splice(0).forEach((dispose) => dispose());\n};\n\nexport const createSimpleMindMapBridge = async (input: {\n el: HTMLElement;\n projection: MindmapAdapterProjection;\n pluginNames?: SimpleMindMapPluginName[];\n runtimeOptions?: Record<string, unknown>;\n mode?: \"edit\" | \"readonly\";\n onEvent?: (event: SimpleMindMapBridgeEvent) => void;\n}): Promise<SimpleMindMapBridge> => {\n const runtime = await loadSimpleMindMapRuntime(input.pluginNames);\n const themeConfig = readThemeConfig(input.projection.themeConfig);\n const options = buildSimpleMindMapOptions({\n el: input.el,\n projection: input.projection,\n runtimeOptions: input.runtimeOptions,\n });\n const instance = new runtime.MindMap(options);\n instance.setThemeConfig?.(themeConfig);\n if (input.mode) instance.setMode?.(input.mode);\n\n const detachEvents = attachSimpleMindMapEventListeners({\n instance,\n projection: input.projection,\n onEvent: input.onEvent,\n });\n const execCommand = createSafeMindmapCommandExecutor(instance);\n\n return {\n instance,\n execCommand,\n getSnapshot: () => instance.getData?.(true) ?? instance.getData?.(),\n destroy: () => {\n instance.renderer?.textEdit?.hideEditTextBox?.();\n detachEvents();\n instance.destroy?.();\n },\n };\n};\n\nexport const createFallbackMindmapAdapterProjection = (input: {\n mindmapId: string;\n root?: MindMapData;\n kernelRevision?: number;\n}): MindmapAdapterProjection => ({\n schema: \"mnote.mindmap.simple_mind_map_scene.v1\",\n runtime: \"simple-mind-map\",\n root: input.root ?? defaultMindmapData,\n layout: DEFAULT_MINDMAP_LAYOUT,\n theme: DEFAULT_MINDMAP_THEME,\n themeConfig: createDefaultMindmapThemeConfig(),\n view: {},\n config: {},\n compatPayload: { source: \"frontend-fallback\", mindmapId: input.mindmapId },\n kernelRevision: input.kernelRevision ?? 1,\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/asset.test.ts","s":1,"e":34,"m":1773495900906.8613,"t":"import { describe, expect, test } from \"vitest\";\nimport type { MediaAsset } from \"@/types/media\";\nimport { isRealFileAsset, parseSupabaseStorageObjectUrl } from \"./asset\";\n\ndescribe(\"file-tree/asset\", () => {\n test(\"parseSupabaseStorageObjectUrl\", () => {\n expect(\n parseSupabaseStorageObjectUrl(\n \"https://xxx.supabase.co/storage/v1/object/public/documents/a/b/c.txt\",\n ),\n ).toEqual({ bucket: \"documents\", path: \"a/b/c.txt\" });\n expect(\n parseSupabaseStorageObjectUrl(\n \"https://xxx.supabase.co/storage/v1/object/sign/documents/a/b/c.txt?token=abc\",\n ),\n ).toEqual({ bucket: \"documents\", path: \"a/b/c.txt\" });\n expect(parseSupabaseStorageObjectUrl(\"/documents/123\")).toBe(null);\n });\n\n test(\"isRealFileAsset\", () => {\n const base = { id: \"1\" } as MediaAsset;\n expect(isRealFileAsset({ ...base, storage_path: \"a/b\", file_url: null } as any)).toBe(true);\n expect(isRealFileAsset({ ...base, storage_path: null, file_url: \"/documents/123\" } as any)).toBe(false);\n expect(\n isRealFileAsset({\n ...base,\n storage_path: null,\n file_url: \"https://xxx.supabase.co/storage/v1/object/sign/documents/a/b/c.txt?token=abc\",\n } as any),\n ).toBe(true);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/asset.ts","s":1,"e":28,"m":1773495900912.8616,"t":"import type { MediaAsset } from \"@/types/media\";\n\nexport function parseSupabaseStorageObjectUrl(\n fileUrl: string,\n): { bucket: string; path: string } | null {\n try {\n const url = new URL(fileUrl);\n const segments = url.pathname.split(\"/\").filter(Boolean);\n const objectIdx = segments.findIndex((seg) => seg === \"object\");\n if (objectIdx === -1 || objectIdx + 2 >= segments.length) return null;\n const mode = segments[objectIdx + 1];\n if (mode !== \"public\" && mode !== \"sign\") return null;\n const bucket = segments[objectIdx + 2];\n const p = segments.slice(objectIdx + 3).join(\"/\");\n return p ? { bucket, path: p } : null;\n } catch {\n return null;\n }\n}\n\nexport function isRealFileAsset(asset: MediaAsset): boolean {\n if (Boolean(asset.storage_path)) return true;\n const url = asset.file_url ?? \"\";\n if (!url.startsWith(\"http\")) return false;\n return parseSupabaseStorageObjectUrl(url) !== null;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/clipboard.test.ts","s":1,"e":58,"m":1778799362804.9617,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n clearFileTreeClipboardPayload,\n decodeFileTreeClipboardPayload,\n encodeFileTreeClipboardPayload,\n inferPasteTargetDocId,\n isTextInputTarget,\n} from \"./clipboard\";\n\ndescribe(\"file-tree clipboard payload\", () => {\n it(\"可编码/解码\", () => {\n const payload = { type: \"mnote-file-tree\" as const, version: 1 as const, action: \"copy\" as const, rowIds: [\"doc:a\", \"asset:x\"] };\n const text = encodeFileTreeClipboardPayload(payload);\n expect(decodeFileTreeClipboardPayload(text)).toEqual(payload);\n const cutPayload = { ...payload, action: \"cut\" as const };\n expect(decodeFileTreeClipboardPayload(encodeFileTreeClipboardPayload(cutPayload))).toEqual(cutPayload);\n expect(\n decodeFileTreeClipboardPayload(\n encodeFileTreeClipboardPayload({ ...payload, action: \"move\" as any }),\n ),\n ).toBeNull();\n expect(decodeFileTreeClipboardPayload(\"not-a-payload\")).toBeNull();\n });\n\n it(\"可清空内存剪贴板\", async () => {\n await clearFileTreeClipboardPayload();\n });\n});\n\ndescribe(\"inferPasteTargetDocId\", () => {\n it(\"focused 为 doc/index/asset 三分支覆盖\", () => {\n const rowById = new Map<string, any>();\n rowById.set(\"asset:x\", { kind: \"asset\", rowId: \"asset:x\", docId: \"d1\", asset: { id: \"x\" } });\n expect(inferPasteTargetDocId({ focusedRowId: \"doc:d2\", rowById, activeDocId: \"active\" })).toBe(\"d2\");\n expect(inferPasteTargetDocId({ focusedRowId: \"index:d3\", rowById, activeDocId: \"active\" })).toBe(\"d3\");\n expect(inferPasteTargetDocId({ focusedRowId: \"asset:x\", rowById, activeDocId: \"active\" })).toBe(\"d1\");\n });\n\n it(\"无 focused 时回退 activeDocId\", () => {\n const rowById = new Map<string, any>();\n expect(inferPasteTargetDocId({ focusedRowId: null, rowById, activeDocId: \"active\" })).toBe(\"active\");\n expect(inferPasteTargetDocId({ focusedRowId: null, rowById, activeDocId: null })).toBeNull();\n });\n});\n\ndescribe(\"isTextInputTarget\", () => {\n it(\"input/textarea/contenteditable 不拦截快捷键\", () => {\n const input = document.createElement(\"input\");\n const textarea = document.createElement(\"textarea\");\n const div = document.createElement(\"div\");\n div.setAttribute(\"contenteditable\", \"true\");\n expect(isTextInputTarget(input)).toBe(true);\n expect(isTextInputTarget(textarea)).toBe(true);\n expect(isTextInputTarget(div)).toBe(true);\n expect(isTextInputTarget(document.createElement(\"button\"))).toBe(false);\n });\n});","v":"GgcAPRzsILr/5hu+K0eUvSCVVD1PJBm9IJQOvTYuXT2Mjlu83rRGvbWEOr1o3cE8HfN4PZ9jl7zH29+8v9JyvSdBNzxZ3y69glJcPYKOrTzXbj+8xAEsvHQNeLwQ5Ge8ZxF/PebfXz3Yd3q8H6xmPX9GM71o0c4821uQPWIfpDw9z1k7jz3YvCI1K71jRyO9FMnMu9czrLz4fV+94eXgPLBi/7zCLaC8mdt1vD2m/7zi8Cg9UsRZPGJGUD0VC+K7l+UXPevPg70rZTS7bI4nvUJHijy73gy756UdPgJTLT3UZp28X2OIu3ovjTwb2xa9vOSfvPmpwTwmJRu9qMGRPf+1nz34cha9ulp8vZuZWT35igS9hwz1POtIVz06Pae7E5RjuzEBNL1dn2G94z3pvCLX3ryEsjC9A+0pu0yrNT1cbgS9cpJtOtRENz3gcPI8ZzmOPMMVVb3hP/Q8DYZMvF3RDr3s+5I9pNhaPTiH7LsOdR48riD5vN8967ztPGa8MLmbvPv6nrwQ0hW8Rrvxu4WI+DxIuxM8cJzGO0OzIroGGZU7V1OkPSyq6jzQSkq7QEV8vMbTH71IJg08cs6OPdJrE73m7s28ILgfPLjESb0uMG48Q9gtvC86Qr3kXrk8EcvQuj5yOryoQQK9qCloPThc1DyJPbU7ICIOvPkZETz+WKM87bNovSPsgbsOfoW8dtH4vKWwoTw5lZE9bn9APRGU6bwJxzq8h2nEPPZv2Dri5iw88CMePO38VL1oCYi8GAEQPLAEEb0y4Uo97OaPu0n79btNweK8zeo4vQQLZj2jxgu9hMpDvMBv+zwYL9+7R7K7PDyHwztPCo07LjYjPQ7hHD19tSy7XtsovWJgpz2gH4O73jgjva0ipjwHPCc9diOmPJzXDD2jGHq9Ob+HvQztSjyAQBG8dS8avaGZnrsAobc8CRzvvP8ZnTs2vtO8+KYevG3YvbzWjM48cFkivADflL3U2pW8C2tjvMB8Mr1Ti7I8ybVuvHJjuroRfoK9FIGXvYk0A73cYRU7UttdvQFDnTxriFm8JhULPUygpbyA2De8yQXiu7VhoTs2owq8c1m8vQozMj1rqle9aEoqPd9dEb22myE9fmSHPVLaRb0Xi8o7WquYPX5OnLpP2CU9y9UUPP4TALwd0Yq9N0JhvBL9Hj0Su/a86BNAPQCwbjzfK6M80ebwO4WClTtqeAS8uMblOnPhnryXTF+9TbB+vUTrTLu0vD498qgSO+OC4zxxh/06lMwlPbFJqzzioS26gh7tutWImrqpKDc8jgasvN9mYr3n9g+9xylKPIoSgbwUivy6oSmePJWU2LxrR7C8eciAPUBxTz1i2nw
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/clipboard.ts","s":1,"e":60,"m":1778799222408.1265,"t":"\"use client\";\n\nimport type { FileTreeRow } from \"./types\";\nimport { parseFileTreeRowId } from \"./types\";\n\nexport type FileTreeClipboardAction = \"copy\" | \"cut\";\n\nexport type FileTreeClipboardPayloadV1 = {\n type: \"mnote-file-tree\";\n version: 1;\n action: FileTreeClipboardAction;\n rowIds: string[];\n};\n\nconst PREFIX = \"mnote-file-tree-clipboard:v1:\";\n\nlet memoryClipboardText: string | null = null;\n\nfunction encodeBase64(text: string): string {\n const bytes = new TextEncoder().encode(text);\n let binary = \"\";\n bytes.forEach((b) => {\n binary += String.fromCharCode(b);\n });\n return btoa(binary);\n}\n\nfunction decodeBase64(base64: string): string {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n}\n\nexport function encodeFileTreeClipboardPayload(payload: FileTreeClipboardPayloadV1): string {\n return `${PREFIX}${encodeBase64(JSON.stringify(payload))}`;\n}\n\nexport function decodeFileTreeClipboardPayload(text: string): FileTreeClipboardPayloadV1 | null {\n if (!text || !text.startsWith(PREFIX)) return null;\n const base64 = text.slice(PREFIX.length);\n try {\n const raw = decodeBase64(base64);\n const parsed = JSON.parse(raw) as Partial<FileTreeClipboardPayloadV1>;\n if (parsed?.type !== \"mnote-file-tree\" || parsed.version !== 1) return null;\n if (parsed.action !== \"copy\" && parsed.action !== \"cut\") return null;\n if (!Array.isArray(parsed.rowIds) || parsed.rowIds.some((id) => typeof id !== \"string\")) return null;\n return parsed as FileTreeClipboardPayloadV1;\n } catch {\n return null;\n }\n}\n\nexport async function writeFileTreeClipboardPayload(payload: FileTreeClipboardPayloadV1): Promise<void> {\n const text = encodeFileTreeClipboardPayload(payload);\n memoryClipboardText = text;\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n try {","v":"ME0hPd8uWjq74+q9vl2vvSvqOz2SVyW9WwW4vJw75rzxNfQ7Nf/5vIRclL28YXY80u2nPU1VbbyBOhe7uQcbvcrjhjv0fHq9i8hQPJ6Znbp59p08eGndvNE+dD2zrUG9NcNtPTS1WT3bEEk8oXxqPUwm6b1R11g8sOe0PPceIj0sxAG8IqV6vIe4Fr1WVQE8jOkou/AvKL3deO+7zQUKPRdBJL0hK7G8azu8vELMpzowU189uwx8veNc0j314Y48zsFePUFYq70UhUc9t8ZdvZIKYj3V0524jNzyPV2t+jvlHUC8JTcrOZ7jIDxpPVy9aiaiPHEByz3mnSg8VN2uPfJSSj2S8ZO8tqGGvbpVnT28bRe8G4Pvu/J6QT0Dxm48etBVPcAj0LzcHaG8AqkAPHZunbzu32e9HgD6vGylhD1sN/m8es0YO33IMLxnNNc8s4MBPbKF2byrzBO9DzLevBOklL07rzI9jeQiPYOiLL36GcU8pGGzO4n2Ur3ONdw8CXNivImGGDzZkB09XXu1vPFHkDvjVDM8tZUzPB2zaTsjc2g8XKUUPdGWFT0PYe67grOCvJnpb7zPO0o8I/lIPcaPgb1HwFu8e6+du9sB/LzpX2S8Iezku9E9s7y7bqo8RggQvEhXV70xM0O8qUIOPQfkiz0pLGw8WnpZu1ebBT2ZHnU8jOe3vWkuMr0Drs68FBUHPbx7mzvFAQY9RNbUPBYMTLwyMf28FKYHPerNH7wihNQ7wSbqvKgpoLzXHVo8KSw3u4+Vsrz80ik98vnpO3e/PrxP2DE8ayDyvOHLLj1l5gq74oV8PV+8Ij0TDwi9L6thPZDoWDy9+ZC81dnsOpzyaz32UgE8EGZcvRQhWT1R/Ni7EpWRuw6u8zyBpjM9kEe3PGKY1TzbBzi9KwOEvVXfyLzhx+Y6WYgJPHCJGDx4D1e6YftXvHOtMTxAanW9T9A9vHEFj73rKOA6B8CRPEtXZr28bD886j6mO7iodb3qSuk8QQrXvEUnR7uhM2C9jD/evFWOnrxJmXq9Ns9Ovf2j/Twquaa8mRwRPddKS728xkq7s58jPQKwlztXqz68TkKavXSnYLyZbCq7MVviPLomIb2nmhc8G/m/PWjpPLxkJLg7IpHsu2qTXb2vOCE7mV1XvaMtibzvCZ29gF/2PCX44DyAvt28ynltPbo/DD1u6xU91MTfPPWZXL1QvMo8Q+OPPFr3EL1Xxa287KYVvf3azjzaLQs96jDgu+8ki7t6W1E9oY+3Peup/Tznwpk7+pUovI6i7jtpcwO7jmH9vJ/rm7z4KW67jZPsvOBI3rzGgBG6ROKoPHAYSbz5/yI9zdMLPXbHdz0ZbC06W/o+vcogKTxT4nS85bUfvWJhY71LqVU90TMdPR1gprwZIvS8DgBgvEgc9LzGYve8k7fMPDCUFTvfCBo9tM5AvWWqPzxKc8G8i2D1PKYcGj3BJtE7YMwnPKSJUTwtgwu9x+zMvI5ee70k/tG8jucNvd3BnrwymTk6faoQPear0zuT3l87kGwHvD8goryG9VU82vFRPVMporxmmGE9o+9LPCeHIzzYsbU6UVW5vCPxM73gtHC9LQFhPDfCPD0+wG09N11SPWN8Db2+QC08MWOpPGlkvbx3+sA7vgL3PESBSL1s48s7WFYZPF+XXT21P9G7kIuFPQ6Rdj0QMZa8/ZatO2ntdLvvfgG9/08ZvUoIMT2gh/I6yFHvvLBVSD0W7EQ8gtO3PAEXJbzfOeG61CHmPDJKazx80hY9PD3LvFAWHb1HWhC8ot4nu9CsSLzPMLm69KEkPEmgIz3Vse+8BSdCPHmmYjuWSB+901ofPCrqzbvUNAy99io/PbVZKz3w9Dq9kHJQunAgBjzHv+q8W3OmvLL6w7pBg3y7B6fkPO6hQ72yJ2081rrLPOPBczspogg9FqO8vG
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/clipboard.ts","s":49,"e":108,"m":1778799222408.1265,"t":"if (!Array.isArray(parsed.rowIds) || parsed.rowIds.some((id) => typeof id !== \"string\")) return null;\n return parsed as FileTreeClipboardPayloadV1;\n } catch {\n return null;\n }\n}\n\nexport async function writeFileTreeClipboardPayload(payload: FileTreeClipboardPayloadV1): Promise<void> {\n const text = encodeFileTreeClipboardPayload(payload);\n memoryClipboardText = text;\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // ignore, fallback to memory\n }\n }\n}\n\nexport async function readFileTreeClipboardPayload(): Promise<FileTreeClipboardPayloadV1 | null> {\n let text: string | null = memoryClipboardText;\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.readText) {\n try {\n text = await navigator.clipboard.readText();\n } catch {\n // ignore, fallback to memory\n }\n }\n if (!text) return null;\n return decodeFileTreeClipboardPayload(text);\n}\n\nexport async function clearFileTreeClipboardPayload(): Promise<void> {\n memoryClipboardText = null;\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(\"\");\n } catch {\n // ignore, memory fallback 已清空\n }\n }\n}\n\nexport function isTextInputTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el) return false;\n if (el.isContentEditable) return true;\n const contentEditable = el.getAttribute?.(\"contenteditable\");\n if (contentEditable && contentEditable.toLowerCase() !== \"false\") {\n return true;\n }\n const tag = el.tagName?.toLowerCase();\n return tag === \"input\" || tag === \"textarea\" || el.getAttribute?.(\"role\") === \"textbox\";\n}\n\nexport function inferPasteTargetDocId({\n focusedRowId,\n rowById,\n activeDocId,\n}: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/clipboard.ts","s":97,"e":128,"m":1778799222408.1265,"t":"if (contentEditable && contentEditable.toLowerCase() !== \"false\") {\n return true;\n }\n const tag = el.tagName?.toLowerCase();\n return tag === \"input\" || tag === \"textarea\" || el.getAttribute?.(\"role\") === \"textbox\";\n}\n\nexport function inferPasteTargetDocId({\n focusedRowId,\n rowById,\n activeDocId,\n}: {\n focusedRowId: string | null;\n rowById: Map<string, FileTreeRow>;\n activeDocId: string | null;\n}): string | null {\n if (focusedRowId) {\n const parsed = parseFileTreeRowId(focusedRowId);\n if (parsed?.kind === \"doc\") return parsed.docId;\n if (parsed?.kind === \"index\") return parsed.docId;\n if (parsed?.kind === \"asset-folder\") {\n const row = rowById.get(focusedRowId);\n return row?.kind === \"asset-folder\" ? row.docId : null;\n }\n if (parsed?.kind === \"asset\") {\n const row = rowById.get(focusedRowId);\n return row?.kind === \"asset\" ? row.docId : null;\n }\n }\n return activeDocId || null;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/delete.test.ts","s":1,"e":60,"m":1773495900933.8618,"t":"import { describe, expect, it } from \"vitest\";\nimport type { FileTreeRow } from \"@/lib/file-tree/types\";\nimport { buildParentById } from \"./dnd\";\nimport { computeFileTreeDeleteTargets } from \"./delete\";\n\nfunction makeDoc(id: string, parent_id: string | null): any {\n return {\n id,\n parent_id,\n title: id,\n access_scope: \"private\",\n icon: null,\n cover: null,\n is_template: false,\n user_id: \"u1\",\n workspace_id: \"w1\",\n created_at: \"\",\n updated_at: \"\",\n children: [],\n };\n}\n\ndescribe(\"computeFileTreeDeleteTargets\", () => {\n it(\"去掉被父级页面覆盖的子页面\", () => {\n const docA = makeDoc(\"A\", null);\n const docB = makeDoc(\"B\", \"A\");\n const rows: FileTreeRow[] = [\n { rowId: \"doc:A\", kind: \"doc\", docId: \"A\", parentDocId: null, node: docA, depth: 0, hasChildren: true, isExpanded: true },\n { rowId: \"index:A\", kind: \"index\", docId: \"A\", parentDocId: \"A\", node: docA, depth: 1 },\n { rowId: \"doc:B\", kind: \"doc\", docId: \"B\", parentDocId: \"A\", node: docB, depth: 1, hasChildren: false, isExpanded: false },\n { rowId: \"index:B\", kind: \"index\", docId: \"B\", parentDocId: \"B\", node: docB, depth: 2 },\n ];\n const parentById = buildParentById([\n { id: \"A\", parentId: null },\n { id: \"B\", parentId: \"A\" },\n ]);\n\n const selectedRowIds = new Set([\"doc:A\", \"doc:B\"]);\n const result = computeFileTreeDeleteTargets({ visibleRows: rows, selectedRowIds, parentById });\n expect(result.docIds).toEqual([\"A\"]);\n });\n\n it(\"选中 index 行等价于选中页面本身(去重)\", () => {\n const docA = makeDoc(\"A\", null);\n const rows: FileTreeRow[] = [\n { rowId: \"doc:A\", kind: \"doc\", docId: \"A\", parentDocId: null, node: docA, depth: 0, hasChildren: false, isExpanded: false },\n { rowId: \"index:A\", kind: \"index\", docId: \"A\", parentDocId: \"A\", node: docA, depth: 1 },\n ];\n const parentById = buildParentById([{ id: \"A\", parentId: null }]);\n const selectedRowIds = new Set([\"doc:A\", \"index:A\"]);\n const result = computeFileTreeDeleteTargets({ visibleRows: rows, selectedRowIds, parentById });\n expect(result.docIds).toEqual([\"A\"]);\n });\n\n it(\"如果页面被删除,则跳过同页面下的附件删除(避免重复/无效操作)\", () => {\n const docA = makeDoc(\"A\", null);\n const rows: FileTreeRow[] = [\n { rowId: \"doc:A\", kind: \"doc\", docId: \"A\", parentDocId: null, node: docA, depth: 0, hasChildren: true, isExpanded: true },\n { rowId: \"index:A\", kind: \"index\", docId: \"A\", parentDocId: \"A\", node: docA, depth: 1 },\n {","v":"CbCGPAsMn7q7XhG+zjDfvQ/NwD0rYRi9lWUgvdNJjDxHpYK8Q8NtvfrmlbwbP5M8DymKPaTZGbwWXlG9uu8svSNZBr3lyHW9Av40PQe4X7xg3RG9wDKMvO5PfLvgcnW7BKkMPY2DMj1tsDs6QvIiPa4l/byitzQ9z53IPe4raj3exxA9vtzEO01CIb3tn/q7hbV8u1MnED2Srw683VsMPdKHlrxEhxk8bmniO0avjr3y2Og8uC+GvKn/ez3hgGO8bJAmuw5GtLxi7IQ7PdYjvb+GJD2GPJa8otIYPv1lWjyH7Cm9gw20vMSSAj0K9y67+dTLvIrPPj1J2yG9HMyePTAsQj0sgUq91+WIvb+VKT03BQK9PGyCPH/skT3H41o8uHayPGT2Y73ORnG9zloFPY8Dt7yjbk69lkYdvFiFCz1Hnvu8iFIxuq11iby9/HM9WxM8PMi3qLya8go9YQ2juxJUyrvkC7s9r7+WPWnevLyeFZm8EZ1Su4Yuv7zAhAG8xODaO8VLVLtXZaY7tCNYvC3Y+DynhQW8LrHIu66tNLzOuKY785CkPaiOgLyhQBW8wcnjvC43Ir3LYyW8CzGWPY3Bjr3ffuy82/o8PPubhr0mkf47kTtwvAZJOb35y7M7mDAVvG3Ph7yckiY8GOEjPchJcj2nJTe8JkfjvJFGpzwGqEM8pehyvb33R7wIViK86nhLveyWkDwP+Zc96GpUPafbPrk6ZQC8uaOuu2ynSrzVkuw7igKnO/rWiL2+U+W8NZMUPa59Kb2Ge5k9zNPQu2J3K709xee7Wz2FvEIViT0yhGu8N7zhOszPW7yqB7G8O1sjPc2ZkTzjjwo8aeHVPGv6ST38Nc878dD9vOczBj0NUjc8fUIzvdUm6Txh8ZG8GU/IPFp4Uz2ypIS9WGQvvXUI7Dq6rVO8Eq88vZTvfDvEGMW6zw3bvE2mKjuEgvS8VHXNPNhldL0+7iQ93rX5uyVxeb0So5684pEAvKaeS72Trgg9GtZuvK6eoLtpwHe9+J0rvdgKTbzcFjq88W2KvQI6ZLoui287ms0svCYewrzREAe7nHgju+GXXjzdfhY8+zWVvYj8vDum/2G9fiFQPZWdBb22fTo9UAuSPbdOD70AqSA8Z7hjPW4vjLyhhes8GXAbvOqYt7ufQaC9cslqvNNXEz0BBIW9oZgRPah1Kj1CUDU8UutEPGJIsjtKhRk9q0YCu7jfj7z7Oy69MgaxvQ4WpDqbRws97FJ2P
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/delete.test.ts","s":49,"e":95,"m":1773495900933.8618,"t":"const parentById = buildParentById([{ id: \"A\", parentId: null }]);\n const selectedRowIds = new Set([\"doc:A\", \"index:A\"]);\n const result = computeFileTreeDeleteTargets({ visibleRows: rows, selectedRowIds, parentById });\n expect(result.docIds).toEqual([\"A\"]);\n });\n\n it(\"如果页面被删除,则跳过同页面下的附件删除(避免重复/无效操作)\", () => {\n const docA = makeDoc(\"A\", null);\n const rows: FileTreeRow[] = [\n { rowId: \"doc:A\", kind: \"doc\", docId: \"A\", parentDocId: null, node: docA, depth: 0, hasChildren: true, isExpanded: true },\n { rowId: \"index:A\", kind: \"index\", docId: \"A\", parentDocId: \"A\", node: docA, depth: 1 },\n {\n rowId: \"asset:1\",\n kind: \"asset\",\n docId: \"A\",\n parentDocId: \"A\",\n asset: {\n id: \"1\",\n workspace_id: \"w1\",\n document_id: \"A\",\n asset_type: \"file\",\n file_url: \"https://example.com/1\",\n thumbnail_url: null,\n bucket: \"b\",\n storage_path: \"p\",\n file_name: \"a.txt\",\n file_size: 1,\n mime_type: \"text/plain\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"\",\n updated_at: \"\",\n },\n depth: 2,\n },\n ];\n const parentById = buildParentById([{ id: \"A\", parentId: null }]);\n const selectedRowIds = new Set([\"doc:A\", \"asset:1\"]);\n const result = computeFileTreeDeleteTargets({ visibleRows: rows, selectedRowIds, parentById });\n expect(result.docIds).toEqual([\"A\"]);\n expect(result.assetIds).toEqual([]);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/delete.ts","s":1,"e":51,"m":1773495900943.2424,"t":"\"use client\";\n\nimport type { FileTreeRow } from \"@/lib/file-tree/types\";\nimport { filterTopLevelDocIds } from \"./dnd\";\n\nexport type FileTreeDeleteTargets = {\n docIds: string[];\n assetIds: string[];\n};\n\nexport function computeFileTreeDeleteTargets(args: {\n visibleRows: FileTreeRow[];\n selectedRowIds: Set<string>;\n parentById: Map<string, string | null>;\n}): FileTreeDeleteTargets {\n const { visibleRows, selectedRowIds, parentById } = args;\n\n const docCandidates: string[] = [];\n const assetCandidates: string[] = [];\n const assetDocIdByAssetId = new Map<string, string>();\n\n for (const row of visibleRows) {\n if (!selectedRowIds.has(row.rowId)) continue;\n\n if (row.kind === \"doc\" || row.kind === \"index\") {\n docCandidates.push(row.docId);\n continue;\n }\n\n if (row.kind === \"asset\" || row.kind === \"asset-folder\") {\n assetCandidates.push(row.asset.id);\n assetDocIdByAssetId.set(row.asset.id, row.docId);\n }\n }\n\n const docIds = filterTopLevelDocIds(docCandidates, parentById);\n const docIdSet = new Set(docIds);\n\n const seenAssets = new Set<string>();\n const assetIds: string[] = [];\n for (const assetId of assetCandidates) {\n if (seenAssets.has(assetId)) continue;\n seenAssets.add(assetId);\n const docId = assetDocIdByAssetId.get(assetId);\n if (docId && docIdSet.has(docId)) continue;\n assetIds.push(assetId);\n }\n\n return { docIds, assetIds };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/dnd.test.ts","s":1,"e":47,"m":1773495900948.8618,"t":"import { describe, expect, test } from \"vitest\";\nimport type { FileTreeRow } from \"@/lib/file-tree/types\";\nimport { buildParentById, filterTopLevelDocIds, inferDropTargetDocId, isInvalidDocDrop } from \"./dnd\";\n\ndescribe(\"file-tree/dnd\", () => {\n test(\"inferDropTargetDocId\", () => {\n const docRow: FileTreeRow = {\n kind: \"doc\",\n rowId: \"doc:a\",\n docId: \"a\",\n parentDocId: null,\n depth: 0,\n isExpanded: false,\n hasChildren: false,\n node: {} as any,\n };\n const indexRow: FileTreeRow = { kind: \"index\", rowId: \"index:a\", docId: \"a\", parentDocId: \"a\", depth: 1, node: {} as any };\n const assetRow: FileTreeRow = { kind: \"asset\", rowId: \"asset:x\", docId: \"a\", parentDocId: \"a\", depth: 1, asset: {} as any };\n expect(inferDropTargetDocId(docRow)).toBe(\"a\");\n expect(inferDropTargetDocId(indexRow)).toBe(\"a\");\n expect(inferDropTargetDocId(assetRow)).toBe(\"a\");\n expect(inferDropTargetDocId(null)).toBe(null);\n });\n\n test(\"filterTopLevelDocIds removes descendants\", () => {\n const parentById = buildParentById([\n { id: \"a\", parentId: null },\n { id: \"b\", parentId: \"a\" },\n { id: \"c\", parentId: \"b\" },\n { id: \"d\", parentId: null },\n ]);\n expect(filterTopLevelDocIds([\"b\", \"a\", \"c\", \"d\"], parentById)).toEqual([\"a\", \"d\"]);\n expect(filterTopLevelDocIds([\"b\", \"c\"], parentById)).toEqual([\"b\"]);\n });\n\n test(\"isInvalidDocDrop blocks self/descendant\", () => {\n const parentById = buildParentById([\n { id: \"a\", parentId: null },\n { id: \"b\", parentId: \"a\" },\n { id: \"c\", parentId: \"b\" },\n ]);\n expect(isInvalidDocDrop({ sourceDocIds: [\"a\"], targetParentId: \"a\", parentById })).toBe(true);\n expect(isInvalidDocDrop({ sourceDocIds: [\"a\"], targetParentId: \"b\", parentById })).toBe(true);\n expect(isInvalidDocDrop({ sourceDocIds: [\"b\"], targetParentId: \"a\", parentById })).toBe(false);\n });\n});","v":"tCg4PH9YUjyI+BW+9ertveFrfz3UTC+9Se0lvZSvJz19tRm95PIWveUsRb27h5E91c9cPcfsqTr7bjm9dQhlvbk+Pbz6CBu9zpdwPfAWyrvtqu28AAy2vLxW4LwTCqe6jldUPf4lIz0A7Ee7vMo6PX/Y5Lz59L48FPLIPYcMXj0fQys9K558uz7OkL3nNuK898UgvBL2V7u7nUM84woNPNmFbLyf4y2894GAvFIjaL0qol49dMA1u4VGtT08NZw6FUd1PATz17yMjJ88fukLvd+ftjyelRG71DYPPgW60Tz1dBe9hnbcvOPb3jxeBgq90K0SvWDx7jyJEm+9dLCDPQV05jzf/1K9dZ9FvVZZPT0sFCO88sauPCTASz32X4K8Hvg1PWb9Rb1iqUu9s3imO2GupryXjdu8U3TOvBW62zw4+re8/ZCduxP74zt1b3A9amTXPGB7hLxfENA8HZZkO3TnUrz5DcQ95BtWPS5snjrq+oC8WrxtvFioOr1IE4+8pS7avBqEnjzHvAc8C8GtvNVF0zwFgyo7J6/xO/oQJrzbOuY7XjRBPXgMybpZPoY8mBulvIpHSr19xQC9LbaBPb2wdb0SgVe95eqJvCVYbL17q6O7+bE6vJ4A7rru3ws8bb1CPPocnLvBh428KWkVPcqUJz0nHNc6NoHxvHs2Bzx3Yg49fyFOvZ08LjwjqE88F2myvFk6wTyj45s9kPVMPVKTXbzs/cC7CkKdPBv9b7wMJqO6w6NNvIHwC73AkMo7asiSPFewVr34NGE9+vSGvLKEW726Qwk7quTzvDRriT1ezYG7ldHPPAYDoDxfO9Q6bJXFPNiFwTxN/sm7ncfjPCFNRD1HKVW7REsKvRElHj0moYs5k3r2vASZ5TwUkUU8ynwrPYq4bz291iu9ln1YvT7mi7vnEpG8SZmAvSpL/DuYMS882qU8vZEZATwbM4u8NVb9PBWtPr1wHD89MX0rvJ7SAb102Aa9GS5DvH1th72t2pQ8+Sw5vBDpt7zldo29/21sveznarwPE6y8sLQ4vTEPvToiBkO8YXEEO28F47wfft67CLyRvCyn1TyB5NM8u35uvR9TnDzip6u9He5HPXf3t7y87DQ9tCufPeujbL1npZk8jAGDPVYSnjgwHag8/FNjOg/RfLyn1mu9/j3Yu4TX4zwOxXq9ugZTPQ1BHj0grIA8mlE9PIkPAj0EcI08iLHZu8HtfbwfnWe9kuKmvcsxSzxHCBM9T5ujPKgTsjwSXSy8g07YPConAjpXIpy8O5CXu2D7Fbv/ZTU8qYJAvIwZAL2yIT+8dkgPvFITaruq0pA8u467PKpclLz8p6O7Y01cPahahj2RAoY7KdT1vN8csDv05Ua9PIHSvIhrOL3yqao8GSJavC7C+DqqbQg8vzt+vZVUD72q3Yw8Eumyu/HQvryZsRm7tNk4vac9crz9jue747CLPNnRPz0TIc675SG7PLIaGD1Zp/28HaAgvAjpzL3o9jq9gc4gvUKEGzyG/U+7Z9gDPWnjRbujC7U8ScHfvG9OizxtHpK8eJmaPDqUCL2gHmk9xe9WPCHTEj2h0k882XSNOylH8ruaLhW9KO/GvEVO8DwSh8M99859PYsdGL2s7VS9hlrdPE9iwrzOiOi8XlcEvUXMjr0+Q729qDcove14PrrModK79wd+vJQxnjy+ku48cDJ+PPHbvrykQWC8MIMMvankgzyqdcQ8l4RVvBmMVj19p5s8/OZwPYtITrvOkL66PXeYPXXfKj1D/bi80HDZvPry8Lypcy28DrGxvIwNoDzmcl68RsF0PcWykjrPA9i8dux4PEktNz0/CiS9kBupOWcqE7z1Zx69jj1QPSFrSz2/9TO9GGXbO87ZZDz2EmU8XV0EPYnuAD2nCRM9yVgQPWmYYry4d5m8o1FcPQ56oDxehog7XfOQvDp30bwnD80
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/dnd.ts","s":1,"e":60,"m":1773495900954.862,"t":"import type { FileTreeRow } from \"@/lib/file-tree/types\";\n\nexport function inferDropTargetDocId(targetRow: FileTreeRow | null): string | null {\n if (!targetRow) return null;\n return targetRow.docId ?? null;\n}\n\nexport type ParentEdge = { id: string; parentId: string | null };\n\nexport function buildParentById(edges: ParentEdge[]): Map<string, string | null> {\n const map = new Map<string, string | null>();\n edges.forEach((edge) => {\n map.set(edge.id, edge.parentId ?? null);\n });\n return map;\n}\n\nexport function isAncestorOf(\n ancestorId: string,\n nodeId: string,\n parentById: Map<string, string | null>,\n): boolean {\n let current: string | null | undefined = nodeId;\n while (current) {\n const parent = parentById.get(current);\n if (!parent) return false;\n if (parent === ancestorId) return true;\n current = parent;\n }\n return false;\n}\n\nexport function filterTopLevelDocIds(\n docIds: string[],\n parentById: Map<string, string | null>,\n): string[] {\n const unique = Array.from(new Set(docIds));\n const selected = new Set(unique);\n return unique.filter((id) => {\n let current: string | null | undefined = id;\n while (current) {\n const parent = parentById.get(current);\n if (!parent) return true;\n if (selected.has(parent)) return false;\n current = parent;\n }\n return true;\n });\n}\n\nexport function isInvalidDocDrop(args: {\n sourceDocIds: string[];\n targetParentId: string | null;\n parentById: Map<string, string | null>;\n}): boolean {\n const { sourceDocIds, targetParentId, parentById } = args;\n if (!targetParentId) return false;\n const sources = new Set(sourceDocIds);\n if (sources.has(targetParentId)) return true;\n for (const sourceId of sources) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/dnd.ts","s":49,"e":66,"m":1773495900954.862,"t":"}\n\nexport function isInvalidDocDrop(args: {\n sourceDocIds: string[];\n targetParentId: string | null;\n parentById: Map<string, string | null>;\n}): boolean {\n const { sourceDocIds, targetParentId, parentById } = args;\n if (!targetParentId) return false;\n const sources = new Set(sourceDocIds);\n if (sources.has(targetParentId)) return true;\n for (const sourceId of sources) {\n if (isAncestorOf(sourceId, targetParentId, parentById)) return true;\n }\n return false;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/naming.test.ts","s":1,"e":22,"m":1773495900962.862,"t":"import { describe, expect, test } from \"vitest\";\nimport { makeUniqueFileName, makeUniqueTitle } from \"./naming\";\n\ndescribe(\"file-tree/naming\", () => {\n test(\"makeUniqueTitle\", () => {\n const existing = new Set<string>([\"无标题\", \"无标题 副本\"]);\n expect(makeUniqueTitle(\"无标题\", existing)).toBe(\"无标题 副本 2\");\n expect(makeUniqueTitle(\"Hello\", existing)).toBe(\"Hello\");\n expect(makeUniqueTitle(\"Hello\", existing)).toBe(\"Hello 副本\");\n });\n\n test(\"makeUniqueFileName keeps extension\", () => {\n const existing = new Set<string>([\"a.txt\", \"a 副本.txt\"]);\n expect(makeUniqueFileName(\"a.txt\", existing)).toBe(\"a 副本 2.txt\");\n expect(makeUniqueFileName(\"图片.png\", existing)).toBe(\"图片.png\");\n expect(makeUniqueFileName(\"图片.png\", existing)).toBe(\"图片 副本.png\");\n expect(makeUniqueFileName(\"无扩展名\", existing)).toBe(\"无扩展名\");\n expect(makeUniqueFileName(\"无扩展名\", existing)).toBe(\"无扩展名 副本\");\n });\n});","v":"aQcAPXs22jt9Bx++s8ShvcJ6Qz0Gt4O9N/dEvcT9gj3/ng69AXo4vdlVab3TSD89A6QuPcYHF7uK3Cm8gIOQvcizujyNHR+9shEMPYoBNTygkKu8TEGku5Xrlrxq2Iu7/q5sPfPvSj2Q+hC8O3pKPeQQM7wtNoA8cDyQPUgnBz0BPY88cjarvCNWoL3wjgW9fojpu809brv2NES87PLsus/LW7wbq4C8Kh4jPEupGb1fv2M9g5DAuyDyaz1ptxU9NLt/PZLYK70T+b07ptn9vCbBGjtr8OI7bjELPrtURD3CSAm7O2Q1vNS0cTzpEgW9BM69vNDQajzMXiO9ftipPYTvPj10OTe9P+BCvddihj3iFV68JBv+PDlZLj3C8KY7Ft2HPJ2vSb2LO0e9m38hvGvoh7wDBQq9d00+vBqLQD1wZNu8dar7OwgnpjwMets8SmgGPWDkBb35/uk83jQbPOHfurwxjqM9NZnTPMs7MbxgSHi8gXz+u6Amab2zAZe8aAOqvMGCrzvY58i8JOTVvL0RAj3XOL077sYfPTyU5zuzP508p3WFPWTxjzzhdUE8/EvTvKWAN70zgri8S+GXPTs0x7x/8ji9zGv0OpXFC73oLDQ6pQW1u9h9Dbxez6Q8XrA2vFr0zLvf9qK877X/PLvhKz22FxU9vPfWvM1jvjxXM/s8gy+RvfS0hbwpaTE7Z1qvvDcCIDwgYJ89dFfuPI9iHr0cnZu8DC+aPMC/9rvyRgc7zU2mvF2F4rz6O0g8YSQnu8wlN72nQpY9/XsyvXOLBL1kcxS4yrUEvc5+WT1FFLO8uBF9PBkiojxc6oG3YT+sO2b+4Lv3e4g7PgTeO33CQT2+i6O81mfavJGngz0QR6S8lzVkvQZ5dTzW7ys9LxHCuZ2G7DyYJzK9vtlvvSqxfjzM8F87dGZQva5Zi7zr4gk9FT40vbEvADxl3zu6S/vJOxiuEr0xIhA9CgOjvIScaL0w81y86wU5vAuPQ71Bfm66SLbGvF6RczujMyu9nK5rvbQ5CrxAi4W8F4R2vXWEzjsO1Bu8gespO/j1C71++pS7qB6OvM8BUjsoEqG5qs2FvQ5v2TyLin291lLLPCf1Cb1ukDY9xTF6PZRnXL3v0rk80GWSPdkCaDwBdFU9uhE/PTCKaryUNli9ZRmXu93FGj1NT1W90HRUPYalmDy6vuk8iITxu4CUNTwJYWM8cgynO21qhbwI1oK9emi0vYzAFz2QQTE9FODQOyREBT3g+MK71YMiPdRt0zuVj7w75WO0ultLyDuV05U8ECVlvApNN71NYMa8b3CWPASdFbwkh7s8b+FRPOWcAr1zUpE73YtgPZN9aD2YpwI9iBNDvbNoGLxf6wO97BaKOx16eL1//qI8HkpJvWMN5TzEFAI8S5dcvarMS71RIEg8DitHOsqedbuu9TQ8aeADvY486jvnHhy8WJzFPC6LJz0MIqY7gtcjPKWmuzwSU6S8EqDevL2pn70O34y9R1zQvPFWRjwhy7G88O2/PNEtrLwq2lU8liNSvPupyjvZPyS8KmDWO+O9s7w7MYE9YRSdOrzt9Tw1FmE81GcrPBoAnboB2Bm9Aq3xvNkbDT30r7Q9HiUSPTUa3bx6bEu9oFELPfsqdbxW/da74nEave+Fi73R/qy9tM/7vFTDTTy/Tma9iz9avHq02zyF9jg9igexPPLeYjtOw6e8eFZbveNdmTzK+is8DiwEvZbEDz0ZSAK8F+o1PVyZhjviMLC8QGZ+PSBvvjwamK28t6GIvVi7B7t10SO6BKVrvKg3yDzCzDO8i6iQPYaQnzvN1yC92davPKrPcD1suym9S4eCvGghpLxpEQW9eL5+PVt2LT0s9mW9FOWOPDszODwVnQk7quapPBezxjvsa848lh6APKopHrxKeIy8pipjPemvTTweCZg7Ch9iPHegJL2f4zY974gcPS6LGT0oH4A9LGMsvMsGmDt3j8y8cseePA/96jp3itc8jYmPvJkm0bxm66S87N1LvU4jqDzuHDg9YaFZvSmJMbweWGa8pvA5urZeNjzt5tk8ARQ8PR+kG7wUeio9OFCYuse7irxMenS717Hluekcqjx3pzW9OtEUPWLTdT2y3Be9HzGQvBZwRb2A0I+9ujgmPQPtgrsBOA+91OHSvD17M7zO0oa8EDfAPOOtajv4jeM5mcSyPFLzHDz0wSS9OKBtPK4giDztZJc9g1uLO7jfib1moJS8ke4JvUef/TyGf5A8wr8mPNulTz0VvW48ycltuvy7Gj0QS7O7uIShvYgg2zonHwk8/oZ0PcPcFL2eQ0m8iXANPbg/ZbxTf4E9G1POvAD0az2Bexw8UIcfO/qWdbxGuyy9Or0IPbneoT2+vpM90AEvvVf5FL1tpQ89RrclvYiV0zwhMow87AsjvYZsBj7vGca8Pb3xPOgItDskd9+87LGoPO7sCzszWeo8gcEvvbjU47uYUG+8rZAwvcD8K71jjEe8SS6vPBMVnz2tk4a9RtOJvK8bCD2r2Gq89UyNPQNHYj3Z+iG9RTygPEH7zrxr0YI88BTpPOrCkb31/Pm8d8x6vVREujyIGws9Vw0PPV3Uqjsspt08QRq7u8Q1lzzgj0E7Z9eMvJz/7zwEzKs8bDzyvAt88LxMeDI9yjcYO28eILxvo+06QGphPayCs7uQnbk7NpocPI6oBD19LBk9MG/1vEniFL1iShC9ZIUmPbqEHbwi3ia5bZDSPEBeoz3GkwC9iQjDO7iRubv1xyi9X8qwO5+1Fj0hgoG9IaWCvPUDj715uQK9HFYIPWAxZLsu/3i9MeGnO8BqdDs0vR+8TS4KuilNEb3qTU66tMpAPSA51buXVyO9gXcvPepLtDwj3kI9QSdgvSSbGjwuTZa8BhYfvbrjsTyLE5o8mXpAvLU1UD0UBf
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/naming.ts","s":1,"e":57,"m":1773495900968.862,"t":"function splitExtension(fileName: string): { base: string; ext: string } {\n const safe = fileName.trim();\n const lastDot = safe.lastIndexOf(\".\");\n if (lastDot <= 0 || lastDot === safe.length - 1) {\n return { base: safe, ext: \"\" };\n }\n return { base: safe.slice(0, lastDot), ext: safe.slice(lastDot) };\n}\n\nexport function makeUniqueTitle(baseTitle: string, existing: Set<string>): string {\n const base = baseTitle.trim() || \"无标题\";\n if (!existing.has(base)) {\n existing.add(base);\n return base;\n }\n const first = `${base} 副本`;\n if (!existing.has(first)) {\n existing.add(first);\n return first;\n }\n for (let i = 2; i < 1000; i += 1) {\n const candidate = `${base} 副本 ${i}`;\n if (!existing.has(candidate)) {\n existing.add(candidate);\n return candidate;\n }\n }\n const fallback = `${base} 副本 ${Date.now()}`;\n existing.add(fallback);\n return fallback;\n}\n\nexport function makeUniqueFileName(fileName: string, existing: Set<string>): string {\n const safe = fileName.trim() || \"附件\";\n if (!existing.has(safe)) {\n existing.add(safe);\n return safe;\n }\n const { base, ext } = splitExtension(safe);\n const first = `${base} 副本${ext}`;\n if (!existing.has(first)) {\n existing.add(first);\n return first;\n }\n for (let i = 2; i < 1000; i += 1) {\n const candidate = `${base} 副本 ${i}${ext}`;\n if (!existing.has(candidate)) {\n existing.add(candidate);\n return candidate;\n }\n }\n const fallback = `${base} 副本 ${Date.now()}${ext}`;\n existing.add(fallback);\n return fallback;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/projection-client.test.ts","s":1,"e":60,"m":1777361951720.5408,"t":"import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n FILE_TREE_SEARCH_MAX_RESULTS,\n buildFileTreeProjectionSearchRequestMeta,\n fetchKernelFileTreeProjection,\n} from \"./projection-client\";\n\ndescribe(\"fetchKernelFileTreeProjection\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"通过 3000 同源 file_tree projection endpoint 请求 Rust 搜索 projection\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(\n new Response(\n JSON.stringify({\n ok: true,\n result: {\n projectionId: \"kernel_projection:file_tree:page_root\",\n projection: \"file_tree\",\n rootNodeId: \"page_root\",\n items: [{ rowId: \"asset:table_1\" }],\n edges: [],\n meta: {\n search: {\n indexingVisibility: {\n schema: \"mnote.file_tree.indexing_visibility\",\n schemaVersion: 1,\n source: \"kernel.project_view\",\n status: \"visible\",\n requestKey: \"page_root:预算\",\n indexedResourceKinds: [\"document\", \"index\", \"asset\"],\n visibleResourceKinds: [\"document\", \"index\", \"asset\"],\n metrics: {\n visibleRows: 1,\n visibleEdges: 0,\n },\n },\n },\n },\n },\n }),\n { status: 200 },\n ),\n );\n vi.stubGlobal(\"fetch\", fetchMock);\n\n const result = await fetchKernelFileTreeProjection({\n workspaceId: \"ws_1\",\n rootNodeId: \"page_root\",\n depth: 3,\n query: \" 预算 \",\n maxResults: 12,\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/projections/file?workspaceId=ws_1&rootNodeId=page_root&depth=3&query=%E9%A2%84%E7%AE%97&maxResults=12\",\n expect.objectContaining({\n method: \"GET\",\n credentials: \"include\",","v":"cnFUPSrqBT0P7QG+Ov2xvQ8rED2wuUe9PVuuvUh0cT2x4MC8FicdPAQHw7txNck8CC/pPOk/Jb2nxEe8VPpLvS5g+jx1rh+9JfwwPaB1RbzSbgC9O0H8vGRhn7xdxAa8ihYyPRKdaT3wJQa7kPm/Ox6wHTsCqgE9JLKfPaIvLz3o0jq7g6REOzEcc72LFxu99yfTu4fZn7yQk5S8iZx2vPD7rLx710e9IhiVu0E/Yby6IAA8u1k2Orsegz1Qk2Q8sTGUPTXVN70bq367T1VSvAZMTbxOV4c8KA7wPa6Ghz03yAw8tu5vvP3SVjzxgwm9HaBmvMLHtTwJ9Bc7bNHBPQ1IVz0+1KO7VviPvWo9aT29bFa9f/y4OwbEXD1wMRA9XiVAPPFUI73nP1+91lxJPO0j6bxfP3m9cnUbvXs2jj2YtLK7xpAmO6QTvzy8GCo7yw3XPEMiXbweDoA6/+TbPP04xLz0fHo9RGTEPO+7gLxwQ2a84zFZO14dKL2TFLK7ZiS4vHxvdjw6Wt287zievJrnGT0vDQk9JAqFuwS7qLzU7f87LMmFPQ7SsTv24NI6djk0up/vA709e6e7+R5xPb7Y+7wAepa9EbuzvKfDeL2l71k8Odg2PEO/qLwipyw9YbZ/vIBFb7y6EQI9+uJdPUqtdT1erNE8oXwEvarsN7zWv+k8JORlvQcOITxTvrO89OIdvb15GT1QBVk9EXQxPS24F73zcYm8mHcSPeYoGj0ZsPs7eN1BPJVM7Lw40Ga8RB6suoRP5Lx3XD89i+AUvbBiAL3sPIG6dHM+vSDRWT1IX4G8GSWgPPu+Hz0uhhm9u5ibPII3Nj0QEmw8PAN4PWV1yTyO2bG7T1ufvHcnhT0oZiW80fyQvVwHoDul/lE88u+6POV9HT0GhYw7XVYJvVej7ruQ6Ku8MAweveM96LygwzY9VavzvH8G3TsvVne7xbiRPAtHvLzIKAw9/lYKuSX8p70JJb68kaRYOwqkC72FBf87pZHYuwz4wTu7WSW97bBhvTgU7ztpjyO8HZ5Mvb3BFz3IuBq9lsP1OiizBr1SmEi7Z7e+PC/tjbtfgxM93E+SvXOkMz2T8Su9CN27PEUW2LyBnuY6iSY9PSQMLb32ht85Nv+NPZ7wi7y9yUw9Z5yZPOEKkLzutYC9D00ZvAW+vTxkW3S9uq7sPEebKD252g49evT5PHrDkzsXZeE7P45zPAmyRDvqmze91ebKvbPKBz2ZBoI9ZPdlPBgLADy+vrY7JXUsPVETLD2pmBs98nsCvCH4BbzH93S70ncYvJHqbr2L4AS8SPirPOKJT7u1scA8z3rRPI8wxbycQI43l86HPbDMkD0hJZU89rYvveXZ/Tprl+W87mgKvTTji73CUYU89zo0vPyq0zyhEj851PF2vWwEC71m0VK8pti1u9xaMDwwhCY8XOiLvH17cDsj35K8FtJNPOBnLD1cpAI8yyG/uikAPD395DC9Sk/XvFwdrr3Bfou9x3ZrvOFJQD33RAC9nqUFPQUipbxv+Fk8GpBuvJ4Zx7vGCWg8dnHIuwhaNr1xwHg9Us1MPO4h1bud5YW89oEkPG1Edjxoria9ZpSHvDdOmDxFjpY9zs0bPTQFEL0d25C9PSNIPeaZ2Lsf6te8Yz0TvTQxSL0FS6K9ONYTvd0Z3TyGRgC9YAuHPMQxFj3m+Sk9dZ1GvLiciryt7m+8vW4avSHx9Lx7LsG7enyPujoFKT3Dh087aY9yPUOxK7xpgr28ZTg2PYgiajtRC4e85vOHvV690rt1FlO89BcfPBJq2TxzbxI9kbWdPNfZdztwcrW8gutfOg96Hz3GGTy9JqnNvCDWrrxs8Qu8332cPSRxAj108A29IdADPfSm9zqRLDU8q25dPGJ7ITyflaQ81V7IO1J9FbztTFG8VrhIP
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/projection-client.test.ts","s":49,"e":108,"m":1777361951720.5408,"t":"workspaceId: \"ws_1\",\n rootNodeId: \"page_root\",\n depth: 3,\n query: \" 预算 \",\n maxResults: 12,\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/projections/file?workspaceId=ws_1&rootNodeId=page_root&depth=3&query=%E9%A2%84%E7%AE%97&maxResults=12\",\n expect.objectContaining({\n method: \"GET\",\n credentials: \"include\",\n }),\n );\n expect(result.items.map((item) => item.rowId)).toEqual([\"asset:table_1\"]);\n expect(result.meta?.search?.indexingVisibility).toMatchObject({\n schema: \"mnote.file_tree.indexing_visibility\",\n status: \"visible\",\n requestKey: \"page_root:预算\",\n });\n });\n\n it(\"固定 file_tree 搜索语义边界:命中数先截断,祖先补全不计入 maxResults\", () => {\n expect(FILE_TREE_SEARCH_MAX_RESULTS).toBe(80);\n expect(\n buildFileTreeProjectionSearchRequestMeta({\n workspaceId: \"ws_1\",\n query: \" rust \",\n maxResults: 500,\n }),\n ).toEqual({\n query: \"rust\",\n maxResults: 80,\n maxResultsRule: \"matches_only_before_ancestor_completion\",\n ancestorCompletion: \"include_all_ancestors_after_match_truncation\",\n ordering: \"kernel_file_tree_preorder\",\n emptyStateText: \"没有匹配结果\",\n asyncVisibility: {\n source: \"kernel.project_view\",\n requestKey: \"ws_1:rust\",\n },\n coveredResourceKinds: [\"index\", \"asset\", \"asset_folder\", \"mindmap\", \"book\", \"pdf\"],\n });\n });\n\n it(\"搜索请求会把 maxResults 限制在 sidebar 使用的稳定上限内\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(\n new Response(\n JSON.stringify({\n ok: true,\n result: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n }),\n { status: 200 },\n ),","v":"hA3bPHKKNj0txSC+i/85vTGjkzyIyEu9u6xJvS1+Kj3H/KG7ZmrAvDWGDjw7piQ9knMAPZ63uzyYpd+8pkRNvQOMxLw0fgq9L+gBPUkyHr22yP27mUWCuonUXL0XQps7um5WPQMEPT0pkRK9FbKDu+ZvzLvw+YI9Y6CMPTqn5jx0Vta8DJnkO79jlb2BegC9aEs0u8J847vrHOU884W7vDDbT7yjP4u8yPa9PP8WtbySW1Y80ujavMZvhj03hqs849/3PWsPYL2c1pO8VjOOuw4NPD0H0n08txSpPdLgNT3gEDU8D2povLjHUz2iT4a92EhePLiXgD12C8K8m0BFPWeegD0IFu480SjXvK++ID2+ggA6erU1vYQZTT1Cry09y0aBvA4MH7xMW3+8ysIGPbdGBb0f5de8TWp0vHrdnz1gzZ08YRpHOQ6KpTwgKsI8KYJVPHL2MLy61eo7EXmMu2DC4TrCwGA9ftAqPB5ugTxvBja8UXdNPKMWwbzNo5Q8bCyPuyvNmjyUl0e91mxWvHig3zzaPjQ9ZxEJvAtA57wBkAM8K/YePXj/WjyD8ZK7pmeAvcbger0Ye2q8Y+a3PHm8Er1AhZe9I0CBulgrOrwXPHs9svAQvaPzVrtQoBi7GXj7u3nM2LxYpBQ9fzHZPQE/Qj3klq28bXoOvXQQbTzS/Wk81TkIvRXdZjzVKM+8oB76vDV5Cj1A3WY99+7zPLWwDr0mb0I5WjesO86a07ut+ZU860qiPEfOD70k7Gy8sxJ5uwj/Sb1lEk09IqgPvPAPer1WV7m8RJ1OvQS2hTy8/ei8TQjFPK6F0jwfFJO9AnLRO0dqkjwA3nU8GkOCPaufkzzruwY9ZB7SOySqlT2OWEO8ocKuvRqSsTxC7Sq7YFRKPTrM3buW//+6Wv51vQerkrxzrNS8t1XHvIg6AL1HRn49RvXLu8mswzz+tcI66v+nPNDY5brPIkY9UQA0u5y1gb3ncGm9dffhPJexVzmZEMa6SELNvBwFpbyDoPK8BBshvQxGpDxhjK08lBE6vQOxGz14I/y81Ye3PMggJ70jUiS80OPPPMXGJ70jXyg9FkOhvSYIpTyapyA8a9BhPbNW37yWaKi4H/YnPc2nGb2f5oC8CoTPPEHsHDwK/M07OESmuxRvY7xroU69iv1kPCoTvTykIJe9aiGCPEonGD21tyo9wwGjPAmWy7sTKNW8AFasPNr137smL0m9fg/WvY9Aej2RlUk9ppXpu2oIHj33Tqc71GVGPXSURD1S/lU900C+vOxMjTyZjBg8xfTGu2bNOb2G8kM75yCNPJYpBb1QYgC8e5X5PPTnYrsHoSo7ghJ4PfzYkj2Wer67SBZZvXYcp7z82b+8oL7WuuBZnL12nm87jhKNPClRrzwT3QK9M3wEvRvAprzeRi+92n0jvaFxgDxi99w5FGeMPAHy/bxUa5G8nmE/PdajnDxEE7a83IKrPJ7Gfj0/Kyu9p0tJPCufhL1qTeC8/y/cu3Ejoz2xN4i9tyQJPUo36zyu6008hHk+PJiKazw/DlA8ZDgCPO16tryD61M9DuYAPae5frzMeYg8hVYcPK4/N7uAqZ+8xydwPCtGrTz3J6Q9/qEePZrdSbyy/aC9dO0CPYCLBDy+CuK8voYLvYWCrbzLwXW9JIElvQEiF7xxyMW84i84PAsWETzxU5M8VJtJPFqLs7s23Mq8gIbmvBKsFr1k+mq9LF/tuiL8Lj3qKCC8I+CTPd9hCbwFfr67ob2yPAAaJj1b4MC854E0vR77t7ucsgU8MQwrPQJ4Cz00YiE9ZCJjPdIjHz25i++8mz2IPR6M+bgHHKi7lKb5O9tAYL1vSpM8BRNlPf2efz0HZbS8MHYNvFbxHr1JfOE6gR3TvPapQj3wO9U73Q+8PD0p1jzEBI
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/projection-client.test.ts","s":97,"e":137,"m":1777361951720.5408,"t":"JSON.stringify({\n ok: true,\n result: {\n projectionId: \"kernel_projection:file_tree:root\",\n projection: \"file_tree\",\n rootNodeId: null,\n items: [],\n edges: [],\n },\n }),\n { status: 200 },\n ),\n );\n vi.stubGlobal(\"fetch\", fetchMock);\n\n await fetchKernelFileTreeProjection({\n workspaceId: \"ws_1\",\n query: \"rust\",\n maxResults: 500,\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/projections/file?workspaceId=ws_1&query=rust&maxResults=80\",\n expect.anything(),\n );\n });\n\n it(\"失败时透出服务端错误消息\", async () => {\n vi.stubGlobal(\n \"fetch\",\n vi.fn().mockResolvedValue(\n new Response(JSON.stringify({ error: \"获取 projection 失败\" }), { status: 502 }),\n ),\n );\n\n await expect(fetchKernelFileTreeProjection({ workspaceId: \"ws_1\" })).rejects.toThrow(\n \"获取 projection 失败\",\n );\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/projection-client.ts","s":1,"e":60,"m":1777250215773.0188,"t":"import type { KernelFileTreeProjection } from \"@/lib/kernel-file-tree\";\n\nexport const FILE_TREE_SEARCH_MAX_RESULTS = 80;\nexport const FILE_TREE_SEARCH_EMPTY_STATE_TEXT = \"没有匹配结果\";\n\nexport type FileTreeProjectionSearchRequestMeta = {\n query: string | null;\n maxResults: number | null;\n maxResultsRule: \"matches_only_before_ancestor_completion\";\n ancestorCompletion: \"include_all_ancestors_after_match_truncation\";\n ordering: \"kernel_file_tree_preorder\";\n emptyStateText: typeof FILE_TREE_SEARCH_EMPTY_STATE_TEXT;\n asyncVisibility: {\n source: \"kernel.project_view\";\n requestKey: string | null;\n };\n coveredResourceKinds: [\"index\", \"asset\", \"asset_folder\", \"mindmap\", \"book\", \"pdf\"];\n};\n\nexport type FetchKernelFileTreeProjectionInput = {\n workspaceId: string;\n rootNodeId?: string | null;\n depth?: number | null;\n query?: string | null;\n maxResults?: number | null;\n};\n\nfunction normalizeQuery(value: string | null | undefined): string | null {\n const query = value?.trim() ?? \"\";\n return query.length > 0 ? query : null;\n}\n\nfunction normalizeMaxResults(value: number | null | undefined): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n return Math.min(FILE_TREE_SEARCH_MAX_RESULTS, Math.max(1, Math.floor(value)));\n}\n\nexport function buildFileTreeProjectionSearchRequestMeta(\n input: Pick<FetchKernelFileTreeProjectionInput, \"workspaceId\" | \"query\" | \"maxResults\">,\n): FileTreeProjectionSearchRequestMeta {\n const query = normalizeQuery(input.query);\n const maxResults = normalizeMaxResults(input.maxResults);\n return {\n query,\n maxResults,\n maxResultsRule: \"matches_only_before_ancestor_completion\",\n ancestorCompletion: \"include_all_ancestors_after_match_truncation\",\n ordering: \"kernel_file_tree_preorder\",\n emptyStateText: FILE_TREE_SEARCH_EMPTY_STATE_TEXT,\n asyncVisibility: {\n source: \"kernel.project_view\",\n requestKey: query ? `${input.workspaceId}:${query}` : null,\n },\n coveredResourceKinds: [\"index\", \"asset\", \"asset_folder\", \"mindmap\", \"book\", \"pdf\"],\n };\n}\n\nexport async function fetchKernelFileTreeProjection(","v":"xo1MPYoWFz247ty94eLCvdefnzzcHHm96nePvVvuEby62pi83Qg6vAc/8LxS3fM8qRzNPWSeqjy72im8lWRGvTD0QDsa7xG9SxTXPLuKSz1j2ha79s5svMNzHDzlkJW8DVHLPUyYDz3iAOw84c5Su1Rca72uSkw9vAeWPYzmzTwTD9e7HIUivMR/rL3Rg4a8EVy7u46oibwCBj09wt1DPJuuXL3PAOG8IgQ5PF9Mg7t50iA9eMDdvLHPuj3hcjA820+sPQYrjr2O9Jo8SP0AOptkkjswhG+8cCiRPYsbijyuGhm91YGOPLvljrwCOpi8fqC4vH2poT3TnrC86sSePQ0OiDxhjNS8pn0Yu5rn0z1mISm9MJGMvHfeCz3Jq8Y5X2ntPAyUzbw9dGm9u2ONPFQ+sLs9gVW9idC3PNJABz1ofV+8qjUePbJOtLxP6pA9U7ayubDuDzyJZ4q7jqIEvU6V7jsnySY9RfBePRdglrz/QBO8qmsRO+jDNL201PY80XkzPBU4FD0fyFi7lIH+vIBbFT0j0p+8dRiAujaYsLt/zKM8vzHYPP6u1Twen+Q5ze42vVzoD73vFNa8BvmTPe25m73xBEG9Nj47PFiMZ7tlXNS7WX3CvAPI0zzGjh09iIQwPMj7X72wCJU6D1uEPRCFzjzMdcy8BX1xvI4nVD0dxg8982JHvZqCFb3IWR29VzQsPFzi2zxsZ6Q9CLvNPMPWtTviFvY7KjPCPOcd/bvHpVw6y+xgvWnTHb13pVc8TtWaOmJkwrwWBBE9GMmCu7BnHr1B7aC8k3j0vI7Lkjz8jci8qQnDPZJjRzxLMHa9cdQsPOohdTw8Qv28uCQGvS3RKD1uN+88lxnuvNr8+jwHVDW6PHxCvd3IbDwKjdk8RrYtPcB2sjwhHEa9gDoTvb5zHTtuSk29VYbPPCn0xLzjVBA9jV14PAOVvzzAvvC8+dj3u0lSlb1J6Qc9GtLIO+FQkr01TAG9/qYRPUA0oLzvwLw85k0NvMGO4jsJe828DrYdvROK2DvcBDO9QY9tvTK/izweKIY8n6xKPHXNb721/g48bVhQvPaQ5bzYvAM94XS3vbJExrv4yyq9qCVjPXaRS7157ac81BNZPdCsy7wmkQk83ZDTOwpzW7p+Xsw85Y7kvNOGBrxaYOi85YYWPURuFjwN2X+93yb9PFMyhD2cmgA9seBcPPxK0Txd9TA8xM8mvH4rZ728w0u9bAaJvaOjoDt+IxM9igcRPNKijTxjzME8P0jBPRpI2jywCis9vGC3vJDfTzy4vEC8EZUzvVxUqLzB7Y28ZUm8u7RXSL362hY9ZOjruhwhBr2agNA8pU8RPTeiaT1BUJe7b4x2va8E4Trx5te8n8GUPIIGj73qiYQ8/E2KvCddmzzPeF69prGYvFZrz7vMvXS9e9SzOVhGFrz9veA8+2AEvaCRorvFA7+8akgXPYL/hT2lzbG88bSfPIle2jwXNfa7NhLFvGjmub2FkZa9SrdAvHpg0Du9qcO7+pcOPQoM3DyQPtU8Cetgu+lP2zum6Gk7HOegO7CF77xkIuk8Px+zPE92QD38YgQ8H2GTvO0hibyE5ZW9TfPaPBweFLwVJYE9iWuKPNszrLw+rS29edAzug8wKL0LrWK8A3UNPV/jg7xv6Va9JjD2vOmeiT27xqI80nXnO1jY2zxpYSe8X9NlPEgX7LwVAja9tj2OvV7AMj
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/projection-client.ts","s":49,"e":99,"m":1777250215773.0188,"t":"ancestorCompletion: \"include_all_ancestors_after_match_truncation\",\n ordering: \"kernel_file_tree_preorder\",\n emptyStateText: FILE_TREE_SEARCH_EMPTY_STATE_TEXT,\n asyncVisibility: {\n source: \"kernel.project_view\",\n requestKey: query ? `${input.workspaceId}:${query}` : null,\n },\n coveredResourceKinds: [\"index\", \"asset\", \"asset_folder\", \"mindmap\", \"book\", \"pdf\"],\n };\n}\n\nexport async function fetchKernelFileTreeProjection(\n input: FetchKernelFileTreeProjectionInput,\n): Promise<KernelFileTreeProjection> {\n const params = new URLSearchParams();\n params.set(\"workspaceId\", input.workspaceId);\n const rootNodeId = input.rootNodeId?.trim();\n if (rootNodeId) {\n params.set(\"rootNodeId\", rootNodeId);\n }\n if (typeof input.depth === \"number\" && Number.isFinite(input.depth)) {\n params.set(\"depth\", String(input.depth));\n }\n const query = normalizeQuery(input.query);\n if (query) {\n params.set(\"query\", query);\n }\n const maxResults = normalizeMaxResults(input.maxResults);\n if (maxResults != null) {\n params.set(\"maxResults\", String(maxResults));\n }\n\n const response = await fetch(`/api/tree/projections/file?${params.toString()}`, {\n method: \"GET\",\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n const message =\n typeof payload?.error === \"string\" ? payload.error : \"获取 file_tree projection 失败\";\n throw new Error(message);\n }\n\n const payload = (await response.json()) as { result?: KernelFileTreeProjection };\n if (!payload.result) {\n throw new Error(\"file_tree projection 响应缺少 result\");\n }\n return payload.result;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":1,"e":60,"m":1777173532465.9417,"t":"import { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n copyFileTreeResourceAssets,\n deleteFileTreeResourceAssets,\n preflightFileTreeDelete,\n preflightFileTreeInternalDrop,\n preflightFileTreePaste,\n preflightFileTreeUploadTarget,\n moveFileTreeResourceAssets,\n renameFileTreeResourceAsset,\n restoreFileTreeResourceAssets,\n uploadFileTreeResourceAsset,\n} from \"./resource-command-client\";\n\ndescribe(\"file-tree resource command client\", () => {\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"copy/move 应通过统一资源 command client 发送到 media batch route\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({ items: [{ id: \"asset_1\" }] }),\n } as Response);\n\n await copyFileTreeResourceAssets({\n assetIds: [\"asset_1\", \"asset_1\", \" asset_2 \"],\n targetDocumentId: \"doc_target\",\n targetSubPath: \"mindmaps/mind_1\",\n });\n await moveFileTreeResourceAssets({\n assetIds: [\"asset_3\"],\n targetDocumentId: \"doc_target_2\",\n });\n\n expect(fetchMock).toHaveBeenCalledTimes(2);\n expect(fetchMock).toHaveBeenNthCalledWith(\n 1,\n \"/api/media/batch\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action: \"copy\",\n assetIds: [\"asset_1\", \"asset_2\"],\n targetDocumentId: \"doc_target\",\n targetSubPath: \"mindmaps/mind_1\",\n }),\n }),\n );\n expect(fetchMock).toHaveBeenNthCalledWith(\n 2,\n \"/api/media/batch\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action: \"move\",\n assetIds: [\"asset_3\"],\n targetDocumentId: \"doc_target_2\",","v":"+jd5O6dti7wskxy+UsGgvR7kjz18GpS9XagDvRs0Qj3/wAq92X1OvQtJQb2Jf+88axuYPRRmHb1DmDS8M3eGvdvUwTyfY568/M1XPe4mizw21668ZW9IvfWZZjybisu8LM90PT8GKj193Lw8ho2aPIA1DL0FEaM74iZ/PaL2wjz6G90811A/vNZukr0UEAa9R69dvLkMRb1Xi7C8cXYAPR0OJbufSrG8mx+guoFyjb1ohmI9qtSOu6sFAT2xWL26YL55PdxZCL3JcCk88ywdvZTouLwEqdM5GEkNPoNNgz0zD4448dd2PNDDVjvZhZW7ILwUvN6S3Du3XMs7cKiIPQKSjT3YzNK8SvhHvfBOpz1KAUu9UHZIPSEoYT3wqzG8BKTxPPxchb3qFRy926nWOGJO7ryHFx+9TlAivcJrAz3t6jK9w4uDu2fl0jzTTdM8rZ4OPd5iurwUlpc8x8gXPcJSibxoipw9+7RJPKOHg7vM0DW7YyyIvEacML2kSvG89G9pvUswhbsxXXE8JoisvHjVpzzffAk8Ri3iO/tKlLyR/rO78L9JPaCCDzyqXbg7+X9BPIqCLr08dTM87AaIPTWaYDtemuu8V/KGPF9lnb3ndyM86WmBPelLKL0Gmho9j2eIOu2NC70sxFC8jBxiPCOJRD0gOSw7H2cqvVwvfjteuRA8s3IvvYiVrrx1Wyy9fweyvNzEUDxtaYE9g+D7POMeRr3Qx3W9dbilPHP1XDrDnrM8DaMXPUYLl7ydJT65HFa0vLipmLu/6hI9rREpvTcaFL0VWZa8sTX6vE2vhT0gl7e8L2q9O08AJz3Pqt28CdEgPdm7wTy1v8W7pUEHPUaILj1SZa28FjiSvHzBFj1FVo08GjE+vT8qCj0qajc9StSFPPI6bz2sczm9K+Mhvf1f3LxhXgY8ErQ0vTDFCzx4EmI9VacsvRLfvDtVjYK80WH2O7Z8UL3QCZA88zuEvNwel7235f27hCGevN6ePr1Hyh08P9/EvLZ8VLvpwmG94cVwvZ6RLrybnny75DKTvdQYbjwvfg+9TXZuO4prb7zZi388fqapPEURlLuB5Vm7lvlqvSv6RDzvF0W9N/JHPR0dcLz+gIA8YLBwPfMgIL1Ny1I7DXgWPfSGqLw8ieo8/YKsPD1K/jqGN1G9qoEavFgyAj02Tcg6qB5WPV1sibxPafw8h6DfPE9+2jswBl+8cb2CPBvsjrwbACS9R8isvY7O+DvpYOA8de+QPDqmqjz81PY7Ja5fPWuWwzxO98s7YhHGPNmZ/LtSgYU6BYMjvKb0br3v8rK7RLRmPOZs5rx22pG4hw/qPNVdvjvB1za9GAjpPLXevDwOTVc9lm6ZvbmF0jvixi66PzUjvSzQPr05Ha86DkBtvCUijD1KEik8yg3WvK56Cr3aC4q7AUOHPM+QrzurEp888HsbvRacgbyNa6i83KZnO/3N5DwjETA9RjymPAYkYDxyB0e9QqnjvIgHab2W0HS90S2avNUif7rfqSK8yVK7O/iUe7wHG/Y8p2+zvIpFtTschAo8nFbXPNCDSL2341Y9nEKuO36vUDyyQaY7DVdcO3C4LDzPc168fnu2vA6kLT2Sn649/psnPcsvXr1HqC294EySPI4SnrtWo8E5MUMBvU8mNb2/dpC9/zUpvfdZNz00KoW8mTeYPJlWdj38gwo9zd0DPfWZ6zr5fZG8KPQdvZKoi7sSodA84xCtvID0QT1X4CS8+u42PQB7tDrUZ2u5OnVVPa730jt4Ac08DY5OvdA2Krz9NYu8xVMSvWFWlzwNbuk7H7giPfB3pTtGUcq5JHzGPOwkZT2gWxm9C/IsvAHmFjxaeq+7rp6OPU8P/DxLBy+96XuhPI0ZK7xQ3X485YPJOoN1NLz4R588RBdcPTAA6DtBLUc7jYMbPUf/ujumTA89luBHuwLdnLxWj7s8zT6yPJqMuDyc86s8MKX8PMYn/Tu1KQq9uoe9vHI
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":49,"e":108,"m":1777173532465.9417,"t":"}),\n );\n expect(fetchMock).toHaveBeenNthCalledWith(\n 2,\n \"/api/media/batch\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action: \"move\",\n assetIds: [\"asset_3\"],\n targetDocumentId: \"doc_target_2\",\n }),\n }),\n );\n });\n\n it(\"rename/delete/restore 也应复用同一 batch transport 边界\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({ ok: true }),\n } as Response);\n\n await renameFileTreeResourceAsset({ assetId: \"asset_1\", newName: \"新文件.pdf\" });\n await deleteFileTreeResourceAssets([\"asset_1\", \"asset_2\"]);\n await restoreFileTreeResourceAssets([\"asset_3\"]);\n\n expect(fetchMock.mock.calls.map((call) => JSON.parse(String(call[1]?.body)))).toEqual([\n { action: \"rename\", assetIds: [\"asset_1\"], newName: \"新文件.pdf\" },\n { action: \"delete\", assetIds: [\"asset_1\", \"asset_2\"] },\n { action: \"restore\", assetIds: [\"asset_3\"] },\n ]);\n });\n\n it(\"后端返回错误时应抛出稳定 fallback 或服务端消息\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: false,\n json: async () => ({ error: \"Rust resource preflight rejected\" }),\n } as Response);\n\n await expect(\n moveFileTreeResourceAssets({\n assetIds: [\"asset_1\"],\n targetDocumentId: \"doc_target\",\n }),\n ).rejects.toThrow(\"Rust resource preflight rejected\");\n });\n\n it(\"upload 应通过统一资源 command client 构造 FormData transport\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({ asset: { id: \"asset_upload_1\" } }),\n } as Response);\n const file = new File([\"content\"], \"demo.pdf\", { type: \"application/pdf\" });\n\n await uploadFileTreeResourceAsset({\n file,\n workspaceId: \"ws_1\",\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",","v":"mzNNOt/lk7xnIQq+K8cNvXOmsj3mULS9zKGMvAzxVj2qeAM7gw63vVQcn70Dt189wJi8PRM21zyHvfk8kxczvUB7wjzaACW9jtaGPEcz+DyIzP88OfFwvGyt37uTugC9WHKEPaQIJT20cZo8QkrLPANAIL3SUCU8KacjPd+Aiju1Ix07hKUuvClJlb0+1He9VXtKPJ44M73Wcxu7xCzOu7BAET3EB9c753IRPLthgr04Q7M9ZRfvuxHMkD3rErM8qhGOPcBWfb3/OYo7cCXsvB1KyryHReG7K8PsPYS0Aj3gxMw8pdG+u4i2Gbzm6oS8BlfiPChtIz0zXSk8Odh4PUFVuz0Bgl68OeoovfFJVD3FjnO8lQ9POuy4Vz3BWAQ9WKpivFKcgDsTJA29h3/JOyEZKb2DH2a98DFqvQlhkzz5wYu8TYlUvMefRD0qs9Y8c5s+PaT+BL1Tvx88I/FdPPYaVL2o7Kw97DmLO/hPdbwSdOw7zXwPvc+YFL1/WNq8ed0IvYtaWDwYs+W8ezp2vGwGKzzDnwA9AtIyPErJ5LwQ7bK8WBZdPeriKjxM8oY7CVk9OliGUL3g2Le4jHr9PAewFDtG8Kq87+PJPALjW73EGu48iWEuPf3L87xwPdQ8A7qvvHYR5byKi5a8pb8yPZWzBj0SccU7A01gvW2CGj0bcQO7+EJJvQMBCLxzkD29AJfvvKGd2zy09WA9nBNePdVuhr3A+pK9XM6EvGmLEL2DPC09lfpGPXVS/LvuTaI7Yqy+vF4w77weQZI8Iiu/vB1XKL38jQM774gyvED1Gbzgap071mCzvF/BjT0vm8u8MRRWPdbjoDydRl08E7tePb0UQT0cKZm7V3/DvDf9Mj1yLre864Qbvcv8HzycMz49BI2+PHFhFz0li5u9TW0wvc4lNTtuqJs8/p43vfj8hzv08hw98kRHvRpqIbzFX368C+sQPezPQ73gHL88BDU/vN3+WL1XjLm8eS2tu4yVh7wjHoS8H+8zvfqn0jvDoW29IdVQvWpmvzxVtqs7amFpvcW8Izwhp9i8Xm0jPQyTJ7wgZJ08zvuYvHaXObtQZAK8EZkhvfMimLs53VK8sfGYPb3CML1W9ga7T0WkPWecQr1Z9qa70dy1PGvzqboOyR48wuO1PEKJ5byJIFy9p1f2O32QGjw63ky82LWJPAWp/byK9aE8+maZPM+1UzySIeK8DPCNvG85A7yzFKO8qpSXvZG0uTu8hKk8wkVfu4hItzyqRFA7jqQ6PXYsAj3tDvQ8quLgu09j+jw9/LA8qsLBufU5jL0DR8+7jVgYPT7iJL2CIdC8tIvXPIbj/jssSg29YcypPOd6QTz49Go9dHpvvSRgGby+mcM7d9YQvWD8rbxIFmu8vxEdvNcBjD2EMFW8lnVAvQb4tLzK09W8fn+YPLxP9rrMcsA7AXbiuVAaj7sY6ya85V82PaBAOjxec0g9GsGaPPU2Crv18uy80vsAvZRcqbyPpp+80PecvG0QjjwVJKK8Zm8TuGnDFb3GYWq7K6eVO19SzbvWiGM801VCPNjHZ72eZG09WPewu4OVlzzVA5E8Ra3xup+EBb2MDg69fcxGPGHhGz3Pqpk981O6PMoT6bxT75+8lIGQPA1KizzR0qu8GicRvd2B9rzvSY284e4LvaqtfTzt1q6841k3PfxuoD1lqzU8ejuLPfygdjzmRKO8aHAvvS0mlryyc9K8Oa16uxdVLD2wWLO8LPxaPRavOzqmY4O63tHxPNhO6jtoREI8zDB1vc0oFDyBV4c8UJ
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":97,"e":156,"m":1777173532465.9417,"t":"it(\"upload 应通过统一资源 command client 构造 FormData transport\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({ asset: { id: \"asset_upload_1\" } }),\n } as Response);\n const file = new File([\"content\"], \"demo.pdf\", { type: \"application/pdf\" });\n\n await uploadFileTreeResourceAsset({\n file,\n workspaceId: \"ws_1\",\n documentId: \"doc_1\",\n mindmapId: \"mind_1\",\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/media/upload\",\n expect.objectContaining({\n method: \"POST\",\n body: expect.any(FormData),\n }),\n );\n const body = fetchMock.mock.calls[0]?.[1]?.body as FormData;\n expect(body.get(\"file\")).toBe(file);\n expect(body.get(\"workspaceId\")).toBe(\"ws_1\");\n expect(body.get(\"documentId\")).toBe(\"doc_1\");\n expect(body.get(\"mindmapId\")).toBe(\"mind_1\");\n });\n\n it(\"internal drop preflight 应发送到 tree filetree drop route 并返回 Rust plan\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({\n plan: {\n copy: false,\n targetDocumentId: \"doc_target\",\n targetMindmapId: null,\n targetSubPath: null,\n rowIds: [\"doc:doc_1\"],\n docIds: [\"doc_1\"],\n topLevelDocIds: [\"doc_1\"],\n copyableAssetIds: [],\n sourceAssetDocumentIds: [],\n documentTransferPlan: {\n action: \"move\",\n targetParentId: \"doc_target\",\n documentIds: [\"doc_1\"],\n topLevelDocumentIds: [\"doc_1\"],\n copyItems: [{ documentId: \"doc_1\", recursive: true }],\n },\n resourceTransferPlan: null,\n },\n }),\n } as Response);\n\n const plan = await preflightFileTreeInternalDrop({\n workspaceId: \"ws_1\",\n copy: false,\n targetDocumentId: \"doc_target\",\n targetRowId: null,\n focusedRowId: null,","v":"ePtavNcy8jyS5CW+iwJhve+rfz2sxXi9KnTnu92ApLymdyy8nNUVvQXHSL0AMoo8rC24Pefy17sJ/tU8sMIwvftZyrsq7we9RR/nPGXzw7vgoOs5Mhi2vAzLnjsEADa8tQOKPb0v7zwbdEE93QfVO9Xrnr36vZ08xFWKPVVcpzvYtty85yaRu6nfuL1VtSm9sUrgPLMe5Lwj6m289HDeu9je4bw3FwO9Y9q3vLcSnLxaYz49ZqJlvJVWHj00oYg8DDZFPeQsfb34En87+L6XvDXi4bwR9KW8fkLuPc3kFT1U63G80YFAPMVAA72lowO9LbHYPPlwkz3zSUc9RIV5PdMgtj1Kci+9s40WvajGkj2YY4I85M+cPFDORz1qq5O6sYa8PPy3VL0lHc68Oi8xPFKgabzP6oy9Z7BkvXmJKz2J4a28twE8vE1YHT3DQKQ7NNKSPf/sAb36yq48zDHjPAFAf71Z8pI9ObrOPOscwby8MGK7U6+tvEyNEL0n3+G8SB93vbUGzzv3XXO726H8vD2NCL1AT/47G9V/PPltqTuVNNi8pgx4PZS5Bru0pBw8+uaAu0UjKL3lXz48A4tePXSS1bxukQK9XqrdPLtY0bzSLmU9a6QhvA5OI7yK07I86hKRvFVyC73KIo47hqwqPeM4QD2g+oE8qkyDvC6K2zz20Z88H5QyvQNcnbzX3ia98x0CvVU3Izxvh248eS3XPMfCTL0VdoW9hGyWu+n5xjwO2C081q0XPHn9Fb1yoZG8pT0ivFoVu7t8Dsc866aRvOoLQb2nrpO83BeEOa2w7juMmic8TqDCO7OfAz10InS9PUe/PNz2o7wHDJw8cd/sPGBxzDyHGg49H7mSvD8iIj2pOG28cWgQvZOx9TuHOZI91WeFPNGtPD1CVsu8TH9BvToahrzNz948GQ0jPYzPnbxYaHo8ezkCvdfdnTz/rwW9LQ+fPPV+XL3oQP08NoojPE4Grb2jh5i7QXQZvEYrIb1T6Mq71lsdvS63kDsw28K8f885vUr08jw6j9A7hCucva/AOD3ELj69YoL0PNHvtrwyQxk9MeoHPPR0c7pBETW7CZd5vYNc4jvCWSO9UHGXPQg3V7zwTS+9lT+pPbdFKb3mFww82W+NPA+noDwZ4xO6yTyCvEaxVbyeAGu9VeCxvNQ4HDwr0ZC8SZYlPYA3XLxOzUI7bx8OvPlfML08HUS9kkhePFViFr25SOu8jCqJvSxua7w0lAo9kBxpPFkvFT2kcR48gCXVPQEPNTxLqzg8+vQ0vL9og7spip06ZCgrvd8nh70fCaA8IcdaPF41PL0IzOO8H6pDuz1JVjz8bSM8P4EKvGLptzkCanU9jFakvIx8rLt/5048PcF1vPcfR70QUWG7TxliO7jFVj0mfV69hI//vOOIDDxFayy9JWBCPfAanjvCNiU8qyAfvCDkULxV/Yq88ukhPRHIx7xLQqo8VX2QukS8Aj3tCay8TeGtuj5odbzT1pA7pf8cvaFqBLuPcIW8nTN2PLIFfbsxg9Q85F3oO8aGGr2sJ8k7aLyjO4eDKL1eZkM9VFj/O+bjHT2rhyY9c44gvHNrQL0noye9KzOuPIyEBj2d9vI995siPR2MPbqmrKG7MVQePQ3/ljwVwQQ8ClhhuwyDR71GThy8oa2FvIxbVD2Enw28lbBEPfZKoT0dNCY8NuUxPKKrKjy9nGC8qh6KvFUzFr0vX+o8IMi5vDvp1DxT9hC9OX8dPf1PqLvoiEa8GlvePLsOyDw2B3g939EEvdk/47uKvv86/+74OqtB2DzbvxS8B86NPT3ayDzoDZy8UJ4wPd/KDDsqH4G8paiKO9lmjDsymLe8pI
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":145,"e":204,"m":1777173532465.9417,"t":"},\n resourceTransferPlan: null,\n },\n }),\n } as Response);\n\n const plan = await preflightFileTreeInternalDrop({\n workspaceId: \"ws_1\",\n copy: false,\n targetDocumentId: \"doc_target\",\n targetRowId: null,\n focusedRowId: null,\n activeDocumentId: null,\n rowIds: [\"doc:doc_1\"],\n rows: [],\n documentParents: [],\n });\n\n expect(plan.topLevelDocIds).toEqual([\"doc_1\"]);\n expect(plan.documentTransferPlan?.topLevelDocumentIds).toEqual([\"doc_1\"]);\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/filetree/drop-preflight\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n workspaceId: \"ws_1\",\n copy: false,\n targetDocumentId: \"doc_target\",\n targetRowId: null,\n focusedRowId: null,\n activeDocumentId: null,\n rowIds: [\"doc:doc_1\"],\n rows: [],\n documentParents: [],\n }),\n }),\n );\n });\n\n it(\"delete preflight 应发送到 tree filetree delete route 并返回 Rust plan\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({\n plan: {\n rowIds: [\"doc:doc_1\", \"asset:asset_1\"],\n docIds: [\"doc_1\"],\n assetIds: [\"asset_1\"],\n assetDocumentIds: [\"doc_other\"],\n },\n }),\n } as Response);\n\n const plan = await preflightFileTreeDelete({\n workspaceId: \"ws_1\",\n rowIds: [\"doc:doc_1\", \"asset:asset_1\"],\n rows: [],\n documentParents: [],\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":193,"e":252,"m":1777173532465.9417,"t":"assetDocumentIds: [\"doc_other\"],\n },\n }),\n } as Response);\n\n const plan = await preflightFileTreeDelete({\n workspaceId: \"ws_1\",\n rowIds: [\"doc:doc_1\", \"asset:asset_1\"],\n rows: [],\n documentParents: [],\n });\n\n expect(plan.docIds).toEqual([\"doc_1\"]);\n expect(plan.assetIds).toEqual([\"asset_1\"]);\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/filetree/delete-preflight\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n workspaceId: \"ws_1\",\n rowIds: [\"doc:doc_1\", \"asset:asset_1\"],\n rows: [],\n documentParents: [],\n }),\n }),\n );\n });\n\n it(\"paste preflight 应发送到 tree filetree paste route 并返回 Rust plan\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({\n plan: {\n targetDocumentId: \"doc_target\",\n targetMindmapId: \"mind_1\",\n targetSubPath: \"mindmaps/mind_1\",\n rowIds: [\"index:doc_1\", \"asset:asset_1\"],\n docItems: [{ documentId: \"doc_1\", recursive: false }],\n copyableAssetIds: [\"asset_1\"],\n resourceTransferPlan: {\n action: \"copy\",\n assetIds: [\"asset_1\"],\n targetDocumentId: \"doc_target\",\n targetSubPath: \"mindmaps/mind_1\",\n },\n },\n }),\n } as Response);\n\n const plan = await preflightFileTreePaste({\n workspaceId: \"ws_1\",\n targetDocumentId: null,\n focusedRowId: \"asset-folder:mind_1\",\n activeDocumentId: \"doc_active\",\n rowIds: [\"index:doc_1\", \"asset:asset_1\"],\n rows: [],\n });\n\n expect(plan.docItems).toEqual([{ documentId: \"doc_1\", recursive: false }]);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":241,"e":300,"m":1777173532465.9417,"t":"} as Response);\n\n const plan = await preflightFileTreePaste({\n workspaceId: \"ws_1\",\n targetDocumentId: null,\n focusedRowId: \"asset-folder:mind_1\",\n activeDocumentId: \"doc_active\",\n rowIds: [\"index:doc_1\", \"asset:asset_1\"],\n rows: [],\n });\n\n expect(plan.docItems).toEqual([{ documentId: \"doc_1\", recursive: false }]);\n expect(plan.resourceTransferPlan?.targetSubPath).toBe(\"mindmaps/mind_1\");\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/filetree/paste-preflight\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n workspaceId: \"ws_1\",\n targetDocumentId: null,\n focusedRowId: \"asset-folder:mind_1\",\n activeDocumentId: \"doc_active\",\n rowIds: [\"index:doc_1\", \"asset:asset_1\"],\n rows: [],\n }),\n }),\n );\n });\n\n it(\"upload target preflight 应发送到 tree filetree upload-target route 并返回 Rust plan\", async () => {\n const fetchMock = vi.spyOn(globalThis, \"fetch\").mockResolvedValue({\n ok: true,\n json: async () => ({\n plan: {\n workspaceId: \"ws_1\",\n targetDocumentId: \"doc_target\",\n targetMindmapId: \"mind_1\",\n targetSubPath: \"mindmaps/mind_1\",\n },\n }),\n } as Response);\n\n const plan = await preflightFileTreeUploadTarget({\n workspaceId: \"ws_fallback\",\n targetDocumentId: null,\n targetRowId: \"asset:asset_child_1\",\n focusedRowId: null,\n activeDocumentId: \"doc_active\",\n rows: [],\n documentWorkspaces: [{ documentId: \"doc_target\", workspaceId: \"ws_1\" }],\n });\n\n expect(plan).toEqual({\n workspaceId: \"ws_1\",\n targetDocumentId: \"doc_target\",\n targetMindmapId: \"mind_1\",\n targetSubPath: \"mindmaps/mind_1\",\n });\n expect(fetchMock).toHaveBeenCalledWith(","v":"w8C9vMpBaLwCGBG+WJqZva80Bz2Mc6m9ShLIvPdDCjwvRPU6oPutvQwYP703bn89F/fpPbXKVzzutNG8KYNavOPcjbwsRdK8fu9sPdxuqLw9hHc8AgoQvcgKobp9QyE7hyxVPS66LD06G/M7ttuCvCSVgL3F6gM9c4tuPYlHVz3fMS489esVvXil2r2oloa9IXHnO0sOIb30uKS8lVc7vdyFx7yg9AS9iodmur9oiry+Fow9YKu6vBX0xT1AgfA8bPN5PU8OHb2lIiu828ZlPUgHhLmkO9u8S8H0PaoYHT1JqjY8t7aoOjZww7yoFCo70XNbPQbIHj2YQy07qbR2PSbunD2l4PO8l6FZvbEDID08Dww8E4MaO69dvz2pSvk8lMpzuwZuabxTLDu8Q/YwPQsVCL1rK/+8CQFxvcwNST2L/Ly8I9zou0fsZzzeKf08AubbPGEPKr0lEP88mfUNvdu8lLy2aF49ovWxPPsJ3TxBvVy8acd7vJP/EL3pVk28ec2cvG1GCjxKwBy9WohSvZs+DLyOcgE99lQjOpkbljvrNXe7jHsZPUg6SjwrGdy7CXIzvObvNb2fv5s8i3pRPZ9hF735QYu9Wpw5vM3BfL0vkQw9eLjxOxwI2jvOeOA8quyRvF3JPr1APiM9CfaSPSYzlzxxWz661/fXuwseoTy0zBu85wb5vHVFfbtNjMa8UClIvf6PIj1WZxY9oREPPPIPSr1S1C29GWLkO//cGjzIOqs84pEbPf/BOL3zLR+9CvgkvTAhHr3NN9w8COPavH5YG71ZRfi7/rcPvWA8ojsnrkG6XCD3uatynDxJLM+8XfsvPftHRbyTMfY8M4elPCxpUT0IUxI9//Y8vCaQEz1/+g69zFpqvZNDLD2YYAw9XQuzPAjmBjxrJry8ttwFvf0spLv9Wgu7N0HMvIgSILsV+hg9AeVcvCEQfDxAEZ68hpnkPIFGVL3ECR08k27ePAsLmL12IMS8Du6VvAhZFr2rhq28onnWvLsNDbyUwzG9bhMuvQXSbjzKrp08tKdBvdCqfTynQhK9Qa7SPGkOETzoi1A9TjHZu6EoSrw/ywE9U/x3vfxe2Tyd5OW7KDpJPY6vkTqM9F4873S4PcSRvbwlHTo8RmpjPKi6I7tZMPa62v8YOyUdzrwwCKS9ZTloOvILEz0DVne9q4O0PLpxjjzOu9s8oJ/CPLp6VTw0y2+9UfxpucCt5ryQeA69s/6GvR8emzxAg0Y92WV8OxpdyTyjyzM6CDVaPWv0Ij0lXCe6UPPQPHNigzw407M8EZcWPIhHYb0TAY2688BlPK5KCb3wNtm8DKryPDuKTDwPsSk8fKGiuz6PqTxPusU8FPBMvb3ExrucQRm8MCivvFU+mr2OBp48DlTkPC05ZT2ySS29GrBbvT/6q7wHvSq9VTsIO/sWHTvxOzq8+gK3vGeDJThPdCs9ExHfPP+CvDy0wtA7nLXyu2LqKj1nutK6NJ0NPXIYWL0QLAI8BbGivKL86zx/CDq9uGs8PMxIXrySyJk8Wj87PIRGIb3xt464bKydPCn3jLyciIw92WtaPKpQ5TlCmQM9OFIHO4Mc2byWTjq9BNnbukjqgT0kob09gCgVPXX9N71E+Lu8W2s7PBq6b7wFciC8vv7ivIICmbxxnGO9zyKdvPngiLwU3Qe8D6WaPA9z7zxisJ48ndMsPdfIFrxpIx+9MoSQu+5GAr3Vq5s8JiUavVYo7DwPmXm81dHhPDnfEDwyS9w73tp+PFV+ITyIPxs8yLMJvfxNrLxsR9681UdMPMT/5zxNch08FX2ZPcp/rryabS29cFVbPWn3wroQg6a8ul8IPB1g2rx0bWW84r65PUHoazzbwyO9Pjqdudb/T71o30q7tHAFPGuq0Dul4tE8TKpkPQSxLLsQc4g8fk3APPiogTz8DbA83y
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.test.ts","s":289,"e":318,"m":1777173532465.9417,"t":"activeDocumentId: \"doc_active\",\n rows: [],\n documentWorkspaces: [{ documentId: \"doc_target\", workspaceId: \"ws_1\" }],\n });\n\n expect(plan).toEqual({\n workspaceId: \"ws_1\",\n targetDocumentId: \"doc_target\",\n targetMindmapId: \"mind_1\",\n targetSubPath: \"mindmaps/mind_1\",\n });\n expect(fetchMock).toHaveBeenCalledWith(\n \"/api/tree/filetree/upload-target-preflight\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n workspaceId: \"ws_fallback\",\n targetDocumentId: null,\n targetRowId: \"asset:asset_child_1\",\n focusedRowId: null,\n activeDocumentId: \"doc_active\",\n rows: [],\n documentWorkspaces: [{ documentId: \"doc_target\", workspaceId: \"ws_1\" }],\n }),\n }),\n );\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":1,"e":60,"m":1778802816694.9639,"t":"\"use client\";\n\nimport type { MediaAsset } from \"@/types/media\";\nimport type {\n FileTreeShellDeletePreflightPayload,\n FileTreeShellInternalDropPreflightPayload,\n FileTreeShellPastePreflightPayload,\n FileTreeShellUploadTargetPreflightPayload,\n} from \"@/lib/file-tree/shell\";\n\ntype ResourceCommandAction = \"copy\" | \"move\" | \"rename\" | \"delete\" | \"restore\";\n\ntype ResourceCommandErrorPayload = {\n error?: string;\n};\n\ntype ResourceCommandResponse = {\n ok?: boolean;\n items?: MediaAsset[];\n asset?: MediaAsset;\n};\n\ntype TransferResourceAssetsInput = {\n assetIds: readonly string[];\n targetDocumentId: string;\n targetSubPath?: string | null;\n};\n\ntype RenameResourceAssetInput = {\n assetId: string;\n newName: string;\n};\n\ntype UploadResourceAssetInput = {\n file: File;\n workspaceId: string;\n documentId: string;\n mindmapId?: string | null;\n};\n\nexport type FileTreeInternalDropPreflightPlan = {\n allowed?: boolean;\n blockedReason?: string | null;\n requiresConfirmation?: boolean;\n conflicts?: Array<{\n rowKind: string;\n sourceRowId: string;\n sourceDocumentId: string | null;\n sourceAssetId: string | null;\n existingDocumentId: string | null;\n existingAssetId: string | null;\n targetDocumentId: string;\n title: string;\n policy: string;\n }>;\n copy: boolean;\n targetDocumentId: string;\n targetMindmapId: string | null;\n targetSubPath?: string | null;\n rowIds: string[];","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":49,"e":108,"m":1778802816694.9639,"t":"sourceAssetId: string | null;\n existingDocumentId: string | null;\n existingAssetId: string | null;\n targetDocumentId: string;\n title: string;\n policy: string;\n }>;\n copy: boolean;\n targetDocumentId: string;\n targetMindmapId: string | null;\n targetSubPath?: string | null;\n rowIds: string[];\n docIds: string[];\n topLevelDocIds: string[];\n copyableAssetIds: string[];\n sourceAssetDocumentIds: string[];\n documentTransferPlan?: {\n action: \"copy\" | \"move\";\n targetParentId: string;\n documentIds: string[];\n topLevelDocumentIds: string[];\n copyItems: Array<{ documentId: string; recursive: boolean }>;\n } | null;\n resourceTransferPlan?: {\n action: \"copy\" | \"move\";\n assetIds: string[];\n targetDocumentId: string;\n targetSubPath?: string | null;\n } | null;\n};\n\ntype FileTreeInternalDropPreflightResponse = {\n plan?: FileTreeInternalDropPreflightPlan;\n};\n\nexport type FileTreeDeletePreflightPlan = {\n rowIds: string[];\n docIds: string[];\n assetIds: string[];\n assetDocumentIds: string[];\n};\n\ntype FileTreeDeletePreflightResponse = {\n plan?: FileTreeDeletePreflightPlan;\n};\n\nexport type FileTreePastePreflightPlan = {\n targetDocumentId: string;\n targetMindmapId: string | null;\n targetSubPath?: string | null;\n rowIds: string[];\n docItems: Array<{ documentId: string; recursive: boolean }>;\n copyableAssetIds: string[];\n resourceTransferPlan?: {\n action: \"copy\";\n assetIds: string[];\n targetDocumentId: string;\n targetSubPath?: string | null;\n } | null;\n};","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":97,"e":156,"m":1778802816694.9639,"t":"targetMindmapId: string | null;\n targetSubPath?: string | null;\n rowIds: string[];\n docItems: Array<{ documentId: string; recursive: boolean }>;\n copyableAssetIds: string[];\n resourceTransferPlan?: {\n action: \"copy\";\n assetIds: string[];\n targetDocumentId: string;\n targetSubPath?: string | null;\n } | null;\n};\n\ntype FileTreePastePreflightResponse = {\n plan?: FileTreePastePreflightPlan;\n};\n\nexport type FileTreeUploadTargetPreflightPlan = {\n workspaceId: string;\n targetDocumentId: string;\n targetMindmapId: string | null;\n targetSubPath?: string | null;\n};\n\ntype FileTreeUploadTargetPreflightResponse = {\n plan?: FileTreeUploadTargetPreflightPlan;\n};\n\nfunction normalizeAssetIds(assetIds: readonly string[]): string[] {\n return Array.from(\n new Set(\n assetIds\n .map((assetId) => (typeof assetId === \"string\" ? assetId.trim() : \"\"))\n .filter(Boolean),\n ),\n );\n}\n\nasync function postResourceCommand<TResult>(\n payload: Record<string, unknown>,\n fallbackMessage: string,\n path = \"/api/media/batch\",\n): Promise<TResult> {\n const response = await fetch(path, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const body = (await response.json().catch(() => null)) as\n | TResult\n | ResourceCommandErrorPayload\n | null;\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body && typeof body.error === \"string\"\n ? body.error\n : fallbackMessage;\n throw new Error(message);\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":145,"e":204,"m":1778802816694.9639,"t":"const body = (await response.json().catch(() => null)) as\n | TResult\n | ResourceCommandErrorPayload\n | null;\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body && typeof body.error === \"string\"\n ? body.error\n : fallbackMessage;\n throw new Error(message);\n }\n\n return body as TResult;\n}\n\nasync function postResourceForm<TResult>(\n path: string,\n formData: FormData,\n fallbackMessage: string,\n): Promise<TResult> {\n const response = await fetch(path, {\n method: \"POST\",\n body: formData,\n });\n\n const body = (await response.json().catch(() => null)) as\n | TResult\n | ResourceCommandErrorPayload\n | null;\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body && typeof body.error === \"string\"\n ? body.error\n : fallbackMessage;\n throw new Error(message);\n }\n\n return body as TResult;\n}\n\nfunction buildTransferPayload(\n action: Extract<ResourceCommandAction, \"copy\" | \"move\">,\n input: TransferResourceAssetsInput,\n) {\n const payload: Record<string, unknown> = {\n action,\n assetIds: normalizeAssetIds(input.assetIds),\n targetDocumentId: input.targetDocumentId,\n };\n const targetSubPath = input.targetSubPath?.trim();\n if (targetSubPath) {\n payload.targetSubPath = targetSubPath;\n }\n return payload;\n}\n\nexport async function copyFileTreeResourceAssets(\n input: TransferResourceAssetsInput,\n): Promise<ResourceCommandResponse> {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":193,"e":252,"m":1778802816694.9639,"t":"targetDocumentId: input.targetDocumentId,\n };\n const targetSubPath = input.targetSubPath?.trim();\n if (targetSubPath) {\n payload.targetSubPath = targetSubPath;\n }\n return payload;\n}\n\nexport async function copyFileTreeResourceAssets(\n input: TransferResourceAssetsInput,\n): Promise<ResourceCommandResponse> {\n return postResourceCommand<ResourceCommandResponse>(\n buildTransferPayload(\"copy\", input),\n \"复制附件失败\",\n );\n}\n\nexport async function moveFileTreeResourceAssets(\n input: TransferResourceAssetsInput,\n): Promise<ResourceCommandResponse> {\n return postResourceCommand<ResourceCommandResponse>(\n buildTransferPayload(\"move\", input),\n \"移动附件失败\",\n );\n}\n\nexport async function renameFileTreeResourceAsset(\n input: RenameResourceAssetInput,\n): Promise<ResourceCommandResponse> {\n return postResourceCommand<ResourceCommandResponse>(\n {\n action: \"rename\",\n assetIds: normalizeAssetIds([input.assetId]),\n newName: input.newName,\n },\n \"重命名失败\",\n );\n}\n\nexport async function deleteFileTreeResourceAssets(\n assetIds: readonly string[],\n): Promise<ResourceCommandResponse> {\n return postResourceCommand<ResourceCommandResponse>(\n {\n action: \"delete\",\n assetIds: normalizeAssetIds(assetIds),\n },\n \"删除失败\",\n );\n}\n\nexport async function restoreFileTreeResourceAssets(\n assetIds: readonly string[],\n): Promise<ResourceCommandResponse> {\n return postResourceCommand<ResourceCommandResponse>(\n {\n action: \"restore\",\n assetIds: normalizeAssetIds(assetIds),\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":241,"e":300,"m":1778802816694.9639,"t":"\"删除失败\",\n );\n}\n\nexport async function restoreFileTreeResourceAssets(\n assetIds: readonly string[],\n): Promise<ResourceCommandResponse> {\n return postResourceCommand<ResourceCommandResponse>(\n {\n action: \"restore\",\n assetIds: normalizeAssetIds(assetIds),\n },\n \"恢复附件失败,请稍后再试\",\n );\n}\n\nexport async function uploadFileTreeResourceAsset(\n input: UploadResourceAssetInput,\n): Promise<ResourceCommandResponse> {\n const formData = new FormData();\n formData.append(\"file\", input.file);\n formData.append(\"workspaceId\", input.workspaceId);\n formData.append(\"documentId\", input.documentId);\n const mindmapId = input.mindmapId?.trim();\n if (mindmapId) {\n formData.append(\"mindmapId\", mindmapId);\n }\n return postResourceForm<ResourceCommandResponse>(\n \"/api/media/upload\",\n formData,\n \"上传失败\",\n );\n}\n\nexport async function preflightFileTreeInternalDrop(\n input: FileTreeShellInternalDropPreflightPayload,\n): Promise<FileTreeInternalDropPreflightPlan> {\n const response = await postResourceCommand<FileTreeInternalDropPreflightResponse>(\n input,\n \"文件树拖放预检失败\",\n \"/api/tree/filetree/drop-preflight\",\n );\n if (!response.plan) {\n throw new Error(\"文件树拖放预检失败\");\n }\n return response.plan;\n}\n\nexport async function preflightFileTreeDelete(\n input: FileTreeShellDeletePreflightPayload,\n): Promise<FileTreeDeletePreflightPlan> {\n const response = await postResourceCommand<FileTreeDeletePreflightResponse>(\n input,\n \"文件树删除预检失败\",\n \"/api/tree/filetree/delete-preflight\",\n );\n if (!response.plan) {\n throw new Error(\"文件树删除预检失败\");\n }\n return response.plan;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/resource-command-client.ts","s":289,"e":330,"m":1778802816694.9639,"t":"export async function preflightFileTreeDelete(\n input: FileTreeShellDeletePreflightPayload,\n): Promise<FileTreeDeletePreflightPlan> {\n const response = await postResourceCommand<FileTreeDeletePreflightResponse>(\n input,\n \"文件树删除预检失败\",\n \"/api/tree/filetree/delete-preflight\",\n );\n if (!response.plan) {\n throw new Error(\"文件树删除预检失败\");\n }\n return response.plan;\n}\n\nexport async function preflightFileTreePaste(\n input: FileTreeShellPastePreflightPayload,\n): Promise<FileTreePastePreflightPlan> {\n const response = await postResourceCommand<FileTreePastePreflightResponse>(\n input,\n \"文件树粘贴预检失败\",\n \"/api/tree/filetree/paste-preflight\",\n );\n if (!response.plan) {\n throw new Error(\"文件树粘贴预检失败\");\n }\n return response.plan;\n}\n\nexport async function preflightFileTreeUploadTarget(\n input: FileTreeShellUploadTargetPreflightPayload,\n): Promise<FileTreeUploadTargetPreflightPlan> {\n const response = await postResourceCommand<FileTreeUploadTargetPreflightResponse>(\n input,\n \"文件树上传目标预检失败\",\n \"/api/tree/filetree/upload-target-preflight\",\n );\n if (!response.plan) {\n throw new Error(\"文件树上传目标预检失败\");\n }\n return response.plan;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":1,"e":60,"m":1778081169468.3005,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildVisibleRows } from \"./rows\";\nimport { parseFileTreeRowId } from \"./types\";\n\ndescribe(\"buildVisibleRows\", () => {\n it(\"缺少 kernel file_tree items 时不再回退 pageRows + assets 重建对象语义\", () => {\n const a = {\n access_scope: \"private\" as const,\n id: \"a\",\n workspace_id: \"w\",\n title: \"A\",\n parent_id: null,\n sort_order: 0,\n is_starred: null,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [\n {\n access_scope: \"private\" as const,\n id: \"b\",\n workspace_id: \"w\",\n title: \"B\",\n parent_id: \"a\",\n sort_order: 0,\n is_starred: null,\n is_template: false,\n created_at: \"\",\n updated_at: null,\n children: [],\n },\n ],\n };\n\n const rows = buildVisibleRows({\n pageRows: [\n {\n nodeId: a.id,\n parentNodeId: null,\n depth: 0,\n childCount: 1,\n position: 0,\n title: a.title,\n node: a,\n },\n ],\n expanded: new Set([\"a\"]),\n assetsByDoc: {\n a: [\n {\n id: \"x\",\n workspace_id: \"w\",\n document_id: \"a\",\n asset_type: \"file\",\n file_url: null,\n thumbnail_url: null,\n bucket: \"workspace\",\n storage_path: \"x\",\n file_name: \"x.png\",\n file_size: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":49,"e":108,"m":1778081169468.3005,"t":"a: [\n {\n id: \"x\",\n workspace_id: \"w\",\n document_id: \"a\",\n asset_type: \"file\",\n file_url: null,\n thumbnail_url: null,\n bucket: \"workspace\",\n storage_path: \"x\",\n file_name: \"x.png\",\n file_size: null,\n mime_type: \"image/png\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"\",\n updated_at: \"\",\n },\n {\n id: \"y\",\n workspace_id: \"w\",\n document_id: \"a\",\n asset_type: \"file\",\n file_url: null,\n thumbnail_url: null,\n bucket: \"workspace\",\n storage_path: \"y\",\n file_name: \"y.pdf\",\n file_size: null,\n mime_type: \"application/pdf\",\n ocr_payload: undefined,\n ocr_strategy: null,\n ocr_text: null,\n ocr_status: null,\n signed_url: null,\n created_at: \"\",\n updated_at: \"\",\n },\n ],\n },\n });\n\n expect(rows).toEqual([]);\n });\n\n it(\"优先消费 Rust file_tree projection 并保留 index 与资源文件夹语义\", () => {\n const rows = buildVisibleRows({\n fileTreeItems: [\n {\n rowId: \"doc:page_root\",\n rowKind: \"document\",\n nodeId: \"page_root\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"根页面\",\n depth: 0,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":97,"e":156,"m":1778081169468.3005,"t":"it(\"优先消费 Rust file_tree projection 并保留 index 与资源文件夹语义\", () => {\n const rows = buildVisibleRows({\n fileTreeItems: [\n {\n rowId: \"doc:page_root\",\n rowKind: \"document\",\n nodeId: \"page_root\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"根页面\",\n depth: 0,\n position: 0,\n childCount: 4,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\"expand\", \"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"page_root\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1/documents/page_root\",\n relativePath: \"documents/page_root\",\n storageIdentity: \"page_root\",\n operationProfile: \"convex_workspace\",\n },\n },\n },\n iconHint: \"page\",\n },\n {\n rowId: \"index:page_root\",\n rowKind: \"index\",\n nodeId: \"index:page_root\",\n parentNodeId: \"page_root\",\n nodeType: \"index\",\n projectionKind: \"file_tree\",\n title: \"index.md\",\n depth: 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"page_root\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1/documents/page_root/index\",\n relativePath: \"documents/page_root/index\",\n storageIdentity: \"page_root:index\",\n operationProfile: \"convex_workspace\",","v":"7GCFPan8eT2c7wm+HYSSvevojDzWJVG9uFCCveynBT3Tkji94QAZvZKNIjqgdno8uLm3PQ6EHbzaqDs98FEkvc1el7xU2c+8GpL2PKpyYTtU5vy8bmfjvB7HRb3AiWA7G60ZPbZMrD0H6Rq8x73NuxB3Cr1BEUg9Rj1EPW5CWD1LMNm8PIsoO1kKsL2rADO9gOslPbCB5TuBD088tI4NPYsAkrtFoz+9Ul6EO/DOTr0Es1K6YNZCvU8yhT35ArQ8nySePaRtg70MsIC8sTqsvJunxjyj5R67OqSnPZfIgD0iCZy9LV/hu5608DzmIV+95p0NO+zZEj0Peqq7CPrYPenSPj1Lnwe9YdlevV52+TzpBAS8/46IPJBSiz1iJxM9eiEvPHWREr35NJ29OoYdPX+NJb3q3Fe9GvdyvS0oJD0AW0a8yckYvWZ2pjzRYXw86zuGPVhlijzNkII8K+KLvKhJ7LxL8Bc9aMIHPSmOfLyExeQ6Jo56PcTtCL3A6KY8HHYHufNlcryaLtG8SOTBvJW227wt9hQ9HGwBPR+dHLnFCKE8uBfHPcq/VDzW9ie9jgZfvJz10Lw5ZCm7XKG4PGKMPb0tP7K9DyUQPKP5Fr3pP649UdGLvNwN7rt3JtA84wCtvGoNjLvkwfo8yQK4PfxnBj2B3wg9NS3jvIoBAzxfmhA91QpYva9vqbxQJ1i7YlYkvB1YuzxfZog91pxNPQR6m736nJy8OjRbuy/FBjuGqq685oSbOx8+BL0u7Lq82g+mPC19L721t/s80pTBOgT45rwzFqS8s4Q1vQOtSj3UcGa9viigPIBvHz1lUfy82MIoPfWvFLyyR8Q82AxPPDN22jwLZ708bICiu1kRgD3EFCO9Vw1WvRupBD1+tBQ9Z0T9OxJwiLs7UAC99HccvUhohjz63Ks7QgCCvPebCruFoUQ9pPEgvO0UXTzAVSG8LC3vuxAqFryvjyQ9oYQxPHw+GL0lEzG8KJVWPDD9YLxm8rS8UkIlvaPi/Ls257G7xtWFvJ6NIz37NU68sLpUvbDvlz1m+U29RUSxPADMO70Xet68lHMYvNlQk7yMmHE8sM6NvWU5oTwReDC9F1xGPcV4q7xcSfY8T91VPaue4rxtjnS7w14ePY0gzLxs0La7BdbQu9ycp7x+mJC9nAPjO099zjvH/Ei9MxTCO2Z4jD2HAJ88DUR5vBBeI7zxeCw7z6kjPSwwRDy93aK9YTG0vQd/3Ty9a0k9DaIivOJTwzwaNh89vX7APS95wbwYxlk9ZAEhvL+Zm7xCGxa8mI8cvV3PNLxYDrM8yVDmPHYVfb3Bnmw7kt44Ow66XDz67cc8+2X4PIrjlz30Nmg9VAvuvAIu0rzrB3S8rdc3vFv4ML2bDAo9li98PEQcND3m7Sq9Ch8Mva26Kr099BK9ZpJiul9KtjwD7ik8TZUoPYgPoTxFJ6q6C4tWPMnmjLzBu747bBbEO9yHkzwuQxa9jzBnvIoXHb3cpaq7PXoDveenkzybbFa9OTKWPB0Bkrz04KQ8j2UIPa8/HLzcclU7WuOAvBGDCb3qgSE9bKMBPSfF0Tw/Hps8+dwEvNSLYbuesqu7ZzexvIsgWj18fKQ9XlYRPTPNhLp9sHm9qDqcPQAaNryTYJi8BnGhO9MvvbwRtDK9JgtGvGLLUj3BlJy8hjEEPXa2Tj3I/mQ86Y8iPZGCszvF/CS9TC1SvZAtirzchRu8bQgmvZyi4TwfpYe8Ec4+PZjzMzzH+O+8FkBnuRXLwzxm8gY8ymLNvDr7ybz18pW7FnoyP
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":145,"e":204,"m":1778081169468.3005,"t":"resourceMeta: {\n resourceKind: \"index\",\n documentId: \"page_root\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1/documents/page_root/index\",\n relativePath: \"documents/page_root/index\",\n storageIdentity: \"page_root:index\",\n operationProfile: \"convex_workspace\",\n },\n },\n },\n iconHint: \"index\",\n },\n {\n rowId: \"asset-folder:mind_1\",\n rowKind: \"asset_folder\",\n nodeId: \"asset-folder:mind_1\",\n parentNodeId: \"page_root\",\n nodeType: \"mindmap\",\n projectionKind: \"file_tree\",\n title: \"头脑风暴\",\n depth: 1,\n position: 1,\n childCount: 1,\n expandable: true,\n expandedByDefault: false,\n capabilities: [\"expand\", \"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"mindmap\",\n documentId: \"page_root\",\n assetId: \"mind_1\",\n workspaceId: \"ws_1\",\n assetKind: \"mindmap\",\n iconHint: \"mindmap\",\n extra: {\n source: {\n sourceKind: \"local_folder\",\n sourceUri: \"file:///workspace/ws_1/page_root/mindmap.json\",\n relativePath: \"page_root/mindmap.json\",\n storageIdentity: \"mind_1\",\n operationProfile: \"local_readonly\",\n },\n },\n },\n iconHint: \"mindmap\",\n },\n {\n rowId: \"asset:asset_child_1\",\n rowKind: \"asset\",\n nodeId: \"asset:asset_child_1\",\n parentNodeId: \"asset-folder:mind_1\",\n nodeType: \"asset\",\n projectionKind: \"file_tree\",\n title: \"节点图片.png\",\n depth: 2,\n position: 0,","v":"3jYfPdXAaT1frvO9x7SUvWvxtzz/Wjm9YrqnvM0hCjxMmYM7E1uMvPeD/juUCB68OOGiPUCMELwJ5hM93wxvOyQBMb0anC+9aMNaPSjzMLzqO1m9T8tVvVqys7siJz47xYj4PCQeiz1wbeC8nHekvEDoQL3y+YY95zATPIXVhTwn8Pm7aEDPvP92Mr1AwnG8/MAZPXOVxrztfbQ8NtY3PT/OxLy61qW7IJrNvP55Tr0TBQu9e3MfvV8qgzw2KLA8TqfkPSLMdbxHEWq8CLZpPJwAQj1fsig84MDYPRPFvDxfgAa9i4FEPXL7jT0ZmtG8y3/RPHwZYD1Tpyo9wl3JPdkMjT1frjK85+3GvI/aIj0NEte8oPlHPChuZT0MV7A8EdCDvL49VrxdthO9QaqZPC4vAzyuhVK84O0SvWABUzwxkoy8JmdOvLpIKTz9g6O8YfObPWxZdzxOdKq87lM5vAFyA71W8gI9HDnAPKYEZbz/wc474z55PbBkgr2cvkq8TbKdPESJgrwzu5y94lexvGcNiLzH9zA9qXAhPPHbpDutstU8wUybPe5QlLwzrwa94eqTOyDwW7wdFcM8SjgBuwFhyrxsxl29dxhxOo2eKL1GKZg9kXuUvDS30ryk6gE9CU4MvUi3uTxWbfI83Z5GPdTYaz1cfg09cV0CPJY9HL2om2w9r9iqvEQSDL1zZhW9N2xwvRRhKj3utg89dcJfPVjEjr0Yl8K8Q5dZvEjWBbzkjFC9EAn+PM78uLyq9+q8X/UTuxv+Fb3MRCc9fwAKvbJucr2qBqG7jLrvvHdMVzwKMmy9uyV+PINIIz3Ygzi9NhMyPWT6PTwJYkc9INIGOTul8DxLa8k8jdgzvIPjPD03DWQ8uOOOvW2sdj3Ch5M8gElePNafkblHSkm8F9WrvbI4cby2exA9B0ZYvUO/qTwpm+Q9c69gPKKbdjwYE2m8OxeXPBbZFbx4SfM7J9pGvBZkyLwANIi8lY1AvF1Z+Lw1vk69GbRCve/Spbzej/g7jNGJu5klHD23WZK8dBKpvQzsjj3rxGu98CGgvDr4lbwmM1u7SoEhPMxi27wfr+w8F5XrvDemfjx42Qa85Mb7PLfT77nbfUw99Yl4PYGCXjxkFws7F5zZPLQLoTyCz408XyYiu/ZHG71GN/q8ctT4vPKGsjxk9sG8UAvwO1/wzjxQz109IxgUPLdizrwlF6i8LtjVO91K2jyNYaa9rm3Rvf9qKz16opc7LsFpvadxwbuB+De8wzmoPe9yazqbl2Y9ii/2PPlMt7zuqGi9lAWMPFro+jt/qxU8So3aO6vFmr07tqM7lTA5PcYbyTubsog8/PcAPSEyqTxhAJE9OSjkvJHc4zoIFSO8Vwc+vHB5bL3C/rs6CFwlPf1hEz3hpCK9TLGdvE1eBrsoS0y9woXevF8npDzt6pc89ouDPfyklTwn5x69netlPXk6Cr1XsPU8TTYuPDJtxzxGVAe9dDAZPAZA3LzudUw88EPMvIG6ljwGqgu9gup1PCTipbx59w89vM9wPd0nF72pLv48RwB3PNNzYry+tiq8rlyhPF9dwrxtVgA9HBN5uywl87tSD/o78MmUPKyAjz0erYE9wNPsPDRrc7yjGW+9LUJ1PTOtc7vWz9O83xgzPIjHFz0BtUe9YazfvNKc6jwFLR88yb0oPXVihTxSWre8nBM1PaIXHr2HxXK8yPLFvNGRi7wOXPe7TBkPvVx/fzxNMEu9BdqtPG7+4TwCXh29lN/1OZAGajxSzwk9d2nOvMYI4rwcZw48A+RhPCQm6jzqyRY9gKDSPFRkHT3gLaG8LL4uPb+p8rx67WS8DKGAvPTJsrzqBZ068eUDPafXWj3kNK682u
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":193,"e":252,"m":1778081169468.3005,"t":"iconHint: \"mindmap\",\n },\n {\n rowId: \"asset:asset_child_1\",\n rowKind: \"asset\",\n nodeId: \"asset:asset_child_1\",\n parentNodeId: \"asset-folder:mind_1\",\n nodeType: \"asset\",\n projectionKind: \"file_tree\",\n title: \"节点图片.png\",\n depth: 2,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"asset\",\n documentId: \"page_root\",\n assetId: \"asset_child_1\",\n workspaceId: \"ws_1\",\n assetKind: \"image\",\n iconHint: \"image\",\n extra: {\n source: {\n sourceKind: \"local_folder\",\n sourceUri: \"file:///workspace/ws_1/page_root/assets/node.png\",\n relativePath: \"page_root/assets/node.png\",\n storageIdentity: \"asset_child_1\",\n operationProfile: \"local_readonly\",\n },\n },\n },\n iconHint: \"image\",\n },\n {\n rowId: \"asset:table_1\",\n rowKind: \"asset\",\n nodeId: \"asset:table_1\",\n parentNodeId: \"page_root\",\n nodeType: \"table\",\n projectionKind: \"file_tree\",\n title: \"预算.luckysheet\",\n depth: 1,\n position: 2,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"table\",\n documentId: \"page_root\",\n assetId: \"table_1\",\n workspaceId: \"ws_1\",\n assetKind: \"table\",\n iconHint: \"table\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1/assets/table_1\",","v":"OH83PYt/fD1Hlu69L/+BvdxpQD3tdpi8BP0AvPM0K7tjugG6WTiHvAIfXDyJ4ca8gDm9PelNmDxgyFW8WwopPVIdKL1AT4290LMBPcnSL7w2Fv28ZHFSvUskYD3RlD08UnoAPR7TiT33Pf26NRWNvKQcbb1Bh2s9ROsIPadUP7wLkvG8DGgZvdFNJL0nuu+8Pf+uPTzPQbzfQG098ucwPQ8m17xym307HoRavbN8K73CAmG6OxyFu8OA+jyHnka6CfqkPXC31rrqOX08GLwEOlV1nj0Yv+E7H/TtPeF2AD25/wg7Db6RPJVrBj060iK9Iy9iPeRlvTz/G7I8aXyzPTN9gj2wh248f48svTUAlztD3fC8peucPE3Mjz3QgQu89Q+OvFy0u7vNczW9VgAVvAOYCTyaw5G8RLtdvZFppzxcWh46trsbvBuXyTwks6S8Y1poPfJWijw0GT285Y4FvXm/AL2KA5A9e1oMPfaFHzwlYWi7O1JcPMm1gL1ff868rXeEO5B7hDzf1hW9vhUSPJzh37yWVia7k+C8u1q5VjxWGIw8JIYkPREcQ71YZ4i8uLHAO3eTh7zt27Q8ptRRvR4SZ7zWbJi89nnBvJ3qhb0wAD09jVXCugMZlDuHsDo9a62kuy8oqrsp/VE9vmSmPPQ66zzh/zQ9XRwjvA83Gb3ktQ89oC4tvPcr3bzLBo47i83GvMkh2TwnDHW6bR9CPdkCNb054Iu8VVdOPDoeRDzE16y8xudBPJde9LoUoLG8/V4GvT4var0XLCA9Q/X0vMJsu71yqAo80OXgvFspgTvkAtm8f2iEO5MPNj1DTCe9DNDfPDymgDzYRkI9iibJvKbKLj1dwJY9eekhvAWBuTzm9Sk8WJivvV3Jfj2BtCg7CHCnPLrpYTwmt0W9E4tNvQeUHbwkQkQ84pCDvJpLjjzfL5g9VJc0Oo4cmjzT9QK9/S8kPVfiJr1tGVI8cpbmu64M27zT12i73xoUvSgImbyhCk69E2Jjvbpq/TuW6My8KzJQvZefLTy46io8QEGsvVT5Cz0plEa9dUAdu3us1Lz03LI8CehiPOiLI70RpzE9bJeXu6uTOjz79iS80fi2PKB+ery4+1U9POpNPVi6iTx8IB87RldCPEvhyDxlFPg8VWgRPaHtY72pEfm8usAuvaxk9DuRNag8y6cSPVNOnLySbTk95Ks6PGY4PL3H5Ru9HZLlPKCQFD0KMJK9ooCsvQXZXD3x+2Q8IsotvbpZCLwQvua87EKvPa4eh7xx7ts84GZAPAxcoTtQjjy9e/E4PdEjqbx/00s8kas3vHbEg71arZ88NicNPc8WkjxBzNw8+C3uuj1xurxfdDY919rSvMZniroKepu8LA6lvB5W3btKQuA816JxPY5AhTqRWqC8AWUaPMD82Lw4tR+9pautvPj5bzxXbpI85dLtPEwjbT2QZde8DGBLPR2uxrv4qQU9V1RwOsjxMD2rzOq8im1zPJ2wdr0twRu8IKNXvQFp4DsLRda8T7+Ou6ljBryQM/s6n/g9PZ6aubx28OA8OJvQPKBxGbrbWuW8ePUKvdvLAb3lYgY9ns+ZO5M90DyP94q65uKpPHLFuz2zAIE9BxxEPUJM/bwNDLW8mmUBPQ4gELrMmqA5I+i3PCX0oTw7/ga93uPtvEVk6zsTkYQ8Scj5PMRcoDvA2IC8dB90PSzkkb2H0OS8052dvCeZSr1S71e8C54MvRQspTzRile95sYDvGGCHz3KNri8M5ZpPH/IJTwv9+c8pqaku+sgo7wCQNA8WVKnuoDjljx57KM8PQ77PN9tSz0qG6a8569XPbIiM72aWNy8ARyTPKLuKb0kmdC8cmDaPNIGPT1Ozqu8E9gtvLU+5zy6hvk8hWc1vIQanjo2A6
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":241,"e":300,"m":1778081169468.3005,"t":"capabilities: [\"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"table\",\n documentId: \"page_root\",\n assetId: \"table_1\",\n workspaceId: \"ws_1\",\n assetKind: \"table\",\n iconHint: \"table\",\n extra: {\n source: {\n sourceKind: \"convex_workspace\",\n sourceUri: \"convex://workspace/ws_1/assets/table_1\",\n relativePath: \"assets/table_1\",\n storageIdentity: \"table_1\",\n operationProfile: \"convex_workspace\",\n },\n },\n },\n iconHint: \"table\",\n },\n ],\n expanded: new Set([\"page_root\"]),\n expandedAssetFolderIds: new Set([\"mind_1\"]),\n });\n\n expect(rows.map((row) => `${row.kind}:${row.depth}:${row.rowId}`)).toEqual([\n \"doc:0:doc:page_root\",\n \"index:1:index:page_root\",\n \"asset-folder:1:asset-folder:mind_1\",\n \"asset:2:asset:asset_child_1\",\n \"asset:1:asset:table_1\",\n ]);\n expect(rows[0]).toMatchObject({\n kind: \"doc\",\n docId: \"page_root\",\n hasChildren: true,\n isExpanded: true,\n });\n expect(rows[2]).toMatchObject({\n kind: \"asset-folder\",\n docId: \"page_root\",\n asset: {\n id: \"mind_1\",\n asset_type: \"mindmap\",\n file_name: \"头脑风暴\",\n },\n hasChildren: true,\n isExpanded: true,\n });\n expect(rows[3]).toMatchObject({\n kind: \"asset\",\n asset: {\n id: \"asset_child_1\",\n asset_type: \"image\",\n file_name: \"节点图片.png\",\n },\n });\n expect(rows[4]).toMatchObject({\n kind: \"asset\",\n asset: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.test.ts","s":289,"e":319,"m":1778081169468.3005,"t":"});\n expect(rows[3]).toMatchObject({\n kind: \"asset\",\n asset: {\n id: \"asset_child_1\",\n asset_type: \"image\",\n file_name: \"节点图片.png\",\n },\n });\n expect(rows[4]).toMatchObject({\n kind: \"asset\",\n asset: {\n id: \"table_1\",\n asset_type: \"luckysheet\",\n file_name: \"预算.luckysheet\",\n },\n });\n });\n\n});\n\ndescribe(\"parseFileTreeRowId\", () => {\n it(\"可逆解析 rowId\", () => {\n expect(parseFileTreeRowId(\"doc:abc\")).toEqual({ kind: \"doc\", docId: \"abc\" });\n expect(parseFileTreeRowId(\"index:abc\")).toEqual({ kind: \"index\", docId: \"abc\" });\n expect(parseFileTreeRowId(\"asset:xyz\")).toEqual({ kind: \"asset\", assetId: \"xyz\" });\n expect(parseFileTreeRowId(\"bad\")).toBeNull();\n expect(parseFileTreeRowId(\"doc:\")).toBeNull();\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.ts","s":1,"e":60,"m":1777152884646.45,"t":"\"use client\";\n\nimport type { KernelFileTreeProjectionItem } from \"@/lib/kernel-file-tree\";\nimport {\n getDocIdFromFileTreeItem,\n resolveFileTreeRowAsset,\n resolveFileTreeRowNode,\n} from \"@/lib/kernel-file-tree\";\nimport type { SidebarTreeNode } from \"@/lib/kernel-sidebar\";\nimport type { PageTreeProjectionItem } from \"@/lib/tree-projection\";\nimport type { MediaAsset } from \"@/types/media\";\nimport type { FileTreeRow } from \"./types\";\nimport { makeAssetFolderRowId, makeAssetRowId, makeDocRowId, makeIndexRowId } from \"./types\";\n\nfunction buildRowsFromKernelFileTreeProjection(input: {\n fileTreeItems: KernelFileTreeProjectionItem[];\n expanded: Set<string>;\n expandedAssetFolderIds?: Set<string>;\n nodeById?: Map<string, SidebarTreeNode>;\n assetById?: Map<string, MediaAsset>;\n}): FileTreeRow[] {\n const rows: FileTreeRow[] = [];\n const seen = new Set<string>();\n\n input.fileTreeItems.forEach((item) => {\n if (!item?.rowId || seen.has(item.rowId)) {\n return;\n }\n seen.add(item.rowId);\n const docId = getDocIdFromFileTreeItem(item);\n\n switch (item.rowKind) {\n case \"document\": {\n const node = resolveFileTreeRowNode(item, input.nodeById);\n rows.push({\n kind: \"doc\",\n rowId: makeDocRowId(docId),\n depth: item.depth,\n docId,\n parentDocId: item.parentNodeId,\n node,\n hasChildren: item.childCount > 0,\n isExpanded: input.expanded.has(docId),\n });\n return;\n }\n case \"index\": {\n const node = resolveFileTreeRowNode(item, input.nodeById);\n rows.push({\n kind: \"index\",\n rowId: makeIndexRowId(docId),\n depth: item.depth,\n docId,\n parentDocId: docId,\n node,\n });\n return;\n }\n case \"asset_folder\": {\n const asset = resolveFileTreeRowAsset(item, input.assetById);","v":"AQfqPGNTDT1z0NW9ewK+vWIMsDxk30S9TZn0vPGTIDrFWnK9tslsvPBYdLyryzo88L2yPV6+rLoyu9g8ejYcvZG/ebtpFM+8dhVKPPaUpDwCy2u861YBvSWXZTwmsey8C7WYPYMIcj3bXcY8w+VoPSzvrr0jTCk9foIpPYRhiTvTnYs8dE3avADym73OXgS9lo6APYobzbwuo1E896WNPNqclL2yfu+8I7ydvNBsAb3ig988FfMyuy7p0z2ShpO8ke61Pbh8a73Okss8tlVSvD9hRbqAGQs7AkHSPdnCgjyFLfI6UI88Pe5o+jxRxJ29f8hBu5A8xT25Lmy6aXKjPSI/1zzS17K8kVpSvBWvvz0Csg29AD9HPHtPOz3xbjk8q0F1PTCz3bwUegS9tpqePMFWHb3KKK68EBe4u9DNFD1piXS7taQ3vCQ+MLsJ+zC8RFD5PLBdMz2iXQG99+v3vAOyybyDX5w8O+jmPICm97wtPaU8fz5aPQBUKr27v2678mK6umpwqjwJl5c6k0VLvQX+A7y/yPW6cvV0PErTnjxU17A6M8xtPaQEzLznnGY8SsQwvJE9E73nBQI6cRRGPbfivLzU+fW8Y9L8Oh9pz7zsz+m8n7VDu8LHrzygp8m71/XNvA18FL3k7k88QKI1PQ7igz1b+M475h7RvDLqhjwKyPI8XAWbvUfmKL00Iz293Q+BPM+0SbwGp349hWJ2PTg9rbyad0i9eSvFPEFG6jukh9072Vp1vE3WTr2RTvM7M2G4PPLC8rvGvOc8nKI8O064X72DWss85MomvX58YD05rCK9+mihPc5NPj0f/Am9XMqAPSY8wTwPvS08JWZMvGmlYT3/zOO7guE7vZmgFj0OvLY84RbGvDyrUD01YhM9q2PsPGl2dz0jgd+8F+1avbaaPr3rZvW7pRmCvO2gtTxG5SM9r3zXvMHfTz1pULm8iK57u+U1F729TYA88JcnvNFqM72jdYI8SrFNOophbr1WN/s8Nqg1vY+k27sw2QS91KsHvc/nMLuFdYy9ou0BvUoVRj3o/J28Bzm4uieZVL1GR6G8sRWJPETqlTsb0SQ93zCmvdw1VTzZBcW88epdPfxPs7y5wdY8LyqdPch7Fr3v3qk8jr3fPI8KCL0jkxM9vtxjvY1zGr2TAxe9rqIjPZmXRzv2tnW9WZuOPRky4jx6hbw81UWDO1bpPryCws88OTOkPAaPDLz+Epm9+h0xvdwMfjzJ70s8QFqqPHDjfrzWQZg8U/mTPf0jyDy0gJU8lHroPExWWjvMTkA8bE9KvbZz9btv9Y077d4uPMlnOb0cRIw8/FVVPGqshLziAl09U/E0PeUC9Dyz06C4HtB8vYMzzryPjS294ASbvPk6Lb10nFI9fyudPCeTXrtGiLi83n8RvZ+rK707vIm8aUMHPEmsFjwMKG08p5HovG4XJ7xNZtm8KIIrPANhWj0MGTM8iwIHPaK+VDxaUga9O548vU47pr1mtKm988devSFtIbzzgMG8dsZsParsQrucZhg9MWJLPF6DJ7y0Xpw8uPMdPZCHUb3wKjA9xqMKPYW/1zt3wLw8FfMCPI2SQL2sM0S9wZYNPDFK1Tyz2Iw9c5V/PGCkurw/0wK9S8KvPG7ms7y3upU8BSEQPQHtYL2+UrC8D2fnvBlhWz0fqsY8X/+GPElERTyNz1u7dYduPBV0Gb3Yzlm8yfHlvCLIjzzpdua873wYva3wOj3QzlC8b9ELPXzRiDwiHje9t8/GPKjdxjwpPn48pdMGveEfMr2ytBm8g2jUu7IiOjtYniU9/3BJPehWQTx0nhG9eridO0rpfjot+Aq9BFTEPFVxDb3l1yW90sJfPcKIbD0lF1m9ujEQPJGKETpxPOG8s4jxvCbUsLxrSbw7hXAAPZwaqrwf7j485ENPPSb7cDoewQ09QfM9ve7gd7xnmSA9rOU9Pdh1hLuQCWE9YTwvPJJWfDyIp5+9hLPHPAljMzy+xKI8GegHvP+1HL1U8ka74EdOO9
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.ts","s":49,"e":108,"m":1777152884646.45,"t":"rows.push({\n kind: \"index\",\n rowId: makeIndexRowId(docId),\n depth: item.depth,\n docId,\n parentDocId: docId,\n node,\n });\n return;\n }\n case \"asset_folder\": {\n const asset = resolveFileTreeRowAsset(item, input.assetById);\n rows.push({\n kind: \"asset-folder\",\n rowId: makeAssetFolderRowId(asset.id),\n depth: item.depth,\n docId,\n parentDocId: docId,\n asset,\n hasChildren: item.childCount > 0,\n isExpanded: input.expandedAssetFolderIds?.has(asset.id) ?? false,\n });\n return;\n }\n case \"asset\": {\n const asset = resolveFileTreeRowAsset(item, input.assetById);\n rows.push({\n kind: \"asset\",\n rowId: makeAssetRowId(asset.id),\n depth: item.depth,\n docId,\n parentDocId: docId,\n asset,\n });\n return;\n }\n }\n });\n\n return rows;\n}\n\nexport function buildVisibleRows({\n fileTreeItems,\n expanded,\n expandedAssetFolderIds,\n nodeById,\n assetById,\n}: {\n fileTreeItems?: KernelFileTreeProjectionItem[];\n // 兼容旧调用签名;主路径必须提供 kernel file_tree items,不能再从这些字段重建对象语义。\n pageRows?: PageTreeProjectionItem[];\n expanded: Set<string>;\n assetsByDoc?: Record<string, MediaAsset[]>;\n assetChildrenByAssetId?: Record<string, MediaAsset[]>;\n expandedAssetFolderIds?: Set<string>;\n nodeById?: Map<string, SidebarTreeNode>;\n assetById?: Map<string, MediaAsset>;\n}): FileTreeRow[] {\n if (fileTreeItems && fileTreeItems.length > 0) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/rows.ts","s":97,"e":120,"m":1777152884646.45,"t":"}: {\n fileTreeItems?: KernelFileTreeProjectionItem[];\n // 兼容旧调用签名;主路径必须提供 kernel file_tree items,不能再从这些字段重建对象语义。\n pageRows?: PageTreeProjectionItem[];\n expanded: Set<string>;\n assetsByDoc?: Record<string, MediaAsset[]>;\n assetChildrenByAssetId?: Record<string, MediaAsset[]>;\n expandedAssetFolderIds?: Set<string>;\n nodeById?: Map<string, SidebarTreeNode>;\n assetById?: Map<string, MediaAsset>;\n}): FileTreeRow[] {\n if (fileTreeItems && fileTreeItems.length > 0) {\n return buildRowsFromKernelFileTreeProjection({\n fileTreeItems,\n expanded,\n expandedAssetFolderIds,\n nodeById,\n assetById,\n });\n }\n\n return [];\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection-source.test.ts","s":1,"e":60,"m":1777170954828.7944,"t":"import { describe, expect, it } from \"vitest\";\nimport type { FileTreeSelectionState } from \"./selection\";\nimport {\n createEmptyFileTreeSelectionState,\n materializeRendererSelectionSnapshot,\n resolveActiveFileTreeSelection,\n} from \"./selection-source\";\n\nfunction selection(\n selectedRowIds: string[],\n anchorRowId: string | null,\n focusedRowId: string | null,\n): FileTreeSelectionState {\n return {\n selectedRowIds: new Set(selectedRowIds),\n anchorRowId,\n focusedRowId,\n };\n}\n\ndescribe(\"selection-source\", () => {\n it(\"rust_family 应优先消费 renderer selection snapshot\", () => {\n const legacySelection = selection([\"legacy\"], \"legacy\", \"legacy\");\n const rendererSelection = selection([\"renderer\"], \"renderer\", \"renderer\");\n\n expect(\n resolveActiveFileTreeSelection({\n preferRendererSnapshot: true,\n legacySelection,\n rendererSelection,\n }),\n ).toBe(rendererSelection);\n\n expect(\n resolveActiveFileTreeSelection({\n preferRendererSnapshot: false,\n legacySelection,\n rendererSelection,\n }),\n ).toBe(legacySelection);\n });\n\n it(\"renderer event snapshot 只过滤未知 row,不在宿主侧重算 focus/anchor\", () => {\n const snapshot = materializeRendererSelectionSnapshot({\n payload: {\n selectedRowIds: [\"doc:a\", \"missing\"],\n anchorRowId: \"missing\",\n focusedRowId: \"doc:a\",\n },\n hasRowId: (rowId) => rowId === \"doc:a\",\n });\n\n expect(Array.from(snapshot.selectedRowIds)).toEqual([\"doc:a\"]);\n expect(snapshot.anchorRowId).toBeNull();\n expect(snapshot.focusedRowId).toBe(\"doc:a\");\n });\n\n it(\"空 selection 工厂应返回互不共享的 Set 实例\", () => {\n const a = createEmptyFileTreeSelectionState();\n const b = createEmptyFileTreeSelectionState();","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection-source.test.ts","s":49,"e":69,"m":1777170954828.7944,"t":"},\n hasRowId: (rowId) => rowId === \"doc:a\",\n });\n\n expect(Array.from(snapshot.selectedRowIds)).toEqual([\"doc:a\"]);\n expect(snapshot.anchorRowId).toBeNull();\n expect(snapshot.focusedRowId).toBe(\"doc:a\");\n });\n\n it(\"空 selection 工厂应返回互不共享的 Set 实例\", () => {\n const a = createEmptyFileTreeSelectionState();\n const b = createEmptyFileTreeSelectionState();\n\n a.selectedRowIds.add(\"doc:a\");\n\n expect(a.selectedRowIds.has(\"doc:a\")).toBe(true);\n expect(b.selectedRowIds.has(\"doc:a\")).toBe(false);\n expect(a.selectedRowIds).not.toBe(b.selectedRowIds);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection-source.ts","s":1,"e":47,"m":1777170976202.07,"t":"import type { FileTreeSelectionState } from \"./selection\";\n\nexport type FileTreeSelectionSnapshotPayload = {\n selectedRowIds: readonly string[];\n anchorRowId: string | null;\n focusedRowId: string | null;\n};\n\nexport function createEmptyFileTreeSelectionState(): FileTreeSelectionState {\n return {\n selectedRowIds: new Set<string>(),\n anchorRowId: null,\n focusedRowId: null,\n };\n}\n\nexport function materializeRendererSelectionSnapshot(input: {\n payload: FileTreeSelectionSnapshotPayload;\n hasRowId: (rowId: string) => boolean;\n}): FileTreeSelectionState {\n const selectedRowIds = new Set(\n input.payload.selectedRowIds.filter((rowId) => input.hasRowId(rowId)),\n );\n\n return {\n selectedRowIds,\n anchorRowId:\n input.payload.anchorRowId && input.hasRowId(input.payload.anchorRowId)\n ? input.payload.anchorRowId\n : null,\n focusedRowId:\n input.payload.focusedRowId && input.hasRowId(input.payload.focusedRowId)\n ? input.payload.focusedRowId\n : null,\n };\n}\n\nexport function resolveActiveFileTreeSelection(input: {\n preferRendererSnapshot: boolean;\n legacySelection: FileTreeSelectionState;\n rendererSelection: FileTreeSelectionState;\n}): FileTreeSelectionState {\n return input.preferRendererSnapshot\n ? input.rendererSelection\n : input.legacySelection;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection.test.ts","s":1,"e":60,"m":1773495900990.8623,"t":"import { describe, expect, it } from \"vitest\";\nimport { normalizeFileTreeSelectionForVisibleRows, reduceFileTreeSelection } from \"./selection\";\n\ndescribe(\"reduceFileTreeSelection\", () => {\n const visible = [\"a\", \"b\", \"c\", \"d\"];\n\n it(\"单击:清空并仅选中当前;更新 anchor/focus\", () => {\n const next = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"x\"]), anchorRowId: \"x\", focusedRowId: \"x\" },\n { type: \"click\", rowId: \"b\", visibleRowIds: visible, modifiers: {} },\n );\n expect(Array.from(next.selectedRowIds)).toEqual([\"b\"]);\n expect(next.anchorRowId).toBe(\"b\");\n expect(next.focusedRowId).toBe(\"b\");\n });\n\n it(\"Ctrl/Cmd+单击:切换选中;不清空其他\", () => {\n const next = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"b\"]), anchorRowId: \"b\", focusedRowId: \"b\" },\n { type: \"click\", rowId: \"d\", visibleRowIds: visible, modifiers: { ctrlKey: true } },\n );\n expect(next.selectedRowIds.has(\"b\")).toBe(true);\n expect(next.selectedRowIds.has(\"d\")).toBe(true);\n });\n\n it(\"Shift+单击:按 visibleRows 做区间选择(覆盖式)\", () => {\n const next = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"b\"]), anchorRowId: \"b\", focusedRowId: \"b\" },\n { type: \"click\", rowId: \"d\", visibleRowIds: visible, modifiers: { shiftKey: true } },\n );\n expect(Array.from(next.selectedRowIds)).toEqual([\"b\", \"c\", \"d\"]);\n expect(next.focusedRowId).toBe(\"d\");\n });\n\n it(\"右键:未选中项右键 → 先切为单选;已选中项 → 保持多选集合\", () => {\n const a = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"b\", \"c\"]), anchorRowId: \"b\", focusedRowId: \"c\" },\n { type: \"contextmenu\", rowId: \"d\" },\n );\n expect(Array.from(a.selectedRowIds)).toEqual([\"d\"]);\n\n const b = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"b\", \"c\"]), anchorRowId: \"b\", focusedRowId: \"c\" },\n { type: \"contextmenu\", rowId: \"c\" },\n );\n expect(Array.from(b.selectedRowIds).sort()).toEqual([\"b\", \"c\"]);\n expect(b.focusedRowId).toBe(\"c\");\n });\n\n it(\"空白处单击清空选择\", () => {\n const next = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"b\"]), anchorRowId: \"b\", focusedRowId: \"b\" },\n { type: \"clear\" },\n );\n expect(next.selectedRowIds.size).toBe(0);\n expect(next.anchorRowId).toBeNull();\n expect(next.focusedRowId).toBeNull();\n });\n\n it(\"可见行变化时保留仍可见的选择\", () => {","v":"9GTHOjO65TuXKBS+0/qvvWhemT1xNMO8fb1uPAJPyzwrEsE72KBOvQRLH72SxFE9XapePe9OpbuDSmW8HtBzvSHzrzsmx1e9oRkkPam6Az3mWce8PMPBuy70h7zVIfq8EDQwPfWNnD2084g8sA1lPcAbGLwbiB08u0GXPdv0KjwEfwQ9dyFBvR0AX73wfk29p4xevAoU9jyQkXa90VgYPCYyo7z7FFA8nE3EO4O8i72TImw9JmGyPAIeOz2TQas8EjscPbWWe70du0y6T3ViOwgdGDv3k9S8l5MjPtirGj3F6YG84zMIvIMCXz0oOw+8EktmvBEgpzz6MTO90VeIPcxvrj1RXRm9avZivedVHD1jfyu9Tx0/PWleXbzcs0M7J+45PGOW/bz6uai9/QLdu0q/oLzyYLm83y8OPLw0lj0n7me9K/alvK4B8zyz3gs9MzgdPQZbGL0PgtU8PjGtu83mjrzjy3A9GDduPTaQ2rymDm68x7EAPNVPJr2Ppbc7JmdkO9xXkry7vjs8lJyyvL7WKT0G0vu7iEaNvLhOlrxJ8ja8ieqoPfvwl7vRQas8ai5tvMuker3E5r+7v+mAPQGyG72PjPy8Jz4+O+9Jir1QYs07ncgNPPWJhL3o9XA8lY8tu4haerz8Ai+8sz0kPY8s5jzDGgU8MIDnvGIjkjwK7QY9KVuBvczZUry64Im8BqoZvTdCrTuNy3c91dYHPSmBb7xhNya8Rwo4ulFnVDzrLyK7/+CsPL9vBr1kgBq90yMzPKdOc72bFns9om1dvNQEW7zs6aW8GWROvWWhgD2ptqq8gZ6sOw1CijxMzY28Mab/PAQDnrp7GRA96o+vPJ6GRD2eMne6cYcovZQtbD1ANXM7qYw6vTRlrTwnTuk5YRFKPP5RXT21KYO9iPEQvau1BT0feKW8pZwVvVrDHDwv68o8lVgWvfXddjzhJD68Q65AvJcifb1sbCc91WHXOz+0QL2qt6C84lSivJAyJbx5tU08PUt1vBmHiTvjiH29P0eYvZMkqLw7/rS88GVqveq4zjxyF+S8G4diPLVjJrt6+o68cWq2Okl6Vjtc6Z08JtKuvei50TwEaOO8NHNRPcrvTL1dLVY9a3tzPeWjp7zbEXI8IkyKPZN9yrpUrVI9pkYAPcPrTrx4hUm9eEWwOogycz1SndW8SqGpPPQ0ajsYOMg7LxOAvFq9N7vlszG7eMjZPJMySbzGwBG9KruUvUUZ/Dv1lYg9CGuXu9JCXD0KMLi7JWhKPUFJWTvCyHc8E5RBO8FlBzydD1A8l7hEvVFTT729fma90bZKPDNyyTpukgE9nDCrPIwt3r
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection.test.ts","s":49,"e":70,"m":1773495900990.8623,"t":"it(\"空白处单击清空选择\", () => {\n const next = reduceFileTreeSelection(\n { selectedRowIds: new Set([\"b\"]), anchorRowId: \"b\", focusedRowId: \"b\" },\n { type: \"clear\" },\n );\n expect(next.selectedRowIds.size).toBe(0);\n expect(next.anchorRowId).toBeNull();\n expect(next.focusedRowId).toBeNull();\n });\n\n it(\"可见行变化时保留仍可见的选择\", () => {\n const next = normalizeFileTreeSelectionForVisibleRows(\n { selectedRowIds: new Set([\"b\", \"x\"]), anchorRowId: \"b\", focusedRowId: \"x\" },\n [\"a\", \"b\", \"c\"],\n );\n expect(Array.from(next.selectedRowIds)).toEqual([\"b\"]);\n expect(next.anchorRowId).toBe(\"b\");\n expect(next.focusedRowId).toBe(\"b\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection.ts","s":49,"e":108,"m":1773495900999.348,"t":"};\n }\n case \"click\": {\n const { rowId, visibleRowIds, modifiers } = action;\n const withMeta = Boolean(modifiers.metaKey);\n const withCtrl = Boolean(modifiers.ctrlKey);\n const withShift = Boolean(modifiers.shiftKey);\n const withToggle = withMeta || withCtrl;\n\n if (withShift) {\n const anchor = prev.anchorRowId ?? prev.focusedRowId ?? rowId;\n const range = getRangeRowIds(visibleRowIds, anchor, rowId);\n const next = withToggle ? new Set(prev.selectedRowIds) : new Set<string>();\n range.forEach((id) => next.add(id));\n return {\n selectedRowIds: next,\n anchorRowId: prev.anchorRowId ?? anchor,\n focusedRowId: rowId,\n };\n }\n\n if (withToggle) {\n const next = new Set(prev.selectedRowIds);\n if (next.has(rowId)) {\n next.delete(rowId);\n } else {\n next.add(rowId);\n }\n return { selectedRowIds: next, anchorRowId: rowId, focusedRowId: rowId };\n }\n\n return { selectedRowIds: new Set([rowId]), anchorRowId: rowId, focusedRowId: rowId };\n }\n }\n}\n\nexport function normalizeFileTreeSelectionForVisibleRows(\n prev: FileTreeSelectionState,\n visibleRowIds: string[],\n): FileTreeSelectionState {\n const visibleSet = new Set(visibleRowIds);\n\n let selectedRowIds = prev.selectedRowIds;\n let removedAny = false;\n const kept: string[] = [];\n prev.selectedRowIds.forEach((id) => {\n if (visibleSet.has(id)) {\n kept.push(id);\n return;\n }\n removedAny = true;\n });\n if (removedAny) {\n selectedRowIds = new Set(kept);\n }\n\n let anchorRowId = prev.anchorRowId;\n if (anchorRowId && !visibleSet.has(anchorRowId)) {\n anchorRowId = null;\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/selection.ts","s":97,"e":133,"m":1773495900999.348,"t":"return;\n }\n removedAny = true;\n });\n if (removedAny) {\n selectedRowIds = new Set(kept);\n }\n\n let anchorRowId = prev.anchorRowId;\n if (anchorRowId && !visibleSet.has(anchorRowId)) {\n anchorRowId = null;\n }\n\n let focusedRowId = prev.focusedRowId;\n if (focusedRowId && !visibleSet.has(focusedRowId)) {\n focusedRowId = null;\n }\n\n if (!focusedRowId && selectedRowIds.size > 0) {\n focusedRowId = visibleRowIds.find((id) => selectedRowIds.has(id)) ?? null;\n }\n\n if (!anchorRowId && focusedRowId) {\n anchorRowId = focusedRowId;\n }\n\n if (\n selectedRowIds === prev.selectedRowIds &&\n anchorRowId === prev.anchorRowId &&\n focusedRowId === prev.focusedRowId\n ) {\n return prev;\n }\n\n return { selectedRowIds, anchorRowId, focusedRowId };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":1,"e":60,"m":1778802928217.177,"t":"import { describe, expect, it } from \"vitest\";\nimport type { KernelFileTreeProjectionItem } from \"@/lib/kernel-file-tree\";\nimport type { SidebarTreeNode } from \"@/lib/kernel-sidebar\";\nimport type { MediaAsset } from \"@/types/media\";\nimport {\n buildFileTreeShellDeletePreflightPayload,\n buildFileTreeShellInternalDropPreflightPayload,\n buildFileTreeShellPastePreflightPayload,\n buildFileTreeShellUploadTargetPreflightPayload,\n buildFileTreeShellRowById,\n buildFileTreeShellVisibleRowIds,\n collectFileTreeShellAssetHints,\n getOrderedFileTreeShellRows,\n inferFileTreeShellTargetDocumentId,\n resolveFileTreeShellMindmapTargetId,\n} from \"./shell\";\n\ndescribe(\"file-tree shell helpers\", () => {\n const nodeById = new Map<string, SidebarTreeNode>([\n [\n \"doc_root\",\n {\n id: \"doc_root\",\n title: \"根页面\",\n } as SidebarTreeNode,\n ],\n ]);\n\n const assetById = new Map<string, MediaAsset>([\n [\n \"mind_1\",\n {\n id: \"mind_1\",\n document_id: \"doc_root\",\n workspace_id: \"ws_1\",\n asset_type: \"mindmap\",\n file_name: \"mindmap.json\",\n storage_path: \"mindmaps/mind_1/mindmap.json\",\n } as MediaAsset,\n ],\n [\n \"asset_child_1\",\n {\n id: \"asset_child_1\",\n document_id: \"doc_root\",\n workspace_id: \"ws_1\",\n asset_type: \"file\",\n file_name: \"node.png\",\n storage_path: \"mindmaps/mind_1/assets/node.png\",\n } as MediaAsset,\n ],\n [\n \"pdf_1\",\n {\n id: \"pdf_1\",\n document_id: \"doc_root\",\n workspace_id: \"ws_1\",\n asset_type: \"file\",\n file_name: \"guide.pdf\",\n storage_path: \"uploads/guide.pdf\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":49,"e":108,"m":1778802928217.177,"t":"storage_path: \"mindmaps/mind_1/assets/node.png\",\n } as MediaAsset,\n ],\n [\n \"pdf_1\",\n {\n id: \"pdf_1\",\n document_id: \"doc_root\",\n workspace_id: \"ws_1\",\n asset_type: \"file\",\n file_name: \"guide.pdf\",\n storage_path: \"uploads/guide.pdf\",\n } as MediaAsset,\n ],\n ]);\n\n const fileTreeItems: KernelFileTreeProjectionItem[] = [\n {\n rowId: \"doc:doc_root\",\n rowKind: \"document\",\n nodeId: \"doc_root\",\n parentNodeId: null,\n nodeType: \"page\",\n projectionKind: \"file_tree\",\n title: \"根页面\",\n depth: 0,\n position: 0,\n childCount: 3,\n expandable: true,\n expandedByDefault: true,\n capabilities: [\"expand\", \"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"document\",\n documentId: \"doc_root\",\n workspaceId: \"ws_1\",\n iconHint: \"page\",\n },\n iconHint: \"page\",\n },\n {\n rowId: \"index:doc_root\",\n rowKind: \"index\",\n nodeId: \"index:doc_root\",\n parentNodeId: \"doc_root\",\n nodeType: \"index\",\n projectionKind: \"file_tree\",\n title: \"index.md\",\n depth: 1,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"doc_root\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n },\n iconHint: \"index\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":97,"e":156,"m":1778802928217.177,"t":"position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open\", \"select\"],\n resourceMeta: {\n resourceKind: \"index\",\n documentId: \"doc_root\",\n workspaceId: \"ws_1\",\n iconHint: \"index\",\n },\n iconHint: \"index\",\n },\n {\n rowId: \"asset-folder:mind_1\",\n rowKind: \"asset_folder\",\n nodeId: \"asset-folder:mind_1\",\n parentNodeId: \"doc_root\",\n nodeType: \"mindmap\",\n projectionKind: \"file_tree\",\n title: \"mindmap\",\n depth: 1,\n position: 1,\n childCount: 1,\n expandable: true,\n expandedByDefault: false,\n capabilities: [\"expand\", \"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"mindmap\",\n documentId: \"doc_root\",\n assetId: \"mind_1\",\n workspaceId: \"ws_1\",\n assetKind: \"mindmap\",\n iconHint: \"mindmap\",\n },\n iconHint: \"mindmap\",\n },\n {\n rowId: \"asset:asset_child_1\",\n rowKind: \"asset\",\n nodeId: \"asset:asset_child_1\",\n parentNodeId: \"asset-folder:mind_1\",\n nodeType: \"asset\",\n projectionKind: \"file_tree\",\n title: \"node.png\",\n depth: 2,\n position: 0,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"asset_child_1\",\n workspaceId: \"ws_1\",\n assetKind: \"image\",\n iconHint: \"image\",\n },\n iconHint: \"image\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":145,"e":204,"m":1778802928217.177,"t":"expandable: false,\n expandedByDefault: false,\n capabilities: [\"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"asset_child_1\",\n workspaceId: \"ws_1\",\n assetKind: \"image\",\n iconHint: \"image\",\n },\n iconHint: \"image\",\n },\n {\n rowId: \"asset:pdf_1\",\n rowKind: \"asset\",\n nodeId: \"asset:pdf_1\",\n parentNodeId: \"doc_root\",\n nodeType: \"pdf\",\n projectionKind: \"file_tree\",\n title: \"guide.pdf\",\n depth: 1,\n position: 2,\n childCount: 0,\n expandable: false,\n expandedByDefault: false,\n capabilities: [\"open-asset\", \"select\"],\n resourceMeta: {\n resourceKind: \"pdf\",\n documentId: \"doc_root\",\n assetId: \"pdf_1\",\n workspaceId: \"ws_1\",\n assetKind: \"pdf\",\n iconHint: \"pdf\",\n },\n iconHint: \"pdf\",\n },\n ];\n\n it(\"应直接从 kernel file_tree items 构造宿主 row map\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n expect(buildFileTreeShellVisibleRowIds([...fileTreeItems])).toEqual([\n \"doc:doc_root\",\n \"index:doc_root\",\n \"asset-folder:mind_1\",\n \"asset:asset_child_1\",\n \"asset:pdf_1\",\n ]);\n\n expect(rowById.get(\"doc:doc_root\")).toMatchObject({\n rowId: \"doc:doc_root\",\n rowKind: \"doc\",\n documentId: \"doc_root\",\n node: expect.objectContaining({\n id: \"doc_root\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":193,"e":252,"m":1778802928217.177,"t":"\"index:doc_root\",\n \"asset-folder:mind_1\",\n \"asset:asset_child_1\",\n \"asset:pdf_1\",\n ]);\n\n expect(rowById.get(\"doc:doc_root\")).toMatchObject({\n rowId: \"doc:doc_root\",\n rowKind: \"doc\",\n documentId: \"doc_root\",\n node: expect.objectContaining({\n id: \"doc_root\",\n }),\n });\n expect(rowById.get(\"asset-folder:mind_1\")).toMatchObject({\n rowId: \"asset-folder:mind_1\",\n rowKind: \"asset-folder\",\n documentId: \"doc_root\",\n assetId: \"mind_1\",\n asset: expect.objectContaining({\n id: \"mind_1\",\n }),\n });\n });\n\n it(\"应正确解析 file tree shell 的导图投放目标\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n expect(resolveFileTreeShellMindmapTargetId(rowById.get(\"asset-folder:mind_1\") ?? null)).toBe(\n \"mind_1\",\n );\n expect(resolveFileTreeShellMindmapTargetId(rowById.get(\"asset:asset_child_1\") ?? null)).toBe(\n \"mind_1\",\n );\n expect(resolveFileTreeShellMindmapTargetId(rowById.get(\"asset:pdf_1\") ?? null)).toBeNull();\n });\n\n it(\"应能仅凭 focusedRowId 从 shell row map 推回目标页面\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n expect(\n inferFileTreeShellTargetDocumentId({\n focusedRowId: \"asset-folder:mind_1\",\n rowById,\n activeDocId: null,\n }),\n ).toBe(\"doc_root\");\n expect(\n inferFileTreeShellTargetDocumentId({\n focusedRowId: \"asset:pdf_1\",\n rowById,\n activeDocId: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":241,"e":300,"m":1778802928217.177,"t":"expect(\n inferFileTreeShellTargetDocumentId({\n focusedRowId: \"asset-folder:mind_1\",\n rowById,\n activeDocId: null,\n }),\n ).toBe(\"doc_root\");\n expect(\n inferFileTreeShellTargetDocumentId({\n focusedRowId: \"asset:pdf_1\",\n rowById,\n activeDocId: null,\n }),\n ).toBe(\"doc_root\");\n expect(\n inferFileTreeShellTargetDocumentId({\n focusedRowId: null,\n rowById,\n activeDocId: \"doc_root\",\n }),\n ).toBe(\"doc_root\");\n });\n\n it(\"应按当前可见顺序返回选中的 shell rows\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n expect(\n getOrderedFileTreeShellRows({\n rowIds: [\"asset:pdf_1\", \"doc:doc_root\", \"missing\"],\n visibleRowIds: buildFileTreeShellVisibleRowIds([...fileTreeItems]),\n rowById,\n }).map((row) => row.rowId),\n ).toEqual([\"doc:doc_root\", \"asset:pdf_1\"]);\n });\n\n it(\"内部拖放 preflight payload 应只收集 Rust 所需的行与父子快照\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n const result = buildFileTreeShellInternalDropPreflightPayload({\n workspaceId: \"ws_1\",\n copy: false,\n targetDocumentId: null,\n targetRowId: \"asset-folder:mind_1\",\n focusedRowId: null,\n activeDocId: null,\n rowIds: [\"asset:asset_child_1\", \"doc:doc_root\", \"asset:pdf_1\", \"asset:pdf_1\"],\n rowById,\n parentById: new Map([\n [\"doc_root\", null],\n [\"doc_child\", \"doc_root\"],\n ]),\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":289,"e":348,"m":1778802928217.177,"t":"copy: false,\n targetDocumentId: null,\n targetRowId: \"asset-folder:mind_1\",\n focusedRowId: null,\n activeDocId: null,\n rowIds: [\"asset:asset_child_1\", \"doc:doc_root\", \"asset:pdf_1\", \"asset:pdf_1\"],\n rowById,\n parentById: new Map([\n [\"doc_root\", null],\n [\"doc_child\", \"doc_root\"],\n ]),\n });\n\n expect(result).toEqual({\n workspaceId: \"ws_1\",\n copy: false,\n sourceCapabilities: [\"read\", \"write\", \"move\"],\n targetCapabilities: [\"read\", \"write\", \"drop\"],\n targetDocumentId: \"doc_root\",\n targetRowId: \"asset-folder:mind_1\",\n focusedRowId: null,\n activeDocumentId: null,\n rowIds: [\"asset:asset_child_1\", \"doc:doc_root\", \"asset:pdf_1\", \"asset:pdf_1\"],\n rows: [\n {\n rowId: \"asset-folder:mind_1\",\n rowKind: \"asset-folder\",\n documentId: \"doc_root\",\n assetId: \"mind_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"mindmap\",\n storagePath: \"mindmaps/mind_1/mindmap.json\",\n title: \"mindmap.json\",\n },\n {\n rowId: \"asset:asset_child_1\",\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"asset_child_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"file\",\n storagePath: \"mindmaps/mind_1/assets/node.png\",\n title: \"node.png\",\n },\n {\n rowId: \"doc:doc_root\",\n rowKind: \"doc\",\n documentId: \"doc_root\",\n assetId: null,\n assetDocumentId: null,\n assetType: null,\n storagePath: null,\n title: \"根页面\",\n },\n {\n rowId: \"asset:pdf_1\",\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"pdf_1\",\n assetDocumentId: \"doc_root\",","v":"zcUhPeqZ2rxcMhC+zRttvZk3jT02F/G8d4UUvXpsojyNbL689s1gvWzZAbyHYJ48+FGdPeAdtbzfrEO9q6l2PIigCL3aCku9dwZrPZnF9TsakOu7NQidPEOhDr1A2KW84HW8PQkQrjxLBVW8Kz+PPD+9i70+F1G72IeUPWrP3zxWSAe7MhMLvVhGy733Cc68QRMkPaZS8LxI1zs9bABbPDPWF70bNDQ64cNcvZmKCL0vjQQ8G6o1vOU5VD2Z+q47IR6oPWE74LwxRtY8/FWcO/Ralj08ZM+7LKERPhsoKz1f9Kg8Z5ZxO6Dp1DyENha9lCbxPHJOKz1tFBE8BPx8PTH0yjwhkEq8PfrDvKnYu7ob0G+8BOO4vMTojz293w09QB7CvB2+PL3Nu1k8CFoaPcI3QL0Rcp28c5LevJIgyzxiFsq8tHmLPC9PSDxMiYs92lGpPezFpzstVL27TO6CvEseALsiWZ097bmAPWfOqjnM/Ni8vWEePCGSjbxJi/47I3+OvJTjxjxGkh291cmJvCCS1rytQ5w7e5vZvNTfDbyo4lq6Qb3sPJuO5zzWzV88vt0RvQMhV72+dnq76i0FPQqQXjzrOYi9LPqzPLtCur3RpU09rf7lPHDMMr2jKSc9UWu1vNWZmbxEahs9BOVuPVnv+DsUyVy9jj88vPLslTvboGS7w6r0vNSrCL14yYW8ch8vvZ8Bcz1DvdA8TC2HO++Hl7oY7za9LD+HPHl9S71RuE08D+j5PP5LWjyMyYe8NEneOxLGkr10MZs9p9psu2WJjL0WVCQ8fVKAvcBmh7rlgxu9N21Ru//3Ij3lwFO901vbPE9FBr0tNXU84dzGPGW2HT0RrrA8Ie16PGMZETwVxZk8UEaXvTxgFjx0+8w7z+mDvODoFT29L0S9oWZfvXEC37sFXs28qxRKvLuZqLo8zsC6s0i7POeJirx7uTK9wXoNPUfB2ruhKhg9kODXPIzRKL2Iizo7P3AQOnNquby2ppk7qNvfvIgCcr1AxBm9mNShvB2dRrwMn1096wiGvaBAgrw+lTC9BW4EPKzl6TxTCqc8AqazPLZYrLtPn4u6nIcjvVBQ7LuNf3S90Sd+PJzIQDyiEbA8WThqPVQ2FL2KHac8DsUCvbu0rzxvTie8JBHMO9dxn7v88XS9I0kXvV6x4bo9+qU7jm4rPSw3K70jX4A9GyNQPE4Fx7xXGcy8aUfCPFs6E70eEYS8WcGXvbnkdLzuePk8b+T1vA97RDy+d5M8jdWxPcGR/TzS4pg8mFMDvXJvQj013hU8gxwQvZ9c27wI7sW782GFPILchL2AXC67RLcHPSFAFT0vJ/A4WUMjPbpOYT2IsQ09ewZ9vPKpA7yrmtC8WsuBvA7i5LwMjSU9XJxOPDc2wzxqZQG8ufSVvEo+fL2JZQi9KtjEPBWkLjy5HfE8V622unUqfbssYUm8bs4HPct4Cj3suzk8iwXGPIpyNj29kQi95l5JvFLpnr2cWwg9MMYKvMCexjxGjDe906mpvO8iprweO0k83aiCPHizJj3Wf8S8YGoLPQ8O27swTS08HlQzu4Yx6DyrhFI92NOuu0NCijrBthi7tmwrOKjoxz3xOIs9cxZEPRQX1ro4Tl48p2YvPA9qrLsJT/E8uoZzvLJBqLyadOS8v549PEhCKr0evvy7dhclPAVA3DwWshe9P9WxPHgRmrxk4gW9Mg00vagEOb2vfmI7Ju9OvVTfij0Mlga90GB5PY9CCz0KBi49KG3wPMS2Rj1Br347qxXwuxmxO7zviWE8yHVTO88PQj3gjRE8DC2RPSvMhj0a1NE8/mhrPRAM1rv5vgk8qa4zPbO4+LsYmsq8UBvOPGUqGD0mkhW89i+RvNmsuTsaXoa7PYMGO2Il/TwkUtm7ZOEgPI+Pljy6pvQ88f2EPfcCBjzOQGA8wOCSvC29h7qUG4c9h4TGPJ6efLw2Lwg9hWc9PQf3ajvkB9a6T/Pju4tUkjzuCiy8fn8Bvewl5bx10yI8XYbY
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":337,"e":396,"m":1778802928217.177,"t":"assetId: null,\n assetDocumentId: null,\n assetType: null,\n storagePath: null,\n title: \"根页面\",\n },\n {\n rowId: \"asset:pdf_1\",\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"pdf_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"file\",\n storagePath: \"uploads/guide.pdf\",\n title: \"guide.pdf\",\n },\n ],\n targetChildren: [\n {\n rowKind: \"asset-folder\",\n documentId: \"doc_root\",\n assetId: \"mind_1\",\n title: \"mindmap.json\",\n },\n {\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"asset_child_1\",\n title: \"node.png\",\n },\n {\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"pdf_1\",\n title: \"guide.pdf\",\n },\n ],\n documentParents: [\n { documentId: \"doc_root\", parentId: null },\n { documentId: \"doc_child\", parentId: \"doc_root\" },\n ],\n conflictPolicy: \"prompt\",\n });\n });\n\n it(\"删除 preflight payload 应只收集选中行与父子快照\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n const result = buildFileTreeShellDeletePreflightPayload({\n workspaceId: \"ws_1\",\n rowIds: [\"doc:doc_root\", \"asset:pdf_1\", \"missing\"],\n rowById,\n parentById: new Map([\n [\"doc_root\", null],\n [\"doc_child\", \"doc_root\"],\n ]),","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":385,"e":444,"m":1778802928217.177,"t":"nodeById,\n assetById,\n });\n\n const result = buildFileTreeShellDeletePreflightPayload({\n workspaceId: \"ws_1\",\n rowIds: [\"doc:doc_root\", \"asset:pdf_1\", \"missing\"],\n rowById,\n parentById: new Map([\n [\"doc_root\", null],\n [\"doc_child\", \"doc_root\"],\n ]),\n });\n\n expect(result).toEqual({\n workspaceId: \"ws_1\",\n rowIds: [\"doc:doc_root\", \"asset:pdf_1\", \"missing\"],\n rows: [\n {\n rowId: \"doc:doc_root\",\n rowKind: \"doc\",\n documentId: \"doc_root\",\n assetId: null,\n assetDocumentId: null,\n assetType: null,\n storagePath: null,\n title: \"根页面\",\n },\n {\n rowId: \"asset:pdf_1\",\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"pdf_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"file\",\n storagePath: \"uploads/guide.pdf\",\n title: \"guide.pdf\",\n },\n ],\n documentParents: [\n { documentId: \"doc_root\", parentId: null },\n { documentId: \"doc_child\", parentId: \"doc_root\" },\n ],\n });\n });\n\n it(\"粘贴 preflight payload 应只收集剪贴板行与当前 focused 目标行\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n const result = buildFileTreeShellPastePreflightPayload({\n workspaceId: \"ws_1\",\n targetDocumentId: null,\n focusedRowId: \"asset-folder:mind_1\",\n activeDocId: \"doc_active\",\n rowIds: [\"index:doc_root\", \"asset:pdf_1\", \"missing\"],\n rowById,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":433,"e":492,"m":1778802928217.177,"t":"fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n const result = buildFileTreeShellPastePreflightPayload({\n workspaceId: \"ws_1\",\n targetDocumentId: null,\n focusedRowId: \"asset-folder:mind_1\",\n activeDocId: \"doc_active\",\n rowIds: [\"index:doc_root\", \"asset:pdf_1\", \"missing\"],\n rowById,\n });\n\n expect(result).toEqual({\n workspaceId: \"ws_1\",\n targetDocumentId: null,\n focusedRowId: \"asset-folder:mind_1\",\n activeDocumentId: \"doc_active\",\n rowIds: [\"index:doc_root\", \"asset:pdf_1\", \"missing\"],\n rows: [\n {\n rowId: \"asset-folder:mind_1\",\n rowKind: \"asset-folder\",\n documentId: \"doc_root\",\n assetId: \"mind_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"mindmap\",\n storagePath: \"mindmaps/mind_1/mindmap.json\",\n title: \"mindmap.json\",\n },\n {\n rowId: \"index:doc_root\",\n rowKind: \"index\",\n documentId: \"doc_root\",\n assetId: null,\n assetDocumentId: null,\n assetType: null,\n storagePath: null,\n title: \"根页面\",\n },\n {\n rowId: \"asset:pdf_1\",\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"pdf_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"file\",\n storagePath: \"uploads/guide.pdf\",\n title: \"guide.pdf\",\n },\n ],\n });\n });\n\n it(\"上传目标 preflight payload 应只收集目标行、focused 行与文档工作区快照\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":481,"e":540,"m":1778802928217.177,"t":"storagePath: \"uploads/guide.pdf\",\n title: \"guide.pdf\",\n },\n ],\n });\n });\n\n it(\"上传目标 preflight payload 应只收集目标行、focused 行与文档工作区快照\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n const result = buildFileTreeShellUploadTargetPreflightPayload({\n workspaceId: \"ws_fallback\",\n targetDocumentId: null,\n targetRowId: \"asset:asset_child_1\",\n focusedRowId: \"asset-folder:mind_1\",\n activeDocId: \"doc_active\",\n rowById,\n documentWorkspaceById: new Map([\n [\"doc_root\", \"ws_1\"],\n [\"doc_active\", \"ws_active\"],\n ]),\n });\n\n expect(result).toEqual({\n workspaceId: \"ws_fallback\",\n targetDocumentId: null,\n targetRowId: \"asset:asset_child_1\",\n focusedRowId: \"asset-folder:mind_1\",\n activeDocumentId: \"doc_active\",\n rows: [\n {\n rowId: \"asset:asset_child_1\",\n rowKind: \"asset\",\n documentId: \"doc_root\",\n assetId: \"asset_child_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"file\",\n storagePath: \"mindmaps/mind_1/assets/node.png\",\n title: \"node.png\",\n },\n {\n rowId: \"asset-folder:mind_1\",\n rowKind: \"asset-folder\",\n documentId: \"doc_root\",\n assetId: \"mind_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"mindmap\",\n storagePath: \"mindmaps/mind_1/mindmap.json\",\n title: \"mindmap.json\",\n },\n ],\n documentWorkspaces: [\n { documentId: \"doc_root\", workspaceId: \"ws_1\" },\n { documentId: \"doc_active\", workspaceId: \"ws_active\" },\n ],\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.test.ts","s":529,"e":558,"m":1778802928217.177,"t":"assetId: \"mind_1\",\n assetDocumentId: \"doc_root\",\n assetType: \"mindmap\",\n storagePath: \"mindmaps/mind_1/mindmap.json\",\n title: \"mindmap.json\",\n },\n ],\n documentWorkspaces: [\n { documentId: \"doc_root\", workspaceId: \"ws_1\" },\n { documentId: \"doc_active\", workspaceId: \"ws_active\" },\n ],\n });\n });\n\n it(\"应能按 assetId 从 shell row map 回填 asset 与 asset-folder 的提示元数据\", () => {\n const rowById = buildFileTreeShellRowById({\n fileTreeItems: [...fileTreeItems],\n nodeById,\n assetById,\n });\n\n expect(\n collectFileTreeShellAssetHints({\n rowById,\n assetIds: [\"mind_1\", \"pdf_1\", \"missing\"],\n }).map((asset) => asset.id),\n ).toEqual([\"mind_1\", \"pdf_1\"]);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":1,"e":60,"m":1778803002813.1008,"t":"\"use client\";\n\nimport type { KernelFileTreeProjectionItem } from \"@/lib/kernel-file-tree\";\nimport {\n getDocIdFromFileTreeItem,\n resolveFileTreeRowAsset,\n resolveFileTreeRowNode,\n} from \"@/lib/kernel-file-tree\";\nimport type { SidebarTreeNode } from \"@/lib/kernel-sidebar\";\nimport type { MediaAsset } from \"@/types/media\";\n\nexport type FileTreeShellRowKind = \"doc\" | \"index\" | \"asset\" | \"asset-folder\";\n\nexport type FileTreeShellRow = {\n rowId: string;\n rowKind: FileTreeShellRowKind;\n documentId: string;\n assetId: string | null;\n node: SidebarTreeNode | null;\n asset: MediaAsset | null;\n};\n\nexport type FileTreeShellInternalDropPreflightRow = {\n rowId: string;\n rowKind: FileTreeShellRowKind;\n documentId: string | null;\n assetId: string | null;\n assetDocumentId: string | null;\n assetType: string | null;\n storagePath: string | null;\n title: string | null;\n operationProfile?: string | null;\n};\n\nexport type FileTreeShellInternalDropPreflightTargetChild = {\n rowKind: FileTreeShellRowKind;\n documentId: string | null;\n assetId: string | null;\n title: string | null;\n};\n\nexport type FileTreeShellInternalDropPreflightPayload = {\n workspaceId: string | null;\n copy: boolean;\n sourceCapabilities: string[];\n targetCapabilities: string[];\n targetDocumentId: string | null;\n targetRowId: string | null;\n focusedRowId: string | null;\n activeDocumentId: string | null;\n rowIds: string[];\n rows: FileTreeShellInternalDropPreflightRow[];\n targetChildren: FileTreeShellInternalDropPreflightTargetChild[];\n documentParents: Array<{ documentId: string; parentId: string | null }>;\n conflictPolicy: \"prompt\";\n};\n\nexport type FileTreeShellDeletePreflightPayload = {\n workspaceId: string | null;\n rowIds: string[];","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":49,"e":108,"m":1778803002813.1008,"t":"focusedRowId: string | null;\n activeDocumentId: string | null;\n rowIds: string[];\n rows: FileTreeShellInternalDropPreflightRow[];\n targetChildren: FileTreeShellInternalDropPreflightTargetChild[];\n documentParents: Array<{ documentId: string; parentId: string | null }>;\n conflictPolicy: \"prompt\";\n};\n\nexport type FileTreeShellDeletePreflightPayload = {\n workspaceId: string | null;\n rowIds: string[];\n rows: FileTreeShellInternalDropPreflightRow[];\n documentParents: Array<{ documentId: string; parentId: string | null }>;\n};\n\nexport type FileTreeShellPastePreflightPayload = {\n workspaceId: string | null;\n targetDocumentId: string | null;\n focusedRowId: string | null;\n activeDocumentId: string | null;\n rowIds: string[];\n rows: FileTreeShellInternalDropPreflightRow[];\n};\n\nexport type FileTreeShellUploadTargetPreflightPayload = {\n workspaceId: string | null;\n targetDocumentId: string | null;\n targetRowId: string | null;\n focusedRowId: string | null;\n activeDocumentId: string | null;\n rows: FileTreeShellInternalDropPreflightRow[];\n documentWorkspaces: Array<{ documentId: string; workspaceId: string | null }>;\n};\n\nfunction toShellRowKind(item: KernelFileTreeProjectionItem): FileTreeShellRowKind {\n switch (item.rowKind) {\n case \"document\":\n return \"doc\";\n case \"asset_folder\":\n return \"asset-folder\";\n default:\n return item.rowKind;\n }\n}\n\nexport function buildFileTreeShellVisibleRowIds(\n fileTreeItems: readonly KernelFileTreeProjectionItem[],\n): string[] {\n return fileTreeItems\n .map((item) => item.rowId)\n .filter((rowId): rowId is string => typeof rowId === \"string\" && rowId.trim().length > 0);\n}\n\nexport function buildFileTreeShellRowById(input: {\n fileTreeItems: readonly KernelFileTreeProjectionItem[];\n nodeById?: Map<string, SidebarTreeNode>;\n assetById?: Map<string, MediaAsset>;\n}): Map<string, FileTreeShellRow> {\n const rowById = new Map<string, FileTreeShellRow>();","v":"zA6KPG4qs7pION+9wabhvY9Fgj31c0C9HPXnOjCnT7v/pMU82tMDvQVsSb17xUk9VzLTPU5ZhLygsVk9H7Qovf+XpLzPnVC9m++FPOXUaD2Q6ho9R0CSPEbN5jzLWNy8NPOcPBnPbz37PAC7aNFqPOE4fL2HLhQ9SVaCPF5RJD1aWfk7wFe9u41YxL2NXKu6Xn7IvMOXhbwUHQU8RTpjPZ5VKb1vuS89QK2tvB8ysryWH8E9gL67vI7Dsz0ZpGc83fh2PXNL6b1/g7M8xCMbvf0gvTwg9D+8xw2+PXA/6zw5c+u871r4uzKn4jx2wSO806Z+O2bhlD3IR/e8sYeFPbYcFj1C1j29f56yvInMXz3KxRU8jKfUO/ILNz3hdPQ7Qo2cu0+TIb0FJpu81fs2PZYxkLzuX/y8Wj1AvXCEAj05VTa9/20pvNfZJ7zBBn091lf8PEAlk7y/+aw6EcYwvbnaG72nkxA9AH9GPU7C9bzbpLw8SdnUPMGIhL0l+hs9ecrxuwaWTzx+hFm8HjxbvTQ/Mz1VRVS8V4zkO02WhrznJcI73UL+PJNEdDzNv6o81IjqvGBoz7yIleS8uBGsPbgBfL0wy8y8kQKCufiGOL2AvC49j93gurYDELxP1zM9x/g0vRlSA73W0jQ9jNkKPd/R0jxQgtw56e1yO2R3Az0MeDK8TiFkvbfHiL1INLm8/5PkuxiXZTz2GJ89m9wIvPNgaLxrUQi9oFXbPAMMKL1XpAg9xjPDvL8IML0cKXK8GL4DvdRZ3rxvu4M9TqfhvBmxH70rlKY7/Jy3vNylED0Myp27o5NrPaygAT3Juj69rORVPdx0TbmGzIy8MdCevCS5YT02V+g8PR96vTQfDz3WPzq9vHLWvOS2pzzcsbQ7074UvBnrGTxPrZ+91rx6vQRp9bpMy6C71FC+u9aBB71w+1E9BegJPAx4AbtwxWy9oPwAvbfZ2b1jnnA9k6bpPPPFF72C+IG7Ybn2Ozhvnbz2evA8F9wvvRsUo7z6rea8PuoRvWpgzztW1eq8qu2lvUcSKDpgxEO6PrdAPQsiD724ds87rgpmvL8iEDyM5LS70BtuvQxeDr3ostC7hZnvO1NQFL3XVwg7aAjPPb0EjbwZB+c8kc5QvKcGOrx2Qtk8czTBvEAaBrzBJxS9ZqmKO9jL2jwC9BG9u14jPW8GOj3Io0E9JsU0PfyyUrw/QyY6tXZNvPxedrwizwW9lSBcvd7sHD2HXi49v+2GvAKAD7wDhv08eI24PeExZTwvHAk8lYshvBidDDriuC48Teo/vX7GP7yc++e8TCcCvUp2Fb1bXoM81rPVO01YG7uATgw9UqQHPK1yYj2UBjQ9trxZve3MrzoE8wQ9NmWyO/mE4bwEHS48XlEXPdowAz1Zqae8W8EnvZaESL1BQ369bjqbPI3rCry68w091lMdvesPTDyI/R48NgAZPcohGT0JQvC77aJPvKdhwLuiyVq8aTqYvHbB6rzKXkC8RwnwvPHOpjyLD8W8tzwLPThsBLu5ZiU7mnfGvAwJMTxgeeO8JRZrPUxwB72V2lc88OrOvJihKT0H27s66VVCvR/WGr3F1Si9SQ0GPHxPNT3MiIg9U+yPPVHnybtvubQ7OTQMvUkICb2ehII8HBpxPBDDzLzud0C8VHdHu/ZXWT2vraq8QTERPG5eRT1FP+u7SNT8PIlMVLwrgXa8QYOAvVXCqD25Y6u84clhvSxFgz0qreS8AJ6bvO1FAL15nGO8xWsnPR8nbzxJbWq8SXKqvK8fob1ewgU97TRrvNgXMjxQ1Q08w20MPStCcD3qHBO9Z3uDPdlX0ry5VWW8/mZTPeNiErwwQF+9aw1yPUJSzzzNymG98ej7PA1vXjw0iPC8oKpQvJQKSz14IQA9jsOXPA76t7sdNJQ8WBmEPDvLEToUZJk8VGAevFUIRjtMQIQ8jFwtPbCWKbxaYSe7q9xePN
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":97,"e":156,"m":1778803002813.1008,"t":"): string[] {\n return fileTreeItems\n .map((item) => item.rowId)\n .filter((rowId): rowId is string => typeof rowId === \"string\" && rowId.trim().length > 0);\n}\n\nexport function buildFileTreeShellRowById(input: {\n fileTreeItems: readonly KernelFileTreeProjectionItem[];\n nodeById?: Map<string, SidebarTreeNode>;\n assetById?: Map<string, MediaAsset>;\n}): Map<string, FileTreeShellRow> {\n const rowById = new Map<string, FileTreeShellRow>();\n\n input.fileTreeItems.forEach((item) => {\n const rowId = typeof item.rowId === \"string\" ? item.rowId.trim() : \"\";\n if (!rowId || rowById.has(rowId)) {\n return;\n }\n\n const rowKind = toShellRowKind(item);\n const documentId = getDocIdFromFileTreeItem(item);\n const isDocumentRow = rowKind === \"doc\" || rowKind === \"index\";\n\n rowById.set(rowId, {\n rowId,\n rowKind,\n documentId,\n assetId: isDocumentRow ? null : item.resourceMeta.assetId ?? null,\n node: isDocumentRow ? resolveFileTreeRowNode(item, input.nodeById) : null,\n asset: isDocumentRow ? null : resolveFileTreeRowAsset(item, input.assetById),\n });\n });\n\n return rowById;\n}\n\nexport function getOrderedFileTreeShellRows(input: {\n rowIds: Iterable<string>;\n visibleRowIds: readonly string[];\n rowById: Map<string, FileTreeShellRow>;\n}): FileTreeShellRow[] {\n const selectedRowIds = new Set<string>();\n for (const rowId of input.rowIds) {\n if (typeof rowId !== \"string\" || rowId.trim().length === 0) {\n continue;\n }\n if (!input.rowById.has(rowId)) {\n continue;\n }\n selectedRowIds.add(rowId);\n }\n\n return input.visibleRowIds\n .map((rowId) => (selectedRowIds.has(rowId) ? input.rowById.get(rowId) ?? null : null))\n .filter((row): row is FileTreeShellRow => Boolean(row));\n}\n\nexport function extractMindmapAssetIdFromStoragePath(\n storagePath: string | null | undefined,\n): string | null {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":145,"e":204,"m":1778803002813.1008,"t":"}\n selectedRowIds.add(rowId);\n }\n\n return input.visibleRowIds\n .map((rowId) => (selectedRowIds.has(rowId) ? input.rowById.get(rowId) ?? null : null))\n .filter((row): row is FileTreeShellRow => Boolean(row));\n}\n\nexport function extractMindmapAssetIdFromStoragePath(\n storagePath: string | null | undefined,\n): string | null {\n if (!storagePath) return null;\n const normalized = storagePath.replaceAll(\"\\\\\", \"/\");\n\n const prefix = \"mindmaps/\";\n if (normalized.startsWith(prefix)) {\n const rest = normalized.slice(prefix.length);\n const id = rest.split(\"/\")[0];\n return id ? id : null;\n }\n\n const marker = \"/mindmaps/\";\n const idx = normalized.indexOf(marker);\n if (idx === -1) return null;\n const rest = normalized.slice(idx + marker.length);\n const id = rest.split(\"/\")[0];\n return id ? id : null;\n}\n\nexport function resolveFileTreeShellMindmapTargetId(\n row: FileTreeShellRow | null,\n): string | null {\n if (!row?.asset) {\n return null;\n }\n if (row.rowKind === \"asset-folder\" && row.asset.asset_type === \"mindmap\") {\n return row.asset.id;\n }\n if (row.rowKind === \"asset\") {\n return extractMindmapAssetIdFromStoragePath(row.asset.storage_path);\n }\n return null;\n}\n\nexport function inferFileTreeShellTargetDocumentId(input: {\n focusedRowId: string | null;\n rowById: Map<string, FileTreeShellRow>;\n activeDocId: string | null;\n}): string | null {\n if (input.focusedRowId) {\n const row = input.rowById.get(input.focusedRowId) ?? null;\n if (row?.documentId) {\n return row.documentId;\n }\n }\n return input.activeDocId || null;\n}\n\nfunction normalizeShellText(value: string | null | undefined): string | null {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":193,"e":252,"m":1778803002813.1008,"t":"activeDocId: string | null;\n}): string | null {\n if (input.focusedRowId) {\n const row = input.rowById.get(input.focusedRowId) ?? null;\n if (row?.documentId) {\n return row.documentId;\n }\n }\n return input.activeDocId || null;\n}\n\nfunction normalizeShellText(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction getFileTreeShellRowTitle(row: FileTreeShellRow): string | null {\n if (row.rowKind === \"doc\" || row.rowKind === \"index\") {\n return normalizeShellText(row.node?.title ?? null);\n }\n return normalizeShellText(row.asset?.file_name ?? null);\n}\n\nfunction buildFileTreeShellDropPreflightRow(\n row: FileTreeShellRow,\n): FileTreeShellInternalDropPreflightRow {\n return {\n rowId: row.rowId,\n rowKind: row.rowKind,\n documentId: normalizeShellText(row.documentId),\n assetId: normalizeShellText(row.assetId),\n assetDocumentId: normalizeShellText(row.asset?.document_id ?? null),\n assetType: normalizeShellText(row.asset?.asset_type ?? null),\n storagePath: normalizeShellText(row.asset?.storage_path ?? null),\n title: getFileTreeShellRowTitle(row),\n };\n}\n\nfunction buildFileTreeShellTargetChildren(input: {\n targetDocumentId: string | null;\n rowById: Map<string, FileTreeShellRow>;\n parentById: Map<string, string | null>;\n}): FileTreeShellInternalDropPreflightTargetChild[] {\n const targetDocumentId = normalizeShellText(input.targetDocumentId);\n if (!targetDocumentId) {\n return [];\n }\n return Array.from(input.rowById.values())\n .filter((row) => {\n if (row.rowKind === \"doc\" || row.rowKind === \"index\") {\n return input.parentById.get(row.documentId) === targetDocumentId;\n }\n return row.documentId === targetDocumentId;\n })\n .map((row) => ({\n rowKind: row.rowKind,\n documentId: normalizeShellText(row.documentId),\n assetId: normalizeShellText(row.assetId),\n title: getFileTreeShellRowTitle(row),","v":"lXVgPTomx7yBrd69gu7LvWQDrT3Cfv+8+0JZvOy2FzzZkko8qiGtvZK0Lr33vDI9FIDVPSsTwjtYRKU89p0fvfHRubzLIOK8L8M3PTe//TscgSw8rl8+PZPNGDwT9Sa9AavBPaQldz3e6qQ8E83cPE9OGbuNCTA9Sra2umPkXT2VWo472/6SvILp3L2Uu6a5/S4lPfDQAjyK/TQ9gDB2u6lzRryJEJc82DGjvNoixLyGnoA9Foo4vRwt2z2AlHk8oiaWPS2tbb2VJ4S8KIJCvMwicT1zQUG9G7bFPTtWAz3uBFc80YYXPIs8vTw9hzI9R+cuPZiSgT1wmCi9+MyAPe17hzxMPiu97boovXRA6jxNKlY8Akc+PL0tGD3aAxQ8SuiUvF42GbsDcZy8KUWQPSbL+LzXqlS8nnQGvVBJLj2y51S83ZRZvHXToTxigyc9JagFPCTkK72+41o8HoQJvRioD73fTB097ao+PVUi+ztoXCM8JuAEPVgeVb1p3mI8+KQCPcz/kTxmMIC8hGU2vbPRoLv+uHo7yrwRPQXcdboLzuQ85ScwPYDchTxChQ08HPOIvW53S72rgHG9dP2pPSYusbyXdEm9WC9gvIUEVL3ZeCw94MEbO1ROzLyWE1Y9tJ5DvebqQrxs8EA9aF/rPAQeGj3YTfU8aI7Pu65PQz3Lems72nmGvRronr0rTM27sB5zvPsuaTzPbUA9WCSgO86EAb1w2GW8yflAvLkonrzouiw9HdcWvVHGDb3xSKm8THtAOwjGMb0Z50k9VeyfvN4GLr2za0s7iiZKPB06Ujx0EiS8hgXqPCMRED0+4wu9dB4zPXyiorz8Dkq6zAWrvIUeBT3sIb88AAA3vdTrRD3rIAG9xJSQvPC67TyaCDE83MnYO5i4izxeLWG9kntVvY6JWbyc8yy96Vp1u0AjnLzMP2k8pC20PJ+Dsjxsw6y84r+bO0qxir0xPkw9gUlbPOJyOb2UYHm8bn9zOr6Hury1mak71+7uvAtDYb3DZJS8Yk8xvB613bt+R/K8L9uDvV5yiDxPtJa83IsIPSleRb24PpC8bQHsvPLB5zzfF2a7P1w5vfyZvzz+NB68hwmHPA/N8rxVpdk8HqCQPWzjsLtl2kY8RCOru1bpD73cJw29hQJMvH77d7x9nF+9DYYGPOYWkDw0HoC9GSmkPLsoiT2T+D89IzTyPItVarzHR3k8EE7dvDFcjrxFmkW9qKutvSgkgTw07u88fcKXvA23fDyqdHc9VRuPPZqbGj15vju77RGYvPuqHT0bJEA9Q6ytvKpiADxaGr26hVo2vVJ7FDzB0MM7EVJjvGB97TucUaw6DAVePBXk0z0WYiQ9gFSEvb3CQ7w0ZQS86YWavAHu9bxLORE90wyXOywT9Tz01Rm9llZ4vQOvIDyrRHS9dsA5PFt1ejz9ZYA8dh3avP/RBDzDeA898pIJPLVLTz2hBzA8ENuyO0M0ED2EVqA7lwIyuwnBJL3nRi07FQMevbyppDxpkka9qYL5PApv1Dxw4sy89h6BPAcPkrqJXSW9F5kwPJWBv7snVFE9d7IsPCA1Sj05C7M7kWytvFaIxrp/0+W8e4ZBvNOnPj2hjek8VDTMPJnm5rt4yK27uGcgu0EO/LwThwc8iCNKPLZBUb1PVuC7q9tBvJezybrTWjm9WjCUPFvrIzu1Mcu7ixTPPEOZGzyKezC9e/qOvVh9BT1ldui8YWYuvK4yRD0ZgyW8D55/PMgZGbya8lK8ShmZu+pj5TzEPBO86iLSvBDEAb3CxgM9EpU4OpmnazxWS967hqqmPdPkHD0X9lO7d/40PePr0bz/1ks8sBymPXb/uLzNpCa9hnzcPMJSST0fG5+8K1JJPBuDoDs6mCG8FI
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":241,"e":300,"m":1778803002813.1008,"t":"return Array.from(input.rowById.values())\n .filter((row) => {\n if (row.rowKind === \"doc\" || row.rowKind === \"index\") {\n return input.parentById.get(row.documentId) === targetDocumentId;\n }\n return row.documentId === targetDocumentId;\n })\n .map((row) => ({\n rowKind: row.rowKind,\n documentId: normalizeShellText(row.documentId),\n assetId: normalizeShellText(row.assetId),\n title: getFileTreeShellRowTitle(row),\n }));\n}\n\nexport function buildFileTreeShellInternalDropPreflightPayload(input: {\n workspaceId: string | null;\n copy: boolean;\n targetDocumentId: string | null;\n targetRowId: string | null;\n focusedRowId: string | null;\n activeDocId: string | null;\n rowIds: readonly string[];\n rowById: Map<string, FileTreeShellRow>;\n parentById: Map<string, string | null>;\n}): FileTreeShellInternalDropPreflightPayload {\n const rowIdSet = new Set<string>();\n const appendRowId = (value: string | null | undefined) => {\n const rowId = normalizeShellText(value);\n if (rowId) {\n rowIdSet.add(rowId);\n }\n };\n const rowIds = input.rowIds.map((rowId) => (typeof rowId === \"string\" ? rowId : \"\"));\n const targetRowId = normalizeShellText(input.targetRowId);\n const focusedRowId = normalizeShellText(input.focusedRowId);\n appendRowId(targetRowId);\n appendRowId(focusedRowId);\n rowIds.forEach(appendRowId);\n\n const rows = Array.from(rowIdSet)\n .map((rowId) => input.rowById.get(rowId) ?? null)\n .filter((row): row is FileTreeShellRow => Boolean(row))\n .map(buildFileTreeShellDropPreflightRow);\n const targetDocumentId =\n normalizeShellText(input.targetDocumentId) ??\n inferFileTreeShellTargetDocumentId({\n focusedRowId: targetRowId ?? focusedRowId,\n rowById: input.rowById,\n activeDocId: input.activeDocId,\n });\n\n return {\n workspaceId: normalizeShellText(input.workspaceId),\n copy: input.copy,\n sourceCapabilities: [\"read\", \"write\", input.copy ? \"copy\" : \"move\"],\n targetCapabilities: [\"read\", \"write\", \"drop\"],\n targetDocumentId,\n targetRowId,\n focusedRowId,","v":"mU43PVf9QL1PXtG9bgvDvRgagD3YpQq9lF3Uu01iwjv4JaY8PI6lvPjccL07cm495RURPpl6QLxzLsM7zcgnvVlKiju3SM68peU+PX9+ND1fDHk9Tag0PUWVezxgsZq8sOxIPcAXTzybJoI7caruPEJ0Kr0WI5E9iQbwum0DEj1y2JS8gS2TvXLaqL1nAA498qv5u7TUq7zEtRc9eqM5PKANAL0Zwuo6+MPlvAnbVrtEZ8k9aoitvHotyj2eJo88ZEuAPW30hb1nxuM8FsVrvHXIGD2HD1q87k59PbIzND2mTgq9cgcOvITjUj3kx5y7XNw9PJ4EcT3Jeca8KZ1APT2aSDwGX+e8RM4JvaNaWD0Fe3u8cds9PaTIgDzamp48vfoKvVBdKr0zn4C9zN0xPd2reDvf3VG9x8IDvfGOMD2kBkO9I891vG7+GDwRVD09aHNCPWDV0btTwV28XAhfPHmp0bzyb1I9njf4PNjN8Lt0RQI9LBsmPADWOr2NsQ49AwUPvTowQTz827e81K8UvdzoGT0602W80oTvPCDoBb08wtg8aJM2PfJ4kT3i8R28FlNLvJyVo7odnGG926RfPdCED71HVlO9jHlvO8tVQr0FLFU7MYKHPEv/fLz9UUg9nzkSvajob7wYiI07owTFO3NUwzzYdjU9TYgAvJA3Mzyw6uk8yvMTvSVrj72p00y9aQjmPKMDRj0ftLk9omxQOtlPt7oLisS84nWGPM9EF70F7QI90nlXu3LmRLx1nZ479BX/u41IuryR1XQ9pXc/vVQr+bypYN27Q8+KvN+ARD2ZS6u6c/ViPZEQUz1JqAm90QJIPMNe/rte0vC8I6g+Ok9yID3326i8jZbbu28NRz0rGOe8mAIwva8R0Dw49+C7AVlkvNgdnDxTp7S94TBlvR0P1DwHyyu91YKvvEFk2LwTLAA9FfgdPLlQVjv980O9lzh+PPg+pr1Z24M9GxsSPbbvLbyd0r686mtSPD2ofbpqwsM8Kb2EvOMZgzr+GTS7ywKTvGNEsbwCR7e83SOmvXQDArxzIye8wmIOPQTdN723+1e8ksNqPLhhAz2fYKM7bqOivfmxaTtw7o+87d6YPMTRHr23Xzm8VP2aPKUTKLxPq4Y8Rk8GvKekDL3FVTO6CoeuO+x4ejvQdC+9ho2gO3o2Lbze+g29e4ogPWJFXD3LXqM9Q5BePUHEr7xQadE8SvGRuw5BYrxBEOe7vimNvQtW1jwgXfc7UcDnvBd4ojv4sSg9Il6hPdy0nzxbVNA8s/OMvPuwfztpqRY92x0hvYp5Db25ao28PdS6vGo3vbwZd6U8KczuurJFLLx98yM9+fY2O3iMvj1p6QU9J9UVvVLHlzwyxwa8ot3Du9B8s7xiUzY8EOy4PIMwLT0YEgK97oyRvH3e9Lw4qDW9B/J2vHA+W7wgP9Y8EieavakvhjzMIRM9+VkOPWUYPz2OS7G76NxpPOLZzDtJ3Q69Xa1HvZYDdb1Fudi7fUWvvLxADD0CfIi9PUcMvIQKtrwUoFa85Xy+vF5CAT26lI29CV4WPcqU37uiecE8BE3QvA4oQj1E97k86vpovbxZhbxjwb28WW5yvOOCdz1polY9l4AhPTAtCjxNy8Q7PxWWvDEyBL05+lI8iaUave8NxbyktM+8HLbbvGSz6TsU3Zq78aIru4f3KT1KBAQ7p18LPQlOtjtSCvu8GlOXvaAeKD0pbvS8oxMCvTaTdj1M2Rm8E8CuPNMll7tHu7i8VaL4PDM8mzz0GQC9ZAeMvDbNsL3L72w8eREfvT9ATryNwa08CIu3PIbfvzwtGwS8f
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":289,"e":348,"m":1778803002813.1008,"t":"rowById: input.rowById,\n activeDocId: input.activeDocId,\n });\n\n return {\n workspaceId: normalizeShellText(input.workspaceId),\n copy: input.copy,\n sourceCapabilities: [\"read\", \"write\", input.copy ? \"copy\" : \"move\"],\n targetCapabilities: [\"read\", \"write\", \"drop\"],\n targetDocumentId,\n targetRowId,\n focusedRowId,\n activeDocumentId: normalizeShellText(input.activeDocId),\n rowIds,\n rows,\n targetChildren: buildFileTreeShellTargetChildren({\n targetDocumentId,\n rowById: input.rowById,\n parentById: input.parentById,\n }),\n documentParents: Array.from(input.parentById.entries()).map(([documentId, parentId]) => ({\n documentId,\n parentId: normalizeShellText(parentId),\n })),\n conflictPolicy: \"prompt\",\n };\n}\n\nexport function buildFileTreeShellDeletePreflightPayload(input: {\n workspaceId: string | null;\n rowIds: readonly string[];\n rowById: Map<string, FileTreeShellRow>;\n parentById: Map<string, string | null>;\n}): FileTreeShellDeletePreflightPayload {\n const rowIds = input.rowIds.map((rowId) => (typeof rowId === \"string\" ? rowId : \"\"));\n const rowIdSet = new Set<string>();\n rowIds.forEach((rowId) => {\n const normalized = normalizeShellText(rowId);\n if (normalized) {\n rowIdSet.add(normalized);\n }\n });\n\n const rows = Array.from(rowIdSet)\n .map((rowId) => input.rowById.get(rowId) ?? null)\n .filter((row): row is FileTreeShellRow => Boolean(row))\n .map(buildFileTreeShellDropPreflightRow);\n\n return {\n workspaceId: normalizeShellText(input.workspaceId),\n rowIds,\n rows,\n documentParents: Array.from(input.parentById.entries()).map(([documentId, parentId]) => ({\n documentId,\n parentId: normalizeShellText(parentId),\n })),\n };\n}\n\nexport function buildFileTreeShellPastePreflightPayload(input: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":337,"e":396,"m":1778803002813.1008,"t":"return {\n workspaceId: normalizeShellText(input.workspaceId),\n rowIds,\n rows,\n documentParents: Array.from(input.parentById.entries()).map(([documentId, parentId]) => ({\n documentId,\n parentId: normalizeShellText(parentId),\n })),\n };\n}\n\nexport function buildFileTreeShellPastePreflightPayload(input: {\n workspaceId: string | null;\n targetDocumentId: string | null;\n focusedRowId: string | null;\n activeDocId: string | null;\n rowIds: readonly string[];\n rowById: Map<string, FileTreeShellRow>;\n}): FileTreeShellPastePreflightPayload {\n const rowIds = input.rowIds.map((rowId) => (typeof rowId === \"string\" ? rowId : \"\"));\n const rowIdSet = new Set<string>();\n const focusedRowId = normalizeShellText(input.focusedRowId);\n if (focusedRowId) {\n rowIdSet.add(focusedRowId);\n }\n rowIds.forEach((rowId) => {\n const normalized = normalizeShellText(rowId);\n if (normalized) {\n rowIdSet.add(normalized);\n }\n });\n\n const rows = Array.from(rowIdSet)\n .map((rowId) => input.rowById.get(rowId) ?? null)\n .filter((row): row is FileTreeShellRow => Boolean(row))\n .map(buildFileTreeShellDropPreflightRow);\n\n return {\n workspaceId: normalizeShellText(input.workspaceId),\n targetDocumentId: normalizeShellText(input.targetDocumentId),\n focusedRowId,\n activeDocumentId: normalizeShellText(input.activeDocId),\n rowIds,\n rows,\n };\n}\n\nexport function buildFileTreeShellUploadTargetPreflightPayload(input: {\n workspaceId: string | null;\n targetDocumentId: string | null;\n targetRowId: string | null;\n focusedRowId: string | null;\n activeDocId: string | null;\n rowById: Map<string, FileTreeShellRow>;\n documentWorkspaceById: Map<string, string | null>;\n}): FileTreeShellUploadTargetPreflightPayload {\n const rowIdSet = new Set<string>();\n const appendRowId = (value: string | null | undefined) => {\n const rowId = normalizeShellText(value);\n if (rowId) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":385,"e":444,"m":1778803002813.1008,"t":"workspaceId: string | null;\n targetDocumentId: string | null;\n targetRowId: string | null;\n focusedRowId: string | null;\n activeDocId: string | null;\n rowById: Map<string, FileTreeShellRow>;\n documentWorkspaceById: Map<string, string | null>;\n}): FileTreeShellUploadTargetPreflightPayload {\n const rowIdSet = new Set<string>();\n const appendRowId = (value: string | null | undefined) => {\n const rowId = normalizeShellText(value);\n if (rowId) {\n rowIdSet.add(rowId);\n }\n };\n const targetRowId = normalizeShellText(input.targetRowId);\n const focusedRowId = normalizeShellText(input.focusedRowId);\n appendRowId(targetRowId);\n appendRowId(focusedRowId);\n\n const rows = Array.from(rowIdSet)\n .map((rowId) => input.rowById.get(rowId) ?? null)\n .filter((row): row is FileTreeShellRow => Boolean(row))\n .map(buildFileTreeShellDropPreflightRow);\n\n return {\n workspaceId: normalizeShellText(input.workspaceId),\n targetDocumentId: normalizeShellText(input.targetDocumentId),\n targetRowId,\n focusedRowId,\n activeDocumentId: normalizeShellText(input.activeDocId),\n rows,\n documentWorkspaces: Array.from(input.documentWorkspaceById.entries()).map(\n ([documentId, workspaceId]) => ({\n documentId,\n workspaceId: normalizeShellText(workspaceId),\n }),\n ),\n };\n}\n\nexport function collectFileTreeShellAssetHints(input: {\n rowById: Map<string, FileTreeShellRow>;\n assetIds: readonly string[];\n}): MediaAsset[] {\n const hints: MediaAsset[] = [];\n const seen = new Set<string>();\n input.assetIds.forEach((assetId) => {\n const normalized = normalizeShellText(assetId);\n if (!normalized || seen.has(normalized)) {\n return;\n }\n const asset =\n input.rowById.get(`asset:${normalized}`)?.asset ??\n input.rowById.get(`asset-folder:${normalized}`)?.asset ??\n null;\n if (!asset) {\n return;\n }\n seen.add(normalized);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/shell.ts","s":433,"e":449,"m":1778803002813.1008,"t":"const normalized = normalizeShellText(assetId);\n if (!normalized || seen.has(normalized)) {\n return;\n }\n const asset =\n input.rowById.get(`asset:${normalized}`)?.asset ??\n input.rowById.get(`asset-folder:${normalized}`)?.asset ??\n null;\n if (!asset) {\n return;\n }\n seen.add(normalized);\n hints.push(asset);\n });\n return hints;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/types.ts","s":1,"e":60,"m":1776339382549.111,"t":"\"use client\";\n\nimport type { SidebarTreeNode } from \"@/lib/kernel-sidebar\";\nimport type { MediaAsset } from \"@/types/media\";\n\nexport type FileTreeRowKind = \"doc\" | \"index\" | \"asset\" | \"asset-folder\";\n\nexport type FileTreeRowId =\n | `doc:${string}`\n | `index:${string}`\n | `asset:${string}`\n | `asset-folder:${string}`;\n\nexport type ParsedFileTreeRowId =\n | { kind: \"doc\"; docId: string }\n | { kind: \"index\"; docId: string }\n | { kind: \"asset\"; assetId: string }\n | { kind: \"asset-folder\"; assetId: string };\n\nexport function makeDocRowId(docId: string): FileTreeRowId {\n return `doc:${docId}`;\n}\n\nexport function makeIndexRowId(docId: string): FileTreeRowId {\n return `index:${docId}`;\n}\n\nexport function makeAssetRowId(assetId: string): FileTreeRowId {\n return `asset:${assetId}`;\n}\n\nexport function makeAssetFolderRowId(assetId: string): FileTreeRowId {\n return `asset-folder:${assetId}`;\n}\n\nexport function parseFileTreeRowId(rowId: string): ParsedFileTreeRowId | null {\n const idx = rowId.indexOf(\":\");\n if (idx <= 0) return null;\n const prefix = rowId.slice(0, idx);\n const rest = rowId.slice(idx + 1);\n if (!rest) return null;\n switch (prefix) {\n case \"doc\":\n return { kind: \"doc\", docId: rest };\n case \"index\":\n return { kind: \"index\", docId: rest };\n case \"asset\":\n return { kind: \"asset\", assetId: rest };\n case \"asset-folder\":\n return { kind: \"asset-folder\", assetId: rest };\n default:\n return null;\n }\n}\n\nexport type FileTreeRow =\n | {\n kind: \"doc\";\n rowId: FileTreeRowId;\n depth: number;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/types.ts","s":49,"e":108,"m":1776339382549.111,"t":"case \"asset-folder\":\n return { kind: \"asset-folder\", assetId: rest };\n default:\n return null;\n }\n}\n\nexport type FileTreeRow =\n | {\n kind: \"doc\";\n rowId: FileTreeRowId;\n depth: number;\n docId: string;\n parentDocId: string | null;\n node: SidebarTreeNode;\n hasChildren: boolean;\n isExpanded: boolean;\n }\n | {\n kind: \"index\";\n rowId: FileTreeRowId;\n depth: number;\n docId: string;\n parentDocId: string;\n node: SidebarTreeNode;\n }\n | {\n kind: \"asset-folder\";\n rowId: FileTreeRowId;\n depth: number;\n docId: string;\n parentDocId: string;\n asset: MediaAsset;\n hasChildren: boolean;\n isExpanded: boolean;\n }\n | {\n kind: \"asset\";\n rowId: FileTreeRowId;\n depth: number;\n docId: string;\n parentDocId: string;\n asset: MediaAsset;\n };\n\nexport function getFileTreeRowLabel(row: FileTreeRow): string {\n switch (row.kind) {\n case \"doc\":\n return row.node.title || \"无标题\";\n case \"index\":\n return \"index.md\";\n case \"asset-folder\": {\n const name = row.asset.file_name || \"附件\";\n // 思维导图展示为“文件夹”时,去掉 .json 结尾更直观\n return row.asset.asset_type === \"mindmap\" ? name.replace(/\\.json$/i, \"\") : name;\n }\n case \"asset\":\n return row.asset.file_name || \"附件\";\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/file-tree/types.ts","s":97,"e":120,"m":1776339382549.111,"t":"return row.node.title || \"无标题\";\n case \"index\":\n return \"index.md\";\n case \"asset-folder\": {\n const name = row.asset.file_name || \"附件\";\n // 思维导图展示为“文件夹”时,去掉 .json 结尾更直观\n return row.asset.asset_type === \"mindmap\" ? name.replace(/\\.json$/i, \"\") : name;\n }\n case \"asset\":\n return row.asset.file_name || \"附件\";\n }\n}\n\nexport function getOwningDocId(row: FileTreeRow): string {\n switch (row.kind) {\n case \"doc\":\n case \"index\":\n return row.docId;\n case \"asset-folder\":\n case \"asset\":\n return row.asset.document_id;\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.test.ts","s":1,"e":60,"m":1777197370737.2551,"t":"import { afterEach, describe, expect, it, vi } from \"vitest\";\nimport type { ConvexHttpClient } from \"convex/browser\";\n\nvi.mock(\"@/lib/auth/authContext\", () => ({\n HttpError: class HttpError extends Error {\n status: number;\n\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n },\n requireAuthContext: vi.fn(async () => ({\n userId: \"user_1\",\n })),\n}));\n\nvi.mock(\"@/lib/api-utils\", () => ({\n apiErrorResponse: vi.fn((message: string, status = 500, details?: unknown) => ({\n message,\n status,\n details,\n })),\n}));\n\nvi.mock(\"@/lib/convex/api\", () => ({\n api: {\n documents: {\n getContent: \"documents:getContent\",\n },\n },\n}));\n\nvi.mock(\"@/lib/convex/route\", () => ({\n getAuthedConvexClient: vi.fn(),\n}));\n\nvi.mock(\"@/lib/documents/bridge-log\", () => ({\n recordBridgeCommandArtifacts: vi.fn(),\n recordBridgeCommandFailureArtifacts: vi.fn(),\n recordRustBridgeCommandArtifacts: vi.fn(),\n}));\n\nvi.mock(\"@/lib/documents/rust-runtime\", () => ({\n resolveRustBridgeCommandPlan: vi.fn(),\n resolveRustBridgeQueryPlan: vi.fn(),\n executeRustBridgeQueryTransport: vi.fn(),\n executeRustBridgeMutationTransport: vi.fn(),\n}));\n\nvi.mock(\"@/lib/document-content\", () => ({\n extractBlocksFromContent: vi.fn(),\n}));\n\nafterEach(() => {\n vi.clearAllMocks();\n});\n\ndescribe(\"documents/block-command-adapter\", () => {\n it(\"executeBlockPatchBridgeCommand 应改走 Rust artifact writer\", async () => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.test.ts","s":49,"e":108,"m":1777197370737.2551,"t":"}));\n\nvi.mock(\"@/lib/document-content\", () => ({\n extractBlocksFromContent: vi.fn(),\n}));\n\nafterEach(() => {\n vi.clearAllMocks();\n});\n\ndescribe(\"documents/block-command-adapter\", () => {\n it(\"executeBlockPatchBridgeCommand 应改走 Rust artifact writer\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const {\n recordBridgeCommandArtifacts,\n recordRustBridgeCommandArtifacts,\n } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n const { extractBlocksFromContent } = await import(\"@/lib/document-content\");\n const { executeBlockPatchBridgeCommand } = await import(\"./block-command-adapter\");\n\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n query: vi.fn().mockResolvedValue({\n content: { type: \"doc\" },\n }),\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(extractBlocksFromContent).mockReturnValue([\n {\n id: \"blk_1\",\n type: \"paragraph\",\n },\n ]);\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"blocks.patch\",\n commandId: \"cmd_block_patch_1\",\n functionName: \"documents:updateContent\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n blockId: \"blk_1\",\n nextBlock: {\n id: \"blk_1\",\n type: \"heading\",\n },\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.test.ts","s":97,"e":146,"m":1777197370737.2551,"t":"idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n blockId: \"blk_1\",\n nextBlock: {\n id: \"blk_1\",\n type: \"heading\",\n },\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n revision: 8,\n conflict_detection_key: \"doc_1:8\",\n });\n\n const result = await executeBlockPatchBridgeCommand({\n request: new Request(\"http://127.0.0.1:3000/api/documents/blocks/patch\", {\n method: \"POST\",\n }),\n sourceDocumentId: \"doc_1\",\n workspaceId: \"ws_1\",\n blockId: \"blk_1\",\n nextBlock: {\n id: \"blk_1\",\n type: \"heading\",\n },\n });\n\n expect(result.commandName).toBe(\"blocks.patch\");\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: expect.objectContaining({\n workspaceId: \"ws_1\",\n }),\n envelope: expect.objectContaining({\n name: \"blocks.patch\",\n }),\n plan: expect.objectContaining({\n commandName: \"blocks.patch\",\n }),\n result: {\n revision: 8,\n conflict_detection_key: \"doc_1:8\",\n },\n });\n expect(recordBridgeCommandArtifacts).not.toHaveBeenCalled();\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":1,"e":60,"m":1777197392904.5415,"t":"import { api } from \"@/lib/convex/api\";\nimport { getAuthedConvexClient } from \"@/lib/convex/route\";\nimport {\n buildDocumentBridgeContext,\n buildDocumentCommandEnvelope,\n buildDocumentQueryEnvelope,\n documentBridgeErrorResponse,\n type BridgeContext,\n} from \"@/lib/documents/bridge\";\nimport {\n recordBridgeCommandFailureArtifacts,\n recordRustBridgeCommandArtifacts,\n} from \"@/lib/documents/bridge-log\";\nimport {\n executeRustBridgeMutationTransport,\n executeRustBridgeQueryTransport,\n resolveRustBridgeCommandPlan,\n resolveRustBridgeQueryPlan,\n} from \"@/lib/documents/rust-runtime\";\nimport { extractBlocksFromContent } from \"@/lib/document-content\";\n\ntype BlockLike = {\n id: string;\n type?: string;\n props?: Record<string, unknown>;\n content?: unknown;\n children?: BlockLike[];\n};\n\nfunction cloneBlock(block: BlockLike): BlockLike {\n return {\n ...block,\n props: block.props ? { ...block.props } : undefined,\n content: Array.isArray(block.content) ? [...block.content] : block.content,\n children: Array.isArray(block.children) ? block.children.map((item) => cloneBlock(item)) : block.children,\n };\n}\n\nfunction findBlockInTree(\n blocks: BlockLike[],\n blockId: string,\n): { block: BlockLike; parent: BlockLike | null; index: number } | null {\n const stack: Array<{ list: BlockLike[]; parent: BlockLike | null }> = [{ list: blocks, parent: null }];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n for (let i = 0; i < current.list.length; i += 1) {\n const block = current.list[i]!;\n if (block.id === blockId) {\n return { block, parent: current.parent, index: i };\n }\n if (Array.isArray(block.children) && block.children.length > 0) {\n stack.push({ list: block.children, parent: block });\n }\n }\n }\n return null;\n}\n\nfunction removeBlockSubtree(blocks: BlockLike[], blockId: string) {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":49,"e":108,"m":1777197392904.5415,"t":"if (block.id === blockId) {\n return { block, parent: current.parent, index: i };\n }\n if (Array.isArray(block.children) && block.children.length > 0) {\n stack.push({ list: block.children, parent: block });\n }\n }\n }\n return null;\n}\n\nfunction removeBlockSubtree(blocks: BlockLike[], blockId: string) {\n const nextTop = blocks.map((item) => cloneBlock(item));\n const hit = findBlockInTree(nextTop, blockId);\n if (!hit) {\n return { removed: null as BlockLike | null, nextBlocks: nextTop };\n }\n if (hit.parent) {\n const nextChildren = Array.isArray(hit.parent.children) ? hit.parent.children.map((item) => cloneBlock(item)) : [];\n const removed = nextChildren.splice(hit.index, 1)[0] ?? null;\n hit.parent.children = nextChildren;\n return { removed, nextBlocks: nextTop };\n }\n const removed = nextTop.splice(hit.index, 1)[0] ?? null;\n return { removed, nextBlocks: nextTop };\n}\n\nfunction replaceBlockInTree(blocks: BlockLike[], blockId: string, nextBlock: unknown) {\n const nextTop = blocks.map((item) => cloneBlock(item));\n const hit = findBlockInTree(nextTop, blockId);\n if (!hit || !nextBlock || typeof nextBlock !== \"object\" || Array.isArray(nextBlock)) {\n return { ok: false, nextBlocks: nextTop };\n }\n const normalized = cloneBlock({ ...(nextBlock as BlockLike), id: blockId });\n if (hit.parent) {\n const nextChildren = Array.isArray(hit.parent.children) ? hit.parent.children.map((item) => cloneBlock(item)) : [];\n nextChildren[hit.index] = normalized;\n hit.parent.children = nextChildren;\n return { ok: true, nextBlocks: nextTop };\n }\n nextTop[hit.index] = normalized;\n return { ok: true, nextBlocks: nextTop };\n}\n\nasync function buildBridgeContext(request: Request, workspaceId: string | null): Promise<BridgeContext> {\n return await buildDocumentBridgeContext({ request, workspaceId });\n}\n\nexport async function executeBlockGetBridgeQuery(input: {\n request: Request;\n sourceDocumentId: string;\n blockId: string;\n}) {\n const context = await buildBridgeContext(input.request, null);\n const envelope = buildDocumentQueryEnvelope({\n name: \"blocks.get\",\n payload: {\n sourceDocumentId: input.sourceDocumentId,\n blockId: input.blockId,\n },","v":"a6FgPW0SCTw19bG93yixvfO2UD0NtSW9TFypvEhFXjzK4Vs9papWvWuh4LxgY4E9ZX3SPcSKlTygXkQ8p8VvvfClCrxU1A+9LR1cPQ08CD04XU89vWlgO7uqozwLvMK8AeOlPdQcPT0Lygs9hgcgPDZyaL2DhIg9bAPgu3L5Fj2v6zE8aMpdvY6WpL3n6Nc8mH08PfLYybssEoo7dHyivG5G2Dw2g6w8m2wmvOTPwLxgDHA98BERvfkh2j3tAvk8xp63PbOwtL3u1q68dwAxvKN5ZD2ojBq9kmTCPYGSGD0O2fq6NHmWugCROz29wG08bby4OqIjeT3Nfgk8OUszPYVgjT1OPIm7OHprvTz4gj0eklE8p2Xbu1SdVT2o13g8UwywPC8ZGrxMqhq99YGrPfnW5Ttl/I294Hs1vZ6poD1JGwi86nt3PG1vAT28NSQ7ln3MPPhE37wkNtW8hSGSvLbFCL0muz897KUjPfIaAL1SeoU8pSZfPMv3H70H0kY9ERzWvEuJxDzoXJw7yjA9PKfNMD1g7Qo85JiDu7Vjjr2ESrK8RkYNPas1cz32Gfa8KPcavBEmJL3WWr684ItNPMUrh70H8Qa92JqbPIDdUb16SBo8uxKhvEW9xrx+yx09KhIdvemQgDuPYNq7fw6fOtyBiz22OIw8ncAKvb9o8zwYoxI9vgyHvf2oBb2gNlq8zVJiPGX4MbrD+PI8renuPK+qq7ymy9a8YaB3OSR6m7zIIo087X5VPPf1LL2WJYm8YlcTvHeUgbxlY3k9msKOvP6YG71ZWKm8fiZGvURyGD3nDcE8S6hyPZwg4Tyu59S8CiZpPTxwVTvwyxG8SdmyOpEGHj1/p2E7faSEvfZWAT36Sk69jmnivDZmvTxblB89sKBGPJZ2JbzMpGK9s9hIvSUs7zuhqfW78IFyvNGzOrwVIJ48hok9vG2C/DuHi768N9B2uhKxwb2RUqc9FwiEPLOqP7yjPMC8rCOpPFS/UryB/T67LM/JvIB4P7zQluS8/+DVO54hWzx0yMu8eY6mvczjhTxKBPu7KnEkPYiEYr3cqeW7ghbNPEu9OD2wlam8J7eQvXZ2QD2bj/a8bXVpPSYEB7ww+y47NyurPcQZq7yF9/u73znQPEeX9by7Ntm778q0u+2FgjzpoYq9N4SgPCi6KTy9qVy9Zlw3POlKNj21G5w9dHoNPU7USLxRgwM9KF4evXPRNLy8KSa8HJuqvVpt9TwRUU48ANWyvCtQgj0kFVc90J1mPUdN7zyv2tO8USsDvdlotjxLKwo9SlZKvPByirz53LO8XoPRvDOYG71XXV+75hXyPJGHBL37eas8kJsEPF+afz2DP0M8tDYSvY4hhjwpIHW7HX+Qu1BDRr1PXRE8F6o/vNa26DwwuhG9veBPvaWMrbxIjwO9OJM8O0W/SLx7wiU8SlcpvV8s7rrJSyM90UU5PXDc7jzKICK8EQ/4PFiCDbzYjDm9imkKvIusEb173eE8hfF+vAacqTxHYwe9glefPFTo+7x2+oK8T1n4uu6pE7ysGlO97Q8lPWmDjbng/7s9IidYO4U+XT1UMqO7SwQMve8DHr2N11i9PVqfOl69UD0ECCI9vytuPYJurzwrr/O8Iri2PF1nAL3z7Iu7kMjKO4Esg7wAROK6mcHPOsoacjxj
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":97,"e":156,"m":1777197392904.5415,"t":"export async function executeBlockGetBridgeQuery(input: {\n request: Request;\n sourceDocumentId: string;\n blockId: string;\n}) {\n const context = await buildBridgeContext(input.request, null);\n const envelope = buildDocumentQueryEnvelope({\n name: \"blocks.get\",\n payload: {\n sourceDocumentId: input.sourceDocumentId,\n blockId: input.blockId,\n },\n });\n const plan = await resolveRustBridgeQueryPlan({ context, envelope });\n const { client } = await getAuthedConvexClient();\n const doc = await executeRustBridgeQueryTransport<{ content?: unknown } | null>({\n client,\n plan,\n });\n if (!doc) {\n throw new Error(\"页面不存在或无权限\");\n }\n const blocks = extractBlocksFromContent(doc.content) as BlockLike[];\n const hit = findBlockInTree(blocks, input.blockId);\n if (!hit) {\n throw new Error(\"块不存在或无权限\");\n }\n return {\n requestId: context.requestId,\n traceId: context.traceId,\n queryName: envelope.name,\n result: { block: hit.block },\n };\n}\n\nexport async function executeBlockPatchBridgeCommand(input: {\n request: Request;\n sourceDocumentId: string;\n workspaceId: string | null;\n blockId: string;\n nextBlock: unknown;\n}) {\n const context = await buildBridgeContext(input.request, input.workspaceId);\n const envelope = buildDocumentCommandEnvelope({\n name: \"blocks.patch\",\n payload: {\n documentId: input.sourceDocumentId,\n workspaceId: input.workspaceId,\n blockId: input.blockId,\n nextBlock: input.nextBlock,\n },\n context,\n target: {\n workspaceId: input.workspaceId,\n pageId: input.sourceDocumentId,\n blockId: input.blockId,\n },\n });\n const plan = await resolveRustBridgeCommandPlan({ context, envelope });\n const { client } = await getAuthedConvexClient();","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":145,"e":204,"m":1777197392904.5415,"t":"blockId: input.blockId,\n nextBlock: input.nextBlock,\n },\n context,\n target: {\n workspaceId: input.workspaceId,\n pageId: input.sourceDocumentId,\n blockId: input.blockId,\n },\n });\n const plan = await resolveRustBridgeCommandPlan({ context, envelope });\n const { client } = await getAuthedConvexClient();\n const doc = await client.query(api.documents.getContent, { id: input.sourceDocumentId });\n if (!doc) {\n throw new Error(\"页面不存在或无权限\");\n }\n const blocks = extractBlocksFromContent(doc.content) as BlockLike[];\n const replaced = replaceBlockInTree(blocks, input.blockId, input.nextBlock);\n if (!replaced.ok) {\n throw new Error(\"块不存在或无权限\");\n }\n try {\n const transportResult = await executeRustBridgeMutationTransport({\n client,\n plan,\n });\n await recordRustBridgeCommandArtifacts({\n client,\n context,\n envelope,\n plan,\n result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({\n client,\n context,\n envelope,\n error,\n });\n throw error;\n }\n return {\n requestId: context.requestId,\n traceId: context.traceId,\n commandId: envelope.commandId,\n commandName: envelope.name,\n result: { ok: true as const },\n };\n}\n\nexport async function executeBlockMoveBridgeCommand(input: {\n request: Request;\n sourceDocumentId: string;\n targetDocumentId: string;\n blockId: string;\n}) {\n const { client } = await getAuthedConvexClient();\n const source = await client.query(api.documents.getContent, { id: input.sourceDocumentId });\n if (!source) throw new Error(\"源页面不存在或无权限\");","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":193,"e":252,"m":1777197392904.5415,"t":"};\n}\n\nexport async function executeBlockMoveBridgeCommand(input: {\n request: Request;\n sourceDocumentId: string;\n targetDocumentId: string;\n blockId: string;\n}) {\n const { client } = await getAuthedConvexClient();\n const source = await client.query(api.documents.getContent, { id: input.sourceDocumentId });\n if (!source) throw new Error(\"源页面不存在或无权限\");\n const target = await client.query(api.documents.getContent, { id: input.targetDocumentId });\n if (!target) throw new Error(\"目标页面不存在或无权限\");\n const sourceBlocks = extractBlocksFromContent(source.content) as BlockLike[];\n const removedRes = removeBlockSubtree(sourceBlocks, input.blockId);\n if (!removedRes.removed) throw new Error(\"源块不存在或无权限\");\n const context = await buildBridgeContext(input.request, null);\n const envelope = buildDocumentCommandEnvelope({\n name: \"blocks.move\",\n payload: {\n sourceDocumentId: input.sourceDocumentId,\n targetDocumentId: input.targetDocumentId,\n blockId: input.blockId,\n },\n context,\n target: {\n pageId: input.targetDocumentId,\n blockId: input.blockId,\n },\n });\n const plan = await resolveRustBridgeCommandPlan({ context, envelope });\n try {\n const transportResult = await executeRustBridgeMutationTransport({ client, plan });\n await recordRustBridgeCommandArtifacts({\n client,\n context,\n envelope,\n plan,\n result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({\n client,\n context,\n envelope,\n error,\n });\n throw error;\n }\n return {\n requestId: context.requestId,\n traceId: context.traceId,\n commandId: envelope.commandId,\n commandName: envelope.name,\n result: { ok: true as const },\n };\n}\n\nexport async function executeBlockEmbedBridgeCommand(input: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":241,"e":300,"m":1777197392904.5415,"t":"throw error;\n }\n return {\n requestId: context.requestId,\n traceId: context.traceId,\n commandId: envelope.commandId,\n commandName: envelope.name,\n result: { ok: true as const },\n };\n}\n\nexport async function executeBlockEmbedBridgeCommand(input: {\n request: Request;\n sourceDocumentId: string;\n targetDocumentId: string;\n blockId: string;\n}) {\n const { client } = await getAuthedConvexClient();\n const source = await client.query(api.documents.getContent, { id: input.sourceDocumentId });\n if (!source) throw new Error(\"源页面不存在或无权限\");\n const target = await client.query(api.documents.getContent, { id: input.targetDocumentId });\n if (!target) throw new Error(\"目标页面不存在或无权限\");\n const targetMeta = await client.query(api.documents.getMeta, { id: input.targetDocumentId });\n const sourceBlocks = extractBlocksFromContent(source.content) as BlockLike[];\n const hit = findBlockInTree(sourceBlocks, input.blockId);\n if (!hit) throw new Error(\"源块不存在或无权限\");\n const anchorId = (targetMeta as { embed_default_block_id?: string | null } | null)?.embed_default_block_id ?? null;\n const anchorIndex =\n typeof anchorId === \"string\" && anchorId.trim()\n ? extractBlocksFromContent(target.content).findIndex((block) => String((block as BlockLike).id ?? \"\") === anchorId)\n : -1;\n const targetBlocks = extractBlocksFromContent(target.content) as BlockLike[];\n void targetBlocks;\n void anchorIndex;\n const context = await buildBridgeContext(input.request, null);\n const envelope = buildDocumentCommandEnvelope({\n name: \"blocks.embed\",\n payload: {\n sourceDocumentId: input.sourceDocumentId,\n targetDocumentId: input.targetDocumentId,\n blockId: input.blockId,\n },\n context,\n target: {\n pageId: input.targetDocumentId,\n blockId: input.blockId,\n },\n });\n const plan = await resolveRustBridgeCommandPlan({ context, envelope });\n try {\n const transportResult = await executeRustBridgeMutationTransport({ client, plan });\n await recordRustBridgeCommandArtifacts({\n client,\n context,\n envelope,\n plan,\n result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({","v":"/alcPcFa0TyNSse9Q1jivVpskz3cACa8SJx5vKqAaLxr2BI991SBvfCpE72o4xk9e+a2PQLTHTxGkgM9+jc0vZgFLD2qGCy9qa1dvHRssjy1VKU8fu0VvPhc6DxlST68o8C4PZ5z5DycfnI8kzxVPYp0qr15kyU9aAM0vIlHLT34lQ87HfMAvRx4bL3bu5C8Xt9PvHJ+EL2rVl29pn3UvOBRhzsxXEc8BoaovE5Tq7shOwE98F1KvF0doz3rVog9heV9PZxa3L1QNGk8uwOAvX1dTj0CvIq9PmrXPVDgGj0lkgu9U07rOs/9ODzM4uC8q/T4O1zLlT0wYFQ8JKJ/PReJtD0bOcq8CO8mvZ5Lqz0Ys728u07ZuzhWgT3wmB07tRgQPZfkjLxNSYi8sn1RPaQ1H71EAKu9zOERvWhhTD00IRO9CziPvAUrrzwsNZ08CfyKPfTEor1JMgS8siASvaBHRb17Ohk90H9DPLsckLyyhHy8KBI0vXiAlrz6+3W8tP9NvfTawzxg/Nc8wTaPPIE1iDs6Qlk7oYA1vClZTTvAcYC8LU1jPMhLlDy6zK87ES43vTLPLr1O3VM8IFJ8PRAzv70UEXq8QGStu9sFkztV99Q8DQN9vEvfnLzPRaU8BRanO/OSDLyzDt07F2XpudBuRT19jRM9Y68ovDolebq3FZU5FLuLvReHDr3wu7y85d6QOyyuGL0GlV48aQ6wPJGYjbzv4iu9be/DPLsVr7xePCw8iuDfu8YNhjtf1Ta9yT59vCI4UbwKkoE90oLVO1KD1LwR6OW6xjyWu+7nyjxW49A7vyIOPc9V0TtGfe28wT8NPc5aXbtayza8XjpUPFlOCz0JiH09yietvQJanTsPlbK8voaOvMje5bty0g49fOscvN3THLtTw3K9S0WtvJzdv7sU/DU8guervJ76ST1PKwU9erFfvdTkoTvCOsq8+1cOO5fuor2DMT48I7MGPHx+vLxFkos66IiYOxhoHruJGpQ88acFvXvD7Lzewuq88qmYu+xGLz1iu4y8syRKvSfxWDuScka92tcBPXQFBb21KtI77mwnPQ+tizmmJyU7yLbwvfVcRz0Krxy9o1kAPXvaArxM2Fm87gawPYqufLzDoNW708GKPNpQ1rw8svM8S8D9Otvts7s1zVq9HdcFuh8OMT1Anim95dQTPfIGADytofo8wUA2PCii9LyqrQ87/DZePFVUib1fJX+8iNGbvfvptDwivZs893MhO+/XkT3HV4489qOrPZxGtzu9u9i8vJFmvUvM9DyxX528LBkNvFkMjbx/Q6u8QKavvCivMr1z7Ze8HfjbPGCep7v9YZk8gMtMPBQ0gD3TXow8EiXqvK74uDyEY7K7dOBnvC1oLL3J/K28CY2Zu7eUVLsQ5ia9+Zq5vJ1w1LzYEbK8WibOPEWHI7zhmcI75zNIvXkFuzwVrQW8FpXQPBOqIj2vlAq7bYe5vMCMXjruvqe8627muXKN17z2ng28bpgMPHp/Ubq0uj29BTSwPI1T3rwLVl47057jPPslZDy4XQ+89F9tPZSPxLzWrX09m7TCvJbEbD1eLRw9Mm4bPF1NZr2Tl2i9Xr0UPGsWcD1wOFo9mMPLPLv30ztcWay7b8xcPXo78LwWmyE9j
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/block-command-adapter.ts","s":289,"e":320,"m":1777197392904.5415,"t":"const plan = await resolveRustBridgeCommandPlan({ context, envelope });\n try {\n const transportResult = await executeRustBridgeMutationTransport({ client, plan });\n await recordRustBridgeCommandArtifacts({\n client,\n context,\n envelope,\n plan,\n result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({\n client,\n context,\n envelope,\n error,\n });\n throw error;\n }\n return {\n requestId: context.requestId,\n traceId: context.traceId,\n commandId: envelope.commandId,\n commandName: envelope.name,\n result: { ok: true as const },\n };\n}\n\nexport function handleBlockBridgeError(error: unknown) {\n return documentBridgeErrorResponse(error);\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.test.ts","s":1,"e":60,"m":1777168988355.2844,"t":"import { describe, expect, it, vi } from \"vitest\";\nimport type { ConvexHttpClient } from \"convex/browser\";\nimport type { BridgeContext, CommandEnvelope } from \"@/lib/documents/bridge\";\nimport { recordBridgeCommandArtifacts } from \"@/lib/documents/bridge-log\";\n\nvi.mock(\"@/lib/convex/api\", () => ({\n api: {\n bridgeLogs: {\n recordCommandLog: \"bridgeLogs.recordCommandLog\",\n recordDomainEvent: \"bridgeLogs.recordDomainEvent\",\n },\n },\n}));\n\nvi.mock(\"@/lib/convex/route\", () => ({\n getAuthedConvexClient: vi.fn(),\n}));\n\nvi.mock(\"@/lib/documents/bridge\", () => ({\n DocumentBridgeError: class DocumentBridgeError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = \"DocumentBridgeError\";\n }\n },\n}));\n\nconst context: BridgeContext = {\n deploymentId: null,\n projectId: null,\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actor: {\n actorType: \"user\",\n actorId: \"user_1\",\n sessionId: \"sess_1\",\n },\n source: {\n channel: \"next-route\",\n client: \"vitest\",\n },\n tenantId: null,\n authToken: null,\n idempotencyKey: \"idem_1\",\n validateOnly: false,\n dryRun: false,\n};\n\nconst envelope: CommandEnvelope<{ documentId: string }> = {\n name: \"tree.node.archive\",\n commandId: \"cmd_1\",\n idempotencyKey: \"idem_1\",\n actor: context.actor,\n source: context.source,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.test.ts","s":49,"e":108,"m":1777168988355.2844,"t":"authToken: null,\n idempotencyKey: \"idem_1\",\n validateOnly: false,\n dryRun: false,\n};\n\nconst envelope: CommandEnvelope<{ documentId: string }> = {\n name: \"tree.node.archive\",\n commandId: \"cmd_1\",\n idempotencyKey: \"idem_1\",\n actor: context.actor,\n source: context.source,\n target: {\n workspaceId: \"ws_1\",\n pageId: \"page_1\",\n },\n payload: {\n documentId: \"page_1\",\n },\n reason: null,\n refs: [\"test\"],\n dryRun: false,\n validateOnly: false,\n};\n\ndescribe(\"bridge-log\", () => {\n it(\"记录成功 artifact 时应把 streamDelta 同步写入 domain event payload\", async () => {\n const mutation = vi.fn().mockResolvedValue({ ok: true });\n\n await recordBridgeCommandArtifacts({\n context,\n envelope,\n client: { mutation } as unknown as ConvexHttpClient,\n now: \"2026-04-26T00:00:00.000Z\",\n domainEventType: \"tree.node.archived\",\n commandPayload: {\n documentId: \"page_1\",\n streamDelta: {\n op: \"remove_document\",\n documentId: \"page_1\",\n },\n },\n });\n\n expect(mutation).toHaveBeenNthCalledWith(\n 2,\n \"bridgeLogs.recordDomainEvent\",\n expect.objectContaining({\n eventType: \"tree.node.archived\",\n payload: expect.objectContaining({\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,\n eventType: \"tree.node.archived\",\n aggregate: {\n type: \"page\",\n id: \"page_1\",\n },\n command_id: \"cmd_1\",\n command_name: \"tree.node.archive\",\n command: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.test.ts","s":97,"e":156,"m":1777168988355.2844,"t":"eventType: \"tree.node.archived\",\n payload: expect.objectContaining({\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,\n eventType: \"tree.node.archived\",\n aggregate: {\n type: \"page\",\n id: \"page_1\",\n },\n command_id: \"cmd_1\",\n command_name: \"tree.node.archive\",\n command: {\n id: \"cmd_1\",\n name: \"tree.node.archive\",\n idempotencyKey: \"idem_1\",\n },\n trace: {\n requestId: \"req_1\",\n traceId: \"trace_1\",\n },\n error: null,\n streamDelta: {\n op: \"remove_document\",\n documentId: \"page_1\",\n },\n }),\n }),\n );\n });\n\n it(\"记录 artifact 时应优先消费 Rust domainEventPlan\", async () => {\n const mutation = vi.fn().mockResolvedValue({ ok: true });\n\n await recordBridgeCommandArtifacts({\n context,\n envelope,\n client: { mutation } as unknown as ConvexHttpClient,\n now: \"2026-04-26T00:00:00.000Z\",\n domainEventPlan: {\n family: \"tree\",\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,\n eventType: \"tree.subtree.moved\",\n streamDelta: {\n op: \"move_document\",\n documentId: \"page_1\",\n parentId: \"parent_1\",\n sortOrder: 0,\n },\n },\n domainEventType: \"legacy.should_not_win\",\n commandPayload: {\n documentId: \"page_1\",\n },\n });\n\n expect(mutation).toHaveBeenNthCalledWith(\n 2,\n \"bridgeLogs.recordDomainEvent\",\n expect.objectContaining({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.test.ts","s":145,"e":173,"m":1777168988355.2844,"t":"},\n },\n domainEventType: \"legacy.should_not_win\",\n commandPayload: {\n documentId: \"page_1\",\n },\n });\n\n expect(mutation).toHaveBeenNthCalledWith(\n 2,\n \"bridgeLogs.recordDomainEvent\",\n expect.objectContaining({\n eventType: \"tree.subtree.moved\",\n payload: expect.objectContaining({\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,\n eventType: \"tree.subtree.moved\",\n streamDelta: {\n op: \"move_document\",\n documentId: \"page_1\",\n parentId: \"parent_1\",\n sortOrder: 0,\n },\n }),\n }),\n );\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.ts","s":1,"e":60,"m":1777233691556.8743,"t":"import { api } from \"@/lib/convex/api\";\nimport {\n DocumentBridgeError,\n type BridgeContext,\n type BridgeTarget,\n type CommandEnvelope,\n} from \"@/lib/documents/bridge\";\nimport { getAuthedConvexClient } from \"@/lib/convex/route\";\nimport {\n recordRustBridgeCommandArtifacts as recordRustBridgeCommandArtifactsFromRuntime,\n type RustTreeDomainEventPlan,\n} from \"@/lib/documents/rust-runtime\";\nimport type { ConvexHttpClient } from \"convex/browser\";\n\nexport const recordRustBridgeCommandArtifacts = recordRustBridgeCommandArtifactsFromRuntime;\n\nexport type BridgeCommandLogStatus = \"pending\" | \"succeeded\" | \"failed\" | \"rolled_back\";\nexport type BridgeDomainEventStatus = \"pending\" | \"committed\" | \"rejected\" | \"failed\";\n\nfunction buildPayloadSummary(commandName: string, context: BridgeContext): string {\n return `command=${commandName};request_id=${context.requestId};trace_id=${context.traceId}`;\n}\n\nfunction normalizeWorkspaceId(context: BridgeContext, target?: BridgeTarget | null): string | null {\n return target?.workspaceId?.trim() || context.workspaceId?.trim() || null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readStreamDelta(payload: unknown): unknown {\n if (!isRecord(payload)) {\n return null;\n }\n return payload.streamDelta ?? payload.stream_delta ?? null;\n}\n\nfunction normalizeDomainEventType(raw: unknown): string | null {\n if (typeof raw !== \"string\") {\n return null;\n }\n const trimmed = raw.trim();\n return trimmed || null;\n}\n\nfunction buildTreeDomainEventPayload(input: {\n context: BridgeContext;\n commandName: string;\n commandId: string;\n idempotencyKey?: string | null;\n eventType: string;\n aggregateType: string;\n aggregateId: string;\n streamDelta: unknown;\n error?: string | null;\n}) {\n const payload: Record<string, unknown> = {\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,","v":"rCAgPXfya7xqqN+9Uz3lvVwcnz3S9iC9xY60vKOywDuHyVg91e1LvaMGZr1VRYQ9DxfbPZIKgb1NZVG8FK5LvXWMirvApBO9f+4KPEfI3TwVOHw8b4ebvABrdT3EJAa90yo6Pa/MoDx7O747PZmWPLIZlL1saMI851uku0UZ8Tw5hNW7MPmCvLvYXL2TW9W7rBMNvADxEbxY+cQ7JrssPWmX57tDun88t63JvIa1jbwndpY9RbXfvCEwpT1O4u26kYBxPYG9rr0jKFk93NNWvce+Nz3ezji9LZuyPT9lTDvmzSO9D5dePD7GjDsykr28Da2DO4oIUj3xaJS7JlDDPW27BD2wZYm7uTGSvYzJoT38dZu8bUPBO7mAEj09Vrw7kwGTPINQJL2Ex5C949ATPbBgs7sMa4C91PQ1vV+22zxz5ca8jAXnPMQ1/TuSDgM9uAghPW6m1rvzuwG9nAYMvUMH1LwAE7U8RzilPUF7Bb0LEGK83kIRPO/JWb1vL7w87MNMvWI6ajz8CpO7ppDtO+aKNT2R0mk7NTgOPOpYVbzxPB082l+wPByRjrxiJLc8rx+GvN07g73i9Ni8ICtUPW4faL0SHxS9zAnoPPZ2jr09KIs8uqnRvCjpljubswU9Qh2HvMi5K73fYyW8M97qPFDYZz210eQ7hGiZu1mN8jxmBFQ97A+gvaFfQL23QA69r5lsPNZT7TvbLru7mDMzPZAETL3tgyO8X+qWPDiEhjzJ6Tc8+6XKvOUwYr2igoI8oqGGO56A7bxCGiw9GCIgO+SsE7318AC9Kg0ivRKEGT0CklG7ubyCPfiElDykp/y8XLBuPWlEcbwdG4e7lRgyvJCvWT0be+k7zKP7vA3ELz3eqUc8wm1/vO5C7Duhv7U8Tti9PAW/TT2akaa8cDw8vZhB+LxM8Uu85VIvvWLaK7uTXZU8iwJevAUK1jyyemC9Z7i/uwjrj70hzvE8ViKDPJzoHb2kkyG7N7sYPTIkCr2QulM8+yIRvfezI71LD4q9QdKLvNQ/77u/bU+99yyPvcuoqjxKyfK7nVNjPVmq6bywBcY8Z/iaPMFJGDym86g8X0plvWTiorpPn7O8YxNNPZit8rwo9Bo9lM20PYuH2zsaKxY96KLyvBBu9bzHSL88grOmvA0njDqjDD69x4KxPG/8Cj17AIq9rOKDPa2/IT2hJ5w8eIMSPYHTIL0DkyO8LSHAuhZmD7xHMZ28eVKgva+zAjw93n49xVbqPBLgNTvz1v88ezAAPQMaN7zlwVy8J0UXPE57pzwsnSA7pEDKu43v37wg5pO8KU9LvayTb7x+RQA9oJYzvHWX1jlQYhw86PH2PDYNpz1zKpW8vOiXvWIklTsvAgm9AzunvN9oUL1zGp08CTMCvLuQljyZIDC8N2nPvLxnJbysOKu8s3jLOyz0K7wWJis9D74FveDKmzxQ1k+9B80ZO+gdfT101Zy8SIXFugUP6TvvpbC8wjqZu6Jdf73hzZC9pwgSvSVkHzyfGQK9+xohOq8sQb3lw+A6J3ZOPALer7wRSck6SCimPGq8zbz4YYQ9lpilO7rvODvIa788PMnVO1pIrDx43nG9ToIJuhPwA7spiWM9ic5XPdFP0bwE+4m8oHpjO98+U72/qyI9QuLjPOGhJL36DQW8PBQdPJ0IWj1sYQO8r88VPR5aGLyANB88WWM3PXTAUDyOqEW9hLUWvV/jTTwwzIg8R7GXus/JDD19Gqm8ZDz6PMpGFD0kz1a7HJ00Pb9gQDtBDAm8Yen5vJ1PQL2xXri8/2UevCTFMD0THhk8ZBoGPeKJ9zydxn295ek9PRoT0zuMwSi9lxjjPHAq07z6pji9l51jPfMY4jzhhE69IUgCPU8kvLzLJgG81YjTO6IqVD1GGao8IXYrPUPQRLwvHmk8IlUXPaRwGb1LkF88yONF
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.ts","s":49,"e":108,"m":1777233691556.8743,"t":"commandName: string;\n commandId: string;\n idempotencyKey?: string | null;\n eventType: string;\n aggregateType: string;\n aggregateId: string;\n streamDelta: unknown;\n error?: string | null;\n}) {\n const payload: Record<string, unknown> = {\n schema: \"mnote.tree.domain_event\",\n schemaVersion: 1,\n eventType: input.eventType,\n aggregate: {\n type: input.aggregateType,\n id: input.aggregateId,\n },\n trace: {\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n },\n command: {\n id: input.commandId,\n name: input.commandName,\n idempotencyKey: input.idempotencyKey ?? null,\n },\n error: input.error ?? null,\n // 兼容既有观测与 SSE 解析字段,正式消费者应优先使用上面的结构化字段。\n request_id: input.context.requestId,\n trace_id: input.context.traceId,\n command_id: input.commandId,\n command_name: input.commandName,\n idempotency_key: input.idempotencyKey ?? null,\n };\n if (input.streamDelta) {\n payload.streamDelta = input.streamDelta;\n }\n return payload;\n}\n\nexport async function recordBridgeCommandArtifacts<T>(input: {\n context: BridgeContext;\n envelope: CommandEnvelope<T>;\n client?: ConvexHttpClient;\n commandPayload?: unknown;\n domainEventPlan?: RustTreeDomainEventPlan | null;\n domainEventType?: string | null;\n status?: BridgeCommandLogStatus;\n eventStatus?: BridgeDomainEventStatus;\n error?: string | null;\n now?: string;\n}): Promise<void> {\n const workspaceId = normalizeWorkspaceId(input.context, input.envelope.target);\n if (!workspaceId) return;\n\n const client = input.client ?? (await getAuthedConvexClient()).client;\n const commandLogId = `clog_${input.envelope.commandId}`;\n const eventId = `evt_${input.envelope.commandId}`;\n const now = input.now ?? new Date().toISOString();\n const payload = input.commandPayload ?? input.envelope.payload;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.ts","s":97,"e":156,"m":1777233691556.8743,"t":"eventStatus?: BridgeDomainEventStatus;\n error?: string | null;\n now?: string;\n}): Promise<void> {\n const workspaceId = normalizeWorkspaceId(input.context, input.envelope.target);\n if (!workspaceId) return;\n\n const client = input.client ?? (await getAuthedConvexClient()).client;\n const commandLogId = `clog_${input.envelope.commandId}`;\n const eventId = `evt_${input.envelope.commandId}`;\n const now = input.now ?? new Date().toISOString();\n const payload = input.commandPayload ?? input.envelope.payload;\n const status = input.status ?? \"succeeded\";\n const eventStatus =\n input.eventStatus ??\n (status === \"pending\" ? \"pending\" : status === \"failed\" || status === \"rolled_back\" ? \"failed\" : \"committed\");\n const aggregateType = input.envelope.target?.blockId ? \"block\" : input.envelope.target?.pageId ? \"page\" : \"workspace\";\n const aggregateId =\n input.envelope.target?.blockId ?? input.envelope.target?.pageId ?? workspaceId;\n const streamDelta = input.domainEventPlan?.streamDelta ?? readStreamDelta(payload);\n const eventType =\n normalizeDomainEventType(input.domainEventPlan?.eventType) ??\n normalizeDomainEventType(input.domainEventType) ?? `${input.envelope.name}.requested`;\n\n await client.mutation(api.bridgeLogs.recordCommandLog, {\n workspaceId,\n id: commandLogId,\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n commandId: input.envelope.commandId,\n commandName: input.envelope.name,\n actorId: input.context.actor.actorId,\n actorType: input.context.actor.actorType,\n sourceChannel: input.context.source.channel,\n sourceClient: input.context.source.client,\n status,\n targetPageId: input.envelope.target?.pageId ?? null,\n targetBlockId: input.envelope.target?.blockId ?? null,\n payload,\n payloadSummary: buildPayloadSummary(input.envelope.name, input.context),\n refs: input.envelope.refs,\n idempotencyKey: input.envelope.idempotencyKey,\n error: input.error ?? null,\n createdAt: now,\n finishedAt: status === \"pending\" ? null : now,\n });\n\n await client.mutation(api.bridgeLogs.recordDomainEvent, {\n workspaceId,\n id: eventId,\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n commandId: input.envelope.commandId,\n commandLogId,\n eventType,\n aggregateType,\n aggregateId,\n eventVersion: 1,\n status: eventStatus,\n actorType: input.context.actor.actorType,","v":"dEibPP4Z07yOJdy90+nIvS7Ssz1Qz5+85hgGO3BcVrw+c+885P3ivUjLkb3/UoY9bzSlPY0CHDx8Sfo8HHCHvSPJ6zxmZ9C8JDJou/HdkTt1rRc8tu3Mu3661Dw/IC29AoWGPfPOVD1coYM8fKuSPbyvkbypbPo7XFuPPFMd2Dxmgdw8nNmSvImmmb3Jer+8Sn8sPT9KNr3XEDg8+pEcvC+Rzjzxciy7ImdLujA/N72NHjE9wnJ3vfWKuD3g0GQ9oEhpPb8Lt72Ep8e6j2KlvBsB8Ty9fHi9CA30PWFNhT1fYiw8eBW3O1388ru4hLY8CsRpPQ4RkD3Wazc8t4zEPajMYj2yG/W892p7vf7mRD23Ptm78gypO7ULBT2Kacq5AbgOvLMA2buAeuE7wiZVPfwz4rzDb5O9UjQQvavOQzxuzZS7fdWoOhP/wzw+Dru6r0Q/PbUjsb3FWzG8sS8Yvb27gr3U3AM9xzslPa++FDuSgsy8Uo9BvA5fC72L2rA68rM3vfRf5Tx3BEA89d6gu1+7HDxI4CS8zbsQvFxpArzysu+74b+IPcZwXzyxtio8Wk4Kvf3zXr3JMyC9I2BkPeZHa70Upz69iJq+PMScEb3mmNU8XWhovOw2tbxmr4k9MqbhvOLFIr36aSo98UPHPB2OaT2VsDg9SBdRuxIa8zzhFYE8mRWRvcbQJL2EebI8OC3mvKHlPDynsg89h1t7O/y6r7y+wkO88UgtPFehnrzU+RY9MBRFvMcJiLyR6UW9KmdJOonGNL2v1089GohxPPvgCbzXoI48OcSevHdzMjzrk2+8TPEEPdRgUzyN0/O8clBxPaZPkrwB8Zk8XgQuu1NV5Txfthg9SQlTva4uJj2Q2pO8eeh9u8PpFjxzDSE8p02avB01RDz36lq9aIpvvXe8gby3bdi8W5AdvPQeVj2xrg49tQbHvJlTljwoeSC9EAhCPIx0ob2CvQY9D5EpPChhGL1lGju8LYAmuo0vYbyvfmo88NqXvVAaEr14wAW9Dfm6vE2y+Du+pQq975QFvZV7yjyg0he9q8WnPEdH9rxWH+C7LuPWPFvTpLsKVx89dnOrvVITMT3WvEq8G4+JO1VSNbyZQpU8rgbzPRmt2rzivcw6CcaJvP2P+Lz/ilG71abmO+JeEL0IAJe983EQPZMKiT29f2G8hlymPGH+IzxRdM88Y1frO8figr0Q5M+8b6cpveTaD72n6wa9iOUuvfl9hbwptTo99B1zPFQJqjxGjTc9UyuSPalghryHApy7ss/ou/hAAT2RWt47hCOHOwWr0jtlPEG73aMtvKolN7xsxBO7+Bf9PE9gp7v4Roo7F+MAPeIUgj0Q2SA91xNHvV6z3rm35Zw8jy62vDOOYL1nxgY9hGGkvFxxFDy47ZW8HIQFvfg5Z7z11xm9kcWmPC/2gjwbEy2667MPvfgZFz3j946880Cuu9b4Jj2+8em7gmhavJ
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.ts","s":145,"e":204,"m":1777233691556.8743,"t":"workspaceId,\n id: eventId,\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n commandId: input.envelope.commandId,\n commandLogId,\n eventType,\n aggregateType,\n aggregateId,\n eventVersion: 1,\n status: eventStatus,\n actorType: input.context.actor.actorType,\n payload: buildTreeDomainEventPayload({\n context: input.context,\n commandName: input.envelope.name,\n commandId: input.envelope.commandId,\n idempotencyKey: input.envelope.idempotencyKey,\n eventType,\n aggregateType,\n aggregateId,\n streamDelta,\n error: input.error ?? null,\n }),\n createdAt: now,\n });\n}\n\nfunction normalizeBridgeErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\" && error.trim()) {\n return error.trim();\n }\n return \"未知 bridge 错误\";\n}\n\nfunction resolveFailureStatuses(error: unknown): {\n status: BridgeCommandLogStatus;\n eventStatus: BridgeDomainEventStatus;\n} {\n const details =\n error instanceof DocumentBridgeError && error.details && typeof error.details === \"object\"\n ? (error.details as Record<string, unknown>)\n : null;\n const reason = typeof details?.reason === \"string\" ? details.reason.trim() : \"\";\n if (reason === \"rolled_back\" || reason === \"compensation_applied\") {\n return {\n status: \"rolled_back\",\n eventStatus: \"failed\",\n };\n }\n if (error instanceof DocumentBridgeError && error.code === \"REJECTED\") {\n return {\n status: \"failed\",\n eventStatus: \"rejected\",\n };\n }\n return {\n status: \"failed\",","v":"RLYcvN8hEb0bU+i9fvDhvcxn5T2DAjK8kQ3bPI1jwby+oGY9h7nFvcGDdL1bp4A92FauPYXz5jwtqAY9Gl8RvYMssDskAu68zSUsO+dz0Ty3MU88Qb89PTY2OT3RCFS8uDqYPet2lzy3iB4779gsPUJ7L72I1hY9FUKAvGS55DtQ5NU8NBIpvXbbtr0EGRa874ELPfxH6LtUmqK89rSKvIIlGj0yoqs8qARHvAlKGb37A3c9wsNDvVLd0T0LMhc9bEaGPQ5zQL01aTq84oQEvRtLrzyfRGm9r1eWPX9DQT0CDVa9sbffu7024bzXmwI9OIDkPFErYz0M74M7TGNYPVNkPj0umau7rLdBvRUBlT3Fapm7EGyyvIRlDD1ibLO89CBPvKLbvzwsewu91qYpPQtZQLy77iO9dqt4O1vhXD0g+mY8ume4vAfKtz1YrYS8dTauPDH7xrwRxP284DVovCBdpL31YW8931kqPUSCiTxlmgy91JRCvKOP5rycesM81RV4vRWKwjzUb2Q82janO0klojygnTm8fnr1vKCg+7zq0hy9RRx/PeccNjyEoB48yyXDvGi6ib2aUQ69I4h6PYbcVr3PwzK9/sCdPcYThb20WQc9VFPku4hsMb1sKzI8sCADPIWuQTtsZme8TkNXO6mX9jxADTw964KMvGj3BT0pBdc8i2Kave+plrxE6+M7ItB9PH/Zmrxq5zc89e/3PHvqNr1LxBa9vaRivIL0qLyjg7A8FuwyOqtG0LymsFS9NAkNPWcbhLw6VIY9Q329uRpwAbwBi8a7CoBRvOHFSjwz+5g8UwCpO/jzdzyUh448WPcdPcJV3ztfFy48aLMHPETvsjxFqQQ9EHdUvQiKVjwpRDW83Uqau7DR7rwjfFE9/EobvJbkID3Jymu9Q4tKvUoSjTyKSKe8SicmvfNZazy9lKA7SymIvT5BhzuV9KS9t5GfPCk0bb3CqVU9CM0gvLZR/ry8Rhu9bGIUPX/H+7ylgqA8tofYvLJo3bwKM7+8hQ69OgrlGLyEJs+8CDBEvQ6YGTwJAw28kHuPPJeaB70Mtra8dA2aPJuEkDukClw8tviOvb9TPjxcQ6i8EGItPYWg8bypP7w8eVnlPfhFl7vkKwy6RiZ6unQUSbvzToC8LeeiPHZuIbwKELS9R56TvCBoujto01C9sB8WPdgf8rug7Dw9EpGFPdA9DL0LUSc9/DQtvaviC71k2sm8YaimvTyR3Lvm/P48OPZKu+rOpDyZI3a7lnM6PV79KTwmyWE8L4VCvb5Sej0cPpm8YilevPc+D70L/z48U1UrvcgbDL2Ph5Q6Ga12PG6/OL3Tkvg8LC8oPZLBgj030Yo8PaSKvd8vBDzhbqm8+e3+PPsKu7xGfo08TfsmvXs6tzwex2o7rKxAvSldJL2VnGG8zBZHPD8xZTx3jhs8RaASvcZrgzyAJjG8M7ksPE1pGD1tjAg91SxXOxC22LtzVd28d0mFO8jJELzZUcO8QoSGO5OpLz3nc8S8d7oSvCCdJ72bXz884jylPNEdlzygm9q7d7LMPGDchb1nhsk9c379uwVdqDuIthA9EjlZuo++gTxaz3u9rTbyvKwKKT2+ftw85FawPOf0uDjF41a9A0vrPBynsrzG8jU9MdrOvJk8Pb1ytOk7nLE3vf79rzwj6Pi8Qdp2PVCrUzxCv168jOtQPcxNCDws3428tMJnvU32oTz3eoA8grSFPPhslT2o5si7KcyOPJFidDxJsnm8ojVePa4SkjwCgkI9KFBUvaU4Bb2sebm5SvkuvdYqIz3/8y28HRCJPfHi5jwhH3i8OHoyPIVf9rxwCpK8ZhUmPYOQZ7yjOPm8c3fpPO0swTz+8IO9y0NlPFzLT7zP1sK8VO4iPV6k3zz9pQ09rjyEPFIpVLwmue8897ZmPEVfuLsyUJm84dyyPHgZbzycff07akFMPXvrm7wfAFI8CABFvMTdILtKpBq7W++6vKHssjyk4Ik760oKvRdShb2eeYO8sk0MvS3zkDz/5Ss9XTPxvEY5rTzdBAQ94A9nPf0y9jud3sY8bDjBO+Q7PDxaQwQ9Ri4yu0553bzngOG8c1KevIIanDwZSOA73IrBPKv90LvMNI68saaGPGGi2rxtOCq9HF8NPWvBGrykurI8SL/lu4IpibxhQBS9m0NPPFZzwrydnMI8UV9OPAzeKb2K+2a9pmTYvLiOBTx0WME9JfMjPBzGebx6KCG9ZiZ1PV6Kcjt26vu7g9q9PA/Tij1y1Uo8OkkcPel
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-log.ts","s":193,"e":229,"m":1777233691556.8743,"t":"status: \"rolled_back\",\n eventStatus: \"failed\",\n };\n }\n if (error instanceof DocumentBridgeError && error.code === \"REJECTED\") {\n return {\n status: \"failed\",\n eventStatus: \"rejected\",\n };\n }\n return {\n status: \"failed\",\n eventStatus: \"failed\",\n };\n}\n\nexport async function recordBridgeCommandFailureArtifacts<T>(input: {\n context: BridgeContext;\n envelope: CommandEnvelope<T>;\n client?: ConvexHttpClient;\n error: unknown;\n}): Promise<void> {\n const { status, eventStatus } = resolveFailureStatuses(input.error);\n try {\n await recordBridgeCommandArtifacts({\n context: input.context,\n envelope: input.envelope,\n client: input.client,\n status,\n eventStatus,\n error: normalizeBridgeErrorMessage(input.error),\n });\n } catch (loggingError) {\n console.warn(\"[bridge-log] failure artifacts skipped:\", loggingError);\n }\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-server.ts","s":1,"e":60,"m":1776316465819.7732,"t":"import { headers } from \"next/headers\";\nimport { ApiError } from \"@/lib/api-utils\";\n\ntype BridgeMeta = {\n requestId: string;\n traceId: string;\n queryName: string;\n};\n\ntype DocumentMetaResponse<T> = {\n doc: T;\n meta: BridgeMeta;\n};\n\nfunction getHeaderFirstValue(value: string | null): string {\n return String(value || \"\")\n .split(\",\")[0]\n .trim();\n}\n\nfunction parseHostParts(host: string): { hostname: string; port: string } {\n try {\n const parsed = new URL(`http://${host}`);\n return {\n hostname: parsed.hostname,\n port: parsed.port,\n };\n } catch {\n return {\n hostname: host,\n port: \"\",\n };\n }\n}\n\nfunction isLocalHostname(hostname: string): boolean {\n const normalized = hostname.replace(/^\\[(.*)\\]$/, \"$1\").trim().toLowerCase();\n return (\n normalized === \"localhost\" ||\n normalized === \"127.0.0.1\" ||\n normalized === \"::1\" ||\n normalized === \"0.0.0.0\" ||\n normalized === \"::\"\n );\n}\n\nfunction buildServerRequestOriginCandidates(headerList: Headers): string[] {\n const forwardedProto = getHeaderFirstValue(headerList.get(\"x-forwarded-proto\"));\n const forwardedHost = getHeaderFirstValue(headerList.get(\"x-forwarded-host\"));\n const host = forwardedHost || getHeaderFirstValue(headerList.get(\"host\"));\n\n if (!host) {\n throw new Error(\"缺少 host 头,无法构造 bridge 请求地址\");\n }\n\n const { hostname, port } = parseHostParts(host);\n const candidates = new Set<string>();\n const addCandidate = (proto: string, candidateHost: string) => {\n const normalizedProto = String(proto || \"http\").trim().toLowerCase() || \"http\";\n const normalizedHost = String(candidateHost || \"\").trim();","v":"V5pPvOt4GTy8iM295zIMvqw+kz0snqe8r1ZCvc+LET0jalk7uO6yvSyciL2DW5U8GeevPbx06rySo0A9oGmuvYWlDb1oC/O8Vo37O38fET2K8Ec84woguwtrYD1UDJW90TNUPWFoGT2j9DI6ynmFPelTCb1u5J+8OiTRPPHB0DwqaSk8fc0SvNLzcr1iK4I7GwSvvPRY7bxB+rS8/0/ROg57oLue4BW9fipMvJcU+ry2ndQ84kmPvS12vT092Tg9AxynPQJfxb3A5RE8fTYjvR1AZbwJ/S+97mXuPXJ3ozxLft07zQ98PFcJwDz2aSC8GX+EPWq60T1+ZvK7EYJ6PfM+AT1cvWi9sRoQveqpgj21AlC9cPIlPVELBDzEUsA8olD0PPBs77xiuTu9p5crPRcUrTuSFCe9IKcFu3YpsjwkYoO9A5krPOaM7zxoeqs6mZI+PZVQy7zJrsm8AnuTutd/U73mdKM8OaLHPIFoYL06QYq75wXHumbJ07zs1Ji6WKsvvSXfZLyFony8PKgbvTO+nTyLfIw8R1ETPFd1WjwVzhm8ZwtyPfhu0TyELX49ycQMPK+Zb72njt28uAF2PbtCjrsxut+8suXYPHbtlr2GEqU8VhKnPIBKqDpAC2E9Px3IvMN3hb2DaJc8rtpCPXwfmD3t4Bw82ntCu5a9AD1zSAg9zUG2vf5TJL0DD2S9tz2Ku0JhlTyfyoQ9M0MYPYvQ2rzR+ta8s3qQPKVZj7pt6PE8pLYZvGnB9Ttk/IS8UMYUPfFb77xbzpQ9a0AXvOUhozxZCsg8TYq7vCJvFz1rFY08BN6HPTBUJDwh0aS8WkGePX7Horxdg0A8AC4IvR93SD1Np7y7ydICvLnumT1DFG49CJpsu0JbO7zi6ea73kVWu8sPDT2TeEu9ZTnBvGjy8DpWHCq815Y3vdREezxXVeE8FvRJvQu63rq7tT27TgkQPYtDgr2Q3sY85cX4OcqyJ72PnZe8uHL0vOh5rrxWk/88FQMnveI5pbw0pGe819GrvHmdWTtwqty8KbeYvavBzTzN2Qy8t2QCPe/H8rwfEzw9EYWEPDNmKTyALlO77I6jvbNI4DxA4ua8BrE0PH9RkLwceFE8lWuvPcDGADwRUoI8/q65vJeGMb1zKCU9d2dJvJ7ySb2ezFi9WYyGPG/imDxiWom8sADzPK9jTrvhU3E9jiHRu5ICHryhlai66LxJO0jvIb19j5K8OKuXvU9KEjzSmUA9BYgxPMEa5LxX8lg99K09PWAzqbsC7xw9tXOZvL6TJT39htu7p61yu/5I3rwNL9C89rzAPG/fGb0f0tG8CgASPZuMJzyO3gI9VthOPdgxkj3CADG8oDOwvRuBKLxmeJm8OUOUu5lobb17Odg8eJHBvCCiwDunUni9hQQxvaG7IbxVBZK8YOGgPCNg2zzse8y6ox6NvPlw3DqTc1u8Y6YTPU39Rz1U1O88A/ZhOzEDDjzbJ7288soqvEVyi70mjg+9xgIZvQ0IwLyvIVY8N4QWvHYUNL3Xk4M8FVl4PAw7tby5jtk86fFaPGT7LrwWG349enz7PA4Q5Tz1yoQ9YDLgu6W/3rwa/kS9I3aXvO8lgTuWqLA9nEwbPTvJs7pFOg48MDlzPE5GDL2XY+08XOPquR4XHr2+RHe8tBm/PPbCqTx2KAG9VzqCPLbDoLxtjcY7l30YPWbG6Ty7Y5W8y54QvZ8IirumfBi9Fa7KPEst9DyEsxy76pcEPV8lSTxUvx88mlUgPfKbAr0ZLAe8280Rvfw2irxLcHy82yCsPK9P/TzrJlQ8PbtePa6VxTxKg6y8LDTePOqOSzyQQKK8XpGOPEnD4zvtdIa9r4A3PKy7KT2vAAW9I3xVPUCHW7z6dny75KSJPAT5sTxFu188J47HPHklzLtHN7Q7+VATPelTpLw+3H89rR/gujvI4bx4yIy73mtCPFHlCrsTnwI9UshhvO4kuLxCQSu9876/uy77+jy6hV688uz+vI13Nr2jF4E8tuf0vP3ZOjuUYyY9BSZavcDYWjyjTXk8epBCPD/lWzy103U9p3Hou8Onp7yVh7M8CsW+PNky27xXiYk94CEUvbVCETxSboi6poYKPJskJDyp9Ca8sidvPUuTWb0nnZS9ERiBPAQSG72UYOC8EWXYPBt58bw68H+8+K7TPLu497xjfZc9CLHTPKMiQ7wEjK68bHf3PLv7B7txm5A
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-server.ts","s":49,"e":108,"m":1776316465819.7732,"t":"const forwardedHost = getHeaderFirstValue(headerList.get(\"x-forwarded-host\"));\n const host = forwardedHost || getHeaderFirstValue(headerList.get(\"host\"));\n\n if (!host) {\n throw new Error(\"缺少 host 头,无法构造 bridge 请求地址\");\n }\n\n const { hostname, port } = parseHostParts(host);\n const candidates = new Set<string>();\n const addCandidate = (proto: string, candidateHost: string) => {\n const normalizedProto = String(proto || \"http\").trim().toLowerCase() || \"http\";\n const normalizedHost = String(candidateHost || \"\").trim();\n if (!normalizedHost) return;\n candidates.add(`${normalizedProto}://${normalizedHost}`);\n };\n\n // 说明:优先保留浏览器实际请求的 origin,用于正常的同源自调用。\n addCandidate(forwardedProto || \"http\", host);\n\n // 说明:某些反代会把 x-forwarded-proto 设成 https,但本机 dev server 实际只监听 http。\n // 这里补一个 http 候选,避免 SSR 自请求被错误协议直接打挂。\n if ((forwardedProto || \"\").trim().toLowerCase() === \"https\") {\n addCandidate(\"http\", host);\n }\n\n // 说明:localhost / 0.0.0.0 / ::1 这类本机地址在 Node 侧自调用时最容易踩解析差异,\n // 统一补 127.0.0.1 与 localhost 两个稳定候选,避免 fetch 因回环地址选择失败。\n if (isLocalHostname(hostname)) {\n const portSuffix = port ? `:${port}` : \"\";\n addCandidate(\"http\", `127.0.0.1${portSuffix}`);\n addCandidate(\"http\", `localhost${portSuffix}`);\n }\n\n return [...candidates];\n}\n\nfunction copyHeaderIfPresent(target: Headers, source: Headers, name: string) {\n const value = source.get(name);\n if (value) {\n target.set(name, value);\n }\n}\n\nasync function fetchDocumentMetaResponse(url: URL, headersToSend: Headers): Promise<Response> {\n return await fetch(url, {\n method: \"GET\",\n headers: headersToSend,\n cache: \"no-store\",\n });\n}\n\nexport async function fetchDocumentMetaViaBridge<T>(input: {\n documentId: string;\n workspaceId?: string | null;\n}): Promise<DocumentMetaResponse<T> | null> {\n const headerList = await headers();\n const requestHeaders = new Headers();\n const originCandidates = buildServerRequestOriginCandidates(headerList);\n\n copyHeaderIfPresent(requestHeaders, headerList, \"cookie\");","v":"kkPlOwToJD3AAAO+nsS5vQRWRz0Uk9C8L1aqux89FT14wuk8xB3EvXLzPL1R+zA9I4ocPWy0VLwAuig6rwqMvYh/yTsIpgw8PSzrPH0NOryOCws9rByDvEhcMT0EnQy9L9Q6PeII8zse4RY8DSUsPf8+ubynMyc86MT3Oxf3RLyVqYw8+IRUOXoKqb0cWIy6yxd9vSpq8LxqCom98LvLvKXP6Tvdppe7ijQZOsxPY70s9p495WlnvXjyNT1+2ZQ9RUjCPfOG9L0q56O8CaygvOM5lTzbWVO9oqJpPZ8BMj3XOQK9JkybPHNd4TzLFQO9z7uLOxcekD0As1O8g8tkPVMkmz2gnvu8wo44vGXfjT1Gqqc8JwTWPDnPRDylfVI9CFO8u21uO7zNQUC97FPQPF8labsSx3K9rMhbvHlO/TwmrTu9X04+vc5WjT0g3qk42caOPR3sRDuxJby7s+8tPXZOEb17IYY94YTxPGvozrvufEO69v2cPEC5Q71yiXg8cOMavbeMBT3DHnm8RM6BulrNpTykpVI8NuTOPGWxYjpqmwW9y82FPR3RKjyKSe888ktLvF4QYrwG+Sg7qa0PPXsuIL2zLZe8BcITPQNLJb1Nays9QMVFO9TUvjsXOfA8qXA6vGKV97y68gO9qzhIPSxcZD2ja1A915cXva+d+Twskys93GSFvaK+L70dqqu8lrCnOtfanTzRowg9UNQpO+T8Y71vtl69werJPNNAJruhiZ06dt4EvD0nH7v/enS85ViLPGsVAL1aCjM9KMlXvc297rtb+tk8WoGrOg53Jz3O1Jw8DANzPfU2iTxcKwW9TY0YPB8U4ryWck2871KPu/qBQjyJMVE9XnsBvSH9MTyhKcG7S2gYveyb6LtWz4M9P929vHMT/TzOOlq9OzPdvEVO1DzGM8M8JKlWvcaqXLwbBLg8Y5+Evfs2oLyGcSi8bN2qOydZ2r1egiA98AMEPRfP4bz/tvm8s2xvvBdhyrzmcJM8OFtxvSbEiztXR8a70GKPvEOLTj0Iw+y737PcvSdh0jzHH7I7BASyPRDSEb0fM7u7LjTUPB6t3zxF5eg8hkapvbvzrzynhRC9QdkKPRLQKryfDxy8syp9PaxjnbzyY/G8ZD6NvPWxd7yRRYo7q/FyvKZ5Dr1HEoi9rnEHPEw9ET0v/UO9zxesPHqTa7uhuCI9vVgRPeB63bvgwOQ8+5uFPNAn3Lu1txm8ZA/VvbV3pjx2rSI9X8w5PLLYrTyGbiU9646WPcZckbu9Oy49btXbvJQEJj3OrY+8KyeZvAC1Ab3QKiG9NiS/vPY/Hr30zBq9Qh+KO3LCdzyAjCk9VyUjPdjcUD26IK08gWqwvVCEIj1kIQA9hAwgOvV0v72IOe67XHTxvHO3nrxAd4u9FamCuywY57tgB8K8k6eWu2CKkbpdhH67lTrVvBMpSjuXVdY8s1aSPaVTsjzX7UM8qCKNuzmS1ju/o6u8jNmLvK55Bb2EXv66MJ+wvLgiDbx+gHG9cr8+uywYZTsczom8xxSqPBw8MzwwWTQ8ItRVPGveBjteMZg9dFASPFcfvzz08gM9GY37vO8mAb1tGAC9SzimPLaxATpC/KA9ES+gPL
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-server.ts","s":97,"e":156,"m":1776316465819.7732,"t":"});\n}\n\nexport async function fetchDocumentMetaViaBridge<T>(input: {\n documentId: string;\n workspaceId?: string | null;\n}): Promise<DocumentMetaResponse<T> | null> {\n const headerList = await headers();\n const requestHeaders = new Headers();\n const originCandidates = buildServerRequestOriginCandidates(headerList);\n\n copyHeaderIfPresent(requestHeaders, headerList, \"cookie\");\n copyHeaderIfPresent(requestHeaders, headerList, \"authorization\");\n copyHeaderIfPresent(requestHeaders, headerList, \"x-request-id\");\n copyHeaderIfPresent(requestHeaders, headerList, \"x-trace-id\");\n copyHeaderIfPresent(requestHeaders, headerList, \"x-session-id\");\n copyHeaderIfPresent(requestHeaders, headerList, \"x-source-channel\");\n copyHeaderIfPresent(requestHeaders, headerList, \"x-source-client\");\n copyHeaderIfPresent(requestHeaders, headerList, \"user-agent\");\n\n let response: Response | null = null;\n let lastError: unknown = null;\n const errorMessages: string[] = [];\n\n for (const origin of originCandidates) {\n const url = new URL(\"/api/documents/meta\", origin);\n url.searchParams.set(\"documentId\", input.documentId);\n if (input.workspaceId?.trim()) {\n url.searchParams.set(\"workspaceId\", input.workspaceId.trim());\n }\n\n try {\n response = await fetchDocumentMetaResponse(url, requestHeaders);\n break;\n } catch (error) {\n lastError = error;\n const message = error instanceof Error ? error.message : String(error);\n errorMessages.push(`${url.toString()} => ${message}`);\n }\n }\n\n if (!response) {\n const message =\n errorMessages.length > 0\n ? `bridge 自请求失败:${errorMessages.join(\" | \")}`\n : \"bridge 自请求失败:未生成可用的请求地址\";\n throw new Error(message, { cause: lastError instanceof Error ? lastError : undefined });\n }\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n let message = \"加载页面元信息失败\";\n try {\n const payload = (await response.json()) as { error?: string };\n if (typeof payload?.error === \"string\" && payload.error.trim()) {\n message = payload.error;\n }","v":"48AlPbkTirvvr8G9O/q0vY9TiD368oq9TSzRvHDTvbteboA9yQmVvdrYQL1QURs9QR/SPaxbSjt+7bY8f8BQvZPv8ztVvoK9ey1dOyJgETzd9fU8iZqHvNghGT2FpuO8yNKwPUZxDT13weA8Owc3PfFEp72X7k49jbY9vO3QND3lQlY7mq9gu6ROg71/ppc89LgzvaUttLwd+KS8WhpEOzGsTrvYjxQ767MBvKEI37pNCpw9fmEsvV7svT29lYo9aQpSPcf1sL0vGxG87daDvHrt0DxwRRq9/EnrPXJIzjy2xla8CW6Nu3GI6jufNHS7wbkUPO8urD1yhp48Df9aPZBjoj1INg69dXgavV9gnT3AY4I8AFeFPFvxQD3mMiI81ZqnO2BkLLwq4Dy9rp5mPbZJbrxge3+90bvyvLHlez1TGzi9k8E4vKe1XTzgDQ89tOwWPWx1dr2S1jk7vXb3vP/cN70LUG095+ZyPYfUIr0nHD87LO9LveA0Cr3Y0IM8mBgqvTluyjxoANG7xpM3uxV1LjxzUzW8TlCuu5LGg7wYfay8eY3jPAAUDz1an4+6sNyBvNOUDr0Gt528YkxbPWuPpL2lfry8IXxxPI+IbL1DNFs8oAQLvEwqmryD0wc9iGXSvBNtRL3z7cG8310gPFOwSz0W+Mc80HR4PMU7Gz08e6o8gMdivYRLXr1b/xG9/FQIvPPNXzxp5yc9I/vOPAbbD720UBm9GwanPGfVobwdeCY9cpbcvMLH07wAKKm89oQUvbPl0bsg/JE9Yp2FvId2D736o8O84wWAvAi/2jz2EbI8iKX2PDE1Ej2J/DO9PHvHPFl5Or1iaqW8DQ/pu0jXJT1J4us8/8V/vYgjAz0NdC+9qz4xvHruqLwYqus8tN2fPC8PirmTwVO9A14ivY8/kDwl25C7dej8O8dPB7xaAow818YjN0sZJDxJ+Ua92E11vJ3VwL3FN8Y8cxjdPB4Dcr2qes68hBNXPM9jKryJrzS61+VwvGbfJLzDzY68J1DevElMfjzTofy8akO2vYR9cju0Q+G88+uWPYUJ8bzZH7o8I35ZPOBJ/jxtd3m8WUR1vYKDyrz5+r+8h8sPPeH1Orx6zcS8GbfRPXX0LbxSLqw6dfORvD1lw7zgkn88SFdfuyAg1jobow69imPGPN25NzytgSm9y9QyPfawGD0IsvA8nRbYO8da6bw7jDG7rybru2dgM71qtjK8iB2qvcfyjDxY/Jk82SKvu6M1pDwbXuk8hnuzPWgjHDt8pCO8HvnuvL/05jxYpki83vqSvNRJf7vZ/7682qjwuzjSm7x1S+C8iCpIOuF8JLzwFRM9DpRFPFm1Wj0KCKU8hglwvQfWPzw3dQI9w0BrOl3ZHL03JCw8a8wevFLutDxWByK9mM6lvMaOFrxanSa9b7tJPBEaKLy0DbE8isFRvTMYoDzzREy8uPNaPfxf6zzGeqg7ZCEAu3moGT3sgK+8soSuu6jv2rxK6IU88QiPvEjhGbvoiFm8N5uUPBlcMruJ5RC7oF3uOyiaDrxq+Bq9K4n6PLx12Lw2eoM9XlzuvNSdTz22K/A8al28vJpeRr2jFoa9kDW9PIOwNz0UAzk9jCwoPe3/tbt0+3E6Z0vBu0kT5LwgiYA8NS0PPKEiCr0zWC28tIeWuv2qhzxuBiu9qvwaPaA6RD1ySAM6EIoEPYHo1zq2Pxy9WN0lvT+UAz28OlQ7d2UevQKFTD3s6Rc77i4CPF
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge-server.ts","s":145,"e":165,"m":1776316465819.7732,"t":"if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n let message = \"加载页面元信息失败\";\n try {\n const payload = (await response.json()) as { error?: string };\n if (typeof payload?.error === \"string\" && payload.error.trim()) {\n message = payload.error;\n }\n } catch {\n // 说明:这里保留默认错误消息,避免 JSON 解析失败覆盖真实状态码。\n }\n throw new ApiError(message, response.status);\n }\n\n return (await response.json()) as DocumentMetaResponse<T>;\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":1,"e":60,"m":1777197044697.0403,"t":"import { afterEach, describe, expect, it, vi } from \"vitest\";\nimport type { ConvexHttpClient } from \"convex/browser\";\n\nvi.mock(\"@/lib/auth/authContext\", () => ({\n HttpError: class HttpError extends Error {\n status: number;\n\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n },\n requireAuthContext: vi.fn(),\n}));\n\nvi.mock(\"@/lib/api-utils\", () => ({\n apiErrorResponse: vi.fn((message: string, status = 500, details?: unknown) => ({\n message,\n status,\n details,\n })),\n}));\n\nimport {\n DocumentBridgeError,\n assertDocumentId,\n assertBlockId,\n assertNextBlock,\n assertOptionsPatch,\n assertStats,\n assertTitle,\n buildDocumentBridgeMutationRequest,\n buildDocumentBridgeContextWithActor,\n buildDocumentCommandEnvelope,\n buildDocumentQueryEnvelope,\n type BridgeContext,\n} from \"@/lib/documents/bridge\";\nimport { executeMediaAssetWritebackBridgeCommand } from \"@/lib/documents/media-asset-command-adapter\";\nimport { executeMetadataBridgeCommand } from \"@/lib/documents/metadata-command-adapter\";\nimport { executePageLifecycleBridgeCommand } from \"@/lib/documents/page-command-adapter\";\nimport { executeSaveBridgeCommand } from \"@/lib/documents/save-command-adapter\";\nimport { buildDocumentSavePayload } from \"@/lib/documents/save-contract\";\n\nvi.mock(\"@/lib/convex/route\", () => ({\n getAuthedConvexClient: vi.fn(),\n}));\n\nvi.mock(\"@/lib/documents/bridge-log\", () => ({\n recordBridgeCommandArtifacts: vi.fn(),\n recordBridgeCommandFailureArtifacts: vi.fn(),\n recordRustBridgeCommandArtifacts: vi.fn(),\n}));\n\nvi.mock(\"@/lib/documents/rust-runtime\", () => ({\n resolveRustBridgeCommandPlan: vi.fn(),\n executeRustBridgeMutationTransport: vi.fn(),\n resolveRustBridgeQueryPlan: vi.fn(),\n executeRustBridgeQueryTransport: vi.fn(),\n}));","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":49,"e":108,"m":1777197044697.0403,"t":"recordBridgeCommandArtifacts: vi.fn(),\n recordBridgeCommandFailureArtifacts: vi.fn(),\n recordRustBridgeCommandArtifacts: vi.fn(),\n}));\n\nvi.mock(\"@/lib/documents/rust-runtime\", () => ({\n resolveRustBridgeCommandPlan: vi.fn(),\n executeRustBridgeMutationTransport: vi.fn(),\n resolveRustBridgeQueryPlan: vi.fn(),\n executeRustBridgeQueryTransport: vi.fn(),\n}));\n\nconst mockContext: BridgeContext = {\n deploymentId: null,\n projectId: null,\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actor: {\n actorType: \"user\",\n actorId: \"user_1\",\n sessionId: \"sess_1\",\n },\n source: {\n channel: \"next-route\",\n client: \"vitest\",\n },\n tenantId: null,\n authToken: null,\n idempotencyKey: \"idem_1\",\n validateOnly: false,\n dryRun: false,\n};\n\nafterEach(() => {\n vi.clearAllMocks();\n});\n\ndescribe(\"documents bridge helpers\", () => {\n it(\"assertDocumentId returns trimmed id\", () => {\n expect(assertDocumentId(\" doc_1 \")).toBe(\"doc_1\");\n });\n\n it(\"assertDocumentId throws on empty value\", () => {\n expect(() => assertDocumentId(\" \")).toThrow(DocumentBridgeError);\n });\n\n it(\"assertTitle normalizes empty title\", () => {\n expect(assertTitle(\" \")).toBe(\"无标题\");\n });\n\n it(\"assertBlockId returns trimmed block id\", () => {\n expect(assertBlockId(\" blk_1 \")).toBe(\"blk_1\");\n });\n\n it(\"assertNextBlock accepts plain object\", () => {\n expect(() => assertNextBlock({ id: \"blk_1\" })).not.toThrow();\n });\n\n it(\"assertStats accepts finite numeric stats\", () => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":97,"e":156,"m":1777197044697.0403,"t":"expect(assertTitle(\" \")).toBe(\"无标题\");\n });\n\n it(\"assertBlockId returns trimmed block id\", () => {\n expect(assertBlockId(\" blk_1 \")).toBe(\"blk_1\");\n });\n\n it(\"assertNextBlock accepts plain object\", () => {\n expect(() => assertNextBlock({ id: \"blk_1\" })).not.toThrow();\n });\n\n it(\"assertStats accepts finite numeric stats\", () => {\n expect(() =>\n assertStats({\n wordCount: 1,\n characterCount: 2,\n blockCount: 3,\n todoTotal: 4,\n todoDone: 5,\n }),\n ).not.toThrow();\n });\n\n it(\"assertOptionsPatch accepts stable page options patch\", () => {\n expect(() =>\n assertOptionsPatch({\n showToc: true,\n layoutDensity: \"compact\",\n embedDefaultBlockId: null,\n }),\n ).not.toThrow();\n });\n\n it(\"buildDocumentCommandEnvelope keeps context flags\", () => {\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.save\",\n payload: { documentId: \"doc_1\" },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n });\n\n expect(envelope.name).toBe(\"documents.save\");\n expect(envelope.actor.actorId).toBe(\"user_1\");\n expect(envelope.idempotencyKey).toBe(\"idem_1\");\n expect(envelope.target?.pageId).toBe(\"doc_1\");\n });\n\n it(\"buildDocumentQueryEnvelope keeps payload\", () => {\n const envelope = buildDocumentQueryEnvelope({\n name: \"documents.content.get\",\n payload: { documentId: \"doc_1\" },\n });\n\n expect(envelope.payload).toEqual({ documentId: \"doc_1\" });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds title update runtime request\", () => {\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.title.update\",\n payload: {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":145,"e":204,"m":1777197044697.0403,"t":"const envelope = buildDocumentQueryEnvelope({\n name: \"documents.content.get\",\n payload: { documentId: \"doc_1\" },\n });\n\n expect(envelope.payload).toEqual({ documentId: \"doc_1\" });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds title update runtime request\", () => {\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.title.update\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n title: \"新标题\",\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n });\n\n const request = buildDocumentBridgeMutationRequest({\n context: mockContext,\n envelope,\n mapConvexArgs: (payload) => ({\n id: payload.documentId,\n title: payload.title,\n }),\n });\n\n expect(request.functionName).toBe(\"documents:updateTitle\");\n expect(request.workspaceId).toBe(\"ws_1\");\n expect(request.args).toEqual({\n id: \"doc_1\",\n title: \"新标题\",\n });\n expect(JSON.parse(request.payloadJson)).toEqual({\n kind: \"command\",\n name: \"documents.title.update\",\n request_id: \"req_1\",\n trace_id: \"trace_1\",\n deployment_id: null,\n project_id: null,\n workspace_id: \"ws_1\",\n tenant_id: null,\n idempotency_key: \"idem_1\",\n actor: {\n type: \"user\",\n id: \"user_1\",\n session_id: \"sess_1\",\n },\n source: {\n channel: \"next-route\",\n client: \"vitest\",\n },\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds documents.save runtime request\", () => {\n const payload = buildDocumentSavePayload({\n documentId: \"doc_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":193,"e":252,"m":1777197044697.0403,"t":"session_id: \"sess_1\",\n },\n source: {\n channel: \"next-route\",\n client: \"vitest\",\n },\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds documents.save runtime request\", () => {\n const payload = buildDocumentSavePayload({\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n revision: 7,\n content: [{ id: \"block_1\" }],\n conflictDetectionKey: \"conflict_1\",\n snapshotCapturedAt: \"2026-04-14T14:30:00.000Z\",\n blockCount: 1,\n });\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.save\",\n payload,\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n });\n\n const request = buildDocumentBridgeMutationRequest({\n context: mockContext,\n envelope,\n mapConvexArgs: (nextPayload) => ({\n id: nextPayload.documentId,\n content: nextPayload.content,\n expectedRevision: nextPayload.revision,\n conflictDetectionKey: nextPayload.conflictDetectionKey,\n }),\n });\n\n expect(request.functionName).toBe(\"documents:updateContent\");\n expect(request.workspaceId).toBe(\"ws_1\");\n expect(request.args).toEqual({\n id: \"doc_1\",\n content: [{ id: \"block_1\" }],\n expectedRevision: 7,\n conflictDetectionKey: \"conflict_1\",\n });\n expect(JSON.parse(request.payloadJson)).toMatchObject({\n kind: \"command\",\n name: \"documents.save\",\n workspace_id: \"ws_1\",\n request_id: \"req_1\",\n trace_id: \"trace_1\",\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds documents.embed runtime request\", () => {\n const payload = {\n ...buildDocumentSavePayload({\n documentId: \"doc_2\",\n workspaceId: \"ws_1\",\n revision: 3,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":241,"e":300,"m":1777197044697.0403,"t":"workspace_id: \"ws_1\",\n request_id: \"req_1\",\n trace_id: \"trace_1\",\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds documents.embed runtime request\", () => {\n const payload = {\n ...buildDocumentSavePayload({\n documentId: \"doc_2\",\n workspaceId: \"ws_1\",\n revision: 3,\n content: [{ id: \"block_2\", type: \"pageReference\" }],\n conflictDetectionKey: \"conflict_3\",\n blockCount: 1,\n }),\n sourceDocumentId: \"doc_1\",\n targetDocumentId: \"doc_2\",\n anchorBlockId: \"anchor_1\",\n };\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.embed\",\n payload,\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_2\" },\n });\n\n const request = buildDocumentBridgeMutationRequest({\n context: mockContext,\n envelope,\n mapConvexArgs: (nextPayload) => ({\n id: nextPayload.documentId,\n content: nextPayload.content,\n expectedRevision: nextPayload.revision,\n conflictDetectionKey: nextPayload.conflictDetectionKey,\n sourceDocumentId: nextPayload.sourceDocumentId,\n targetDocumentId: nextPayload.targetDocumentId,\n anchorBlockId: nextPayload.anchorBlockId,\n }),\n });\n\n expect(request.functionName).toBe(\"documents:updateContent\");\n expect(request.workspaceId).toBe(\"ws_1\");\n expect(request.args).toEqual({\n id: \"doc_2\",\n content: [{ id: \"block_2\", type: \"pageReference\" }],\n expectedRevision: 3,\n conflictDetectionKey: \"conflict_3\",\n sourceDocumentId: \"doc_1\",\n targetDocumentId: \"doc_2\",\n anchorBlockId: \"anchor_1\",\n });\n expect(JSON.parse(request.payloadJson)).toMatchObject({\n kind: \"command\",\n name: \"documents.embed\",\n workspace_id: \"ws_1\",\n request_id: \"req_1\",\n trace_id: \"trace_1\",\n });\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":289,"e":348,"m":1777197044697.0403,"t":"sourceDocumentId: \"doc_1\",\n targetDocumentId: \"doc_2\",\n anchorBlockId: \"anchor_1\",\n });\n expect(JSON.parse(request.payloadJson)).toMatchObject({\n kind: \"command\",\n name: \"documents.embed\",\n workspace_id: \"ws_1\",\n request_id: \"req_1\",\n trace_id: \"trace_1\",\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds media asset writeback runtime request\", () => {\n const envelope = buildDocumentCommandEnvelope({\n name: \"media.assets.replace_storage\",\n payload: {\n assetId: \"asset_1\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n storageId: \"storage_1\",\n userId: \"user_1\",\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n });\n\n const request = buildDocumentBridgeMutationRequest({\n context: mockContext,\n envelope,\n mapConvexArgs: (payload) => ({\n userId: payload.userId,\n id: payload.assetId,\n storageId: payload.storageId,\n }),\n });\n\n expect(request.functionName).toBe(\"mediaAssets:replaceStorageFromUpload\");\n expect(request.workspaceId).toBe(\"ws_1\");\n expect(request.args).toEqual({\n userId: \"user_1\",\n id: \"asset_1\",\n storageId: \"storage_1\",\n });\n expect(JSON.parse(request.payloadJson)).toMatchObject({\n kind: \"command\",\n name: \"media.assets.replace_storage\",\n workspace_id: \"ws_1\",\n request_id: \"req_1\",\n trace_id: \"trace_1\",\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds page lifecycle runtime request\", () => {\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.create\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n parentId: \"parent_1\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":337,"e":396,"m":1777197044697.0403,"t":"request_id: \"req_1\",\n trace_id: \"trace_1\",\n });\n });\n\n it(\"buildDocumentBridgeMutationRequest builds page lifecycle runtime request\", () => {\n const envelope = buildDocumentCommandEnvelope({\n name: \"documents.create\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n parentId: \"parent_1\",\n title: \"无标题\",\n accessScope: \"private\",\n content: [],\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n });\n\n const request = buildDocumentBridgeMutationRequest({\n context: mockContext,\n envelope,\n mapConvexArgs: (payload) => ({\n id: payload.documentId,\n workspaceId: payload.workspaceId,\n parentId: payload.parentId,\n title: payload.title,\n accessScope: payload.accessScope,\n content: payload.content,\n }),\n });\n\n expect(request.functionName).toBe(\"documents:createWithParentReference\");\n expect(request.args).toEqual({\n id: \"doc_1\",\n workspaceId: \"ws_1\",\n parentId: \"parent_1\",\n title: \"无标题\",\n accessScope: \"private\",\n content: [],\n });\n });\n\n it(\"buildDocumentBridgeContextWithActor keeps explicit actor and source\", () => {\n const request = new Request(\"http://127.0.0.1:3001/api/onlyoffice/callback\", {\n headers: {\n \"x-request-id\": \"req_oo_1\",\n \"x-trace-id\": \"trace_oo_1\",\n },\n });\n\n const context = buildDocumentBridgeContextWithActor({\n request,\n workspaceId: \"ws_1\",\n actor: {\n actorType: \"service\",\n actorId: \"user_1\",\n sessionId: \"onlyoffice-callback\",\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":385,"e":444,"m":1777197044697.0403,"t":"\"x-trace-id\": \"trace_oo_1\",\n },\n });\n\n const context = buildDocumentBridgeContextWithActor({\n request,\n workspaceId: \"ws_1\",\n actor: {\n actorType: \"service\",\n actorId: \"user_1\",\n sessionId: \"onlyoffice-callback\",\n },\n source: {\n channel: \"onlyoffice-callback\",\n client: \"onlyoffice-document-server\",\n },\n idempotencyKey: \"asset_1\",\n });\n\n expect(context.requestId).toBe(\"req_oo_1\");\n expect(context.traceId).toBe(\"trace_oo_1\");\n expect(context.actor).toEqual({\n actorType: \"service\",\n actorId: \"user_1\",\n sessionId: \"onlyoffice-callback\",\n });\n expect(context.source).toEqual({\n channel: \"onlyoffice-callback\",\n client: \"onlyoffice-document-server\",\n });\n expect(context.idempotencyKey).toBe(\"asset_1\");\n });\n\n it(\"executeMetadataBridgeCommand routes title update through adapter\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.title.update\",\n commandId: \"cmd_title_1\",\n functionName: \"documents:updateTitle\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n title: \"新标题\",\n },","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":433,"e":492,"m":1777197044697.0403,"t":"commandId: \"cmd_title_1\",\n functionName: \"documents:updateTitle\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n title: \"新标题\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({ ok: true });\n\n const result = await executeMetadataBridgeCommand({\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"documents.title.update\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n title: \"新标题\",\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.title.update\",\n }),\n });\n expect(executeRustBridgeMutationTransport).toHaveBeenCalledWith({\n client: expect.any(Object),\n plan: expect.objectContaining({\n functionName: \"documents:updateTitle\",\n argsJson: {\n id: \"doc_1\",\n title: \"新标题\",\n },\n }),\n });\n expect(result.commandName).toBe(\"documents.title.update\");\n });\n\n it(\"executeMetadataBridgeCommand routes options update through adapter\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const { recordRustBridgeCommandArtifacts } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,","v":"erQevG94rrzp0hO+Rec3vYDilz36fJG917RpvCnpsDwuBkk9QVuhva26Mb3wuKI9sPkzPZVso7xWf508Q3rmvLDTsLyAYuC85v0aPXe6wbw5vEg8OGuDvPFf6TtgBhI8Nqb7POes9zv4OIO7QDffPCHiYr1N0Cu8X02EPOot+zwsZO+8sQp+uw2EVL1Htl29JxjWPLUShbxgk6W8MwkdPUJ3yzwwNpW7j7mJvIgz1rxx4HY9MZwdvMNjGj18CEY8tGmWPYbymb1r6z89gRUXvT54Oj20PKE8X00PPkPhhT0W30C8e7nHOtAxBLtd+aS9nR+OPEFGJj2h7UG833kvPZ00ij2TVv46SR6RvLactj2moji8LWLLO6JXdD0ikyY8vGrQPO/P+by313S8lralPC6VRLz1KTu9qNNzPIkgWDwR61i9N4KCu4vJVD2ARXO8FelFPZA5EjuSzEO8tRkdO+nUf72eawk9Wg0Buz79Br3vR2m9y2LFu8JqGr3VNiu9k3l6vU3B57w0I+S7uZynO/Iz5rn/5Gs8U3FEPIutnbyFs9a8NsowPQc03rz3os47KRHfOuIEgr1/7Ku8kaAJPblri7ziWxO9lPWsPAwDB7zN7Lw8B73IvKicYzqwfBU8MsXZvKCW37yl5Li8jzEzPQyuNz1m0A48xDo7vRChl7zJVQY9ByKCvW+Kerz8zyo7g+ANPMWGMzzrcrQ7G3VUPU3/xrybzeu85NJGPL1GS7x/Fbi7VlMbvLqvzrzxwkA87OE6u7zpiL2ndCE9KX1JuxLIirza4a47UFgKOiwEEj3CDlk8xKMuPLr1ZjytrCS8v4ujPA7hhrwqrZ6841A4PYFkPT3Vx/Q7BsF0ve1+mTzemwG9VH8WvF7aIry8fVA9WdRoOkpgrTy4Qrm8A6SUvc+njL3qH8w85Zf3vJnHarxQYN08w67yvLeq8TscsQC9qdzbPMslo70cGio9rvzlvNvt+rzTnhk7a2xAPAYdKr2eaog8Ix4zvcduj7mEUYm9LUSIvKPmBzwDJc68T0OJvbR7VTyi2uy81PqHPKSDrLwkDCe80AoCPZ1ClLxI3s88l5txvVhKSz3OgP68CbxnPZ6ZSjtaroU99p7PPQTUgb3xvw09x+QaPHe/2rwe3Q875qG9PBmGvjuaLTy9d+vhO2+inT0dRMG8PE1pPH5wVDzbRhQ84WIRPWyF3LzJYb+8DIytPL/xyLxPpvG8A1+gvUadxzyNl0s9DHs0PEY+rzxw75I80SWEPUjs0TxYTwq7UKp9u82mKzyMTqq7wJgLvJudDr17DKI8h6WVvDDZxLzE6DC80KiFPGG6Dz053Vs7M32SPP0xwTwqfz08wDBwvUzGybxNppu6vQEGPJ5B7bz6Mwg8ofb2u/1PaT2z8YO8PpWbvJq03ryP3cy87o98vFR8FT0K55Q8WPWiu8JE4Dyf5t68KN0jPZ+XBLxkq4q6amr7vCfnVD1chpe9oTVIuxI6ib2YPdm8u3aOvIUmYTzSy2m9DPNgu6IBvrzgCYS8+gbEO0qJG7xQTgm7fN47PRindL1ZzJQ9SJbOPMwkkbwzQok88KROPUWXPb1gOPO8rlYyO9kgfT0Cwo49obp1Pd91kLx6QSG90a6pvBeQabxD8iY8AI8HPOwDkLyK3SO8f+slvbItwTyKIY+89sEJPVkmLTwqYU08LXOoPJtb1Lue4xG9XXyQvKWR4bxM0JC7dPL9PEOF2Lv+iJe8WZ3PPIkSdjxmGNa7ckJ/PSqk6DxeLGE898x1vTI1Fru17oQ7DlT0PICdlT3gKE89/jwBPQ4f5jyVZfm8MontPNxjCz3O1EQ8AGDJPHCF27uzrn29+UFlPeuSTD2Mdkm9coQ7PbLrKL1v6Dc8IcWMOxH6yzsPSn+7rh4LPbmNKDzlTnw8scvJ
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":481,"e":540,"m":1777197044697.0403,"t":"it(\"executeMetadataBridgeCommand routes options update through adapter\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const { recordRustBridgeCommandArtifacts } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.options.update\",\n commandId: \"cmd_options_1\",\n functionName: \"documents:updateOptions\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n workspaceId: \"ws_1\",\n options: {\n showToc: true,\n layoutDensity: \"compact\",\n embedDefaultBlockId: null,\n },\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n ok: true,\n updated_at: \"2026-04-26T00:00:00.000Z\",\n });\n\n const result = await executeMetadataBridgeCommand({\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"documents.options.update\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n options: {\n showToc: true,\n layoutDensity: \"compact\",\n embedDefaultBlockId: null,\n },\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({","v":"M2Gwuzcs+LuBYRq+lOxXveL1yj1RoLe9NezVu5RtjTyyaRA9QhCPvSDajryI/JQ9n7mNPYDFDTwoHmm8zbDuvKzXXLxIosm8tjtbPdUvnLzykeU8HSMEvXPkNzth1pc7c0lnPViHeDx0/OE84g8HPbfjmr0d3pW7REjmPNQdhjz/z026UpfZvFNseb1T3XG9RRsDPX3M3rwooOK7i2wZPH9tKTyJ7h28xW4IPDKMYLwVXYc9XNMIvR9+aT0dNgc8rxCWPTjLm73oI686q0iiOxPV5LpxkcW8DgUQPvEynz0JKSK89YPHPDHXObwaNUO9N+mqPDX+LD2VW06866K0Pd1Glj2t62g8ctzGvFrHlz0Q/I87l5fqO9bFrj3n36E7MdOsPMeDbb24KRq9O/t8PDzfJrwk7Iu9vjArvMH1Uj2Lco+9WzxIvNwSFT27/ww8Lpf6PKN8V7x5jDA8oYokvAJtFb1bp0w9edKSO3NPBb0CKq28GrvuujyfEL1eMNK8UXNsvfsZwLxdxqE8Dm1zvEqMRLyd6/w8+an7ukuctbyB/h+9iVZxPWvoU7zTFiK7rzzZO6iBcr38GaS8J6nxPLxoxbwe7F69F0ADPbpQVbwdlHs7tyNIvbPsuDwBg3A86THkOj9D5bwOydO8jJhSPTjJiz3paC88dUktvepuGjwlwu48AYVHvc2jr7mOGqW7wd1wPP6SmzsD5tE8nt5QPRFhB70L1+G8D7E/PIl7lTybs9U7o1PnvEJK47zO49S6tiqGvL1/ubzTeAo8gaWsu0F34rywRgM8b+66vNNdBT06Rmg82+M4PWxyczzmlOC88XAxPXSKMb3tvKE8JAKQPBkUmT1PWcM89iCCvdnEBz0Mkz+93rafvBy2mbs4a1I9K792Ow73Uz3R1X+8V7RevWiJHb13JBE8oW6QvExmRTxNfcs8Ab22vPfB/jxwxJ68phvYu7Jvib2I80A9qcOPvP8nWb1IOdq6HzkkPNfTU70BiDa8DNRkvbL/qjza1EK9y+MQvWRhfTytJZm8Wj8zvaisnTwJbQe9UCYkPflEF70uPg08bwC5PFEJdLz89Sk8GGRovctoXDxq2wO8yCODPaED7DvspHo90L7hPYOnGr3pSzI9Y5yKu+7B0bw9jPy7DzQku/cqbjwzxxa8pmYpPICQnz0LpG29A/pkPIHw5DzjmKq7US7DujBfSLzvjAe9GgBGPKXIBTxYxPO8XdN+vbq+6jz0jw89l+S5PFdevDysTYY8buaIPfdl37tO00S8iQf5PBziGz3l1Mm71esmPD1OzryhZ8c86CA7vO22o7w6Aye8XzD4PO8xVzwXmac6m0DHuxjxST2s7AE8Bj5gvWKks7x5Suc7OpsKPA09ir2UbMc8MfJFu8Qc7jy69+i8H3atut7HB73/lAu9j9EuPDr2qDzF5UY8JvCvvOTmvzwCL0q8ifr+PPfLCz2c+8I7grfZu04M/jx8Wg69zbsHPd8cZ71IPWi8sKsivaesfryKnEq9agEyPBCDI7xZjZI76eXVPIboG7xvVP67UphNPPUvSb3hUBo9xhbIO36BKTy1Q109ESEfPP7K5rx8oUO9sO+4u3WCoz1Zs7E9YnY0PVOnUjptDB29OyaGvNksPr3tAZA8K+inPDwvzbsPuwa8+ZsCvX7FEj1X2t28vlNWPfDimjsFdgk9fHwVPDH5QLxVzSW9GB63vJuiWrzwype7a5/AO2GMt7ocwOM7YrMNPeIubzzEtZO7a4VOPVZkVTx6YP487F2IvRU7o7zV4hK9iwcYO+3gdj182dw7tthyPbo/njxEyV69ltYBPZfxSz1shqK84lSmPNhFErwAs0i9WLAaPQ0YTT0/fIu9oKlePXSiSb2V8ZO81GSGuy/1YDu
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":529,"e":588,"m":1777197044697.0403,"t":"layoutDensity: \"compact\",\n embedDefaultBlockId: null,\n },\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.options.update\",\n }),\n });\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.options.update\",\n }),\n plan: expect.objectContaining({\n commandName: \"documents.options.update\",\n functionName: \"documents:updateOptions\",\n }),\n result: {\n ok: true,\n updated_at: \"2026-04-26T00:00:00.000Z\",\n },\n });\n expect(result.commandName).toBe(\"documents.options.update\");\n });\n\n it(\"executeMetadataBridgeCommand routes stats update through rust runtime\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const { recordRustBridgeCommandArtifacts } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn().mockResolvedValue({\n ok: true,\n updated_at: \"2026-04-26T00:00:00.000Z\",\n }),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.stats.update\",\n commandId: \"cmd_stats_1\",\n functionName: \"documents:updateStats\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",","v":"WrhpO9Fnqbx8NhG+872gvX6ecz07+eS8lXlivCcDJ7yajPU6t+u/vZpgUrwXHaE96jiXPSZ0/rysj4G8cqtPvVhO8rygvg69fGdcPRMF9TrCP+48VtRLvDgmxDxeqYk7v13uPIDfvzvVnyo9GUE+Pe4fmb3x7Na8urdCPRaGwzyGf6u8gHGBvPYiwb07JZS9q2rOPGWlmDsnAhK9LnoiPLCzpTwr/fE7A0fNvN8l1bxOqz49EIzIO4g7zTyKeEw87F6lPbDulL15XBe8L6luvZ2pxTxUzIC8ufgbPnPLiD08GG27MOZpu/4jnTyWlDS9AxaSPL5wKTwpcra8pAadPcdoAj18hLY8/xMcvIxe0jxHYjQ8ANCOvAylVz3QUk+843viO1pNTb2ZYou8N/FzPRu9QL0Zy0W9xdIjPC4YqTzIjTC9Wju3u66TAT1fYJw8+XuhPA2i47zA+QW7aZNpO3fWh7xcTkU9n8i4PFVLHDyRh/C8zGfGOz0Flbxv21W8EK0evXLPs7izX/U7pTLkueNYRzwBPJY8N8DPvMjvPLzna9i8NcAyPQWjYb23kvo8L8KyvNwRzr0OyLW86pcIPd8PD70evlW9Jc/RPAbSqry+0to82H9wvPfwtDxVsRY7TqtPvJ0qhb02hLU7HbBBPXs8CD2P33u7mlxpvbElTjwql748gKc0vUt2wLzeH4u8x8eXvO4hpLsbhII8Leq+PBZxEb0gSw29MIC6PDbQ1Liajq48DQrYPLksH70RAb68h8vQvJbOUb3B3d88XGAnvAyndLw/UQW8/nUfvV43iD3fSgO8Y9/LPN77MrxuPXS7S5J6PdsLtbz3eR88R5FQPT1qMT0MNSU9GT5vvYho/TwGvga9jUccvBqXQDxS+SY6OCAGPN3LLT05YjO8UVqHvdfefr3JRqs7x2AhvRWqjTxYJcM8xwYlu3aVlDzvDk69CB6YvHi/lr1gKYk9YP/oO5QOX71MbCu8uUhAPV6Sa7yWml88mXdfvRodory0baW9Dw0Svcc2ibuzpGy8eraBvQOV9Du0JtW8SE/tPG4jAL1Gm0c7EoLpPPHr4bpjJlo91eVJvRGMGT3SFBe8DyojPaJg77voNGE9EAzHPUNAcb2nbcU8+Ma2O2Vydrx4KfW7hqLLvJEErjxm5U29s6BCPKNPlj0iBCG9R7wYPTfsFjx+pLU810aZPMwd/rtOYEK8Vw0pO5poSrxpUjG9QrE/vVkkxLpGJY097HqjPM16TD3bdsc8b4JwPWIU3Dtpx1q6TGorPHQpOD32GGg8ERcAveJlab3CY1e80hYCvb5Qvby/dpe73aqXPHid9TsMDU280lsJPY2QrjxWZc27z1hIvS0kortObuq8FGACvaa2jb2L25I8Bkdnu+k5KT3FNsA7sLwMvJSCDL1FQx+9cDTiO1aJejzL6jQ8aL9cvPdbMz0hWKK78gOHPBClDT1W+ZW8dylUPMr2Rz24pNW8JNutPCCQoL3Wl368xMmVuzUD6Tx2lxK9aL2QOkXXvbyz+KE8kjehOGWNkjtvkwW8R6lZPW94Wr39Y409KA8yPbcEK7ucCmU8d83zPIAsprt8fSq9j1rfu4fwND1avY49E01FPb/LLr3Qrcy8gPYuvD2HQr01OcY7mxWZvGSeCr2P5S+7tJkEvbVi8TzKyKW87ZjePIzo8DuuC5A8OXOSPP41jTyFkzM7N9HNvK2xTrxSKEm8sJBsPFJtmDypq+i8Q5oYPU8ZcD2DwbQ8K3ltPdFXFzxAVg88OJs1va6AGb2yFiG8T7o3PBCezTyjrvI6BOOCPZGkWz1+nQC8/SBIPTVdgjxbtB671eZPPbumOryKBoS9f07rPHcQPz
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":577,"e":636,"m":1777197044697.0403,"t":"});\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.stats.update\",\n commandId: \"cmd_stats_1\",\n functionName: \"documents:updateStats\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n workspaceId: \"ws_1\",\n wordCount: 12,\n characterCount: 34,\n blockCount: 5,\n todoTotal: 6,\n todoDone: 2,\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n ok: true,\n updated_at: \"2026-04-26T00:00:00.000Z\",\n });\n\n const result = await executeMetadataBridgeCommand({\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"documents.stats.update\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n stats: {\n wordCount: 12,\n characterCount: 34,\n blockCount: 5,\n todoTotal: 6,\n todoDone: 2,\n },\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.stats.update\",\n }),\n });\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.stats.update\",\n }),\n plan: expect.objectContaining({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":625,"e":684,"m":1777197044697.0403,"t":"context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.stats.update\",\n }),\n });\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.stats.update\",\n }),\n plan: expect.objectContaining({\n commandName: \"documents.stats.update\",\n functionName: \"documents:updateStats\",\n }),\n result: {\n ok: true,\n updated_at: \"2026-04-26T00:00:00.000Z\",\n },\n });\n expect(result.commandName).toBe(\"documents.stats.update\");\n });\n\n it(\"executeSaveBridgeCommand routes documents.save through adapter\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const { recordRustBridgeCommandArtifacts } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(recordRustBridgeCommandArtifacts).mockResolvedValue(undefined);\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.save\",\n commandId: \"cmd_save_1\",\n functionName: \"documents:updateContent\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n content: [{ id: \"block_1\" }],\n expectedRevision: 7,\n conflictDetectionKey: \"conflict_1\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n revision: 7,\n conflict_detection_key: \"conflict_1\",\n });\n const previousBridgeArtifactCalls = vi.mocked(recordRustBridgeCommandArtifacts).mock.calls.length;","v":"nAoBPFoZ3DvXyfy9Kne1vfRRtz1zrmK9BLibO8NEiDtVhOc8Cy48vQPlFr1SqKU9zMEcPTopAjwagK48XBo4vQtBBLqUN9e8QcidPGT8Szs+P1w8lNWUvK5Kvjy5TaE8Kt0DPcdWVTuIivw8N6rxPOIq4r2QJfi8/XaHPPmmTj1Ir6G8t81cvf9n271f6aa9PDTePDXTGzvHvzG9cBqhPAGTGj2OPH88WRJxvB/acLxcXDY9cgWVPKe+JD0RiKw8T2Z/PWSldb30Nf88reUcvWTdozxmsSS8vBT+PcikfD1Jl9I8/vdBu1WfCbyRkUW95L9FPEavbzwvVB+9FU6NPZBsVz3xMtg8atYZvSDYmD2Nz0k82TA2PDPIlD3OC3e84gRWu1dLFr3Xlh29Mq9iPf3mxrzeKdu8cX4ePMK5ED36oUa9OJ0YvIS3bz3s3O07fP8QPbOsvbzPlPC8XaOVvP0FC71+ooo9JDQ7vMR0ery5M0i8nwRcvHOyMr1rigi9iGiEvWaNrrxbfX47uaOGPKJ0nDvRA048jC0mPMccurycDCe98AFbPSpMH71PlRg9OpHaO9DBlr2xA6m83sMHPQcWK70A4yi9fRrmPK3VlDwSOrg8iU+4vPwuSrz9XjY8msePvAGUB72LFwK8U8YAPYbgAz0cegY9/enEvKhD1zy64VM8BfFlvX8hIjuDjmC8PKQsvLbTE7yVF4c8bG5/PWZUJ7ztfBK9GNT5PMYovTwG2Mg8DKLVOlvzNr1DIwC9bleovIasar2UBUw9mRkLuIAYwbyKmoE8Uj0yvU6cSD1jvy686hgBPQG9ZTy14Yc8BosWOzui6Ly8SF48szFsPTYxYT3pN7k8RzqWvdit/zy5ulq98B3QO8R09rtZv508l0zjvJvFOz1vyPe6KgtVvZdQZb3UoYu7IYhBvSw5GD1LeDA9QyYBvXYnFTxLw868GAppO3j6jr0XbJw9MH4FvcrIAb1GWQu9k0wZO+qlDb0T7I28tQo8vaNKxbkumXC9QXMkvQTSzrvPMhu9EyowvQgYzjyxB7O8IxWTPHp1EL3Qkc488oXTPMsb2ryO8os9kv6HvfFjPD08WkK9fiaIPYLMDbvVmho9t63WPfQkLL2dDYk8OEdRPP66r7xZdOO7cmM4PIfTCj3MxBS9mWqPPJlQaD37OjC9FeIqPbogQrzU3aM71cCPPDxJnTywMQk6W4tiu4wHODxBHFK9itKvvajvsznSvRU9uN/TO4l6iz3/V9Q86ARcPR/rjjyCESU6J6CpPLoWPz1nJL68+NH6PMQbW718QW67ytWivAzuEL38N0m78OA2PbLhkzwtRMi63PLkPOZrBjzu44o8MCuTvbcbnzpyT8O7ivSfvO5ky7w7Ejq6KGq1vDdX4Tye88G63BnovN9+Ub2XPpK8aSQDvAQ1hDz7mSQ7uXGJu5Gpojz9w128kiu4u4RqBz1kks68TALduClKxzyIg468MKO2uYo+Br3MKGe9McvlvAZ76zzuCie8jteGPCXjAb0+qng8f4t3PFIBVryol1a8uxstPfJxmL3IFIk9kyMjPBSRDryNhwA94kxoPImfFLywKPi8xqTwvOHEWj12okU9uPlpPY7zjLwdbAO9cFoVvC5xDb0rouE7yOW5vHBfUr3gu6W8G9DLvDPaSD2RPrO8GbUqPZ8rWDxdOXc9Yxh/OmJ9VbvnPJK8FjUBvUt5MrxcHVo8XY4aPG5uHj1xRDm9wk7RPBGuWz2MRNS5j5g9Pf/B
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":673,"e":732,"m":1777197044697.0403,"t":"argsJson: {\n id: \"doc_1\",\n content: [{ id: \"block_1\" }],\n expectedRevision: 7,\n conflictDetectionKey: \"conflict_1\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n revision: 7,\n conflict_detection_key: \"conflict_1\",\n });\n const previousBridgeArtifactCalls = vi.mocked(recordRustBridgeCommandArtifacts).mock.calls.length;\n\n const payload = buildDocumentSavePayload({\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n revision: 7,\n content: [{ id: \"block_1\" }],\n conflictDetectionKey: \"conflict_1\",\n snapshotCapturedAt: \"2026-04-14T14:30:00.000Z\",\n blockCount: 1,\n });\n\n const result = await executeSaveBridgeCommand({\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"documents.save\",\n payload,\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.save\",\n }),\n });\n expect(executeRustBridgeMutationTransport).toHaveBeenCalledWith({\n client: expect.any(Object),\n plan: expect.objectContaining({\n functionName: \"documents:updateContent\",\n argsJson: {\n id: \"doc_1\",\n content: [{ id: \"block_1\" }],\n expectedRevision: 7,\n conflictDetectionKey: \"conflict_1\",\n },\n }),\n });\n expect(vi.mocked(recordRustBridgeCommandArtifacts).mock.calls.length).toBe(\n previousBridgeArtifactCalls + 1,\n );\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.save\",\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },","v":"NddIvCfj4zoloQe+2Ha5vYC9cT3+bFu9yNUEvPeHjryuqCY9CCuPvfIpXb07j1Y9gQ5APe91KTvBv/I8gTXnvJv4vLz79CC9gUZDO3vRwTrKZMu8nxR9vM0e4LoEFCi9Y3nbPM/kGj3qRJE8lsCHPXGGvL2ANKw7eXqbPKpzcDzkmtG8T+E0vT1fub3ZaW+9j460PFSNsbwOs3C9939wON0+Hz34xO47YdObugEdCb3/An49LNmMvKnBEj1Nw+88+NCJPZyRkb3O84E8z8AVvWj8Ij2L8zm8SbvcPUr4bD0DLJS84vQCvfTNCTt08IC9dZMOPQZ5Gz1hQI68sYuOPfDkNT3OHnO88JEYvawCVj0s97g71/CFuy9ZlD3S8wO6jnahvC4PtTztDD28Rp8IPdOpkznwHpS8auCGu90hyTw9Y7q8X2QYvfebbj2A6BK9O92oPWrXTL3AAw29x57quaLUUL2lB5o96NgMvEV+HjtuQ5e8ZusWvLfECL3lx5m8KDgwvX3FEry61oS8jHbwPCIGFLxVDew8TcfnO66UprxZx3m91FNLPbl1+bxB64E8YY/suvE8iL1AGHi7F00vPVlEVb1rAiO9TH0oPVTNfbwrRqs8OIKYO/tIP72VPWe7bpkmvcfgI700Eio8joMiPSXXKD2l6ss8nfCfu/2dnTzqV4g8RpRCvZx5Ojzo8IC6aKyQvNXfJ7ztRt87s2hmPdtYfryz7u+8tfCuOQyUt7tVLtE6vifoPPsQcrz7sFe9AvWSPCX7j7255tE8je5+vFunO70Syl48/6HxvMpacz0F5pC8KYvYO3kM2jyKeJw8Z4QWPag5i7x102A8bFA0PQocuzy4fg09xI5nvWGK3DyZ/Bm9WLg9vFhdtLwRXyY9m/C8vF8hpTxarF293r9ovRjgAb25j5S7825KvY/2ljy2oIg8OHSBvWYbNbyOqVO84nPlOrr2pr3FMYQ97lOUuotSB72wUCq8NJ6TOy765rzdMEu8BaJcvZZtuLsGczq9zHETvSstTzz/sNy8ZkGDvSOuvjw0lZ68x8VCPAxDj7w6g4w8v8tgPIR7yLvlPRI96S6hvUoxYz1uo9+8fFUmPc5umLsQAeQ8cbC6PQCyD70IpbK8mCQxPKPfJ7xZCtM6p9AWOzffPzzh0n293zMAO7jeFz11Iry8Z7bAPCngMr34ui89Gf4cPeUwOzz9v3k8024gOzepq7zagzG9/+akvZSdGz1l4iI9S1YVPFqWmT3GJ4Y7T+6TPaNdEbvygk48WK9YPPQhPD3e+te7IsBIPYK6I70CbQu8sGSbumHQxrxFXje9bwM4PUL2HTwN8jE81PIQPd2aBTx6kns9KM93vQQnjjtuZME7aJAWvLmTIb2Nsne7N2sGPHRqbz1Wtuu8/vShvBVTdb1eTSy8HRoLuwebjDu0uj67c7pAuvz/8TxT3pM8XXJKPPp6/DsELAK85zOkuzFoUTvSrtm8nrBruvJIZr13wzQ81RaGu+FDgjqHleO6x6+avODhgb1PE026PDmBOkaQHr0r07U7BnJVPe18m73Xfcc9aaTnPEA5r7yvbKs8DBdPPLT6Hb2Fvae832D7vNdwXD0974c9creAPaU7Zrz+6AO9U9k3PbzDFroBCsQ8t7PuvPcaGb0o1iO86saQvDr2Bj3xao28p7goPSzHdj0idBs9HvW8PLLvzTw9oJK8PXXbu8X5l7yAJqI6R3Y8vAZ8Aj3LcWS9tcunPKMhQT3/8JU8megaPQbNyLuRmzk9TQqJvRd44Tu2fsy7wGcrPGXZDz29bWE6Aug7PRBZeDx0gYe7vU+iPDsP0bxE3EA8x5y+PN35NTxwKVS9G0+xPbZaCz1i5Sy91nAPPDsrHLwvEY479NdZPSK2ajxTsxQ7S8w7PWssdTxVWCq8rOA8PXHMKz27iok8edOMPFEo57tn0es8/hKFPIYQhbs9mwQ9
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":721,"e":780,"m":1777197044697.0403,"t":"},\n }),\n });\n expect(vi.mocked(recordRustBridgeCommandArtifacts).mock.calls.length).toBe(\n previousBridgeArtifactCalls + 1,\n );\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.save\",\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n payload,\n }),\n plan: expect.objectContaining({\n commandName: \"documents.save\",\n functionName: \"documents:updateContent\",\n }),\n result: {\n revision: 7,\n conflict_detection_key: \"conflict_1\",\n },\n });\n expect(result.requestId).toBe(\"req_1\");\n expect(result.traceId).toBe(\"trace_1\");\n expect(result.commandName).toBe(\"documents.save\");\n });\n\n it(\"executeSaveBridgeCommand 将冲突错误归一为 bridge rejected\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.save\",\n commandId: \"cmd_save_1\",\n functionName: \"documents:updateContent\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n content: [{ id: \"block_1\" }],\n expectedRevision: 7,\n conflictDetectionKey: \"conflict_1\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockRejectedValue(\n new Error(\"正文内容已变更,请刷新后重试\"),","v":"bur2uy1ErLsU/hC+zCNUvYxkpj05+D+9phC/umn22jwX4ho9yXqHvV7eSr2QfI89smoPPG3BxboXoM48UAUGvdU6lDuYBvK8Sye4PE+XDLt25/S8wr02vCzZmbpe78i7hisdPVHwEj0ivkm6oLs7PU30sL0fnyC7RvOKPDfUlDxt6wq93d0FvdCTwL3U51K94EIMO30oELyYz+m8+Y85PO9ZyTzeGog8j6i8vJDpa7xdwYc9s5gzPCSjKD0l+iE9VHN6Pd/wgb0bS+g8pas4vRw5Qz3Diw28ta7zPQKhbj2LGIE7b5EKvYY0qzmU2K69pRSbutIYgDzQlw298As4PdNRjT2W5tg8yJkuvcrfgz0RqFs7jwuFueExlz1bWYk82VSNu+6wAb1g8SK9Y8IsPfktrrw9b6C8qtnBPP+UHj0bCim9spnmu2W5aD13Z+Q7c3XIPOKnjLxOZCq8GGpUOyFTa70dSI49JPUuvNMo67ykv9u8+3LpvCw4Dr1DqS29v1t9vSmF9bz1BK68U5GyPEKmYzyWPt48ljECPPMx6rxHHCK9cXQzPQ2czrzOUds8CuZcvG3Xs71RHqO8fPvwPCo1FL0iFBe9qj7dPJtvKTspSSI8rJr+vBPrWbzvZv88ibLhvFECgL0uOkG8+REiPVByRT011ec8MCDOvOmGwDwItJI8y59fvWvdKTvu4so5XojcvBKDGbsoINo7jchRPY/G+zsBYVC9VwOcPLoNjLwSyuo8vrK5OwlhE72/eaC8Ib6SvJTVnL1CikQ9dJqqu2CQJL2Hdi08x3/pvIyrUj2k1rG7dJiNPFJ7I7vlabg71zHcPCPI1byAfo88gClKPVcSVz1nRio8JRhzvfggWz265Cu9NtWnvOZqvby/DNw86XYNu6KZGT1QjaO8ThdmvVRKN71t1zO7b8MLvf7OhjsKKrQ8WFQhvVHbEDqQjsO8yIVMPIZvZ70CpaE901itvLnzU72K1PC8xCiEu3tKpbyU8ea7tcNgvZbcZjw/JQW9nuNwvXRXlDtxTgk8ZJ9lvTTWZzyCG+68Da3dPIoeUrxylLE8C9oMPYpBjLzdERs9DuSVveecTD0jXB+97MSLPU/wGLwx7g490IPGPUA+Wb1nSRk8F96GPFicKLzhLpM8CEbEPBYLaTzbHjS9UdcmPNcgfT2fESO9TdgUPHXFgbunzwY94DSWPO+FzLqNpS683K+ePIfWpbw5GNq89DW8vXOIrTxoY0s9xkRdPCnbXz0+p2k8JF9VPeOeszzgQp+8uYLvO/hOSj2jQZS8xc2jPNW5k737nvs48wicOwHeTrzF9oa6dzoVPc4o7zw5Z6U6R/4BPaqqvjwZTZQ8AI1FvUr7vzsffIe6IZCAu0X8Eb1gM4K8akGGvKM0MT1vjGe86ygovem0Eb08HGu8NG8ivD30+jvaloW8XSqmu/FVxTx6/+a60MwaPW5C1TwcKw+9lCmhvHGYUj3SWfu8DWcfu1QNZr1o38K8BahvvKm9ET0cGsO8X6MPvHMoBb0+Gyi8nGCiuuR8l7wRsp28EALiPIdpjr3P+ao9QN0TPHDdYrx/Ros8LiUAPWbJHL3ATRG9CqmFvA2GNj2M+289t3tiPbNdEb2wrvC8TZJDPMAp9zp4uhg8o7g7vSNg6by38w+9hybovF730LsGPC+9knQEPT6HHD1VToM9RZVMPA/+fzwtuJq8gOCEvFID4rykhSa7stF1vOrRAj0vma684ahpPeDhaD0xvQM8EH1FPcEmCTydi7s8S32TvbFUZrsd5um81nwePRNYej1Thdc7RF8fPRUwHT2Wkmy8FutCPXS+jDwQGQE8dlc7PPN1IrySQG+9nl6KPRXKBj0WvxG9bGX0P
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":769,"e":828,"m":1777197044697.0403,"t":"actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n content: [{ id: \"block_1\" }],\n expectedRevision: 7,\n conflictDetectionKey: \"conflict_1\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockRejectedValue(\n new Error(\"正文内容已变更,请刷新后重试\"),\n );\n\n const payload = buildDocumentSavePayload({\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n revision: 7,\n content: [{ id: \"block_1\" }],\n conflictDetectionKey: \"conflict_1\",\n });\n\n await expect(\n executeSaveBridgeCommand({\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"documents.save\",\n payload,\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n }),\n ).rejects.toMatchObject({\n name: \"DocumentBridgeError\",\n status: 409,\n code: \"REJECTED\",\n });\n });\n\n it(\"executePageLifecycleBridgeCommand routes page mutation through rust runtime\", async () => {\n const { getAuthedConvexClient } = await import(\"@/lib/convex/route\");\n const { recordRustBridgeCommandArtifacts } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(getAuthedConvexClient).mockResolvedValue({\n auth: { userId: \"user_1\" },\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(recordRustBridgeCommandArtifacts).mockResolvedValue(undefined);\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.create\",\n commandId: \"cmd_create_1\",\n functionName: \"documents:createWithParentReference\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",","v":"c+FyvOOvWDzQvBW+pfRBvbbHwT2Z7Gq9fnbDvBOi8jtigiA9SiybvVyPLb0Q31A9HR3UPNlI77yvuTQ8hQo1vYEWKDyD79y8HAoMPTSs9Tqvw488ydmqvGyiOzwEBBW8qjMvPVrMULur/768ygSTPBQEgb2e4Xs8gImpPPuepTyXa3S8Jrrgu8dYY70HwyW9LguFvH8ok7zf9r28g9tWPeAzcDzLkqA8lSSwvAa/Gb3ipGI9egI3u+xDOj3XOis8DdxqPViKtr2O3l09fw6CvW7ZMj0hPKu8+Db8PTjmfz30DW+9RU3XvABeITyVP6i9i+HAvLxVNT1vZ0y9YinvPOeIUj1iP108pFrxvG5fpz0RdY08iXalO+T2Zj1QtLs7OBNGPMdW7Ltdz/W7eA8sPRHg/ruiZiS9nsjePHHM9jyyeWW9KrtSvPRaUT1O4R47kNZNPVXBdLxzUI+8Zt36O/voVb3OXA89oSX8uwGvQ70cKkG9lcVRvO2PxbyJVQ295l2jvRIVQryKB0W8NKDdPAvfPjxyOHs8L/6XPF9oC7we+DW9OOLDPI4qnLoB2Q07cw7puzFtl73oIIe8jWwsPMr3w7z63/S8s545PaPnMLwiVxw8bd1wvPVferu4eR88Y5YyvRjeH73zjA699xx0PXvjgT0tvTw7tGEMvbJCKjyHyRI9OU9OvVoGI714Glc74KmGu0B/G7y1RDY8/QZYPVLh4Lq8JCe9+pYZPGg9MLwTtX87VS6numpDOr22pJq6KaHHuwmTRr1XESw9+UQZOgsgRb1wvuy7HrWMvHvQIj0YjJ87m+ujPDw2wTvV466808oKPdrFh7xQhWc77pYOPaBgwDx/7ts7lEaevZMfKD2/wNe7jcF7u1NayLygmoc9Wy9OPInIxzvt/b28Vb6pvRWKSb1TpgM91w0mvdlbA73V1Ag96j8QvbGfV7wm2+i88xtfvFKRgr0OH0o92ZGzvINklbslD6m8t8UUPe1jJ71RwDi8s4R5vTScPLvlOmS9CVbLvDDrJzsFubq8UprCvaqI9DwGLVq82cMgPS9v9bt9zKS8OR2mPBv8X7yR6J88WoGwvSENBT01Q/+8A6a5Pe2Qjryx82Q9sLSwPU2JL72Akwo87DQwPOcWJr3NWv47cYq6PJNYC7ySLXy9q3KVOxWgpz2lLqq8VqWRPKx83DznrMQ88uqLPDg0jbxuL8S8R2CdPANYHL2j0xG9qbWqvSOP9jyD20k9qez3uxr4Ej0v3747awV+PdJXOzx4BV+8qpoNPHvm3Dz59aq809vGuxnNrLwMIaY65EeUvBROIr28pxK7hgbgPKvS2Txf0HG7GJuePK8DuzwvUP07LcpLvZHa/LswnJs82NPUOwO3lLzQZ9A7SF18PE7/Gz1ZpDq823OMvEfDQL31o468owmZvIfW4Dx5uWg8MlQivS2wrTyDGEO8YG3MPJJqUjsOpwK9vEfcvPldID0x8p+95lQhPNs/Hr2YvKK8WMfwvO+0ZzzFL7+8E65GvH+BNL0Kks+86X+YvOFOl7wcCRi9jCvhPJC4Gb1dsKA9lCgcPViZPjohXaY8XLzYPNkXkL2wi9i8SseIuztrIz14X309b+q3PRSmT7xAd5C86ON/OyaEfbuvfZw6CIELvNW1w7yNOIO8xCtfvdilsjuLUCa7gjyFO46b6TwunUo9jeAOPNhRQrqC7Qi9IaK0vE5Yi7xjMMW6y169PPe0Gj0an5+8jj8bPU51hjzV1c28w88oPQ3JCT2sv/I8I3JuvT93tLxqTZS7PObZPOUSiT37qwQ96ygmPUEXAj3X1km9zoRWPawlxDyztSA78hoxPaiMbrwzZIW9zG9TPYfEZj2ctzm9t+hnPXkoQ73Eb5E6+UgoPPZQRTx
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":817,"e":876,"m":1777197044697.0403,"t":"client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n });\n vi.mocked(recordRustBridgeCommandArtifacts).mockResolvedValue(undefined);\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"documents.create\",\n commandId: \"cmd_create_1\",\n functionName: \"documents:createWithParentReference\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n id: \"doc_1\",\n workspaceId: \"ws_1\",\n parentId: \"parent_1\",\n title: \"无标题\",\n accessScope: \"private\",\n content: [],\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n id: \"doc_1\",\n title: \"无标题\",\n });\n\n const result = await executePageLifecycleBridgeCommand({\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"documents.create\",\n payload: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n parentId: \"parent_1\",\n title: \"无标题\",\n accessScope: \"private\",\n content: [],\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.create\",\n }),\n });\n expect(executeRustBridgeMutationTransport).toHaveBeenCalledWith({\n client: expect.any(Object),\n plan: expect.objectContaining({\n functionName: \"documents:createWithParentReference\",\n }),\n });\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":865,"e":924,"m":1777197044697.0403,"t":"context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.create\",\n }),\n });\n expect(executeRustBridgeMutationTransport).toHaveBeenCalledWith({\n client: expect.any(Object),\n plan: expect.objectContaining({\n functionName: \"documents:createWithParentReference\",\n }),\n });\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"documents.create\",\n }),\n plan: expect.objectContaining({\n commandName: \"documents.create\",\n functionName: \"documents:createWithParentReference\",\n }),\n result: {\n id: \"doc_1\",\n title: \"无标题\",\n },\n });\n expect(result.result).toEqual({\n id: \"doc_1\",\n title: \"无标题\",\n });\n });\n\n it(\"executeMediaAssetWritebackBridgeCommand routes callback writeback through adapter\", async () => {\n const { recordRustBridgeCommandArtifacts } = await import(\"@/lib/documents/bridge-log\");\n const {\n resolveRustBridgeCommandPlan,\n executeRustBridgeMutationTransport,\n } = await import(\"@/lib/documents/rust-runtime\");\n vi.mocked(recordRustBridgeCommandArtifacts).mockResolvedValue(undefined);\n vi.mocked(resolveRustBridgeCommandPlan).mockResolvedValue({\n kind: \"command\",\n commandName: \"media.assets.replace_storage\",\n commandId: \"cmd_asset_1\",\n functionName: \"mediaAssets:replaceStorageFromUpload\",\n workspaceId: \"ws_1\",\n requestId: \"req_1\",\n traceId: \"trace_1\",\n actorId: \"user_1\",\n idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n userId: \"user_1\",\n id: \"asset_1\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n storageId: \"storage_1\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n ok: true,","v":"uMhvvERL0jsjufG9fgvAvWa2pj0N+4S92AZ0PN6wczyZfIE8CzuDvShqL73ZVJc96XwvPTwXpDsmNhQ9wssMvR4T9TokgcG8+GcFPVMLrDwAVJc7utrrO/ZyEjyZ4yg8TBc5PSNKj7tZ4RI7CeqNPK5A1b2rh968H/i4POTNPT0PKMC8U+BNvUsoyr1V3YK9qIyUPKy/ajsiXD+9jUSNPCbQgTx7XSw8sCqkvOCBILsOI0U9rqOUPI7wPT14ybI8OOCHPYoWVr1C79w8ZfthvS9rSTwoGAc8t7kIPvjYhT2ojTg9U854vIMafbyVhSO9B0s4PLDdHz1WLtu8gTd9PfIbgz0RYLQ87TgKvd/jnT0FiiC7TwAlPCLCqT3qJxG6Q1q1O0xkY72jqre8CPRDPSQk57wsljO91GDcOznL5DzR+CO9DsCNvI+bWj1Psc08HxUAPRIdlbxt23i8H0eOvLNDS73rE5o9NI5avGx2frzRIqe8CNvzvPtrJL1tOwu91hR3vbdvAL2zYbk79n0OvIEtBDunGZk8tOWCPHaKzrx/fsG8T3NIPTie07yXZBo9l4GLOsM6l72Juz+8ZswfPWZg/7wNKkS9puQrPWfPKTwpNKw8mMPFvL0A1Lt2z+E89QvbvPon7LyjgFe7pSZ2PHfOJT0moxo9FarnvC11azytl1M8pqlUvbwqZDrxA+K81PwlvVeXhLzH5Aw9GQsaPYxi3bxDBC29aNo8PavAMDwqidc8yw2EuetgRb1WOci8BXkBvchxM73/5jo9Qo6GPMusDbxb7Kc8gINVvWzXRD1+E0W5SY0EPUtQLzxjQ5Q8IjeRO77E5rzNGAM9Z4JmPcO3gD3f94Y8ULx0vQBi9Dy04ta85tRnvIQK27oMTs881nOTvAPTGT3YQnS59bNlvS4hX71+7xq86IwzvTBjrDzgmT89TJFJvE31ATyn2vG8qVIgPEcDkr3pX189/ntFvbHBGr25mAm9Kl8+vL81rbw/8uW7qU4VvXsTObtVFEq9H5jWvOBG/bvMxN68Ncr1vF2ZVDwmC9K8QfjCPFrlDL3uXQY9f0AkPdSR97zvh1U9O66hvcWYcj2htVu9ZbwqPU+cxbuAX9A8oPHOPRSYKb0SGCQ8WCsLPXt6Ubwg8cQ7ukC+PMdjlDyUKli95uhEPMbbVz06TQm9Lf8WPbDnl7smkp48SsjuPA3Rojxg8UA8Q/ZcvJtqC7vGbW+9lTWyvXzfArv85PU8hi9vPOpmDz0szcM8bwQ4PRcL/TwVrXK8S75ROx1gtTy6sqS85rwWPD1/R72N0x47pPnRvMdPL732eAo8Tz8ePbZnqTwKKy07NXjxPKYbRTxIXqA82ryavRbGEzwyTAq90iiOvOVxerzEG1Y8YT7RvNK/Bjzh+YG6+dEuvd6/Dr2DUmC8SwNlvH0RdzwfNEQ8gjL8vKAG7LkPpKm8gvc3vGe6HD1LIuW7Ly1FPLOPKD1Qbxq9Ct3AO100/ryt2n69RUTXvNDvtTw/qyS9acm6PPxjGr0sqLU8CwqKPKbn87p4m1+8ixsNPUc6nr26DYg9ILa8O2yeV7yL+vk8uFzYPIjOt7zf0he9OjrhvBEvdD3mpHA9Ct8kPcBTzbz6KiC9wwvduRhAyrwfLuQ7B6wuvfhvdb1doku9ONOTvGhU8Dxgeti8S06GPeuZgDyFxR49kjBUPAoWirnBqXW8NXqbvC4FCDxyBZY8AW3Ju+L0Cz2tBB+9nvj7POnKSj3tT/I79LhZPfW/a7wSUXc8oJuOvZ016bvBlXe8P72dPFordD3Vvu+7AUoLPZVqDT1KqK+8jbRbPb870Dwqf2Q7GR2iuyMwh7xZNJG9OHVyPdRvKz0lRWi9ViVUPKpM5Lxzt1c803+dvPlMFz
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.test.ts","s":913,"e":970,"m":1777197044697.0403,"t":"idempotencyKey: \"idem_1\",\n payloadJson: \"{\\\"kind\\\":\\\"command\\\"}\",\n argsJson: {\n userId: \"user_1\",\n id: \"asset_1\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n storageId: \"storage_1\",\n },\n });\n vi.mocked(executeRustBridgeMutationTransport).mockResolvedValue({\n ok: true,\n fileUrl: \"https://example.com/file.docx\",\n });\n\n await executeMediaAssetWritebackBridgeCommand({\n client: {\n mutation: vi.fn(),\n } as unknown as ConvexHttpClient,\n context: mockContext,\n envelope: buildDocumentCommandEnvelope({\n name: \"media.assets.replace_storage\",\n payload: {\n assetId: \"asset_1\",\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n storageId: \"storage_1\",\n userId: \"user_1\",\n },\n context: mockContext,\n target: { workspaceId: \"ws_1\", pageId: \"doc_1\" },\n }),\n });\n\n expect(resolveRustBridgeCommandPlan).toHaveBeenCalledWith({\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"media.assets.replace_storage\",\n }),\n });\n expect(recordRustBridgeCommandArtifacts).toHaveBeenCalledWith({\n client: expect.any(Object),\n context: mockContext,\n envelope: expect.objectContaining({\n name: \"media.assets.replace_storage\",\n }),\n plan: expect.objectContaining({\n commandName: \"media.assets.replace_storage\",\n functionName: \"mediaAssets:replaceStorageFromUpload\",\n }),\n result: {\n ok: true,\n fileUrl: \"https://example.com/file.docx\",\n },\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":1,"e":60,"m":1777105111244.5793,"t":"import { randomUUID } from \"crypto\";\nimport type { ConvexHttpClient } from \"convex/browser\";\nimport { HttpError, requireAuthContext } from \"@/lib/auth/authContext\";\nimport { apiErrorResponse } from \"@/lib/api-utils\";\nimport type { PageOptionsState } from \"@/types/page-options\";\n\nexport type BridgeActor = {\n actorType: string;\n actorId: string;\n sessionId: string | null;\n};\n\nexport type BridgeSource = {\n channel: string;\n client: string;\n};\n\nexport type BridgeTarget = {\n workspaceId?: string | null;\n pageId?: string | null;\n blockId?: string | null;\n};\n\nexport type BridgeRequestMeta = {\n idempotencyKey: string | null;\n validateOnly: boolean;\n dryRun: boolean;\n};\n\nexport type BridgeContext = {\n deploymentId: string | null;\n projectId: string | null;\n workspaceId: string | null;\n requestId: string;\n traceId: string;\n actor: BridgeActor;\n source: BridgeSource;\n tenantId: string | null;\n authToken: string | null;\n idempotencyKey: string | null;\n validateOnly: boolean;\n dryRun: boolean;\n};\n\nexport type BridgeErrorCode =\n | \"VALIDATION_ERROR\"\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"TRANSPORT_ERROR\"\n | \"REJECTED\";\n\nexport class DocumentBridgeError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: BridgeErrorCode,\n public readonly details?: unknown,\n ) {\n super(message);","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":49,"e":108,"m":1777105111244.5793,"t":"| \"NOT_FOUND\"\n | \"TRANSPORT_ERROR\"\n | \"REJECTED\";\n\nexport class DocumentBridgeError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: BridgeErrorCode,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = \"DocumentBridgeError\";\n }\n}\n\nexport type CommandEnvelope<T> = {\n name: string;\n commandId: string;\n idempotencyKey: string | null;\n actor: BridgeActor;\n source: BridgeSource;\n target: BridgeTarget | null;\n payload: T;\n preflightData?: Record<string, unknown> | null;\n reason: string | null;\n refs: string[];\n dryRun: boolean;\n validateOnly: boolean;\n};\n\nexport type QueryEnvelope<T> = {\n name: string;\n payload: T;\n};\n\nexport type DocumentBridgeMutationRequest<\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n> = {\n functionName: string;\n deploymentId: string | null;\n projectId: string | null;\n workspaceId: string | null;\n requestId: string;\n traceId: string;\n idempotencyKey: string | null;\n actorId: string;\n payloadJson: string;\n args: TArgs;\n};\n\nexport type DocumentBridgeQueryRequest<\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n> = {\n functionName: string;\n deploymentId: string | null;\n projectId: string | null;\n workspaceId: string | null;\n requestId: string;\n traceId: string;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":97,"e":156,"m":1777105111244.5793,"t":"args: TArgs;\n};\n\nexport type DocumentBridgeQueryRequest<\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n> = {\n functionName: string;\n deploymentId: string | null;\n projectId: string | null;\n workspaceId: string | null;\n requestId: string;\n traceId: string;\n actorId: string;\n payloadJson: string;\n args: TArgs;\n};\n\nconst DOCUMENT_BRIDGE_QUERY_FUNCTIONS = {\n \"documents.content.get\": \"documents:getContent\",\n \"documents.meta.get\": \"documents:getMeta\",\n \"blocks.get\": \"documents:getContent\",\n} as const satisfies Record<string, string>;\n\nconst DOCUMENT_BRIDGE_MUTATION_FUNCTIONS = {\n \"documents.create\": \"documents:createWithParentReference\",\n \"documents.move\": \"documents:move\",\n \"documents.delete\": \"documents:softDelete\",\n \"documents.restore\": \"documents:restore\",\n \"documents.duplicate\": \"documents:duplicateWithMindmaps\",\n \"documents.copy_tree\": \"documents:copyTree\",\n \"documents.template\": \"documents:setTemplate\",\n \"documents.emptyTrashByWorkspace\": \"documents:emptyTrashByWorkspace\",\n \"documents.purge\": \"documents:purge\",\n \"documents.embed\": \"documents:updateContent\",\n \"blocks.patch\": \"documents:updateContent\",\n \"blocks.move\": \"documents:updateContent\",\n \"blocks.embed\": \"documents:updateContent\",\n \"documents.title.update\": \"documents:updateTitle\",\n \"documents.stats.update\": \"documents:updateStats\",\n \"documents.options.update\": \"documents:updateOptions\",\n \"documents.save\": \"documents:updateContent\",\n \"page.head.updateTitle\": \"documents:updateTitle\",\n \"page.layout.updateOptions\": \"documents:updateOptions\",\n \"page.body.save\": \"documents:updateContent\",\n \"mindmaps.delete\": \"mindmaps:softDelete\",\n \"mindmaps.restore\": \"mindmaps:restore\",\n \"mindmaps.purge\": \"mindmaps:purge\",\n \"mindmaps.emptyTrashByWorkspace\": \"mindmaps:emptyTrashByWorkspace\",\n \"media.assets.replace_storage\": \"mediaAssets:replaceStorageFromUpload\",\n} as const satisfies Record<string, string>;\n\nfunction readHeaderValue(headerList: Headers, ...candidates: string[]): string | null {\n for (const candidate of candidates) {\n const value = headerList.get(candidate);\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}","v":"xtoZPePkPryb/ru9BvTnvTuaiT1CpVu9zRwNvcN5mDxvUoc8wtWLvX6WbL0jv0I9bW6yPX6brTuGHhQ91Qj/vMXmLrxtPpW93j8JPdEtPz3Bdpw8ID03veW4Iz3tqja9H9Y4PZfEIj2OgSg8meB/PANWx7xQt5w82kOlPAdbNT1+0ro8ER+tO2WCdL0MTXC9wkaCPPRyHLyweiY8bZQQvXqnXDwGvFi6ozbou7s+I7071EE9qUWuvKMjxT13y708ol1cPVZa4L0Ij8I8SVgoPJ4jPD0/nhi9vmjtPYdjEz2uC8S85nrGu929KTx+zhG5vEgevIN5iT3OCgC9or/EPUXRNz1JHEq9v25HvcgWNz1zaV27MigBPK3IOj2dbRK7UsEYvDnibbvbbR29DnJjPedHArxoCrm8wvI9vZXc+zwmxz+9CSAUvanMAj2ZE8g8RtxKPTEXcLta5KM61fjZOrAtD73S+hk9wxoRPQskxLwjDpQ8ehh8Ow1rAL1Fa6w8brOkPIVe5DyPAUi8ueD+vMBk0jyfI6G8KjzjPAwrtLwp4Lo8JkZMPTiWhjwxgsA6r5yRvNffP7v58rS7Cd2HPQSEoL1lGh29RtKHPKD4Qb3Syug8B0jkO+oaDDyKpzA90dq7vL/137zpHJI8CO1hPX1OIz1JOMk84fy+vEfLBzs/A388fHs5vbEyHr21W1W8nJl7PA65YjxjA4w9RFRlPYrzWL3mY+a8kXjBPNCkwbxLh2e79ZYvu7/VCL3NZAG9vwaPvCSgQb0/s5Q9Zi2TvMQ3C72QAuk8gTY7vOkBSj3jylK4q7c4PR0yCz2V0dm8BaZEPZr93bxTsmW8IgOcu2OpLjxzxYQ7KiOEvXc22jyZq9w6bLP3vJK0Gzz/Ilk8jaNKvFWlvDzil4G9s2RWvdGh0jyxDp487t4DvV5VbruFgSA9QjTQOQq0m7sj4Yq9K1Q5O25MVr3hy2k9WUn3PNjehbxCH++7tMoYPM89Br1D/C89GvRqveZIhjs2NGS9o+nnvCQZMjqELqy8ejyuva48SDsxtOC7KWMbPbcUML34T1G58LNvvIlL7brV9Uc8F4Ajvb4Ii7qplAu9AZQdPWGM+7yWBgY8y7efPanPprv1Rv08oLbvuxsgAL3wlto7KJhFu1bearuSyme9fCe1PL7I6jwlR0+9jKfKPCyWhT2pbgI9P1ogPY9cW7x6Etg7PXX3u75QLb0tQQC9qR+HvRNG/jzBIhw9jjJZvGgVEbw+g6884dKgPVrOgbwVUjc96WGou68dgTx5Fvm8TIUUvbJFTrwB9KS8GtAcO1qSxruknKs7WWEXPabB6bpJ6bE7+I6mPD+2az1HxCU9N0NVvdJOabtMWCa8F4RovCbzGb1b2vw8shkjvDbeCT1WixK9+esJvZmUFr0adzG9o6kkPDXgCDwTxlg9JDqwvCBcCD1I84Y8v3JKPZGWszzmiWk8vY2FPLcTpDrOjkO9uvccvE53Zr0pbzS5zaWhu945ZDzBIyK9kTeLPD4OjrsmSMW8KVgmvASB2Dx9Yla8/kegPDenr7rej1w94EUxvMLq5Dw51fQ8w6myvNlDFr32ohO9j3WVPKZ/UD
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":145,"e":204,"m":1777105111244.5793,"t":"\"media.assets.replace_storage\": \"mediaAssets:replaceStorageFromUpload\",\n} as const satisfies Record<string, string>;\n\nfunction readHeaderValue(headerList: Headers, ...candidates: string[]): string | null {\n for (const candidate of candidates) {\n const value = headerList.get(candidate);\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction toBooleanFlag(raw: string | null): boolean {\n if (!raw) return false;\n return raw === \"1\" || raw.toLowerCase() === \"true\";\n}\n\nfunction makeFallbackId(prefix: string): string {\n return `${prefix}_${randomUUID()}`;\n}\n\nexport async function buildDocumentBridgeContext(input: {\n request: Request;\n workspaceId?: string | null;\n idempotencyKey?: string | null;\n validateOnly?: boolean;\n dryRun?: boolean;\n}): Promise<BridgeContext> {\n let auth;\n try {\n auth = await requireAuthContext();\n } catch (error) {\n if (error instanceof HttpError) {\n throw new DocumentBridgeError(error.message || \"未登录\", error.status, \"UNAUTHORIZED\");\n }\n throw new DocumentBridgeError(\"未登录\", 401, \"UNAUTHORIZED\");\n }\n\n const headerList = input.request.headers;\n const requestId =\n readHeaderValue(headerList, \"x-request-id\", \"x-mnote-request-id\") ?? makeFallbackId(\"req\");\n const traceId =\n readHeaderValue(headerList, \"x-trace-id\", \"x-mnote-trace-id\", \"x-request-id\") ?? makeFallbackId(\"trace\");\n const sessionId = readHeaderValue(headerList, \"x-session-id\", \"x-mnote-session-id\");\n const sourceChannel = readHeaderValue(headerList, \"x-source-channel\") ?? \"next-route\";\n const sourceClient = readHeaderValue(headerList, \"x-source-client\", \"user-agent\") ?? \"wolai-frontend\";\n const deploymentId =\n readHeaderValue(headerList, \"x-deployment-id\") ?? process.env.VERCEL_DEPLOYMENT_ID ?? null;\n const projectId = readHeaderValue(headerList, \"x-project-id\") ?? process.env.VERCEL_PROJECT_ID ?? null;\n const tenantId = readHeaderValue(headerList, \"x-tenant-id\");\n const authToken = readHeaderValue(headerList, \"authorization\");\n const idempotencyKey =\n input.idempotencyKey ?? readHeaderValue(headerList, \"idempotency-key\", \"x-idempotency-key\");\n const validateOnly = input.validateOnly ?? toBooleanFlag(readHeaderValue(headerList, \"x-validate-only\"));\n const dryRun = input.dryRun ?? toBooleanFlag(readHeaderValue(headerList, \"x-dry-run\"));\n\n return {\n deploymentId,\n projectId,","v":"wzmVPXl+YLyv9MC9SwzAvcC6Xj1x4ZW9K17cu76cwTw3qE082Ycevf8VJ70LICs9A0zKPci8ubu9oKI8g10zvHaQ5ztpYqC7XtSBPO/OAz1Xv5g8rakjvbL0zjxBxwG86veiPZFCdj1NGyA9974sPYPsWL1ZdQ49h4h3PbYkeD2gPa88iyHHu8+cib1m92C93TZkPMa4eTwM1G685Q22vP3Ltbws2Vc8G50OvA6jGjurkCQ9S468vM7Dgj163GQ8/lXGPRa9zr1TvxU8BqjsupdH1zs2rKS7fjLVPf2dwDyKupy8c33IOzEkkbyWiZ+80OgJPIXPUT0Gp6y87lOsPeRcqD1tQsK8C5WlvDLnFj1BOg09Fm/bu4R8TT3l+nc9OXosvOqhlDy1FIK9s0KFPBm5Zb3udRG9udyHvUMVLD3TWYS8anOyvKzlcz3ogO071vM1PdR24bxoEkE8SqyNO6O7azzvAIM99RhBPe2+TDvAQiI9OAytvA8DFL0h0Js8G4tSujQQbT32ixu84gy1vKYYHTwLezC8/PnNu7ABt7w6vZq8XFiiPfgSsTxQUNg8bXsxvfP55bshaFy8NPKBPTYAHr0OOQW9mcRNPNnDjL04bFY8q571O3QHx7ycxSQ9YkNpvQp+irwYz5C6iA96OggB6TxUVdG7PfLGvGJAgz2HIqM877HovJHjjb3Cd7S8HKSCuwQhVzww3049MsnZPACgH70Xwne9+Bt6PKjQk7s2QiQ9+ZsGO8qUe712+rG8IbkuvM40vLxspHo9QSo0O7ja8rwr8Kw7vkqUu4JG2DwEg8Y8hrECPK5/Fz0FgFe9rqG0PIzshTw2Zbs8In6MOncB5zy3bR09tZRUvW4DLj3Rq1+6PSDgvK51Iz0T+iQ9O1GAPMBt2TxpuVe9VMZRvXePpbwBMvo8mCKDvP2rorwnX0g9uyiFvH52tDxSxS292/imvAHeTr1c+GQ9ISc4PPjTMrxDYGa79gkOPO2BurzZ51a8gXMVvE6VNL3Gzqi8ic3mvHj5/TyPsY68I8MlvY49vTz0e9a8tdH6PKdX9rxd+F88lCSjuy1pEz2H66o7EZpBvf2/nbxTeh+9ZrSIPGUy9rxWJUk8Vge+PV/wxbx39dI7MAwaO8TXqLutmiu8VnlqvJaKRDy+LEy9pIg7uwrfkDohGUC9y2coPSSsEz12qF89UpMOPHurpjuL3LK785aQvCT4Cbwm4wu98E28ve67JD3SEQM97Nh9vAJVYT3p8VA9Dq6YPWmHHz1wfbk8BaXBvBG3Az2QNDy9lsY5vPw6L7pvYiq88fu8vFzLMb3qj6c8aRsHPPXANzyc+Mc8hTvtPCEyFD23PW098F46vTLuoLvPfk46ytriOs/q1rz2xg08D/ICvAcCNzvjzu68KaHAvP8/Bb1oPMm9kIoCPI+YSTyywRE9FZ84u/a
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":193,"e":252,"m":1777105111244.5793,"t":"readHeaderValue(headerList, \"x-deployment-id\") ?? process.env.VERCEL_DEPLOYMENT_ID ?? null;\n const projectId = readHeaderValue(headerList, \"x-project-id\") ?? process.env.VERCEL_PROJECT_ID ?? null;\n const tenantId = readHeaderValue(headerList, \"x-tenant-id\");\n const authToken = readHeaderValue(headerList, \"authorization\");\n const idempotencyKey =\n input.idempotencyKey ?? readHeaderValue(headerList, \"idempotency-key\", \"x-idempotency-key\");\n const validateOnly = input.validateOnly ?? toBooleanFlag(readHeaderValue(headerList, \"x-validate-only\"));\n const dryRun = input.dryRun ?? toBooleanFlag(readHeaderValue(headerList, \"x-dry-run\"));\n\n return {\n deploymentId,\n projectId,\n workspaceId: input.workspaceId ?? null,\n requestId,\n traceId,\n actor: {\n actorType: \"user\",\n actorId: auth.userId,\n sessionId,\n },\n source: {\n channel: sourceChannel,\n client: sourceClient,\n },\n tenantId,\n authToken,\n idempotencyKey,\n validateOnly,\n dryRun,\n };\n}\n\nexport function buildDocumentBridgeContextWithActor(input: {\n request: Request;\n actor: BridgeActor;\n workspaceId?: string | null;\n idempotencyKey?: string | null;\n validateOnly?: boolean;\n dryRun?: boolean;\n source?: Partial<BridgeSource>;\n authToken?: string | null;\n}): BridgeContext {\n const headerList = input.request.headers;\n const requestId =\n readHeaderValue(headerList, \"x-request-id\", \"x-mnote-request-id\") ?? makeFallbackId(\"req\");\n const traceId =\n readHeaderValue(headerList, \"x-trace-id\", \"x-mnote-trace-id\", \"x-request-id\") ?? makeFallbackId(\"trace\");\n const sourceChannel = input.source?.channel?.trim() || readHeaderValue(headerList, \"x-source-channel\") || \"next-route\";\n const sourceClient =\n input.source?.client?.trim() ||\n readHeaderValue(headerList, \"x-source-client\", \"user-agent\") ||\n \"wolai-frontend\";\n const deploymentId =\n readHeaderValue(headerList, \"x-deployment-id\") ?? process.env.VERCEL_DEPLOYMENT_ID ?? null;\n const projectId = readHeaderValue(headerList, \"x-project-id\") ?? process.env.VERCEL_PROJECT_ID ?? null;\n const tenantId = readHeaderValue(headerList, \"x-tenant-id\");\n const authToken = input.authToken ?? readHeaderValue(headerList, \"authorization\");\n const idempotencyKey =\n input.idempotencyKey ?? readHeaderValue(headerList, \"idempotency-key\", \"x-idempotency-key\");\n const validateOnly = input.validateOnly ?? toBooleanFlag(readHeaderValue(headerList, \"x-validate-only\"));","v":"I1EmPBF80zx2WfK9VmCovfCLjj0HmIa9IKmFvEDXC7wli0U9849bvTaIbr2dCbI9dq/JPREH0ry0HYW4ofo+vTApXTzXgry80ZyZPIz8JjynGwo8P8JlvVg5+zxsOl29hsKhPeKA2DuT+RA9Vvi7PNogZr0yXJA8SRB6PQOpYz3a7Cs9XJYMPCnSub03sOq82G20vJPdsDvlJbC6sONhO6nQ9bxkT/W7NVjFvGhSAr0cjW88BJpavV/8kj0vY009AxdGPUtFib0++fA7yNCwvMbMxLwbGvG8WUahPSGxDD0MpSO9qm7TuwHDirzLhHS9jCEnPVJmBD1ICt489clmPWAujz2Ubz69VZYYvYJnVz1OQaA8xcBDPTy+Bz3htt48+YuDO7eb8by+j3i8/XqDPOFuf7ylzZq9lpYNvZQ4/jz8VkU8Db2vvMdtdD3nykG8w/Y4PRISjrzOZVM8YtS6vIqWA71F3RE973KNPaWAsjtdRMq8ZT2aPCE5g70xnu07CQT2vK5KFz067Tw91nmCvFrVQzyFCfq7KuQyvYUJoryjANW8MAmcPRHURbxwn508V87JO1oLnrudiji9FOb/PE1lZr00pAS9tSYDPXUdi71bSQY99KarvK7YcLtkxSs9U8NivY5hNL2s4Ao9rfT9O6Sc4jyw+BE93kXrvNuOErsllRK9F7cRve9dpzvVGau8piWnvI7DJTpmNR49Qg1xPE4w0byLlZK9V2Xlu3YHNDthTt88HAm9PBh+DL2naxO9npuROz6RCrv/gZE9FOaqvCuUrLtuTJ46+tHmOr5NYT1kaVE8acvrPGmb+jy+S1C9ZqZhuyssqLy/Txy98AaBPK/xgzwajcs8KdMSvXoQ9Tzwyau7xfx/vdKPm7zxoFU8MO+OPIYJDz2b8Om8cS5PvUb8p7zI9E28bLiPvLE7dDyz+Qs9nuXkvHbkWj0F+Lq8Psm9PGPl1b3F6iQ9ybydPH4py7z8Zs+8fK20PPO2Db2H4ky8GmdavT0NazzSzde8WTRCvElJDjwYS3S9pz9vvcF5Wzy73B29GX5MPasTGb3nXYk8EdmcPGWGxzyNP4g9a+2BvVirXzzpF9W8w9UYPXtYBr1CmS+810GqPQ94ury45HW81XxjPMA9ArxH0AC9YBkcPOcqPb3hsYK92yjKO22hyDzh3Uu9ApIFPW1/izzmslw9G8UsPXDB77yUD5w72HU/PEoWE70HVCC9lEuMvYfdhzz9/Ag9wU48vLGPazzxbRw9X4bNPbO1rrwSO+w8RlB4vMzjFDstJdi7w2/xu1dbkLz3qFe81LstvBZFHL10Ppw7a3KVuadUx7u+pTg9WZKYPInHTzyzCEM9ufEQvS/RxDzuRrY8QUAGu+uoO70Cufq7FvGDuqHQL
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":241,"e":300,"m":1777105111244.5793,"t":"const sourceClient =\n input.source?.client?.trim() ||\n readHeaderValue(headerList, \"x-source-client\", \"user-agent\") ||\n \"wolai-frontend\";\n const deploymentId =\n readHeaderValue(headerList, \"x-deployment-id\") ?? process.env.VERCEL_DEPLOYMENT_ID ?? null;\n const projectId = readHeaderValue(headerList, \"x-project-id\") ?? process.env.VERCEL_PROJECT_ID ?? null;\n const tenantId = readHeaderValue(headerList, \"x-tenant-id\");\n const authToken = input.authToken ?? readHeaderValue(headerList, \"authorization\");\n const idempotencyKey =\n input.idempotencyKey ?? readHeaderValue(headerList, \"idempotency-key\", \"x-idempotency-key\");\n const validateOnly = input.validateOnly ?? toBooleanFlag(readHeaderValue(headerList, \"x-validate-only\"));\n const dryRun = input.dryRun ?? toBooleanFlag(readHeaderValue(headerList, \"x-dry-run\"));\n\n return {\n deploymentId,\n projectId,\n workspaceId: input.workspaceId ?? null,\n requestId,\n traceId,\n actor: input.actor,\n source: {\n channel: sourceChannel,\n client: sourceClient,\n },\n tenantId,\n authToken,\n idempotencyKey,\n validateOnly,\n dryRun,\n };\n}\n\nexport function buildDocumentCommandEnvelope<T>(input: {\n name: string;\n payload: T;\n context: BridgeContext;\n target?: BridgeTarget | null;\n preflightData?: Record<string, unknown> | null;\n reason?: string | null;\n refs?: string[];\n}): CommandEnvelope<T> {\n return {\n name: input.name,\n commandId: makeFallbackId(\"cmd\"),\n idempotencyKey: input.context.idempotencyKey,\n actor: input.context.actor,\n source: input.context.source,\n target: input.target ?? null,\n payload: input.payload,\n preflightData: input.preflightData ?? null,\n reason: input.reason ?? null,\n refs: input.refs ?? [],\n dryRun: input.context.dryRun,\n validateOnly: input.context.validateOnly,\n };\n}\n\nexport function buildDocumentQueryEnvelope<T>(input: { name: string; payload: T }): QueryEnvelope<T> {\n return {","v":"aK15PGQ24Dy85+W91GHivRZcYD3tQ4e9GheyO7IaAL2wcwI9keVNvfXWj71sglU97tDEPWMaTbwsGg490l0/vXxVvjydEFS9zdWaPBhw9zx8gJE8d42Lve5KVT3zb429c5pUPSQirzxOFeE8X3qqPPIie71jEb88n1gSPXKrHz3CRtA7tumGvBHWrb35sJw79mCfPA0bRDxyG1e8a1FTu4QdLL1K9HK7QDC0vHtIDTw41jA96QL5vFyJVz1X1u48Ak4GPfVVwb1W16w7K/+svGQAJ71CtLu8xcLTPeeS5jzlZ8G82PShuytiAjx9w1m94tKJPBk6Zj0BMn674MaoPSv3Qj3YfI69TGtCvXsZgz04pEc8fBlKPYTHyjxuUnU8kUTHvG4I2LwrAtC8Z1rTPCi9UbxrXmO9frXmvHAJHjhcuou8SYUhveHMDz1X+Va89L6xPP83C72bkxk8lT0SvTeHXL2+JBU9ZLeDPWommbxvHrY7wEWAPJTIib0kfcS7GtW2vCPCjjwAeVA9qYY+vU9jPz1gMgs62VmkvFYSnbxpI3+8dxqOPTlGjzp5bpe7Gzzau62WvLu2JQ+96ecTPVFYZL1jObe8EyMHPWl1tb2Q3SQ9BCkyvHIM5bsDeiw9Ys9Dva76Qr0tiqO6FoFDPADoYz3BYRs92stZvJTigDw/X0O8diGFvUhi77z33zu9/RyovBlTHrxL9jA90koDPRS/Xr26BEy9+kgEPfawc7tBcqs8uyo3PLNtFb0gVTK9A5D9u6T2wLxdkoo99AHxu1+DkDt0hYk7Ab+yO4fVfD21s4Y8fdldPXxdHj3qUEu9pwfAuzK52LyUClS9M/nMuyGxxzwnDs07RowJvaOSeTyYgNW7BtLivAvQCDytedE8AsGHvCuWKT2MTnG9mVWBvQ+mt7xYjdy7oJq5vPTT5Trw7ro8wZETvQH0DD2Z6AG9NKqLPP7Frb3rErc8ROiTPBobTjsPOC28RxR3PJ664bxzoIs7/bNbvcOQGTwQ07C8mgD3vPIBJjyyGIK9qKCJvefN0Dyx79e8lw5JPYmnK7zuIXQ8lNAXPNTX0DuQVS49ftqovXVP5bv3M+E69wWiPA3DDb0Ky4m8odOiPYpPGr0Vz+E8oRuMPDzS2LrJ9aC8o+u3vGiny7wPSlC9XkztPI9eFz3qxEi9N1E4PUGITjykrmU9AHz8PN9qBr0jFpc8dvplvO6DjLzA1gG9g8SJvWNFATyCZ1A9Acf1u0gqT7x0+gI9uxDAPbrRFL2Xhxw93Z2HvHPBi7y1t5+5Ec1Yuh354LzSorC8N0lCOykyDb1Z7jk8u1HHuwODKr1fF1g9ttJ/PMou/DzIVqs8mL41vQiSdDsN7gQ8iza2PLrA/bzBHEG65rJ0POkJ/Dz6Z128liaSvMYQv7yd3PQ65dURvOPV7Tt5Q7o8WhuJvG9qjDzOvyq8RshPPS/FjTy3s708xTJ/PDb0ObuIWqW8+u22PEDhVL1pfpi8mDYXve8DZztqZPe8Y4XBO5zWjDuxsvO7U/1gvEjIpjx4G009S4kpPXm697zSh4g9vQIrvNeDCrzqfjw94a/6vF+i0bvwETq9zE05PL7COD3FMp89r56WPaIRSzzZuEO7SLptO+5oIrwkqxM9yXnLPMP/Br0MEAs86xE2OijZez21Szu8M5K3PGBBtDwzNca8CvyuPOuzjTvjHQi9U6tUvYMsHT0rDds7WO5/vKzTRz04tkW9lVUGvPDxTzzNWP+8Kt6WPCZsdrtLRyA92Q4NvSKMWL2xzBq8OD+fvABh1zrZZQ08kWAYPaykEDxncnq85voFPW0bxbyYOJa8jCzAPMlylbwUge68ertkPUeGmDylcnO9wAWfPF5HyLy7JwE8yYH/O4W4pjznRgY9iyWyPPpieLxzrWQ7HsPPPJ1AyrzlprQ7isz
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":289,"e":348,"m":1777105111244.5793,"t":"target: input.target ?? null,\n payload: input.payload,\n preflightData: input.preflightData ?? null,\n reason: input.reason ?? null,\n refs: input.refs ?? [],\n dryRun: input.context.dryRun,\n validateOnly: input.context.validateOnly,\n };\n}\n\nexport function buildDocumentQueryEnvelope<T>(input: { name: string; payload: T }): QueryEnvelope<T> {\n return {\n name: input.name,\n payload: input.payload,\n };\n}\n\nfunction getDocumentBridgeMutationFunctionName(commandName: string): string {\n const functionName =\n DOCUMENT_BRIDGE_MUTATION_FUNCTIONS[\n commandName as keyof typeof DOCUMENT_BRIDGE_MUTATION_FUNCTIONS\n ];\n if (!functionName) {\n throw new DocumentBridgeError(\n `未注册文档 bridge mutation: ${commandName}`,\n 500,\n \"TRANSPORT_ERROR\",\n );\n }\n return functionName;\n}\n\nfunction buildDocumentCommandPayloadJson(input: {\n context: BridgeContext;\n commandName: string;\n workspaceId: string | null;\n idempotencyKey: string | null;\n}): string {\n return JSON.stringify({\n kind: \"command\",\n name: input.commandName,\n request_id: input.context.requestId,\n trace_id: input.context.traceId,\n deployment_id: input.context.deploymentId,\n project_id: input.context.projectId,\n workspace_id: input.workspaceId,\n tenant_id: input.context.tenantId,\n idempotency_key: input.idempotencyKey,\n actor: {\n type: input.context.actor.actorType,\n id: input.context.actor.actorId,\n session_id: input.context.actor.sessionId,\n },\n source: {\n channel: input.context.source.channel,\n client: input.context.source.client,\n },\n });\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":337,"e":396,"m":1777105111244.5793,"t":"actor: {\n type: input.context.actor.actorType,\n id: input.context.actor.actorId,\n session_id: input.context.actor.sessionId,\n },\n source: {\n channel: input.context.source.channel,\n client: input.context.source.client,\n },\n });\n}\n\nfunction buildDocumentQueryPayloadJson(input: {\n context: BridgeContext;\n queryName: string;\n workspaceId: string | null;\n}): string {\n return JSON.stringify({\n kind: \"query\",\n name: input.queryName,\n request_id: input.context.requestId,\n trace_id: input.context.traceId,\n deployment_id: input.context.deploymentId,\n project_id: input.context.projectId,\n workspace_id: input.workspaceId,\n tenant_id: input.context.tenantId,\n actor_id: input.context.actor.actorId,\n source: {\n channel: input.context.source.channel,\n client: input.context.source.client,\n },\n });\n}\n\nexport function buildDocumentBridgeMutationRequest<\n TPayload,\n TArgs extends Record<string, unknown>,\n>(input: {\n context: BridgeContext;\n envelope: CommandEnvelope<TPayload>;\n mapConvexArgs: (payload: TPayload) => TArgs;\n}): DocumentBridgeMutationRequest<TArgs> {\n const workspaceId = input.envelope.target?.workspaceId ?? input.context.workspaceId ?? null;\n const idempotencyKey = input.envelope.idempotencyKey ?? input.context.idempotencyKey;\n\n return {\n functionName: getDocumentBridgeMutationFunctionName(input.envelope.name),\n deploymentId: input.context.deploymentId,\n projectId: input.context.projectId,\n workspaceId,\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n idempotencyKey,\n actorId: input.context.actor.actorId,\n payloadJson: buildDocumentCommandPayloadJson({\n context: input.context,\n commandName: input.envelope.name,\n workspaceId,\n idempotencyKey,\n }),","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":385,"e":444,"m":1777105111244.5793,"t":"projectId: input.context.projectId,\n workspaceId,\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n idempotencyKey,\n actorId: input.context.actor.actorId,\n payloadJson: buildDocumentCommandPayloadJson({\n context: input.context,\n commandName: input.envelope.name,\n workspaceId,\n idempotencyKey,\n }),\n args: input.mapConvexArgs(input.envelope.payload),\n };\n}\n\nfunction getDocumentBridgeQueryFunctionName(queryName: string): string {\n const functionName =\n DOCUMENT_BRIDGE_QUERY_FUNCTIONS[\n queryName as keyof typeof DOCUMENT_BRIDGE_QUERY_FUNCTIONS\n ];\n if (!functionName) {\n throw new DocumentBridgeError(\n `未注册文档 bridge query: ${queryName}`,\n 500,\n \"TRANSPORT_ERROR\",\n );\n }\n return functionName;\n}\n\nexport function buildDocumentBridgeQueryRequest<\n TPayload,\n TArgs extends Record<string, unknown>,\n>(input: {\n context: BridgeContext;\n envelope: QueryEnvelope<TPayload>;\n mapConvexArgs: (payload: TPayload) => TArgs;\n}): DocumentBridgeQueryRequest<TArgs> {\n const workspaceId = input.context.workspaceId ?? null;\n return {\n functionName: getDocumentBridgeQueryFunctionName(input.envelope.name),\n deploymentId: input.context.deploymentId,\n projectId: input.context.projectId,\n workspaceId,\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n actorId: input.context.actor.actorId,\n payloadJson: buildDocumentQueryPayloadJson({\n context: input.context,\n queryName: input.envelope.name,\n workspaceId,\n }),\n args: input.mapConvexArgs(input.envelope.payload),\n };\n}\n\nexport async function executeDocumentBridgeMutationRequest<\n TArgs extends Record<string, unknown>,\n TResult,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":433,"e":492,"m":1777105111244.5793,"t":"payloadJson: buildDocumentQueryPayloadJson({\n context: input.context,\n queryName: input.envelope.name,\n workspaceId,\n }),\n args: input.mapConvexArgs(input.envelope.payload),\n };\n}\n\nexport async function executeDocumentBridgeMutationRequest<\n TArgs extends Record<string, unknown>,\n TResult,\n>(input: {\n client: ConvexHttpClient;\n mutation: unknown;\n request: DocumentBridgeMutationRequest<TArgs>;\n}): Promise<TResult> {\n const mutate = input.client.mutation.bind(input.client) as (\n mutation: unknown,\n args: TArgs,\n ) => Promise<TResult>;\n return mutate(input.mutation, input.request.args);\n}\n\nexport function assertDocumentId(documentId: string | null | undefined): string {\n const normalized = typeof documentId === \"string\" ? documentId.trim() : \"\";\n if (!normalized) {\n throw new DocumentBridgeError(\"缺少 documentId\", 400, \"VALIDATION_ERROR\", [\n { field: \"documentId\", reason: \"required\" },\n ]);\n }\n return normalized;\n}\n\nexport function assertTitle(title: string | null | undefined): string {\n if (typeof title !== \"string\") {\n throw new DocumentBridgeError(\"缺少 title\", 400, \"VALIDATION_ERROR\", [\n { field: \"title\", reason: \"required\" },\n ]);\n }\n const normalized = title.trim() || \"无标题\";\n return normalized;\n}\n\nexport function assertBlockId(blockId: string | null | undefined): string {\n const normalized = typeof blockId === \"string\" ? blockId.trim() : \"\";\n if (!normalized) {\n throw new DocumentBridgeError(\"缺少 blockId\", 400, \"VALIDATION_ERROR\", [\n { field: \"blockId\", reason: \"required\" },\n ]);\n }\n return normalized;\n}\n\nexport function assertNextBlock(nextBlock: unknown): asserts nextBlock is Record<string, unknown> {\n if (!nextBlock || typeof nextBlock !== \"object\" || Array.isArray(nextBlock)) {\n throw new DocumentBridgeError(\"缺少 nextBlock\", 400, \"VALIDATION_ERROR\", [\n { field: \"nextBlock\", reason: \"required object\" },\n ]);\n }","v":"hG0fPWZNATz0Itu9Yj/Ivcvjnj2jOQ29iPvRutjbhbxrnQw9QZaGvQcmgb3ioyQ9gbTvPfuFvjqAMAo94r5pvckTWDzBX4O9tjJTPErUyTzCGQY9c2pXvKOfTT1qXZ+84I+cPU8j2ju7Pbs8Ekm0PI+HQL2rGB49YCxLPHwfIz3EYyk8ZtT+vJ4Udb3QKpS8hYLtuZFK3rx20Qc7BSfQu3jq4Lu0eM08c6kwOoUY6zwh4yM93bfdu5ywlz1Cimg9/qU+PQEa8L2HvK08VvubvOAdOT0w8QG9FsPlPXZPrDxjyY06IpyiPPfFaDtA1Xu7C6BvPB/Ttz17WJ27kfNyPbEBXT24N6+8U54BvTramz1wi0q87OOqOzczIT1ledM7fl85POD5MTy2Uvi8I0AfPZgFKzpva4i93n2FvEXvYz3x6zS9ktdgOwXxAT1ABNY7K+WBPedFdr3vcas7AtukvEnisbwUsU49i+KSPIeK7bybS4A820DyvNffVr3xP6g84yMxvTxWFz3r7gG8POOrvMfc3TwkoZ+5iJFzPEC3R7xSHEi9PVSBPeNcFz0ZBxY7TLiSvFhxA70wO/+6TeqmPfzRn72Y4S28Z1fGPL2ijLyUhQw92BAZvPnbRbt83fg8MZtZvCWOdLz5zDy6SPIBu9+3Qj1fnhE9BbDEO7sKaTxykxU9pLeuvaRpFL1sDfu8dZwKPCaiBTsaai89pYgYPTswEr1+ke28Lc6fPPZjCbyNeuG7lx9cOxbaE7xyvxK9buL4vO/2lbqWt549rmjSvL7zyrx5wWA8j1M1vPllnzy2+ZM7Ly26PJHUJD1Caha9+cjNPIu4a7yP6wm9083mOpc3NT3E4RI9S0SLvXqg5Dx3b2q9MHyvu0raBTwqOz89pL21vGloxTuoyXG9YvwgvcnkljxVUEg8EXKvvFnIFT2ygBI952YgvW2RV7rpRia9zmt0OyKQmb0vrwk9HT+tO4CiAb3ATEE8xbgiPLuODL3RWQ+7cLodvfub3LunY0a8U5DpvLeHRjwSTg69oWx/vV1CajwNVP+8sJgyPWAGzLzdP6I60dKCPJ0VYTyu/Za8j8OJvZAIxzwjfHu8d9oLPTY+rbzPg3S7feu8PT9HD72JWvY7VwVnugfBT7wcUV88IEehOp4ocDxsyHm9TS2Ouk9zLT1zChm9e/ZQPSnbTz3Lvew8LjObPNE1Hb2Ygwg9uzZDvGu/Ar3nLVO8DiamveuvmzyEERY7EWC3vI+ejzyliho9VheYPQcTyDxaFOQ8fkf4vEJiKj0WGoQ7Q2f+Ozx57Lw/9FC8G/W5vIyBIL19Nh28XoPePMI9Ab2fwjw9GpIIvDI4NT0lncM8FABQvYwcVbtVSw088NMPvEN4Er2y/Rw8e4mKvP3fNjxrVxe9ULAAvdsLv7xcVx6942DhPMk/dbwLdh89bQanvJ13zjw6A5i834sfPXJvCz1YZXw7zeYNvI+71zs7jre8gn1nuw5zoryjKOC5yNgYvYdNors7PQm9mlQYPcHTJDoCOhE7KGnevENZ0DrVDwm8ctUxPSZ0/7yVqvY8qFXXvLaaLj3gaw49nUi8vDJyLL2SFH+9SnCNPE/tLj2Irz89z+JBPb7E1bote0g6dXMrO93mZr0+bbs79Ch6PEnnD7216587oKYGvYrXRj1McXS9qbVfPZHvOD0nTJM8+K+1PNi5mDuslx69lhl3vU4dXz3hxiO8W54LvQvZaD3PYou8Kkpyuzv3KLzJTRi9Xz1JPb/wlDsX9P08yO54vZypTb3PMIO7SnjNvLgpVjwR/cE7uZLEPBM4ST0c4uq8fsbiPIe4SLw6dOG7oQQ7PcYSjLwmfyC9rqI1PVtoojyM+jq9q00APFjsLby5f868rOqUO4OSqDw81eC63SgsPGHBhrxarjA8UnC2Ow39Cr
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":481,"e":540,"m":1777105111244.5793,"t":"{ field: \"blockId\", reason: \"required\" },\n ]);\n }\n return normalized;\n}\n\nexport function assertNextBlock(nextBlock: unknown): asserts nextBlock is Record<string, unknown> {\n if (!nextBlock || typeof nextBlock !== \"object\" || Array.isArray(nextBlock)) {\n throw new DocumentBridgeError(\"缺少 nextBlock\", 400, \"VALIDATION_ERROR\", [\n { field: \"nextBlock\", reason: \"required object\" },\n ]);\n }\n}\n\nexport function assertStats(stats: unknown): asserts stats is {\n wordCount: number;\n characterCount: number;\n blockCount: number;\n todoTotal: number;\n todoDone: number;\n} {\n if (!stats || typeof stats !== \"object\") {\n throw new DocumentBridgeError(\"缺少 stats\", 400, \"VALIDATION_ERROR\", [\n { field: \"stats\", reason: \"required\" },\n ]);\n }\n const record = stats as Record<string, unknown>;\n const fields = [\"wordCount\", \"characterCount\", \"blockCount\", \"todoTotal\", \"todoDone\"] as const;\n for (const field of fields) {\n if (typeof record[field] !== \"number\" || !Number.isFinite(record[field] as number)) {\n throw new DocumentBridgeError(\"stats 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"must be finite number\" },\n ]);\n }\n }\n}\n\nconst PAGE_FONT_VALUES = new Set<PageOptionsState[\"pageFont\"]>([\"default\", \"song\", \"kai\"]);\nconst PAGE_LAYOUT_DENSITY_VALUES = new Set<PageOptionsState[\"layoutDensity\"]>([\"compact\", \"normal\", \"spacious\"]);\nconst PAGE_OPTION_BOOLEAN_FIELDS = [\n \"wideLayout\",\n \"smallText\",\n \"showHeadingNumbers\",\n \"showToc\",\n \"showStructure\",\n \"protectEditing\",\n \"showWordCount\",\n \"collapseBacklinks\",\n \"hideChildPages\",\n \"showBlockRefCount\",\n] as const satisfies readonly (keyof PageOptionsState)[];\nconst PAGE_OPTION_ALLOWED_FIELDS = new Set<keyof PageOptionsState>([\n ...PAGE_OPTION_BOOLEAN_FIELDS,\n \"pageFont\",\n \"layoutDensity\",\n \"embedDefaultBlockId\",\n]);\n\nexport function assertOptionsPatch(\n options: unknown,","v":"hAsSPYPe8jwNWwm+ChqIvZomkz3ixLq8a2E5O6QFRjyANvE8QpkhvRp/iL1PCI08nOCtPXLer7y75I48GgkNOxgUHrz3tOK9bvERPYJwXD10uRY96e21PH/09jylzlA7k3GOPdK/BbzFrU+8NUVbOr0f2LxtWoo8/27rO6IR8jxPKcE8TrRwvCjxlL0+Bxa9iua0vKhjoLsSGno8AT8Nvcwe+bjsFQU9w++6Opc8nzxf1B89GQSUPMAvnD00zX494ckcPek2mb2YD0E8AF4rvIE4Aj04lp47sTWpPVRBIT2B7cK8xLarvDSTjzxOeTe9xGOZPNVbTD30jQS92z4pPdqoFj0dDjK8ZLaavKgjMD0z87K8O6r+unF7HDzYxJU7vDHDOzr0ubwuTka9D2Y0PWjUjDy0X0S9QoBTvGl6RD104+q8VvT4Oliskz0vR1E8Wv1nPRn0xbyB4f086TXCu7UX8Tyf7mA9Azt1vL1p07xcmjk9GvTjvN3xGb1Nago9RREKvUO3AT1sh7O8AlbAvIOCgz2y3s+8l1EbvDbbxbwdpNu8K54qPY1bGz3tlaE8Z2V5upJlcby0Zuu7uMq8PW4fn738YK68Px20PDFuI72/0A49Kvo/vWWR2DzX0vo8Vi80vQ4DvLxQtnw8Xvizu6VkSrt45lo8UdkxvGJZvzxJNfM7jdOdvVm5Er3Oi7u81MTCPEZK4TxChIg79xNfPRg9IL3Biry5Ma5UvK0bEbuFe188bPiQPB0KjbxXoxy9i4vFvNxjrbpmkbs9h8OOvXuSm7suSQg9zQ+lu3EnYTxQ5gw8vh5IPbQHFT0V+BK9jCfrPLQ7p7tAtEQ8mnj9vEMDVT3OR7Q8gGlXvWlKFD1iV4e8w8ALvTe9yzxqwRk92OzqvGZJZjzHj1+9PJP4vIDD2zypMPA7I0MPvWiuJry2qb48ogRYvKh6l7yBUA+9Q0k/OzYtRL3/g5c9ppbBPDtvj7yccqS87/CtPNVEzLvWZhK8QHfOvCWS97z3lDC7zuCCvcaYgzykQ368UNorvftxPDxpzYG8IzrKPHNOUL1CJiS8nfQHO2h6JbxzMU28q3ZKvQXH9TpMcCe92MubPdSZ9LsiA6S8CbZiPfu/i70r2pS6Ym7iPMhqFbu0EEU8FiBoPEGpobx+PGG9Gi2fOQySlDwEQCa9YZqYPZyOVj3blQU9WXTCPOnUHb1kaYQ9brnRO5NyEbzmTJS88tavvXQhcj0AfT66Ij6xuolFPDzVSHu5U0wfPWYoND3MXVc9MEcGvbqE3zzOfOk7b66PvNOgLL1/AcO8kiiuvOoUe71NsO48iu5TPUE4AbyWSyw9g+cHPTjmVz1j2A47mODCvCUH6boOoq27Kw9oOxNQ2bzNcHo8OQMXvQEUHz3KO7281VgCvKO3Kb3cVDO9dY/7POj1CL3VS7s8fOcRPbJp1DxpKaC7/KB4PUwpDT1Xaow87LSZvI7t9jvWi3m8c2vuu1HzqbwnEB69EbwAvaGh+jymojq9j2wHPSpGHjzxkcS7KCCWvIU0NT1wUa28IBaUPYzMfLrHRvk8S80svTMAoTxjJw09JUaUvbZB87zvmtG8vZqaPIdxkzxHxC89kxfWPLGV1rxOZd+8H2PUux7UIr2pSC48yCvau59Eurwvt0K6509HvV08pDy3KQy9ZTnwu5rw9DwTPRE8C4bcPD7y3bxGlsG8HsOfvbM3AD34ZEa8BwjEu3nChz0kEzS9CrTHO5jsQ7yEToe92BmkPcuunzyw4E+81S57vcYonL31BAi5MTddvOZNeDzwHR486gvQO30tOD3Y+ZW8K5I6PAiJqrzFZW68aJNjPMU+drwKh++8TXsYPTQvnrqxNBC9WbxYvCn52TtAdwK84lBcu82m4Dw2MZ48S7xVPDkL1TxBmNY7yABdPCsQvrpgEKA8Y
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":529,"e":588,"m":1777105111244.5793,"t":"\"hideChildPages\",\n \"showBlockRefCount\",\n] as const satisfies readonly (keyof PageOptionsState)[];\nconst PAGE_OPTION_ALLOWED_FIELDS = new Set<keyof PageOptionsState>([\n ...PAGE_OPTION_BOOLEAN_FIELDS,\n \"pageFont\",\n \"layoutDensity\",\n \"embedDefaultBlockId\",\n]);\n\nexport function assertOptionsPatch(\n options: unknown,\n): asserts options is Partial<Pick<PageOptionsState, keyof PageOptionsState>> {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new DocumentBridgeError(\"缺少 options\", 400, \"VALIDATION_ERROR\", [\n { field: \"options\", reason: \"required object\" },\n ]);\n }\n\n const record = options as Record<string, unknown>;\n const entries = Object.entries(record);\n if (entries.length === 0) {\n throw new DocumentBridgeError(\"缺少 options\", 400, \"VALIDATION_ERROR\", [\n { field: \"options\", reason: \"must not be empty\" },\n ]);\n }\n\n for (const [field, value] of entries) {\n if (!PAGE_OPTION_ALLOWED_FIELDS.has(field as keyof PageOptionsState)) {\n throw new DocumentBridgeError(\"options 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"unexpected field\" },\n ]);\n }\n\n if ((PAGE_OPTION_BOOLEAN_FIELDS as readonly string[]).includes(field)) {\n if (typeof value !== \"boolean\") {\n throw new DocumentBridgeError(\"options 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"must be boolean\" },\n ]);\n }\n continue;\n }\n\n if (field === \"pageFont\") {\n if (typeof value !== \"string\" || !PAGE_FONT_VALUES.has(value as PageOptionsState[\"pageFont\"])) {\n throw new DocumentBridgeError(\"options 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"must be one of default/song/kai\" },\n ]);\n }\n continue;\n }\n\n if (field === \"layoutDensity\") {\n if (\n typeof value !== \"string\" ||\n !PAGE_LAYOUT_DENSITY_VALUES.has(value as PageOptionsState[\"layoutDensity\"])\n ) {\n throw new DocumentBridgeError(\"options 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"must be one of compact/normal/spacious\" },\n ]);","v":"c5SrPLDYNjwPNPq9BvbAvU1NsT05e4O942YfvVOM1Tt2LZ08DhC2vP7Vpb3xj/Q8l6qBPSiYQrzWhio9KJfpu9qdjLvH94a9dxUOPWoN0Tt4Cwo9504jPe3yjLxRrpA79vJuPXBsvDw/MJW6xv6yPGmLT70su0Q8hG+4OjnNxDwK+yk9VgtwvJtD7r0p+Wm9cK96vOWWQ73c1sw5ilO2vMEQDbyiqhI9zgNOO5km7rsJ/kE9tYnnvJgPfz07E3w9xDWDPYB7x72fymG88CpYvIpfYz1zBsm8TfjuPXUckj2Y+wy9KAqIusq9kjxbshC9owe6PInoST2jXyC912g7PeHvNj04ZJs6WOb2vNLokD1T7oy7+r6hvBYOmTyGbrs8p7OQvLeiQL2Q1C69ssMhPTw3HjuvMBi9KVzbui5PgT3EhP28mbkPvftygD2S1ho9REw9Pc++GL2XD8I8F3RxOlE52bujpxk93A+EvLTjE70+c5c8HCnPvOaqNr0d8Rc9lAOMvP/h5zy4EQC9ZPgvu6alqzz1+6W8q/ITvTbGx7zS9hy9F8nrPD6ONz0/+dO6byIVvRWFoLxu2Yo83d7SPfQcZL2R+eW8NaGPPNnHn7yXJkw9+XgqvQxd9DxfZhi8HXmAvceScbwJuuw83TRiPOO2BDzPNro8vnviOxaC6jzhS4Q8DOhrvYwPJr3Afbg7afoCPLWahzxy98o8vZAmPdvDwryp/pm7tCXnuyE9sbrEFAy64CJOPAhe5byFrha99kcGu6eCxrw5r4A9UENBvQg74bxIzSU9PAMsuuw1QLrWS1A8OFEmPSalMzwXcQO9iL0JPYDlCL1td3k8S8eXu/JIOD2BgD09jJGYvdp04zzG6TK9UJyHvPI1vTwEGxQ9Yy6bvGC2gbzr0Ji9Ag32vBFrhzwscjw8ir1sux0FETzGN009ccravO63GztH17u8E6mlvNl0Ur1oTX498AtIPeXtCbwkvzq8ubDSu9qvgryfqAo8KYSrvGDsaLwLo568vdJOva9FIj3EjM46UE6ZvbCfyLyVRDS8zvyJPCaBUL3J6NK8tnkHvK2aTzy3JKi8DF+HveGOAT3ip/e8jcmCPUeJh7zE7co7S8m4PXQqSL0s0xM8aS87PanHrLwCNws6w4dhPDS8p7y5bEC9atamOHQFBj0Xzfe8KCmIPcsYDT20OkA6xbFJPFN2Pr0c1T49pPg5PO8JeLxsDwm9erGnvU8jZD35W5W87qibvOmEWTyVNn67WsCUPS0wvDyLVks9sjKjvAQYmDwflQ482ZChvCCckbx50xi8+WaavED78LzKSu48i+pFPe/mULwCbbw8nXiKPHAzcj1n/0g8UT9uvLQXwTpqI+A8OvCNOyeUxbxepQI8Rb3Bu1RTyDxmVau82KmZvPNjgLym+ja9YaUQPfPKq7yV5+Y8pqSoPCqS3jzBq0O8jLYaPQFN1jwxdtM8HibAvBYpBL1gVd86r/isvBG1rbxgdMu8nyE5vFUBJz2gAIK9Jn6zPIOadLzO9qw6hEnzPDRZpDzVrKm82mOfPdMAg7srVBI9RGQwvURBtDwf9nk8PGvavLgV+LyFGiC9MxNgPKIsMD2oC0g9VIYSPR8frzs50ly7nwCZvOUwuLwaI6w8QlTHvLRKVjzKyxs76EBnvTMQm7pabYG9aW4OvYFpXjwFWEi8Op8HOzQYRr1l3BS8Mwp3vXToFT1xlo
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/bridge.ts","s":577,"e":613,"m":1777105111244.5793,"t":"}\n continue;\n }\n\n if (field === \"layoutDensity\") {\n if (\n typeof value !== \"string\" ||\n !PAGE_LAYOUT_DENSITY_VALUES.has(value as PageOptionsState[\"layoutDensity\"])\n ) {\n throw new DocumentBridgeError(\"options 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"must be one of compact/normal/spacious\" },\n ]);\n }\n continue;\n }\n\n if (field === \"embedDefaultBlockId\" && value !== null && typeof value !== \"string\") {\n throw new DocumentBridgeError(\"options 字段非法\", 400, \"VALIDATION_ERROR\", [\n { field, reason: \"must be string or null\" },\n ]);\n }\n }\n}\n\nexport function documentBridgeErrorResponse(error: unknown) {\n if (error instanceof DocumentBridgeError) {\n return apiErrorResponse(error.message, error.status, {\n code: error.code,\n details: error.details,\n });\n }\n if (error instanceof HttpError) {\n return apiErrorResponse(error.message || \"未登录\", error.status);\n }\n return apiErrorResponse(error instanceof Error ? error.message : \"服务器错误\", 500);\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-move-order-convex.test.ts","s":1,"e":60,"m":1777358057097.1814,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n assertDocumentMoveWriteOperationMatches,\n buildDocumentMoveOrderPlanFromDocuments,\n} from \"../../../convex/_utils/documentMoveOrder\";\n\ndescribe(\"documentMoveOrder Convex helper\", () => {\n it(\"assertDocumentMoveWriteOperationMatches 应只接受 Rust tree write operation,并返回内部 move plan\", () => {\n const actual = buildDocumentMoveOrderPlanFromDocuments({\n documents: [\n {\n id: \"doc_a\",\n parent_id: \"source\",\n sort_order: 0,\n created_at: \"2026-04-25T00:00:01Z\",\n },\n {\n id: \"doc_b\",\n parent_id: \"source\",\n sort_order: 1,\n created_at: \"2026-04-25T00:00:02Z\",\n },\n ],\n documentId: \"doc_b\",\n parentId: null,\n sortOrder: 0,\n });\n\n const normalized = assertDocumentMoveWriteOperationMatches(\n {\n family: \"tree\",\n schema: \"mnote.tree.write_operation\",\n schemaVersion: 1,\n operation: \"tree.subtree.move.write\",\n workspaceId: \"ws_1\",\n documentId: \"doc_b\",\n fromParentId: \"source\",\n toParentId: null,\n requestedSortOrder: 0,\n normalizedSortOrder: 0,\n patches: [\n {\n documentId: \"doc_b\",\n parentId: null,\n sortOrder: 0,\n moved: true,\n },\n ],\n },\n actual,\n );\n\n expect(normalized).toEqual({\n documentId: \"doc_b\",\n fromParentId: \"source\",\n toParentId: null,\n requestedSortOrder: 0,\n normalizedSortOrder: 0,\n patches: [\n {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-move-order-convex.test.ts","s":49,"e":100,"m":1777358057097.1814,"t":"},\n actual,\n );\n\n expect(normalized).toEqual({\n documentId: \"doc_b\",\n fromParentId: \"source\",\n toParentId: null,\n requestedSortOrder: 0,\n normalizedSortOrder: 0,\n patches: [\n {\n documentId: \"doc_b\",\n parentId: null,\n sortOrder: 0,\n moved: true,\n },\n ],\n });\n\n expect(() => assertDocumentMoveWriteOperationMatches({ ...actual, operation: \"documents.move\" }, actual)).toThrow(\n \"Rust move write operation 与 Convex 当前排序状态不一致\",\n );\n });\n\n it(\"assertDocumentMoveWriteOperationMatches 应拒绝缺少正式 write operation 外壳的旧 move plan\", () => {\n const actual = buildDocumentMoveOrderPlanFromDocuments({\n documents: [\n {\n id: \"doc_a\",\n parent_id: \"source\",\n sort_order: 0,\n created_at: \"2026-04-25T00:00:01Z\",\n },\n {\n id: \"doc_b\",\n parent_id: \"source\",\n sort_order: 1,\n created_at: \"2026-04-25T00:00:02Z\",\n },\n ],\n documentId: \"doc_b\",\n parentId: null,\n sortOrder: 0,\n });\n\n expect(() => assertDocumentMoveWriteOperationMatches(actual, actual)).toThrow(\n \"Rust move write operation 与 Convex 当前排序状态不一致\",\n );\n });\n});","v":"xDtTOzaHdzzDBSS+xXKmvG7EFT0M8Va9aZEPuSVTSj3abXA7hBi3vaZ1/byMj0Y99qp7PSFMQLxwKJY8GncZvQ0aAL3mSOi8CpoUPUhAJD2MGrs8XmLnPFxKNrxPVu28ykaLPVaqGz1bi2C8edSqOAU/3bygrA871POEPeuZsTxeK+A7fYaKPP8i9r1JHH+9cwuxPKFs9ryISgi8EVs0vZtRgjylFaq6X79AvfCukr0du4k9FU0KPEAqzD3h/gu7aYZTPYrOSr3hcfs60K5tvP9f5jwGA9g8iRkDPnFomT252Ou7EZuvvOfi9DyqfI+99P36PKjqkjwJ9CW8Om5ZPX6VMD03HgO8Gq0qvTwFIz1B4zM8m6RxvLS7qTx2zDE9Dw7mO+QwYrub6Iu9m/sDPb+z2rvAO6q9j5mFvKy7Bj1tBJ29KH8GvRbTmz08hQ49J0KjPX1l1zksltg8IWYlPDZqMDy/CZ09bFFuPJ9vgzoHjx+8xvt7u80kFL2zYbO88XshvWRDmTycDgq9+482vap7CLx+fAY9J1RvummV6LuFVjw5c7WFPe35UDx0rTo65McZvTYUGL2G4gW6QwovPbEmBbwCOoa93vgRPVQvPr10lD087AWhPCyx5Lu+HlA9FNTIvFq9gbz13Yu8S7a5PWhiTz3MpA67NrjWvH+/YLsSuIg8pQBYvVJyJ7w6sJe8YjuAvO/SEz0TnCA9kG35PCGTO70k3Ri9c0aXut4gTL3vHN08Z0eruz7qFL3DPci8oVRPPKvDDr37W1U9Y7NPvKaPNr0JGlE87oQrvIwVNzwElZa8av3RvGBOEj2sApY7hpTbPEwHxLyATGo8vzY+PQN1oDyr4pC8BK40vSUURT1u1TG9fIszvWqnM7xiN6g99Nexu+T6VrvJjJO9DIeBvQ81jjxPE4I8Q5EfvdDr0bxwvfU8EsoUvQCByTpkjVe9fiPmu7kOC71hLDw9oauXO7O/Ir1Fzvq8MXGrO3Y8BLwFyQC8Z1g2vasNGbsadEi8bIhJvLLFFD1eDaG8gQ80vfDU9rxjr4670XwIPSoiHDvBfxo9fFvrvNy0q7yvwSi9bv5uvatPJj05r6A8TL2JPaNNwbxixvQ5zHtqPTASXr2Uc5U7VmFwPEH0W7wn1Fe8KG47PCepCb2wn7u9vVayuhY62TtbwMS809SzPAN/GT2fWQY9nmiNPKR/ijwOOrc8dhOFPMDz57zk5lq97NAsvYKayTwiuSE9fnucOSUlSz0t9wo8IZyUPU21Vj2kJDA9/G7SPIYyLT3HciM9J7T5vFHNFL1PShO9c4kiPTgdwLwj4jW94VUUPft2nzxTsFS8xEUtPf4j3jxtrQ89dRsivfkb9bzAYD+8AxUrvAV7kLzUnmM8Uy8ePEwMpz3v4Xa8U1kmvSSHDb0PuCS9O+t4upD0NLzU27g8VDHVPHSySby8/6U8udE2PY1HkTw4i2s7M9ebPC2qyrtyFGO99MGoOqDQX72dmKc89h62vI7slzyL1Ke9bdbivNxXQ72ttY675XSpvFpfNry36BC9N+62u9ARxDtox649bR/aPPoHEz3+syA9MGcZPMV8Gr1qPE+8hhRPvEp3gz1Vnao9psIePTfhGjsQ6Zi8g2o0PYOW4LyY1va6ePmkvNqX1rzGlv+8WjDKvGK8xTsf9Mm8hBKVPN+nTz1UDgg9fYkLPbguJz16TQY85JY/vfSFpLwJatW8XR5SvJZMhT3XSee8PMB7PdeLTjwFfhC8EiWDPaBNIj2vWxy8DxUJvee65LxPK8I89Yn4PEOC9zzij6O7E8ZVPZYbiT3KVbC8Z7R5PaMlTrykPnU8Bmi4PBfLq7yBiLq8OHUGPJ2wRz1ztIy8e+wHvABh7rynG148RcqxPInWqjwVqFw82/PQPGD3ujx0AgO7Y/y6PP/0GD1rFIG7z0WoPPhjuLy3r5Q9EEgHPNW7VDzIsjg8kjhMPVlTHbyIyeG8Km3xPFNxbT2mMe87GAZQvF9ifLz3Ne484R+3vMMP+DytukE9rSMvvNdjHLtvXMO8GdBmu4o/WTt5PC48Qzd3vI3gVjwcEee4X4zYvCVk27ykVke8gzvSvNHVlzuN2ym8TADQPBJSBD0kVUy8y0jdu+pLbr3IgB+8rDwxPZGsEzyHh628gqA6PEY0Ir0Q0l48Gc57PYrJgrzSCtk8J8KePDfGKL0pIo+81YRZPX8TvLtPPuU8XuHUPDPz6LxMmau8sULivMAIQz1Wvq888G50PIh1BLpqBXc9LnhJPIqU4DvbdtQ6UJqkvd4kljzQhGg8nYuHPX3PAj1J28O8FEnsPLRM7DwsAIo9vygevTVZYj11CxI9v4UrvVaIpLzqsP+8xatJO8FRLT2cnEw9CW97vcYJaL374ZU8sMaivEqtTD0P+Ak9QAgMvKEWyj1JEru8ZdEGvNAHXztDxEe8ZuOmu4oj5jyeJCY8ZNgTvcBAYbxBDNe8AakMvc3VdjqxpiW9yozbPPfkkT2TiT29jsywvJgWDT3yTQI7JoMUPMCeRD2kL8+8Lz8GvLyF0bwImls9qq30vDdaN71jopW8tk
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-move-order.test.ts","s":1,"e":60,"m":1777358079798.475,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n assertDocumentMoveWriteOperationMatches,\n buildDocumentMoveOrderPlanFromDocuments,\n} from \"../../../convex/_utils/documentMoveOrder\";\n\ndescribe(\"documentMoveOrder\", () => {\n it(\"按 Rust canonical move order plan 计算跨父移动和越界 clamp\", () => {\n const plan = buildDocumentMoveOrderPlanFromDocuments({\n documents: [\n {\n id: \"target\",\n parent_id: null,\n sort_order: 0,\n created_at: \"2026-04-25T00:00:00Z\",\n },\n {\n id: \"doc_a\",\n parent_id: \"source\",\n sort_order: 0,\n created_at: \"2026-04-25T00:00:01Z\",\n },\n {\n id: \"doc_b\",\n parent_id: \"source\",\n sort_order: 1,\n created_at: \"2026-04-25T00:00:02Z\",\n },\n {\n id: \"doc_c\",\n parent_id: \"target\",\n sort_order: 0,\n created_at: \"2026-04-25T00:00:03Z\",\n },\n ],\n documentId: \"doc_b\",\n parentId: \"target\",\n sortOrder: -2,\n });\n\n expect(plan).toEqual({\n documentId: \"doc_b\",\n fromParentId: \"source\",\n toParentId: \"target\",\n requestedSortOrder: -2,\n normalizedSortOrder: 0,\n patches: [\n {\n documentId: \"doc_b\",\n parentId: \"target\",\n sortOrder: 0,\n moved: true,\n },\n {\n documentId: \"doc_c\",\n parentId: \"target\",\n sortOrder: 1,\n moved: false,\n },\n ],","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-move-order.test.ts","s":49,"e":108,"m":1777358079798.475,"t":"documentId: \"doc_b\",\n parentId: \"target\",\n sortOrder: 0,\n moved: true,\n },\n {\n documentId: \"doc_c\",\n parentId: \"target\",\n sortOrder: 1,\n moved: false,\n },\n ],\n });\n });\n\n it(\"treeWriteOperation 与当前排序状态不一致时拒绝执行\", () => {\n const actual = buildDocumentMoveOrderPlanFromDocuments({\n documents: [\n {\n id: \"doc_a\",\n parent_id: \"source\",\n sort_order: 0,\n created_at: \"2026-04-25T00:00:01Z\",\n },\n {\n id: \"doc_b\",\n parent_id: \"source\",\n sort_order: 1,\n created_at: \"2026-04-25T00:00:02Z\",\n },\n {\n id: \"doc_c\",\n parent_id: \"target\",\n sort_order: 0,\n created_at: \"2026-04-25T00:00:03Z\",\n },\n ],\n documentId: \"doc_b\",\n parentId: \"target\",\n sortOrder: 0,\n });\n\n expect(() =>\n assertDocumentMoveWriteOperationMatches(\n {\n family: \"tree\",\n schema: \"mnote.tree.write_operation\",\n schemaVersion: 1,\n operation: \"tree.subtree.move.write\",\n workspaceId: \"ws_1\",\n ...actual,\n patches: actual.patches.map((patch) =>\n patch.documentId === \"doc_c\" ? { ...patch, sortOrder: 9 } : patch,\n ),\n },\n actual,\n ),\n ).toThrow(\"Rust move write operation 与 Convex 当前排序状态不一致\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-move-order.test.ts","s":97,"e":109,"m":1777358079798.475,"t":"operation: \"tree.subtree.move.write\",\n workspaceId: \"ws_1\",\n ...actual,\n patches: actual.patches.map((patch) =>\n patch.documentId === \"doc_c\" ? { ...patch, sortOrder: 9 } : patch,\n ),\n },\n actual,\n ),\n ).toThrow(\"Rust move write operation 与 Convex 当前排序状态不一致\");\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-record.test.ts","s":1,"e":60,"m":1777070758266.136,"t":"import { describe, expect, it } from \"vitest\";\nimport {\n compareDocumentCanonicalOrder,\n getCanonicalDocumentByBusinessId,\n getCanonicalParentDocumentId,\n pickCanonicalDocumentRecordsByBusinessId,\n pickCanonicalDocumentRecord,\n} from \"../../../convex/_utils/documentRecord\";\n\ndescribe(\"pickCanonicalDocumentRecord\", () => {\n it(\"同一 business id 出现重复记录时优先选择最新未删除记录\", () => {\n const selected = pickCanonicalDocumentRecord([\n {\n _id: \"doc_old\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:01.000Z\",\n },\n {\n _id: \"doc_deleted\",\n deleted_at: \"2026-04-14T00:00:03.000Z\",\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n {\n _id: \"doc_new\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:04.000Z\",\n },\n ]);\n\n expect(selected?._id).toBe(\"doc_new\");\n });\n\n it(\"全部已删除时仍稳定选择最新记录,避免 first() 命中漂移\", () => {\n const selected = pickCanonicalDocumentRecord([\n {\n _id: \"doc_deleted_old\",\n deleted_at: \"2026-04-14T00:00:01.000Z\",\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:01.000Z\",\n },\n {\n _id: \"doc_deleted_new\",\n deleted_at: \"2026-04-14T00:00:03.000Z\",\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n ]);\n\n expect(selected?._id).toBe(\"doc_deleted_new\");\n });\n\n it(\"时间戳相同时用 _id 稳定打破平手,避免 collect 后结果不稳定\", () => {\n const selected = pickCanonicalDocumentRecord([\n {\n _id: \"doc_b\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",","v":"Gb86PcjqZLxZ0Bm+ZEGBvTMSrj3EbRS9ACcZvDTROz2nHDE8UVlKvaIC9bzZgEA9Mm+OPVBIDr1/+QG93PVgvUVht7woSgm9sZQYPbnKqDxqYfu8Qa6mvH1nD7wbjAS8HHhmPUE/ZT3UBhS8i5KrPSfdzLx1wIY87GeGPTwGRD35TSA950zMvK5+qb0vTeq8zeUyPAFp4TzghQm9PfSlPBeHOjwY4gg82/Oku3lmYL18CoI9juNAO/VcKT3APsQ8shI1PYNdzLyHSik8imbtvPIUtTuBccm8vvAHPtG4kTxPRDe9bMaWPAXErzyk+Ni8zLYKvRDkq7y66eW8sL2uPU47pT2YF9K8TRAYvZdSJT1jETy9W23/POu0LD2ZCQs9ZuVfPPnoXL2ThpK9KoBqPLyB5btV8WS93ecKPLa/QD2OVim9qSIcPPO7wjyNGHY8vAp/PXvFt7ySkzQ9M1k7u1vYNbswvKU9WW+LPb/c1Lyl6F+8WkJPPEgVLr3k+K+8sHqhvOpBkbyjkaG8g6imuyAuTz13vLS8Hku8us6frryhdY28ulrEPRqGyryyt2y8AAEXvFnBL72vUAW807hwPQTyDr2dU968w+LIO44xL71AKqM8govIO9HLjL3yN+o8dGSFvNDnbjtoW0i83dkBPejrRT3SzNc8fOHVvNWCdTxlmos9RekXvZvUq7r7G5q8gng5vX701jxep0o9rdEwPbLEDL1ZTZK8jYzpu0rBJzzVHJE8Ow+nPMVyGL1A+xq96NTsPAFiPr1qFHY93sdfvOkeLLx6pka8qjgVvQwiNz021K2879hAvKAffLxgjbe8B7rZPGBi+jtvuKM8lzoQPH+xHT1Wywm9yIYLvdkMNz2olD08nfAvvYNIqLxJNTw88F7GO9tLYz1z21O9KZh6va1bSDzbPyS858dkvfhYKzvfszk82EQ2vXyohTwsDeO8ZT72uoN2fL3aG0s9McABPNbkFr3G8pa86YEtO2owZbzyZwo8GNLBvMBH1Tx+9He9lBlsvWVSLbwHc7O6nHGSvcG+Gz1QTpK8BQPDO+KVKbxx6X68SIOPvMCOabq4Zai6m/yLvQF0qjxPlyO9htTePAkfLr0yQkY9rVZMPZcpsLzg/O08JiU5PWscTLvi8yQ9M/2xPGc+FzyBgDi9/ZYKvMO/ID3lKSi9Y78LPZ1Q7zk5hKQ8OYHeu9pJP7zncaa7tKvNu+DS8btJRhy9oFylvTF+ozrtMmE9c11zPIykXz0G/a+7KvAIPXGgxLx9s5Q8EOZivNUi+zx9Dbm8OdC7vMNWeb1YijG9QaThOoJERbzPsS8964U/OtPgK7u2JwS9p2dIPWXHQz1yIjk94a0XvcwOhDxV9QO922WOvIHpEb2OFLO64JQ/vfZQOT3WguU8f3pkvRGhVL2w9Cg5eO8MvCfO1zvu9rk7ZOS0vM0WYT2PqQW9mKrmPLCeiD0mq5C8BLW7vD7SoTzQenu9vG5bvKFwXL3B9EK9yoIgvZzRKD0oW5u8Rd0svHuSJ71IqEk72a6XvL2RozzrjM+7VKKbPGNeVr058jk9KO0tPHG/GT2m4wQ9Vn4gO7HigTzNBT29RwfgvLkohzwuZpo9k4IaPQsQAryxUXy9zqcyPTYdDr0Ulwe84PlqvV7dX71f16e95FoUvGbNfTxTqia9alEJPSQXBD3u0AY9mAfOuz/L2Ty8aoC885Tsu89IZDvIJJk8cZOavM4MaT0Hu4S8UgO/PLVrMD0q3Bq8HpiVPS87MjxoduI8luA3vV/znLuplQS7VdvMvJUNVTzekD27y4dqPcn1azwCF/W8Qh+6PO1HEzyvKx+9rVeZu1zOOrqnNCG9Juk0PavN4zwCx9u8zKMZPVYUgrwba168AZ80PK7rVjyjfPo8eLShPGl1MzvEooS8rxsaPVX2XrykV+I84c/7O7QE6LxyPQk9Gfj0PC96njwMSDE9CZMrPfNq67
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-record.test.ts","s":49,"e":108,"m":1777070758266.136,"t":"},\n ]);\n\n expect(selected?._id).toBe(\"doc_deleted_new\");\n });\n\n it(\"时间戳相同时用 _id 稳定打破平手,避免 collect 后结果不稳定\", () => {\n const selected = pickCanonicalDocumentRecord([\n {\n _id: \"doc_b\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:00.000Z\",\n },\n {\n _id: \"doc_a\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:00.000Z\",\n },\n ]);\n\n expect(selected?._id).toBe(\"doc_a\");\n });\n});\n\ndescribe(\"compareDocumentCanonicalOrder\", () => {\n it(\"未删除记录始终排在已删除记录前面,供页面权限/内容读链复用\", () => {\n const records = [\n {\n _id: \"deleted\",\n deleted_at: \"2026-04-14T00:00:03.000Z\",\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n {\n _id: \"alive\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:01.000Z\",\n updated_at: \"2026-04-14T00:00:01.000Z\",\n },\n ];\n\n const sorted = [...records].sort(compareDocumentCanonicalOrder);\n expect(sorted.map((record) => record._id)).toEqual([\"alive\", \"deleted\"]);\n });\n});\n\ndescribe(\"canonical document helper\", () => {\n const createCtx = (records: Array<Record<string, unknown>>) => ({\n db: {\n query: () => ({\n withIndex: () => ({\n collect: async () => records,\n }),\n }),\n },\n });\n\n it(\"按 business id 查询时返回 canonical 记录,避免高风险读链命中旧记录\", async () => {","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-record.test.ts","s":97,"e":156,"m":1777070758266.136,"t":"describe(\"canonical document helper\", () => {\n const createCtx = (records: Array<Record<string, unknown>>) => ({\n db: {\n query: () => ({\n withIndex: () => ({\n collect: async () => records,\n }),\n }),\n },\n });\n\n it(\"按 business id 查询时返回 canonical 记录,避免高风险读链命中旧记录\", async () => {\n const ctx = createCtx([\n {\n _id: \"doc_old\",\n id: \"doc_1\",\n parent_id: \"parent_old\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:01.000Z\",\n },\n {\n _id: \"doc_new\",\n id: \"doc_1\",\n parent_id: \"parent_new\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n ]);\n\n const doc = await getCanonicalDocumentByBusinessId<any>(ctx, \"doc_1\");\n expect(doc?._id).toBe(\"doc_new\");\n });\n\n it(\"父链辅助函数返回 canonical 父页面 id,供共享/评论祖先扫描复用\", async () => {\n const ctx = createCtx([\n {\n _id: \"doc_old\",\n id: \"doc_1\",\n parent_id: \"parent_old\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:01.000Z\",\n },\n {\n _id: \"doc_new\",\n id: \"doc_1\",\n parent_id: \"parent_new\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n ]);\n\n const parentId = await getCanonicalParentDocumentId(ctx, \"doc_1\");\n expect(parentId).toBe(\"parent_new\");\n });\n\n it(\"父链辅助函数命中已删除旧记录时仍回退到最新未删除父级,供收藏祖先权限复用\", async () => {","v":"/d0JPSR9GbrG4Qy+/AWjvVweST1ZDLS92zJyu4WYWj2sLLC8xcwlvbquGr2JYgo9PftxPaZBKrteGQc9vBw6vSZSS73eawC70issPU4SpDrSNU46PgNZO0qJk7yJ3Sg88Z5jPQeE/TzLdTS8vVcNPduxnLzBz/48W7SdPPlsiT2UvC09+lkyPTVYsr3ItqS9QdOrPb8ABb2u8Aq9NMUSPekl5zwELPW8D83fvD/3371j3o88EiGBvC5Mqz2gyA+8GOdSPXeAeL2sR3O70hPCvPIaaD2xIDE8Cw+rPWX8Oz36ACS9vXNkPPfv1zuzCU69Wpl5PDRZ4LsW2Ly7i1HzPbUwKj1LfSE7ZmJSN2YjZD0j6Dc7SRCJvJH4Iz081yQ9JfLSPC4RrLsyIsm8ZeEhPc3s87wNQV29CEvPPI8qgz2EpBI7ZN9vuzP+wz3Og7c8w3qVPd6BRjymjBu8PNsQPKgfg7zgxSc9raBAPDbPhLvDGx+8SfPcvOZ8ArzURsU8x8Dau7wOgLt/j1y9TA4XuyQtl7vagXa8MOBUOya9yTz3uqm5jPuNPRRrEDztOGW8f4FGvOnWMbwxeIA8JwDpPLL4xLxZRRm5j9njPMvDE72DLmo9IjMTPZlM+Lz78e079ARpvNyQRLzJBzm9BfaVPdbziTxyNic9Lb19vc0pPDyfVak9bYMyu9ZDdb2fg6e8XUz7u9cIST2SP5s9L089PaXdL70IVua8s+lBuwSEbbwuSwg9+mOLPMJzy7y5XqG8c7kePThtcb0j2Tw9JoEHvPtm57yFKng8GCsCvbvm5rrBcwS8STYQvTv2IzxRgoM8r0TMPOChXrzrySG8a8aHPbAwBjy9fYi8qb+tvdfTkD3be2+8jLCJvDfgQTzdnxU9Ti2SPDQHwDxtWYm8vZmGvdEZsjt++GQ7YbvxvESwfDzTRkg9236juyAdAj0POWm9P/bJOx7yJL3J6YU9weH0PIB0Hr2WamK8i7c+POWZ5bxv7I88+6BfvZYs5TtUpdq8b4eUvEOCJj3PhSO8G39jvZerzjxZ5aU8ggPGu3Acbr3aI/q8WzoTvdyZyjyRFwS91JRIvfQ8Bz0kTTK6tzMDPS2kGrz4rHk9RP+HPXIDvryCyfm6g2IhPBNVJL27JKi8slYrOqcUWTyXKA+98D+fvH4HljxroSC95kiTPTOsDD1dTHk8n3vrPEKxR7poRFE73CTmu9w6+7y4/3i9G/THvT5uFLy+1Rg8/cZMu2+fYTyrax096PqOPbM75DpyamM9ZwMcvbbLzjzZN2u6NiAWvUinYb1XULy6GdMGvPyl7Loz2Ei8TQ62PFnp3jwqmxW9JKcHPI22ujwTZ3c9pPr6vNGGirwjN1I8QbUqvcZ2KLwP3Rk99NETvRSgbD04qFw7wAYWvYyz8732vmC8aT2VvIpJATxXYwY8nV1fvBzWeDzt4/Y68VvPPB9YNTw8GF88fHktPPO5zjyDaoK9bK6JPIABHr39lgU8lrCduy7SKT1pR1W9D9KvPJ+/mr05m3O8dM+LO/GOzjzIkHU5OxLuO2ugS72+uzI992LEPOnRCj2x5oS8p11oupiyILxT50Y8O/JXvPZSNjzB2FE92CYdPfii87z/E069c9UnPUDNFb17XCq7uI7qvDzli73eoCq9oOA1vQUXw7oZ1yc8j7IYPe1gIT0DnZg8k4q6vB30Lj128Ny8LxymvF6/brpPSLy7qeBYvNRDUT0XYVK9kA1mPSBvibwT4CS8BF7ePM/eSLzWf5q77X0gvYDTZ7wbJd08oUEnO7jNCL0z61G8mi6KPQRpoj2Pb7E8OURKPCjNn7wDgBe98V9DPTJyZL1TGb288bAXPEsyPD3fLv28bVIuu0igtLy1+dK8EJCfPP/mc7vbiHG69lJgPNPoEb2/YnE89clHPa7nWj08OM88VVsEPcF8B7zDKlI9WbSgPKaj3ztB+hQ9nqB/PQVOiLwMMiW9s/23PKVlprsRq6C8IToNvPWhgr0ZFVq80Mt1u4VOdT0KPQw9IyZovXENqjyM3aW6TAQNOzIjgDy5iw49VSqGvL6rFDxaCBY8yqm0vL1jN
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-record.test.ts","s":145,"e":204,"m":1777070758266.136,"t":"parent_id: \"parent_new\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n ]);\n\n const parentId = await getCanonicalParentDocumentId(ctx, \"doc_1\");\n expect(parentId).toBe(\"parent_new\");\n });\n\n it(\"父链辅助函数命中已删除旧记录时仍回退到最新未删除父级,供收藏祖先权限复用\", async () => {\n const ctx = createCtx([\n {\n _id: \"doc_deleted\",\n id: \"doc_2\",\n parent_id: \"parent_deleted\",\n deleted_at: \"2026-04-14T00:00:04.000Z\",\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:04.000Z\",\n },\n {\n _id: \"doc_alive\",\n id: \"doc_2\",\n parent_id: \"parent_alive\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:01.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n ]);\n\n const parentId = await getCanonicalParentDocumentId(ctx, \"doc_2\");\n expect(parentId).toBe(\"parent_alive\");\n });\n});\n\ndescribe(\"pickCanonicalDocumentRecordsByBusinessId\", () => {\n it(\"同一 workspace 扫描结果里 business id 重复时应先折叠成 canonical 记录,供树命令写链复用\", () => {\n const records = pickCanonicalDocumentRecordsByBusinessId([\n {\n _id: \"doc_old\",\n id: \"doc_1\",\n parent_id: \"parent_old\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:00.000Z\",\n updated_at: \"2026-04-14T00:00:01.000Z\",\n },\n {\n _id: \"doc_new\",\n id: \"doc_1\",\n parent_id: \"parent_new\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n {\n _id: \"doc_2\",\n id: \"doc_2\",\n parent_id: null,\n deleted_at: null,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-record.test.ts","s":193,"e":214,"m":1777070758266.136,"t":"_id: \"doc_new\",\n id: \"doc_1\",\n parent_id: \"parent_new\",\n deleted_at: null,\n created_at: \"2026-04-14T00:00:02.000Z\",\n updated_at: \"2026-04-14T00:00:03.000Z\",\n },\n {\n _id: \"doc_2\",\n id: \"doc_2\",\n parent_id: null,\n deleted_at: null,\n created_at: \"2026-04-14T00:00:04.000Z\",\n updated_at: \"2026-04-14T00:00:05.000Z\",\n },\n ]);\n\n expect(records).toHaveLength(2);\n expect(records.map((record) => record._id)).toEqual([\"doc_new\", \"doc_2\"]);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-tree.test.ts","s":1,"e":30,"m":1777070758267.136,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildParentById, isAncestorOf } from \"../../../convex/_utils/documentTree\";\n\ndescribe(\"document tree helper\", () => {\n it(\"构建父链映射时保留页面与父页面关系,供树命令 legality 复用\", () => {\n const parentById = buildParentById([\n { id: \"root\", parent_id: null },\n { id: \"child\", parent_id: \"root\" },\n { id: \"leaf\", parent_id: \"child\" },\n ]);\n\n expect(parentById.get(\"root\")).toBeNull();\n expect(parentById.get(\"child\")).toBe(\"root\");\n expect(parentById.get(\"leaf\")).toBe(\"child\");\n });\n\n it(\"祖先判断应能识别多级后代,避免把页面移动到自己的子树下面\", () => {\n const parentById = buildParentById([\n { id: \"root\", parent_id: null },\n { id: \"child\", parent_id: \"root\" },\n { id: \"leaf\", parent_id: \"child\" },\n ]);\n\n expect(isAncestorOf(\"root\", \"leaf\", parentById)).toBe(true);\n expect(isAncestorOf(\"child\", \"leaf\", parentById)).toBe(true);\n expect(isAncestorOf(\"leaf\", \"root\", parentById)).toBe(false);\n expect(isAncestorOf(\"missing\", \"leaf\", parentById)).toBe(false);\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/document-visibility.test.ts","s":1,"e":48,"m":1778540818478.8376,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildVisibleDocumentIds } from \"../../../convex/_utils/documentVisibility\";\n\ndescribe(\"buildVisibleDocumentIds\", () => {\n const docs = [\n { id: \"owner-root\", user_id: \"u1\", parent_id: null, access_scope: \"private\", deleted_at: null },\n { id: \"public-root\", user_id: \"u2\", parent_id: null, access_scope: \"public\", deleted_at: null },\n { id: \"shared-root\", user_id: \"u2\", parent_id: null, access_scope: \"private\", deleted_at: null },\n { id: \"shared-child\", user_id: \"u2\", parent_id: \"shared-root\", access_scope: \"private\", deleted_at: null },\n { id: \"group-root\", user_id: \"u3\", parent_id: null, access_scope: \"private\", deleted_at: null },\n { id: \"group-child\", user_id: \"u3\", parent_id: \"group-root\", access_scope: \"private\", deleted_at: null },\n { id: \"deleted-public\", user_id: \"u4\", parent_id: null, access_scope: \"public\", deleted_at: \"2026-05-12T00:00:00.000Z\" },\n ] as const;\n\n it(\"允许 owner、public、直接分享与继承分享的文档可见\", () => {\n const visible = buildVisibleDocumentIds({\n userId: \"u1\",\n docs,\n directShares: [{ document_id: \"shared-root\", include_descendants: true }],\n directGroupShares: [],\n });\n\n expect(Array.from(visible).sort()).toEqual([\n \"owner-root\",\n \"public-root\",\n \"shared-child\",\n \"shared-root\",\n ]);\n });\n\n it(\"允许群组分享向下继承,但不会包含已删除文档\", () => {\n const visible = buildVisibleDocumentIds({\n userId: \"u9\",\n docs,\n directShares: [],\n directGroupShares: [{ document_id: \"group-root\", include_descendants: true }],\n includeDeletedDocuments: false,\n });\n\n expect(Array.from(visible).sort()).toEqual([\n \"group-child\",\n \"group-root\",\n \"public-root\",\n ]);\n expect(visible.has(\"deleted-public\")).toBe(false);\n });\n});","v":"0pdSPcKjmTssxAS+oLiWvRYnrz1SWxq9/l3XvEJTaT3wQ8w8WEPVvLAPB7xGMVw9kbiPPYLpAL14nQS9/dkfvQAzeLxuIui8NM96PXwbSDxXBim9CUzZuxuXkbyJib48/zucPcJWcj0g5ai88axUPUxxtLwVSY+6wLqbPQJDaT3YE848GekDvWkHir0uHgG9NyAoPNhPqTyq7Za85ze/PFQF/DucCh489OUbvbnVcb3glCM9rGOOuyB5SD0tV2E7eRHhPPrpD72j0CM8lxT7vKOmbzxIz6u8XIcHPi1WEjzpmSO956OHPMw/MD2zBUu8r7Kbu/Xzurzn1Ce9J+WaPR0QjT0G0vi8XAeCvYwMMz2q41i98ksTPXiwCT1/oT48kynuPMs0gb1iCpu97X0dPEcoszuP6Gm9OK8sPFMqID1yxBW9IuiEPHrNkzzfMd086o1CPb2hz7zdDQE9V3eMu/eH/TmPRLc9OS5nPcUkKL0ZSj27fazQPOXkTr2kUtK8GY+SvOgfl7w4OF68MrSJvJ8kCz2uxAC92/h3txkQObu2jNq4Vee5PZvMq7v/pjC8jMEVPKPMLr2xVf+8G7I2PYLQDr37b9W8KWCBO5TBib3ou5E8Zld+uy1oMr2561o89iKnvHavmjxgflG84DNUPckILz2zGdo8jyfouwxKmLtb44k9rI65vNh+9LvKx9S8A1tbvTlDuDwPG2k9JKA2PdnZMr0wqhW8V3tQOZIaAjzDZIC78gsLPTngVr1KIQ+9yn48PU6jh72oW0k9nJ+1vL16P7zg6ZK8Xtg5vYhgHz2rmja9JQKCu8xZ4LtkKq68tijPPEFVkTvOWN886ie2PH22RT2Vcre8sjlQvS82UT0fuS+8KDMvveDKsDuUgRi8JA6YPNUtMz1r6V29fNc8vS3O9zqJQrm8Iu+HvUvtgbwZrUo89FAgvXd/KTuAYwW8ehecO0ITHb3O/G096/5jun3yIbwyWCK7A4a7up5jjrwjCCs8/SPSulIuYzyivXG9nhNNvYF9QrzpPC465TqfvcHgWDxZB6G8MgBGOYs5ZruWFMy7gt7dvGc1D7yaq0K7LP6QvW7FnDsjAzO9U+czPaJK+bzjJGo9xSJVPdG89ryiYPA8vsUHPSWrZLwXFDM9xQHNPJkPRzrG5CS94+YAPL5kAz2kgF+9J9oYPcXVmjyh4jA80hcfPMEXNLz3nTu8+uj/vKrjqLsxYla9ayCbvSo5/7gIIAg9odEAPC9XJD1zrvm6QuvqPJ/ITrxQCkw80shIvA8qTTwdTEe8M1/KvLShPb1s8Pi8WlIrO5C/g7zmYBA9PsNQPPkNirzwNQG9iU6HPVSfez1Jvgo90avwvHQuijyS1iu9UrCjvFV9Pb04gyu8im8SvZcZ/TzfRbg77eJava+CSr0G3Yg8e4DXvLWGPDx1Uqw8Bl4pu89Whj14StO85hXZPGScVT0xvrK7QD+nu0oETjzHYla9YZBgvNdTar1H3Ay9lSL0vFWTDz0NM9a8T6TUvO2FTr11JYA7uMVSOiseuzyOnLG7yNjtPCpsML1vv3U91n2iPOLkGT32KDo9i8BVPClU8jyBPDa95FdZvcD7CT1mmJU9oqNYPXLo7LyAcXm9Rx1EPe9dGr2ikIW8vmcfvXvcW72La6O9wKGFvGvEDDsrqPO8TwCEPJD7qjxUpBM9foLNvOAcWzzzPY+8fXa0vPX+CDzmGfY8cjNsvHQvKj0PBLW8NfiGPL8BHj3VVuK8vtOUPeIngjx8LhY8LI8bvYftn7w7DXa8a4rWvBp77jxwEJe7jpdLPX/XHjzULDS9kviauWc0Bj3MSkC93SoYufx8J7ywJ0690X9sPRjh4TxBd8y8Lor8PGY5WLwW00G7wufnPNeajzyhnlU9DGlqPK7zOTvM+Qe9RwPXPEIGarvf/9Q8Oo2TvHEo3Lyav1I81R3WPDYLvTy3
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/media-asset-command-adapter.ts","s":1,"e":60,"m":1777196225009.4397,"t":"import type { ConvexHttpClient } from \"convex/browser\";\nimport {\n type CommandEnvelope,\n type BridgeContext,\n} from \"@/lib/documents/bridge\";\nimport {\n recordBridgeCommandFailureArtifacts,\n recordRustBridgeCommandArtifacts,\n} from \"@/lib/documents/bridge-log\";\nimport {\n executeRustBridgeMutationTransport,\n resolveRustBridgeCommandPlan,\n} from \"@/lib/documents/rust-runtime\";\n\nexport type MediaAssetReplaceStoragePayload = {\n assetId: string;\n documentId: string;\n workspaceId: string | null;\n storageId: string;\n userId: string;\n};\n\nexport type MediaAssetWritebackExecutionResult = {\n requestId: string;\n traceId: string;\n commandId: string;\n commandName: string;\n};\n\nexport async function executeMediaAssetWritebackBridgeCommand(input: {\n client: ConvexHttpClient;\n context: BridgeContext;\n envelope: CommandEnvelope<MediaAssetReplaceStoragePayload>;\n}): Promise<MediaAssetWritebackExecutionResult> {\n const plan = await resolveRustBridgeCommandPlan({\n context: input.context,\n envelope: input.envelope,\n });\n try {\n const transportResult = await executeRustBridgeMutationTransport({\n client: input.client,\n plan,\n });\n await recordRustBridgeCommandArtifacts({\n client: input.client,\n context: input.context,\n envelope: input.envelope,\n plan,\n result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({\n client: input.client,\n context: input.context,\n envelope: input.envelope,\n error,\n });\n throw error;\n }","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/media-asset-command-adapter.ts","s":49,"e":68,"m":1777196225009.4397,"t":"result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({\n client: input.client,\n context: input.context,\n envelope: input.envelope,\n error,\n });\n throw error;\n }\n\n return {\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n commandId: input.envelope.commandId,\n commandName: input.envelope.name,\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/metadata-command-adapter.ts","s":1,"e":60,"m":1777197186979.8804,"t":"import { getAuthedConvexClient } from \"@/lib/convex/route\";\nimport {\n type CommandEnvelope,\n type BridgeContext,\n} from \"@/lib/documents/bridge\";\nimport {\n recordBridgeCommandFailureArtifacts,\n recordRustBridgeCommandArtifacts,\n} from \"@/lib/documents/bridge-log\";\nimport {\n executeRustBridgeMutationTransport,\n resolveRustBridgeCommandPlan,\n} from \"@/lib/documents/rust-runtime\";\nimport type { PageOptionsState } from \"@/types/page-options\";\n\nexport type DocumentTitleUpdatePayload = {\n documentId: string;\n workspaceId: string | null;\n title: string;\n};\n\nexport type DocumentStatsUpdatePayload = {\n documentId: string;\n workspaceId: string | null;\n stats: {\n wordCount: number;\n characterCount: number;\n blockCount: number;\n todoTotal: number;\n todoDone: number;\n };\n};\n\nexport type DocumentOptionsUpdatePayload = {\n documentId: string;\n workspaceId: string | null;\n options: Partial<PageOptionsState>;\n};\n\nexport type MetadataCommandExecutionResult = {\n requestId: string;\n traceId: string;\n commandId: string;\n commandName: string;\n};\n\nexport async function executeMetadataBridgeCommand<TPayload>(input: {\n context: BridgeContext;\n envelope: CommandEnvelope<TPayload>;\n}): Promise<MetadataCommandExecutionResult> {\n const { client } = await getAuthedConvexClient();\n try {\n const plan = await resolveRustBridgeCommandPlan({\n context: input.context,\n envelope: input.envelope,\n });\n const transportResult = await executeRustBridgeMutationTransport({\n client,\n plan,\n });","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/metadata-command-adapter.ts","s":49,"e":85,"m":1777197186979.8804,"t":"envelope: CommandEnvelope<TPayload>;\n}): Promise<MetadataCommandExecutionResult> {\n const { client } = await getAuthedConvexClient();\n try {\n const plan = await resolveRustBridgeCommandPlan({\n context: input.context,\n envelope: input.envelope,\n });\n const transportResult = await executeRustBridgeMutationTransport({\n client,\n plan,\n });\n await recordRustBridgeCommandArtifacts({\n client,\n context: input.context,\n envelope: input.envelope,\n plan,\n result: transportResult,\n });\n } catch (error) {\n await recordBridgeCommandFailureArtifacts({\n context: input.context,\n envelope: input.envelope,\n client,\n error,\n });\n throw error;\n }\n\n return {\n requestId: input.context.requestId,\n traceId: input.context.traceId,\n commandId: input.envelope.commandId,\n commandName: input.envelope.name,\n };\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-builder.test.ts","s":1,"e":60,"m":1776812315374.967,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildPageAggregateFromDocumentPayloads } from \"@/lib/documents/page-aggregate-builder\";\n\ndescribe(\"page-aggregate-builder\", () => {\n it(\"会把 documents meta 与 content 收口为统一 page aggregate\", () => {\n const aggregate = buildPageAggregateFromDocumentPayloads({\n meta: {\n id: \"doc_1\",\n workspace_id: \"ws_1\",\n title: \" 页面标题 \",\n updated_at: \"2026-04-22T12:00:00.000Z\",\n can_edit: false,\n disable_download: true,\n disable_copy: false,\n wide_layout: true,\n use_small_text: true,\n show_heading_numbers: false,\n show_toc: true,\n show_structure: false,\n protect_editing: false,\n show_word_count: true,\n collapse_backlinks: true,\n page_font: \"default\",\n layout_density: \"compact\",\n hide_child_pages: true,\n show_block_ref_count: true,\n embed_default_block_id: \"block_1\",\n word_count: 20,\n character_count: 40,\n block_count: 2,\n todo_total: 3,\n todo_done: 1,\n },\n contentPayload: {\n content: [{ id: \"block_1\", type: \"paragraph\", content: [] }],\n revision: 8,\n conflict_detection_key: \"doc_1:8\",\n page_subtree: null,\n },\n });\n\n expect(aggregate.identity).toEqual({\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n });\n expect(aggregate.head).toEqual({\n title: \"页面标题\",\n updatedAt: \"2026-04-22T12:00:00.000Z\",\n permissions: {\n readOnly: true,\n disableDownload: true,\n disableCopy: false,\n },\n });\n expect(aggregate.layout.pageOptions).toMatchObject({\n wideLayout: true,\n smallText: true,\n showHeadingNumbers: false,\n showToc: true,\n collapseBacklinks: true,","v":"7GroPAOQhzwVUxm+w51qvZHjhD3M3Qy9zAMEva2SaT3V134856QEvRWPkLvUaUi88VLxPHdB5LtY3ym9YzYsvYLKnrxV8zC9RcGzPEKS8DvfmfS8CD4YvVM9rLwWm5K8JVOqPThBtT1OWNS8agrPPDNX7byTK5e7lY9SPVG7oDwXUuY8krDUvHNuCLyodAO90spUu31Mr7sC4k294mNNPArxorpRIui7p6f3uzVDbL0qFAA9GX1mPGM46DxbJL48vxSCPWRhDb0zY8s6mux2vFyrmzu9nVk7BiwdPs11Tj2fpO+849znu7qGHj3Zlom8FWIwu2gExjyMIqa8gvfUPcn/rj3k3h68VGeCvWdOOz2x8pu8qxlsPBBpNT3l+/w8L6vZO/lgOr17g2a9R2VkvE/qyTs7Lue8fVi1Omf6Yz0qxV29HW3SPJm3KT1DuI08az9lPUFj+LynC1Y8MQgvvBIMX7yHCLA96i6DPcUXwbyC75c54eaRvEpgGr1fWMC8v8PIvJk7g7y8mtG8vivruyW2XzyfT8a70MAEOx65PzyQCvK8k82UPcK9mLxVGoW8VASBOrxeEr1ezXe8RCeXPSFwsLwnFzG9bMMRPQdfX72z+kI95vcuPb5tOb3d0ZU80kMIvLJ2zLxECWy8JdZOPVfw7jwKA3o7JPLJvMcrajsKeII8YESPvWvXWLvV7qS8trX3vAZ3VzzijIc9HWMuPY5J/rynfoi8qsYEvQ30ejuTgVU8kgaEPJiFGb2G7F+74UDFPLs/jL1Rj1I9QG8vvAEeKbyQrDM8UOWPvQ/jszxkNh29tA6BPOtaHjyMF/W7RgknPHX0Gbx0lO08ltXIPBQZGT1XaNi81oFnve4leD1Gb4O6lIpCvejsxLkuIyM9DJv+uokJYz2etE+9vtsNvZtAurt8qZu7lgaAvVXAybwM2MQ8ujMzvW5Z5jwCYGk8dlEXu+I/KL1a6dY89ikEvYozRr2Vzuu8IkdXu6GkJb3NS6A76Zuvuv4/GrwCFkm98BOUvYpTk7y5DPC7bG6JveFakDzv94a4YKMXPJ9dzbw3doc5x/UePDO8o7wrjki8uONzvYfZST1j8mC9AtUDPYo3ULyzpmw9/WiGPahFv7xmumc8yqtnPdZW4TsJiy09gUMPO3M8AjyUaR29L6lmvKEyYj3Zuw+9UZqFO6DdcLoamwo99dglO2+ojru+J4y7m+q7vE6evbx48nu9QJ3Evc1yFry0bXg981XDPBPHVz1L4v68wv9DPR/SXbvlSNQ62HY3PIIE6jzM1na8bmrlvHtptbzQAB+9ADD2PM02CL1OeTe6SuuNPZIJ3TsQPQC9lVmdPQATHT34PB48xIhKvb1SB7qikkW9acEoOrP4ML3bOQo90W4yvSR3LD378rg8D2woveU9F73QTvY83wM3vPBZAj2Zktc8D+/fPEph9jwYd+W8C24wPcmn3zxn+BA8RhaGuzge4buDnUG9ZzbRu3R5Z72CY968sFSfvLXmjzxiKeu894ggu8yuTL0teei8EgUeOx/yijx9o4g7pQc0Oqu9Or3XGKo9Wb0CPS+Unjzd5kw9uORaPMhtHLzR+y69QJhCvW0ogD27LMY965lXPXhIC73g7HG9riuOPcjZfTvcyVU8qCxZvT/6q70To569A/YevK1T5joI2PS89FUgPf8+Mz26PSs9nlUtu0zyBr1XL7A7z/sgO7VLCTtqCu47/HO+vNwX6TwNApA8zUyiPP0JPDxMCgi8pSl9PcykZzwaEGI8PKoSvXLgSDzH+4q8StjaOf6EqDo6BoU7loEVPQjk+TzRJh69hgEvPReQSz1B2bW88DvXu+bF37ykKqm8nVkpPTGrcT1HLgS9BWEmPdZdM7zk96I8CT/OPNyQFLv+11w8XlLqPKDR77tun3y8q3M7PeATZbxLk9w8r3jVvNWVCr1/Ngs9qG+RusOymTx96j49E93cPAGbn7tE4di8lZ1+vO7/8DpknIg9eTxwuy0kHr20nEW867gsvVo1iLx0Ya09gENMvA
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-builder.test.ts","s":49,"e":80,"m":1776812315374.967,"t":"permissions: {\n readOnly: true,\n disableDownload: true,\n disableCopy: false,\n },\n });\n expect(aggregate.layout.pageOptions).toMatchObject({\n wideLayout: true,\n smallText: true,\n showHeadingNumbers: false,\n showToc: true,\n collapseBacklinks: true,\n layoutDensity: \"compact\",\n hideChildPages: true,\n showBlockRefCount: true,\n embedDefaultBlockId: \"block_1\",\n });\n expect(aggregate.body).toEqual({\n content: [{ id: \"block_1\", type: \"paragraph\", content: [] }],\n revision: 8,\n conflictDetectionKey: \"doc_1:8\",\n });\n expect(aggregate.stats).toEqual({\n wordCount: 20,\n characterCount: 40,\n blockCount: 2,\n todoTotal: 3,\n todoDone: 1,\n });\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-builder.ts","s":1,"e":60,"m":1778165093745.1453,"t":"import { buildPageAggregate, type PageAggregateProjection } from \"@/lib/documents/page-aggregate\";\nimport { normalizeDocumentContentResponse } from \"@/lib/documents/page-subtree-response\";\nimport type { PageSubtreeProjection } from \"@/lib/documents/page-subtree\";\nimport type {\n DocumentStats,\n PageFont,\n PageLayoutDensity,\n PageOptionsState,\n} from \"@/types/page-options\";\n\nexport type DocumentMetaPayload = {\n id: string;\n workspace_id: string;\n title: string | null;\n updated_at: string | null;\n can_edit?: boolean | null;\n disable_download?: boolean | null;\n disable_copy?: boolean | null;\n wide_layout?: boolean | null;\n use_small_text?: boolean | null;\n show_heading_numbers?: boolean | null;\n show_toc?: boolean | null;\n show_structure?: boolean | null;\n protect_editing?: boolean | null;\n show_word_count?: boolean | null;\n collapse_backlinks?: boolean | null;\n page_font?: PageFont | null;\n layout_density?: PageLayoutDensity | null;\n hide_child_pages?: boolean | null;\n show_block_ref_count?: boolean | null;\n embed_default_block_id?: string | null;\n word_count?: number | null;\n character_count?: number | null;\n block_count?: number | null;\n todo_total?: number | null;\n todo_total_count?: number | null;\n todo_done?: number | null;\n todo_done_count?: number | null;\n};\n\nexport type DocumentContentPayload = {\n content?: unknown;\n revision?: number | null;\n conflict_detection_key?: string | null;\n conflictDetectionKey?: string | null;\n page_subtree?: PageSubtreeProjection | null;\n pageSubtree?: PageSubtreeProjection | null;\n title?: string | null;\n};\n\nexport function buildPageAggregateFromDocumentPayloads(input: {\n meta: DocumentMetaPayload;\n contentPayload?: DocumentContentPayload | null;\n}): PageAggregateProjection {\n const normalizedContent = normalizeDocumentContentResponse({\n documentId: input.meta.id,\n title: input.meta.title ?? \"无标题\",\n payload: input.contentPayload,\n });","v":"VAwjPahIGz1KNsS9btzAvS96Lz1ReRW9slAdvS+XQLxfTPQ8EW8fvRYKEr0iKzE5hi3ePf4Lnjp3p5E8D/MtvfpPBb0m/7q9dQrcPCgwKj3gMVa8hiLBvFm8Cz2e/4m9TANIPVSRhT2wUqc8AMRiO79flL1czRU8lvzOOy1n0jy7MCA9QPVjPKTVAr0y3Ws8BVMIvM9z5LxE0/S6wuMXPW8ZJb2JRqM6JR5jvN0tJ73yFAQ9K2Q2vcjMwj3ZO+M88TGiPb2LZr32FEw9pIAyvCdPkzvCeEs7z+vqPRrpIj0QHkS9Q/ybvM/2VTvYF7i70rcBvXGfoj0qphM8ZVjBPbP8FT2HLHG8y1s9veg1iD020Ni8pWCCvP1aMj03gz09dF/nPLEu3rvghw+9vsdLPEtXAD2df728iWWfukuM5jyikHm9UFj+uZjdvDyxbsU8819dPf1tODyoViq9PiFBvUfnPr1cQP08SqevPc6CUL3L9lG825Ibu5aPPL2y/jI9rChnO5ytnzsR2sq8YakpvctLzjzvigC9yi31PPYM2TyfCmU6MpoYPbxv17yddQy9xZuDO+bM3Lw0dO2814WMPXtZib0d0Na8nhA8PYUAOr0GPRU9UUqAPIKIybqwS289Z/sAvVulT72SnFW8jyQsPXGWGD14VqG7n93ZvKd7gTzQGz48Yya1vWjKj73pAf68uNnsO04EGD2J6JI9VHsPPVLYZbxklNG7PXdgu+R6j7zf3aM8qhklvcaES71aowI5wRh2PMcUirx9v409+TS9u8+tDb2JTyg9T/T4vCQRPD1vqYK8i0OePUu+yTzfXp28N2gdPWGWhDwt8oa8jW0mvXpUTj33Byk7znhjvbbeOD1WCZ88OPlPunqcD7vHoRQ9D2SPvHYULT36XlS99mItvf2IMTyrC0W8LYmQvFMyyLwkfBs9WvCAu4EBkzzR9eO845cBvKBOyL27dRI8fVaSu+q9EL3xPyO8AavUPPkpxLsN1Ys8bVe3vAUoEjvN1GO9pOo/vLSYArwb4pi9ay3KvbwSwjyER1S7s6iGPKY2lb2eQ9o8vs+mujJvf7w3q667qsZDvXxBQzyf7Oa8NgUVPU1FiLw1WBw9AiOUPcX0grqjcg89ZNubuwTV7TsC9As9VkXMvLW527pXYi69KOSwPJ/cETz/ny69zH2uOn5HTj0OMoo9AF5bPeZyELyEP3072KIIvOJnQ71fdRm96xd8va8ccTwV0DM9NxkhvE1z5bvmPwA98VCtPT0yw7zOq7o7bzP6O3LrZjztyI27Oy5Bvbnk3jpuhKa8n6pbvBdkSL37AGk8nNI5PQtvrrw7F6U7ibYTPTkDgj0G1yq70ZpCvZF39jvvPOS8L12wPBK+CL3qaj090XIKva0xDj3FtgW98RTGvGc48Lw6lBS9U+oHPDx6oDwinz890/OYvCBI+jm30vC8wuQNPfSQHj1+tDY8c8yQvG6skrtDhUe9YezyO8Qqi71ynG29aVj/vKZsVjxiWms7Uo7HPE+fyLxFkZ68ldRHvAWcWDx6oes7WyZJu5UCZ7y7oYM96GGBPK9NJTx8Azk94+tFuraUSb2zmHO9sYVGPE+Mij3T6L89YFdFPaYPT7tVGIG8ZcGLPIJSH7125BM7IXf4O57El71dPzy9gTILvI4kjz1UQM27x9HVPAuNNT3v/ru8SYfdPL3JN72cOMO8pIcRvSyfQj2nW0Y8tDkevfAJHT2hFz88D2J9vBF43jpmxzG8kq5LPRpPBT2OIrc8CYpvvMjK7rzYkD885eqWvMW3hzmj1SK76hgQPfrKgj31mQa9soiJPdeiMby09oe8hQDbumzV07vK6yS9ih+zPAKzHj1iYyW9VsoZPQM7SDylUK+79SckPOoXET2YgT08hvUSPM8CDL0+0o48B4wEPVDqJLw4Nx09CUUEvGlwdzsdWvA67Us
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-builder.ts","s":49,"e":101,"m":1778165093745.1453,"t":"};\n\nexport function buildPageAggregateFromDocumentPayloads(input: {\n meta: DocumentMetaPayload;\n contentPayload?: DocumentContentPayload | null;\n}): PageAggregateProjection {\n const normalizedContent = normalizeDocumentContentResponse({\n documentId: input.meta.id,\n title: input.meta.title ?? \"无标题\",\n payload: input.contentPayload,\n });\n\n const pageOptions: PageOptionsState = {\n wideLayout: input.meta.wide_layout ?? false,\n smallText: input.meta.use_small_text ?? false,\n showHeadingNumbers: input.meta.show_heading_numbers ?? false,\n showToc: input.meta.show_toc ?? false,\n showStructure: input.meta.show_structure ?? false,\n protectEditing: input.meta.protect_editing ?? false,\n showWordCount: input.meta.show_word_count ?? true,\n collapseBacklinks: input.meta.collapse_backlinks ?? false,\n pageFont: input.meta.page_font ?? \"default\",\n layoutDensity: input.meta.layout_density ?? \"normal\",\n hideChildPages: input.meta.hide_child_pages ?? false,\n showBlockRefCount: input.meta.show_block_ref_count ?? false,\n embedDefaultBlockId: input.meta.embed_default_block_id ?? null,\n };\n\n const stats: DocumentStats = {\n wordCount: input.meta.word_count ?? 0,\n characterCount: input.meta.character_count ?? 0,\n blockCount: input.meta.block_count ?? 0,\n todoTotal: input.meta.todo_total ?? input.meta.todo_total_count ?? 0,\n todoDone: input.meta.todo_done ?? input.meta.todo_done_count ?? 0,\n };\n\n return buildPageAggregate({\n documentId: input.meta.id,\n workspaceId: input.meta.workspace_id,\n title: input.meta.title ?? \"无标题\",\n updatedAt: input.meta.updated_at,\n readOnly: input.meta.can_edit === false,\n disableDownload: Boolean(input.meta.disable_download),\n disableCopy: Boolean(input.meta.disable_copy),\n pageOptions,\n content: normalizedContent.content,\n revision: normalizedContent.revision,\n conflictDetectionKey: normalizedContent.conflictDetectionKey,\n pageSubtree: normalizedContent.pageSubtree,\n stats,\n });\n}","v":"9QQHPfzq1TzoHs+9CfzYvWgEIz1Z2zu9NbIfvdym4ju8v608sZKcvYNCeL0iBj09Be/bPau6Fjz/5YE84FItvfks1bw0DpO9aqjnPPHKmD0k8JU860nPvJkXgzxzxoK94n8wPcAWgj0698I8rAMPPXRFZ70UyTg9NXYxPYCSCD2TBGw7YG2PObzvpb332Aw8Qm3Lu06IBr11jwG9y6Q7PMouoLtvsJQ8s4fUvCLrkzxZbgc9w2FzvCGLqT1wKxc9AjQiPQPUrL2ywJg8PHK/ucTF/7sKI0+87Ey7PSXrvDw7ZxS8XxR1OjbGjDz9MlO9ReqUO3v3Vj0mISC7TO7PPWKYlj25Mvm8sT4zvQIBPj2epTe8onoKPeRP+jwW4WE9oXvKu+XbkLqfE928Ao5UPTFu0LqZF/W8lhNbvbNcNT23RkG9fXWbvDelLD1ehI48j2JhPYR+MLzGOEA8WGX5vJtBWL3zMBg9pwmHPfbX17z7L227DWKEO6dht7xAx5c83QwKvVhpjryEw+e7y2wQvaNgEj2ZofE6lAW2Orjkirw+SQA8QNlBPadI0TwmwN46DZLFPEor+LyqvR29NWQcPagNmL3Svre8M5TLPE6Kdr2B/og9lw0IveP967xlKxk9ryvavBwBC703OQM8AoRHPV02vTxCcjQ8svGBvH4IiDzOxkG8kRFdvc2QRL0Eeze9hFdUPDrZzzwEBfQ8y0IpPc3ql7wvZL+8nkC0u2KMA70hCK+7ihe6vK+nj7yxHx29U3PbO1juSb39ZZE9jbeqvBozw7z8uaQ89BU5vA3wjz1R7Bi7G8EtPQ3sZD0dxB696FXaPCKLBb3wVgi9Dg+DvHbdRD3EUNI8e0hTvHOaKj1hcs+8HFmovECKC70oCmk7BLOZvDnfDj0TsqG9ADZkvY/uzTwTkj68wnaYuku2/7xOCIw8GbPsu4+1ajwbxuy8BZ6MO2VQm717QBk9j/2EPAg4C72hgve8v4CcPFhKWTxCTX68BI7mvEVZszwDwFe8n3fkvLS4A7zifTm90qKKvQyonTxePuG7wHMhPdc2eL2YF+s70gfkO+EdibzfB7s8XPWEve3qBbzQbna8Y0BLPTxT5LyoDde88fKlPYbSA702txo8at5Dun1Cg7zLEtY70U8wvCYEjryyafq8wRqTPJgHmDwGoWG9e5Z1PCCNTD1xQUY9BzPZPE7G1LxUzrU6PPCnO4bCETsriOa82vE7vW3uwjzQQDw9A0KHvMBL4DyvZtQ8H7PpPTqHibx3i0U9tCpRPBWDED1xm5K6E/GXvHeX17wh3+i8H/yIOpy4ZL0y82I8UWkZPFHV07xjfDM9Ks0LPWxerj2+AQY9QUcSvUBb0LuGr9I8K2DRvJVdybwFVuc82pHsvJ78xzyyub68OsjTvFS1yLx7uOC85tETPQnCjjzpKw89viKIvJTtAz0zypu84N1lPSIX6Ty8cME8YVlsPL0ZObygtP68WfwMvLnvWr3q0Q485BeavHHUA72vHO+8WwGaOy/51byM/r67sl+Ru9/MEj1YN4a812GfPJwK+zqCNy898eW+vI81/zyz/Ck9MuP6vA3+E73k96i9tmyGPBRlNz0tZJw92FgtPa8Wxjqo68U8BragPBhiNr0uKjm7Z3ueO5kfLL3LYUa6PyaovBQYPD0Xily8poX/PFp0gD2E4SC8gVwaPTNYHjxatpK8IfiXvfX4DD3ClqO50y4UvWw0CT0lh5q8btfmvG2EJzzmTO873B56Pab+6Tuql666IeeFvAo0nr3KaSc9f9n6vPL7n7uzVpw73BB4Pd9zED1yUrS6YkUfPTJfHby1ThU83a2mPBS19rumQ9u8sRAsPbDxD7zDG+i8sv5NPKZkiT
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-loader.ts","s":1,"e":60,"m":1778334631652.6506,"t":"import { headers } from \"next/headers\";\nimport { resolveMnoteWebInternalUrl } from \"@/lib/mnote-web/internal-url\";\nimport type { PageAggregateProjection } from \"@/lib/documents/page-aggregate\";\n\nconst FORWARDED_REQUEST_HEADERS = [\n \"cookie\",\n \"authorization\",\n \"x-request-id\",\n \"x-mnote-request-id\",\n \"x-trace-id\",\n \"x-mnote-trace-id\",\n \"x-session-id\",\n \"x-mnote-session-id\",\n \"x-source-channel\",\n \"x-mnote-source-channel\",\n \"x-source-client\",\n \"x-mnote-source-client\",\n \"user-agent\",\n] as const;\n\nconst RUST_PAGE_AGGREGATE_TIMEOUT_MS = 3_000;\n\nexport type LoadedPageAggregate = {\n page: PageAggregateProjection;\n bridge: {\n requestId: string;\n traceId: string;\n queryName: \"documents.page.get\";\n };\n};\n\nfunction copyForwardHeaderIfPresent(target: Headers, source: Headers, name: string) {\n const value = source.get(name);\n if (value) {\n target.set(name, value);\n }\n}\n\nfunction readHeaderAlias(source: Headers, ...names: string[]) {\n for (const name of names) {\n const value = source.get(name);\n if (value) return value;\n }\n return \"\";\n}\n\nfunction copyNormalizedHeader(target: Headers, source: Headers, targetName: string, ...sourceNames: string[]) {\n const value = readHeaderAlias(source, ...sourceNames);\n if (value) {\n target.set(targetName, value);\n }\n}\n\nfunction buildForwardHeaders(source: Headers) {\n const requestHeaders = new Headers({\n accept: \"application/json\",\n });\n copyForwardHeaderIfPresent(requestHeaders, source, \"cookie\");\n copyForwardHeaderIfPresent(requestHeaders, source, \"authorization\");\n copyNormalizedHeader(requestHeaders, source, \"x-request-id\", \"x-request-id\", \"x-mnote-request-id\");","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-loader.ts","s":49,"e":108,"m":1778334631652.6506,"t":"if (value) {\n target.set(targetName, value);\n }\n}\n\nfunction buildForwardHeaders(source: Headers) {\n const requestHeaders = new Headers({\n accept: \"application/json\",\n });\n copyForwardHeaderIfPresent(requestHeaders, source, \"cookie\");\n copyForwardHeaderIfPresent(requestHeaders, source, \"authorization\");\n copyNormalizedHeader(requestHeaders, source, \"x-request-id\", \"x-request-id\", \"x-mnote-request-id\");\n copyNormalizedHeader(requestHeaders, source, \"x-mnote-request-id\", \"x-mnote-request-id\", \"x-request-id\");\n copyNormalizedHeader(requestHeaders, source, \"x-trace-id\", \"x-trace-id\", \"x-mnote-trace-id\");\n copyNormalizedHeader(requestHeaders, source, \"x-mnote-trace-id\", \"x-mnote-trace-id\", \"x-trace-id\");\n copyNormalizedHeader(requestHeaders, source, \"x-session-id\", \"x-session-id\", \"x-mnote-session-id\");\n copyNormalizedHeader(requestHeaders, source, \"x-mnote-session-id\", \"x-mnote-session-id\", \"x-session-id\");\n copyNormalizedHeader(requestHeaders, source, \"x-source-channel\", \"x-source-channel\", \"x-mnote-source-channel\");\n copyNormalizedHeader(requestHeaders, source, \"x-mnote-source-channel\", \"x-mnote-source-channel\", \"x-source-channel\");\n copyNormalizedHeader(requestHeaders, source, \"x-source-client\", \"x-source-client\", \"x-mnote-source-client\");\n copyNormalizedHeader(requestHeaders, source, \"x-mnote-source-client\", \"x-mnote-source-client\", \"x-source-client\");\n copyForwardHeaderIfPresent(requestHeaders, source, \"user-agent\");\n return requestHeaders;\n}\n\ntype RustPageAggregateSnapshotResponse = {\n ok?: boolean;\n schema?: string;\n result?: unknown;\n requestId?: string | null;\n traceId?: string | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\";\n}\n\nfunction isBoolean(value: unknown) {\n return typeof value === \"boolean\";\n}\n\nfunction isNullableNumber(value: unknown) {\n return value === null || typeof value === \"number\";\n}\n\nfunction isNullableString(value: unknown) {\n return value === null || typeof value === \"string\";\n}\n\nfunction isTrustedMnoteWebInternalUrl(raw: string) {\n try {\n const url = new URL(raw);\n const hostname = url.hostname.replace(/^\\[(.*)\\]$/, \"$1\").trim().toLowerCase();\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"0.0.0.0\" ||\n hostname === \"::\"\n );","v":"1W6PPGWErzy95Ae+p9mPvZFAiD0UaI292ug+vUrPAz2TAR89iIGdvUR7mL00bkw9Tq7sPcPu8btMSXy7AQSqO2E737viHxG98tIZPYuvjDyHXQU94MfevCLGgTzMtHm9Gf9iPdDMi7tO8k88Obx1PWHuSr19ez49waDOvFBGMDsTjwg97BWyu9YWtL3M6oy8m9ZJudUwuLtCfJ+8HZf9vBZN2zvYn8u7CtSOPOYvXb2670s9g3XIvADB/D1eTME97JqMPc9fgr1o8s+8qjwHvFp8zjxyqza9mNIBPh+1az3Ht3e80/25POyT+LywO0A8WgeJPVdUZD02HOO8f69UPQkpQD2M5v282qtkvQxxcD1m6rW8OUcOPfMVPT0RzZ88vZ5VvbzBnjv0UOu8sZrIPFkSHLzyrDe9gMNPvWWM6jxzZpk83ZVQPKkuaD3A77E6iDjlPNxn+ruNaYk8aYNzO1LgCTr+P2o9+64gPLbxYjnA1Q49jJIpvQ0AFr2mjyU8MBy7vKuULzwKlrQ7i0YuvCdzpDziFtE8F5LrO0Gwx7wuB2O8sUdrPSWCUj3qiAo8kc10vPL0C73PP4C8bF9RPdcqrbvK1Ym83D9MPNf7J70naf48Sfzuuq/rVTxUrAY93zsSvZ2qBL1EYdU7Hg9HPVCDGD1HR6y7GdIqvXxONz0sllE7IkyYveeNjb38QQG9AoPXvFrR2zyKdTk8po2zOqTCDL1Mc4q8duC5vI+ZIjpDGtQ7wkWWPPvg17wf6oC8FYmiPGmWML2u/Io8OPI5vaSDtrp+SZ47m7ydPLuY1TwUOb48odDKO2tKSD3XK3q9n5EcPRUZRLyXU8Y8uUBHvA00QD2AWp88s+KMO8svZTznuKw8NqoQvIN7Jj09jBA9elu+O3KQezyQShO91XjLvPJmi7yIw7+8hy/MvNVvlTsmXKA7bCvMvKOpKz361+S7wz/0PKyUpL37XVc9uBG2PPUWlrpSdYG8J/WUu2ypi73bWLW6VQPtvIObfr2igz29iWDlvPZuAD0+6Bi8KQWVvZlnpDwrTZE7IDmEPYcrILyeZIG7IgbBPKbKBT0q8sw8N566vfJ+5zxcBty85sNMPRQz1LwEYAu9J4qGPVL4Ib03+gW9f2eyPE2Z5bxbI8q80kbpOeenl7yoz6C9iArIPCRpAT0Dqoa8xMBLPYlhArxLIVc9vw7mPNylU70iWaW7XVmHPExP5ztI44s7sdCLvSlyijse5TA8znamOWORqT3zFxQ9i8DMPA2xMj35BJ47ytMGO6D1AT0NgqI8qNOAPOnWHr01F9y7NkrKvC04XL1lzYS7MjcdPafNzbx9k5S8nMOMPIZeBD3nlZu8PJOwvaSm9LxlsRe9Lg9jvTu+wLzYAf87uu/KvLv9OD2NM5e83C6CvGPMFr183E28MtozPF
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-loader.ts","s":97,"e":156,"m":1778334631652.6506,"t":"function isTrustedMnoteWebInternalUrl(raw: string) {\n try {\n const url = new URL(raw);\n const hostname = url.hostname.replace(/^\\[(.*)\\]$/, \"$1\").trim().toLowerCase();\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"0.0.0.0\" ||\n hostname === \"::\"\n );\n } catch {\n return false;\n }\n}\n\nfunction isRustPageAggregateProjection(\n value: unknown,\n input: { documentId: string; workspaceId?: string | null },\n): value is PageAggregateProjection {\n if (!isRecord(value)) return false;\n const record = value as Record<string, unknown>;\n const identity = isRecord(record.identity) ? record.identity : null;\n const head = isRecord(record.head) ? record.head : null;\n const permissions = head && isRecord(head.permissions) ? head.permissions : null;\n const layout = isRecord(record.layout) ? record.layout : null;\n const pageOptions = layout && isRecord(layout.pageOptions) ? layout.pageOptions : null;\n const body = isRecord(record.body) ? record.body : null;\n const tree = isRecord(record.tree) ? record.tree : null;\n const stats = isRecord(record.stats) ? record.stats : null;\n const requestedWorkspaceId = input.workspaceId?.trim() || null;\n return (\n record.schema === \"mnote.page_aggregate.v1\" &&\n typeof record.projectionVersion === \"number\" &&\n typeof record.source === \"string\" &&\n Boolean(identity) &&\n identity.documentId === input.documentId &&\n typeof identity.workspaceId === \"string\" &&\n (!requestedWorkspaceId || identity.workspaceId === requestedWorkspaceId) &&\n Boolean(head) &&\n typeof head.title === \"string\" &&\n isNullableString(head.updatedAt) &&\n Boolean(permissions) &&\n isBoolean(permissions.readOnly) &&\n isBoolean(permissions.disableDownload) &&\n isBoolean(permissions.disableCopy) &&\n Boolean(layout) &&\n Boolean(pageOptions) &&\n Boolean(body) &&\n \"content\" in body &&\n isNullableNumber(body.revision) &&\n isNullableString(body.conflictDetectionKey) &&\n Boolean(tree) &&\n Object.prototype.hasOwnProperty.call(tree, \"pageSubtree\") &&\n Boolean(stats) &&\n typeof stats.wordCount === \"number\" &&\n typeof stats.characterCount === \"number\" &&\n typeof stats.blockCount === \"number\" &&\n typeof stats.todoTotal === \"number\" &&","v":"LzTfPONK47yuLgu+7PeevRSRfT16CFC961kHvaEnTz0BRKU6jcC5vZysPr0j/CM94fW6PRFOwLxz7am6LPFRvVqzmTz8kjW9UVPkOnS1Gbw6lZ+6us6zPM2hCT1GBqu7WcucPVIEhLvI9x48+FMIPQ8Ztbw0EuM8yK+yvCE7VDxxh0E9OjXcPPyWzL38cFG8HYI5PFZa/Lwu4S08gdXLvAhIvzyh9mk61PG3vI7wQbynEMc89M04vRZCjT0MhUg9H6ewPcL4LL1tYcC8owmJOwGEfD0UuDS906O0PVI4oTyxDLy8AaOyOz2r1breKas8eaRkPYgPDT0Z7uy8Z7bYPbNYaz1d5Sy9MjQavXDNST0B2ig9NGdLuxe3pDxp9XU8KAZcvZNfAb27JbC88hcUPf/6Wryb9sW86QgBvWDKSD35zIu8lm7BvO3mMT2p2j09IjkRPURCP72C0ms7k1+qO646O7wjH7k9WTczPd7rtTvUurI8M08PvZbv9Ly3ghk9zKC2vK9PBz2QHwa9ePQTPR96/jtN06s7sXQ3PRZgUbzHnLo7ePGQPeVIBT3n0No8HFq7vGH4Ir19Kge9qJ+6PYTTyDzzdre8DI5ZPZ10K70BGyw9In9AvEJFh7zDnIQ8X2KzvKblu7sdqKY7FQ4ePWi/mDwjAGk85VwvvPv+Uj0fkwg9O+PAvR2G1L0Qntu8/AWovG0Nazxc7Tg9dCSGO7Os4rwMlA26WUoEPJB7nbwZ4i89+TytPKcWBb2TWGW9SHoWPYjRFb1CFlk9XphLvcvRlLz/syU9lKbLu9mx87vPe/E6jNDAPC8GiDyNGEO8ZHQNPRxxIr28/ek8PNpvPB5YmzxZZv08ASE6vcT2Zz2AA7U8rJcHvSJ0kTxOsjA9bLSvO5ujBDyiohi9Cfg+vRhgSjtKbDY8kgSTvZxzgrrSasQ8kGgPPIQ7Hz1Ka+68c2WePAOXFr3nI4c920KdvOt3Gb0Lspu8itSAPLOLp7u5bSA8Pg4uvZUUjb1NSkq9oacVvbJ9dzzrVUC8bFWCvU+YkDz1Uy48ZAIsPYxIIL13/8+79jrNvI0PCz1iIt28mCeIvdUthTyH/e688OuaPIUhKL2aOuQ8x34oPQdZRjy+8cY8uv/Ju3MACL3eXw29P72wu41vxbyuNYG9L0KGO04fkzwElyq9eHxdPbXsYD03jBs9hOoGPe4OHb3xBi87VlK7ulKwCb1jU5W8XTP0vaoc2zxy2R49D0iMvMIsEz22De08lHGBPbHyNzxfVUe7P/4AvdyTxjzEYau8RokTPHxppbzqg6u7s3HjvDx94rxqcg67cOr3PII/oTssiBo9OBbYPA2Xjz3/xcs8rwgZvaHNmrz/Er272/QsvDeCfb3gCxY9mqLdvEjs8DypVCi8PoSIvd7HQ71KgXC9k6f4u6wmyjwcv4C72baju62/r7vzdjI8dVKbOaTvUz2/AWw8p0SMPCbYtryw1bG8BU4BuzaID72ma4a8EuApvezO0TzZ8o69xQLJvFWgQjtX0zm9ABRTPGGHabzILT69IWPOPO
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-loader.ts","s":145,"e":204,"m":1778334631652.6506,"t":"Boolean(pageOptions) &&\n Boolean(body) &&\n \"content\" in body &&\n isNullableNumber(body.revision) &&\n isNullableString(body.conflictDetectionKey) &&\n Boolean(tree) &&\n Object.prototype.hasOwnProperty.call(tree, \"pageSubtree\") &&\n Boolean(stats) &&\n typeof stats.wordCount === \"number\" &&\n typeof stats.characterCount === \"number\" &&\n typeof stats.blockCount === \"number\" &&\n typeof stats.todoTotal === \"number\" &&\n typeof stats.todoDone === \"number\"\n );\n}\n\nexport async function loadPageAggregateFromRustSnapshot(input: {\n request: Request;\n documentId: string;\n workspaceId?: string | null;\n}): Promise<LoadedPageAggregate | null> {\n const internalBaseUrl = await resolveMnoteWebInternalUrl();\n if (!isTrustedMnoteWebInternalUrl(internalBaseUrl)) {\n return null;\n }\n const url = new URL(`/api/page-aggregate/${encodeURIComponent(input.documentId)}`, `${internalBaseUrl}/`);\n const workspaceId = input.workspaceId?.trim();\n if (workspaceId) {\n url.searchParams.set(\"workspaceId\", workspaceId);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method: \"GET\",\n headers: buildForwardHeaders(input.request.headers),\n cache: \"no-store\",\n signal: AbortSignal.timeout(RUST_PAGE_AGGREGATE_TIMEOUT_MS),\n });\n } catch {\n return null;\n }\n\n if (!response.ok) {\n return null;\n }\n\n const payload = await response.json().catch(() => null) as RustPageAggregateSnapshotResponse | null;\n const page = payload?.result;\n if (\n payload?.schema !== \"mnote.page_aggregate.v1\" ||\n !isRustPageAggregateProjection(page, input)\n ) {\n return null;\n }\n\n return {\n page,\n bridge: {\n requestId: typeof payload.requestId === \"string\" && payload.requestId.trim() ? payload.requestId : \"unknown\",","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate-loader.ts","s":193,"e":244,"m":1778334631652.6506,"t":"const page = payload?.result;\n if (\n payload?.schema !== \"mnote.page_aggregate.v1\" ||\n !isRustPageAggregateProjection(page, input)\n ) {\n return null;\n }\n\n return {\n page,\n bridge: {\n requestId: typeof payload.requestId === \"string\" && payload.requestId.trim() ? payload.requestId : \"unknown\",\n traceId: typeof payload.traceId === \"string\" && payload.traceId.trim() ? payload.traceId : \"unknown\",\n queryName: \"documents.page.get\",\n },\n };\n}\n\nasync function buildServerBridgeRequest(pathname: string): Promise<Request> {\n const headerList = await headers();\n const requestHeaders = new Headers();\n FORWARDED_REQUEST_HEADERS.forEach((name) => {\n copyForwardHeaderIfPresent(requestHeaders, headerList, name);\n });\n const internalBaseUrl = await resolveMnoteWebInternalUrl();\n\n return new Request(new URL(pathname, `${internalBaseUrl}/`).toString(), {\n method: \"GET\",\n headers: requestHeaders,\n });\n}\n\nexport async function loadPageAggregate(input: {\n request: Request;\n documentId: string;\n workspaceId?: string | null;\n}): Promise<LoadedPageAggregate | null> {\n return loadPageAggregateFromRustSnapshot(input);\n}\n\nexport async function loadPageAggregateFromNextHeaders(input: {\n documentId: string;\n workspaceId?: string | null;\n}): Promise<LoadedPageAggregate | null> {\n const request = await buildServerBridgeRequest(\"/documents/page\");\n return loadPageAggregate({\n request,\n documentId: input.documentId,\n workspaceId: input.workspaceId,\n });\n}","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate.test.ts","s":1,"e":60,"m":1776767538812.7153,"t":"import { describe, expect, it } from \"vitest\";\nimport { buildPageAggregate } from \"@/lib/documents/page-aggregate\";\nimport type { PageOptionsState } from \"@/types/page-options\";\n\nconst pageOptions: PageOptionsState = {\n wideLayout: true,\n smallText: false,\n showHeadingNumbers: true,\n showToc: true,\n showStructure: false,\n protectEditing: false,\n showWordCount: true,\n collapseBacklinks: false,\n pageFont: \"default\",\n layoutDensity: \"normal\",\n hideChildPages: false,\n showBlockRefCount: false,\n embedDefaultBlockId: null,\n};\n\ndescribe(\"page-aggregate\", () => {\n it(\"将页面 route 所需真相收口为统一聚合对象\", () => {\n const aggregate = buildPageAggregate({\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n title: \" 页面标题 \",\n updatedAt: \"2026-04-21T12:00:00.000Z\",\n readOnly: true,\n disableDownload: true,\n disableCopy: false,\n pageOptions,\n content: [{ id: \"block_1\", type: \"paragraph\", content: [] }],\n revision: 7,\n conflictDetectionKey: \"doc_1:7\",\n pageSubtree: null,\n stats: {\n wordCount: 10,\n characterCount: 20,\n blockCount: 1,\n todoTotal: 0,\n todoDone: 0,\n },\n });\n\n expect(aggregate).toEqual({\n identity: {\n documentId: \"doc_1\",\n workspaceId: \"ws_1\",\n },\n head: {\n title: \"页面标题\",\n updatedAt: \"2026-04-21T12:00:00.000Z\",\n permissions: {\n readOnly: true,\n disableDownload: true,\n disableCopy: false,\n },\n },\n layout: {\n pageOptions,","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate.test.ts","s":49,"e":103,"m":1776767538812.7153,"t":"},\n head: {\n title: \"页面标题\",\n updatedAt: \"2026-04-21T12:00:00.000Z\",\n permissions: {\n readOnly: true,\n disableDownload: true,\n disableCopy: false,\n },\n },\n layout: {\n pageOptions,\n },\n body: {\n content: [{ id: \"block_1\", type: \"paragraph\", content: [] }],\n revision: 7,\n conflictDetectionKey: \"doc_1:7\",\n },\n tree: {\n pageSubtree: null,\n },\n stats: {\n wordCount: 10,\n characterCount: 20,\n blockCount: 1,\n todoTotal: 0,\n todoDone: 0,\n },\n });\n });\n\n it(\"缺省标题与可选字段时回退到稳定默认值\", () => {\n const aggregate = buildPageAggregate({\n documentId: \"doc_2\",\n workspaceId: \"ws_2\",\n pageOptions,\n content: null,\n });\n\n expect(aggregate.head.title).toBe(\"无标题\");\n expect(aggregate.head.permissions).toEqual({\n readOnly: false,\n disableDownload: false,\n disableCopy: false,\n });\n expect(aggregate.body).toEqual({\n content: null,\n revision: null,\n conflictDetectionKey: null,\n });\n expect(aggregate.tree.pageSubtree).toBeNull();\n expect(aggregate.stats).toBeNull();\n });\n});","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate.ts","s":1,"e":60,"m":1778301273994.0415,"t":"import type { PageSubtreeProjection } from \"@/lib/documents/page-subtree\";\nimport type { DocumentStats, PageOptionsState } from \"@/types/page-options\";\n\nexport interface PageAggregateIdentity {\n documentId: string;\n workspaceId: string;\n}\n\nexport interface PageAggregatePermissions {\n readOnly: boolean;\n disableDownload: boolean;\n disableCopy: boolean;\n}\n\nexport interface PageAggregateHead {\n title: string;\n updatedAt: string | null;\n permissions: PageAggregatePermissions;\n}\n\nexport interface PageAggregateLayout {\n pageOptions: PageOptionsState;\n}\n\nexport interface PageAggregateBody {\n content: unknown;\n revision: number | null;\n conflictDetectionKey: string | null;\n}\n\nexport interface PageAggregateTree {\n pageSubtree: PageSubtreeProjection | null;\n}\n\nexport interface PageAggregateProjection {\n schema?: \"mnote.page_aggregate.v1\";\n projectionVersion?: number;\n source?: \"KernelProjection\" | \"CompatMetaContentJoin\" | \"Fixture\" | string;\n identity: PageAggregateIdentity;\n head: PageAggregateHead;\n layout: PageAggregateLayout;\n body: PageAggregateBody;\n tree: PageAggregateTree;\n stats: DocumentStats | null;\n}\n\nexport function buildPageAggregate(input: {\n documentId: string;\n workspaceId: string;\n title?: string | null;\n updatedAt?: string | null;\n readOnly?: boolean;\n disableDownload?: boolean;\n disableCopy?: boolean;\n pageOptions: PageOptionsState;\n content: unknown;\n revision?: number | null;\n conflictDetectionKey?: string | null;\n pageSubtree?: PageSubtreeProjection | null;\n stats?: DocumentStats | null;","v":"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
|
|||
|
|
{"p":"wolai-frontend/src/lib/documents/page-aggregate.ts","s":49,"e":90,"m":1778301273994.0415,"t":"workspaceId: string;\n title?: string | null;\n updatedAt?: string | null;\n readOnly?: boolean;\n disableDownload?: boolean;\n disableCopy?: boolean;\n pageOptions: PageOptionsState;\n content: unknown;\n revision?: number | null;\n conflictDetectionKey?: string | null;\n pageSubtree?: PageSubtreeProjection | null;\n stats?: DocumentStats | null;\n}): PageAggregateProjection {\n return {\n identity: {\n documentId: input.documentId,\n workspaceId: input.workspaceId,\n },\n head: {\n title: input.title?.trim() || \"无标题\",\n updatedAt: input.updatedAt ?? null,\n permissions: {\n readOnly: Boolean(input.readOnly),\n disableDownload: Boolean(input.disableDownload),\n disableCopy: Boolean(input.disableCopy),\n },\n },\n layout: {\n pageOptions: input.pageOptions,\n },\n body: {\n content: input.content ?? null,\n revision: input.revision ?? null,\n conflictDetectionKey: input.conflictDetectionKey ?? null,\n },\n tree: {\n pageSubtree: input.pageSubtree ?? null,\n },\n stats: input.stats ?? null,\n };\n}","v":"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
|