From f13b4e8909151ff24ee6e847ad9010f642cbbf75 Mon Sep 17 00:00:00 2001 From: 134 Date: Tue, 28 Jul 2026 15:33:04 +0800 Subject: [PATCH] feat: add Claw video uploads and complete video canvas workflows --- .gitignore | 6 + .../video-canvas-settings-client.tsx | 3643 ++- app/(chat)/api/chat/route.ts | 119 +- app/(chat)/api/files/direct-upload/route.ts | 42 +- app/(chat)/api/files/upload/route.ts | 296 +- app/api/canvas/[id]/route.ts | 57 +- app/api/canvas/[id]/video-workspace/route.ts | 266 + app/api/canvas/audio-source/route.ts | 16 + app/api/canvas/clawd-chat/route.ts | 83 +- app/api/canvas/generate/image/route.ts | 11 + app/api/canvas/generate/video/route.ts | 214 +- app/api/canvas/video-source/route.ts | 16 + app/api/canvas/workflow/analyze/route.ts | 236 +- .../client-performance/agent-style/route.ts | 6 +- app/api/pick-object/route.ts | 103 +- app/api/user/account-center/route.ts | 16 +- app/api/user/membership-summary/route.ts | 30 +- app/api/video-canvas/assets/route.ts | 267 + .../video-canvas/director-ai-import/route.ts | 309 + .../video-canvas/director-captures/route.ts | 113 + app/api/video-canvas/effects/search/route.ts | 56 + app/api/video-canvas/history-assets/route.ts | 153 + app/api/video-canvas/prompt-tools/route.ts | 226 + .../subjects/complete-views/route.ts | 226 + .../subjects/generate-description/route.ts | 274 + app/api/video-canvas/subjects/route.ts | 569 + app/canvas/[id]/CanvasPageClientRouter.tsx | 5 +- .../agents/AgentGenerationWorkspaceDarkV2.tsx | 70 +- .../use-agent-style-performance-monitor.ts | 8 +- components/canvas/CanvasChatPanel.tsx | 953 +- .../canvas/LiblibVideoCanvasReplica.tsx | 19419 +++++++++++++--- ...VideoCanvasStoryboardCompositionEditor.tsx | 947 + .../canvas/chat-panel/canvas-chat-session.ts | 5 + components/elements/response.tsx | 10 +- components/home/lovart-home.tsx | 2 + components/home/lovart/lovart-sidebar.tsx | 24 +- components/video-params-bar.tsx | 2 +- docs/storyai-director-desk-integration.md | 60 + docs/video-canvas-official-function-map.md | 848 +- .../策划Skill系统化功能开发文档-2026-07-21.md | 980 + lib/ai/krea-models.ts | 34 + lib/ai/providers/krea.ts | 28 +- lib/ai/qwen3-vl.ts | 9 +- lib/ai/tools/generate-video.ts | 160 +- lib/ai/video-tool-capability.ts | 11 +- lib/canvas/arrange.ts | 315 + lib/canvas/asset-manager.ts | 34 + lib/canvas/grid-snap.ts | 28 + lib/canvas/grouping.ts | 381 + lib/canvas/pan.ts | 13 + lib/canvas/project-title.ts | 16 + lib/canvas/shortcut-help.ts | 67 + lib/canvas/video-reference-selection.ts | 89 + lib/canvas/video-workspace.ts | 177 + lib/canvas/zoom.ts | 27 + lib/client/upload-with-retry.ts | 18 +- lib/home/sidebar-auth.ts | 19 + lib/openclaw-chat/media-attachments.ts | 183 + lib/points/feature-charge.ts | 8 +- lib/storage/content-type.ts | 48 + lib/storage/service.ts | 66 +- lib/video-canvas/audio-processing.ts | 117 + lib/video-canvas/audio-source-proxy.ts | 171 + lib/video-canvas/audio-tools.ts | 61 + lib/video-canvas/config.ts | 1742 +- lib/video-canvas/director-camera-presets.ts | 26 + lib/video-canvas/director-pose-presets.ts | 414 + lib/video-canvas/director-project.ts | 174 + lib/video-canvas/history-assets.ts | 427 + lib/video-canvas/local-image-input.ts | 64 + lib/video-canvas/node-creation.ts | 226 + lib/video-canvas/prompt-structure.ts | 159 + lib/video-canvas/smart-storyboard.ts | 209 + .../storyboard-composition-render.ts | 353 + lib/video-canvas/storyboard-composition.ts | 223 + lib/video-canvas/storyboard-overview.ts | 595 + lib/video-canvas/storyboard-reference.ts | 90 + lib/video-canvas/subjects.ts | 324 + lib/video-canvas/subtitle-erase.ts | 242 + lib/video-canvas/toolbox-workflows.ts | 426 + lib/video-canvas/tutorial-support.ts | 61 + lib/video-canvas/uploaded-resource.ts | 51 + lib/video-canvas/video-advanced-settings.ts | 51 + lib/video-canvas/video-analysis.ts | 106 + lib/video-canvas/video-audio-separation.ts | 252 + lib/video-canvas/video-clip.ts | 38 + lib/video-canvas/video-crop.ts | 91 + lib/video-canvas/video-download.ts | 101 + lib/video-canvas/video-effects.ts | 164 + lib/video-canvas/video-frame-extraction.ts | 26 + .../video-generation-parameters.ts | 347 + lib/video-canvas/video-hd.ts | 105 + lib/video-canvas/video-marks.ts | 23 + lib/video-canvas/video-model-catalog.ts | 505 + lib/video-canvas/video-motion.ts | 63 + lib/video-canvas/video-processing.ts | 772 + lib/video-canvas/video-roles.ts | 135 + next-env.d.ts | 2 +- package.json | 3 + patches/storyai-3d-director-desk-local.patch | 16546 +++++++++++++ playwright.helpers.config.ts | 40 + pnpm-lock.yaml | 3 + proxy.ts | 23 + public/vendor/storyai-director/LICENSE | 21 + .../vendor/storyai-director/SOURCE-NOTICE.md | 9 + .../storyai-director/assets/index-B9KngG3o.js | 16843 ++++++++++++++ .../assets/index-DKqru0Sb.css | 1 + public/vendor/storyai-director/index.html | 22 + scripts/local-video-canvas/README.md | 63 + scripts/local-video-canvas/start-db.mjs | 38 + scripts/local-video-canvas/sync-config.ts | 397 + services/canvas/index.ts | 75 + tests/routes/canvas-arrange.test.ts | 77 + tests/routes/canvas-asset-manager.test.ts | 33 + tests/routes/canvas-grid-snap.test.ts | 32 + tests/routes/canvas-grouping.test.ts | 363 + tests/routes/canvas-pan.test.ts | 42 + tests/routes/canvas-project-title.test.ts | 28 + tests/routes/canvas-shortcut-help.test.ts | 72 + tests/routes/canvas-zoom.test.ts | 26 + tests/routes/home-sidebar-auth.test.ts | 42 + .../openclaw-markdown-table-layout.test.ts | 28 + .../routes/openclaw-video-attachments.test.ts | 92 + tests/routes/video-advanced-settings.test.ts | 53 + tests/routes/video-analysis-tools.test.ts | 55 + tests/routes/video-audio-reference.test.ts | 60 + .../video-audio-separation-tools.test.ts | 118 + tests/routes/video-audio-source-route.test.ts | 85 + tests/routes/video-audio-tools.test.ts | 51 + tests/routes/video-canvas-config.test.ts | 463 + tests/routes/video-clip-tools.test.ts | 25 + tests/routes/video-crop-tools.test.ts | 43 + tests/routes/video-director-project.test.ts | 93 + tests/routes/video-download-tools.test.ts | 44 + tests/routes/video-effects.test.ts | 68 + .../video-frame-extraction-tools.test.ts | 22 + .../video-generation-parameters.test.ts | 175 + tests/routes/video-hd-tools.test.ts | 41 + tests/routes/video-history-assets.test.ts | 172 + tests/routes/video-mark-prompt.test.ts | 20 + tests/routes/video-mark-tools.test.ts | 67 + tests/routes/video-model-catalog.test.ts | 155 + tests/routes/video-motion.test.ts | 111 + tests/routes/video-node-creation.test.ts | 196 + tests/routes/video-prompt-structure.test.ts | 75 + .../routes/video-reference-selection.test.ts | 103 + tests/routes/video-roles.test.ts | 65 + tests/routes/video-smart-storyboard.test.ts | 163 + .../routes/video-storyboard-overview.test.ts | 580 + tests/routes/video-subject-library.test.ts | 172 + .../routes/video-subtitle-erase-tools.test.ts | 80 + tests/routes/video-toolbox-workflows.test.ts | 144 + tests/routes/video-workspace-canvases.test.ts | 132 + tsconfig.json | 17 +- types/ai.ts | 7 +- types/video-tool-capability.ts | 2 +- 156 files changed, 76383 insertions(+), 3546 deletions(-) create mode 100644 app/api/canvas/[id]/video-workspace/route.ts create mode 100644 app/api/canvas/audio-source/route.ts create mode 100644 app/api/canvas/video-source/route.ts create mode 100644 app/api/video-canvas/assets/route.ts create mode 100644 app/api/video-canvas/director-ai-import/route.ts create mode 100644 app/api/video-canvas/director-captures/route.ts create mode 100644 app/api/video-canvas/effects/search/route.ts create mode 100644 app/api/video-canvas/history-assets/route.ts create mode 100644 app/api/video-canvas/prompt-tools/route.ts create mode 100644 app/api/video-canvas/subjects/complete-views/route.ts create mode 100644 app/api/video-canvas/subjects/generate-description/route.ts create mode 100644 app/api/video-canvas/subjects/route.ts create mode 100644 components/canvas/VideoCanvasStoryboardCompositionEditor.tsx create mode 100644 docs/storyai-director-desk-integration.md create mode 100644 docs/策划Skill系统化功能开发文档-2026-07-21.md create mode 100644 lib/canvas/arrange.ts create mode 100644 lib/canvas/asset-manager.ts create mode 100644 lib/canvas/grid-snap.ts create mode 100644 lib/canvas/grouping.ts create mode 100644 lib/canvas/pan.ts create mode 100644 lib/canvas/project-title.ts create mode 100644 lib/canvas/shortcut-help.ts create mode 100644 lib/canvas/video-reference-selection.ts create mode 100644 lib/canvas/video-workspace.ts create mode 100644 lib/canvas/zoom.ts create mode 100644 lib/home/sidebar-auth.ts create mode 100644 lib/openclaw-chat/media-attachments.ts create mode 100644 lib/storage/content-type.ts create mode 100644 lib/video-canvas/audio-processing.ts create mode 100644 lib/video-canvas/audio-source-proxy.ts create mode 100644 lib/video-canvas/audio-tools.ts create mode 100644 lib/video-canvas/director-camera-presets.ts create mode 100644 lib/video-canvas/director-pose-presets.ts create mode 100644 lib/video-canvas/director-project.ts create mode 100644 lib/video-canvas/history-assets.ts create mode 100644 lib/video-canvas/local-image-input.ts create mode 100644 lib/video-canvas/node-creation.ts create mode 100644 lib/video-canvas/prompt-structure.ts create mode 100644 lib/video-canvas/smart-storyboard.ts create mode 100644 lib/video-canvas/storyboard-composition-render.ts create mode 100644 lib/video-canvas/storyboard-composition.ts create mode 100644 lib/video-canvas/storyboard-overview.ts create mode 100644 lib/video-canvas/storyboard-reference.ts create mode 100644 lib/video-canvas/subjects.ts create mode 100644 lib/video-canvas/subtitle-erase.ts create mode 100644 lib/video-canvas/toolbox-workflows.ts create mode 100644 lib/video-canvas/tutorial-support.ts create mode 100644 lib/video-canvas/uploaded-resource.ts create mode 100644 lib/video-canvas/video-advanced-settings.ts create mode 100644 lib/video-canvas/video-analysis.ts create mode 100644 lib/video-canvas/video-audio-separation.ts create mode 100644 lib/video-canvas/video-clip.ts create mode 100644 lib/video-canvas/video-crop.ts create mode 100644 lib/video-canvas/video-download.ts create mode 100644 lib/video-canvas/video-effects.ts create mode 100644 lib/video-canvas/video-frame-extraction.ts create mode 100644 lib/video-canvas/video-generation-parameters.ts create mode 100644 lib/video-canvas/video-hd.ts create mode 100644 lib/video-canvas/video-marks.ts create mode 100644 lib/video-canvas/video-model-catalog.ts create mode 100644 lib/video-canvas/video-motion.ts create mode 100644 lib/video-canvas/video-processing.ts create mode 100644 lib/video-canvas/video-roles.ts create mode 100644 patches/storyai-3d-director-desk-local.patch create mode 100644 public/vendor/storyai-director/LICENSE create mode 100644 public/vendor/storyai-director/SOURCE-NOTICE.md create mode 100644 public/vendor/storyai-director/assets/index-B9KngG3o.js create mode 100644 public/vendor/storyai-director/assets/index-DKqru0Sb.css create mode 100644 public/vendor/storyai-director/index.html create mode 100644 scripts/local-video-canvas/README.md create mode 100644 scripts/local-video-canvas/start-db.mjs create mode 100644 scripts/local-video-canvas/sync-config.ts create mode 100644 tests/routes/canvas-arrange.test.ts create mode 100644 tests/routes/canvas-asset-manager.test.ts create mode 100644 tests/routes/canvas-grid-snap.test.ts create mode 100644 tests/routes/canvas-grouping.test.ts create mode 100644 tests/routes/canvas-pan.test.ts create mode 100644 tests/routes/canvas-project-title.test.ts create mode 100644 tests/routes/canvas-shortcut-help.test.ts create mode 100644 tests/routes/canvas-zoom.test.ts create mode 100644 tests/routes/home-sidebar-auth.test.ts create mode 100644 tests/routes/openclaw-markdown-table-layout.test.ts create mode 100644 tests/routes/openclaw-video-attachments.test.ts create mode 100644 tests/routes/video-advanced-settings.test.ts create mode 100644 tests/routes/video-analysis-tools.test.ts create mode 100644 tests/routes/video-audio-reference.test.ts create mode 100644 tests/routes/video-audio-separation-tools.test.ts create mode 100644 tests/routes/video-audio-source-route.test.ts create mode 100644 tests/routes/video-audio-tools.test.ts create mode 100644 tests/routes/video-canvas-config.test.ts create mode 100644 tests/routes/video-clip-tools.test.ts create mode 100644 tests/routes/video-crop-tools.test.ts create mode 100644 tests/routes/video-director-project.test.ts create mode 100644 tests/routes/video-download-tools.test.ts create mode 100644 tests/routes/video-effects.test.ts create mode 100644 tests/routes/video-frame-extraction-tools.test.ts create mode 100644 tests/routes/video-generation-parameters.test.ts create mode 100644 tests/routes/video-hd-tools.test.ts create mode 100644 tests/routes/video-history-assets.test.ts create mode 100644 tests/routes/video-mark-prompt.test.ts create mode 100644 tests/routes/video-mark-tools.test.ts create mode 100644 tests/routes/video-model-catalog.test.ts create mode 100644 tests/routes/video-motion.test.ts create mode 100644 tests/routes/video-node-creation.test.ts create mode 100644 tests/routes/video-prompt-structure.test.ts create mode 100644 tests/routes/video-reference-selection.test.ts create mode 100644 tests/routes/video-roles.test.ts create mode 100644 tests/routes/video-smart-storyboard.test.ts create mode 100644 tests/routes/video-storyboard-overview.test.ts create mode 100644 tests/routes/video-subject-library.test.ts create mode 100644 tests/routes/video-subtitle-erase-tools.test.ts create mode 100644 tests/routes/video-toolbox-workflows.test.ts create mode 100644 tests/routes/video-workspace-canvases.test.ts diff --git a/.gitignore b/.gitignore index b3707d084..36e9689b0 100644 --- a/.gitignore +++ b/.gitignore @@ -87,6 +87,12 @@ checkpoints/ # 第三方参考源码(不提交到git) reference-sources/ +# Development-only upload fallback. +public/uploads/local/ + +# Local isolated database and video-canvas test fixtures. +.local/ + # Local self-hosted Pascal Editor checkout. .pascal-editor/ diff --git a/app/(admin)/settings/video-canvas/video-canvas-settings-client.tsx b/app/(admin)/settings/video-canvas/video-canvas-settings-client.tsx index c79fba2c7..98ddda963 100644 --- a/app/(admin)/settings/video-canvas/video-canvas-settings-client.tsx +++ b/app/(admin)/settings/video-canvas/video-canvas-settings-client.tsx @@ -35,11 +35,30 @@ import { type VideoCanvasFunctionDefinition, type VideoCanvasEffectPreset, type VideoCanvasMotionPreset, + type VideoCanvasReferenceBehavior, + type VideoCanvasReferenceModelRule, type VideoCanvasRolePreset, + type VideoCanvasSubjectVoicePreset, VIDEO_CANVAS_FUNCTION_CONFIG_KEY, defaultVideoCanvasFunctionConfig, normalizeVideoCanvasFunctionConfig, } from "@/lib/video-canvas/config"; +import { + VIDEO_CANVAS_HISTORY_PICKER_MEDIA_LABELS, + VIDEO_CANVAS_HISTORY_PICKER_MEDIA_MODES, + VIDEO_CANVAS_HISTORY_ZOOM_LEVELS, + type VideoCanvasHistoryPickerMediaMode, + type VideoCanvasHistoryZoomPercent, +} from "@/lib/video-canvas/history-assets"; +import type { VideoHdResolution } from "@/lib/video-canvas/video-hd"; +import { + VIDEO_CANVAS_MODEL_ICON_KEYS, + type VideoCanvasModelCatalogEntry, +} from "@/lib/video-canvas/video-model-catalog"; +import type { + VideoCanvasToolboxConfig, + VideoCanvasToolboxTemplate, +} from "@/lib/video-canvas/toolbox-workflows"; type SettingsResponse = { setting?: { @@ -184,6 +203,735 @@ function ModelSelect({ ); } +function DirectorCameraPresetsEditor({ + onChange, + value, +}: { + onChange: (value: VideoCanvasFunctionConfig["directorDesk"]["cameraPresets"]) => void; + value: VideoCanvasFunctionConfig["directorDesk"]["cameraPresets"]; +}) { + const [draft, setDraft] = useState(() => JSON.stringify(value, null, 2)); + + useEffect(() => { + setDraft(JSON.stringify(value, null, 2)); + }, [value]); + + const applyDraft = () => { + try { + const parsed = JSON.parse(draft) as unknown; + if (!Array.isArray(parsed)) throw new Error("机位配置必须是数组"); + + const normalized = normalizeVideoCanvasFunctionConfig({ + ...defaultVideoCanvasFunctionConfig, + directorDesk: { + ...defaultVideoCanvasFunctionConfig.directorDesk, + cameraPresets: parsed, + }, + }).directorDesk.cameraPresets; + onChange(normalized); + setDraft(JSON.stringify(normalized, null, 2)); + toast.success(`已应用 ${normalized.length} 套导演台机位`); + } catch (error) { + toast.error(error instanceof Error ? error.message : "机位 JSON 无效"); + } + }; + + return ( +
+
+
+ +

+ source=current 使用当前视角;fixed 使用 position、target 和 fov 创建固定机位。 +

+
+ +
+