@hraness/slopcamera 3.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +60 -0
- package/PRIVACY.md +46 -0
- package/README.md +311 -0
- package/SECURITY.md +21 -0
- package/apps/desktop/README.md +966 -0
- package/apps/desktop/analysis/protocol.ts +223 -0
- package/apps/desktop/application/capability-binding.ts +594 -0
- package/apps/desktop/application/context.ts +97 -0
- package/apps/desktop/application/creative-iteration.ts +1385 -0
- package/apps/desktop/application/default-registry.ts +146 -0
- package/apps/desktop/application/directing-contract.ts +218 -0
- package/apps/desktop/application/directing-plan.ts +178 -0
- package/apps/desktop/application/errors.ts +18 -0
- package/apps/desktop/application/gateway-port.ts +867 -0
- package/apps/desktop/application/html-overlay-browser-runtime.ts +687 -0
- package/apps/desktop/application/html-overlay-integrity.ts +337 -0
- package/apps/desktop/application/html-overlay-renderer.ts +45 -0
- package/apps/desktop/application/index.ts +13 -0
- package/apps/desktop/application/operation-completion-checkpoint.ts +333 -0
- package/apps/desktop/application/operation-effects.ts +94 -0
- package/apps/desktop/application/operation.ts +224 -0
- package/apps/desktop/application/operations/analysis/faces.ts +244 -0
- package/apps/desktop/application/operations/analysis/music.ts +248 -0
- package/apps/desktop/application/operations/analysis/project-auto-zooms.ts +302 -0
- package/apps/desktop/application/operations/analysis/project-inactivity.ts +381 -0
- package/apps/desktop/application/operations/analysis/scenes.ts +272 -0
- package/apps/desktop/application/operations/analysis/shared.ts +202 -0
- package/apps/desktop/application/operations/derive/edit-batch.ts +967 -0
- package/apps/desktop/application/operations/derive/follow-faces.ts +454 -0
- package/apps/desktop/application/operations/edit/bind-candidate-revision.ts +91 -0
- package/apps/desktop/application/operations/edit/create-candidate-revision.ts +377 -0
- package/apps/desktop/application/operations/edit/create-revision.ts +255 -0
- package/apps/desktop/application/operations/edit/freeze-revision.ts +182 -0
- package/apps/desktop/application/operations/gateway/image.ts +41 -0
- package/apps/desktop/application/operations/gateway/index.ts +17 -0
- package/apps/desktop/application/operations/gateway/shared.ts +122 -0
- package/apps/desktop/application/operations/gateway/speech.ts +41 -0
- package/apps/desktop/application/operations/gateway/transcription.ts +42 -0
- package/apps/desktop/application/operations/gateway/video.ts +41 -0
- package/apps/desktop/application/operations/index.ts +31 -0
- package/apps/desktop/application/operations/iteration/create-candidate.ts +240 -0
- package/apps/desktop/application/operations/iteration/create-matrix.ts +117 -0
- package/apps/desktop/application/operations/iteration/select.ts +155 -0
- package/apps/desktop/application/operations/iteration/shared.ts +250 -0
- package/apps/desktop/application/operations/media/audio-effects.ts +376 -0
- package/apps/desktop/application/operations/media/binding.ts +79 -0
- package/apps/desktop/application/operations/media/capabilities.ts +112 -0
- package/apps/desktop/application/operations/media/color-grade.ts +343 -0
- package/apps/desktop/application/operations/media/html-overlay.ts +802 -0
- package/apps/desktop/application/operations/media/index.ts +8 -0
- package/apps/desktop/application/operations/media/ingest.ts +303 -0
- package/apps/desktop/application/operations/media/overlay.ts +729 -0
- package/apps/desktop/application/operations/media/shared.ts +845 -0
- package/apps/desktop/application/operations/media/transform-platform.ts +120 -0
- package/apps/desktop/application/operations/project/commit-edits.ts +2054 -0
- package/apps/desktop/application/operations/project/promote-selection.ts +495 -0
- package/apps/desktop/application/operations/project/snapshot.ts +95 -0
- package/apps/desktop/application/operations/recording/index.ts +5 -0
- package/apps/desktop/application/operations/recording/pause.ts +34 -0
- package/apps/desktop/application/operations/recording/resume.ts +34 -0
- package/apps/desktop/application/operations/recording/shared.ts +199 -0
- package/apps/desktop/application/operations/recording/start.ts +169 -0
- package/apps/desktop/application/operations/recording/stop.ts +34 -0
- package/apps/desktop/application/operations/render/bind-candidate-output.ts +324 -0
- package/apps/desktop/application/operations/render/materialize-selection.ts +322 -0
- package/apps/desktop/application/operations/render/project-caption-plan.ts +287 -0
- package/apps/desktop/application/operations/render/project-plan.ts +939 -0
- package/apps/desktop/application/operations/render/project-spatial-receipt.ts +70 -0
- package/apps/desktop/application/operations/render/project.ts +1922 -0
- package/apps/desktop/application/operations/shared.ts +67 -0
- package/apps/desktop/application/operations/slopcamera-portable.ts +1188 -0
- package/apps/desktop/application/operations/slopcamera-visuals.ts +784 -0
- package/apps/desktop/application/operations/spatial-project.ts +209 -0
- package/apps/desktop/application/operations/spatial-render.ts +415 -0
- package/apps/desktop/application/operations/spatial-scene.ts +97 -0
- package/apps/desktop/application/operations/studio.ts +143 -0
- package/apps/desktop/application/output-publication-lease.ts +163 -0
- package/apps/desktop/application/project-publication-lease.ts +233 -0
- package/apps/desktop/application/project-store.ts +196 -0
- package/apps/desktop/application/receipts.ts +533 -0
- package/apps/desktop/application/registry.ts +182 -0
- package/apps/desktop/application/spatial-assets.ts +675 -0
- package/apps/desktop/application/spatial-compositor-cadence.ts +23 -0
- package/apps/desktop/application/spatial-project-authority.ts +35 -0
- package/apps/desktop/application/spatial-project-lease.ts +126 -0
- package/apps/desktop/application/spatial-project-render-preparation.ts +225 -0
- package/apps/desktop/application/spatial-project-store.ts +286 -0
- package/apps/desktop/application/spatial-render-projection.ts +201 -0
- package/apps/desktop/application/spatial-render.ts +677 -0
- package/apps/desktop/application/spatial-spz.ts +44 -0
- package/apps/desktop/application/spatial-world-import.ts +135 -0
- package/apps/desktop/application/spatial-world-provenance.ts +46 -0
- package/apps/desktop/application/studio-port.ts +58 -0
- package/apps/desktop/application/verified-receipt-reconciliation.ts +1574 -0
- package/apps/desktop/capture/protocol.ts +689 -0
- package/apps/desktop/cli/analyzer.ts +406 -0
- package/apps/desktop/cli/args.ts +3181 -0
- package/apps/desktop/cli/asset-ingest.ts +747 -0
- package/apps/desktop/cli/atomic-render-effects.ts +210 -0
- package/apps/desktop/cli/atomic-render-platform.ts +205 -0
- package/apps/desktop/cli/atomic-render.ts +50 -0
- package/apps/desktop/cli/audio-analysis.ts +252 -0
- package/apps/desktop/cli/bounded-map.ts +39 -0
- package/apps/desktop/cli/bundle-service.ts +256 -0
- package/apps/desktop/cli/capabilities.ts +212 -0
- package/apps/desktop/cli/capture-bundle.ts +1117 -0
- package/apps/desktop/cli/command-host-resources.ts +251 -0
- package/apps/desktop/cli/commands.ts +6836 -0
- package/apps/desktop/cli/directing-blob.ts +291 -0
- package/apps/desktop/cli/directing-media.ts +517 -0
- package/apps/desktop/cli/directing-quote.ts +89 -0
- package/apps/desktop/cli/directing-service.ts +288 -0
- package/apps/desktop/cli/emoji-assets.ts +538 -0
- package/apps/desktop/cli/errors.ts +29 -0
- package/apps/desktop/cli/face-analysis-service.ts +940 -0
- package/apps/desktop/cli/filter-script.ts +76 -0
- package/apps/desktop/cli/gateway-application-port.ts +1142 -0
- package/apps/desktop/cli/gateway-credential.ts +81 -0
- package/apps/desktop/cli/gateway-media-artifacts.ts +723 -0
- package/apps/desktop/cli/gateway-media-catalog.ts +922 -0
- package/apps/desktop/cli/gateway-media-service.ts +3106 -0
- package/apps/desktop/cli/gateway-media-signature.ts +122 -0
- package/apps/desktop/cli/gateway-provider-options.ts +562 -0
- package/apps/desktop/cli/gateway-scene-provider.ts +391 -0
- package/apps/desktop/cli/help.ts +501 -0
- package/apps/desktop/cli/html-overlay-gpu.ts +97 -0
- package/apps/desktop/cli/html-overlay-renderer.ts +2478 -0
- package/apps/desktop/cli/io.ts +290 -0
- package/apps/desktop/cli/main.ts +123 -0
- package/apps/desktop/cli/media-effects-service.ts +885 -0
- package/apps/desktop/cli/media-ingest-model.ts +364 -0
- package/apps/desktop/cli/media-ingest-platform.ts +227 -0
- package/apps/desktop/cli/media-ingest-program.ts +200 -0
- package/apps/desktop/cli/media-ingest.ts +30 -0
- package/apps/desktop/cli/music-analysis-service.ts +434 -0
- package/apps/desktop/cli/mutation-lock.ts +530 -0
- package/apps/desktop/cli/native-assets.d.ts +12 -0
- package/apps/desktop/cli/native-media-runtime.macos.ts +7 -0
- package/apps/desktop/cli/overlay-playback.ts +177 -0
- package/apps/desktop/cli/paths.ts +265 -0
- package/apps/desktop/cli/portable-surface.ts +242 -0
- package/apps/desktop/cli/project-camera-receipt.ts +112 -0
- package/apps/desktop/cli/project-face-camera.ts +394 -0
- package/apps/desktop/cli/project-inactivity-service.ts +552 -0
- package/apps/desktop/cli/project-media-integrity.ts +121 -0
- package/apps/desktop/cli/project-renderer.ts +1526 -0
- package/apps/desktop/cli/project-service.ts +519 -0
- package/apps/desktop/cli/project-state-transaction.ts +520 -0
- package/apps/desktop/cli/query-limits.ts +1 -0
- package/apps/desktop/cli/recording-controller.ts +1567 -0
- package/apps/desktop/cli/recording-daemon.ts +931 -0
- package/apps/desktop/cli/recording-ref.ts +56 -0
- package/apps/desktop/cli/renamed-environment.ts +6 -0
- package/apps/desktop/cli/renderer.ts +1439 -0
- package/apps/desktop/cli/run-cli-test-helper.ts +60 -0
- package/apps/desktop/cli/scene-analysis-service.ts +879 -0
- package/apps/desktop/cli/spatial-compositor-verifier.ts +213 -0
- package/apps/desktop/cli/spatial-project-service.ts +90 -0
- package/apps/desktop/cli/spatial-scene-service.ts +105 -0
- package/apps/desktop/cli/spatial-world-service.ts +39 -0
- package/apps/desktop/cli/speech-analysis-service.ts +682 -0
- package/apps/desktop/cli/studio-assemble.ts +58 -0
- package/apps/desktop/cli/studio-command.ts +60 -0
- package/apps/desktop/cli/studio-custody.ts +60 -0
- package/apps/desktop/cli/studio-encode.ts +216 -0
- package/apps/desktop/cli/studio-exr.ts +52 -0
- package/apps/desktop/cli/studio-files.ts +179 -0
- package/apps/desktop/cli/studio-output-validation.ts +162 -0
- package/apps/desktop/cli/studio-process.ts +145 -0
- package/apps/desktop/cli/studio-runtime.ts +77 -0
- package/apps/desktop/cli/studio-scaffold.ts +70 -0
- package/apps/desktop/cli/studio-service.ts +301 -0
- package/apps/desktop/cli/studio-spatial-asset.ts +248 -0
- package/apps/desktop/cli/studio-template-names.ts +3 -0
- package/apps/desktop/cli/studio-workflow.ts +19 -0
- package/apps/desktop/cli/time.ts +25 -0
- package/apps/desktop/cli/workflow-code.ts +584 -0
- package/apps/desktop/cli/workflow-runs.ts +576 -0
- package/apps/desktop/code/advanced.ts +139 -0
- package/apps/desktop/code/application-node-planner.ts +1288 -0
- package/apps/desktop/code/compiler.ts +329 -0
- package/apps/desktop/code/contracts.ts +13 -0
- package/apps/desktop/code/creative-recipes.ts +94 -0
- package/apps/desktop/code/define-workflow.ts +115 -0
- package/apps/desktop/code/editing.ts +284 -0
- package/apps/desktop/code/file-candidate-provenance.ts +420 -0
- package/apps/desktop/code/file-candidate.ts +69 -0
- package/apps/desktop/code/graph-builder.ts +10 -0
- package/apps/desktop/code/host-resource-policy.ts +55 -0
- package/apps/desktop/code/plan-contracts.ts +159 -0
- package/apps/desktop/code/planning.ts +361 -0
- package/apps/desktop/code/public.ts +134 -0
- package/apps/desktop/code/reference-projection.ts +62 -0
- package/apps/desktop/code/run-contracts.ts +466 -0
- package/apps/desktop/code/run-store.ts +2478 -0
- package/apps/desktop/code/runtime-identity.ts +328 -0
- package/apps/desktop/code/scheduler.ts +3067 -0
- package/apps/desktop/code/semantic-builder.ts +1436 -0
- package/apps/desktop/code/source-bundle.ts +1641 -0
- package/apps/desktop/code/source-typecheck.ts +211 -0
- package/apps/desktop/code/testing.ts +79 -0
- package/apps/desktop/code/worker-client.ts +1675 -0
- package/apps/desktop/code/worker-effects.ts +141 -0
- package/apps/desktop/code/worker-entry.ts +435 -0
- package/apps/desktop/code/worker-lease-guardian.ts +179 -0
- package/apps/desktop/code/worker-process-identity.ts +484 -0
- package/apps/desktop/code/worker-protocol.ts +211 -0
- package/apps/desktop/code/workflow-effects.ts +132 -0
- package/apps/desktop/contracts/analysis.ts +949 -0
- package/apps/desktop/contracts/edit.ts +576 -0
- package/apps/desktop/contracts/index.ts +9 -0
- package/apps/desktop/contracts/media-effects.ts +139 -0
- package/apps/desktop/contracts/project-render.ts +644 -0
- package/apps/desktop/contracts/project.ts +740 -0
- package/apps/desktop/contracts/recording.ts +1434 -0
- package/apps/desktop/contracts/render.ts +334 -0
- package/apps/desktop/contracts/runtime.ts +155 -0
- package/apps/desktop/contracts/spatial-compositor.ts +58 -0
- package/apps/desktop/contracts/spatial-project.ts +159 -0
- package/apps/desktop/contracts/spatial-world.ts +48 -0
- package/apps/desktop/contracts/video-effects.ts +120 -0
- package/apps/desktop/core/alignment-apply.ts +400 -0
- package/apps/desktop/core/audio-alignment.ts +466 -0
- package/apps/desktop/core/auto-zoom.ts +209 -0
- package/apps/desktop/core/canonical-json.ts +14 -0
- package/apps/desktop/core/emoji.ts +210 -0
- package/apps/desktop/core/events.ts +409 -0
- package/apps/desktop/core/face-framing.ts +533 -0
- package/apps/desktop/core/face-tracks.ts +326 -0
- package/apps/desktop/core/inactivity.ts +137 -0
- package/apps/desktop/core/index.ts +30 -0
- package/apps/desktop/core/intervals.ts +123 -0
- package/apps/desktop/core/montage.ts +236 -0
- package/apps/desktop/core/music-analysis.ts +518 -0
- package/apps/desktop/core/plan.ts +244 -0
- package/apps/desktop/core/project-auto-zoom.ts +75 -0
- package/apps/desktop/core/project-camera-spatial.ts +676 -0
- package/apps/desktop/core/project-camera.ts +403 -0
- package/apps/desktop/core/project-captions.ts +888 -0
- package/apps/desktop/core/project-inactivity.ts +125 -0
- package/apps/desktop/core/project-metadata.ts +927 -0
- package/apps/desktop/core/project-plan.ts +375 -0
- package/apps/desktop/core/project-render-plan.ts +303 -0
- package/apps/desktop/core/project-time.ts +469 -0
- package/apps/desktop/core/render-plan.ts +442 -0
- package/apps/desktop/core/scene-cache.ts +174 -0
- package/apps/desktop/core/scene-sampling.ts +448 -0
- package/apps/desktop/core/spatial-compositor.ts +22 -0
- package/apps/desktop/core/spatial-durability.ts +99 -0
- package/apps/desktop/core/spatial-project.ts +169 -0
- package/apps/desktop/core/spatial-shot-clock.ts +32 -0
- package/apps/desktop/core/speech-analysis.ts +333 -0
- package/apps/desktop/core/storage.ts +970 -0
- package/apps/desktop/core/time-map.ts +91 -0
- package/apps/desktop/core/time.ts +61 -0
- package/apps/desktop/core/video-effects.ts +660 -0
- package/apps/desktop/dist/cli/NebulaSans-Bold-26se8aek.otf +0 -0
- package/apps/desktop/dist/cli/NebulaSans-Bold-bcz7y08t.woff2 +0 -0
- package/apps/desktop/dist/cli/NebulaSans-Book-5ax05zvn.woff2 +0 -0
- package/apps/desktop/dist/cli/NebulaSans-Book-8cenzchw.otf +0 -0
- package/apps/desktop/dist/cli/main.js +5086 -0
- package/apps/desktop/html-overlay/catalog.ts +171 -0
- package/apps/desktop/html-overlay/contracts.ts +372 -0
- package/apps/desktop/html-overlay/execution-profile.ts +77 -0
- package/apps/desktop/html-overlay/index.ts +98 -0
- package/apps/desktop/html-overlay/libraries.ts +263 -0
- package/apps/desktop/html-overlay/random.ts +49 -0
- package/apps/desktop/html-overlay/runtime.ts +813 -0
- package/apps/desktop/html-overlay/scaffolds.ts +792 -0
- package/apps/desktop/html-overlay/spark-runtime.ts +88 -0
- package/apps/desktop/html-overlay/spatial-splat-runtime.ts +60 -0
- package/apps/desktop/html-overlay/spatial.ts +720 -0
- package/apps/desktop/studio/assets/README.md +39 -0
- package/apps/desktop/studio/assets/contracts.ts +129 -0
- package/apps/desktop/studio/assets/network.ts +64 -0
- package/apps/desktop/studio/assets/poly-haven.ts +148 -0
- package/apps/desktop/studio/drivers/blender_driver.py +466 -0
- package/apps/desktop/studio/drivers/cadquery_driver.py +176 -0
- package/apps/desktop/studio/education/driver.py +308 -0
- package/apps/desktop/studio/education/lesson.py +180 -0
- package/apps/desktop/studio/education/toolkit.py +249 -0
- package/apps/desktop/workflows/chaptered-demo.ts +48 -0
- package/apps/desktop/workflows/creative-iteration.ts +107 -0
- package/apps/desktop/workflows/creative-selection.ts +92 -0
- package/apps/desktop/workflows/fragments.ts +486 -0
- package/apps/desktop/workflows/index.ts +93 -0
- package/apps/desktop/workflows/polished-screen-demo.ts +128 -0
- package/apps/desktop/workflows/scene-direction.ts +12 -0
- package/apps/desktop/workflows/social-variants.ts +75 -0
- package/apps/desktop/workflows/talking-head-cleanup.ts +53 -0
- package/dist/NebulaSans-Bold-26se8aek.otf +0 -0
- package/dist/NebulaSans-Bold-bcz7y08t.woff2 +0 -0
- package/dist/NebulaSans-Book-5ax05zvn.woff2 +0 -0
- package/dist/NebulaSans-Book-8cenzchw.otf +0 -0
- package/dist/cli.js +479 -0
- package/dist/code/advanced.js +270 -0
- package/dist/code/index.js +2240 -0
- package/dist/generate.js +24 -0
- package/dist/host-resources.js +26 -0
- package/dist/index-42zsesc1.js +2257 -0
- package/dist/index-7308egqr.js +48 -0
- package/dist/index-8txs6fkn.js +712 -0
- package/dist/index-mcy8z0br.js +192 -0
- package/dist/index-p63wavx0.js +2029 -0
- package/dist/index-r7gdhmsp.js +424 -0
- package/dist/index-sh6xbav6.js +1219 -0
- package/dist/index-z1w83f81.js +4 -0
- package/dist/index-z7239b4h.js +2363 -0
- package/dist/index-zfeg9hmw.js +2013 -0
- package/dist/index.js +241 -0
- package/dist/operations.js +29 -0
- package/dist/skill-install-dh0ntqba.js +10 -0
- package/dist/vectorize/worker.js +142 -0
- package/dist/workflow.js +16 -0
- package/docs/README.md +38 -0
- package/docs/studio.md +215 -0
- package/examples/studio/blender/README.md +26 -0
- package/examples/studio/blender/character.py +152 -0
- package/examples/studio/blender/cloth.py +101 -0
- package/examples/studio/blender/color_chart.py +29 -0
- package/examples/studio/blender/fluid.py +78 -0
- package/examples/studio/blender/import_model.py +74 -0
- package/examples/studio/blender/product.py +53 -0
- package/examples/studio/blender/shaded_street.py +481 -0
- package/examples/studio/blender/studio_scene.py +147 -0
- package/examples/studio/cadquery/README.md +13 -0
- package/examples/studio/cadquery/bracket.py +36 -0
- package/examples/studio/cadquery/import_step.py +12 -0
- package/examples/studio/education/README.md +46 -0
- package/examples/studio/education/lesson.json +99 -0
- package/examples/studio/education/scene.py +7 -0
- package/examples/studio/hybrid-scene.ts +96 -0
- package/examples/studio/native-workflow.ts +14 -0
- package/examples/studio/vgpu/README.md +64 -0
- package/examples/studio/vgpu/heat-field.mjs +290 -0
- package/package.json +304 -0
- package/packages/scene/src/index.ts +1 -0
- package/packages/scene/src/scene.ts +215 -0
- package/schema/diagram.schema.json +334 -0
- package/skills/slopcamera/SKILL.md +45 -0
- package/skills/slopcamera/agents/openai.yaml +4 -0
- package/skills/slopcamera/references/customization.md +77 -0
- package/skills/slopcamera/references/diagrams.md +153 -0
- package/skills/slopcamera/references/directed-scenes.md +42 -0
- package/skills/slopcamera/references/directing-video.md +18 -0
- package/skills/slopcamera/references/educational-video.md +26 -0
- package/skills/slopcamera/references/gateway-media.md +134 -0
- package/skills/slopcamera/references/install.md +62 -0
- package/skills/slopcamera/references/native-studio.md +31 -0
- package/skills/slopcamera/references/reference-led-3d.md +140 -0
- package/skills/slopcamera/references/rubber-stamp-examples/poster-example-1.jpg +0 -0
- package/skills/slopcamera/references/rubber-stamp-examples/poster-example-2.jpg +0 -0
- package/skills/slopcamera/references/rubber-stamp-examples/stamp-style-1.png +0 -0
- package/skills/slopcamera/references/rubber-stamp-examples/stamp-style-2.png +0 -0
- package/skills/slopcamera/references/rubber-stamp-field-notes.md +144 -0
- package/skills/slopcamera/references/vectorization.md +29 -0
- package/skills/slopcamera/references/video-projects.md +187 -0
- package/skills/slopcamera/references/visual-communication.md +120 -0
- package/skills/slopcamera/references/workflows-sdk.md +45 -0
- package/skills/slopcamera/scripts/compose-rubber-stamp-field-note.ts +229 -0
- package/src/artifacts.ts +106 -0
- package/src/assets/fonts/nebula-sans/LICENSE.txt +96 -0
- package/src/assets/fonts/nebula-sans/NebulaSans-Bold.otf +0 -0
- package/src/assets/fonts/nebula-sans/NebulaSans-Bold.woff2 +0 -0
- package/src/assets/fonts/nebula-sans/NebulaSans-Book.otf +0 -0
- package/src/assets/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
- package/src/assets/fonts/nebula-sans/PROVENANCE.md +21 -0
- package/src/assets.d.ts +9 -0
- package/src/cli.ts +601 -0
- package/src/cloud-errors.ts +26 -0
- package/src/code/advanced.ts +10 -0
- package/src/code/boundary.ts +21 -0
- package/src/code/canonical-json.ts +129 -0
- package/src/code/compiler.ts +953 -0
- package/src/code/contracts.ts +576 -0
- package/src/code/define-workflow.ts +334 -0
- package/src/code/errors.ts +41 -0
- package/src/code/graph-builder.ts +945 -0
- package/src/code/index.ts +121 -0
- package/src/code/json-snapshot.ts +899 -0
- package/src/code/json-utf8.ts +88 -0
- package/src/code/portable-builder.ts +136 -0
- package/src/code/projection.ts +378 -0
- package/src/code/public-operations.ts +450 -0
- package/src/code/runtime.ts +580 -0
- package/src/code/sha256.ts +36 -0
- package/src/config.ts +180 -0
- package/src/desktop.ts +253 -0
- package/src/fs.ts +10 -0
- package/src/generate.ts +704 -0
- package/src/host-resource-posix.ts +161 -0
- package/src/host-resources.ts +1749 -0
- package/src/icons.ts +58 -0
- package/src/index.ts +200 -0
- package/src/label-layout.ts +130 -0
- package/src/layout.ts +413 -0
- package/src/lint.ts +127 -0
- package/src/mcp/boundary.ts +354 -0
- package/src/mcp/index.ts +33 -0
- package/src/mcp/server.ts +272 -0
- package/src/mcp/tools.ts +963 -0
- package/src/mcp/types.ts +71 -0
- package/src/operations.ts +775 -0
- package/src/parse.ts +861 -0
- package/src/process-environment.ts +17 -0
- package/src/render.ts +437 -0
- package/src/skill-install.ts +49 -0
- package/src/spatial-scene/authoring.ts +27 -0
- package/src/spatial-scene/camera-track.ts +83 -0
- package/src/spatial-scene/contracts.ts +277 -0
- package/src/spatial-scene/evaluate.ts +145 -0
- package/src/spatial-scene/gltf.ts +558 -0
- package/src/spatial-scene/identity.ts +260 -0
- package/src/spatial-scene/index.ts +10 -0
- package/src/spatial-scene/inspect.ts +68 -0
- package/src/spatial-scene/math.ts +280 -0
- package/src/spatial-scene/patch.ts +131 -0
- package/src/spatial-scene/time.ts +53 -0
- package/src/studio/contracts.ts +129 -0
- package/src/studio/index.ts +2 -0
- package/src/studio/plan.ts +156 -0
- package/src/studio/shared.ts +41 -0
- package/src/theme.ts +68 -0
- package/src/tldr.ts +474 -0
- package/src/types.ts +212 -0
- package/src/vectorize/archive.ts +101 -0
- package/src/vectorize/command.ts +797 -0
- package/src/vectorize/index.ts +27 -0
- package/src/vectorize/limits.ts +61 -0
- package/src/vectorize/metrics.ts +351 -0
- package/src/vectorize/pixels.ts +323 -0
- package/src/vectorize/supervisor.ts +339 -0
- package/src/vectorize/svg.ts +188 -0
- package/src/vectorize/tool.ts +542 -0
- package/src/vectorize/types.ts +113 -0
- package/src/vectorize/vectorize.ts +634 -0
- package/src/vectorize/worker-protocol.ts +40 -0
- package/src/vectorize/worker.ts +209 -0
- package/src/version.ts +1 -0
- package/src/workflow.ts +409 -0
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
CameraMoveIdSchema,
|
|
5
|
+
CameraPoseSchema,
|
|
6
|
+
EasingSchema,
|
|
7
|
+
OverlayOperationSchema,
|
|
8
|
+
SourceIntervalSchema,
|
|
9
|
+
} from "./edit";
|
|
10
|
+
import {
|
|
11
|
+
AnalysisIdSchema,
|
|
12
|
+
ProjectAssetIdSchema,
|
|
13
|
+
ProjectAudioPresentationSchema,
|
|
14
|
+
ProjectPlacementIdSchema,
|
|
15
|
+
ProjectStreamIdSchema,
|
|
16
|
+
ProjectVideoPresentationSchema,
|
|
17
|
+
VideoProjectIdSchema,
|
|
18
|
+
} from "./project";
|
|
19
|
+
import {
|
|
20
|
+
IsoTimestampSchema,
|
|
21
|
+
RepositoryRelativePathSchema,
|
|
22
|
+
Sha256Schema,
|
|
23
|
+
type ReadonlyInferred,
|
|
24
|
+
} from "./recording";
|
|
25
|
+
import {
|
|
26
|
+
CameraKeyframeSchema,
|
|
27
|
+
OutputIntervalSchema,
|
|
28
|
+
RenderEffectsSchema,
|
|
29
|
+
Yuv420pDimensionSchema,
|
|
30
|
+
} from "./render";
|
|
31
|
+
|
|
32
|
+
export const PROJECT_EXPORT_PROFILE_IDS = [
|
|
33
|
+
"landscape",
|
|
34
|
+
"portrait",
|
|
35
|
+
"square",
|
|
36
|
+
"feed-portrait",
|
|
37
|
+
] as const;
|
|
38
|
+
|
|
39
|
+
export const ProjectExportProfileIdSchema = z.enum(
|
|
40
|
+
PROJECT_EXPORT_PROFILE_IDS,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export const ProjectExportAspectSchema = z.enum([
|
|
44
|
+
"16:9",
|
|
45
|
+
"9:16",
|
|
46
|
+
"1:1",
|
|
47
|
+
"4:5",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
export const ProjectExportProfileSchema = z.strictObject({
|
|
51
|
+
aspect: ProjectExportAspectSchema,
|
|
52
|
+
frameRate: z.number().finite().positive().max(240),
|
|
53
|
+
id: ProjectExportProfileIdSchema,
|
|
54
|
+
pixelHeight: Yuv420pDimensionSchema,
|
|
55
|
+
pixelWidth: Yuv420pDimensionSchema,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export const PROJECT_EXPORT_PROFILES = Object.freeze({
|
|
59
|
+
"feed-portrait": Object.freeze(ProjectExportProfileSchema.parse({
|
|
60
|
+
aspect: "4:5",
|
|
61
|
+
frameRate: 30,
|
|
62
|
+
id: "feed-portrait",
|
|
63
|
+
pixelHeight: 1_350,
|
|
64
|
+
pixelWidth: 1_080,
|
|
65
|
+
})),
|
|
66
|
+
landscape: Object.freeze(ProjectExportProfileSchema.parse({
|
|
67
|
+
aspect: "16:9",
|
|
68
|
+
frameRate: 30,
|
|
69
|
+
id: "landscape",
|
|
70
|
+
pixelHeight: 1_080,
|
|
71
|
+
pixelWidth: 1_920,
|
|
72
|
+
})),
|
|
73
|
+
portrait: Object.freeze(ProjectExportProfileSchema.parse({
|
|
74
|
+
aspect: "9:16",
|
|
75
|
+
frameRate: 30,
|
|
76
|
+
id: "portrait",
|
|
77
|
+
pixelHeight: 1_920,
|
|
78
|
+
pixelWidth: 1_080,
|
|
79
|
+
})),
|
|
80
|
+
square: Object.freeze(ProjectExportProfileSchema.parse({
|
|
81
|
+
aspect: "1:1",
|
|
82
|
+
frameRate: 30,
|
|
83
|
+
id: "square",
|
|
84
|
+
pixelHeight: 1_080,
|
|
85
|
+
pixelWidth: 1_080,
|
|
86
|
+
})),
|
|
87
|
+
} satisfies Readonly<Record<
|
|
88
|
+
z.infer<typeof ProjectExportProfileIdSchema>,
|
|
89
|
+
z.infer<typeof ProjectExportProfileSchema>
|
|
90
|
+
>>);
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Canvas geometry and render effort are independent decisions. A named
|
|
94
|
+
* preview profile keeps the complete project clock and canvas aspect while
|
|
95
|
+
* reducing pixels and frames; a final profile preserves its declared canvas.
|
|
96
|
+
* A custom canvas is already exact, so its tier selects the encoder recipe
|
|
97
|
+
* without silently rewriting caller-owned dimensions or cadence.
|
|
98
|
+
*/
|
|
99
|
+
export const PROJECT_RENDER_TIERS = ["preview", "final"] as const;
|
|
100
|
+
|
|
101
|
+
export const ProjectRenderTierSchema = z.enum(PROJECT_RENDER_TIERS);
|
|
102
|
+
|
|
103
|
+
export const ProjectRenderGeometrySchema = z.strictObject({
|
|
104
|
+
frameRate: z.number().finite().positive().max(240),
|
|
105
|
+
pixelHeight: Yuv420pDimensionSchema,
|
|
106
|
+
pixelWidth: Yuv420pDimensionSchema,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
export const ProjectRenderCanvasSchema = z.discriminatedUnion("kind", [
|
|
110
|
+
z.strictObject({
|
|
111
|
+
kind: z.literal("profile"),
|
|
112
|
+
profileId: ProjectExportProfileIdSchema,
|
|
113
|
+
}),
|
|
114
|
+
ProjectRenderGeometrySchema.extend({
|
|
115
|
+
kind: z.literal("custom"),
|
|
116
|
+
}).strict(),
|
|
117
|
+
]);
|
|
118
|
+
|
|
119
|
+
export const ProjectRenderTargetSchema = z.strictObject({
|
|
120
|
+
canvas: ProjectRenderCanvasSchema,
|
|
121
|
+
tier: ProjectRenderTierSchema,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
export const ProjectRenderEncoderRecipeSchema = z.strictObject({
|
|
125
|
+
audio: z.strictObject({
|
|
126
|
+
bitrate: z.enum(["128k", "192k"]),
|
|
127
|
+
codec: z.literal("aac"),
|
|
128
|
+
}),
|
|
129
|
+
container: z.strictObject({
|
|
130
|
+
format: z.literal("mp4"),
|
|
131
|
+
movflags: z.literal("+faststart"),
|
|
132
|
+
}),
|
|
133
|
+
decoderThreads: z.literal(1),
|
|
134
|
+
filterComplexThreads: z.literal(1),
|
|
135
|
+
filterThreads: z.literal(1),
|
|
136
|
+
kind: z.union([
|
|
137
|
+
z.literal("slopcamera.project-render-encoder-recipe"),
|
|
138
|
+
]),
|
|
139
|
+
schemaVersion: z.literal(1),
|
|
140
|
+
tier: ProjectRenderTierSchema,
|
|
141
|
+
video: z.strictObject({
|
|
142
|
+
codec: z.literal("libx264"),
|
|
143
|
+
crf: z.union([z.literal(18), z.literal(28)]),
|
|
144
|
+
pixelFormat: z.literal("yuv420p"),
|
|
145
|
+
preset: z.enum(["medium", "veryfast"]),
|
|
146
|
+
threads: z.literal(1),
|
|
147
|
+
}),
|
|
148
|
+
}).superRefine((recipe, context) => {
|
|
149
|
+
const expected = recipe.tier === "preview"
|
|
150
|
+
? { audioBitrate: "128k", crf: 28, preset: "veryfast" }
|
|
151
|
+
: { audioBitrate: "192k", crf: 18, preset: "medium" };
|
|
152
|
+
if (
|
|
153
|
+
recipe.audio.bitrate !== expected.audioBitrate
|
|
154
|
+
|| recipe.video.crf !== expected.crf
|
|
155
|
+
|| recipe.video.preset !== expected.preset
|
|
156
|
+
) {
|
|
157
|
+
context.addIssue({
|
|
158
|
+
code: "custom",
|
|
159
|
+
message: "Project render encoder recipe does not match its declared tier.",
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
export const PROJECT_RENDER_ENCODER_RECIPES = Object.freeze({
|
|
165
|
+
final: Object.freeze(ProjectRenderEncoderRecipeSchema.parse({
|
|
166
|
+
audio: { bitrate: "192k", codec: "aac" },
|
|
167
|
+
container: { format: "mp4", movflags: "+faststart" },
|
|
168
|
+
decoderThreads: 1,
|
|
169
|
+
filterComplexThreads: 1,
|
|
170
|
+
filterThreads: 1,
|
|
171
|
+
kind: "slopcamera.project-render-encoder-recipe",
|
|
172
|
+
schemaVersion: 1,
|
|
173
|
+
tier: "final",
|
|
174
|
+
video: {
|
|
175
|
+
codec: "libx264",
|
|
176
|
+
crf: 18,
|
|
177
|
+
pixelFormat: "yuv420p",
|
|
178
|
+
preset: "medium",
|
|
179
|
+
threads: 1,
|
|
180
|
+
},
|
|
181
|
+
})),
|
|
182
|
+
preview: Object.freeze(ProjectRenderEncoderRecipeSchema.parse({
|
|
183
|
+
audio: { bitrate: "128k", codec: "aac" },
|
|
184
|
+
container: { format: "mp4", movflags: "+faststart" },
|
|
185
|
+
decoderThreads: 1,
|
|
186
|
+
filterComplexThreads: 1,
|
|
187
|
+
filterThreads: 1,
|
|
188
|
+
kind: "slopcamera.project-render-encoder-recipe",
|
|
189
|
+
schemaVersion: 1,
|
|
190
|
+
tier: "preview",
|
|
191
|
+
video: {
|
|
192
|
+
codec: "libx264",
|
|
193
|
+
crf: 28,
|
|
194
|
+
pixelFormat: "yuv420p",
|
|
195
|
+
preset: "veryfast",
|
|
196
|
+
threads: 1,
|
|
197
|
+
},
|
|
198
|
+
})),
|
|
199
|
+
} satisfies Readonly<Record<
|
|
200
|
+
z.infer<typeof ProjectRenderTierSchema>,
|
|
201
|
+
z.infer<typeof ProjectRenderEncoderRecipeSchema>
|
|
202
|
+
>>);
|
|
203
|
+
|
|
204
|
+
export function resolveProjectRenderEncoderRecipe(
|
|
205
|
+
tier: z.infer<typeof ProjectRenderTierSchema>,
|
|
206
|
+
): z.infer<typeof ProjectRenderEncoderRecipeSchema> {
|
|
207
|
+
return PROJECT_RENDER_ENCODER_RECIPES[ProjectRenderTierSchema.parse(tier)];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export const ProjectExportCaptionModeSchema = z.enum([
|
|
211
|
+
"clean",
|
|
212
|
+
"burn-in",
|
|
213
|
+
]);
|
|
214
|
+
|
|
215
|
+
export const ProjectExportVariantSchema = z.strictObject({
|
|
216
|
+
captionMode: ProjectExportCaptionModeSchema,
|
|
217
|
+
profileId: ProjectExportProfileIdSchema,
|
|
218
|
+
tier: ProjectRenderTierSchema,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
export const ProjectResolvedExportProfileSchema =
|
|
222
|
+
ProjectExportProfileSchema.extend({
|
|
223
|
+
tier: ProjectRenderTierSchema,
|
|
224
|
+
}).strict();
|
|
225
|
+
|
|
226
|
+
export const PROJECT_PREVIEW_EXPORT_PROFILES = Object.freeze({
|
|
227
|
+
"feed-portrait": Object.freeze(ProjectResolvedExportProfileSchema.parse({
|
|
228
|
+
aspect: "4:5",
|
|
229
|
+
frameRate: 24,
|
|
230
|
+
id: "feed-portrait",
|
|
231
|
+
pixelHeight: 540,
|
|
232
|
+
pixelWidth: 432,
|
|
233
|
+
tier: "preview",
|
|
234
|
+
})),
|
|
235
|
+
landscape: Object.freeze(ProjectResolvedExportProfileSchema.parse({
|
|
236
|
+
aspect: "16:9",
|
|
237
|
+
frameRate: 24,
|
|
238
|
+
id: "landscape",
|
|
239
|
+
pixelHeight: 540,
|
|
240
|
+
pixelWidth: 960,
|
|
241
|
+
tier: "preview",
|
|
242
|
+
})),
|
|
243
|
+
portrait: Object.freeze(ProjectResolvedExportProfileSchema.parse({
|
|
244
|
+
aspect: "9:16",
|
|
245
|
+
frameRate: 24,
|
|
246
|
+
id: "portrait",
|
|
247
|
+
pixelHeight: 960,
|
|
248
|
+
pixelWidth: 540,
|
|
249
|
+
tier: "preview",
|
|
250
|
+
})),
|
|
251
|
+
square: Object.freeze(ProjectResolvedExportProfileSchema.parse({
|
|
252
|
+
aspect: "1:1",
|
|
253
|
+
frameRate: 24,
|
|
254
|
+
id: "square",
|
|
255
|
+
pixelHeight: 540,
|
|
256
|
+
pixelWidth: 540,
|
|
257
|
+
tier: "preview",
|
|
258
|
+
})),
|
|
259
|
+
} satisfies Readonly<Record<
|
|
260
|
+
z.infer<typeof ProjectExportProfileIdSchema>,
|
|
261
|
+
z.infer<typeof ProjectResolvedExportProfileSchema>
|
|
262
|
+
>>);
|
|
263
|
+
|
|
264
|
+
export const PROJECT_FINAL_EXPORT_PROFILES = Object.freeze(
|
|
265
|
+
Object.fromEntries(Object.entries(PROJECT_EXPORT_PROFILES).map(
|
|
266
|
+
([id, profile]) => [
|
|
267
|
+
id,
|
|
268
|
+
Object.freeze(ProjectResolvedExportProfileSchema.parse({
|
|
269
|
+
...profile,
|
|
270
|
+
tier: "final",
|
|
271
|
+
})),
|
|
272
|
+
],
|
|
273
|
+
)) as Readonly<Record<
|
|
274
|
+
z.infer<typeof ProjectExportProfileIdSchema>,
|
|
275
|
+
z.infer<typeof ProjectResolvedExportProfileSchema>
|
|
276
|
+
>>,
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
export const PROJECT_RENDER_PROFILES = Object.freeze({
|
|
280
|
+
final: PROJECT_FINAL_EXPORT_PROFILES,
|
|
281
|
+
preview: PROJECT_PREVIEW_EXPORT_PROFILES,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
export function resolveProjectExportProfile(
|
|
285
|
+
profileId: z.infer<typeof ProjectExportProfileIdSchema>,
|
|
286
|
+
tier: z.infer<typeof ProjectRenderTierSchema>,
|
|
287
|
+
): z.infer<typeof ProjectResolvedExportProfileSchema> {
|
|
288
|
+
return PROJECT_RENDER_PROFILES[tier][profileId];
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function resolveProjectRenderTarget(
|
|
292
|
+
value: z.input<typeof ProjectRenderTargetSchema>,
|
|
293
|
+
): z.infer<typeof ProjectRenderGeometrySchema> {
|
|
294
|
+
const target = ProjectRenderTargetSchema.parse(value);
|
|
295
|
+
if (target.canvas.kind === "custom") {
|
|
296
|
+
return ProjectRenderGeometrySchema.parse({
|
|
297
|
+
frameRate: target.canvas.frameRate,
|
|
298
|
+
pixelHeight: target.canvas.pixelHeight,
|
|
299
|
+
pixelWidth: target.canvas.pixelWidth,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const profile = resolveProjectExportProfile(
|
|
303
|
+
target.canvas.profileId,
|
|
304
|
+
target.tier,
|
|
305
|
+
);
|
|
306
|
+
return ProjectRenderGeometrySchema.parse({
|
|
307
|
+
frameRate: profile.frameRate,
|
|
308
|
+
pixelHeight: profile.pixelHeight,
|
|
309
|
+
pixelWidth: profile.pixelWidth,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export function projectExportVariantId(
|
|
314
|
+
value: z.input<typeof ProjectExportVariantSchema>,
|
|
315
|
+
): string {
|
|
316
|
+
const variant = ProjectExportVariantSchema.parse(value);
|
|
317
|
+
return `${variant.tier}-${variant.profileId}-${variant.captionMode}`;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export const ProjectCaptionStylePresetSchema = z.enum([
|
|
321
|
+
"social-block-v1",
|
|
322
|
+
]);
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Select one immutable local speech analysis and the exact project placement
|
|
326
|
+
* whose sync map should place those words on the rendered output clock.
|
|
327
|
+
*/
|
|
328
|
+
export const ProjectCaptionRequestSchema = z.strictObject({
|
|
329
|
+
analysisId: AnalysisIdSchema,
|
|
330
|
+
placementId: ProjectPlacementIdSchema,
|
|
331
|
+
style: ProjectCaptionStylePresetSchema.default("social-block-v1"),
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const ResolvedSliceBaseShape = {
|
|
335
|
+
assetId: ProjectAssetIdSchema,
|
|
336
|
+
assetRange: SourceIntervalSchema,
|
|
337
|
+
bytes: z.number().int().safe().positive(),
|
|
338
|
+
codec: z.string().min(1).max(128),
|
|
339
|
+
container: z.string().min(1).max(64),
|
|
340
|
+
fileRange: SourceIntervalSchema,
|
|
341
|
+
outputRange: OutputIntervalSchema,
|
|
342
|
+
path: RepositoryRelativePathSchema,
|
|
343
|
+
placementId: ProjectPlacementIdSchema,
|
|
344
|
+
projectRange: SourceIntervalSchema,
|
|
345
|
+
projectSpeed: z.number().finite().positive().max(64),
|
|
346
|
+
sha256: Sha256Schema,
|
|
347
|
+
streamId: ProjectStreamIdSchema,
|
|
348
|
+
streamIndex: z.number().int().safe().nonnegative(),
|
|
349
|
+
} as const;
|
|
350
|
+
|
|
351
|
+
export const ResolvedProjectVideoSliceSchema = z.strictObject({
|
|
352
|
+
...ResolvedSliceBaseShape,
|
|
353
|
+
kind: z.literal("video"),
|
|
354
|
+
presentation: ProjectVideoPresentationSchema,
|
|
355
|
+
role: z.enum(["screen", "camera", "b-roll", "other"]),
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
export const ResolvedProjectAudioSliceSchema = z.strictObject({
|
|
359
|
+
...ResolvedSliceBaseShape,
|
|
360
|
+
kind: z.literal("audio"),
|
|
361
|
+
presentation: ProjectAudioPresentationSchema,
|
|
362
|
+
role: z.enum(["system-audio", "microphone", "portable-audio", "music", "dialogue", "other"]),
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
export const ResolvedProjectOverlaySchema = z.strictObject({
|
|
366
|
+
operation: OverlayOperationSchema,
|
|
367
|
+
outputRange: OutputIntervalSchema,
|
|
368
|
+
playbackOffsetUs: z.number().int().safe().nonnegative(),
|
|
369
|
+
projectRange: SourceIntervalSchema,
|
|
370
|
+
visibleDurationUs: z.number().int().safe().positive(),
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
export const ProjectCameraKeyframeSchema = CameraKeyframeSchema.extend({
|
|
374
|
+
displayId: z.string().min(1).max(256),
|
|
375
|
+
layerPixelHeight: z.number().int().safe().positive().max(16_384),
|
|
376
|
+
layerPixelWidth: z.number().int().safe().positive().max(16_384),
|
|
377
|
+
placementId: ProjectPlacementIdSchema,
|
|
378
|
+
streamId: ProjectStreamIdSchema,
|
|
379
|
+
}).strict().superRefine((keyframe, context) => {
|
|
380
|
+
if (
|
|
381
|
+
keyframe.viewport.x < 0
|
|
382
|
+
|| keyframe.viewport.y < 0
|
|
383
|
+
|| keyframe.viewport.x + keyframe.viewport.width > keyframe.layerPixelWidth + 0.001
|
|
384
|
+
|| keyframe.viewport.y + keyframe.viewport.height > keyframe.layerPixelHeight + 0.001
|
|
385
|
+
) {
|
|
386
|
+
context.addIssue({ code: "custom", message: "Project camera viewport must remain inside its video layer." });
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
export const ProjectCameraSegmentTransformSchema = z.strictObject({
|
|
391
|
+
activeProjectRange: SourceIntervalSchema,
|
|
392
|
+
fromPose: CameraPoseSchema,
|
|
393
|
+
interpolationProjectRange: SourceIntervalSchema,
|
|
394
|
+
outgoingEasing: EasingSchema,
|
|
395
|
+
toPose: CameraPoseSchema,
|
|
396
|
+
}).superRefine((transform, context) => {
|
|
397
|
+
if (
|
|
398
|
+
transform.activeProjectRange.startUs < transform.interpolationProjectRange.startUs
|
|
399
|
+
|| transform.activeProjectRange.endUs > transform.interpolationProjectRange.endUs
|
|
400
|
+
) {
|
|
401
|
+
context.addIssue({
|
|
402
|
+
code: "custom",
|
|
403
|
+
message: "Camera transform active project range must stay inside its interpolation range.",
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
export const ProjectCameraSegmentSchema = z.strictObject({
|
|
409
|
+
assetRange: SourceIntervalSchema,
|
|
410
|
+
cameraMoveId: CameraMoveIdSchema,
|
|
411
|
+
geometrySha256: Sha256Schema,
|
|
412
|
+
layerPixelHeight: z.number().int().safe().positive().max(16_384),
|
|
413
|
+
layerPixelWidth: z.number().int().safe().positive().max(16_384),
|
|
414
|
+
outputRange: OutputIntervalSchema,
|
|
415
|
+
placementId: ProjectPlacementIdSchema,
|
|
416
|
+
projectRange: SourceIntervalSchema,
|
|
417
|
+
streamId: ProjectStreamIdSchema,
|
|
418
|
+
syncSha256: Sha256Schema,
|
|
419
|
+
transforms: z.array(ProjectCameraSegmentTransformSchema).min(1).max(4_095),
|
|
420
|
+
}).superRefine((segment, context) => {
|
|
421
|
+
if (
|
|
422
|
+
segment.transforms[0]?.activeProjectRange.startUs !== segment.projectRange.startUs
|
|
423
|
+
|| segment.transforms.at(-1)?.activeProjectRange.endUs !== segment.projectRange.endUs
|
|
424
|
+
) {
|
|
425
|
+
context.addIssue({
|
|
426
|
+
code: "custom",
|
|
427
|
+
message: "Camera segment transforms must cover both segment project range endpoints.",
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
for (let index = 1; index < segment.transforms.length; index += 1) {
|
|
431
|
+
if (
|
|
432
|
+
segment.transforms[index]!.activeProjectRange.startUs
|
|
433
|
+
!== segment.transforms[index - 1]!.activeProjectRange.endUs
|
|
434
|
+
) {
|
|
435
|
+
context.addIssue({
|
|
436
|
+
code: "custom",
|
|
437
|
+
message: "Camera segment transform active ranges must be ordered and contiguous.",
|
|
438
|
+
});
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
export const ProjectRenderPlanV1Schema = z.strictObject({
|
|
445
|
+
audioSlices: z.array(ResolvedProjectAudioSliceSchema),
|
|
446
|
+
cameraKeyframes: z.array(ProjectCameraKeyframeSchema).max(100_000),
|
|
447
|
+
cameraSegments: z.array(ProjectCameraSegmentSchema).max(100_000),
|
|
448
|
+
effects: RenderEffectsSchema,
|
|
449
|
+
kind: z.union([
|
|
450
|
+
z.literal("slopcamera.project-render-plan"),
|
|
451
|
+
z.literal("studio.project-render-plan"),
|
|
452
|
+
]),
|
|
453
|
+
output: z.strictObject({
|
|
454
|
+
background: z.string().regex(/^#[a-fA-F0-9]{6}(?:[a-fA-F0-9]{2})?$/u),
|
|
455
|
+
durationUs: z.number().int().safe().nonnegative(),
|
|
456
|
+
frameRate: z.number().finite().positive().max(240),
|
|
457
|
+
pixelHeight: Yuv420pDimensionSchema,
|
|
458
|
+
pixelWidth: Yuv420pDimensionSchema,
|
|
459
|
+
}).superRefine((output, context) => {
|
|
460
|
+
if (output.pixelWidth * output.pixelHeight > 134_217_728) {
|
|
461
|
+
context.addIssue({ code: "custom", message: "Project render output exceeds the 128-megapixel safety limit." });
|
|
462
|
+
}
|
|
463
|
+
}),
|
|
464
|
+
overlays: z.array(ResolvedProjectOverlaySchema),
|
|
465
|
+
planSha256: Sha256Schema,
|
|
466
|
+
projectEditPlanSha256: Sha256Schema,
|
|
467
|
+
projectId: VideoProjectIdSchema,
|
|
468
|
+
projectStructureSha256: Sha256Schema,
|
|
469
|
+
schemaVersion: z.literal(1),
|
|
470
|
+
videoSlices: z.array(ResolvedProjectVideoSliceSchema),
|
|
471
|
+
warnings: z.array(z.strictObject({
|
|
472
|
+
code: z.enum(["unverified-sync", "disabled-placement", "missing-media-coverage"]),
|
|
473
|
+
message: z.string().min(1).max(2_048),
|
|
474
|
+
placementId: ProjectPlacementIdSchema,
|
|
475
|
+
})),
|
|
476
|
+
}).superRefine((plan, context) => {
|
|
477
|
+
const integrityByPath = new Map<string, { readonly bytes: number; readonly sha256: string }>();
|
|
478
|
+
for (const slice of [...plan.videoSlices, ...plan.audioSlices]) {
|
|
479
|
+
if (slice.outputRange.endUs > plan.output.durationUs) {
|
|
480
|
+
context.addIssue({ code: "custom", message: `Slice ${slice.streamId} exceeds output duration.` });
|
|
481
|
+
}
|
|
482
|
+
if (
|
|
483
|
+
slice.assetRange.endUs - slice.assetRange.startUs
|
|
484
|
+
!== slice.fileRange.endUs - slice.fileRange.startUs
|
|
485
|
+
) {
|
|
486
|
+
context.addIssue({ code: "custom", message: `Slice ${slice.streamId} asset and file durations must match.` });
|
|
487
|
+
}
|
|
488
|
+
const prior = integrityByPath.get(slice.path);
|
|
489
|
+
if (prior !== undefined && (prior.bytes !== slice.bytes || prior.sha256 !== slice.sha256)) {
|
|
490
|
+
context.addIssue({ code: "custom", message: `Slices for ${slice.path} must agree on whole-file integrity.` });
|
|
491
|
+
}
|
|
492
|
+
integrityByPath.set(slice.path, { bytes: slice.bytes, sha256: slice.sha256 });
|
|
493
|
+
}
|
|
494
|
+
if (plan.overlays.some(overlay => overlay.outputRange.endUs > plan.output.durationUs)) {
|
|
495
|
+
context.addIssue({ code: "custom", message: "Resolved overlay exceeds output duration." });
|
|
496
|
+
}
|
|
497
|
+
if (plan.cameraKeyframes.some(keyframe => keyframe.outputTimeUs > plan.output.durationUs)) {
|
|
498
|
+
context.addIssue({ code: "custom", message: "Project camera keyframe exceeds output duration." });
|
|
499
|
+
}
|
|
500
|
+
if (plan.cameraSegments.some(segment => segment.outputRange.endUs > plan.output.durationUs)) {
|
|
501
|
+
context.addIssue({ code: "custom", message: "Project camera segment exceeds output duration." });
|
|
502
|
+
}
|
|
503
|
+
const cameraTransformCount = plan.cameraSegments.reduce(
|
|
504
|
+
(count, segment) => count + segment.transforms.length,
|
|
505
|
+
0,
|
|
506
|
+
);
|
|
507
|
+
if (cameraTransformCount > 100_000) {
|
|
508
|
+
context.addIssue({ code: "custom", message: "Project camera segment transform limit exceeded." });
|
|
509
|
+
}
|
|
510
|
+
const effectTimes = [
|
|
511
|
+
...plan.effects.cursorSamples.map(sample => sample.outputTimeUs),
|
|
512
|
+
...plan.effects.clickCues.map(cue => cue.outputTimeUs),
|
|
513
|
+
...plan.effects.keystrokeCues.map(cue => cue.outputTimeUs),
|
|
514
|
+
...plan.effects.typingSpans.flatMap(span => span.secure
|
|
515
|
+
? [span.startOutputUs, span.endOutputUs]
|
|
516
|
+
: [span.startOutputUs, span.endOutputUs, ...span.updates.map(update => update.outputTimeUs)]),
|
|
517
|
+
];
|
|
518
|
+
if (effectTimes.some(timeUs => timeUs > plan.output.durationUs)) {
|
|
519
|
+
context.addIssue({ code: "custom", message: "Resolved metadata effect exceeds output duration." });
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
export const ProjectRenderInvocationSchema = z.strictObject({
|
|
524
|
+
arguments: z.array(z.string()),
|
|
525
|
+
executable: z.literal("ffmpeg"),
|
|
526
|
+
filterGraph: z.strictObject({
|
|
527
|
+
bytes: z.number().int().safe().positive().max(32 * 1024 * 1024),
|
|
528
|
+
path: RepositoryRelativePathSchema,
|
|
529
|
+
sha256: Sha256Schema,
|
|
530
|
+
}),
|
|
531
|
+
outputPath: RepositoryRelativePathSchema,
|
|
532
|
+
renderPlanSha256: Sha256Schema,
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
export const ProjectRenderOutputPathSchema = RepositoryRelativePathSchema
|
|
536
|
+
.refine(
|
|
537
|
+
path => path.length <= 512,
|
|
538
|
+
"Workflow project render output paths may contain at most 512 characters.",
|
|
539
|
+
)
|
|
540
|
+
.refine(
|
|
541
|
+
path => {
|
|
542
|
+
const segments = path.split("/");
|
|
543
|
+
const leaf = segments.at(-1) ?? "";
|
|
544
|
+
const reserved = new Set([
|
|
545
|
+
".filter-graphs",
|
|
546
|
+
".overlay-cache",
|
|
547
|
+
".staging",
|
|
548
|
+
"caption-assets",
|
|
549
|
+
"plans",
|
|
550
|
+
"receipts",
|
|
551
|
+
]);
|
|
552
|
+
return segments[0] === "renders"
|
|
553
|
+
&& segments.length >= 2
|
|
554
|
+
&& !reserved.has(segments[1]!.toLowerCase())
|
|
555
|
+
&& leaf.toLowerCase() !== ".mp4"
|
|
556
|
+
&& leaf.endsWith(".mp4");
|
|
557
|
+
},
|
|
558
|
+
"Workflow project render outputs must be final lowercase .mp4 files under a non-reserved renders/ path.",
|
|
559
|
+
);
|
|
560
|
+
|
|
561
|
+
export const ProjectRenderOutputRequestSchema = z.strictObject({
|
|
562
|
+
maximumBytes: z.number().int().safe().positive().max(1_099_511_627_776),
|
|
563
|
+
path: ProjectRenderOutputPathSchema,
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
export const ProjectRenderSyncPolicySchema = z.enum([
|
|
567
|
+
"require-verified",
|
|
568
|
+
"allow-unverified",
|
|
569
|
+
]);
|
|
570
|
+
|
|
571
|
+
export const ProjectRenderToolIdentitySchema = z.strictObject({
|
|
572
|
+
bytes: z.number().int().safe().positive().max(512 * 1024 * 1024),
|
|
573
|
+
command: z.string().min(1).max(4_096).refine(
|
|
574
|
+
command => !command.includes("\0"),
|
|
575
|
+
"Render tool commands cannot contain NUL bytes.",
|
|
576
|
+
),
|
|
577
|
+
executablePath: z.string().min(1).max(4_096).refine(
|
|
578
|
+
path => path.startsWith("/") && !path.includes("\0"),
|
|
579
|
+
"Render tool executable paths must be absolute and NUL-free.",
|
|
580
|
+
),
|
|
581
|
+
executableSha256: Sha256Schema,
|
|
582
|
+
name: z.enum(["ffmpeg", "ffprobe", "rsvg-convert"]),
|
|
583
|
+
version: z.string().trim().min(1).max(300),
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
export const ProjectRenderToolchainSchema = z.strictObject({
|
|
587
|
+
ffmpeg: ProjectRenderToolIdentitySchema.refine(
|
|
588
|
+
identity => identity.name === "ffmpeg",
|
|
589
|
+
"The FFmpeg tool identity must name ffmpeg.",
|
|
590
|
+
),
|
|
591
|
+
ffprobe: ProjectRenderToolIdentitySchema.refine(
|
|
592
|
+
identity => identity.name === "ffprobe",
|
|
593
|
+
"The FFprobe tool identity must name ffprobe.",
|
|
594
|
+
),
|
|
595
|
+
rsvgConvert: ProjectRenderToolIdentitySchema.refine(
|
|
596
|
+
identity => identity.name === "rsvg-convert",
|
|
597
|
+
"The SVG renderer tool identity must name rsvg-convert.",
|
|
598
|
+
).nullable(),
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
export const ProjectRenderReceiptV1Schema = z.strictObject({
|
|
602
|
+
createdAt: IsoTimestampSchema,
|
|
603
|
+
kind: z.union([
|
|
604
|
+
z.literal("slopcamera.project-render-receipt"),
|
|
605
|
+
z.literal("studio.project-render-receipt"),
|
|
606
|
+
]),
|
|
607
|
+
output: z.strictObject({
|
|
608
|
+
bytes: z.number().int().safe().positive(),
|
|
609
|
+
path: RepositoryRelativePathSchema,
|
|
610
|
+
sha256: Sha256Schema,
|
|
611
|
+
}),
|
|
612
|
+
plan: z.strictObject({
|
|
613
|
+
path: RepositoryRelativePathSchema,
|
|
614
|
+
sha256: Sha256Schema,
|
|
615
|
+
}),
|
|
616
|
+
projectId: VideoProjectIdSchema,
|
|
617
|
+
schemaVersion: z.literal(1),
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
export type ResolvedProjectVideoSlice = ReadonlyInferred<typeof ResolvedProjectVideoSliceSchema>;
|
|
621
|
+
export type ResolvedProjectAudioSlice = ReadonlyInferred<typeof ResolvedProjectAudioSliceSchema>;
|
|
622
|
+
export type ResolvedProjectOverlay = ReadonlyInferred<typeof ResolvedProjectOverlaySchema>;
|
|
623
|
+
export type ProjectCameraKeyframe = ReadonlyInferred<typeof ProjectCameraKeyframeSchema>;
|
|
624
|
+
export type ProjectCameraSegment = ReadonlyInferred<typeof ProjectCameraSegmentSchema>;
|
|
625
|
+
export type ProjectCameraSegmentTransform = ReadonlyInferred<typeof ProjectCameraSegmentTransformSchema>;
|
|
626
|
+
export type ProjectRenderPlanV1 = ReadonlyInferred<typeof ProjectRenderPlanV1Schema>;
|
|
627
|
+
export type ProjectRenderInvocation = ReadonlyInferred<typeof ProjectRenderInvocationSchema>;
|
|
628
|
+
export type ProjectRenderOutputPath = ReadonlyInferred<typeof ProjectRenderOutputPathSchema>;
|
|
629
|
+
export type ProjectRenderOutputRequest = ReadonlyInferred<typeof ProjectRenderOutputRequestSchema>;
|
|
630
|
+
export type ProjectRenderSyncPolicy = ReadonlyInferred<typeof ProjectRenderSyncPolicySchema>;
|
|
631
|
+
export type ProjectRenderToolIdentity = ReadonlyInferred<typeof ProjectRenderToolIdentitySchema>;
|
|
632
|
+
export type ProjectRenderToolchain = ReadonlyInferred<typeof ProjectRenderToolchainSchema>;
|
|
633
|
+
export type ProjectRenderReceiptV1 = ReadonlyInferred<typeof ProjectRenderReceiptV1Schema>;
|
|
634
|
+
export type ProjectExportProfileId = ReadonlyInferred<typeof ProjectExportProfileIdSchema>;
|
|
635
|
+
export type ProjectExportProfile = ReadonlyInferred<typeof ProjectExportProfileSchema>;
|
|
636
|
+
export type ProjectRenderTier = ReadonlyInferred<typeof ProjectRenderTierSchema>;
|
|
637
|
+
export type ProjectRenderEncoderRecipe = ReadonlyInferred<typeof ProjectRenderEncoderRecipeSchema>;
|
|
638
|
+
export type ProjectRenderGeometry = ReadonlyInferred<typeof ProjectRenderGeometrySchema>;
|
|
639
|
+
export type ProjectRenderCanvas = ReadonlyInferred<typeof ProjectRenderCanvasSchema>;
|
|
640
|
+
export type ProjectRenderTarget = ReadonlyInferred<typeof ProjectRenderTargetSchema>;
|
|
641
|
+
export type ProjectExportCaptionMode = ReadonlyInferred<typeof ProjectExportCaptionModeSchema>;
|
|
642
|
+
export type ProjectExportVariant = ReadonlyInferred<typeof ProjectExportVariantSchema>;
|
|
643
|
+
export type ProjectResolvedExportProfile = ReadonlyInferred<typeof ProjectResolvedExportProfileSchema>;
|
|
644
|
+
export type ProjectCaptionRequest = ReadonlyInferred<typeof ProjectCaptionRequestSchema>;
|