Files
ttstd-infinite-canvas/web/package.json
VicoHu 5bda548fe9 fix(canvas): 3D 导演台 - 修复白膜视频导出渲染循环逐帧崩溃 (#439)
导出白膜视频得到的是 0 秒视频:文件实测仅 1 帧(ffprobe
nb_read_frames=1,duration=0.001s),却无任何报错并照常回写画布。

根因:applyClaySceneMaterials 把场景内所有非 actor mesh 的材质换成
clay MeshStandardMaterial,drei Grid 的 GridMaterial(带 uniforms 的
ShaderMaterial)也在其中。Grid 组件内部 useFrame 每帧读取
material.uniforms.worldCamProjPosition,材质被换后 uniforms 为
undefined,渲染循环逐帧抛 TypeError,R3F 不再产出新帧,
captureStream 只录到启动前手动 gl.render 的那一帧;5 秒后
setTimeout 照常 stop,残缺视频被当作成功结果。开启轨迹显示
(drei Line 同为 uniforms 材质)或视口白膜显示模式时同样触发。

修复:
- applyClaySceneMaterials 跳过带 uniforms 的 ShaderMaterial,
  并抽到 lib/canvas/director/director-clay-materials.ts 补回归测试;
- recordCanvas 加固:录制期间监听 window 未捕获错误,首个渲染
  错误立即中止并报错;录制结束用 <video> 探测真实时长(Chrome
  MediaRecorder 的 webm 无时长头,需 seek 到末尾),低于预期一半
  报「时长异常」,杜绝残缺视频再被静默回写。
2026-09-08 16:58:41 +08:00

175 lines
10 KiB
JSON

{
"name": "infinite-canvas",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"build:bridge": "bun ../canvas-agent/scripts/build-comfy-bridge.ts",
"dev": "vite --host 0.0.0.0 --port 3000",
"build": "bun run build:bridge && tsc --noEmit && vite build",
"pretest": "bun test test/tiptap-dependency-versions.test.ts test/admin-ui-regressions.test.ts test/announcement-prompt-regressions.test.ts test/password-reset.test.ts test/oss-settings.test.ts test/channel-model-editor-form.test.ts test/channel-model-price-tier-form.test.ts test/admin-logical-models.test.ts && bun test test/canvas-grid-viewport.test.tsx",
"typecheck": "tsc --noEmit",
"test:canvas": "bun test test/canvas-media-performance.test.ts test/canvas-node-title-interaction.test.ts test/canvas-spatial-index.test.ts",
"test": "bun test test/api-request.test.ts test/video-api-contracts.test.ts test/image-api-contracts.test.ts test/channel-model-catalog.test.ts test/model-pricing.test.ts test/model-protocols.test.ts test/model-capabilities.test.ts test/agent-prompt-cache.test.ts test/canvas-agent-context.test.ts test/canvas-batch-connection.test.ts test/canvas-character-reference.test.ts test/canvas-document.test.ts test/canvas-drawing-engine.test.ts test/canvas-emotion-edit-plan.test.ts test/canvas-extension-nodes.test.ts test/canvas-folder.test.ts test/canvas-generation-layout.test.ts test/canvas-generation-submission.test.ts test/canvas-image-batch-retry.test.ts test/canvas-keyboard.test.ts test/canvas-node-generation-mentions.test.ts test/canvas-node-search.test.ts test/canvas-leafer-viewport.test.ts test/canvas-media-download.test.ts test/canvas-local-runtime.test.ts test/canvas-model-policy.test.ts test/canvas-resource-mention-editor.test.ts test/canvas-resource-references.test.ts test/canvas-storyboard-assets.test.ts test/canvas-storyboard-references.test.ts test/canvas-node-config-reset.test.ts test/canvas-node-registry.test.ts test/canvas-video-frame.test.ts test/canvas-video-regeneration.test.ts test/canvas-video-timeline-segments.test.ts test/create-canvas-handoff.test.ts test/create-library-button.test.ts test/creation-references.test.ts test/director-transform-semantics.test.ts test/director-bone-precedence.test.ts test/director-clay-materials.test.ts test/director-gesture-transaction.test.ts test/director-transaction-lifecycle.test.ts test/director-session-authority.test.ts test/director-placement.test.ts test/director-resources.test.ts test/director-recovery.test.ts test/director-node-preview.test.ts test/generation-asset-repository.node.test.ts test/generation-storage-consistency.test.ts test/generation-task-durability.node.test.ts test/generation-task-local.test.ts test/generation-task-materializer.test.ts test/task-media-fallback.test.ts test/user-scoped-generation-persistence.test.ts test/local-channel-permission.test.ts test/local-channel-runtime-projection.node.test.mjs test/local-channel-task-center.node.test.mjs test/local-channel-ui.node.test.mjs test/local-cli-settings.test.ts test/local-dreamina-cli.test.ts test/local-dreamina-generation.test.ts test/local-dreamina-model-catalog.test.ts test/local-runtime-bootstrap.test.ts test/local-runtime-connection.test.ts test/local-runtime.test.ts test/client-id.test.ts test/grok-image-prompt-limit.test.ts test/image-resolution-tiers.test.ts test/gemini-image.test.ts test/libtv-import.test.ts test/timeline-to-ffmpeg.test.ts test/canvas-video-segment-args.test.ts test/tapnow-import.test.ts test/prompt-optimizer-drawer.test.ts test/director-save-coordinator.test.ts test/director-save-wiring.test.ts test/director-diagnostics.test.ts test/director-repro-runtime.test.ts test/director-diagnostics-recorder.test.ts test/director-keyframe-editing.test.ts test/director-shortcuts.test.ts test/director-keyframe-delete-wiring.test.ts test/director-templates.test.ts test/director-modes.test.ts test/director-template-mode-wiring.test.ts test/director-view-modes.test.ts && bun test test/local-dreamina-cross-runtime.test.ts",
"test:director:e2e": "bun scripts/director-p0-chrome-e2e.mjs",
"start": "vite preview --host 0.0.0.0 --port 3000",
"format": "prettier --write .",
"format:check": "prettier --check ."
},
"dependencies": {
"@ant-design/icons": "^6.3.2",
"@ant-design/x": "^2.9.0",
"@codemirror/lang-json": "^6.0.2",
"@excalidraw/excalidraw": "0.18.1",
"@ffmpeg/core": "0.12.10",
"@ffmpeg/ffmpeg": "^0.12.15",
"@ffmpeg/util": "^0.12.2",
"@fontsource-variable/inter": "^5.3.0",
"@fontsource-variable/jetbrains-mono": "^5.3.0",
"@lobehub/icons": "5.16.0",
"@mediapipe/tasks-vision": "^1.0.1",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
"@streamdown/code": "^1.1.1",
"@tanstack/react-query": "^5.101.2",
"@tanstack/react-virtual": "^3.14.8",
"@tiptap/core": "3.28.0",
"@tiptap/extension-character-count": "3.28.0",
"@tiptap/extension-color": "3.28.0",
"@tiptap/extension-highlight": "3.28.0",
"@tiptap/extension-placeholder": "3.28.0",
"@tiptap/extension-text-align": "3.28.0",
"@tiptap/extension-text-style": "3.28.0",
"@tiptap/extensions": "3.28.0",
"@tiptap/pm": "3.28.0",
"@tiptap/react": "3.28.0",
"@tiptap/starter-kit": "3.28.0",
"@uiw/react-codemirror": "^4.25.11",
"@vidstack/react": "1.15.6",
"antd": "^6.5.1",
"axios": "^1.18.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"copy-to-clipboard": "^4.0.2",
"dayjs": "^1.11.21",
"fflate": "^0.8.3",
"file-saver": "^2.0.5",
"idb": "8.0.3",
"json-canonicalize": "2.0.0",
"leafer-ui": "^2.2.7",
"localforage": "^1.10.0",
"lucide-react": "^1.25.0",
"mammoth": "^1.12.0",
"motion": "^12.42.2",
"nanoid": "^6.0.0",
"react": "19.2.7",
"react-aria-components": "^1.21.1",
"react-dom": "19.2.7",
"react-markdown": "^10.1.0",
"react-router": "^8.2.0",
"recharts": "^3.9.2",
"remark-gfm": "^4.0.1",
"shadcn": "^4.13.1",
"streamdown": "^2.5.0",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.3.3",
"three": "^0.185.1",
"three-stdlib": "^2.36.1",
"tldraw": "5.2.5",
"tw-animate-css": "^1.4.0",
"zustand": "^5.0.14"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.3.3",
"@types/file-saver": "^2.0.7",
"@types/node": "^20.19.43",
"@types/react": "19.2.17",
"@types/react-dom": "19.2.3",
"@types/three": "0.185.4",
"@vitejs/plugin-react": "^6.0.3",
"prettier": "^3.9.5",
"typescript": "^7.0.2",
"vite": "^8.1.5"
},
"overrides": {
"@babel/core": "7.29.7",
"form-data": "4.0.6",
"hono": "4.12.30",
"js-yaml": "4.3.0",
"prismjs": "1.30.0",
"qs": "6.15.3",
"@tiptap/core": "3.28.0",
"@tiptap/extension-blockquote": "3.28.0",
"@tiptap/extension-bold": "3.28.0",
"@tiptap/extension-bubble-menu": "3.28.0",
"@tiptap/extension-bullet-list": "3.28.0",
"@tiptap/extension-character-count": "3.28.0",
"@tiptap/extension-code": "3.28.0",
"@tiptap/extension-code-block": "3.28.0",
"@tiptap/extension-color": "3.28.0",
"@tiptap/extension-document": "3.28.0",
"@tiptap/extension-dropcursor": "3.28.0",
"@tiptap/extension-floating-menu": "3.28.0",
"@tiptap/extension-gapcursor": "3.28.0",
"@tiptap/extension-hard-break": "3.28.0",
"@tiptap/extension-heading": "3.28.0",
"@tiptap/extension-highlight": "3.28.0",
"@tiptap/extension-horizontal-rule": "3.28.0",
"@tiptap/extension-italic": "3.28.0",
"@tiptap/extension-link": "3.28.0",
"@tiptap/extension-list": "3.28.0",
"@tiptap/extension-list-item": "3.28.0",
"@tiptap/extension-list-keymap": "3.28.0",
"@tiptap/extension-ordered-list": "3.28.0",
"@tiptap/extension-paragraph": "3.28.0",
"@tiptap/extension-placeholder": "3.28.0",
"@tiptap/extension-strike": "3.28.0",
"@tiptap/extension-text": "3.28.0",
"@tiptap/extension-text-align": "3.28.0",
"@tiptap/extension-text-style": "3.28.0",
"@tiptap/extension-underline": "3.28.0",
"@tiptap/extensions": "3.28.0",
"@tiptap/pm": "3.28.0",
"@tiptap/react": "3.28.0",
"@tiptap/starter-kit": "3.28.0"
},
"pnpm": {
"overrides": {
"@tiptap/core": "3.28.0",
"@tiptap/extension-blockquote": "3.28.0",
"@tiptap/extension-bold": "3.28.0",
"@tiptap/extension-bubble-menu": "3.28.0",
"@tiptap/extension-bullet-list": "3.28.0",
"@tiptap/extension-character-count": "3.28.0",
"@tiptap/extension-code": "3.28.0",
"@tiptap/extension-code-block": "3.28.0",
"@tiptap/extension-color": "3.28.0",
"@tiptap/extension-document": "3.28.0",
"@tiptap/extension-dropcursor": "3.28.0",
"@tiptap/extension-floating-menu": "3.28.0",
"@tiptap/extension-gapcursor": "3.28.0",
"@tiptap/extension-hard-break": "3.28.0",
"@tiptap/extension-heading": "3.28.0",
"@tiptap/extension-highlight": "3.28.0",
"@tiptap/extension-horizontal-rule": "3.28.0",
"@tiptap/extension-italic": "3.28.0",
"@tiptap/extension-link": "3.28.0",
"@tiptap/extension-list": "3.28.0",
"@tiptap/extension-list-item": "3.28.0",
"@tiptap/extension-list-keymap": "3.28.0",
"@tiptap/extension-ordered-list": "3.28.0",
"@tiptap/extension-paragraph": "3.28.0",
"@tiptap/extension-placeholder": "3.28.0",
"@tiptap/extension-strike": "3.28.0",
"@tiptap/extension-text": "3.28.0",
"@tiptap/extension-text-align": "3.28.0",
"@tiptap/extension-text-style": "3.28.0",
"@tiptap/extension-underline": "3.28.0",
"@tiptap/extensions": "3.28.0",
"@tiptap/pm": "3.28.0",
"@tiptap/react": "3.28.0",
"@tiptap/starter-kit": "3.28.0"
}
}
}