@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,495 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ canonicalSlopcameraPersistenceDocument,
5
+ canonicalJson,
6
+ canonicalJsonSha256,
7
+ hashProjectEditPlan,
8
+ loadProjectEditPlan,
9
+ loadVideoProject,
10
+ sha256Hex,
11
+ } from "../../../core";
12
+ import {
13
+ commitProjectStateTransaction,
14
+ loadProjectStateTransactionSettlement,
15
+ } from "../../../cli/project-state-transaction";
16
+ import {
17
+ createEditorialPromotionReceiptV1,
18
+ EditorialPromotionReceiptReferenceV1Schema,
19
+ EditorialPromotionReceiptV1Schema,
20
+ editorialPromotionReceiptPath,
21
+ editorialPromotionReceiptReferenceV1,
22
+ type EditorialPromotionReceiptReferenceV1,
23
+ type EditorialPromotionReceiptV1,
24
+ } from "../../creative-iteration";
25
+ import type { ApplicationContext } from "../../context";
26
+ import { ApplicationError } from "../../errors";
27
+ import type {
28
+ OperationDefinition,
29
+ OperationExecutionContext,
30
+ } from "../../operation";
31
+ import {
32
+ assertProjectEditBasis,
33
+ openProjectSnapshot,
34
+ projectEditBasis,
35
+ projectMatchesEditBasis,
36
+ type OpenProjectSnapshot,
37
+ } from "../../project-store";
38
+ import { ProjectReferenceSchema, throwIfAborted } from "../shared";
39
+ import {
40
+ loadCandidateRevision,
41
+ loadCreativeCandidate,
42
+ loadVariantMatrix,
43
+ loadVariantSelection,
44
+ publishCreativeDocument,
45
+ } from "../iteration/shared";
46
+ import {
47
+ VariantSelectionReferenceV1Schema,
48
+ } from "../../creative-iteration";
49
+
50
+ export const PromoteVariantSelectionRequestSchema = z.strictObject({
51
+ selection: VariantSelectionReferenceV1Schema,
52
+ });
53
+
54
+ export const PromoteVariantSelectionInputSchema = z.strictObject({
55
+ project: ProjectReferenceSchema,
56
+ selection: VariantSelectionReferenceV1Schema,
57
+ }).superRefine((input, context) => {
58
+ if (input.project !== input.selection.base.projectId) {
59
+ context.addIssue({
60
+ code: "custom",
61
+ message: "Editorial promotion project does not match its selection base.",
62
+ path: ["project"],
63
+ });
64
+ }
65
+ });
66
+
67
+ export const PromoteVariantSelectionOutputSchema =
68
+ EditorialPromotionReceiptReferenceV1Schema;
69
+
70
+ export type PromoteVariantSelectionRequest = z.infer<
71
+ typeof PromoteVariantSelectionRequestSchema
72
+ >;
73
+ export type PromoteVariantSelectionInput = z.infer<
74
+ typeof PromoteVariantSelectionInputSchema
75
+ >;
76
+ export type PromoteVariantSelectionOutput = z.infer<
77
+ typeof PromoteVariantSelectionOutputSchema
78
+ >;
79
+
80
+ export function bindPromoteVariantSelectionInput(
81
+ _application: ApplicationContext,
82
+ input: unknown,
83
+ ): PromoteVariantSelectionInput {
84
+ const exact = PromoteVariantSelectionInputSchema.safeParse(input);
85
+ if (exact.success) return exact.data;
86
+ const request = PromoteVariantSelectionRequestSchema.parse(input);
87
+ return PromoteVariantSelectionInputSchema.parse({
88
+ project: request.selection.base.projectId,
89
+ selection: request.selection,
90
+ });
91
+ }
92
+
93
+ function missing(error: unknown): boolean {
94
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
95
+ }
96
+
97
+ async function loadExistingPromotion(input: {
98
+ readonly path: string;
99
+ readonly snapshot: OpenProjectSnapshot;
100
+ }): Promise<{
101
+ readonly artifact: {
102
+ readonly bytes: number;
103
+ readonly path: string;
104
+ readonly sha256: string;
105
+ };
106
+ readonly receipt: EditorialPromotionReceiptV1;
107
+ } | null> {
108
+ let contents: string;
109
+ try {
110
+ contents = await input.snapshot.openProject.fileSystem.readText(input.path);
111
+ } catch (error) {
112
+ if (missing(error)) return null;
113
+ throw error;
114
+ }
115
+ let value: unknown;
116
+ try {
117
+ value = JSON.parse(contents) as unknown;
118
+ } catch {
119
+ throw new ApplicationError(
120
+ "invalid-data",
121
+ "Editorial promotion receipt is not valid JSON.",
122
+ );
123
+ }
124
+ const receipt = EditorialPromotionReceiptV1Schema.parse(value);
125
+ if (contents !== `${canonicalJson(receipt)}\n`) {
126
+ throw new ApplicationError(
127
+ "invalid-data",
128
+ "Editorial promotion receipt is not canonical immutable JSON.",
129
+ );
130
+ }
131
+ return {
132
+ artifact: {
133
+ bytes: new TextEncoder().encode(contents).byteLength,
134
+ path: input.path,
135
+ sha256: sha256Hex(contents),
136
+ },
137
+ receipt,
138
+ };
139
+ }
140
+
141
+ export function promotionRecoveryMatches(
142
+ receiptInput: EditorialPromotionReceiptV1,
143
+ snapshot: OpenProjectSnapshot,
144
+ ): boolean {
145
+ const receipt = EditorialPromotionReceiptV1Schema.parse(receiptInput);
146
+ return hashProjectEditPlan(snapshot.plan) === receipt.promotedPlanSha256
147
+ && projectMatchesEditBasis(receipt.promotedBasis, snapshot);
148
+ }
149
+
150
+ async function verifiedPromotionDocuments(
151
+ context: Pick<OperationExecutionContext, "abortSignal" | "application">,
152
+ input: PromoteVariantSelectionInput,
153
+ snapshot: OpenProjectSnapshot,
154
+ ) {
155
+ const fileSystem = snapshot.openProject.fileSystem;
156
+ const selection = await loadVariantSelection({
157
+ fileSystem,
158
+ reference: input.selection,
159
+ });
160
+ const matrix = await loadVariantMatrix({
161
+ fileSystem,
162
+ reference: selection.matrix,
163
+ });
164
+ const chosen = matrix.candidates.find(candidate => (
165
+ candidate.candidate.candidateId === selection.chosen.candidate.candidateId
166
+ ));
167
+ if (
168
+ chosen === undefined
169
+ || canonicalJson(chosen) !== canonicalJson(selection.chosen)
170
+ ) {
171
+ throw new ApplicationError(
172
+ "conflict",
173
+ "Editorial promotion selection is not an exact member of its closed matrix.",
174
+ );
175
+ }
176
+ throwIfAborted(context.abortSignal);
177
+ const candidate = await loadCreativeCandidate({
178
+ fileSystem,
179
+ reference: chosen,
180
+ });
181
+ const revision = await loadCandidateRevision({ candidate, fileSystem });
182
+ if (
183
+ candidate.candidateSha256 !== selection.result.candidateSha256
184
+ || candidate.revision.revisionSha256 !== selection.result.revisionSha256
185
+ ) {
186
+ throw new ApplicationError(
187
+ "conflict",
188
+ "Editorial promotion selection result hashes do not match the chosen candidate.",
189
+ );
190
+ }
191
+ const receipt = createEditorialPromotionReceiptV1({
192
+ base: selection.base,
193
+ candidate: chosen,
194
+ frozenProject: canonicalSlopcameraPersistenceDocument(candidate.base.project),
195
+ promotedPlan: canonicalSlopcameraPersistenceDocument(revision.projectEditPlan),
196
+ selection: input.selection,
197
+ });
198
+ return { candidate, receipt, revision, selection };
199
+ }
200
+
201
+ async function exactPromotionTransactionSettled(input: {
202
+ readonly receipt: EditorialPromotionReceiptV1;
203
+ readonly snapshot: OpenProjectSnapshot;
204
+ }): Promise<boolean> {
205
+ const transaction = await loadProjectStateTransactionSettlement(
206
+ input.snapshot.openProject.fileSystem,
207
+ input.receipt.transactionId,
208
+ );
209
+ if (
210
+ transaction === null
211
+ || transaction.active !== "after"
212
+ || transaction.transactionId !== input.receipt.transactionId
213
+ || transaction.after.plan.sha256
214
+ !== input.receipt.promotedPlanSha256
215
+ ) {
216
+ return false;
217
+ }
218
+ const [plan, project] = await Promise.all([
219
+ loadProjectEditPlan(
220
+ input.snapshot.openProject.fileSystem,
221
+ transaction.after.plan.path,
222
+ ),
223
+ loadVideoProject(
224
+ input.snapshot.openProject.fileSystem,
225
+ transaction.after.project.path,
226
+ ),
227
+ ]);
228
+ if (
229
+ canonicalJsonSha256(plan) !== transaction.after.plan.sha256
230
+ || canonicalJsonSha256(project) !== transaction.after.project.sha256
231
+ || hashProjectEditPlan(plan) !== input.receipt.promotedPlanSha256
232
+ ) {
233
+ return false;
234
+ }
235
+ return projectMatchesEditBasis(input.receipt.promotedBasis, {
236
+ editBasis: projectEditBasis(project, plan),
237
+ project,
238
+ });
239
+ }
240
+
241
+ async function publishPromotionReceipt(input: {
242
+ readonly receipt: EditorialPromotionReceiptV1;
243
+ readonly snapshot: OpenProjectSnapshot;
244
+ }): Promise<EditorialPromotionReceiptReferenceV1> {
245
+ const path = editorialPromotionReceiptPath({
246
+ baseSha256: input.receipt.base.baseSha256,
247
+ });
248
+ const artifact = await publishCreativeDocument({
249
+ document: input.receipt,
250
+ fileSystem: input.snapshot.openProject.fileSystem,
251
+ path,
252
+ schema: EditorialPromotionReceiptV1Schema,
253
+ });
254
+ return editorialPromotionReceiptReferenceV1({
255
+ artifact,
256
+ receipt: input.receipt,
257
+ });
258
+ }
259
+
260
+ export const promoteVariantSelectionOperationDefinition = {
261
+ inputSchema: PromoteVariantSelectionInputSchema,
262
+ inputSchemaId: "slopcamera.operation.project.promote-selection.input/v1",
263
+ kind: "project.promote-selection",
264
+ lifecycle: {
265
+ kind: "project-transaction",
266
+ execute: async (context, input) => {
267
+ throwIfAborted(context.abortSignal);
268
+ let snapshot = await openProjectSnapshot(
269
+ context.application.paths.projectRoot,
270
+ input.project,
271
+ );
272
+ const verified = await verifiedPromotionDocuments(
273
+ context,
274
+ input,
275
+ snapshot,
276
+ );
277
+ const receiptPath = editorialPromotionReceiptPath({
278
+ baseSha256: verified.receipt.base.baseSha256,
279
+ });
280
+ const existing = await loadExistingPromotion({ path: receiptPath, snapshot });
281
+ if (existing !== null) {
282
+ if (
283
+ existing.receipt.selection.selectionSha256
284
+ !== input.selection.selectionSha256
285
+ || existing.receipt.promotionSha256
286
+ !== verified.receipt.promotionSha256
287
+ ) {
288
+ throw new ApplicationError(
289
+ "conflict",
290
+ "Another selection already won promotion for this frozen base.",
291
+ );
292
+ }
293
+ return editorialPromotionReceiptReferenceV1(existing);
294
+ }
295
+
296
+ if (await exactPromotionTransactionSettled({
297
+ receipt: verified.receipt,
298
+ snapshot,
299
+ })) {
300
+ await context.workflow?.beforePublication();
301
+ return await publishPromotionReceipt({
302
+ receipt: verified.receipt,
303
+ snapshot,
304
+ });
305
+ }
306
+
307
+ if (promotionRecoveryMatches(verified.receipt, snapshot)) {
308
+ const baseline = verified.receipt.promotedPlanSha256
309
+ === verified.receipt.base.generation.currentPlanSha256;
310
+ if (
311
+ !baseline
312
+ && !await exactPromotionTransactionSettled({
313
+ receipt: verified.receipt,
314
+ snapshot,
315
+ })
316
+ ) {
317
+ throw new ApplicationError(
318
+ "conflict",
319
+ "Current plan matches the selected bytes without this promotion's exact settled transaction.",
320
+ );
321
+ }
322
+ await context.workflow?.beforePublication();
323
+ return await publishPromotionReceipt({
324
+ receipt: verified.receipt,
325
+ snapshot,
326
+ });
327
+ }
328
+ assertProjectEditBasis(verified.receipt.base.editBasis, snapshot);
329
+ throwIfAborted(context.abortSignal);
330
+ await context.workflow?.beforePublication();
331
+ throwIfAborted(context.abortSignal);
332
+ snapshot = await openProjectSnapshot(
333
+ context.application.paths.projectRoot,
334
+ input.project,
335
+ );
336
+ assertProjectEditBasis(verified.receipt.base.editBasis, snapshot);
337
+ const persistedProject = canonicalSlopcameraPersistenceDocument(snapshot.project);
338
+ const persistedPriorPlan = canonicalSlopcameraPersistenceDocument(snapshot.plan);
339
+ const persistedPromotedPlan = canonicalSlopcameraPersistenceDocument(
340
+ verified.revision.projectEditPlan,
341
+ );
342
+
343
+ if (
344
+ hashProjectEditPlan(snapshot.plan)
345
+ !== verified.receipt.promotedPlanSha256
346
+ ) {
347
+ await commitProjectStateTransaction({
348
+ after: {
349
+ plan: persistedPromotedPlan,
350
+ project: persistedProject,
351
+ },
352
+ before: {
353
+ plan: persistedPriorPlan,
354
+ project: persistedProject,
355
+ },
356
+ fileSystem: snapshot.openProject.fileSystem,
357
+ transactionId: verified.receipt.transactionId,
358
+ });
359
+ snapshot = await openProjectSnapshot(
360
+ context.application.paths.projectRoot,
361
+ input.project,
362
+ );
363
+ }
364
+ if (!promotionRecoveryMatches(verified.receipt, snapshot)) {
365
+ throw new ApplicationError(
366
+ "conflict",
367
+ "Editorial promotion transaction did not install the selected plan.",
368
+ );
369
+ }
370
+ return await publishPromotionReceipt({
371
+ receipt: verified.receipt,
372
+ snapshot,
373
+ });
374
+ },
375
+ },
376
+ outputSchema: PromoteVariantSelectionOutputSchema,
377
+ outputSchemaId: "slopcamera.operation.project.promote-selection.output/v1",
378
+ policy: {
379
+ cache: "none",
380
+ cancellable: true,
381
+ effect: "project-mutation",
382
+ maxDurationMs: 30_000,
383
+ maxFanOut: 0,
384
+ maxInputBytes: 32 * 1024,
385
+ maxOutputBytes: 16 * 1024,
386
+ preparation: ["project-state"],
387
+ resources: [
388
+ { amount: 1, resource: "cpu" },
389
+ { amount: 1, resource: "local-io" },
390
+ { amount: 1, resource: "project-publication" },
391
+ ],
392
+ resume: "recoverable-transaction",
393
+ },
394
+ receiptReference: output => output.artifact.path,
395
+ summarize: output => ({
396
+ fields: {
397
+ projectId: output.projectId,
398
+ promotedPlanSha256: output.promotedPlanSha256,
399
+ promotionSha256: output.promotionSha256,
400
+ selectionSha256: output.selectionSha256,
401
+ },
402
+ kind: "project.promote-selection",
403
+ }),
404
+ version: 1,
405
+ } satisfies OperationDefinition<
406
+ "project.promote-selection",
407
+ PromoteVariantSelectionInput,
408
+ PromoteVariantSelectionOutput
409
+ >;
410
+
411
+ export type PromoteVariantSelectionReconciliation =
412
+ | {
413
+ readonly kind: "completed";
414
+ readonly output: PromoteVariantSelectionOutput;
415
+ }
416
+ | { readonly kind: "retry" }
417
+ | { readonly kind: "conflict"; readonly message: string };
418
+
419
+ /**
420
+ * Reconcile only authoritative promotion evidence. Receipt finalization is
421
+ * retried when the exact deterministic transaction settled after a crash.
422
+ */
423
+ export async function reconcileVariantSelectionPromotion(
424
+ application: ApplicationContext,
425
+ inputValue: unknown,
426
+ ): Promise<PromoteVariantSelectionReconciliation> {
427
+ try {
428
+ const input = bindPromoteVariantSelectionInput(application, inputValue);
429
+ const snapshot = await openProjectSnapshot(
430
+ application.paths.projectRoot,
431
+ input.project,
432
+ );
433
+ const abortController = new AbortController();
434
+ const verified = await verifiedPromotionDocuments(
435
+ { abortSignal: abortController.signal, application },
436
+ input,
437
+ snapshot,
438
+ );
439
+ const path = editorialPromotionReceiptPath({
440
+ baseSha256: verified.receipt.base.baseSha256,
441
+ });
442
+ const existing = await loadExistingPromotion({ path, snapshot });
443
+ if (existing !== null) {
444
+ if (
445
+ existing.receipt.selection.selectionSha256
446
+ !== input.selection.selectionSha256
447
+ || existing.receipt.promotionSha256 !== verified.receipt.promotionSha256
448
+ ) {
449
+ return {
450
+ kind: "conflict",
451
+ message: "Editorial promotion receipt does not match the requested selection.",
452
+ };
453
+ }
454
+ return {
455
+ kind: "completed",
456
+ output: editorialPromotionReceiptReferenceV1(existing),
457
+ };
458
+ }
459
+ if (await exactPromotionTransactionSettled({
460
+ receipt: verified.receipt,
461
+ snapshot,
462
+ })) {
463
+ return { kind: "retry" };
464
+ }
465
+ if (promotionRecoveryMatches(verified.receipt, snapshot)) {
466
+ const baseline = verified.receipt.promotedPlanSha256
467
+ === verified.receipt.base.generation.currentPlanSha256;
468
+ if (
469
+ baseline
470
+ || await exactPromotionTransactionSettled({
471
+ receipt: verified.receipt,
472
+ snapshot,
473
+ })
474
+ ) {
475
+ return { kind: "retry" };
476
+ }
477
+ return {
478
+ kind: "conflict",
479
+ message: "Selected plan is current without the exact promotion transaction.",
480
+ };
481
+ }
482
+ if (projectMatchesEditBasis(verified.receipt.base.editBasis, snapshot)) {
483
+ return { kind: "retry" };
484
+ }
485
+ return {
486
+ kind: "conflict",
487
+ message: "Project state no longer matches the promotion base or selected result.",
488
+ };
489
+ } catch (error) {
490
+ return {
491
+ kind: "conflict",
492
+ message: error instanceof Error ? error.message : String(error),
493
+ };
494
+ }
495
+ }
@@ -0,0 +1,95 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ ProjectEditPlanV1Schema,
5
+ VideoProjectV1Schema,
6
+ type ProjectEditPlanV1,
7
+ type VideoProjectV1,
8
+ } from "../../../contracts";
9
+ import type { OperationDefinition } from "../../operation";
10
+ import { openLeasedProjectSnapshot } from "../../project-publication-lease";
11
+ import {
12
+ assertProjectGeneration,
13
+ ProjectEditBasisSchema,
14
+ ProjectGenerationHashesSchema,
15
+ type ProjectEditBasis,
16
+ type ProjectGenerationHashes,
17
+ } from "../../project-store";
18
+ import {
19
+ ProjectReferenceSchema,
20
+ throwIfAborted,
21
+ } from "../shared";
22
+
23
+ export const ProjectSnapshotInputSchema = z.strictObject({
24
+ project: ProjectReferenceSchema,
25
+ });
26
+
27
+ export const ProjectSnapshotOutputSchema = z.strictObject({
28
+ currentPlan: ProjectEditPlanV1Schema,
29
+ editBasis: ProjectEditBasisSchema,
30
+ generation: ProjectGenerationHashesSchema,
31
+ project: VideoProjectV1Schema,
32
+ });
33
+
34
+ export type ProjectSnapshotInput = z.infer<typeof ProjectSnapshotInputSchema>;
35
+ export interface ProjectSnapshotOutput {
36
+ readonly currentPlan: ProjectEditPlanV1;
37
+ readonly editBasis: ProjectEditBasis;
38
+ readonly generation: ProjectGenerationHashes;
39
+ readonly project: VideoProjectV1;
40
+ }
41
+
42
+ export const projectSnapshotOperationDefinition: OperationDefinition<
43
+ "project.snapshot",
44
+ ProjectSnapshotInput,
45
+ ProjectSnapshotOutput
46
+ > = {
47
+ inputSchema: ProjectSnapshotInputSchema,
48
+ inputSchemaId: "slopcamera.operation.project.snapshot.input/v1",
49
+ kind: "project.snapshot",
50
+ lifecycle: {
51
+ kind: "local-artifact",
52
+ execute: async (context, input) => {
53
+ throwIfAborted(context.abortSignal);
54
+ const snapshot = await openLeasedProjectSnapshot(
55
+ context.application,
56
+ input.project,
57
+ );
58
+ assertProjectGeneration(
59
+ context.expectedProjectGeneration,
60
+ snapshot.generation,
61
+ );
62
+ throwIfAborted(context.abortSignal);
63
+ return {
64
+ currentPlan: snapshot.plan,
65
+ editBasis: snapshot.editBasis,
66
+ generation: snapshot.generation,
67
+ project: snapshot.project,
68
+ };
69
+ },
70
+ },
71
+ outputSchema: ProjectSnapshotOutputSchema,
72
+ outputSchemaId: "slopcamera.operation.project.snapshot.output/v1",
73
+ policy: {
74
+ cache: "none",
75
+ cancellable: true,
76
+ effect: "local-read",
77
+ maxDurationMs: 30_000,
78
+ maxFanOut: 0,
79
+ maxInputBytes: 1_024,
80
+ maxOutputBytes: 64 * 1024 * 1024,
81
+ preparation: ["project-state"],
82
+ resources: [{ amount: 1, resource: "local-io" }],
83
+ resume: "deterministic",
84
+ },
85
+ summarize: output => ({
86
+ fields: {
87
+ currentPlanSha256: output.generation.currentPlanSha256,
88
+ generationSha256: output.generation.generationSha256,
89
+ projectId: output.project.projectId,
90
+ projectSha256: output.generation.projectSha256,
91
+ },
92
+ kind: "project.snapshot",
93
+ }),
94
+ version: 1,
95
+ };
@@ -0,0 +1,5 @@
1
+ export * from "./pause";
2
+ export * from "./resume";
3
+ export * from "./shared";
4
+ export * from "./start";
5
+ export * from "./stop";
@@ -0,0 +1,34 @@
1
+ import type { OperationDefinition } from "../../operation";
2
+ import {
3
+ EmptyRecordingOperationInputSchema,
4
+ type EmptyRecordingOperationInput,
5
+ executeRecordingControl,
6
+ RecordingOperationOutputSchema,
7
+ type RecordingOperationOutput,
8
+ recordingTransitionPolicy,
9
+ summarizeRecordingControl,
10
+ } from "./shared";
11
+
12
+ export const RecordingPauseInputSchema = EmptyRecordingOperationInputSchema;
13
+ export const RecordingPauseOutputSchema = RecordingOperationOutputSchema;
14
+ export type RecordingPauseInput = EmptyRecordingOperationInput;
15
+ export type RecordingPauseOutput = RecordingOperationOutput;
16
+
17
+ export const recordingPauseOperationDefinition: OperationDefinition<
18
+ "recording.pause",
19
+ RecordingPauseInput,
20
+ RecordingPauseOutput
21
+ > = {
22
+ inputSchema: RecordingPauseInputSchema,
23
+ inputSchemaId: "slopcamera.operation.recording.pause.input/v1",
24
+ kind: "recording.pause",
25
+ lifecycle: {
26
+ kind: "live-control",
27
+ execute: async context => await executeRecordingControl(context, "pause"),
28
+ },
29
+ outputSchema: RecordingPauseOutputSchema,
30
+ outputSchemaId: "slopcamera.operation.recording.pause.output/v1",
31
+ policy: recordingTransitionPolicy,
32
+ summarize: output => summarizeRecordingControl("recording.pause", output),
33
+ version: 1,
34
+ };
@@ -0,0 +1,34 @@
1
+ import type { OperationDefinition } from "../../operation";
2
+ import {
3
+ EmptyRecordingOperationInputSchema,
4
+ type EmptyRecordingOperationInput,
5
+ executeRecordingControl,
6
+ RecordingOperationOutputSchema,
7
+ type RecordingOperationOutput,
8
+ recordingTransitionPolicy,
9
+ summarizeRecordingControl,
10
+ } from "./shared";
11
+
12
+ export const RecordingResumeInputSchema = EmptyRecordingOperationInputSchema;
13
+ export const RecordingResumeOutputSchema = RecordingOperationOutputSchema;
14
+ export type RecordingResumeInput = EmptyRecordingOperationInput;
15
+ export type RecordingResumeOutput = RecordingOperationOutput;
16
+
17
+ export const recordingResumeOperationDefinition: OperationDefinition<
18
+ "recording.resume",
19
+ RecordingResumeInput,
20
+ RecordingResumeOutput
21
+ > = {
22
+ inputSchema: RecordingResumeInputSchema,
23
+ inputSchemaId: "slopcamera.operation.recording.resume.input/v1",
24
+ kind: "recording.resume",
25
+ lifecycle: {
26
+ kind: "live-control",
27
+ execute: async context => await executeRecordingControl(context, "resume"),
28
+ },
29
+ outputSchema: RecordingResumeOutputSchema,
30
+ outputSchemaId: "slopcamera.operation.recording.resume.output/v1",
31
+ policy: recordingTransitionPolicy,
32
+ summarize: output => summarizeRecordingControl("recording.resume", output),
33
+ version: 1,
34
+ };