@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 { createHash } from 'node:crypto';
|
|
2
|
+
import { Buffer } from 'node:buffer';
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
import { clearTimeout, setTimeout } from 'node:timers';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
import { lstat, mkdir, readFile, realpath, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
8
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
9
|
+
|
|
10
|
+
export const FPS = Object.freeze({ numerator: 24, denominator: 1 });
|
|
11
|
+
export const ENERGY = Object.freeze({ incident: 100, shadedFraction: 0.62, reflectance: 0.18 });
|
|
12
|
+
const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
13
|
+
|
|
14
|
+
export function validateOptions(input) {
|
|
15
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('Expected render options');
|
|
16
|
+
const allowed = new Set(['runtimeRoot', 'outputRoot', 'width', 'height', 'frames', 'startFrame']);
|
|
17
|
+
if (Object.keys(input).some((key) => !allowed.has(key))) throw new Error('Unknown render option');
|
|
18
|
+
for (const key of ['runtimeRoot', 'outputRoot']) if (typeof input[key] !== 'string' || !isAbsolute(input[key])) throw new Error(`${key} must be absolute`);
|
|
19
|
+
const value = { ...input, width: input.width ?? 768, height: input.height ?? 432, frames: input.frames ?? 96, startFrame: input.startFrame ?? 0 };
|
|
20
|
+
for (const [key, min, max] of [['width', 384, 1024], ['height', 216, 1024], ['frames', 1, 240], ['startFrame', 0, 100000]]) {
|
|
21
|
+
if (!Number.isSafeInteger(value[key]) || value[key] < min || value[key] > max) throw new Error(`${key} is outside the bounded profile`);
|
|
22
|
+
}
|
|
23
|
+
if (value.width * 9 !== value.height * 16) throw new Error('The authored graphic requires a 16:9 frame');
|
|
24
|
+
return Object.freeze(value);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function rejectAmbientGpuOverrides(env) {
|
|
28
|
+
const names = Object.keys(env).filter((name) => /^(VGPU_|NODE_OPTIONS$|NODE_PATH$)/u.test(name));
|
|
29
|
+
if (names.length) throw new Error(`Remove ambient runtime overrides: ${names.sort().join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function verifyMetalHardware(adapter, hardware) {
|
|
33
|
+
if (adapter?.type !== 'gpu' || hardware?.isFallbackAdapter !== false || !hardware.vendor || !hardware.device
|
|
34
|
+
|| !/apple|amd|radeon|intel|nvidia/iu.test(`${hardware.vendor} ${hardware.device}`)
|
|
35
|
+
|| !/metal/iu.test(`${hardware.architecture} ${hardware.description}`)) throw new Error('No identifiable non-fallback Metal hardware observed');
|
|
36
|
+
return { ...Object.fromEntries(['vendor', 'architecture', 'device', 'description', 'backend', 'backendType'].flatMap((key) => typeof hardware[key] === 'string' ? [[key, hardware[key].slice(0, 256)]] : [])), isFallbackAdapter: false };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function frameSchedule(startFrame, frames) {
|
|
40
|
+
if (!Number.isSafeInteger(startFrame) || startFrame < 0 || startFrame > 100000 || !Number.isSafeInteger(frames) || frames < 1 || frames > 240) throw new Error('Invalid frame interval');
|
|
41
|
+
return Array.from({ length: frames }, (_, index) => ({ index, absoluteFrame: startFrame + index, timeNumerator: startFrame + index, timeDenominator: FPS.numerator, timeSeconds: (startFrame + index) / FPS.numerator }));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function energySplit({ incident, shadedFraction, reflectance }) {
|
|
45
|
+
if (![incident, shadedFraction, reflectance].every(Number.isFinite) || incident <= 0 || incident > 10000 || shadedFraction < 0 || shadedFraction > 1 || reflectance < 0 || reflectance > 1) throw new Error('Invalid illustrative energy split');
|
|
46
|
+
const blocked = incident * shadedFraction;
|
|
47
|
+
const reflected = (incident - blocked) * reflectance;
|
|
48
|
+
const absorbed = incident - blocked - reflected;
|
|
49
|
+
return Object.freeze({ incident, blocked, reflected, absorbed });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const COLOR_FUNCTIONS = `
|
|
53
|
+
fn linear(c: vec3f) -> vec3f { return select(c / 12.92, pow((c + 0.055) / 1.055, vec3f(2.4)), c > vec3f(0.04045)); }
|
|
54
|
+
fn srgb(c: vec3f) -> vec3f { let x = clamp(c, vec3f(0), vec3f(1)); return select(x * 12.92, 1.055 * pow(x, vec3f(1.0 / 2.4)) - 0.055, x > vec3f(0.0031308)); }
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
export const CALIBRATION_WGSL = `${COLOR_FUNCTIONS}
|
|
58
|
+
@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
|
|
59
|
+
var c = vec3f(1, 0, 0);
|
|
60
|
+
if (uv.x >= 0.5 && uv.y < 0.5) { c = vec3f(0, 1, 0); }
|
|
61
|
+
if (uv.x < 0.5 && uv.y >= 0.5) { c = vec3f(0, 0, 1); }
|
|
62
|
+
if (uv.x >= 0.5 && uv.y >= 0.5) { c = linear(vec3f(128.0 / 255.0)); }
|
|
63
|
+
return vec4f(srgb(c), 1);
|
|
64
|
+
}`;
|
|
65
|
+
|
|
66
|
+
export const HEAT_FIELD_WGSL = `${COLOR_FUNCTIONS}
|
|
67
|
+
struct Params { time: f32, blocked: f32, reflected: f32, absorbed: f32 }
|
|
68
|
+
@group(0) @binding(0) var<uniform> params: Params;
|
|
69
|
+
fn line(p: vec2f, a: vec2f, b: vec2f, thickness: f32) -> f32 {
|
|
70
|
+
let delta = b - a;
|
|
71
|
+
let d = length(p - a - delta * clamp(dot(p - a, delta) / dot(delta, delta), 0.0, 1.0));
|
|
72
|
+
return 1.0 - smoothstep(thickness, thickness + 0.0015, d);
|
|
73
|
+
}
|
|
74
|
+
fn rect(p: vec2f, lo: vec2f, hi: vec2f, radius: f32) -> f32 {
|
|
75
|
+
let q = abs(p - (lo + hi) * 0.5) - (hi - lo) * 0.5 + radius;
|
|
76
|
+
let d = length(max(q, vec2f(0))) + min(max(q.x, q.y), 0.0) - radius;
|
|
77
|
+
return 1.0 - smoothstep(-0.001, 0.001, d);
|
|
78
|
+
}
|
|
79
|
+
@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
|
|
80
|
+
let p = uv;
|
|
81
|
+
let amber = linear(vec3f(1.0, 0.68, 0.24));
|
|
82
|
+
let cyan = linear(vec3f(0.28, 0.87, 0.87));
|
|
83
|
+
let purple = linear(vec3f(0.67, 0.57, 0.95));
|
|
84
|
+
var c = linear(vec3f(0.027, 0.055, 0.085));
|
|
85
|
+
c += linear(vec3f(0.035, 0.075, 0.09)) * exp(-4.0 * length((p - vec2f(0.48, 0.5)) * vec2f(1, 1.7)));
|
|
86
|
+
let card = rect(p, vec2f(0.035, 0.22), vec2f(0.695, 0.79), 0.014);
|
|
87
|
+
c = mix(c, linear(vec3f(0.05, 0.093, 0.12)), card);
|
|
88
|
+
let grid = max(1.0 - smoothstep(0.0, 0.001, abs(fract(p.x * 28.0) - 0.5) / 28.0), 1.0 - smoothstep(0.0, 0.001, abs(fract(p.y * 18.0) - 0.5) / 18.0));
|
|
89
|
+
c += linear(vec3f(0.065, 0.1, 0.12)) * grid * card * 0.28;
|
|
90
|
+
let sun = vec2f(0.122, 0.365);
|
|
91
|
+
c += amber * 0.08 * exp(-30.0 * length((p - sun) * vec2f(1, 0.5625)));
|
|
92
|
+
c = mix(c, amber, 1.0 - smoothstep(0.025, 0.027, length((p - sun) * vec2f(1, 0.5625))));
|
|
93
|
+
// Rays carry a periodic pulse; the energy split remains fixed and illustrative.
|
|
94
|
+
for (var i = 0; i < 5; i += 1) {
|
|
95
|
+
let start = vec2f(0.18, 0.30 + f32(i) * 0.064);
|
|
96
|
+
let finish = vec2f(0.60, 0.49 + f32(i) * 0.048);
|
|
97
|
+
let ray = line(p, start, finish, 0.0012);
|
|
98
|
+
let pulse = pow(0.5 + 0.5 * cos((p.x - params.time * 0.14 + f32(i) * 0.016) * 60.0), 12.0);
|
|
99
|
+
c = mix(c, amber, ray * (0.30 + 0.65 * pulse));
|
|
100
|
+
}
|
|
101
|
+
let wall = rect(p, vec2f(0.53, 0.38), vec2f(0.645, 0.72), 0.003);
|
|
102
|
+
c = mix(c, linear(vec3f(0.25, 0.34, 0.36)), wall);
|
|
103
|
+
let glass = rect(p, vec2f(0.543, 0.405), vec2f(0.632, 0.682), 0.001);
|
|
104
|
+
let heat = smoothstep(0.49, 0.68, p.y) * (0.70 + 0.08 * sin(params.time * 2.0 + p.y * 26.0 + p.x * 19.0));
|
|
105
|
+
c = mix(c, mix(linear(vec3f(0.08, 0.25, 0.31)), amber * 0.32, heat), glass);
|
|
106
|
+
c = mix(c, cyan * 0.55, line(p, vec2f(0.587, 0.405), vec2f(0.587, 0.682), 0.001));
|
|
107
|
+
c = mix(c, cyan * 0.30, line(p, vec2f(0.543, 0.545), vec2f(0.632, 0.545), 0.001));
|
|
108
|
+
// A canopy and its qualitative shade are separate from the numeric data model.
|
|
109
|
+
c = mix(c, linear(vec3f(0.13, 0.27, 0.31)), rect(p, vec2f(0.45, 0.355), vec2f(0.65, 0.388), 0.003));
|
|
110
|
+
c = mix(c, cyan, line(p, vec2f(0.45, 0.357), vec2f(0.65, 0.357), 0.0014));
|
|
111
|
+
c = mix(c, cyan * 0.65, line(p, vec2f(0.41, 0.72), vec2f(0.667, 0.72), 0.001));
|
|
112
|
+
c = mix(c, purple, line(p, vec2f(0.545, 0.60), vec2f(0.454, 0.65), 0.0013) * (0.55 + 0.4 * sin(params.time * 4.0) * sin(params.time * 4.0)));
|
|
113
|
+
c = mix(c, purple, line(p, vec2f(0.454, 0.65), vec2f(0.47, 0.631), 0.0013));
|
|
114
|
+
c = mix(c, purple, line(p, vec2f(0.454, 0.65), vec2f(0.477, 0.648), 0.0013));
|
|
115
|
+
let quantities = array<f32, 3>(params.blocked, params.reflected, params.absorbed);
|
|
116
|
+
let colors = array<vec3f, 3>(cyan, purple, amber);
|
|
117
|
+
for (var row = 0; row < 3; row += 1) {
|
|
118
|
+
let y = 0.38 + f32(row) * 0.148;
|
|
119
|
+
c = mix(c, linear(vec3f(0.12, 0.17, 0.20)), rect(p, vec2f(0.735, y), vec2f(0.957, y + 0.017), 0.003));
|
|
120
|
+
c = mix(c, colors[row], rect(p, vec2f(0.735, y), vec2f(0.735 + 0.222 * quantities[row], y + 0.017), 0.003));
|
|
121
|
+
}
|
|
122
|
+
c = mix(c, linear(vec3f(0.12, 0.2, 0.24)), line(p, vec2f(0.035, 0.848), vec2f(0.962, 0.848), 0.0007));
|
|
123
|
+
return vec4f(srgb(c), 1);
|
|
124
|
+
}`;
|
|
125
|
+
|
|
126
|
+
// Original 5×7 bitmap lettering keeps this optional example font- and browser-free.
|
|
127
|
+
const GLYPHS = {
|
|
128
|
+
A:'01110100011000111111100011000110001', B:'11110100011000111110100011000111110', C:'01111100001000010000100001000001111', D:'11110100011000110001100011000111110', E:'11111100001000011110100001000011111', F:'11111100001000011110100001000010000', G:'01111100001000010111100011000101111', H:'10001100011000111111100011000110001', I:'11111001000010000100001000010011111', J:'00111000100001000010000101001001100', K:'10001100101010011000101001001010001', L:'10000100001000010000100001000011111', M:'10001110111010110101100011000110001', N:'10001110011010110011100011000110001', O:'01110100011000110001100011000101110', P:'11110100011000111110100001000010000', Q:'01110100011000110001101011001001101', R:'11110100011000111110101001001010001', S:'01111100001000001110000010000111110', T:'11111001000010000100001000010000100', U:'10001100011000110001100011000101110', V:'10001100011000110001100010101000100', W:'10001100011000110101101011101110001', X:'10001100010101000100010101000110001', Y:'10001100010101000100001000010000100', Z:'11111000010001000100010001000011111',
|
|
129
|
+
'0':'01110100011001110101110011000101110', '1':'00100011000010000100001000010001110', '2':'01110100010000100010001000100011111', '3':'11110000010000101110000010000111110', '4':'00010001100101010010111110001000010', '5':'11111100001000011110000010000111110', '6':'01110100001000011110100011000101110', '7':'11111000010001000100010000100001000', '8':'01110100011000101110100011000101110', '9':'01110100011000101111000010000101110', '%':'11001110100001000100010001001110011', '/':'00001000100001000100010000100010000', '.':'00000000000000000000000000011000110', '-':'00000000000000011111000000000000000', ':':'00000011000110000000011000110000000', ' ':'00000000000000000000000000000000000',
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export function annotate(rgba, width, height, frame) {
|
|
133
|
+
if (!(rgba instanceof Uint8Array) || rgba.length !== width * height * 4) throw new Error('Invalid RGBA raster');
|
|
134
|
+
const unit = width / 768;
|
|
135
|
+
function text(message, x, y, size, color) {
|
|
136
|
+
let cursor = x * unit;
|
|
137
|
+
const scale = size * unit;
|
|
138
|
+
for (const character of message) {
|
|
139
|
+
const bits = GLYPHS[character];
|
|
140
|
+
if (!bits) throw new Error(`Unsupported authored glyph ${character}`);
|
|
141
|
+
for (let gy = 0; gy < 7; gy++) for (let gx = 0; gx < 5; gx++) if (bits[gy * 5 + gx] === '1') {
|
|
142
|
+
for (let py = Math.floor(y * unit + gy * scale); py < Math.floor(y * unit + (gy + 1) * scale); py++) for (let px = Math.floor(cursor + gx * scale); px < Math.floor(cursor + (gx + 1) * scale); px++) {
|
|
143
|
+
if (px < 0 || px >= width || py < 0 || py >= height) throw new Error('Authored label exceeds frame');
|
|
144
|
+
rgba.set([...color, 255], (py * width + px) * 4);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
cursor += 6 * scale;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
text('SOLAR ENERGY', 28, 27, 3, [235, 243, 240]);
|
|
151
|
+
text('SHADE / RAY FLOW', 29, 64, 1.5, [126, 162, 176]);
|
|
152
|
+
text('100 UNITS', 557, 28, 2.5, [255, 187, 92]);
|
|
153
|
+
text('NORMALIZED INPUT', 557, 57, 1.4, [126, 162, 176]);
|
|
154
|
+
text('CANOPY', 342, 128, 1.3, [116, 220, 216]);
|
|
155
|
+
text('GLAZING', 377, 319, 1.3, [164, 190, 197]);
|
|
156
|
+
text('62% BLOCKED', 564, 126, 1.5, [106, 223, 219]);
|
|
157
|
+
text('7% REFLECTED', 564, 190, 1.5, [178, 155, 248]);
|
|
158
|
+
text('31% ABSORBED', 564, 254, 1.5, [255, 187, 92]);
|
|
159
|
+
text('ILLUSTRATIVE ENERGY SPLIT', 28, 386, 1.6, [196, 216, 219]);
|
|
160
|
+
text('T ' + frame.timeSeconds.toFixed(2) + ' S', 571, 386, 1.6, [126, 162, 176]);
|
|
161
|
+
return rgba;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function verifyCalibration(bytes, width, height) {
|
|
165
|
+
const expected = [[1, 1, [255, 0, 0, 255]], [width - 2, 1, [0, 255, 0, 255]], [1, height - 2, [0, 0, 255, 255]], [width - 2, height - 2, [128, 128, 128, 255]]];
|
|
166
|
+
if (bytes.length !== width * height * 4) throw new Error('Calibration byte count mismatch');
|
|
167
|
+
for (const [x, y, pixel] of expected) for (let channel = 0; channel < 4; channel++) if (Math.abs(bytes[(y * width + x) * 4 + channel] - pixel[channel]) > 1) throw new Error('GPU orientation or sRGB calibration failed');
|
|
168
|
+
return { origin: 'top-left', channels: 'rgba', alpha: 'opaque', graySrgbByte: 128, toleranceBytes: 1 };
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function tagSrgbPng(png) {
|
|
172
|
+
if (png.length < 33 || png.subarray(0, 8).toString('hex') !== '89504e470d0a1a0a' || png.subarray(12, 16).toString() !== 'IHDR') throw new Error('Expected an encoded PNG');
|
|
173
|
+
// Standard PNG sRGB chunk: one-byte perceptual intent, with the specified CRC.
|
|
174
|
+
// No approximate gamma exponent replaces the shader's piecewise sRGB transfer.
|
|
175
|
+
return Buffer.concat([png.subarray(0, 33), Buffer.from('000000017352474200aece1ce9', 'hex'), png.subarray(33)]);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function physical(path, type) {
|
|
179
|
+
const stat = await lstat(path);
|
|
180
|
+
if (stat.isSymbolicLink() || !(type === 'directory' ? stat.isDirectory() : stat.isFile()) || await realpath(path) !== path) throw new Error(`Expected physical ${type}: ${path}`);
|
|
181
|
+
return stat;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export async function renderHeatField(input) {
|
|
185
|
+
const options = validateOptions(input);
|
|
186
|
+
rejectAmbientGpuOverrides(process.env);
|
|
187
|
+
if (process.platform !== 'darwin') throw new Error('This qualified example requires macOS Metal; qualify another backend separately');
|
|
188
|
+
if (Number(process.versions.node.split('.')[0]) < 22) throw new Error('vgpu requires Node22+');
|
|
189
|
+
await physical(options.runtimeRoot, 'directory');
|
|
190
|
+
await physical(dirname(options.outputRoot), 'directory');
|
|
191
|
+
const runtimeRequire = createRequire(join(options.runtimeRoot, 'package.json'));
|
|
192
|
+
const versions = {};
|
|
193
|
+
for (const [name, expected] of [['vgpu', '0.4.1'], ['@vgpu/adapter-node', '0.4.1'], ['webgpu', '0.4.0'], ['pngjs', '7.0.0']]) {
|
|
194
|
+
const packagePath = join(options.runtimeRoot, 'node_modules', name, 'package.json');
|
|
195
|
+
await physical(packagePath, 'file');
|
|
196
|
+
const value = JSON.parse(await readFile(packagePath, 'utf8'));
|
|
197
|
+
if (value.version !== expected) throw new Error(`Expected ${name}@${expected}`);
|
|
198
|
+
versions[name] = expected;
|
|
199
|
+
}
|
|
200
|
+
const source = await readFile(fileURLToPath(import.meta.url));
|
|
201
|
+
const lock = await readFile(join(options.runtimeRoot, 'package-lock.json'));
|
|
202
|
+
const nativePath = join(options.runtimeRoot, 'node_modules/webgpu/dist/darwin-universal.dawn.node');
|
|
203
|
+
await physical(nativePath, 'file');
|
|
204
|
+
const nativeSha256 = sha256(await readFile(nativePath));
|
|
205
|
+
const nodeSha256 = sha256(await readFile(await realpath(process.execPath)));
|
|
206
|
+
await mkdir(options.outputRoot, { mode: 0o700 });
|
|
207
|
+
await writeFile(join(options.outputRoot, 'heat-field.source.mjs'), source, { flag: 'wx', mode: 0o600 });
|
|
208
|
+
await writeFile(join(options.outputRoot, 'runtime-lock.json'), lock, { flag: 'wx', mode: 0o600 });
|
|
209
|
+
await writeFile(join(options.outputRoot, 'intent.json'), JSON.stringify({ kind: 'slopcamera-vgpu-example-intent', options: { width: options.width, height: options.height, frames: options.frames, startFrame: options.startFrame }, sourceSha256: sha256(source), lockSha256: sha256(lock), execution: 'explicit-trusted-current-user', hermetic: false, status: 'incomplete-until-manifest' }, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
|
|
210
|
+
const deadline = setTimeout(() => { process.stderr.write('GPU example exceeded120s; incomplete outputs retained\n'); process.kill(process.pid, 'SIGTERM'); }, 120000);
|
|
211
|
+
deadline.unref();
|
|
212
|
+
let gpu;
|
|
213
|
+
try {
|
|
214
|
+
const { init, effect, target, frame } = await import(pathToFileURL(runtimeRequire.resolve('vgpu/node')).href);
|
|
215
|
+
const { PNG } = runtimeRequire('pngjs');
|
|
216
|
+
gpu = await init({ adapter: 'hardware', backend: 'webgpu', backendFlags: ['backend=metal'] });
|
|
217
|
+
const hardware = gpu.device.adapterInfo;
|
|
218
|
+
const adapterInfo = verifyMetalHardware(gpu.adapter, hardware);
|
|
219
|
+
const errors = [];
|
|
220
|
+
gpu.onError((error) => { errors.push(error); });
|
|
221
|
+
const settle = async () => { await gpu.settled(); if (errors.length) throw new Error('GPU validation failed: ' + errors.map((error) => error.code ?? 'unknown').join(', ')); };
|
|
222
|
+
const output = target(gpu, { size: [options.width, options.height], format: 'rgba8unorm' });
|
|
223
|
+
const calibration = effect(gpu, CALIBRATION_WGSL);
|
|
224
|
+
await calibration.compile(output);
|
|
225
|
+
frame(gpu, (f) => f.pass(output, calibration));
|
|
226
|
+
await settle();
|
|
227
|
+
const calibrationBytes = await output.read();
|
|
228
|
+
await settle();
|
|
229
|
+
const calibrationEvidence = verifyCalibration(calibrationBytes, options.width, options.height);
|
|
230
|
+
const calibrationPng = tagSrgbPng(PNG.sync.write({ width: options.width, height: options.height, data: Buffer.from(calibrationBytes) }, { colorType: 2 }));
|
|
231
|
+
await writeFile(join(options.outputRoot, 'calibration.png'), calibrationPng, { flag: 'wx', mode: 0o600 });
|
|
232
|
+
const energy = energySplit(ENERGY);
|
|
233
|
+
const params = { time: 0, blocked: energy.blocked / energy.incident, reflected: energy.reflected / energy.incident, absorbed: energy.absorbed / energy.incident };
|
|
234
|
+
const graphic = effect(gpu, HEAT_FIELD_WGSL, { set: { params } });
|
|
235
|
+
await graphic.compile(output);
|
|
236
|
+
const frames = [];
|
|
237
|
+
let totalBytes = calibrationPng.length;
|
|
238
|
+
for (const item of frameSchedule(options.startFrame, options.frames)) {
|
|
239
|
+
graphic.set({ params: { ...params, time: item.timeSeconds } });
|
|
240
|
+
frame(gpu, (f) => f.pass(output, graphic));
|
|
241
|
+
await settle();
|
|
242
|
+
const raw = await output.read();
|
|
243
|
+
await settle();
|
|
244
|
+
if (raw.length !== options.width * options.height * 4) throw new Error('RGBA readback size mismatch');
|
|
245
|
+
for (let index = 3; index < raw.length; index += 4) if (raw[index] !== 255) throw new Error('Expected opaque GPU output');
|
|
246
|
+
const rawSha256 = sha256(raw);
|
|
247
|
+
const annotated = annotate(raw.slice(), options.width, options.height, item);
|
|
248
|
+
const png = tagSrgbPng(PNG.sync.write({ width: options.width, height: options.height, data: Buffer.from(annotated) }, { colorType: 2 }));
|
|
249
|
+
totalBytes += png.length;
|
|
250
|
+
if (totalBytes > 128 * 1024 * 1024) throw new Error('Output byte limit exceeded');
|
|
251
|
+
const path = `frame-${String(item.index).padStart(6, '0')}.png`;
|
|
252
|
+
await writeFile(join(options.outputRoot, path), png, { flag: 'wx', mode: 0o600 });
|
|
253
|
+
const retained = await readFile(join(options.outputRoot, path));
|
|
254
|
+
if (sha256(retained) !== sha256(png)) throw new Error('Retained frame changed');
|
|
255
|
+
const decoded = PNG.sync.read(retained);
|
|
256
|
+
if (decoded.width !== options.width || decoded.height !== options.height || !Buffer.from(decoded.data).equals(Buffer.from(annotated))) throw new Error('PNG changed GPU-derived pixels');
|
|
257
|
+
frames.push({ ...item, path, bytes: png.length, sha256: sha256(png), rawGpuRgbaSha256: rawSha256 });
|
|
258
|
+
}
|
|
259
|
+
if (frames.length > 1 && frames.every((entry) => entry.rawGpuRgbaSha256 === frames[0].rawGpuRgbaSha256)) throw new Error('Animation did not change GPU pixels');
|
|
260
|
+
await settle();
|
|
261
|
+
if (sha256(await readFile(nativePath)) !== nativeSha256 || sha256(await readFile(join(options.runtimeRoot, 'package-lock.json'))) !== sha256(lock) || sha256(await readFile(fileURLToPath(import.meta.url))) !== sha256(source)) throw new Error('Source or native runtime changed during rendering');
|
|
262
|
+
const nativeModules = Object.keys(runtimeRequire.cache).filter((path) => path.endsWith('.node'));
|
|
263
|
+
if (nativeModules.length !== 1 || nativeModules[0] !== nativePath) throw new Error('Unexpected loaded native dependency');
|
|
264
|
+
const manifest = { kind: 'slopcamera-vgpu-illustrative-sequence', schemaVersion: 1, execution: 'explicit-trusted-current-user', renderer: 'vgpu-offscreen-effect', sceneOwnership: 'external-existing-renderer', physicalSimulation: false, dimensions: { width: options.width, height: options.height }, fps: FPS, frameInterval: { startInclusive: options.startFrame, endExclusive: options.startFrame + options.frames }, color: { primaries: 'srgb', transfer: 'srgb', channels: 'rgb', dataType: 'uint8', alpha: 'opaque', origin: 'top-left', pngSrgbIntent: 'perceptual' }, energy, inputProvenance: 'authored-illustrative-values-not-measurements', annotations: 'project-owned-original-bitmap-labels-after-GPU-readback', sourceSha256: sha256(source), shaderSha256: sha256(HEAT_FIELD_WGSL), lockSha256: sha256(lock), runtime: { node: process.versions.node, nodeSha256, nativeBinary: 'webgpu/dist/darwin-universal.dawn.node', nativeSha256, platform: process.platform, arch: process.arch, versions }, adapter: gpu.adapter, adapterInfo, backendRequested: 'metal', calibration: { ...calibrationEvidence, path: 'calibration.png', sha256: sha256(calibrationPng) }, totalBytes, frames };
|
|
265
|
+
gpu.dispose();
|
|
266
|
+
gpu = undefined;
|
|
267
|
+
await writeFile(join(options.outputRoot, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
|
|
268
|
+
return manifest;
|
|
269
|
+
} finally {
|
|
270
|
+
gpu?.dispose();
|
|
271
|
+
clearTimeout(deadline);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
276
|
+
const options = {};
|
|
277
|
+
const names = { '--runtime': 'runtimeRoot', '--output': 'outputRoot', '--width': 'width', '--height': 'height', '--frames': 'frames', '--start-frame': 'startFrame' };
|
|
278
|
+
try {
|
|
279
|
+
for (let index = 2; index < process.argv.length; index += 2) {
|
|
280
|
+
const key = names[process.argv[index]];
|
|
281
|
+
if (!key || options[key] !== undefined || !process.argv[index + 1]) throw new Error('Expected unique --runtime ABS --output ABS [--frames N --start-frame N --width N --height N]');
|
|
282
|
+
options[key] = ['runtimeRoot', 'outputRoot'].includes(key) ? process.argv[index + 1] : Number(process.argv[index + 1]);
|
|
283
|
+
}
|
|
284
|
+
const manifest = await renderHeatField(options);
|
|
285
|
+
process.stdout.write(JSON.stringify({ outputRoot: options.outputRoot, adapter: manifest.adapter, frames: manifest.frames.length, totalBytes: manifest.totalBytes }) + '\n');
|
|
286
|
+
} catch (error) {
|
|
287
|
+
process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
|
|
288
|
+
process.exitCode = 1;
|
|
289
|
+
}
|
|
290
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hraness/slopcamera",
|
|
3
|
+
"version": "3.2.4",
|
|
4
|
+
"description": "A local visual studio for coding agents: author scenes, combine generated and recorded media, and export images, diagrams, animation, and video from retained sources.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"./src/cli.ts",
|
|
9
|
+
"./src/code/advanced.ts",
|
|
10
|
+
"./src/code/index.ts",
|
|
11
|
+
"./src/generate.ts",
|
|
12
|
+
"./src/host-resources.ts",
|
|
13
|
+
"./src/index.ts",
|
|
14
|
+
"./src/operations.ts",
|
|
15
|
+
"./src/vectorize/worker.ts",
|
|
16
|
+
"./src/workflow.ts",
|
|
17
|
+
"./apps/desktop/cli/main.ts"
|
|
18
|
+
],
|
|
19
|
+
"packageManager": "bun@1.3.14",
|
|
20
|
+
"engines": {
|
|
21
|
+
"bun": ">=1.3.14"
|
|
22
|
+
},
|
|
23
|
+
"workspaces": {
|
|
24
|
+
"packages": [
|
|
25
|
+
"apps/web",
|
|
26
|
+
"packages/*"
|
|
27
|
+
],
|
|
28
|
+
"catalog": {
|
|
29
|
+
"@ai-sdk/gateway-v4": "npm:@ai-sdk/gateway@^4.0.27",
|
|
30
|
+
"@img/sharp-darwin-arm64": "0.35.3",
|
|
31
|
+
"@img/sharp-libvips-darwin-arm64": "1.3.2",
|
|
32
|
+
"@native-sdk/cli": "0.5.3",
|
|
33
|
+
"@types/bun": "^1.3.14",
|
|
34
|
+
"@types/node": "^24.10.0",
|
|
35
|
+
"@types/react": "^19.2.14",
|
|
36
|
+
"@types/react-dom": "^19.2.3",
|
|
37
|
+
"@vitejs/plugin-react": "^6.0.3",
|
|
38
|
+
"agent-browser": "0.32.3",
|
|
39
|
+
"ai-v7": "npm:ai@^7.0.36",
|
|
40
|
+
"chromium-bidi": "12.1.0",
|
|
41
|
+
"eslint": "^9.39.2",
|
|
42
|
+
"fast-check": "^4.8.0",
|
|
43
|
+
"motion": "12.42.0",
|
|
44
|
+
"@paper-design/shaders": "0.0.77",
|
|
45
|
+
"playwright-core": "1.62.0",
|
|
46
|
+
"react": "19.2.3",
|
|
47
|
+
"react-dom": "19.2.3",
|
|
48
|
+
"three": "0.183.2",
|
|
49
|
+
"typescript": "^6.0.3",
|
|
50
|
+
"vite": "^8.1.5",
|
|
51
|
+
"zod": "^4.4.3"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "git+https://github.com/hraness/slopcamera.git"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://slopcamera.com/",
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/hraness/slopcamera/issues"
|
|
61
|
+
},
|
|
62
|
+
"keywords": [
|
|
63
|
+
"ai-media-generation",
|
|
64
|
+
"ai-video-generation",
|
|
65
|
+
"video-generation",
|
|
66
|
+
"video-editing",
|
|
67
|
+
"image-generation",
|
|
68
|
+
"screen-recording",
|
|
69
|
+
"motion-graphics",
|
|
70
|
+
"captions",
|
|
71
|
+
"speech-generation",
|
|
72
|
+
"transcription",
|
|
73
|
+
"diagrams",
|
|
74
|
+
"creative-coding",
|
|
75
|
+
"coding-agents",
|
|
76
|
+
"agent-skill",
|
|
77
|
+
"mcp-server",
|
|
78
|
+
"cli",
|
|
79
|
+
"typescript",
|
|
80
|
+
"bun",
|
|
81
|
+
"local-first"
|
|
82
|
+
],
|
|
83
|
+
"exports": {
|
|
84
|
+
".": {
|
|
85
|
+
"types": "./src/index.ts",
|
|
86
|
+
"import": "./dist/index.js"
|
|
87
|
+
},
|
|
88
|
+
"./cli": {
|
|
89
|
+
"types": "./src/cli.ts",
|
|
90
|
+
"import": "./dist/cli.js"
|
|
91
|
+
},
|
|
92
|
+
"./code": {
|
|
93
|
+
"types": "./src/code/index.ts",
|
|
94
|
+
"import": "./dist/code/index.js"
|
|
95
|
+
},
|
|
96
|
+
"./code/advanced": {
|
|
97
|
+
"types": "./src/code/advanced.ts",
|
|
98
|
+
"import": "./dist/code/advanced.js"
|
|
99
|
+
},
|
|
100
|
+
"./generate": {
|
|
101
|
+
"types": "./src/generate.ts",
|
|
102
|
+
"import": "./dist/generate.js"
|
|
103
|
+
},
|
|
104
|
+
"./host-resources": {
|
|
105
|
+
"types": "./src/host-resources.ts",
|
|
106
|
+
"import": "./dist/host-resources.js"
|
|
107
|
+
},
|
|
108
|
+
"./operations": {
|
|
109
|
+
"types": "./src/operations.ts",
|
|
110
|
+
"import": "./dist/operations.js"
|
|
111
|
+
},
|
|
112
|
+
"./workflow": {
|
|
113
|
+
"types": "./src/workflow.ts",
|
|
114
|
+
"import": "./dist/workflow.js"
|
|
115
|
+
},
|
|
116
|
+
"./scene": {
|
|
117
|
+
"types": "./packages/scene/src/index.ts",
|
|
118
|
+
"import": "./packages/scene/src/index.ts"
|
|
119
|
+
},
|
|
120
|
+
"./local/code": {
|
|
121
|
+
"types": "./apps/desktop/code/public.ts",
|
|
122
|
+
"import": "./apps/desktop/code/public.ts"
|
|
123
|
+
},
|
|
124
|
+
"./local/code/advanced": {
|
|
125
|
+
"types": "./apps/desktop/code/advanced.ts",
|
|
126
|
+
"import": "./apps/desktop/code/advanced.ts"
|
|
127
|
+
},
|
|
128
|
+
"./local/code/workflows": {
|
|
129
|
+
"types": "./apps/desktop/workflows/index.ts",
|
|
130
|
+
"import": "./apps/desktop/workflows/index.ts"
|
|
131
|
+
},
|
|
132
|
+
"./local/html-overlay": {
|
|
133
|
+
"types": "./apps/desktop/html-overlay/index.ts",
|
|
134
|
+
"import": "./apps/desktop/html-overlay/index.ts"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"bin": {
|
|
138
|
+
"slopcamera": "./apps/desktop/dist/cli/main.js"
|
|
139
|
+
},
|
|
140
|
+
"main": "./dist/index.js",
|
|
141
|
+
"types": "./src/index.ts",
|
|
142
|
+
"files": [
|
|
143
|
+
"dist",
|
|
144
|
+
"apps/desktop/analysis/protocol.ts",
|
|
145
|
+
"apps/desktop/capture/protocol.ts",
|
|
146
|
+
"apps/desktop/application/**/*.ts",
|
|
147
|
+
"!apps/desktop/application/**/*.test.ts",
|
|
148
|
+
"!apps/desktop/application/**/*.testing.ts",
|
|
149
|
+
"!apps/desktop/application/**/test-support.ts",
|
|
150
|
+
"!apps/desktop/application/**/*test-support.ts",
|
|
151
|
+
"apps/desktop/cli/**/*.ts",
|
|
152
|
+
"apps/desktop/studio/**/*.ts",
|
|
153
|
+
"!apps/desktop/studio/**/*.test.ts",
|
|
154
|
+
"!apps/desktop/studio/**/qualify-*.ts",
|
|
155
|
+
"apps/desktop/studio/**/*.py",
|
|
156
|
+
"!apps/desktop/studio/**/test_*.py",
|
|
157
|
+
"!apps/desktop/studio/**/qualify_*.py",
|
|
158
|
+
"examples/studio/**/*.py",
|
|
159
|
+
"examples/studio/**/*.json",
|
|
160
|
+
"examples/studio/**/README.md",
|
|
161
|
+
"docs/studio.md",
|
|
162
|
+
"examples/studio/native-workflow.ts",
|
|
163
|
+
"examples/studio/hybrid-scene.ts",
|
|
164
|
+
"examples/studio/vgpu/heat-field.mjs",
|
|
165
|
+
"apps/desktop/studio/assets/README.md",
|
|
166
|
+
"!apps/desktop/cli/**/*.test.ts",
|
|
167
|
+
"!apps/desktop/cli/build-compiled.ts",
|
|
168
|
+
"!apps/desktop/cli/compiled-bootstrap.ts",
|
|
169
|
+
"apps/desktop/code/**/*.ts",
|
|
170
|
+
"!apps/desktop/code/**/*.test.ts",
|
|
171
|
+
"!apps/desktop/code/**/*benchmark*.ts",
|
|
172
|
+
"apps/desktop/contracts/**/*.ts",
|
|
173
|
+
"!apps/desktop/contracts/**/*.test.ts",
|
|
174
|
+
"apps/desktop/core/**/*.ts",
|
|
175
|
+
"!apps/desktop/core/**/*.test.ts",
|
|
176
|
+
"!apps/desktop/core/**/test-support.ts",
|
|
177
|
+
"apps/desktop/dist/cli",
|
|
178
|
+
"apps/desktop/html-overlay/**/*.ts",
|
|
179
|
+
"!apps/desktop/html-overlay/**/*.test.ts",
|
|
180
|
+
"!apps/desktop/html-overlay/**/*.testing.ts",
|
|
181
|
+
"apps/desktop/workflows/**/*.ts",
|
|
182
|
+
"!apps/desktop/workflows/**/*.test.ts",
|
|
183
|
+
"packages/scene/src/**/*.ts",
|
|
184
|
+
"!packages/scene/src/**/*.test.ts",
|
|
185
|
+
"NOTICE.md",
|
|
186
|
+
"src/**/*.ts",
|
|
187
|
+
"!src/**/*.test.ts",
|
|
188
|
+
"!src/spatial-scene/test-fixture.ts",
|
|
189
|
+
"src/assets/fonts/nebula-sans",
|
|
190
|
+
"schema",
|
|
191
|
+
"skills",
|
|
192
|
+
"README.md",
|
|
193
|
+
"PRIVACY.md",
|
|
194
|
+
"SECURITY.md",
|
|
195
|
+
"LICENSE"
|
|
196
|
+
],
|
|
197
|
+
"scripts": {
|
|
198
|
+
"build": "bun run build:sdk && bun run build:desktop && bun run build:web",
|
|
199
|
+
"build:sdk": "bun -e 'await (await import(\"node:fs/promises\")).rm(\"./dist\", { recursive: true, force: true })' && bun build ./src/index.ts ./src/cli.ts ./src/code/index.ts ./src/code/advanced.ts ./src/generate.ts ./src/host-resources.ts ./src/operations.ts ./src/workflow.ts ./src/vectorize/worker.ts --outdir ./dist --root ./src --target bun --format esm --splitting --packages external",
|
|
200
|
+
"build:desktop": "bun run build:desktop:cli && bun run build:desktop:frontend && bun run build:desktop:runtime",
|
|
201
|
+
"build:desktop:cli": "bun -e 'await (await import(\"node:fs/promises\")).rm(\"./apps/desktop/dist/cli\", { recursive: true, force: true })' && bun build --target=bun --minify --sourcemap=none --packages external --external @hraness/slopcamera/cli apps/desktop/cli/main.ts --outdir apps/desktop/dist/cli",
|
|
202
|
+
"build:desktop:frontend": "vite build --config apps/desktop/frontend/vite.config.ts && bun run check:desktop:direct-boundary",
|
|
203
|
+
"build:desktop:runtime": "bun build --compile --minify --sourcemap=none apps/desktop/runtime/src/main.ts --outfile apps/desktop/runtime/dist/slopcamera-gateway && bun run check:desktop:direct-boundary",
|
|
204
|
+
"build:web": "bun run --cwd apps/web build",
|
|
205
|
+
"dev:frontend": "vite --config apps/desktop/frontend/vite.config.ts",
|
|
206
|
+
"dev:direct": "vite --config apps/desktop/direct/vite.config.ts",
|
|
207
|
+
"fuzz:direct": "bun run ./apps/desktop/direct/fuzz-browser.ts",
|
|
208
|
+
"dev:desktop": "bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-native.ts dev",
|
|
209
|
+
"typecheck": "bun run typecheck:sdk && bun run typecheck:desktop",
|
|
210
|
+
"typecheck:sdk": "tsc --noEmit -p tsconfig.json",
|
|
211
|
+
"typecheck:desktop": "tsc --noEmit -p apps/desktop/tsconfig.json",
|
|
212
|
+
"lint": "bun run lint:sdk && bun run lint:desktop",
|
|
213
|
+
"lint:sdk": "eslint src packages/scene scripts",
|
|
214
|
+
"lint:desktop": "eslint apps/desktop/contracts apps/desktop/core apps/desktop/application apps/desktop/code apps/desktop/workflows apps/desktop/html-overlay apps/desktop/cli apps/desktop/qualification apps/desktop/capture apps/desktop/analysis apps/desktop/runtime apps/desktop/frontend apps/desktop/direct apps/desktop/studio",
|
|
215
|
+
"test": "bun run test:sdk && bun run test:desktop && bun run --cwd apps/web test",
|
|
216
|
+
"test:sdk": "bun test ./src ./packages/scene",
|
|
217
|
+
"test:desktop": "bun test ./apps/desktop/contracts ./apps/desktop/core ./apps/desktop/application ./apps/desktop/code ./apps/desktop/workflows ./apps/desktop/html-overlay ./apps/desktop/cli ./apps/desktop/capture ./apps/desktop/analysis ./apps/desktop/runtime ./apps/desktop/frontend ./apps/desktop/direct ./apps/desktop/studio",
|
|
218
|
+
"test:desktop:macos": "bun run build:desktop:capture:macos && bun test ./apps/desktop/capture/interruption-state.macos.test.ts ./apps/desktop/capture/timeline-prepared.macos.test.ts ./apps/desktop/capture/controller-orchestration.macos.test.ts ./apps/desktop/capture/finalization-state.macos.test.ts ./apps/desktop/capture/start-coordinator.macos.test.ts ./apps/desktop/capture/recorder-single-flight.macos.test.ts ./apps/desktop/capture/native-interruptions.macos.test.ts && bun run build:desktop:analysis:macos && bun test ./apps/desktop/analysis && bun run ./apps/desktop/runtime/run-zig.ts build test -Dplatform=macos",
|
|
219
|
+
"build:desktop:capture:macos": "bun run ./apps/desktop/capture/build.ts",
|
|
220
|
+
"build:desktop:analysis:macos": "bun run ./apps/desktop/analysis/build.ts",
|
|
221
|
+
"build:desktop:macos": "bun run build:desktop:capture:macos && bun run build:desktop:analysis:macos && bun run build:desktop:frontend && bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-zig.ts build -Dplatform=macos -Doptimize=ReleaseFast",
|
|
222
|
+
"start:desktop:macos": "bun run build:desktop:capture:macos && bun run build:desktop:analysis:macos && bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-native.ts run",
|
|
223
|
+
"package:desktop:macos": "bun run build:desktop:capture:macos && bun run build:desktop:analysis:macos && bun run build:desktop:frontend && bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-zig.ts build package -Dplatform=macos -Dpackage-target=macos && bun run ./apps/desktop/runtime/package-macos.ts",
|
|
224
|
+
"build:cli:macos": "bun run ./apps/desktop/cli/build-compiled.ts",
|
|
225
|
+
"test:cli:compiled:macos": "bun run build:cli:macos && SLOPCAMERA_RUN_COMPILED_CLI_SMOKE=1 bun test ./apps/desktop/cli/compiled-portable-surface.macos.test.ts",
|
|
226
|
+
"test:html-overlay": "bun test ./apps/desktop/html-overlay ./apps/desktop/application/html-overlay-browser-runtime.test.ts ./apps/desktop/application/html-overlay-integrity.test.ts ./apps/desktop/application/operations/media/html-overlay.test.ts ./apps/desktop/cli/html-overlay-renderer.security.test.ts ./apps/desktop/cli/html-overlay-snapshot-scavenger.test.ts ./apps/desktop/cli/html-overlay-renderer.macos.test.ts",
|
|
227
|
+
"qualify:spatial-scenes": "bun run ./apps/desktop/qualification/spatial-scenes.ts",
|
|
228
|
+
"qualify:creative-scenes": "bun run ./apps/desktop/qualification/creative-render.ts",
|
|
229
|
+
"qualify:saved-world": "bun run ./apps/desktop/qualification/world-render.ts",
|
|
230
|
+
"qualify:spatial-project": "bun run ./apps/desktop/qualification/project.ts",
|
|
231
|
+
"qualify:spatial-compositor": "bun run ./apps/desktop/qualification/spatial-compositor.ts",
|
|
232
|
+
"test:html-overlay:browser:macos": "SLOPCAMERA_RUN_HTML_OVERLAY_RENDERER_SMOKE=1 bun test ./apps/desktop/cli/html-overlay-renderer.macos.test.ts",
|
|
233
|
+
"test:html-overlay:libraries:macos": "SLOPCAMERA_RUN_HTML_OVERLAY_LIBRARY_SMOKE=1 bun test ./apps/desktop/cli/html-overlay-renderer.macos.test.ts",
|
|
234
|
+
"test:html-overlay:operation:macos": "SLOPCAMERA_RUN_HTML_OVERLAY_OPERATION_SMOKE=1 bun test ./apps/desktop/application/operations/media/html-overlay.test.ts",
|
|
235
|
+
"verify:html-overlay:macos": "bun run test:html-overlay:browser:macos && bun run test:html-overlay:libraries:macos && bun run test:html-overlay:operation:macos",
|
|
236
|
+
"test:capture:hardware:macos": "bun test ./apps/desktop/capture/hardware-smoke.macos.test.ts",
|
|
237
|
+
"doctor:macos": "native doctor --manifest apps/desktop/app.zon --strict",
|
|
238
|
+
"benchmark:code-concurrency": "bun run ./apps/desktop/code/concurrency-benchmark.ts",
|
|
239
|
+
"check:desktop:direct-boundary": "bun run ./apps/desktop/direct/check-production-boundary.ts",
|
|
240
|
+
"verify:direct": "bun run ./apps/desktop/direct/verify-browser.ts",
|
|
241
|
+
"check:release-workflows": "bun test ./scripts/release-workflow.test.ts ./scripts/github-release.test.ts",
|
|
242
|
+
"check:schema": "bun run ./scripts/validate-schema.ts",
|
|
243
|
+
"check:skill": "bun run ./scripts/validate-skill.ts",
|
|
244
|
+
"check:standalone": "bun run ./scripts/check-standalone.ts",
|
|
245
|
+
"test:vectorize:official": "bun run ./scripts/official-vectorizer-smoke.ts",
|
|
246
|
+
"test:package": "bun run ./scripts/package-smoke.ts",
|
|
247
|
+
"check:sdk": "bun run typecheck:sdk && bun run lint:sdk && bun run build:sdk && bun run test:sdk && bun run check:release-workflows && bun run check:schema && bun run check:skill",
|
|
248
|
+
"check:desktop": "bun run check:effect && bun run typecheck:desktop && bun run lint:desktop && bun run test:desktop && bun run build:desktop",
|
|
249
|
+
"check:web": "bun run --cwd apps/web check",
|
|
250
|
+
"kb:refresh": "bunx --bun github:hraness/kb#v0.15.2 refresh --root kb",
|
|
251
|
+
"kb:check:lane": "bunx --bun github:hraness/kb#v0.15.2 check --root kb --no-catalog",
|
|
252
|
+
"kb:check": "bunx --bun github:hraness/kb#v0.15.2 check --root kb && bunx --bun github:hraness/kb#v0.15.2 agents check --root kb --repo .",
|
|
253
|
+
"kb:catalog": "bunx --bun github:hraness/kb#v0.15.2 catalog --root kb",
|
|
254
|
+
"check": "bun run check:standalone && bun run check:sdk && bun run check:desktop && bun run check:web && bun run check:standalone && bun run test:package",
|
|
255
|
+
"prepack": "bun run check",
|
|
256
|
+
"check:effect": "bun run ./scripts/check-effect-policy.ts && bun test ./scripts/check-effect-architecture.test.ts"
|
|
257
|
+
},
|
|
258
|
+
"dependencies": {
|
|
259
|
+
"@ai-sdk/gateway-v4": "npm:@ai-sdk/gateway@^4.0.27",
|
|
260
|
+
"@noble/hashes": "2.2.0",
|
|
261
|
+
"@paper-design/shaders": "0.0.77",
|
|
262
|
+
"@resvg/resvg-js": "2.6.2",
|
|
263
|
+
"@vercel/blob": "2.8.0",
|
|
264
|
+
"ai-v7": "npm:ai@^7.0.36",
|
|
265
|
+
"chromium-bidi": "12.1.0",
|
|
266
|
+
"effect": "3.22.1",
|
|
267
|
+
"motion": "12.42.0",
|
|
268
|
+
"playwright-core": "1.62.0",
|
|
269
|
+
"react": "19.2.3",
|
|
270
|
+
"react-dom": "19.2.3",
|
|
271
|
+
"sharp": "0.35.3",
|
|
272
|
+
"three": "0.183.2",
|
|
273
|
+
"typescript": "^6.0.3",
|
|
274
|
+
"zod": "^4.4.3"
|
|
275
|
+
},
|
|
276
|
+
"optionalDependencies": {
|
|
277
|
+
"@img/sharp-darwin-arm64": "0.35.3",
|
|
278
|
+
"@img/sharp-libvips-darwin-arm64": "1.3.2"
|
|
279
|
+
},
|
|
280
|
+
"devDependencies": {
|
|
281
|
+
"@antithesishq/bombadil": "0.7.2",
|
|
282
|
+
"@eslint/js": "^9.39.2",
|
|
283
|
+
"@hraness/design-kit": "github:hraness/design-kit#v0.3.0",
|
|
284
|
+
"@hraness/direct": "github:hraness/direct#v0.7.20",
|
|
285
|
+
"@native-sdk/cli": "0.5.3",
|
|
286
|
+
"@types/bun": "^1.3.14",
|
|
287
|
+
"@types/json-schema": "^7.0.15",
|
|
288
|
+
"@types/node": "^24.10.0",
|
|
289
|
+
"@types/react": "^19.2.14",
|
|
290
|
+
"@types/react-dom": "^19.2.3",
|
|
291
|
+
"@vitejs/plugin-react": "^6.0.3",
|
|
292
|
+
"agent-browser": "0.32.3",
|
|
293
|
+
"ajv": "8.17.1",
|
|
294
|
+
"eslint": "^9.39.2",
|
|
295
|
+
"fast-check": "^4.8.0",
|
|
296
|
+
"tldraw": "5.2.5",
|
|
297
|
+
"typescript-eslint": "^8.53.0",
|
|
298
|
+
"vite": "^8.1.5"
|
|
299
|
+
},
|
|
300
|
+
"publishConfig": {
|
|
301
|
+
"access": "public",
|
|
302
|
+
"registry": "https://registry.npmjs.org"
|
|
303
|
+
}
|
|
304
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./scene";
|