@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,290 @@
|
|
|
1
|
+
import { CliError } from "./errors";
|
|
2
|
+
|
|
3
|
+
export interface CliIo {
|
|
4
|
+
readonly cwd: () => string;
|
|
5
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
6
|
+
readonly now: () => Date;
|
|
7
|
+
readonly platform: NodeJS.Platform;
|
|
8
|
+
/** Reads sensitive piped input without converting it to argv or environment state. */
|
|
9
|
+
readonly readStdin?: (maximumBytes: number) => Promise<Uint8Array>;
|
|
10
|
+
readonly stderr: (value: string) => void;
|
|
11
|
+
readonly stdout: (value: string) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface RunOptions {
|
|
15
|
+
readonly abortSignal?: AbortSignal;
|
|
16
|
+
readonly cwd?: string;
|
|
17
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
18
|
+
/**
|
|
19
|
+
* POSIX file descriptors duplicated into the child starting at descriptor 3.
|
|
20
|
+
* The caller retains ownership and must keep them open until `run` settles.
|
|
21
|
+
*/
|
|
22
|
+
readonly inheritedFileDescriptors?: readonly number[];
|
|
23
|
+
readonly maxOutputBytes?: number;
|
|
24
|
+
readonly stdin?: "ignore";
|
|
25
|
+
readonly timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface RunResult {
|
|
29
|
+
readonly exitCode: number;
|
|
30
|
+
readonly stderr: string;
|
|
31
|
+
readonly stdout: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ProcessRunner {
|
|
35
|
+
run(argv: readonly [string, ...string[]], options?: RunOptions): Promise<RunResult>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const DEFAULT_OUTPUT_LIMIT = 1_000_000;
|
|
39
|
+
const FORBIDDEN_CHILD_ENVIRONMENT_NAMES = new Set([
|
|
40
|
+
"AI_GATEWAY_API_KEY",
|
|
41
|
+
"VERCEL_OIDC_TOKEN",
|
|
42
|
+
"WORLDLABS_API_KEY",
|
|
43
|
+
"BLOB_READ_WRITE_TOKEN",
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
/** Credentials remain in the trusted process and never reach media/tool children. */
|
|
47
|
+
export function environmentWithoutGatewayCredentials(
|
|
48
|
+
source: Readonly<Record<string, string | undefined>>,
|
|
49
|
+
): Record<string, string | undefined> {
|
|
50
|
+
const environment = { ...source };
|
|
51
|
+
for (const name of Object.keys(environment)) {
|
|
52
|
+
if (FORBIDDEN_CHILD_ENVIRONMENT_NAMES.has(name.toLocaleUpperCase("en-US"))) {
|
|
53
|
+
delete environment[name];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return environment;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
class BoundedByteTail {
|
|
60
|
+
readonly #bytes: Uint8Array;
|
|
61
|
+
readonly #limit: number;
|
|
62
|
+
#length = 0;
|
|
63
|
+
#truncated = false;
|
|
64
|
+
#writeOffset = 0;
|
|
65
|
+
|
|
66
|
+
constructor(limit: number) {
|
|
67
|
+
this.#bytes = new Uint8Array(limit);
|
|
68
|
+
this.#limit = limit;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
append(chunk: Uint8Array): void {
|
|
72
|
+
if (chunk.byteLength === 0) return;
|
|
73
|
+
if (chunk.byteLength >= this.#limit) {
|
|
74
|
+
this.#truncated ||= this.#length > 0 || chunk.byteLength > this.#limit;
|
|
75
|
+
this.#bytes.set(chunk.subarray(chunk.byteLength - this.#limit));
|
|
76
|
+
this.#length = this.#limit;
|
|
77
|
+
this.#writeOffset = 0;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const firstLength = Math.min(chunk.byteLength, this.#limit - this.#writeOffset);
|
|
82
|
+
this.#bytes.set(chunk.subarray(0, firstLength), this.#writeOffset);
|
|
83
|
+
if (firstLength < chunk.byteLength) this.#bytes.set(chunk.subarray(firstLength));
|
|
84
|
+
this.#writeOffset = (this.#writeOffset + chunk.byteLength) % this.#limit;
|
|
85
|
+
this.#truncated ||= this.#length + chunk.byteLength > this.#limit;
|
|
86
|
+
this.#length = Math.min(this.#limit, this.#length + chunk.byteLength);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
text(): string {
|
|
90
|
+
const bytes = new Uint8Array(this.#length);
|
|
91
|
+
if (this.#length < this.#limit) {
|
|
92
|
+
bytes.set(this.#bytes.subarray(0, this.#length));
|
|
93
|
+
} else {
|
|
94
|
+
const firstLength = this.#limit - this.#writeOffset;
|
|
95
|
+
bytes.set(this.#bytes.subarray(this.#writeOffset), 0);
|
|
96
|
+
if (this.#writeOffset > 0) bytes.set(this.#bytes.subarray(0, this.#writeOffset), firstLength);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
let start = 0;
|
|
100
|
+
if (this.#truncated) {
|
|
101
|
+
while (start < bytes.byteLength && (bytes[start]! & 0xc0) === 0x80) start += 1;
|
|
102
|
+
}
|
|
103
|
+
return new TextDecoder().decode(bytes.subarray(start));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function readBoundedTail(stream: ReadableStream<Uint8Array>, limit: number): Promise<string> {
|
|
108
|
+
const tail = new BoundedByteTail(limit);
|
|
109
|
+
const reader = stream.getReader();
|
|
110
|
+
try {
|
|
111
|
+
while (true) {
|
|
112
|
+
const result = await reader.read();
|
|
113
|
+
if (result.done) break;
|
|
114
|
+
tail.append(result.value);
|
|
115
|
+
}
|
|
116
|
+
} finally {
|
|
117
|
+
reader.releaseLock();
|
|
118
|
+
}
|
|
119
|
+
return tail.text();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export class BunProcessRunner implements ProcessRunner {
|
|
123
|
+
async run(argv: readonly [string, ...string[]], options: RunOptions = {}): Promise<RunResult> {
|
|
124
|
+
const maxOutputBytes = options.maxOutputBytes ?? DEFAULT_OUTPUT_LIMIT;
|
|
125
|
+
if (!Number.isSafeInteger(maxOutputBytes) || maxOutputBytes <= 0) {
|
|
126
|
+
throw new CliError("internal", "Process output limit must be a positive safe integer.");
|
|
127
|
+
}
|
|
128
|
+
const timeoutMs = options.timeoutMs;
|
|
129
|
+
if (
|
|
130
|
+
timeoutMs !== undefined
|
|
131
|
+
&& (
|
|
132
|
+
!Number.isSafeInteger(timeoutMs)
|
|
133
|
+
|| timeoutMs < 1
|
|
134
|
+
|| timeoutMs > 24 * 60 * 60_000
|
|
135
|
+
)
|
|
136
|
+
) {
|
|
137
|
+
throw new CliError(
|
|
138
|
+
"internal",
|
|
139
|
+
"Process timeout must be a whole number of milliseconds from 1 through 86400000.",
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
const inheritedFileDescriptors = options.inheritedFileDescriptors ?? [];
|
|
143
|
+
if (
|
|
144
|
+
inheritedFileDescriptors.length > 16
|
|
145
|
+
|| inheritedFileDescriptors.some(descriptor => (
|
|
146
|
+
!Number.isSafeInteger(descriptor)
|
|
147
|
+
|| descriptor < 0
|
|
148
|
+
))
|
|
149
|
+
) {
|
|
150
|
+
throw new CliError(
|
|
151
|
+
"internal",
|
|
152
|
+
"Inherited file descriptors must contain at most 16 nonnegative integers.",
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
if (options.abortSignal?.aborted === true) {
|
|
156
|
+
throw new CliError("cancelled", "Process execution was cancelled before launch.");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
const environment = environmentWithoutGatewayCredentials(options.env ?? process.env);
|
|
161
|
+
// FFmpeg honors FFREPORT before processing argv and can otherwise
|
|
162
|
+
// overwrite an immutable input selected by the user.
|
|
163
|
+
for (const name of Object.keys(environment)) {
|
|
164
|
+
if (name.toLocaleUpperCase("en-US") === "FFREPORT") {
|
|
165
|
+
delete environment[name];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const child = Bun.spawn([...argv], {
|
|
169
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
170
|
+
env: environment,
|
|
171
|
+
stdio: [
|
|
172
|
+
"ignore",
|
|
173
|
+
"pipe",
|
|
174
|
+
"pipe",
|
|
175
|
+
...inheritedFileDescriptors,
|
|
176
|
+
],
|
|
177
|
+
});
|
|
178
|
+
const stdout = readBoundedTail(child.stdout, maxOutputBytes);
|
|
179
|
+
const stderr = readBoundedTail(child.stderr, maxOutputBytes);
|
|
180
|
+
const exited = child.exited;
|
|
181
|
+
let timedOut = false;
|
|
182
|
+
let cancelled = false;
|
|
183
|
+
const abortSignal = options.abortSignal;
|
|
184
|
+
const abortHandler = () => {
|
|
185
|
+
cancelled = true;
|
|
186
|
+
try {
|
|
187
|
+
child.kill(9);
|
|
188
|
+
} catch {
|
|
189
|
+
// The child may have exited immediately before cancellation.
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
abortSignal?.addEventListener("abort", abortHandler, { once: true });
|
|
193
|
+
if (abortSignal?.aborted === true) abortHandler();
|
|
194
|
+
const timer = timeoutMs === undefined
|
|
195
|
+
? undefined
|
|
196
|
+
: setTimeout(() => {
|
|
197
|
+
timedOut = true;
|
|
198
|
+
try {
|
|
199
|
+
child.kill(9);
|
|
200
|
+
} catch {
|
|
201
|
+
// The child may have exited immediately before the deadline.
|
|
202
|
+
}
|
|
203
|
+
}, timeoutMs);
|
|
204
|
+
try {
|
|
205
|
+
const [boundedStdout, boundedStderr, exitCode] = await Promise.all([stdout, stderr, exited]);
|
|
206
|
+
if (cancelled) {
|
|
207
|
+
throw new CliError("cancelled", "Process execution was cancelled.");
|
|
208
|
+
}
|
|
209
|
+
if (timedOut) {
|
|
210
|
+
throw new CliError(
|
|
211
|
+
"subprocess",
|
|
212
|
+
`Process exceeded its ${timeoutMs}-millisecond deadline.`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
exitCode,
|
|
217
|
+
stderr: boundedStderr,
|
|
218
|
+
stdout: boundedStdout,
|
|
219
|
+
};
|
|
220
|
+
} catch (error) {
|
|
221
|
+
try {
|
|
222
|
+
child.kill(9);
|
|
223
|
+
} catch {
|
|
224
|
+
// The child may already have exited between the stream failure and cleanup.
|
|
225
|
+
}
|
|
226
|
+
await Promise.allSettled([stdout, stderr, exited]);
|
|
227
|
+
throw error;
|
|
228
|
+
} finally {
|
|
229
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
230
|
+
abortSignal?.removeEventListener("abort", abortHandler);
|
|
231
|
+
}
|
|
232
|
+
} catch (error) {
|
|
233
|
+
if (error instanceof CliError) throw error;
|
|
234
|
+
return {
|
|
235
|
+
exitCode: 127,
|
|
236
|
+
stderr: error instanceof Error ? error.message : String(error),
|
|
237
|
+
stdout: "",
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export const processIo: CliIo = {
|
|
244
|
+
cwd: () => process.cwd(),
|
|
245
|
+
env: process.env,
|
|
246
|
+
now: () => new Date(),
|
|
247
|
+
platform: process.platform,
|
|
248
|
+
readStdin: async (maximumBytes) => {
|
|
249
|
+
if (!Number.isSafeInteger(maximumBytes) || maximumBytes <= 0) {
|
|
250
|
+
throw new CliError("internal", "Standard-input byte limit must be a positive safe integer.");
|
|
251
|
+
}
|
|
252
|
+
const chunks: Uint8Array[] = [];
|
|
253
|
+
let total = 0;
|
|
254
|
+
const reader = Bun.stdin.stream().getReader();
|
|
255
|
+
try {
|
|
256
|
+
while (true) {
|
|
257
|
+
const next = await reader.read();
|
|
258
|
+
if (next.done) break;
|
|
259
|
+
total += next.value.byteLength;
|
|
260
|
+
if (total > maximumBytes) {
|
|
261
|
+
throw new CliError("invalid-data", `Standard input exceeds its ${maximumBytes}-byte limit.`);
|
|
262
|
+
}
|
|
263
|
+
chunks.push(next.value);
|
|
264
|
+
}
|
|
265
|
+
} finally {
|
|
266
|
+
reader.releaseLock();
|
|
267
|
+
}
|
|
268
|
+
const result = new Uint8Array(total);
|
|
269
|
+
let offset = 0;
|
|
270
|
+
for (const chunk of chunks) {
|
|
271
|
+
result.set(chunk, offset);
|
|
272
|
+
offset += chunk.byteLength;
|
|
273
|
+
}
|
|
274
|
+
return result;
|
|
275
|
+
},
|
|
276
|
+
stderr: (value) => {
|
|
277
|
+
process.stderr.write(value);
|
|
278
|
+
},
|
|
279
|
+
stdout: (value) => {
|
|
280
|
+
process.stdout.write(value);
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
export function writeJson(io: CliIo, value: unknown): void {
|
|
285
|
+
io.stdout(`${JSON.stringify(value)}\n`);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function writeLine(io: CliIo, value = ""): void {
|
|
289
|
+
io.stdout(`${value}\n`);
|
|
290
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { parseCliArgs } from "./args";
|
|
5
|
+
import { runCli } from "./commands";
|
|
6
|
+
import { asCliError, CliError, EXIT_CODE } from "./errors";
|
|
7
|
+
import { BunProcessRunner, processIo } from "./io";
|
|
8
|
+
import { resolveRepositoryPaths } from "./paths";
|
|
9
|
+
import {
|
|
10
|
+
canonicalizeUnifiedCliArgs,
|
|
11
|
+
runPortableSurface,
|
|
12
|
+
type PortableSurfaceDependencies,
|
|
13
|
+
} from "./portable-surface";
|
|
14
|
+
import { RecordingDaemonClient, runRecordingDaemon } from "./recording-daemon";
|
|
15
|
+
import { renamedEnvironmentValue } from "./renamed-environment";
|
|
16
|
+
|
|
17
|
+
function valueAfter(argv: readonly string[], name: string): string {
|
|
18
|
+
const index = argv.indexOf(name);
|
|
19
|
+
const value = index === -1 ? undefined : argv[index + 1];
|
|
20
|
+
if (value === undefined || value.startsWith("--")) throw new CliError("usage", `${name} requires a value.`);
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function daemonCommandFor(executableInput: string, entrypointInput: string): readonly [string, ...string[]] {
|
|
25
|
+
const executable = resolve(executableInput);
|
|
26
|
+
if (entrypointInput.includes("$bunfs")) return [executable];
|
|
27
|
+
const entrypoint = resolve(entrypointInput);
|
|
28
|
+
return executable === entrypoint ? [executable] : [executable, entrypoint];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function daemonCommand(): readonly [string, ...string[]] {
|
|
32
|
+
return daemonCommandFor(process.execPath, import.meta.path);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function isEmbeddedVectorizeWorkerInvocation(
|
|
36
|
+
argv: readonly string[],
|
|
37
|
+
entrypoint: string = import.meta.path,
|
|
38
|
+
): boolean {
|
|
39
|
+
return entrypoint.includes("$bunfs")
|
|
40
|
+
&& argv.length === 1
|
|
41
|
+
&& argv[0]?.startsWith("/$bunfs/") === true
|
|
42
|
+
&& argv[0].endsWith("/vectorize/worker.js");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function main(
|
|
46
|
+
argv: readonly string[] = process.argv.slice(2),
|
|
47
|
+
portableDependencies: PortableSurfaceDependencies = {},
|
|
48
|
+
): Promise<number> {
|
|
49
|
+
if (isEmbeddedVectorizeWorkerInvocation(argv)) {
|
|
50
|
+
// The bundled headless supervisor preserves process isolation by spawning
|
|
51
|
+
// this compiled executable with its virtual worker path. Loading the
|
|
52
|
+
// worker only in that exact internal invocation keeps sharp/VTracer and
|
|
53
|
+
// the bounded stdin protocol inside the shipped artifact.
|
|
54
|
+
await import("../../../src/vectorize/worker.ts");
|
|
55
|
+
return typeof process.exitCode === "number" ? process.exitCode : 0;
|
|
56
|
+
}
|
|
57
|
+
if (argv[0] === "__record_daemon") {
|
|
58
|
+
if (argv.length !== 5 || argv[1] !== "--artifact-root" || argv[3] !== "--helper") {
|
|
59
|
+
throw new CliError("usage", "Invalid internal recording-daemon invocation.");
|
|
60
|
+
}
|
|
61
|
+
const paths = await resolveRepositoryPaths(process.cwd(), process.env);
|
|
62
|
+
const artifactRoot = valueAfter(argv, "--artifact-root");
|
|
63
|
+
if (resolve(artifactRoot) !== resolve(paths.artifactRoot)) {
|
|
64
|
+
throw new CliError("unsafe-path", "Recording daemon artifact root differs from the repository-owned root.");
|
|
65
|
+
}
|
|
66
|
+
await runRecordingDaemon({
|
|
67
|
+
artifactRoot,
|
|
68
|
+
helperExecutable: valueAfter(argv, "--helper"),
|
|
69
|
+
});
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
const unifiedArgv = canonicalizeUnifiedCliArgs(argv);
|
|
73
|
+
const portableExitCode = await runPortableSurface(unifiedArgv, portableDependencies);
|
|
74
|
+
if (portableExitCode !== undefined) return portableExitCode;
|
|
75
|
+
const earlyCommand = parseCliArgs(unifiedArgv);
|
|
76
|
+
if (earlyCommand.kind === "help" || earlyCommand.kind === "version" || earlyCommand.kind === "complete") {
|
|
77
|
+
return await runCli(unifiedArgv, { io: processIo });
|
|
78
|
+
}
|
|
79
|
+
const paths = await resolveRepositoryPaths(processIo.cwd(), processIo.env);
|
|
80
|
+
const helperExecutable = renamedEnvironmentValue(processIo.env, "SLOPCAMERA_CAPTURE_HELPER")
|
|
81
|
+
?? join(paths.desktopRoot, "capture", "dist", "slopcamera-capture");
|
|
82
|
+
const recordingController = new RecordingDaemonClient({
|
|
83
|
+
artifactRoot: paths.artifactRoot,
|
|
84
|
+
daemonCommand: daemonCommand(),
|
|
85
|
+
helperExecutable,
|
|
86
|
+
});
|
|
87
|
+
if (earlyCommand.kind === "spatial-world" || earlyCommand.kind === "directing" || earlyCommand.kind === "studio"
|
|
88
|
+
|| earlyCommand.kind === "spatial-scene" && earlyCommand.action === "camera-track") {
|
|
89
|
+
const controller = new AbortController();
|
|
90
|
+
const cancel = () => controller.abort(new CliError("cancelled", "Command interrupted."));
|
|
91
|
+
process.on("SIGINT", cancel);
|
|
92
|
+
process.on("SIGTERM", cancel);
|
|
93
|
+
try {
|
|
94
|
+
return await runCli(unifiedArgv, { io: processIo, paths, recordingController,
|
|
95
|
+
runner: new BunProcessRunner(), abortSignal: controller.signal });
|
|
96
|
+
} finally {
|
|
97
|
+
process.off("SIGINT", cancel);
|
|
98
|
+
process.off("SIGTERM", cancel);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return await runCli(unifiedArgv, {
|
|
102
|
+
io: processIo,
|
|
103
|
+
paths,
|
|
104
|
+
recordingController,
|
|
105
|
+
runner: new BunProcessRunner(),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export async function runMainEntrypoint(
|
|
110
|
+
portableDependencies: PortableSurfaceDependencies = {},
|
|
111
|
+
): Promise<void> {
|
|
112
|
+
try {
|
|
113
|
+
process.exitCode = await main(process.argv.slice(2), portableDependencies);
|
|
114
|
+
} catch (error) {
|
|
115
|
+
const failure = asCliError(error);
|
|
116
|
+
process.stderr.write(`slopcamera: ${failure.message}\n`);
|
|
117
|
+
process.exitCode = EXIT_CODE[failure.code];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (import.meta.main) {
|
|
122
|
+
await runMainEntrypoint();
|
|
123
|
+
}
|