@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,134 @@
|
|
|
1
|
+
export {
|
|
2
|
+
buildWorkflow,
|
|
3
|
+
defineCompute,
|
|
4
|
+
defineWorkflow,
|
|
5
|
+
seconds,
|
|
6
|
+
type BuiltWorkflow,
|
|
7
|
+
type DefineComputeOptions,
|
|
8
|
+
type WorkflowDefinition,
|
|
9
|
+
type WorkflowDefinitionOptions,
|
|
10
|
+
} from "./define-workflow";
|
|
11
|
+
export * from "../../../src/spatial-scene/index";
|
|
12
|
+
export * from "../../../src/studio/index";
|
|
13
|
+
export { StudioRunInputSchema, BoundStudioRunInputSchema, StudioRunOutputSchema, type StudioRunInput, type BoundStudioRunInput, type StudioRunOutput } from "../application/studio-port";
|
|
14
|
+
export type { SpatialRenderInput, BoundSpatialRenderInput } from "../application/operations/spatial-render";
|
|
15
|
+
export type { SpatialRenderRequest, SpatialRenderResult } from "../application/spatial-render";
|
|
16
|
+
export type { ProjectRenderInputV4, ProjectRenderOutputV4 } from "../application/operations/render/project";
|
|
17
|
+
export type {
|
|
18
|
+
SpatialProjectSnapshotInput, SpatialProjectSnapshotOutput, SpatialProjectMigrateInput,
|
|
19
|
+
SpatialProjectPatchInput, SpatialProjectRestoreInput, SpatialProjectAddShotInput, SpatialProjectAddCandidateInput,
|
|
20
|
+
SpatialProjectSelectCandidateInput, SpatialProjectReconcileInput, SpatialProjectMutationOutput,
|
|
21
|
+
} from "../application/operations/spatial-project";
|
|
22
|
+
export type {
|
|
23
|
+
SpatialInspectInput, SpatialInspectOutput, SpatialPatchInput, SpatialPatchOutput,
|
|
24
|
+
SpatialEvaluateInput, SpatialEvaluateOutput,
|
|
25
|
+
} from "../application/operations/spatial-scene";
|
|
26
|
+
export {
|
|
27
|
+
WORKFLOW_FILE_CANDIDATE_VERSION,
|
|
28
|
+
WorkflowFileCandidateSchema,
|
|
29
|
+
fileCandidate,
|
|
30
|
+
type FileCandidateInput,
|
|
31
|
+
type WorkflowFileCandidate,
|
|
32
|
+
} from "./file-candidate";
|
|
33
|
+
export {
|
|
34
|
+
MetallicLogoTreatmentSchema,
|
|
35
|
+
createMetallicLogoImageRequest,
|
|
36
|
+
createMetallicLogoPrompt,
|
|
37
|
+
type MetallicLogoImageRequest,
|
|
38
|
+
type MetallicLogoImageRequestInput,
|
|
39
|
+
type MetallicLogoTreatment,
|
|
40
|
+
} from "./creative-recipes";
|
|
41
|
+
export {
|
|
42
|
+
addManualCameraMoves,
|
|
43
|
+
addManualZooms,
|
|
44
|
+
cameraPush,
|
|
45
|
+
cameraReframe,
|
|
46
|
+
manualZoom,
|
|
47
|
+
polishedInteractionEffects,
|
|
48
|
+
preparedCameraPose,
|
|
49
|
+
removeCameraMoves,
|
|
50
|
+
removeZooms,
|
|
51
|
+
setMetadataEffects,
|
|
52
|
+
type AddManualCameraMovesEdit,
|
|
53
|
+
type AddManualZoomsEdit,
|
|
54
|
+
type CameraPushOptions,
|
|
55
|
+
type CameraReframeOptions,
|
|
56
|
+
type ManualCameraMoveInput,
|
|
57
|
+
type ManualZoomInput,
|
|
58
|
+
type ManualZoomOptions,
|
|
59
|
+
type MetadataEffectsOptions,
|
|
60
|
+
type PreparedCameraPoseInput,
|
|
61
|
+
type RemoveCameraMovesEdit,
|
|
62
|
+
type RemoveZoomsEdit,
|
|
63
|
+
type SetMetadataEffectsEdit,
|
|
64
|
+
} from "./editing";
|
|
65
|
+
export {
|
|
66
|
+
defineWorkflowFragment,
|
|
67
|
+
WorkflowBuilder,
|
|
68
|
+
type CompletedSpatialProjectMutation,
|
|
69
|
+
type BindCreativeCandidateRevisionOptions,
|
|
70
|
+
type BoundCreativeCandidateRevisionHandle,
|
|
71
|
+
type CommittedProjectHandle,
|
|
72
|
+
type CompleteEditBatchOptions,
|
|
73
|
+
type CreativeCandidateBatch,
|
|
74
|
+
type CreativeCandidateHandle,
|
|
75
|
+
type CreativeCandidateRenderHandle,
|
|
76
|
+
type CreativeCandidateRevisionHandle,
|
|
77
|
+
type CreateCreativeCandidateOptions,
|
|
78
|
+
type CreateCreativeCandidateRevisionOptions,
|
|
79
|
+
type EditBatchOptions,
|
|
80
|
+
type FaceFollowOptions,
|
|
81
|
+
type FaceFollowRevisionDraftVariants,
|
|
82
|
+
type FaceFollowVariantOptions,
|
|
83
|
+
type GatewayImageOptions,
|
|
84
|
+
type GatewaySpeechOptions,
|
|
85
|
+
type GatewayTranscriptionOptions,
|
|
86
|
+
type GatewayVideoOptions,
|
|
87
|
+
type MediaAudioEffectsOptions,
|
|
88
|
+
type MediaColorGradeOptions,
|
|
89
|
+
type MediaHtmlOverlayOptions,
|
|
90
|
+
type MediaIngestOptions,
|
|
91
|
+
type MediaOverlayOptions,
|
|
92
|
+
type MaterializedVariantSelectionHandle,
|
|
93
|
+
type MaterializeCreativeSelectionOptions,
|
|
94
|
+
type PreparedOverlayHandle,
|
|
95
|
+
type ProducedCreativeCandidateHandle,
|
|
96
|
+
type ProjectEditRevisionHandle,
|
|
97
|
+
type ProjectEditRevisionVariants,
|
|
98
|
+
type ProjectHandle,
|
|
99
|
+
type ProducedProjectSnapshotHandle,
|
|
100
|
+
type ProducedVariantMatrixHandle,
|
|
101
|
+
type ProducedVariantSelectionHandle,
|
|
102
|
+
type ProjectSnapshotHandle,
|
|
103
|
+
type RecordingStartOptions,
|
|
104
|
+
type SelectCreativeVariantOptions,
|
|
105
|
+
type VariantMatrixHandle,
|
|
106
|
+
type VariantSelectionHandle,
|
|
107
|
+
type WorkflowFragment,
|
|
108
|
+
} from "./semantic-builder";
|
|
109
|
+
export type { OperationNodeOptions } from "./graph-builder";
|
|
110
|
+
export type {
|
|
111
|
+
OperationContract,
|
|
112
|
+
OperationInputValue,
|
|
113
|
+
Ref,
|
|
114
|
+
RefValue,
|
|
115
|
+
TrustedComputeDefinition,
|
|
116
|
+
WorkflowOutputValue,
|
|
117
|
+
} from "./contracts";
|
|
118
|
+
export {
|
|
119
|
+
CandidateProjectEditBatchV3Schema,
|
|
120
|
+
CreativeCandidateReferenceV1Schema,
|
|
121
|
+
CreativeRenderNameSchema,
|
|
122
|
+
CreativeVariantKeySchema,
|
|
123
|
+
VariantMatrixReferenceV1Schema,
|
|
124
|
+
VariantSelectionEvidenceV1Schema,
|
|
125
|
+
VariantSelectionReferenceV1Schema,
|
|
126
|
+
type CandidateProjectEditBatchV3,
|
|
127
|
+
type CreativeCandidateReferenceV1,
|
|
128
|
+
type VariantMatrixReferenceV1,
|
|
129
|
+
type VariantSelectionReferenceV1,
|
|
130
|
+
} from "../application/creative-iteration";
|
|
131
|
+
export {
|
|
132
|
+
ProjectSnapshotOutputSchema,
|
|
133
|
+
type ProjectSnapshotOutput,
|
|
134
|
+
} from "../application/operations/project/snapshot";
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ApplicationError } from "../application/errors";
|
|
2
|
+
import type {
|
|
3
|
+
JsonValue,
|
|
4
|
+
SerializedRefV1,
|
|
5
|
+
} from "./contracts";
|
|
6
|
+
|
|
7
|
+
function isJsonArray(value: JsonValue): value is readonly JsonValue[] {
|
|
8
|
+
return Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function isJsonRecord(
|
|
12
|
+
value: JsonValue,
|
|
13
|
+
): value is Readonly<Record<string, JsonValue>> {
|
|
14
|
+
return typeof value === "object" && value !== null && !isJsonArray(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function projectReferenceValue(
|
|
18
|
+
reference: SerializedRefV1,
|
|
19
|
+
value: JsonValue,
|
|
20
|
+
): JsonValue {
|
|
21
|
+
let projected = value;
|
|
22
|
+
for (const segment of reference.$ref.path ?? []) {
|
|
23
|
+
if (typeof segment === "number") {
|
|
24
|
+
if (
|
|
25
|
+
!isJsonArray(projected)
|
|
26
|
+
|| !Number.isSafeInteger(segment)
|
|
27
|
+
|| segment < 0
|
|
28
|
+
|| segment >= projected.length
|
|
29
|
+
|| !Object.hasOwn(projected, segment)
|
|
30
|
+
) {
|
|
31
|
+
throw new ApplicationError(
|
|
32
|
+
"invalid-data",
|
|
33
|
+
`Reference ${reference.$ref.nodeKey} has an invalid array projection at ${String(segment)}.`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
const item = projected[segment];
|
|
37
|
+
if (item === undefined) {
|
|
38
|
+
throw new ApplicationError(
|
|
39
|
+
"invalid-data",
|
|
40
|
+
`Reference ${reference.$ref.nodeKey} projects an absent array item.`,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
projected = item;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!isJsonRecord(projected) || !Object.hasOwn(projected, segment)) {
|
|
47
|
+
throw new ApplicationError(
|
|
48
|
+
"invalid-data",
|
|
49
|
+
`Reference ${reference.$ref.nodeKey} has an invalid field projection at ${segment}.`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
const item = projected[segment];
|
|
53
|
+
if (item === undefined) {
|
|
54
|
+
throw new ApplicationError(
|
|
55
|
+
"invalid-data",
|
|
56
|
+
`Reference ${reference.$ref.nodeKey} projects an absent field.`,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
projected = item;
|
|
60
|
+
}
|
|
61
|
+
return projected;
|
|
62
|
+
}
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SpatialProjectMutationOutputSchema } from "../contracts/spatial-project";
|
|
3
|
+
|
|
4
|
+
import { OPERATION_KINDS } from "../application/operation";
|
|
5
|
+
import {
|
|
6
|
+
canonicalJsonFingerprint,
|
|
7
|
+
type CanonicalJsonFingerprint,
|
|
8
|
+
} from "../core/canonical-json";
|
|
9
|
+
import {
|
|
10
|
+
AuthoredOperationIdentitySchema,
|
|
11
|
+
AuthoredComputeIdentitySchema,
|
|
12
|
+
AuthoredNodeExecutorSchema,
|
|
13
|
+
GraphPlanV1Schema,
|
|
14
|
+
JsonValueSchema,
|
|
15
|
+
NodeKeySchema,
|
|
16
|
+
OperationPolicySchema,
|
|
17
|
+
WorkflowNodePolicySchema,
|
|
18
|
+
PositiveSafeIntegerSchema,
|
|
19
|
+
Sha256Schema,
|
|
20
|
+
WorkflowBundleIdentitySchema,
|
|
21
|
+
WorkflowIdentitySchema,
|
|
22
|
+
WorkflowRuntimeIdentitySchema,
|
|
23
|
+
type JsonValue,
|
|
24
|
+
} from "./contracts";
|
|
25
|
+
|
|
26
|
+
export const RUN_STORE_VERSION = "slopcamera-run-store-v2" as const;
|
|
27
|
+
export const RUN_NODE_VERSION = "slopcamera-run-node-v2" as const;
|
|
28
|
+
export const NODE_PREPARATION_PLAN_VERSION = "slopcamera-node-preparation-plan-v2" as const;
|
|
29
|
+
export const NODE_EXECUTION_PLAN_VERSION = "slopcamera-node-execution-plan-v2" as const;
|
|
30
|
+
export const RUN_EVENT_VERSION = "slopcamera-run-event-v2" as const;
|
|
31
|
+
export const RUN_GRANT_VERSION = "slopcamera-run-grant-v2" as const;
|
|
32
|
+
export const RUN_FENCE_VERSION = "slopcamera-run-fence-v2" as const;
|
|
33
|
+
export const RUN_OUTPUTS_VERSION = "slopcamera-run-outputs-v2" as const;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Active durable runs are machine-local execution state, not portable authored
|
|
37
|
+
* artifacts. V1 runs must finish with the v1 host or restart under v2 because
|
|
38
|
+
* translating their plan hashes would also retarget staging and replay grants.
|
|
39
|
+
* Saved workflow source, projects, and completed artifacts remain separate
|
|
40
|
+
* compatibility boundaries.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
export const NODE_PREPARATION_PLAN_HASH_DOMAIN =
|
|
44
|
+
"studio.workflow.node-preparation-plan/v2" as const;
|
|
45
|
+
export const NODE_EXECUTION_PLAN_HASH_DOMAIN =
|
|
46
|
+
"studio.workflow.node-execution-plan/v2" as const;
|
|
47
|
+
export const NODE_INPUT_HASH_DOMAIN = "studio.workflow.node-input/v1" as const;
|
|
48
|
+
export const NODE_OUTPUT_HASH_DOMAIN = "studio.workflow.node-output/v1" as const;
|
|
49
|
+
export const RUN_OUTPUTS_HASH_DOMAIN = "studio.workflow.run-outputs/v1" as const;
|
|
50
|
+
|
|
51
|
+
const RunIdSchema = z.string().regex(/^run_[a-z0-9][a-z0-9_-]{5,95}$/u);
|
|
52
|
+
const TimestampSchema = z.string().datetime({ offset: true });
|
|
53
|
+
const OwnerSchema = z.string().min(1).max(256);
|
|
54
|
+
const FenceTokenSchema = z.string().uuid();
|
|
55
|
+
const BoundedMessageSchema = z.string().min(1).max(4_000);
|
|
56
|
+
|
|
57
|
+
export const RunStatusSchema = z.enum([
|
|
58
|
+
"planned",
|
|
59
|
+
"running",
|
|
60
|
+
"approval-required",
|
|
61
|
+
"ambiguous-code",
|
|
62
|
+
"completed",
|
|
63
|
+
"partial",
|
|
64
|
+
"failed",
|
|
65
|
+
"cancelled",
|
|
66
|
+
"incompatible",
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
export type RunStatus = z.infer<typeof RunStatusSchema>;
|
|
70
|
+
|
|
71
|
+
export const RunNodeStatusSchema = z.enum([
|
|
72
|
+
"pending",
|
|
73
|
+
"ready",
|
|
74
|
+
"preparing",
|
|
75
|
+
"approval-required",
|
|
76
|
+
"running",
|
|
77
|
+
"completed",
|
|
78
|
+
"failed",
|
|
79
|
+
"skipped",
|
|
80
|
+
"cancelled",
|
|
81
|
+
"ambiguous-code",
|
|
82
|
+
"ambiguous",
|
|
83
|
+
"incompatible",
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
export const RunFenceSchema = z.strictObject({
|
|
87
|
+
acquiredAt: TimestampSchema,
|
|
88
|
+
generation: PositiveSafeIntegerSchema,
|
|
89
|
+
hostname: z.string().min(1).max(255),
|
|
90
|
+
owner: OwnerSchema,
|
|
91
|
+
pid: PositiveSafeIntegerSchema,
|
|
92
|
+
runId: RunIdSchema,
|
|
93
|
+
token: FenceTokenSchema,
|
|
94
|
+
version: z.literal(RUN_FENCE_VERSION),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
export type RunFence = z.infer<typeof RunFenceSchema>;
|
|
98
|
+
|
|
99
|
+
export const RunWorkflowRecordSchema = z.strictObject({
|
|
100
|
+
bundle: WorkflowBundleIdentitySchema,
|
|
101
|
+
sourceLocator: z.string().min(1).max(2_048),
|
|
102
|
+
workflow: WorkflowIdentitySchema,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
export type RunWorkflowRecord = z.infer<typeof RunWorkflowRecordSchema>;
|
|
106
|
+
|
|
107
|
+
export const RunRuntimeRecordSchema = z.strictObject({
|
|
108
|
+
computes: z.array(AuthoredComputeIdentitySchema).max(4_096),
|
|
109
|
+
operations: z.array(AuthoredOperationIdentitySchema).max(OPERATION_KINDS.length * 32),
|
|
110
|
+
runtime: WorkflowRuntimeIdentitySchema,
|
|
111
|
+
version: z.literal(RUN_STORE_VERSION),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export type RunRuntimeRecord = z.infer<typeof RunRuntimeRecordSchema>;
|
|
115
|
+
|
|
116
|
+
export const NodePreparationPlanUnsignedSchema = z.strictObject({
|
|
117
|
+
exactInputBound: z.literal(true).optional(),
|
|
118
|
+
graphPlanSha256: Sha256Schema,
|
|
119
|
+
inputDescriptors: JsonValueSchema,
|
|
120
|
+
nodeKey: NodeKeySchema,
|
|
121
|
+
executor: AuthoredNodeExecutorSchema,
|
|
122
|
+
requestedPreparation: OperationPolicySchema.shape.preparation,
|
|
123
|
+
upperDurationMs: z.number().int().nonnegative().safe(),
|
|
124
|
+
upperInputBytes: z.number().int().nonnegative().safe(),
|
|
125
|
+
version: z.literal(NODE_PREPARATION_PLAN_VERSION),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
export const NodePreparationPlanSchema = NodePreparationPlanUnsignedSchema.extend({
|
|
129
|
+
preparationPlanSha256: Sha256Schema,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
export type NodePreparationPlan = z.infer<typeof NodePreparationPlanSchema>;
|
|
133
|
+
|
|
134
|
+
export const NodeExecutionPlanUnsignedSchema = z.strictObject({
|
|
135
|
+
dependencyOutputDigests: z.record(NodeKeySchema, Sha256Schema),
|
|
136
|
+
exactInput: JsonValueSchema,
|
|
137
|
+
expectedProjectGeneration: Sha256Schema.optional(),
|
|
138
|
+
graphPlanSha256: Sha256Schema,
|
|
139
|
+
inputSha256: Sha256Schema,
|
|
140
|
+
nodeKey: NodeKeySchema,
|
|
141
|
+
executor: AuthoredNodeExecutorSchema,
|
|
142
|
+
policy: WorkflowNodePolicySchema,
|
|
143
|
+
preparationPlanSha256: Sha256Schema,
|
|
144
|
+
publicationKeys: z.array(z.string().min(1).max(512)).max(64),
|
|
145
|
+
version: z.literal(NODE_EXECUTION_PLAN_VERSION),
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
export const NodeExecutionPlanSchema = NodeExecutionPlanUnsignedSchema.extend({
|
|
149
|
+
nodePlanSha256: Sha256Schema,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
export type NodeExecutionPlan = z.infer<typeof NodeExecutionPlanSchema>;
|
|
153
|
+
|
|
154
|
+
function domainHash(domain: string, value: unknown): string {
|
|
155
|
+
return canonicalJsonFingerprint(value, `${domain}\0`).sha256;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function createNodePreparationPlanHash(
|
|
159
|
+
input: z.input<typeof NodePreparationPlanUnsignedSchema>,
|
|
160
|
+
): string {
|
|
161
|
+
return domainHash(
|
|
162
|
+
NODE_PREPARATION_PLAN_HASH_DOMAIN,
|
|
163
|
+
NodePreparationPlanUnsignedSchema.parse(input),
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function createNodeInputHash(input: z.input<typeof JsonValueSchema>): string {
|
|
168
|
+
return createNodeInputFingerprint(input).sha256;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function createNodeInputFingerprint(
|
|
172
|
+
input: z.input<typeof JsonValueSchema>,
|
|
173
|
+
): CanonicalJsonFingerprint {
|
|
174
|
+
return createNodeInputFingerprintFromParsed(JsonValueSchema.parse(input));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function createNodeInputFingerprintFromParsed(
|
|
178
|
+
input: JsonValue,
|
|
179
|
+
): CanonicalJsonFingerprint {
|
|
180
|
+
return canonicalJsonFingerprint(
|
|
181
|
+
input,
|
|
182
|
+
`${NODE_INPUT_HASH_DOMAIN}\0`,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function createNodeExecutionPlanHash(
|
|
187
|
+
input: z.input<typeof NodeExecutionPlanUnsignedSchema>,
|
|
188
|
+
): string {
|
|
189
|
+
return domainHash(
|
|
190
|
+
NODE_EXECUTION_PLAN_HASH_DOMAIN,
|
|
191
|
+
NodeExecutionPlanUnsignedSchema.parse(input),
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function createRunNodeOutputDigest(input: z.input<typeof JsonValueSchema>): string {
|
|
196
|
+
return createRunNodeOutputFingerprint(input).sha256;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function createRunNodeOutputFingerprint(
|
|
200
|
+
input: z.input<typeof JsonValueSchema>,
|
|
201
|
+
): CanonicalJsonFingerprint {
|
|
202
|
+
return createRunNodeOutputFingerprintFromParsed(JsonValueSchema.parse(input));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function createRunNodeOutputFingerprintFromParsed(
|
|
206
|
+
input: JsonValue,
|
|
207
|
+
): CanonicalJsonFingerprint {
|
|
208
|
+
return canonicalJsonFingerprint(
|
|
209
|
+
input,
|
|
210
|
+
`${NODE_OUTPUT_HASH_DOMAIN}\0`,
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function createRunOutputsDigest(input: z.input<typeof JsonValueSchema>): string {
|
|
215
|
+
return domainHash(RUN_OUTPUTS_HASH_DOMAIN, JsonValueSchema.parse(input));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const RunNodeFailureSchema = z.strictObject({
|
|
219
|
+
spatialPublication: SpatialProjectMutationOutputSchema.optional(),
|
|
220
|
+
code: z.enum([
|
|
221
|
+
"authorization-required",
|
|
222
|
+
"cancelled",
|
|
223
|
+
"conflict",
|
|
224
|
+
"incompatible",
|
|
225
|
+
"invalid-data",
|
|
226
|
+
"subprocess",
|
|
227
|
+
"unavailable",
|
|
228
|
+
"unsupported-plan",
|
|
229
|
+
"ambiguous",
|
|
230
|
+
"internal",
|
|
231
|
+
]),
|
|
232
|
+
message: BoundedMessageSchema,
|
|
233
|
+
retryable: z.boolean(),
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
export const RunNodeOutputSchema = z.strictObject({
|
|
237
|
+
digestSha256: Sha256Schema,
|
|
238
|
+
receiptReference: z.string().min(1).max(2_048).optional(),
|
|
239
|
+
summary: z.record(
|
|
240
|
+
z.string().min(1).max(128),
|
|
241
|
+
z.union([z.boolean(), z.null(), z.number().finite(), z.string().max(2_000)]),
|
|
242
|
+
),
|
|
243
|
+
value: JsonValueSchema,
|
|
244
|
+
}).superRefine((output, context) => {
|
|
245
|
+
if (Object.keys(output.summary).length > 32) {
|
|
246
|
+
context.addIssue({ code: "custom", message: "Run node summaries may contain at most 32 fields." });
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
export type RunNodeOutput = z.infer<typeof RunNodeOutputSchema>;
|
|
251
|
+
|
|
252
|
+
export const RunNodeRecordSchema = z.strictObject({
|
|
253
|
+
attempt: z.number().int().nonnegative().safe(),
|
|
254
|
+
dependencies: z.array(NodeKeySchema).max(4_096),
|
|
255
|
+
executionPlan: NodeExecutionPlanSchema.optional(),
|
|
256
|
+
failure: RunNodeFailureSchema.optional(),
|
|
257
|
+
finishedAt: TimestampSchema.optional(),
|
|
258
|
+
nodeKey: NodeKeySchema,
|
|
259
|
+
executor: AuthoredNodeExecutorSchema,
|
|
260
|
+
output: RunNodeOutputSchema.optional(),
|
|
261
|
+
preparationPlan: NodePreparationPlanSchema.optional(),
|
|
262
|
+
startedAt: TimestampSchema.optional(),
|
|
263
|
+
status: RunNodeStatusSchema,
|
|
264
|
+
version: z.literal(RUN_NODE_VERSION),
|
|
265
|
+
}).superRefine((record, context) => {
|
|
266
|
+
const terminal = [
|
|
267
|
+
"ambiguous",
|
|
268
|
+
"ambiguous-code",
|
|
269
|
+
"cancelled",
|
|
270
|
+
"completed",
|
|
271
|
+
"failed",
|
|
272
|
+
"incompatible",
|
|
273
|
+
"skipped",
|
|
274
|
+
].includes(record.status);
|
|
275
|
+
const dispatched = [
|
|
276
|
+
"ambiguous",
|
|
277
|
+
"ambiguous-code",
|
|
278
|
+
"completed",
|
|
279
|
+
"running",
|
|
280
|
+
].includes(record.status);
|
|
281
|
+
if (terminal && record.finishedAt === undefined) {
|
|
282
|
+
context.addIssue({ code: "custom", message: "Terminal run nodes require finishedAt." });
|
|
283
|
+
}
|
|
284
|
+
if (!terminal && record.finishedAt !== undefined) {
|
|
285
|
+
context.addIssue({ code: "custom", message: "Nonterminal run nodes cannot have finishedAt." });
|
|
286
|
+
}
|
|
287
|
+
if (dispatched && record.startedAt === undefined) {
|
|
288
|
+
context.addIssue({ code: "custom", message: "Dispatched run nodes require startedAt." });
|
|
289
|
+
}
|
|
290
|
+
if (dispatched && record.attempt < 1) {
|
|
291
|
+
context.addIssue({ code: "custom", message: "Dispatched run nodes require a positive attempt." });
|
|
292
|
+
}
|
|
293
|
+
if (record.startedAt !== undefined && record.finishedAt !== undefined) {
|
|
294
|
+
if (Date.parse(record.finishedAt) < Date.parse(record.startedAt)) {
|
|
295
|
+
context.addIssue({ code: "custom", message: "Run node finishedAt cannot precede startedAt." });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (record.status === "completed") {
|
|
299
|
+
if (
|
|
300
|
+
record.output === undefined
|
|
301
|
+
|| record.executionPlan === undefined
|
|
302
|
+
|| record.preparationPlan === undefined
|
|
303
|
+
) {
|
|
304
|
+
context.addIssue({
|
|
305
|
+
code: "custom",
|
|
306
|
+
message: "Completed run nodes require preparation, execution, and verified output records.",
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (
|
|
311
|
+
["running", "ambiguous", "ambiguous-code"].includes(record.status)
|
|
312
|
+
&& (record.executionPlan === undefined || record.preparationPlan === undefined)
|
|
313
|
+
) {
|
|
314
|
+
context.addIssue({
|
|
315
|
+
code: "custom",
|
|
316
|
+
message: `${record.status} run nodes require preparation and execution plans.`,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
if (record.status === "approval-required" && record.preparationPlan === undefined) {
|
|
320
|
+
context.addIssue({
|
|
321
|
+
code: "custom",
|
|
322
|
+
message: "Approval-required run nodes require a preparation plan.",
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
if (record.output !== undefined && record.status !== "completed") {
|
|
326
|
+
context.addIssue({ code: "custom", message: "Only completed run nodes may publish output." });
|
|
327
|
+
}
|
|
328
|
+
if (
|
|
329
|
+
["failed", "incompatible", "ambiguous-code", "ambiguous"].includes(record.status)
|
|
330
|
+
&& record.failure === undefined
|
|
331
|
+
) {
|
|
332
|
+
context.addIssue({ code: "custom", message: `${record.status} run nodes require failure details.` });
|
|
333
|
+
}
|
|
334
|
+
if (
|
|
335
|
+
record.failure !== undefined
|
|
336
|
+
&& !["ambiguous", "ambiguous-code", "cancelled", "failed", "incompatible"].includes(record.status)
|
|
337
|
+
) {
|
|
338
|
+
context.addIssue({
|
|
339
|
+
code: "custom",
|
|
340
|
+
message: `Run node status ${record.status} cannot retain failure details.`,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
export type RunNodeRecord = z.infer<typeof RunNodeRecordSchema>;
|
|
346
|
+
|
|
347
|
+
export const RunEventSchema = z.strictObject({
|
|
348
|
+
details: z.record(
|
|
349
|
+
z.string().min(1).max(128),
|
|
350
|
+
z.union([z.boolean(), z.null(), z.number().finite(), z.string().max(2_000)]),
|
|
351
|
+
),
|
|
352
|
+
fenceGeneration: PositiveSafeIntegerSchema,
|
|
353
|
+
kind: z.enum([
|
|
354
|
+
"run-claimed",
|
|
355
|
+
"run-status",
|
|
356
|
+
"node-status",
|
|
357
|
+
"node-reused",
|
|
358
|
+
"approval-required",
|
|
359
|
+
"run-finalized",
|
|
360
|
+
]),
|
|
361
|
+
nodeKey: NodeKeySchema.optional(),
|
|
362
|
+
runId: RunIdSchema,
|
|
363
|
+
sequence: PositiveSafeIntegerSchema,
|
|
364
|
+
timestamp: TimestampSchema,
|
|
365
|
+
version: z.literal(RUN_EVENT_VERSION),
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
export type RunEvent = z.infer<typeof RunEventSchema>;
|
|
369
|
+
export type NewRunEvent = Omit<RunEvent, "fenceGeneration" | "runId" | "sequence" | "version">;
|
|
370
|
+
|
|
371
|
+
const GrantBaseSchema = z.strictObject({
|
|
372
|
+
createdAt: TimestampSchema,
|
|
373
|
+
graphPlanSha256: Sha256Schema,
|
|
374
|
+
grantedBy: OwnerSchema,
|
|
375
|
+
grantId: z.string().uuid(),
|
|
376
|
+
runId: RunIdSchema,
|
|
377
|
+
version: z.literal(RUN_GRANT_VERSION),
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
export const RunGrantSchema = z.discriminatedUnion("kind", [
|
|
381
|
+
GrantBaseSchema.extend({
|
|
382
|
+
kind: z.literal("graph-policy"),
|
|
383
|
+
scopes: z.array(z.string().min(1).max(128)).min(1).max(128),
|
|
384
|
+
}),
|
|
385
|
+
GrantBaseSchema.extend({
|
|
386
|
+
kind: z.literal("preparation"),
|
|
387
|
+
nodeKey: NodeKeySchema,
|
|
388
|
+
preparationPlanSha256: Sha256Schema,
|
|
389
|
+
}),
|
|
390
|
+
GrantBaseSchema.extend({
|
|
391
|
+
kind: z.literal("effect"),
|
|
392
|
+
nodeKey: NodeKeySchema,
|
|
393
|
+
nodePlanSha256: Sha256Schema,
|
|
394
|
+
}),
|
|
395
|
+
GrantBaseSchema.extend({
|
|
396
|
+
attempt: PositiveSafeIntegerSchema,
|
|
397
|
+
bundleSha256: Sha256Schema,
|
|
398
|
+
computeKey: z.string().min(1).max(255),
|
|
399
|
+
kind: z.literal("compute-replay"),
|
|
400
|
+
nodeKey: NodeKeySchema,
|
|
401
|
+
nodePlanSha256: Sha256Schema,
|
|
402
|
+
}),
|
|
403
|
+
]);
|
|
404
|
+
|
|
405
|
+
export type RunGrant = z.infer<typeof RunGrantSchema>;
|
|
406
|
+
export type NewRunGrant = RunGrant extends infer Grant
|
|
407
|
+
? Grant extends RunGrant
|
|
408
|
+
? Omit<Grant, "runId" | "version">
|
|
409
|
+
: never
|
|
410
|
+
: never;
|
|
411
|
+
|
|
412
|
+
export const CancellationRequestSchema = z.strictObject({
|
|
413
|
+
requestedAt: TimestampSchema,
|
|
414
|
+
requestedBy: OwnerSchema,
|
|
415
|
+
runId: RunIdSchema,
|
|
416
|
+
version: z.literal(RUN_STORE_VERSION),
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
export type CancellationRequest = z.infer<typeof CancellationRequestSchema>;
|
|
420
|
+
|
|
421
|
+
export const RunSummarySchema = z.strictObject({
|
|
422
|
+
counts: z.strictObject({
|
|
423
|
+
cancelled: z.number().int().nonnegative().safe(),
|
|
424
|
+
completed: z.number().int().nonnegative().safe(),
|
|
425
|
+
failed: z.number().int().nonnegative().safe(),
|
|
426
|
+
pending: z.number().int().nonnegative().safe(),
|
|
427
|
+
skipped: z.number().int().nonnegative().safe(),
|
|
428
|
+
}),
|
|
429
|
+
finishedAt: TimestampSchema.optional(),
|
|
430
|
+
graphPlanSha256: Sha256Schema,
|
|
431
|
+
outputs: JsonValueSchema.optional(),
|
|
432
|
+
runId: RunIdSchema,
|
|
433
|
+
startedAt: TimestampSchema.optional(),
|
|
434
|
+
status: RunStatusSchema,
|
|
435
|
+
updatedAt: TimestampSchema,
|
|
436
|
+
version: z.literal(RUN_STORE_VERSION),
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
export type RunSummary = z.infer<typeof RunSummarySchema>;
|
|
440
|
+
|
|
441
|
+
export const RunOutputsSchema = z.strictObject({
|
|
442
|
+
graphPlanSha256: Sha256Schema,
|
|
443
|
+
nodeOutputDigests: z.record(NodeKeySchema, Sha256Schema),
|
|
444
|
+
outputs: JsonValueSchema,
|
|
445
|
+
outputsSha256: Sha256Schema,
|
|
446
|
+
runId: RunIdSchema,
|
|
447
|
+
version: z.literal(RUN_OUTPUTS_VERSION),
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
export type RunOutputs = z.infer<typeof RunOutputsSchema>;
|
|
451
|
+
|
|
452
|
+
export const CreateRunRecordSchema = z.strictObject({
|
|
453
|
+
bundleBytes: z.instanceof(Uint8Array),
|
|
454
|
+
graphPlan: GraphPlanV1Schema,
|
|
455
|
+
runId: RunIdSchema,
|
|
456
|
+
runtime: RunRuntimeRecordSchema,
|
|
457
|
+
sourceLocator: z.string().min(1).max(2_048),
|
|
458
|
+
workflow: RunWorkflowRecordSchema,
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
export type CreateRunRecord = z.infer<typeof CreateRunRecordSchema>;
|
|
462
|
+
|
|
463
|
+
export function nodeRecordFilename(nodeKey: string): string {
|
|
464
|
+
const key = NodeKeySchema.parse(nodeKey);
|
|
465
|
+
return `${Bun.CryptoHasher.hash("sha256", key, "hex")}.json`;
|
|
466
|
+
}
|