@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.
Files changed (441) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +60 -0
  3. package/PRIVACY.md +46 -0
  4. package/README.md +311 -0
  5. package/SECURITY.md +21 -0
  6. package/apps/desktop/README.md +966 -0
  7. package/apps/desktop/analysis/protocol.ts +223 -0
  8. package/apps/desktop/application/capability-binding.ts +594 -0
  9. package/apps/desktop/application/context.ts +97 -0
  10. package/apps/desktop/application/creative-iteration.ts +1385 -0
  11. package/apps/desktop/application/default-registry.ts +146 -0
  12. package/apps/desktop/application/directing-contract.ts +218 -0
  13. package/apps/desktop/application/directing-plan.ts +178 -0
  14. package/apps/desktop/application/errors.ts +18 -0
  15. package/apps/desktop/application/gateway-port.ts +867 -0
  16. package/apps/desktop/application/html-overlay-browser-runtime.ts +687 -0
  17. package/apps/desktop/application/html-overlay-integrity.ts +337 -0
  18. package/apps/desktop/application/html-overlay-renderer.ts +45 -0
  19. package/apps/desktop/application/index.ts +13 -0
  20. package/apps/desktop/application/operation-completion-checkpoint.ts +333 -0
  21. package/apps/desktop/application/operation-effects.ts +94 -0
  22. package/apps/desktop/application/operation.ts +224 -0
  23. package/apps/desktop/application/operations/analysis/faces.ts +244 -0
  24. package/apps/desktop/application/operations/analysis/music.ts +248 -0
  25. package/apps/desktop/application/operations/analysis/project-auto-zooms.ts +302 -0
  26. package/apps/desktop/application/operations/analysis/project-inactivity.ts +381 -0
  27. package/apps/desktop/application/operations/analysis/scenes.ts +272 -0
  28. package/apps/desktop/application/operations/analysis/shared.ts +202 -0
  29. package/apps/desktop/application/operations/derive/edit-batch.ts +967 -0
  30. package/apps/desktop/application/operations/derive/follow-faces.ts +454 -0
  31. package/apps/desktop/application/operations/edit/bind-candidate-revision.ts +91 -0
  32. package/apps/desktop/application/operations/edit/create-candidate-revision.ts +377 -0
  33. package/apps/desktop/application/operations/edit/create-revision.ts +255 -0
  34. package/apps/desktop/application/operations/edit/freeze-revision.ts +182 -0
  35. package/apps/desktop/application/operations/gateway/image.ts +41 -0
  36. package/apps/desktop/application/operations/gateway/index.ts +17 -0
  37. package/apps/desktop/application/operations/gateway/shared.ts +122 -0
  38. package/apps/desktop/application/operations/gateway/speech.ts +41 -0
  39. package/apps/desktop/application/operations/gateway/transcription.ts +42 -0
  40. package/apps/desktop/application/operations/gateway/video.ts +41 -0
  41. package/apps/desktop/application/operations/index.ts +31 -0
  42. package/apps/desktop/application/operations/iteration/create-candidate.ts +240 -0
  43. package/apps/desktop/application/operations/iteration/create-matrix.ts +117 -0
  44. package/apps/desktop/application/operations/iteration/select.ts +155 -0
  45. package/apps/desktop/application/operations/iteration/shared.ts +250 -0
  46. package/apps/desktop/application/operations/media/audio-effects.ts +376 -0
  47. package/apps/desktop/application/operations/media/binding.ts +79 -0
  48. package/apps/desktop/application/operations/media/capabilities.ts +112 -0
  49. package/apps/desktop/application/operations/media/color-grade.ts +343 -0
  50. package/apps/desktop/application/operations/media/html-overlay.ts +802 -0
  51. package/apps/desktop/application/operations/media/index.ts +8 -0
  52. package/apps/desktop/application/operations/media/ingest.ts +303 -0
  53. package/apps/desktop/application/operations/media/overlay.ts +729 -0
  54. package/apps/desktop/application/operations/media/shared.ts +845 -0
  55. package/apps/desktop/application/operations/media/transform-platform.ts +120 -0
  56. package/apps/desktop/application/operations/project/commit-edits.ts +2054 -0
  57. package/apps/desktop/application/operations/project/promote-selection.ts +495 -0
  58. package/apps/desktop/application/operations/project/snapshot.ts +95 -0
  59. package/apps/desktop/application/operations/recording/index.ts +5 -0
  60. package/apps/desktop/application/operations/recording/pause.ts +34 -0
  61. package/apps/desktop/application/operations/recording/resume.ts +34 -0
  62. package/apps/desktop/application/operations/recording/shared.ts +199 -0
  63. package/apps/desktop/application/operations/recording/start.ts +169 -0
  64. package/apps/desktop/application/operations/recording/stop.ts +34 -0
  65. package/apps/desktop/application/operations/render/bind-candidate-output.ts +324 -0
  66. package/apps/desktop/application/operations/render/materialize-selection.ts +322 -0
  67. package/apps/desktop/application/operations/render/project-caption-plan.ts +287 -0
  68. package/apps/desktop/application/operations/render/project-plan.ts +939 -0
  69. package/apps/desktop/application/operations/render/project-spatial-receipt.ts +70 -0
  70. package/apps/desktop/application/operations/render/project.ts +1922 -0
  71. package/apps/desktop/application/operations/shared.ts +67 -0
  72. package/apps/desktop/application/operations/slopcamera-portable.ts +1188 -0
  73. package/apps/desktop/application/operations/slopcamera-visuals.ts +784 -0
  74. package/apps/desktop/application/operations/spatial-project.ts +209 -0
  75. package/apps/desktop/application/operations/spatial-render.ts +415 -0
  76. package/apps/desktop/application/operations/spatial-scene.ts +97 -0
  77. package/apps/desktop/application/operations/studio.ts +143 -0
  78. package/apps/desktop/application/output-publication-lease.ts +163 -0
  79. package/apps/desktop/application/project-publication-lease.ts +233 -0
  80. package/apps/desktop/application/project-store.ts +196 -0
  81. package/apps/desktop/application/receipts.ts +533 -0
  82. package/apps/desktop/application/registry.ts +182 -0
  83. package/apps/desktop/application/spatial-assets.ts +675 -0
  84. package/apps/desktop/application/spatial-compositor-cadence.ts +23 -0
  85. package/apps/desktop/application/spatial-project-authority.ts +35 -0
  86. package/apps/desktop/application/spatial-project-lease.ts +126 -0
  87. package/apps/desktop/application/spatial-project-render-preparation.ts +225 -0
  88. package/apps/desktop/application/spatial-project-store.ts +286 -0
  89. package/apps/desktop/application/spatial-render-projection.ts +201 -0
  90. package/apps/desktop/application/spatial-render.ts +677 -0
  91. package/apps/desktop/application/spatial-spz.ts +44 -0
  92. package/apps/desktop/application/spatial-world-import.ts +135 -0
  93. package/apps/desktop/application/spatial-world-provenance.ts +46 -0
  94. package/apps/desktop/application/studio-port.ts +58 -0
  95. package/apps/desktop/application/verified-receipt-reconciliation.ts +1574 -0
  96. package/apps/desktop/capture/protocol.ts +689 -0
  97. package/apps/desktop/cli/analyzer.ts +406 -0
  98. package/apps/desktop/cli/args.ts +3181 -0
  99. package/apps/desktop/cli/asset-ingest.ts +747 -0
  100. package/apps/desktop/cli/atomic-render-effects.ts +210 -0
  101. package/apps/desktop/cli/atomic-render-platform.ts +205 -0
  102. package/apps/desktop/cli/atomic-render.ts +50 -0
  103. package/apps/desktop/cli/audio-analysis.ts +252 -0
  104. package/apps/desktop/cli/bounded-map.ts +39 -0
  105. package/apps/desktop/cli/bundle-service.ts +256 -0
  106. package/apps/desktop/cli/capabilities.ts +212 -0
  107. package/apps/desktop/cli/capture-bundle.ts +1117 -0
  108. package/apps/desktop/cli/command-host-resources.ts +251 -0
  109. package/apps/desktop/cli/commands.ts +6836 -0
  110. package/apps/desktop/cli/directing-blob.ts +291 -0
  111. package/apps/desktop/cli/directing-media.ts +517 -0
  112. package/apps/desktop/cli/directing-quote.ts +89 -0
  113. package/apps/desktop/cli/directing-service.ts +288 -0
  114. package/apps/desktop/cli/emoji-assets.ts +538 -0
  115. package/apps/desktop/cli/errors.ts +29 -0
  116. package/apps/desktop/cli/face-analysis-service.ts +940 -0
  117. package/apps/desktop/cli/filter-script.ts +76 -0
  118. package/apps/desktop/cli/gateway-application-port.ts +1142 -0
  119. package/apps/desktop/cli/gateway-credential.ts +81 -0
  120. package/apps/desktop/cli/gateway-media-artifacts.ts +723 -0
  121. package/apps/desktop/cli/gateway-media-catalog.ts +922 -0
  122. package/apps/desktop/cli/gateway-media-service.ts +3106 -0
  123. package/apps/desktop/cli/gateway-media-signature.ts +122 -0
  124. package/apps/desktop/cli/gateway-provider-options.ts +562 -0
  125. package/apps/desktop/cli/gateway-scene-provider.ts +391 -0
  126. package/apps/desktop/cli/help.ts +501 -0
  127. package/apps/desktop/cli/html-overlay-gpu.ts +97 -0
  128. package/apps/desktop/cli/html-overlay-renderer.ts +2478 -0
  129. package/apps/desktop/cli/io.ts +290 -0
  130. package/apps/desktop/cli/main.ts +123 -0
  131. package/apps/desktop/cli/media-effects-service.ts +885 -0
  132. package/apps/desktop/cli/media-ingest-model.ts +364 -0
  133. package/apps/desktop/cli/media-ingest-platform.ts +227 -0
  134. package/apps/desktop/cli/media-ingest-program.ts +200 -0
  135. package/apps/desktop/cli/media-ingest.ts +30 -0
  136. package/apps/desktop/cli/music-analysis-service.ts +434 -0
  137. package/apps/desktop/cli/mutation-lock.ts +530 -0
  138. package/apps/desktop/cli/native-assets.d.ts +12 -0
  139. package/apps/desktop/cli/native-media-runtime.macos.ts +7 -0
  140. package/apps/desktop/cli/overlay-playback.ts +177 -0
  141. package/apps/desktop/cli/paths.ts +265 -0
  142. package/apps/desktop/cli/portable-surface.ts +242 -0
  143. package/apps/desktop/cli/project-camera-receipt.ts +112 -0
  144. package/apps/desktop/cli/project-face-camera.ts +394 -0
  145. package/apps/desktop/cli/project-inactivity-service.ts +552 -0
  146. package/apps/desktop/cli/project-media-integrity.ts +121 -0
  147. package/apps/desktop/cli/project-renderer.ts +1526 -0
  148. package/apps/desktop/cli/project-service.ts +519 -0
  149. package/apps/desktop/cli/project-state-transaction.ts +520 -0
  150. package/apps/desktop/cli/query-limits.ts +1 -0
  151. package/apps/desktop/cli/recording-controller.ts +1567 -0
  152. package/apps/desktop/cli/recording-daemon.ts +931 -0
  153. package/apps/desktop/cli/recording-ref.ts +56 -0
  154. package/apps/desktop/cli/renamed-environment.ts +6 -0
  155. package/apps/desktop/cli/renderer.ts +1439 -0
  156. package/apps/desktop/cli/run-cli-test-helper.ts +60 -0
  157. package/apps/desktop/cli/scene-analysis-service.ts +879 -0
  158. package/apps/desktop/cli/spatial-compositor-verifier.ts +213 -0
  159. package/apps/desktop/cli/spatial-project-service.ts +90 -0
  160. package/apps/desktop/cli/spatial-scene-service.ts +105 -0
  161. package/apps/desktop/cli/spatial-world-service.ts +39 -0
  162. package/apps/desktop/cli/speech-analysis-service.ts +682 -0
  163. package/apps/desktop/cli/studio-assemble.ts +58 -0
  164. package/apps/desktop/cli/studio-command.ts +60 -0
  165. package/apps/desktop/cli/studio-custody.ts +60 -0
  166. package/apps/desktop/cli/studio-encode.ts +216 -0
  167. package/apps/desktop/cli/studio-exr.ts +52 -0
  168. package/apps/desktop/cli/studio-files.ts +179 -0
  169. package/apps/desktop/cli/studio-output-validation.ts +162 -0
  170. package/apps/desktop/cli/studio-process.ts +145 -0
  171. package/apps/desktop/cli/studio-runtime.ts +77 -0
  172. package/apps/desktop/cli/studio-scaffold.ts +70 -0
  173. package/apps/desktop/cli/studio-service.ts +301 -0
  174. package/apps/desktop/cli/studio-spatial-asset.ts +248 -0
  175. package/apps/desktop/cli/studio-template-names.ts +3 -0
  176. package/apps/desktop/cli/studio-workflow.ts +19 -0
  177. package/apps/desktop/cli/time.ts +25 -0
  178. package/apps/desktop/cli/workflow-code.ts +584 -0
  179. package/apps/desktop/cli/workflow-runs.ts +576 -0
  180. package/apps/desktop/code/advanced.ts +139 -0
  181. package/apps/desktop/code/application-node-planner.ts +1288 -0
  182. package/apps/desktop/code/compiler.ts +329 -0
  183. package/apps/desktop/code/contracts.ts +13 -0
  184. package/apps/desktop/code/creative-recipes.ts +94 -0
  185. package/apps/desktop/code/define-workflow.ts +115 -0
  186. package/apps/desktop/code/editing.ts +284 -0
  187. package/apps/desktop/code/file-candidate-provenance.ts +420 -0
  188. package/apps/desktop/code/file-candidate.ts +69 -0
  189. package/apps/desktop/code/graph-builder.ts +10 -0
  190. package/apps/desktop/code/host-resource-policy.ts +55 -0
  191. package/apps/desktop/code/plan-contracts.ts +159 -0
  192. package/apps/desktop/code/planning.ts +361 -0
  193. package/apps/desktop/code/public.ts +134 -0
  194. package/apps/desktop/code/reference-projection.ts +62 -0
  195. package/apps/desktop/code/run-contracts.ts +466 -0
  196. package/apps/desktop/code/run-store.ts +2478 -0
  197. package/apps/desktop/code/runtime-identity.ts +328 -0
  198. package/apps/desktop/code/scheduler.ts +3067 -0
  199. package/apps/desktop/code/semantic-builder.ts +1436 -0
  200. package/apps/desktop/code/source-bundle.ts +1641 -0
  201. package/apps/desktop/code/source-typecheck.ts +211 -0
  202. package/apps/desktop/code/testing.ts +79 -0
  203. package/apps/desktop/code/worker-client.ts +1675 -0
  204. package/apps/desktop/code/worker-effects.ts +141 -0
  205. package/apps/desktop/code/worker-entry.ts +435 -0
  206. package/apps/desktop/code/worker-lease-guardian.ts +179 -0
  207. package/apps/desktop/code/worker-process-identity.ts +484 -0
  208. package/apps/desktop/code/worker-protocol.ts +211 -0
  209. package/apps/desktop/code/workflow-effects.ts +132 -0
  210. package/apps/desktop/contracts/analysis.ts +949 -0
  211. package/apps/desktop/contracts/edit.ts +576 -0
  212. package/apps/desktop/contracts/index.ts +9 -0
  213. package/apps/desktop/contracts/media-effects.ts +139 -0
  214. package/apps/desktop/contracts/project-render.ts +644 -0
  215. package/apps/desktop/contracts/project.ts +740 -0
  216. package/apps/desktop/contracts/recording.ts +1434 -0
  217. package/apps/desktop/contracts/render.ts +334 -0
  218. package/apps/desktop/contracts/runtime.ts +155 -0
  219. package/apps/desktop/contracts/spatial-compositor.ts +58 -0
  220. package/apps/desktop/contracts/spatial-project.ts +159 -0
  221. package/apps/desktop/contracts/spatial-world.ts +48 -0
  222. package/apps/desktop/contracts/video-effects.ts +120 -0
  223. package/apps/desktop/core/alignment-apply.ts +400 -0
  224. package/apps/desktop/core/audio-alignment.ts +466 -0
  225. package/apps/desktop/core/auto-zoom.ts +209 -0
  226. package/apps/desktop/core/canonical-json.ts +14 -0
  227. package/apps/desktop/core/emoji.ts +210 -0
  228. package/apps/desktop/core/events.ts +409 -0
  229. package/apps/desktop/core/face-framing.ts +533 -0
  230. package/apps/desktop/core/face-tracks.ts +326 -0
  231. package/apps/desktop/core/inactivity.ts +137 -0
  232. package/apps/desktop/core/index.ts +30 -0
  233. package/apps/desktop/core/intervals.ts +123 -0
  234. package/apps/desktop/core/montage.ts +236 -0
  235. package/apps/desktop/core/music-analysis.ts +518 -0
  236. package/apps/desktop/core/plan.ts +244 -0
  237. package/apps/desktop/core/project-auto-zoom.ts +75 -0
  238. package/apps/desktop/core/project-camera-spatial.ts +676 -0
  239. package/apps/desktop/core/project-camera.ts +403 -0
  240. package/apps/desktop/core/project-captions.ts +888 -0
  241. package/apps/desktop/core/project-inactivity.ts +125 -0
  242. package/apps/desktop/core/project-metadata.ts +927 -0
  243. package/apps/desktop/core/project-plan.ts +375 -0
  244. package/apps/desktop/core/project-render-plan.ts +303 -0
  245. package/apps/desktop/core/project-time.ts +469 -0
  246. package/apps/desktop/core/render-plan.ts +442 -0
  247. package/apps/desktop/core/scene-cache.ts +174 -0
  248. package/apps/desktop/core/scene-sampling.ts +448 -0
  249. package/apps/desktop/core/spatial-compositor.ts +22 -0
  250. package/apps/desktop/core/spatial-durability.ts +99 -0
  251. package/apps/desktop/core/spatial-project.ts +169 -0
  252. package/apps/desktop/core/spatial-shot-clock.ts +32 -0
  253. package/apps/desktop/core/speech-analysis.ts +333 -0
  254. package/apps/desktop/core/storage.ts +970 -0
  255. package/apps/desktop/core/time-map.ts +91 -0
  256. package/apps/desktop/core/time.ts +61 -0
  257. package/apps/desktop/core/video-effects.ts +660 -0
  258. package/apps/desktop/dist/cli/NebulaSans-Bold-26se8aek.otf +0 -0
  259. package/apps/desktop/dist/cli/NebulaSans-Bold-bcz7y08t.woff2 +0 -0
  260. package/apps/desktop/dist/cli/NebulaSans-Book-5ax05zvn.woff2 +0 -0
  261. package/apps/desktop/dist/cli/NebulaSans-Book-8cenzchw.otf +0 -0
  262. package/apps/desktop/dist/cli/main.js +5086 -0
  263. package/apps/desktop/html-overlay/catalog.ts +171 -0
  264. package/apps/desktop/html-overlay/contracts.ts +372 -0
  265. package/apps/desktop/html-overlay/execution-profile.ts +77 -0
  266. package/apps/desktop/html-overlay/index.ts +98 -0
  267. package/apps/desktop/html-overlay/libraries.ts +263 -0
  268. package/apps/desktop/html-overlay/random.ts +49 -0
  269. package/apps/desktop/html-overlay/runtime.ts +813 -0
  270. package/apps/desktop/html-overlay/scaffolds.ts +792 -0
  271. package/apps/desktop/html-overlay/spark-runtime.ts +88 -0
  272. package/apps/desktop/html-overlay/spatial-splat-runtime.ts +60 -0
  273. package/apps/desktop/html-overlay/spatial.ts +720 -0
  274. package/apps/desktop/studio/assets/README.md +39 -0
  275. package/apps/desktop/studio/assets/contracts.ts +129 -0
  276. package/apps/desktop/studio/assets/network.ts +64 -0
  277. package/apps/desktop/studio/assets/poly-haven.ts +148 -0
  278. package/apps/desktop/studio/drivers/blender_driver.py +466 -0
  279. package/apps/desktop/studio/drivers/cadquery_driver.py +176 -0
  280. package/apps/desktop/studio/education/driver.py +308 -0
  281. package/apps/desktop/studio/education/lesson.py +180 -0
  282. package/apps/desktop/studio/education/toolkit.py +249 -0
  283. package/apps/desktop/workflows/chaptered-demo.ts +48 -0
  284. package/apps/desktop/workflows/creative-iteration.ts +107 -0
  285. package/apps/desktop/workflows/creative-selection.ts +92 -0
  286. package/apps/desktop/workflows/fragments.ts +486 -0
  287. package/apps/desktop/workflows/index.ts +93 -0
  288. package/apps/desktop/workflows/polished-screen-demo.ts +128 -0
  289. package/apps/desktop/workflows/scene-direction.ts +12 -0
  290. package/apps/desktop/workflows/social-variants.ts +75 -0
  291. package/apps/desktop/workflows/talking-head-cleanup.ts +53 -0
  292. package/dist/NebulaSans-Bold-26se8aek.otf +0 -0
  293. package/dist/NebulaSans-Bold-bcz7y08t.woff2 +0 -0
  294. package/dist/NebulaSans-Book-5ax05zvn.woff2 +0 -0
  295. package/dist/NebulaSans-Book-8cenzchw.otf +0 -0
  296. package/dist/cli.js +479 -0
  297. package/dist/code/advanced.js +270 -0
  298. package/dist/code/index.js +2240 -0
  299. package/dist/generate.js +24 -0
  300. package/dist/host-resources.js +26 -0
  301. package/dist/index-42zsesc1.js +2257 -0
  302. package/dist/index-7308egqr.js +48 -0
  303. package/dist/index-8txs6fkn.js +712 -0
  304. package/dist/index-mcy8z0br.js +192 -0
  305. package/dist/index-p63wavx0.js +2029 -0
  306. package/dist/index-r7gdhmsp.js +424 -0
  307. package/dist/index-sh6xbav6.js +1219 -0
  308. package/dist/index-z1w83f81.js +4 -0
  309. package/dist/index-z7239b4h.js +2363 -0
  310. package/dist/index-zfeg9hmw.js +2013 -0
  311. package/dist/index.js +241 -0
  312. package/dist/operations.js +29 -0
  313. package/dist/skill-install-dh0ntqba.js +10 -0
  314. package/dist/vectorize/worker.js +142 -0
  315. package/dist/workflow.js +16 -0
  316. package/docs/README.md +38 -0
  317. package/docs/studio.md +215 -0
  318. package/examples/studio/blender/README.md +26 -0
  319. package/examples/studio/blender/character.py +152 -0
  320. package/examples/studio/blender/cloth.py +101 -0
  321. package/examples/studio/blender/color_chart.py +29 -0
  322. package/examples/studio/blender/fluid.py +78 -0
  323. package/examples/studio/blender/import_model.py +74 -0
  324. package/examples/studio/blender/product.py +53 -0
  325. package/examples/studio/blender/shaded_street.py +481 -0
  326. package/examples/studio/blender/studio_scene.py +147 -0
  327. package/examples/studio/cadquery/README.md +13 -0
  328. package/examples/studio/cadquery/bracket.py +36 -0
  329. package/examples/studio/cadquery/import_step.py +12 -0
  330. package/examples/studio/education/README.md +46 -0
  331. package/examples/studio/education/lesson.json +99 -0
  332. package/examples/studio/education/scene.py +7 -0
  333. package/examples/studio/hybrid-scene.ts +96 -0
  334. package/examples/studio/native-workflow.ts +14 -0
  335. package/examples/studio/vgpu/README.md +64 -0
  336. package/examples/studio/vgpu/heat-field.mjs +290 -0
  337. package/package.json +304 -0
  338. package/packages/scene/src/index.ts +1 -0
  339. package/packages/scene/src/scene.ts +215 -0
  340. package/schema/diagram.schema.json +334 -0
  341. package/skills/slopcamera/SKILL.md +45 -0
  342. package/skills/slopcamera/agents/openai.yaml +4 -0
  343. package/skills/slopcamera/references/customization.md +77 -0
  344. package/skills/slopcamera/references/diagrams.md +153 -0
  345. package/skills/slopcamera/references/directed-scenes.md +42 -0
  346. package/skills/slopcamera/references/directing-video.md +18 -0
  347. package/skills/slopcamera/references/educational-video.md +26 -0
  348. package/skills/slopcamera/references/gateway-media.md +134 -0
  349. package/skills/slopcamera/references/install.md +62 -0
  350. package/skills/slopcamera/references/native-studio.md +31 -0
  351. package/skills/slopcamera/references/reference-led-3d.md +140 -0
  352. package/skills/slopcamera/references/rubber-stamp-examples/poster-example-1.jpg +0 -0
  353. package/skills/slopcamera/references/rubber-stamp-examples/poster-example-2.jpg +0 -0
  354. package/skills/slopcamera/references/rubber-stamp-examples/stamp-style-1.png +0 -0
  355. package/skills/slopcamera/references/rubber-stamp-examples/stamp-style-2.png +0 -0
  356. package/skills/slopcamera/references/rubber-stamp-field-notes.md +144 -0
  357. package/skills/slopcamera/references/vectorization.md +29 -0
  358. package/skills/slopcamera/references/video-projects.md +187 -0
  359. package/skills/slopcamera/references/visual-communication.md +120 -0
  360. package/skills/slopcamera/references/workflows-sdk.md +45 -0
  361. package/skills/slopcamera/scripts/compose-rubber-stamp-field-note.ts +229 -0
  362. package/src/artifacts.ts +106 -0
  363. package/src/assets/fonts/nebula-sans/LICENSE.txt +96 -0
  364. package/src/assets/fonts/nebula-sans/NebulaSans-Bold.otf +0 -0
  365. package/src/assets/fonts/nebula-sans/NebulaSans-Bold.woff2 +0 -0
  366. package/src/assets/fonts/nebula-sans/NebulaSans-Book.otf +0 -0
  367. package/src/assets/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
  368. package/src/assets/fonts/nebula-sans/PROVENANCE.md +21 -0
  369. package/src/assets.d.ts +9 -0
  370. package/src/cli.ts +601 -0
  371. package/src/cloud-errors.ts +26 -0
  372. package/src/code/advanced.ts +10 -0
  373. package/src/code/boundary.ts +21 -0
  374. package/src/code/canonical-json.ts +129 -0
  375. package/src/code/compiler.ts +953 -0
  376. package/src/code/contracts.ts +576 -0
  377. package/src/code/define-workflow.ts +334 -0
  378. package/src/code/errors.ts +41 -0
  379. package/src/code/graph-builder.ts +945 -0
  380. package/src/code/index.ts +121 -0
  381. package/src/code/json-snapshot.ts +899 -0
  382. package/src/code/json-utf8.ts +88 -0
  383. package/src/code/portable-builder.ts +136 -0
  384. package/src/code/projection.ts +378 -0
  385. package/src/code/public-operations.ts +450 -0
  386. package/src/code/runtime.ts +580 -0
  387. package/src/code/sha256.ts +36 -0
  388. package/src/config.ts +180 -0
  389. package/src/desktop.ts +253 -0
  390. package/src/fs.ts +10 -0
  391. package/src/generate.ts +704 -0
  392. package/src/host-resource-posix.ts +161 -0
  393. package/src/host-resources.ts +1749 -0
  394. package/src/icons.ts +58 -0
  395. package/src/index.ts +200 -0
  396. package/src/label-layout.ts +130 -0
  397. package/src/layout.ts +413 -0
  398. package/src/lint.ts +127 -0
  399. package/src/mcp/boundary.ts +354 -0
  400. package/src/mcp/index.ts +33 -0
  401. package/src/mcp/server.ts +272 -0
  402. package/src/mcp/tools.ts +963 -0
  403. package/src/mcp/types.ts +71 -0
  404. package/src/operations.ts +775 -0
  405. package/src/parse.ts +861 -0
  406. package/src/process-environment.ts +17 -0
  407. package/src/render.ts +437 -0
  408. package/src/skill-install.ts +49 -0
  409. package/src/spatial-scene/authoring.ts +27 -0
  410. package/src/spatial-scene/camera-track.ts +83 -0
  411. package/src/spatial-scene/contracts.ts +277 -0
  412. package/src/spatial-scene/evaluate.ts +145 -0
  413. package/src/spatial-scene/gltf.ts +558 -0
  414. package/src/spatial-scene/identity.ts +260 -0
  415. package/src/spatial-scene/index.ts +10 -0
  416. package/src/spatial-scene/inspect.ts +68 -0
  417. package/src/spatial-scene/math.ts +280 -0
  418. package/src/spatial-scene/patch.ts +131 -0
  419. package/src/spatial-scene/time.ts +53 -0
  420. package/src/studio/contracts.ts +129 -0
  421. package/src/studio/index.ts +2 -0
  422. package/src/studio/plan.ts +156 -0
  423. package/src/studio/shared.ts +41 -0
  424. package/src/theme.ts +68 -0
  425. package/src/tldr.ts +474 -0
  426. package/src/types.ts +212 -0
  427. package/src/vectorize/archive.ts +101 -0
  428. package/src/vectorize/command.ts +797 -0
  429. package/src/vectorize/index.ts +27 -0
  430. package/src/vectorize/limits.ts +61 -0
  431. package/src/vectorize/metrics.ts +351 -0
  432. package/src/vectorize/pixels.ts +323 -0
  433. package/src/vectorize/supervisor.ts +339 -0
  434. package/src/vectorize/svg.ts +188 -0
  435. package/src/vectorize/tool.ts +542 -0
  436. package/src/vectorize/types.ts +113 -0
  437. package/src/vectorize/vectorize.ts +634 -0
  438. package/src/vectorize/worker-protocol.ts +40 -0
  439. package/src/vectorize/worker.ts +209 -0
  440. package/src/version.ts +1 -0
  441. package/src/workflow.ts +409 -0
@@ -0,0 +1,44 @@
1
+ import { Readable } from "node:stream";
2
+ import { finished } from "node:stream/promises";
3
+ import { createGunzip } from "node:zlib";
4
+
5
+ import { SpatialSpzFactsSchema, SPATIAL_SPLAT_LIMITS, spatialSpzAllocationBounds, type SpatialSpzFacts } from "../contracts/spatial-world";
6
+
7
+ /** Inspect the complete gzip stream without allocating its advertised output. No decoder/browser runs before admission. */
8
+ export async function inspectSpatialSpz(input: Uint8Array, signal: AbortSignal): Promise<SpatialSpzFacts> {
9
+ if (!(input instanceof Uint8Array) || input.byteLength < 18 || input.byteLength > SPATIAL_SPLAT_LIMITS.sourceBytes || input[0] !== 0x1f || input[1] !== 0x8b) throw new RangeError("The qualified splat profile requires bounded gzip SPZ v2/v3 bytes.");
10
+ signal.throwIfAborted();
11
+ const gunzip = createGunzip({ chunkSize: 16 * 1024 });
12
+ const source = Readable.from([input]);
13
+ const abort = () => gunzip.destroy(signal.reason instanceof Error ? signal.reason : new Error("SPZ admission cancelled."));
14
+ signal.addEventListener("abort", abort, { once: true });
15
+ source.pipe(gunzip);
16
+ const header = new Uint8Array(16);
17
+ let count = 0, facts: SpatialSpzFacts | undefined;
18
+ try {
19
+ for await (const chunkInput of gunzip) {
20
+ signal.throwIfAborted();
21
+ const chunk = chunkInput as Buffer;
22
+ if (count < 16) header.set(chunk.subarray(0, Math.min(16 - count, chunk.byteLength)), count);
23
+ count += chunk.byteLength;
24
+ if (count > SPATIAL_SPLAT_LIMITS.decompressedBytes) throw new RangeError("SPZ decompression exceeds its byte budget.");
25
+ if (facts === undefined && count >= 16) {
26
+ const view = new DataView(header.buffer);
27
+ const version = view.getUint32(4, true), splats = view.getUint32(8, true), shDegree = header[12]!, fractionalBits = header[13]!, flags = header[14]!;
28
+ if (view.getUint32(0, true) !== 0x5053474e || (version !== 2 && version !== 3) || flags > 1 || header[15] !== 0) throw new RangeError("SPZ requires v2/v3 without LoD, extensions, or reserved flags.");
29
+ if (flags === 1) throw new RangeError("Antialiased-training SPZ is not supported by the initial qualified Spark profile.");
30
+ const decompressedBytes = 16 + splats * (9 + 1 + 3 + 3 + (version === 3 ? 4 : 3) + 3 * ((shDegree + 1) ** 2 - 1));
31
+ facts = SpatialSpzFactsSchema.parse({ kind: "slopcamera.spz-admission", schemaVersion: 1, version, splats, shDegree, fractionalBits, antialiased: flags === 1, decompressedBytes, ...spatialSpzAllocationBounds(splats, input.byteLength, decompressedBytes) });
32
+ }
33
+ if (facts !== undefined && count > facts.decompressedBytes) throw new RangeError("SPZ body exceeds the exact admitted attribute layout.");
34
+ }
35
+ if (facts === undefined || count !== facts.decompressedBytes) throw new RangeError("SPZ attribute body is truncated or does not match its header.");
36
+ signal.throwIfAborted();
37
+ return Object.freeze(facts);
38
+ } finally {
39
+ signal.removeEventListener("abort", abort);
40
+ const settled = [finished(source, { cleanup: true }), finished(gunzip, { cleanup: true })];
41
+ source.destroy(); gunzip.destroy();
42
+ await Promise.allSettled(settled);
43
+ }
44
+ }
@@ -0,0 +1,135 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { lstat, mkdtemp, open, realpath, rm, writeFile } from "node:fs/promises";
4
+ import { isAbsolute, join, relative } from "node:path";
5
+
6
+ import { parseSpatialGlb } from "../../../src/spatial-scene/gltf";
7
+ import { createBoundedJsonSnapshot } from "../../../src/code/json-snapshot";
8
+ import { SpatialAssetManifestSchema, SpatialEntitySchema } from "../../../src/spatial-scene/contracts";
9
+ import { canonicalJson, canonicalJsonSha256 } from "../core/canonical-json";
10
+ import { createNodeSpatialDurability } from "../core/spatial-durability";
11
+ import { createNodeBundleFileSystem } from "../core/storage";
12
+ import { SavedSpatialWorldImportInputSchema, SavedSpatialWorldImportOutputSchema, SpatialWorldImportManifestSchema, SPATIAL_SPLAT_LIMITS, type SavedSpatialWorldImportOutput } from "../contracts/spatial-world";
13
+ import { inspectSpatialSpz } from "./spatial-spz";
14
+ import { WorldLabsProvenanceSchema } from "./spatial-world-provenance";
15
+
16
+ export { SavedSpatialWorldImportInputSchema } from "../contracts/spatial-world";
17
+ export type { SavedSpatialWorldImportInput, SavedSpatialWorldImportOutput, SpatialWorldImportManifest } from "../contracts/spatial-world";
18
+ type Artifact = { readonly path: string; readonly bytes: number; readonly sha256: string };
19
+
20
+ async function physicalRoot(path: string): Promise<string> {
21
+ if (!isAbsolute(path) || await realpath(path) !== path || !(await lstat(path)).isDirectory()) throw new RangeError("Saved world roots must be absolute physical directories without symlinks.");
22
+ return path;
23
+ }
24
+ async function readExact(root: string, artifact: Artifact, signal: AbortSignal): Promise<Uint8Array> {
25
+ signal.throwIfAborted();
26
+ const fs = createNodeBundleFileSystem(root);
27
+ const actual = await fs.inspectFile!(artifact.path, artifact.bytes);
28
+ if (actual.bytes !== artifact.bytes || actual.sha256 !== artifact.sha256) throw new RangeError("Saved world source differs from its exact artifact reference.");
29
+ const target = join(root, artifact.path);
30
+ const handle = await open(target, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
31
+ try {
32
+ const before = await handle.stat();
33
+ if (!before.isFile() || before.size !== artifact.bytes || await realpath(target) !== target) throw new RangeError("Saved world source changed during admission.");
34
+ const bytes = new Uint8Array(artifact.bytes);
35
+ let offset = 0;
36
+ while (offset < bytes.length) {
37
+ signal.throwIfAborted();
38
+ const read = await handle.read(bytes, offset, Math.min(64 * 1024, bytes.length - offset), offset);
39
+ if (read.bytesRead === 0) throw new RangeError("Saved world source was truncated.");
40
+ offset += read.bytesRead;
41
+ }
42
+ const after = await handle.stat(), pathAfter = await lstat(target);
43
+ if (before.dev !== after.dev || before.ino !== after.ino || before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs || before.mode !== after.mode
44
+ || after.dev !== pathAfter.dev || after.ino !== pathAfter.ino || await realpath(target) !== target || createHash("sha256").update(bytes).digest("hex") !== artifact.sha256) throw new RangeError("Saved world source changed while captured.");
45
+ signal.throwIfAborted();
46
+ return bytes;
47
+ } finally { await handle.close(); }
48
+ }
49
+
50
+ /** Retained evidence survives cancellation and publication/cleanup uncertainty; no caller should replay a provider request because import failed. */
51
+ export class SpatialWorldImportError extends Error {
52
+ readonly published: readonly Artifact[];
53
+ readonly attempted: readonly Artifact[];
54
+ constructor(cause: unknown, published: readonly Artifact[], attempted: readonly Artifact[] = published) { super("Saved world import did not complete; retain its exact source and publication evidence.", { cause }); this.name = "SpatialWorldImportError"; this.published = Object.freeze([...published]); this.attempted = Object.freeze([...attempted]); }
55
+ }
56
+
57
+ export async function importSavedSpatialWorld(options: {
58
+ readonly sourceRoot: string; readonly destinationRoot: string; readonly input: unknown; readonly signal: AbortSignal; readonly beforePublication?: () => Promise<void>;
59
+ }): Promise<SavedSpatialWorldImportOutput> {
60
+ const input = SavedSpatialWorldImportInputSchema.parse(options.input);
61
+ if (input.provenance.receipt !== undefined && input.provenance.receipt.bytes > SPATIAL_SPLAT_LIMITS.metadataBytes) throw new RangeError("World provenance receipt exceeds one MiB.");
62
+ const sourceClosureBytes = input.splat.bytes + (input.collider?.bytes ?? 0) + (input.provenance.receipt?.bytes ?? 0);
63
+ // Reserve the bounded import manifest as part of the returned asset closure
64
+ // before reading/copying any payload, so a successful import is renderable
65
+ // under the same 256 MiB source-asset ceiling.
66
+ if (sourceClosureBytes + SPATIAL_SPLAT_LIMITS.metadataBytes > 256 * 1024 * 1024) throw new RangeError("World source closure including its retained manifest exceeds 256 MiB.");
67
+ options.signal.throwIfAborted();
68
+ const sourceRoot = await physicalRoot(options.sourceRoot), destinationRoot = await physicalRoot(options.destinationRoot);
69
+ const splatBytes = await readExact(sourceRoot, input.splat, options.signal);
70
+ const facts = await inspectSpatialSpz(splatBytes, options.signal);
71
+ const colliderBytes = input.collider === undefined ? undefined : await readExact(sourceRoot, input.collider, options.signal);
72
+ if (colliderBytes !== undefined) parseSpatialGlb(colliderBytes);
73
+ const providerBytes = input.provenance.receipt === undefined ? undefined : await readExact(sourceRoot, input.provenance.receipt, options.signal);
74
+ if (providerBytes !== undefined) {
75
+ const captured = createBoundedJsonSnapshot(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(providerBytes)), 256 * 1024, "World provider provenance", { maximumDepth: 24, maximumValues: 32_768 });
76
+ const value = WorldLabsProvenanceSchema.parse(captured.value);
77
+ const matches = (actual: Artifact, expected: Artifact) => actual.bytes === expected.bytes && actual.sha256 === expected.sha256;
78
+ if (!matches(value.assets.splat, input.splat) || input.collider === undefined || !matches(value.assets.collider, input.collider)
79
+ || (input.provenance.worldId !== undefined && value.world.worldId !== input.provenance.worldId)) throw new RangeError("World provider provenance does not match the retained world and exact SPZ/collider bytes.");
80
+ }
81
+ const fs = createNodeBundleFileSystem(destinationRoot), durability = createNodeSpatialDurability(destinationRoot);
82
+ const published: Artifact[] = [];
83
+ const attempted: Artifact[] = [];
84
+ const fence = async () => { options.signal.throwIfAborted(); await options.beforePublication?.(); options.signal.throwIfAborted(); };
85
+ await fence();
86
+ const workspace = await mkdtemp(join(destinationRoot, ".slopcamera-world-import-"));
87
+ let result: SavedSpatialWorldImportOutput | undefined, failure: { error: unknown } | undefined;
88
+ const publishBytes = async (bytes: Uint8Array, extension: "spz" | "glb" | "json"): Promise<Artifact> => {
89
+ const sha256 = createHash("sha256").update(bytes).digest("hex"), artifact = { path: `spatial/worlds/assets/${sha256}.${extension}`, sha256, bytes: bytes.byteLength };
90
+ const staged = join(workspace, `${sha256}.${extension}`);
91
+ await writeFile(staged, bytes, { flag: "wx", mode: 0o600 });
92
+ attempted.push(artifact);
93
+ await fs.copyFileNoReplace!(relative(destinationRoot, staged), artifact.path, artifact, fence);
94
+ published.push(artifact);
95
+ await durability.syncExactFile(artifact.path, artifact);
96
+ return artifact;
97
+ };
98
+ try {
99
+ const splat = await publishBytes(splatBytes, "spz"), collider = colliderBytes === undefined ? undefined : await publishBytes(colliderBytes, "glb");
100
+ const receipt = providerBytes === undefined ? undefined : await publishBytes(providerBytes, "json");
101
+ const manifest = SpatialWorldImportManifestSchema.parse({ kind: "slopcamera.spatial-world-import", schemaVersion: 1,
102
+ splat: { payload: splat, facts }, collider: collider === undefined ? null : { payload: collider, role: "approximate-collider", validation: "bounded-glb-structure-only" },
103
+ identities: input.identities, normalization: input.normalization,
104
+ provenance: { ...input.provenance, ...(receipt === undefined ? {} : { receipt }) },
105
+ capabilities: { beauty: true, semanticIds: "authored-wrapper-only", depth: "unsupported", objectId: "unsupported", physics: collider === undefined ? "unavailable" : "unvalidated" },
106
+ });
107
+ const text = `${canonicalJson(manifest)}\n`, sha256 = createHash("sha256").update(text).digest("hex");
108
+ const manifestArtifact = { path: `spatial/worlds/receipts/${sha256}.json`, sha256, bytes: Buffer.byteLength(text) };
109
+ if (manifestArtifact.bytes > SPATIAL_SPLAT_LIMITS.metadataBytes || sourceClosureBytes + manifestArtifact.bytes > 256 * 1024 * 1024) throw new RangeError("World import manifest exceeds its reserved complete-closure budget.");
110
+ attempted.push(manifestArtifact);
111
+ await fs.writeTextNoReplace!(manifestArtifact.path, text, fence);
112
+ published.push(manifestArtifact);
113
+ await durability.syncExactFile(manifestArtifact.path, manifestArtifact);
114
+ const provenance = { source: input.provenance.kind === "saved" ? "imported" : "generated", description: input.provenance.description, receiptSha256: manifestArtifact.sha256 };
115
+ const interpretation = { metersPerUnit: input.normalization.metersPerUnit, sourceUp: input.normalization.sourceUp };
116
+ const manifestAssetId = `asset_world_manifest_${manifestArtifact.sha256}`;
117
+ const receiptAssetId = receipt === undefined ? undefined : `asset_world_provider_${receipt.sha256}`;
118
+ const assets = [
119
+ ...(collider === undefined ? [] : [SpatialAssetManifestSchema.parse({ assetId: input.identities.colliderAssetId, payload: collider, interpretation: { kind: "gltf", format: "glb", ...interpretation }, dependencies: [], provenance })]),
120
+ SpatialAssetManifestSchema.parse({ assetId: manifestAssetId, payload: manifestArtifact, interpretation: { kind: "metadata", format: "json", schema: "slopcamera.spatial-world-import" }, dependencies: receiptAssetId === undefined ? [] : [receiptAssetId], provenance }),
121
+ ...(receipt === undefined ? [] : [SpatialAssetManifestSchema.parse({ assetId: receiptAssetId, payload: receipt, interpretation: { kind: "metadata", format: "json", schema: "slopcamera.world-labs-provenance" }, dependencies: [], provenance })]),
122
+ SpatialAssetManifestSchema.parse({ assetId: input.identities.assetId, payload: splat, interpretation: { kind: "splat", format: "spz", ...interpretation }, dependencies: [...(input.identities.colliderAssetId === undefined ? [] : [input.identities.colliderAssetId]), manifestAssetId], provenance }),
123
+ ];
124
+ if (new Set(assets.map(asset => asset.assetId)).size !== assets.length) throw new RangeError("World metadata asset IDs conflict with requested identities.");
125
+ const entity = SpatialEntitySchema.parse({ kind: "splat", entityId: input.identities.entityId, name: input.identities.name, parentId: null, assetId: input.identities.assetId, transform: input.normalization.transform, placement: { kind: "world" }, origin: { kind: "authored" }, visible: true });
126
+ result = SavedSpatialWorldImportOutputSchema.parse({ manifest, manifestArtifact, assets, entity, manifestSha256: canonicalJsonSha256(manifest) });
127
+ } catch (error) { failure = { error }; }
128
+ finally {
129
+ try { await rm(workspace, { recursive: true, force: true }); }
130
+ catch (error) { failure = { error: failure === undefined ? error : new AggregateError([failure.error, error], "Saved world import and workspace cleanup failed.") }; }
131
+ }
132
+ if (failure !== undefined) throw new SpatialWorldImportError(failure.error, published, attempted);
133
+ if (result === undefined) throw new SpatialWorldImportError(new Error("Saved world import did not settle."), published, attempted);
134
+ return result;
135
+ }
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+
3
+ import { canonicalJsonSha256 } from "../core/canonical-json";
4
+ import { RepositoryRelativePathSchema, Sha256Schema } from "../contracts/recording";
5
+
6
+ // Frozen receipt compatibility for locally retained worlds. These literals
7
+ // describe historical receipts; they do not authorize requests or quote prices.
8
+ const worldLabsId = z.string().min(1).max(128).regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/u);
9
+ const text = (maximum: number) => z.string().min(1).max(maximum).refine(value =>
10
+ value.trim().length > 0 && !/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/u.test(value));
11
+ const request = z.strictObject({
12
+ display_name: text(64), model: z.literal("marble-1.1"),
13
+ permission: z.strictObject({ public: z.literal(false) }),
14
+ world_prompt: z.strictObject({ text_prompt: text(8_000), type: z.literal("text") }),
15
+ });
16
+ const artifact = z.strictObject({
17
+ path: RepositoryRelativePathSchema,
18
+ bytes: z.number().int().safe().positive().max(128 * 1024 * 1024),
19
+ sha256: Sha256Schema,
20
+ });
21
+ const world = z.strictObject({
22
+ worldId: worldLabsId, model: z.literal("marble-1.1"), displayName: text(256),
23
+ semanticsMetadata: z.strictObject({
24
+ groundPlaneOffset: z.number().finite().min(-1_000_000).max(1_000_000).nullable(),
25
+ metricScaleFactor: z.number().finite().positive().max(1_000_000).nullable(),
26
+ }),
27
+ });
28
+
29
+ /** Validate retained evidence without a provider client, credential, or request. */
30
+ export const WorldLabsProvenanceSchema = z.strictObject({
31
+ kind: z.literal("slopcamera.world-labs-provenance"), schemaVersion: z.literal(1),
32
+ attemptId: worldLabsId, operationId: worldLabsId,
33
+ operationBinding: z.enum(["dispatch", "operator-recovery"]),
34
+ request, requestSha256: Sha256Schema, responseSha256: Sha256Schema,
35
+ worldResponseSha256: Sha256Schema.optional(),
36
+ reservedCredits: z.literal(1_580),
37
+ settledCredits: z.number().int().safe().nonnegative().nullable(),
38
+ world, quality: z.enum(["100k", "500k"]),
39
+ assets: z.strictObject({
40
+ splat: artifact.extend({ sourceUrlSha256: Sha256Schema }),
41
+ collider: artifact.extend({ sourceUrlSha256: Sha256Schema }),
42
+ }),
43
+ reproducibility: z.literal("retained-assets-only"), normalization: z.literal("caller-must-declare-and-verify"),
44
+ assetValidation: z.literal("retained-bytes-unvalidated"), clientGenerationAttempts: z.literal(1),
45
+ capabilityLosses: z.tuple([z.literal("static-radiance-field"), z.literal("no-object-semantics"), z.literal("no-material-editability"), z.literal("collider-is-approximate")]),
46
+ }).refine(value => canonicalJsonSha256(value.request) === value.requestSha256, "World Labs request digest does not match the retained request.");
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+
3
+ import { createBoundedJsonValueSnapshot } from "../../../src/code/json-snapshot";
4
+ import { StudioJobSchema, StudioOutputFormatSchema, StudioOutputRoleSchema, StudioPlanSchema, StudioReceiptSchema, STUDIO_LIMITS, type StudioJob, type StudioPlan } from "../../../src/studio";
5
+ import { MediaArtifactReferenceSchema, MediaArtifactRequestSchema } from "./operations/media/shared";
6
+
7
+ const capture = (value: unknown) => value === undefined ? undefined : createBoundedJsonValueSnapshot(value, 64 * 1024 * 1024, "studio host document", { maximumDepth: 48, maximumValues: 1_000_000 }).value;
8
+ const request = z.strictObject({
9
+ /** Must name a retained studioRoot/bundles/<bundleSha256>/bundle.json. */
10
+ bundle: MediaArtifactRequestSchema,
11
+ job: StudioJobSchema,
12
+ plan: StudioPlanSchema.optional(),
13
+ });
14
+ export const StudioRunInputSchema = z.preprocess(capture, request);
15
+ export const BoundStudioRunInputSchema = z.preprocess(capture, request.extend({ bundle: MediaArtifactReferenceSchema, plan: StudioPlanSchema }));
16
+ export const StudioRunOutputSchema = z.preprocess(capture, z.strictObject({
17
+ receipt: MediaArtifactReferenceSchema,
18
+ document: StudioReceiptSchema,
19
+ outputs: z.array(z.strictObject({ artifact: MediaArtifactReferenceSchema, outputId: z.string().min(1).max(128), role: StudioOutputRoleSchema, format: StudioOutputFormatSchema })).max(STUDIO_LIMITS.outputFiles),
20
+ }));
21
+ export interface StudioRunInput { readonly bundle: z.infer<typeof MediaArtifactRequestSchema>; readonly job: StudioJob; readonly plan?: StudioPlan | undefined; }
22
+ export interface BoundStudioRunInput { readonly bundle: z.infer<typeof MediaArtifactReferenceSchema>; readonly job: StudioJob; readonly plan: StudioPlan; }
23
+ export type StudioRunOutput = z.infer<typeof StudioRunOutputSchema>;
24
+
25
+ export interface StudioAuthorizationRequest {
26
+ readonly planSha256: string;
27
+ readonly bundleSha256: string;
28
+ readonly jobId: string;
29
+ }
30
+ /** Explicit host envelope. Generic workflow approval never grants this permission. */
31
+ export interface ApplicationStudioAuthorization {
32
+ authorize(request: StudioAuthorizationRequest): Promise<boolean>;
33
+ }
34
+ export interface StudioBindingControl {
35
+ readonly inheritedFileDescriptors: readonly number[];
36
+ beforePublication(): Promise<void>;
37
+ }
38
+ export interface StudioHostControl extends StudioBindingControl {
39
+ readonly signal: AbortSignal;
40
+ readonly workspaceDirectory: string;
41
+ /** Exact physical lease descriptors inherited by every native descendant. */
42
+ readonly inheritedFileDescriptors: readonly number[];
43
+ readonly identity: { readonly runId: string; readonly nodeKey: string; readonly nodePlanSha256: string };
44
+ beforePublication(): Promise<void>;
45
+ }
46
+ export type StudioReconciliation =
47
+ | { readonly kind: "completed"; readonly output: StudioRunOutput }
48
+ | { readonly kind: "ambiguous" | "incompatible"; readonly message: string };
49
+
50
+ /** Fixed engine dispatch and runtime paths belong to this host-constructed adapter. */
51
+ export interface ApplicationStudioPort {
52
+ /** Reads only the retained manifest's explicit source/ closure and probes a fixed owned runtime. Never executes authored code. */
53
+ bind(input: StudioRunInput, signal: AbortSignal, control?: StudioBindingControl): Promise<BoundStudioRunInput>;
54
+ /** Revalidates bound source/runtime, keeps native custody until settled, and fences every publication. */
55
+ execute(input: BoundStudioRunInput, control: StudioHostControl & { readonly allowTrustedCode: true }): Promise<StudioRunOutput>;
56
+ /** Verifies exact retained receipts. Missing/uncertain state never authorizes another execution. */
57
+ reconcile(input: BoundStudioRunInput, control: StudioHostControl): Promise<StudioReconciliation>;
58
+ }