@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,159 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ SpatialDigestSchema,
5
+ SpatialSceneV1Schema,
6
+ SpatialShotIdSchema,
7
+ SpatialShotV1Schema,
8
+ } from "../../../src/spatial-scene/contracts";
9
+ import { RepositoryRelativePathSchema } from "./recording";
10
+ import { ProjectEditPlanV1Schema, VideoProjectIdSchema, VideoProjectV1Schema } from "./project";
11
+
12
+ export const SPATIAL_PROJECT_LIMITS = Object.freeze({
13
+ documentBytes: 32 * 1024 * 1024,
14
+ totalSceneBytes: 128 * 1024 * 1024,
15
+ scenes: 128,
16
+ shots: 1_024,
17
+ candidates: 1_024,
18
+ payloadBytes: 256 * 1024 * 1024,
19
+ });
20
+ export const SpatialTransactionIdSchema = z.string().regex(/^transaction_[a-f0-9]{32}$/u);
21
+ export const SpatialProjectBasisSchema = z.strictObject({
22
+ version: z.union([z.literal(1), z.literal(2)]),
23
+ sha256: SpatialDigestSchema,
24
+ });
25
+ export const SpatialProjectArtifactSchema = z.strictObject({
26
+ path: z.string().regex(/^spatial\/(?:scenes|revisions|attempts|receipts)\/[a-f0-9]{64}\.json$/u),
27
+ sha256: SpatialDigestSchema,
28
+ bytes: z.number().int().positive().max(SPATIAL_PROJECT_LIMITS.documentBytes),
29
+ }).superRefine((artifact, context) => {
30
+ if (!artifact.path.endsWith(`/${artifact.sha256}.json`)) {
31
+ context.addIssue({ code: "custom", message: "Artifact path must name its exact byte digest." });
32
+ }
33
+ });
34
+ export const SpatialSceneReferenceSchema = z.strictObject({
35
+ sceneSha256: SpatialDigestSchema,
36
+ artifact: SpatialProjectArtifactSchema.refine(value => value.path.startsWith("spatial/scenes/")),
37
+ });
38
+ /** These are frozen V1 values. Migration never rewrites their identity or hash domain. */
39
+ export const SpatialProjectLegacySchema = z.strictObject({
40
+ project: VideoProjectV1Schema,
41
+ projectEditPlan: ProjectEditPlanV1Schema,
42
+ });
43
+ export const SpatialCandidateIdSchema = z.string().regex(/^candidate_[a-zA-Z0-9_-]{1,128}$/u);
44
+ export const SpatialCandidateSchema = z.strictObject({
45
+ candidateId: SpatialCandidateIdSchema,
46
+ derivation: z.strictObject({
47
+ shotId: SpatialShotIdSchema,
48
+ shotSha256: SpatialDigestSchema,
49
+ sceneSha256: SpatialDigestSchema,
50
+ recipeSha256: SpatialDigestSchema,
51
+ }),
52
+ outputs: z.array(z.strictObject({
53
+ path: RepositoryRelativePathSchema.refine(path => /^spatial\/outputs\/[a-f0-9]{64}\.[a-z0-9]{1,8}$/u.test(path), "Candidate outputs must be content-addressed spatial artifacts."),
54
+ sha256: SpatialDigestSchema,
55
+ bytes: z.number().int().positive().max(SPATIAL_PROJECT_LIMITS.payloadBytes),
56
+ }).superRefine((output, context) => {
57
+ if (!output.path.startsWith(`spatial/outputs/${output.sha256}.`)) context.addIssue({ code: "custom", message: "Candidate path must name its payload digest." });
58
+ })).min(1).max(16),
59
+ });
60
+ export const SpatialCandidateSelectionSchema = z.strictObject({
61
+ shotId: SpatialShotIdSchema,
62
+ candidateId: SpatialCandidateIdSchema,
63
+ });
64
+ export const SpatialProjectRevisionV2Schema = z.strictObject({
65
+ kind: z.literal("slopcamera.spatial-project-revision"),
66
+ schemaVersion: z.literal(2),
67
+ projectId: VideoProjectIdSchema,
68
+ parent: SpatialProjectBasisSchema,
69
+ transactionId: SpatialTransactionIdSchema,
70
+ legacy: SpatialProjectLegacySchema,
71
+ scenes: z.array(SpatialSceneReferenceSchema).max(SPATIAL_PROJECT_LIMITS.scenes),
72
+ shots: z.array(SpatialShotV1Schema).max(SPATIAL_PROJECT_LIMITS.shots),
73
+ candidates: z.array(SpatialCandidateSchema).max(SPATIAL_PROJECT_LIMITS.candidates),
74
+ selections: z.array(SpatialCandidateSelectionSchema).max(SPATIAL_PROJECT_LIMITS.shots),
75
+ }).superRefine((revision, context) => {
76
+ if (revision.projectId !== revision.legacy.project.projectId
77
+ || revision.projectId !== revision.legacy.projectEditPlan.projectId) {
78
+ context.addIssue({ code: "custom", message: "Frozen media and spatial project identities must match." });
79
+ }
80
+ for (const ids of [revision.scenes.map(value => value.sceneSha256), revision.shots.map(value => value.shotId),
81
+ revision.candidates.map(value => value.candidateId), revision.selections.map(value => value.shotId)]) {
82
+ if (new Set(ids).size !== ids.length) context.addIssue({ code: "custom", message: "Duplicate project identity." });
83
+ }
84
+ if (revision.scenes.reduce((total, scene) => total + scene.artifact.bytes, 0) > SPATIAL_PROJECT_LIMITS.totalSceneBytes) {
85
+ context.addIssue({ code: "custom", message: "Project scene byte budget exceeded." });
86
+ }
87
+ for (const shot of revision.shots) {
88
+ if (!revision.scenes.some(scene => scene.sceneSha256 === shot.sceneSha256)) context.addIssue({ code: "custom", message: "Shot references an absent scene." });
89
+ if (shot.range.endUs > revision.legacy.project.timeline.durationUs) context.addIssue({ code: "custom", message: "Shot exceeds the project clock." });
90
+ }
91
+ for (const candidate of revision.candidates) {
92
+ if (!revision.scenes.some(scene => scene.sceneSha256 === candidate.derivation.sceneSha256)
93
+ || !revision.shots.some(shot => shot.shotId === candidate.derivation.shotId)) {
94
+ context.addIssue({ code: "custom", message: "Candidate derivation is not retained in this project." });
95
+ }
96
+ }
97
+ for (const selection of revision.selections) {
98
+ if (!revision.shots.some(shot => shot.shotId === selection.shotId)
99
+ || !revision.candidates.some(candidate => candidate.candidateId === selection.candidateId
100
+ && candidate.derivation.shotId === selection.shotId)) {
101
+ context.addIssue({ code: "custom", message: "Selection must bind a candidate for its exact shot." });
102
+ }
103
+ }
104
+ });
105
+ export const SpatialProjectHeadV2Schema = z.strictObject({
106
+ kind: z.literal("slopcamera.spatial-project-head"),
107
+ schemaVersion: z.literal(2),
108
+ projectId: VideoProjectIdSchema,
109
+ projectRevisionSha256: SpatialDigestSchema,
110
+ revision: SpatialProjectArtifactSchema.refine(value => value.path.startsWith("spatial/revisions/")),
111
+ transactionId: SpatialTransactionIdSchema,
112
+ });
113
+ export const SpatialProjectAttemptV1Schema = z.strictObject({
114
+ kind: z.literal("slopcamera.spatial-project-attempt"),
115
+ schemaVersion: z.literal(1),
116
+ beforeHeadSha256: SpatialDigestSchema,
117
+ expected: SpatialProjectBasisSchema,
118
+ after: SpatialProjectHeadV2Schema,
119
+ });
120
+ export const SpatialProjectSettlementV1Schema = z.strictObject({
121
+ kind: z.literal("slopcamera.spatial-project-settlement"),
122
+ schemaVersion: z.literal(1),
123
+ attempt: SpatialProjectArtifactSchema.refine(value => value.path.startsWith("spatial/attempts/")),
124
+ headSha256: SpatialDigestSchema,
125
+ });
126
+ export const SpatialProjectSceneSourceSchema = z.strictObject({
127
+ sceneSha256: SpatialDigestSchema,
128
+ document: SpatialSceneV1Schema,
129
+ });
130
+ export const SpatialShotRetargetSchema = z.discriminatedUnion("kind", [
131
+ z.strictObject({ kind: z.literal("all") }),
132
+ z.strictObject({ kind: z.literal("shots"), shotIds: z.array(SpatialShotIdSchema).min(1).max(SPATIAL_PROJECT_LIMITS.shots) }),
133
+ ]);
134
+ export const SpatialProjectSceneDiffSchema = z.strictObject({
135
+ beforeSceneSha256: z.string().regex(/^[a-f0-9]{64}$/u),
136
+ afterSceneSha256: z.string().regex(/^[a-f0-9]{64}$/u),
137
+ affectedShotIds: z.array(SpatialShotIdSchema).max(SPATIAL_PROJECT_LIMITS.shots),
138
+ untouchedShotIds: z.array(SpatialShotIdSchema).max(SPATIAL_PROJECT_LIMITS.shots),
139
+ selectedCandidates: z.array(SpatialCandidateSelectionSchema.extend({ status: z.enum(["current", "stale"]) })).max(SPATIAL_PROJECT_LIMITS.shots),
140
+ });
141
+ /** Publication evidence is shared with run receipts and browser consumers. */
142
+ export const SpatialProjectMutationOutputSchema = z.discriminatedUnion("kind", [
143
+ z.strictObject({ projectId: VideoProjectIdSchema, kind: z.literal("completed"), attempt: SpatialProjectArtifactSchema, settlement: SpatialProjectArtifactSchema.refine(value => value.path.startsWith("spatial/receipts/")), projectRevisionSha256: z.string().regex(/^[a-f0-9]{64}$/u), currentHeadMatches: z.boolean(), diff: SpatialProjectSceneDiffSchema.optional() }),
144
+ z.strictObject({ projectId: VideoProjectIdSchema, kind: z.literal("conflict"), message: z.string().max(65_536), attempt: SpatialProjectArtifactSchema.optional() }),
145
+ z.strictObject({ projectId: VideoProjectIdSchema, kind: z.literal("precommit"), message: z.string().max(65_536), attempt: SpatialProjectArtifactSchema.optional() }),
146
+ z.strictObject({ projectId: VideoProjectIdSchema, kind: z.literal("ambiguous"), message: z.string().max(65_536), attempt: SpatialProjectArtifactSchema }),
147
+ ]);
148
+
149
+ type SpatialReadonly<T> = T extends string | number | boolean | null | undefined | bigint | symbol
150
+ ? T : T extends object ? { readonly [Key in keyof T]: SpatialReadonly<T[Key]> } : T;
151
+ export type SpatialProjectArtifact = SpatialReadonly<z.infer<typeof SpatialProjectArtifactSchema>>;
152
+ export type SpatialProjectBasis = SpatialReadonly<z.infer<typeof SpatialProjectBasisSchema>>;
153
+ export type SpatialProjectHeadV2 = SpatialReadonly<z.infer<typeof SpatialProjectHeadV2Schema>>;
154
+ export type SpatialProjectRevisionV2 = SpatialReadonly<z.infer<typeof SpatialProjectRevisionV2Schema>>;
155
+ export type SpatialProjectLegacy = SpatialReadonly<z.infer<typeof SpatialProjectLegacySchema>>;
156
+ export type SpatialProjectSceneSource = SpatialReadonly<z.infer<typeof SpatialProjectSceneSourceSchema>>;
157
+ export type SpatialCandidate = SpatialReadonly<z.infer<typeof SpatialCandidateSchema>>;
158
+ export type SpatialShotRetarget = SpatialReadonly<z.infer<typeof SpatialShotRetargetSchema>>;
159
+ export type SpatialProjectMutationOutput = z.infer<typeof SpatialProjectMutationOutputSchema>;
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+
3
+ import { createBoundedJsonSnapshot } from "../../../src/code/json-snapshot";
4
+ import { SpatialAssetIdSchema, SpatialAssetManifestSchema, SpatialDigestSchema, SpatialEntityIdSchema, SpatialEntitySchema, SpatialPayloadSchema, SpatialTransformSchema } from "../../../src/spatial-scene/contracts";
5
+
6
+ export const SPATIAL_SPLAT_LIMITS = Object.freeze({ splats: 500_000, sourceBytes: 128 * 1024 * 1024, decompressedBytes: 64 * 1024 * 1024, gpuBytes: 256 * 1024 * 1024, hostBytes: 768 * 1024 * 1024, metadataBytes: 1024 * 1024 });
7
+ export function spatialSpzAllocationBounds(splats: number, sourceBytes: number, decompressedBytes: number) {
8
+ // Spark 2.1.0 utils.getTextureSize rounds rows to 2048; use a larger 65536 block.
9
+ // Ext source+SH: 32+64 B/splat; three accumulator MRT sets: 3*(16+16+4);
10
+ // ordering/readback buffers fit the remaining 52 B/splat. Browser/driver overhead
11
+ // is not a claim of resident process memory. LoD/paging/raycast are disabled.
12
+ const rounded = Math.ceil(splats / 65_536) * 65_536;
13
+ return { gpuBytesBound: rounded * 256, hostBytesBound: 128 * 1024 * 1024 + rounded * 512 + sourceBytes * 3 + decompressedBytes * 2 };
14
+ }
15
+ export const SpatialSpzFactsSchema = z.strictObject({
16
+ kind: z.literal("slopcamera.spz-admission"), schemaVersion: z.literal(1), version: z.union([z.literal(2), z.literal(3)]),
17
+ splats: z.number().int().min(1).max(SPATIAL_SPLAT_LIMITS.splats), shDegree: z.number().int().min(0).max(3), fractionalBits: z.number().int().min(0).max(24),
18
+ antialiased: z.literal(false), decompressedBytes: z.number().int().min(16).max(SPATIAL_SPLAT_LIMITS.decompressedBytes),
19
+ gpuBytesBound: z.number().int().min(1).max(SPATIAL_SPLAT_LIMITS.gpuBytes), hostBytesBound: z.number().int().min(1).max(SPATIAL_SPLAT_LIMITS.hostBytes),
20
+ }).refine(value => value.decompressedBytes === 16 + value.splats * (19 + (value.version === 3 ? 1 : 0) + 3 * ((value.shDegree + 1) ** 2 - 1)), "SPZ body size must match the exact admitted attribute layout.");
21
+ export type SpatialSpzFacts = Readonly<z.infer<typeof SpatialSpzFactsSchema>>;
22
+
23
+ const normalizationSchema = z.strictObject({
24
+ metersPerUnit: z.number().finite().min(0.000001).max(1_000_000),
25
+ // Applied to decoded SPZ coordinates. Spark 2.1.0's SPZ decoder reads XYZ
26
+ // directly, without the format conversion sometimes used for PLY/OpenCV.
27
+ sourceUp: z.enum(["x", "y", "z"]), sourceHandedness: z.literal("right"),
28
+ transform: SpatialTransformSchema.refine(value => value.scale[0] === value.scale[1] && value.scale[1] === value.scale[2], "The initial splat profile requires a uniform authored scale."),
29
+ });
30
+ const identitiesSchema = z.strictObject({ assetId: SpatialAssetIdSchema, colliderAssetId: SpatialAssetIdSchema.optional(), entityId: SpatialEntityIdSchema, name: z.string().min(1).max(256) })
31
+ .refine(value => value.assetId !== value.colliderAssetId, "World and collider assets need distinct identities.");
32
+ const provenanceSchema = z.strictObject({ kind: z.enum(["saved", "worldlabs-marble"]), description: z.string().min(1).max(2048), worldId: z.string().min(1).max(256).optional(), receipt: SpatialPayloadSchema.optional() })
33
+ .refine(value => value.kind !== "worldlabs-marble" || (value.worldId !== undefined && value.receipt !== undefined), "Generated Marble provenance requires its exact world ID and retained provider receipt.");
34
+ const importSchema = z.strictObject({ splat: SpatialPayloadSchema, collider: SpatialPayloadSchema.optional(), identities: identitiesSchema, normalization: normalizationSchema, provenance: provenanceSchema })
35
+ .refine(value => (value.collider === undefined) === (value.identities.colliderAssetId === undefined), "Collider bytes and colliderAssetId must be supplied together.")
36
+ .refine(value => value.provenance.kind !== "worldlabs-marble" || value.collider !== undefined, "Generated Marble provenance requires its retained collider.");
37
+ export const SavedSpatialWorldImportInputSchema = z.preprocess(value => createBoundedJsonSnapshot(value, SPATIAL_SPLAT_LIMITS.metadataBytes, "Saved world import", { maximumDepth: 16, maximumValues: 4096 }).value, importSchema);
38
+ export type SavedSpatialWorldImportInput = Readonly<z.infer<typeof SavedSpatialWorldImportInputSchema>>;
39
+ export const SpatialWorldImportManifestSchema = z.strictObject({
40
+ kind: z.literal("slopcamera.spatial-world-import"), schemaVersion: z.literal(1),
41
+ splat: z.strictObject({ payload: SpatialPayloadSchema, facts: SpatialSpzFactsSchema }),
42
+ collider: z.strictObject({ payload: SpatialPayloadSchema, role: z.literal("approximate-collider"), validation: z.literal("bounded-glb-structure-only") }).nullable(),
43
+ identities: identitiesSchema, normalization: normalizationSchema, provenance: provenanceSchema,
44
+ capabilities: z.strictObject({ beauty: z.literal(true), semanticIds: z.literal("authored-wrapper-only"), depth: z.literal("unsupported"), objectId: z.literal("unsupported"), physics: z.enum(["unvalidated", "unavailable"]) }),
45
+ }).refine(value => (value.collider === null) === (value.identities.colliderAssetId === undefined) && value.capabilities.physics === (value.collider === null ? "unavailable" : "unvalidated"), "Collider presence and capability evidence must agree.");
46
+ export type SpatialWorldImportManifest = Readonly<z.infer<typeof SpatialWorldImportManifestSchema>>;
47
+ export const SavedSpatialWorldImportOutputSchema = z.strictObject({ manifest: SpatialWorldImportManifestSchema, manifestArtifact: SpatialPayloadSchema, assets: z.array(SpatialAssetManifestSchema).min(2).max(4), entity: SpatialEntitySchema, manifestSha256: SpatialDigestSchema });
48
+ export type SavedSpatialWorldImportOutput = Readonly<z.infer<typeof SavedSpatialWorldImportOutputSchema>>;
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+
3
+ import { ColorGradeSelectionSchema } from "./media-effects";
4
+ import type { DeepReadonly, ReadonlyInferred } from "./recording";
5
+
6
+ export const VIDEO_LOOK_PRESETS = [
7
+ "blue-16mm",
8
+ "warm-super-8",
9
+ "photocopy",
10
+ "soft-vhs",
11
+ ] as const;
12
+
13
+ export const ERROR_DIFFUSION_DITHER_ALGORITHMS = [
14
+ "atkinson",
15
+ "floyd-steinberg",
16
+ ] as const;
17
+
18
+ const UnitIntervalSchema = z.number().finite().min(0).max(1);
19
+ const CanonicalRgbHexSchema = z.string()
20
+ .regex(/^#[0-9a-fA-F]{6}$/u, "Expected a six-digit RGB hex color.")
21
+ .transform(value => value.toLocaleLowerCase("en-US"));
22
+
23
+ export const VideoLookPresetSchema = z.enum(VIDEO_LOOK_PRESETS);
24
+
25
+ export const VideoLookPresetOptionsSchema = z.strictObject({
26
+ intensity: UnitIntervalSchema.default(1),
27
+ seed: z.number().int().safe().nonnegative().max(2_147_483_647).default(19_840_123),
28
+ });
29
+
30
+ export const ColorGradeVideoEffectSchema = z.strictObject({
31
+ amount: UnitIntervalSchema.default(1),
32
+ grade: ColorGradeSelectionSchema,
33
+ kind: z.literal("color-grade"),
34
+ });
35
+
36
+ export const DuotoneVideoEffectSchema = z.strictObject({
37
+ amount: UnitIntervalSchema.default(1),
38
+ highlights: CanonicalRgbHexSchema,
39
+ kind: z.literal("duotone"),
40
+ shadows: CanonicalRgbHexSchema,
41
+ });
42
+
43
+ export const DiffusionVideoEffectSchema = z.strictObject({
44
+ amount: UnitIntervalSchema.default(0.15),
45
+ blendMode: z.enum(["screen", "soft-light"]).default("screen"),
46
+ kind: z.literal("diffusion"),
47
+ radiusPx: z.number().finite().min(0.25).max(64).default(4),
48
+ });
49
+
50
+ export const FilmGrainVideoEffectSchema = z.strictObject({
51
+ amount: UnitIntervalSchema.default(0.25),
52
+ cadence: z.enum(["fixed", "frame-varying"]).default("frame-varying"),
53
+ chroma: UnitIntervalSchema.default(0.15),
54
+ kind: z.literal("film-grain"),
55
+ seed: z.number().int().safe().nonnegative().max(2_147_483_647),
56
+ });
57
+
58
+ export const VignetteVideoEffectSchema = z.strictObject({
59
+ amount: UnitIntervalSchema.default(0.2),
60
+ center: z.strictObject({
61
+ xUnit: UnitIntervalSchema.default(0.5),
62
+ yUnit: UnitIntervalSchema.default(0.5),
63
+ }).default({ xUnit: 0.5, yUnit: 0.5 }),
64
+ kind: z.literal("vignette"),
65
+ });
66
+
67
+ export const ScanlinesVideoEffectSchema = z.strictObject({
68
+ amount: UnitIntervalSchema.default(0.15),
69
+ kind: z.literal("scanlines"),
70
+ spacingPx: z.number().int().safe().min(4).max(64).default(4),
71
+ thicknessPx: z.number().int().safe().min(1).max(3).default(1),
72
+ });
73
+
74
+ export const OrderedDitherVideoEffectSchema = z.strictObject({
75
+ amount: UnitIntervalSchema.default(1),
76
+ bayerScale: z.number().int().safe().min(0).max(5).default(2),
77
+ colors: z.number().int().safe().min(2).max(256).default(16),
78
+ kind: z.literal("ordered-dither"),
79
+ matrix: z.literal("bayer-8x8").default("bayer-8x8"),
80
+ });
81
+
82
+ export const ErrorDiffusionDitherVideoEffectSchema = z.strictObject({
83
+ algorithm: z.enum(ERROR_DIFFUSION_DITHER_ALGORITHMS).default("floyd-steinberg"),
84
+ amount: UnitIntervalSchema.default(1),
85
+ colors: z.number().int().safe().min(2).max(256).default(16),
86
+ kind: z.literal("error-diffusion-dither"),
87
+ });
88
+
89
+ /**
90
+ * These are artistic, display-referred effects. Codec/output dithering remains
91
+ * a separate renderer concern so an aesthetic dither cannot accidentally be
92
+ * treated as a bit-depth conversion policy.
93
+ */
94
+ export const VideoEffectSchema = z.discriminatedUnion("kind", [
95
+ ColorGradeVideoEffectSchema,
96
+ DuotoneVideoEffectSchema,
97
+ DiffusionVideoEffectSchema,
98
+ FilmGrainVideoEffectSchema,
99
+ VignetteVideoEffectSchema,
100
+ ScanlinesVideoEffectSchema,
101
+ OrderedDitherVideoEffectSchema,
102
+ ErrorDiffusionDitherVideoEffectSchema,
103
+ ]);
104
+
105
+ export const VideoLookV1Schema = z.strictObject({
106
+ effects: z.array(VideoEffectSchema).min(1).max(16),
107
+ kind: z.union([
108
+ z.literal("slopcamera.video-look"),
109
+ z.literal("studio.video-look"),
110
+ ]),
111
+ processingColorSpace: z.literal("bt709-display").default("bt709-display"),
112
+ schemaVersion: z.literal(1),
113
+ });
114
+
115
+ export type VideoEffect = ReadonlyInferred<typeof VideoEffectSchema>;
116
+ export type VideoEffectInput = DeepReadonly<z.input<typeof VideoEffectSchema>>;
117
+ export type VideoLookPreset = ReadonlyInferred<typeof VideoLookPresetSchema>;
118
+ export type VideoLookPresetOptions = ReadonlyInferred<typeof VideoLookPresetOptionsSchema>;
119
+ export type VideoLookPresetOptionsInput = DeepReadonly<z.input<typeof VideoLookPresetOptionsSchema>>;
120
+ export type VideoLookV1 = ReadonlyInferred<typeof VideoLookV1Schema>;