@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,69 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
RepositoryRelativePathSchema,
|
|
5
|
+
Sha256Schema,
|
|
6
|
+
} from "../contracts";
|
|
7
|
+
|
|
8
|
+
export const WORKFLOW_FILE_CANDIDATE_VERSION =
|
|
9
|
+
"slopcamera-workflow-file-candidate-v1" as const;
|
|
10
|
+
|
|
11
|
+
const CandidatePathSchema = RepositoryRelativePathSchema.and(
|
|
12
|
+
z.string().max(256),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
export const WorkflowFileCandidateSchema = z.strictObject({
|
|
16
|
+
bytes: z.number().int().safe().positive().optional(),
|
|
17
|
+
kind: z.literal("file"),
|
|
18
|
+
mediaType: z.string()
|
|
19
|
+
.max(160)
|
|
20
|
+
.regex(
|
|
21
|
+
/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/u,
|
|
22
|
+
)
|
|
23
|
+
.optional(),
|
|
24
|
+
path: CandidatePathSchema,
|
|
25
|
+
sha256: Sha256Schema.optional(),
|
|
26
|
+
version: z.literal(WORKFLOW_FILE_CANDIDATE_VERSION),
|
|
27
|
+
}).superRefine((candidate, context) => {
|
|
28
|
+
if ((candidate.bytes === undefined) !== (candidate.sha256 === undefined)) {
|
|
29
|
+
context.addIssue({
|
|
30
|
+
code: "custom",
|
|
31
|
+
message: "Exact file candidates require both bytes and sha256.",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export type WorkflowFileCandidate =
|
|
37
|
+
z.infer<typeof WorkflowFileCandidateSchema>;
|
|
38
|
+
|
|
39
|
+
interface FileCandidateBase {
|
|
40
|
+
readonly mediaType?: string;
|
|
41
|
+
readonly path: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type FileCandidateInput =
|
|
45
|
+
| string
|
|
46
|
+
| (FileCandidateBase & {
|
|
47
|
+
readonly bytes?: never;
|
|
48
|
+
readonly sha256?: never;
|
|
49
|
+
})
|
|
50
|
+
| (FileCandidateBase & {
|
|
51
|
+
readonly bytes: number;
|
|
52
|
+
readonly sha256: string;
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Declares local-file authority in workflow input without opening the file.
|
|
57
|
+
*
|
|
58
|
+
* Trusted compute may choose among these inert declarations. A registered
|
|
59
|
+
* media/Gateway operation still reopens, hashes, and binds the chosen file in
|
|
60
|
+
* its exact node plan before effect authorization.
|
|
61
|
+
*/
|
|
62
|
+
export function fileCandidate(input: FileCandidateInput): WorkflowFileCandidate {
|
|
63
|
+
const candidate = typeof input === "string" ? { path: input } : input;
|
|
64
|
+
return WorkflowFileCandidateSchema.parse({
|
|
65
|
+
...candidate,
|
|
66
|
+
kind: "file",
|
|
67
|
+
version: WORKFLOW_FILE_CANDIDATE_VERSION,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Desktop compatibility façade for the canonical SDK graph builder. */
|
|
2
|
+
export {
|
|
3
|
+
WorkflowGraphBuilder,
|
|
4
|
+
defineWorkflowFragment,
|
|
5
|
+
operationContract,
|
|
6
|
+
type OperationDiscoveryProvider as OperationDiscoverySource,
|
|
7
|
+
type OperationNodeOptions,
|
|
8
|
+
type UntypedOperationRequest,
|
|
9
|
+
type WorkflowFragment,
|
|
10
|
+
} from "@hraness/slopcamera/code/advanced";
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
HostResourceClaim,
|
|
3
|
+
HostResourceCoordinator,
|
|
4
|
+
} from "@hraness/slopcamera/host-resources";
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
OperationResourceClaim,
|
|
8
|
+
OperationResourceKind,
|
|
9
|
+
} from "../application/operation";
|
|
10
|
+
|
|
11
|
+
const PHYSICAL_HOST_RESOURCE_BY_OPERATION: Readonly<Partial<Record<
|
|
12
|
+
OperationResourceKind,
|
|
13
|
+
HostResourceClaim["resource"]
|
|
14
|
+
>>> = Object.freeze({
|
|
15
|
+
browser: "browser",
|
|
16
|
+
"capture-device": "capture-device",
|
|
17
|
+
cpu: "cpu",
|
|
18
|
+
ffmpeg: "ffmpeg",
|
|
19
|
+
"local-io": "local-io",
|
|
20
|
+
network: "network",
|
|
21
|
+
"paid-call": "paid-call",
|
|
22
|
+
"project-render": "video-encode",
|
|
23
|
+
vision: "vision",
|
|
24
|
+
whisper: "whisper",
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Convert semantic operation claims into the machine-wide physical budget.
|
|
29
|
+
* Every FFmpeg recipe remains conservatively single-flight until its complete
|
|
30
|
+
* decoder, filter, and encoder thread budget is bound into the exact plan.
|
|
31
|
+
*/
|
|
32
|
+
export function physicalHostResourceClaims(
|
|
33
|
+
resources: readonly OperationResourceClaim[],
|
|
34
|
+
coordinator: HostResourceCoordinator,
|
|
35
|
+
): readonly HostResourceClaim[] {
|
|
36
|
+
const totals = new Map<string, number>();
|
|
37
|
+
for (const claim of resources) {
|
|
38
|
+
const resource = PHYSICAL_HOST_RESOURCE_BY_OPERATION[claim.resource];
|
|
39
|
+
if (resource === undefined) continue;
|
|
40
|
+
totals.set(resource, (totals.get(resource) ?? 0) + claim.amount);
|
|
41
|
+
}
|
|
42
|
+
if (resources.some(claim => (
|
|
43
|
+
claim.resource === "ffmpeg" || claim.resource === "project-render"
|
|
44
|
+
))) {
|
|
45
|
+
for (const resource of ["cpu", "ffmpeg"] as const) {
|
|
46
|
+
const capacity = coordinator.profile.capacities.find(
|
|
47
|
+
candidate => candidate.resource === resource,
|
|
48
|
+
);
|
|
49
|
+
if (capacity !== undefined) totals.set(resource, capacity.limit);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return [...totals]
|
|
53
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
54
|
+
.map(([resource, amount]) => ({ amount, resource }));
|
|
55
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
AuthoredWorkflowGraphV1Schema,
|
|
4
|
+
GRAPH_ABI,
|
|
5
|
+
LEGACY_GRAPH_ABI,
|
|
6
|
+
GraphCompilerLimitsSchema,
|
|
7
|
+
JsonValueSchema,
|
|
8
|
+
MAX_SERIALIZED_GRAPH_NODES,
|
|
9
|
+
NodeKeySchema,
|
|
10
|
+
NonnegativeSafeIntegerSchema,
|
|
11
|
+
OperationDiscoverySchema as PortableOperationDiscoverySchema,
|
|
12
|
+
RequirementEnvelopeSchema,
|
|
13
|
+
Sha256Schema,
|
|
14
|
+
} from "@hraness/slopcamera/code/advanced";
|
|
15
|
+
|
|
16
|
+
import { OPERATION_KINDS } from "../application/operation";
|
|
17
|
+
|
|
18
|
+
export const OperationKindSchema = z.enum(OPERATION_KINDS);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The portable graph accepts namespaced operation identities. A persisted
|
|
22
|
+
* Desktop plan is a projection over the closed local registry, so it narrows
|
|
23
|
+
* discovery back to operation kinds this host can actually execute.
|
|
24
|
+
*/
|
|
25
|
+
export const OperationDiscoverySchema = PortableOperationDiscoverySchema.extend({
|
|
26
|
+
kind: OperationKindSchema,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export type GraphOperationDiscovery = z.infer<typeof OperationDiscoverySchema>;
|
|
30
|
+
|
|
31
|
+
export const GRAPH_PLAN_VERSION = "slopcamera-graph-plan-v2" as const;
|
|
32
|
+
export const GRAPH_COMPILER_ABI = "slopcamera-workflow-compiler-v2" as const;
|
|
33
|
+
export const GRAPH_SCHEDULER_ABI = "slopcamera-workflow-scheduler-v2" as const;
|
|
34
|
+
export const CODE_WORKER_ABI = "slopcamera-code-worker-abi-v4" as const;
|
|
35
|
+
export const STATIC_BINDINGS_VERSION = "slopcamera-static-bindings-v1" as const;
|
|
36
|
+
|
|
37
|
+
export const OPERATION_FAMILIES = [
|
|
38
|
+
"analysis",
|
|
39
|
+
"compute",
|
|
40
|
+
"derive",
|
|
41
|
+
"edit",
|
|
42
|
+
"gateway",
|
|
43
|
+
"iteration",
|
|
44
|
+
"media",
|
|
45
|
+
"project",
|
|
46
|
+
"recording",
|
|
47
|
+
"render",
|
|
48
|
+
"slopcamera",
|
|
49
|
+
"scene",
|
|
50
|
+
"spatial",
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
export type OperationFamily = typeof OPERATION_FAMILIES[number];
|
|
54
|
+
|
|
55
|
+
const MEDIA_TYPE_PATTERN =
|
|
56
|
+
/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/u;
|
|
57
|
+
|
|
58
|
+
export const WorkflowBundleIdentitySchema = z.strictObject({
|
|
59
|
+
bundleSha256: Sha256Schema,
|
|
60
|
+
bytes: NonnegativeSafeIntegerSchema,
|
|
61
|
+
dependencyGraphSha256: Sha256Schema,
|
|
62
|
+
entrypoint: z.string().min(1).max(1_024),
|
|
63
|
+
sourceSha256: Sha256Schema,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export type WorkflowBundleIdentity = z.infer<typeof WorkflowBundleIdentitySchema>;
|
|
67
|
+
|
|
68
|
+
export const ExternalsPolicyIdentitySchema = z.strictObject({
|
|
69
|
+
kind: z.enum(["deny-all", "allowlist"]),
|
|
70
|
+
modules: z.array(z.string().min(1).max(214)).max(256),
|
|
71
|
+
policySha256: Sha256Schema,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export const WorkflowRuntimeIdentitySchema = z.strictObject({
|
|
75
|
+
applicationBuild: z.string().min(1).max(160),
|
|
76
|
+
bunRevision: z.string().min(1).max(160),
|
|
77
|
+
bunVersion: z.string().min(1).max(80),
|
|
78
|
+
bundlerConfigurationSha256: Sha256Schema,
|
|
79
|
+
bundlerName: z.string().min(1).max(80),
|
|
80
|
+
bundlerRevision: z.string().min(1).max(160),
|
|
81
|
+
bundlerVersion: z.string().min(1).max(80),
|
|
82
|
+
compilerAbi: z.literal(GRAPH_COMPILER_ABI),
|
|
83
|
+
codeWorkerAbi: z.literal(CODE_WORKER_ABI),
|
|
84
|
+
externals: ExternalsPolicyIdentitySchema,
|
|
85
|
+
graphAbi: z.union([z.literal(GRAPH_ABI), z.literal(LEGACY_GRAPH_ABI)]),
|
|
86
|
+
schedulerAbi: z.literal(GRAPH_SCHEDULER_ABI),
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
export type WorkflowRuntimeIdentity = z.infer<typeof WorkflowRuntimeIdentitySchema>;
|
|
90
|
+
|
|
91
|
+
export const InitialSubjectBindingSchema = z.discriminatedUnion("kind", [
|
|
92
|
+
z.strictObject({
|
|
93
|
+
descriptorSha256: Sha256Schema,
|
|
94
|
+
id: z.string().min(1).max(256),
|
|
95
|
+
kind: z.literal("spatial-project"),
|
|
96
|
+
schemaVersion: z.literal(2),
|
|
97
|
+
basis: z.strictObject({ version: z.union([z.literal(1), z.literal(2)]), sha256: Sha256Schema }),
|
|
98
|
+
}),
|
|
99
|
+
z.strictObject({
|
|
100
|
+
descriptorSha256: Sha256Schema,
|
|
101
|
+
id: z.string().min(1).max(256),
|
|
102
|
+
kind: z.literal("project"),
|
|
103
|
+
planSha256: Sha256Schema,
|
|
104
|
+
projectSha256: Sha256Schema,
|
|
105
|
+
}),
|
|
106
|
+
z.strictObject({
|
|
107
|
+
bundleSha256: Sha256Schema,
|
|
108
|
+
descriptorSha256: Sha256Schema,
|
|
109
|
+
id: z.string().min(1).max(256),
|
|
110
|
+
kind: z.literal("recording"),
|
|
111
|
+
}),
|
|
112
|
+
]);
|
|
113
|
+
|
|
114
|
+
export type InitialSubjectBinding = z.infer<typeof InitialSubjectBindingSchema>;
|
|
115
|
+
|
|
116
|
+
export const CandidateDescriptorSchema = z.strictObject({
|
|
117
|
+
bytes: NonnegativeSafeIntegerSchema.optional(),
|
|
118
|
+
descriptorSha256: Sha256Schema,
|
|
119
|
+
id: z.string().min(1).max(256),
|
|
120
|
+
kind: z.enum(["file", "project", "recording"]),
|
|
121
|
+
mediaType: z.string().max(160).regex(MEDIA_TYPE_PATTERN).optional(),
|
|
122
|
+
sha256: Sha256Schema.optional(),
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export type CandidateDescriptor = z.infer<typeof CandidateDescriptorSchema>;
|
|
126
|
+
|
|
127
|
+
export const StaticBindingsSchema = z.strictObject({
|
|
128
|
+
candidates: z.array(CandidateDescriptorSchema).max(1_024),
|
|
129
|
+
initialSubjects: z.array(InitialSubjectBindingSchema).max(16),
|
|
130
|
+
version: z.literal(STATIC_BINDINGS_VERSION),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export type StaticBindings = z.infer<typeof StaticBindingsSchema>;
|
|
134
|
+
|
|
135
|
+
export const GraphRegistryIdentitySchema = z.strictObject({
|
|
136
|
+
discovery: z.array(OperationDiscoverySchema).max(OPERATION_KINDS.length * 32),
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
export const UnsignedGraphPlanV1Schema = z.strictObject({
|
|
140
|
+
bundle: WorkflowBundleIdentitySchema,
|
|
141
|
+
envelope: RequirementEnvelopeSchema,
|
|
142
|
+
graph: AuthoredWorkflowGraphV1Schema,
|
|
143
|
+
limits: GraphCompilerLimitsSchema,
|
|
144
|
+
registry: GraphRegistryIdentitySchema,
|
|
145
|
+
runtime: WorkflowRuntimeIdentitySchema,
|
|
146
|
+
staticBindings: StaticBindingsSchema,
|
|
147
|
+
topologicalWaves: z.array(z.array(NodeKeySchema).min(1))
|
|
148
|
+
.max(MAX_SERIALIZED_GRAPH_NODES),
|
|
149
|
+
version: z.literal(GRAPH_PLAN_VERSION),
|
|
150
|
+
workflowInput: JsonValueSchema,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
export type UnsignedGraphPlanV1 = z.infer<typeof UnsignedGraphPlanV1Schema>;
|
|
154
|
+
|
|
155
|
+
export const GraphPlanV1Schema = UnsignedGraphPlanV1Schema.extend({
|
|
156
|
+
graphPlanSha256: Sha256Schema,
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
export type GraphPlanV1 = z.infer<typeof GraphPlanV1Schema>;
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { ApplicationError } from "../application/errors";
|
|
2
|
+
import type { ApplicationContext } from "../application/context";
|
|
3
|
+
import { openLeasedProjectSnapshot } from "../application/project-publication-lease";
|
|
4
|
+
import { withSpatialProjectLease } from "../application/spatial-project-lease";
|
|
5
|
+
import { spatialProjectStorePorts } from "../application/spatial-project-authority";
|
|
6
|
+
import { readSpatialProjectAuthority } from "../application/spatial-project-store";
|
|
7
|
+
import type { OperationRegistry } from "../application/registry";
|
|
8
|
+
import { canonicalJson, sha256Hex } from "../core/canonical-json";
|
|
9
|
+
import type { BuiltInWorkflow } from "../workflows";
|
|
10
|
+
import {
|
|
11
|
+
STATIC_BINDINGS_VERSION,
|
|
12
|
+
StaticBindingsSchema,
|
|
13
|
+
isComputeGraphNode,
|
|
14
|
+
isOperationGraphNode,
|
|
15
|
+
type GraphPlanV1,
|
|
16
|
+
type InitialSubjectBinding,
|
|
17
|
+
type WorkflowBundleIdentity,
|
|
18
|
+
} from "./contracts";
|
|
19
|
+
import { compileGraphPlan } from "./compiler";
|
|
20
|
+
import {
|
|
21
|
+
collectDeclaredFileCandidates,
|
|
22
|
+
collectLiteralFileCandidates,
|
|
23
|
+
mergeFileCandidateDescriptors,
|
|
24
|
+
} from "./file-candidate-provenance";
|
|
25
|
+
import {
|
|
26
|
+
createHostApplicationBuildIdentity,
|
|
27
|
+
createWorkflowRuntimeIdentity,
|
|
28
|
+
} from "./runtime-identity";
|
|
29
|
+
import {
|
|
30
|
+
checkAndBundleWorkflowSource,
|
|
31
|
+
workflowBundleContract,
|
|
32
|
+
type WorkflowSourceBundle,
|
|
33
|
+
} from "./source-bundle";
|
|
34
|
+
import {
|
|
35
|
+
startCodeWorker,
|
|
36
|
+
startCodeWorkerPool,
|
|
37
|
+
type CodeWorkerPool,
|
|
38
|
+
type CodeWorkerSession,
|
|
39
|
+
} from "./worker-client";
|
|
40
|
+
|
|
41
|
+
export const TRUSTED_CODE_WARNING = [
|
|
42
|
+
"Trusted code mode is not a sandbox.",
|
|
43
|
+
"Workflow TypeScript runs with the current user's filesystem, process, and network authority.",
|
|
44
|
+
].join(" ");
|
|
45
|
+
|
|
46
|
+
export interface PlanCodeWorkflowOptions {
|
|
47
|
+
readonly application: ApplicationContext;
|
|
48
|
+
readonly applicationBuild?: string;
|
|
49
|
+
readonly bunExecutable?: string;
|
|
50
|
+
readonly entryPath: string;
|
|
51
|
+
readonly registry: OperationRegistry;
|
|
52
|
+
readonly workflowInput: unknown;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface PlannedCodeWorkflow {
|
|
56
|
+
readonly bundle: WorkflowSourceBundle;
|
|
57
|
+
readonly diagnostics: {
|
|
58
|
+
readonly stderr: string;
|
|
59
|
+
readonly stdout: string;
|
|
60
|
+
};
|
|
61
|
+
readonly plan: GraphPlanV1;
|
|
62
|
+
readonly warning: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface PreparedCodeWorkflowRun extends PlannedCodeWorkflow {
|
|
66
|
+
startWorkerPool(
|
|
67
|
+
maximumWorkers: number,
|
|
68
|
+
options?: {
|
|
69
|
+
readonly inheritedHostResourceFileDescriptor?: number;
|
|
70
|
+
},
|
|
71
|
+
): Promise<CodeWorkerPool>;
|
|
72
|
+
readonly worker: CodeWorkerSession;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface PlannedBuiltInWorkflow {
|
|
76
|
+
readonly bundleBytes: Uint8Array;
|
|
77
|
+
readonly plan: GraphPlanV1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function projectReference(input: unknown): string | undefined {
|
|
81
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) return undefined;
|
|
82
|
+
const project: unknown = Reflect.get(input, "project");
|
|
83
|
+
return typeof project === "string" ? project : undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function staticBindings(
|
|
87
|
+
application: ApplicationContext,
|
|
88
|
+
graph: GraphPlanV1["graph"],
|
|
89
|
+
workflowInput: GraphPlanV1["workflowInput"],
|
|
90
|
+
) {
|
|
91
|
+
const references = new Set<string>();
|
|
92
|
+
const spatialReferences = new Set<string>();
|
|
93
|
+
for (const node of graph.nodes) {
|
|
94
|
+
if (isOperationGraphNode(node) && node.executor.operation.kind === "render.project" && node.executor.operation.version === 4) {
|
|
95
|
+
const input = node.input;
|
|
96
|
+
if (typeof input === "object" && input !== null && !Array.isArray(input) && "plan" in input) {
|
|
97
|
+
const plan = input.plan;
|
|
98
|
+
if (typeof plan === "object" && plan !== null && !Array.isArray(plan) && "projectId" in plan && typeof plan.projectId === "string") spatialReferences.add(plan.projectId);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (isOperationGraphNode(node) && node.executor.operation.kind === "spatial.project.snapshot") {
|
|
102
|
+
const reference = projectReference(node.input);
|
|
103
|
+
if (reference !== undefined) spatialReferences.add(reference);
|
|
104
|
+
}
|
|
105
|
+
if (
|
|
106
|
+
!isOperationGraphNode(node)
|
|
107
|
+
|| node.executor.operation.kind !== "project.snapshot"
|
|
108
|
+
) continue;
|
|
109
|
+
const reference = projectReference(node.input);
|
|
110
|
+
if (reference !== undefined) references.add(reference);
|
|
111
|
+
}
|
|
112
|
+
const initialSubjects: InitialSubjectBinding[] = [];
|
|
113
|
+
for (const reference of [...spatialReferences].sort()) {
|
|
114
|
+
const snapshot = await withSpatialProjectLease(application, reference, async leased =>
|
|
115
|
+
await readSpatialProjectAuthority(await spatialProjectStorePorts(leased, reference)));
|
|
116
|
+
const descriptor = { id: reference, kind: "spatial-project" as const, schemaVersion: 2 as const, basis: snapshot.basis };
|
|
117
|
+
initialSubjects.push({ ...descriptor, descriptorSha256: sha256Hex(`slopcamera.workflow.spatial-project-binding/v1\0${canonicalJson(descriptor)}`) });
|
|
118
|
+
}
|
|
119
|
+
for (const reference of [...references].sort()) {
|
|
120
|
+
const snapshot = await openLeasedProjectSnapshot(application, reference);
|
|
121
|
+
initialSubjects.push({
|
|
122
|
+
descriptorSha256: sha256Hex(
|
|
123
|
+
`studio.workflow.project-binding/v1\0${canonicalJson({
|
|
124
|
+
id: snapshot.project.projectId,
|
|
125
|
+
planSha256: snapshot.generation.currentPlanSha256,
|
|
126
|
+
projectSha256: snapshot.generation.projectSha256,
|
|
127
|
+
})}`,
|
|
128
|
+
),
|
|
129
|
+
id: snapshot.project.projectId,
|
|
130
|
+
kind: "project",
|
|
131
|
+
planSha256: snapshot.generation.currentPlanSha256,
|
|
132
|
+
projectSha256: snapshot.generation.projectSha256,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return StaticBindingsSchema.parse({
|
|
136
|
+
candidates: mergeFileCandidateDescriptors([
|
|
137
|
+
collectLiteralFileCandidates(graph),
|
|
138
|
+
collectDeclaredFileCandidates(workflowInput),
|
|
139
|
+
]),
|
|
140
|
+
initialSubjects,
|
|
141
|
+
version: STATIC_BINDINGS_VERSION,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function prepareCodeWorkflow(
|
|
146
|
+
options: PlanCodeWorkflowOptions,
|
|
147
|
+
): Promise<PreparedCodeWorkflowRun> {
|
|
148
|
+
const applicationBuild = options.applicationBuild
|
|
149
|
+
?? await createHostApplicationBuildIdentity(options.application);
|
|
150
|
+
const bundle = await checkAndBundleWorkflowSource({
|
|
151
|
+
allowedRoot: options.application.paths.repositoryRoot,
|
|
152
|
+
entryPath: options.entryPath,
|
|
153
|
+
...(options.application.hostResourceLease === undefined
|
|
154
|
+
? {}
|
|
155
|
+
: {
|
|
156
|
+
inheritedHostResourceFileDescriptor:
|
|
157
|
+
options.application.hostResourceLease.inheritedFileDescriptor,
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
160
|
+
const worker = await startCodeWorker({
|
|
161
|
+
...(options.bunExecutable === undefined ? {} : { bunExecutable: options.bunExecutable }),
|
|
162
|
+
bundle,
|
|
163
|
+
...(options.application.hostResourceLease === undefined
|
|
164
|
+
? {}
|
|
165
|
+
: {
|
|
166
|
+
inheritedHostResourceFileDescriptor:
|
|
167
|
+
options.application.hostResourceLease.inheritedFileDescriptor,
|
|
168
|
+
}),
|
|
169
|
+
temporaryRoot: options.application.paths.privateRoot,
|
|
170
|
+
});
|
|
171
|
+
try {
|
|
172
|
+
const built = await worker.build(options.registry, options.workflowInput);
|
|
173
|
+
const runtime = await createWorkflowRuntimeIdentity({
|
|
174
|
+
applicationBuild,
|
|
175
|
+
bundle,
|
|
176
|
+
});
|
|
177
|
+
const provisional = compileGraphPlan({
|
|
178
|
+
bundle: workflowBundleContract(bundle),
|
|
179
|
+
graph: built.graph,
|
|
180
|
+
registry: options.registry,
|
|
181
|
+
runtime,
|
|
182
|
+
workflowInput: built.input,
|
|
183
|
+
});
|
|
184
|
+
const plan = compileGraphPlan({
|
|
185
|
+
bundle: workflowBundleContract(bundle),
|
|
186
|
+
graph: built.graph,
|
|
187
|
+
registry: options.registry,
|
|
188
|
+
runtime,
|
|
189
|
+
staticBindings: await staticBindings(
|
|
190
|
+
options.application,
|
|
191
|
+
provisional.graph,
|
|
192
|
+
provisional.workflowInput,
|
|
193
|
+
),
|
|
194
|
+
workflowInput: built.input,
|
|
195
|
+
});
|
|
196
|
+
let workerTransferred = false;
|
|
197
|
+
return {
|
|
198
|
+
bundle,
|
|
199
|
+
diagnostics: built.diagnostics,
|
|
200
|
+
plan,
|
|
201
|
+
startWorkerPool: async (maximumWorkers, poolOptions = {}) => {
|
|
202
|
+
if (workerTransferred) {
|
|
203
|
+
throw new ApplicationError(
|
|
204
|
+
"conflict",
|
|
205
|
+
"The prepared code worker was already transferred to a worker pool.",
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
workerTransferred = true;
|
|
209
|
+
return await startCodeWorkerPool({
|
|
210
|
+
...(options.bunExecutable === undefined
|
|
211
|
+
? {}
|
|
212
|
+
: { bunExecutable: options.bunExecutable }),
|
|
213
|
+
bundle,
|
|
214
|
+
expectedBuild: built,
|
|
215
|
+
initialWorker: {
|
|
216
|
+
build: built,
|
|
217
|
+
session: worker,
|
|
218
|
+
},
|
|
219
|
+
...(poolOptions.inheritedHostResourceFileDescriptor === undefined
|
|
220
|
+
? {}
|
|
221
|
+
: {
|
|
222
|
+
inheritedHostResourceFileDescriptor:
|
|
223
|
+
poolOptions.inheritedHostResourceFileDescriptor,
|
|
224
|
+
}),
|
|
225
|
+
maximumWorkers,
|
|
226
|
+
registry: options.registry,
|
|
227
|
+
temporaryRoot: options.application.paths.privateRoot,
|
|
228
|
+
workflowInput: options.workflowInput,
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
warning: TRUSTED_CODE_WARNING,
|
|
232
|
+
worker,
|
|
233
|
+
};
|
|
234
|
+
} catch (error) {
|
|
235
|
+
await worker.close().catch(() => undefined);
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export async function prepareCodeWorkflowRun(
|
|
241
|
+
options: PlanCodeWorkflowOptions,
|
|
242
|
+
): Promise<PreparedCodeWorkflowRun> {
|
|
243
|
+
return await prepareCodeWorkflow(options);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export async function planCodeWorkflow(
|
|
247
|
+
options: PlanCodeWorkflowOptions,
|
|
248
|
+
): Promise<PlannedCodeWorkflow> {
|
|
249
|
+
const prepared = await prepareCodeWorkflow(options);
|
|
250
|
+
try {
|
|
251
|
+
return {
|
|
252
|
+
bundle: prepared.bundle,
|
|
253
|
+
diagnostics: prepared.diagnostics,
|
|
254
|
+
plan: prepared.plan,
|
|
255
|
+
warning: prepared.warning,
|
|
256
|
+
};
|
|
257
|
+
} finally {
|
|
258
|
+
await prepared.worker.close();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export interface PlanBuiltInWorkflowOptions {
|
|
263
|
+
readonly application: ApplicationContext;
|
|
264
|
+
readonly applicationBuild?: string;
|
|
265
|
+
readonly registry: OperationRegistry;
|
|
266
|
+
readonly workflow: BuiltInWorkflow;
|
|
267
|
+
readonly workflowInput: unknown;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export async function planBuiltInWorkflow(
|
|
271
|
+
options: PlanBuiltInWorkflowOptions,
|
|
272
|
+
): Promise<PlannedBuiltInWorkflow> {
|
|
273
|
+
const applicationBuild = options.applicationBuild
|
|
274
|
+
?? await createHostApplicationBuildIdentity(options.application);
|
|
275
|
+
const built = options.workflow.build(options.registry, options.workflowInput);
|
|
276
|
+
if (built.graph.nodes.some(isComputeGraphNode)) {
|
|
277
|
+
throw new ApplicationError(
|
|
278
|
+
"unsupported-plan",
|
|
279
|
+
"Built-in workflows cannot register trusted compute callbacks in a synthetic bundle.",
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
const bundleBytes = new TextEncoder().encode(`${canonicalJson({
|
|
283
|
+
id: options.workflow.id,
|
|
284
|
+
inputSchemaId: options.workflow.inputSchemaId,
|
|
285
|
+
version: options.workflow.version,
|
|
286
|
+
})}\n`);
|
|
287
|
+
const bundleSha256 = sha256Hex(new TextDecoder().decode(bundleBytes));
|
|
288
|
+
const bundle: WorkflowBundleIdentity = {
|
|
289
|
+
bundleSha256,
|
|
290
|
+
bytes: bundleBytes.byteLength,
|
|
291
|
+
dependencyGraphSha256: bundleSha256,
|
|
292
|
+
entrypoint: `builtin:${options.workflow.id}@${String(options.workflow.version)}`,
|
|
293
|
+
sourceSha256: bundleSha256,
|
|
294
|
+
};
|
|
295
|
+
const runtime = {
|
|
296
|
+
...(await createWorkflowRuntimeIdentity({
|
|
297
|
+
applicationBuild,
|
|
298
|
+
bundle: {
|
|
299
|
+
bytes: bundleBytes,
|
|
300
|
+
dependencyGraphSha256: bundleSha256,
|
|
301
|
+
entryPath: `builtin:${options.workflow.id}`,
|
|
302
|
+
entryRelativePath: `builtin:${options.workflow.id}`,
|
|
303
|
+
externalImports: [],
|
|
304
|
+
identity: {
|
|
305
|
+
bunRevision: Bun.revision,
|
|
306
|
+
bunVersion: Bun.version,
|
|
307
|
+
format: "esm" as const,
|
|
308
|
+
minify: false as const,
|
|
309
|
+
packages: "bundle" as const,
|
|
310
|
+
schemaVersion: 1 as const,
|
|
311
|
+
sourcemap: "none" as const,
|
|
312
|
+
target: "bun" as const,
|
|
313
|
+
treeShaking: false as const,
|
|
314
|
+
},
|
|
315
|
+
importedPaths: [],
|
|
316
|
+
sha256: bundleSha256,
|
|
317
|
+
sourceSha256: bundleSha256,
|
|
318
|
+
},
|
|
319
|
+
})),
|
|
320
|
+
externals: {
|
|
321
|
+
kind: "deny-all" as const,
|
|
322
|
+
modules: [],
|
|
323
|
+
policySha256: sha256Hex("studio.workflow.builtin-externals/v1"),
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
const provisional = compileGraphPlan({
|
|
327
|
+
bundle,
|
|
328
|
+
graph: built.graph,
|
|
329
|
+
registry: options.registry,
|
|
330
|
+
runtime,
|
|
331
|
+
workflowInput: built.input,
|
|
332
|
+
});
|
|
333
|
+
return {
|
|
334
|
+
bundleBytes,
|
|
335
|
+
plan: compileGraphPlan({
|
|
336
|
+
bundle,
|
|
337
|
+
graph: built.graph,
|
|
338
|
+
registry: options.registry,
|
|
339
|
+
runtime,
|
|
340
|
+
staticBindings: await staticBindings(
|
|
341
|
+
options.application,
|
|
342
|
+
provisional.graph,
|
|
343
|
+
provisional.workflowInput,
|
|
344
|
+
),
|
|
345
|
+
workflowInput: built.input,
|
|
346
|
+
}),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export function assertPlanHash(plan: GraphPlanV1, requested: string | undefined): void {
|
|
351
|
+
if (requested !== undefined && requested !== plan.graphPlanSha256) {
|
|
352
|
+
throw new ApplicationError(
|
|
353
|
+
"conflict",
|
|
354
|
+
"The requested graph plan hash does not match current code, inputs, bindings, or runtime.",
|
|
355
|
+
{
|
|
356
|
+
actual: plan.graphPlanSha256,
|
|
357
|
+
requested,
|
|
358
|
+
},
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
}
|