@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,333 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import {
4
+ link,
5
+ lstat,
6
+ open,
7
+ realpath,
8
+ rm,
9
+ } from "node:fs/promises";
10
+ import {
11
+ isAbsolute,
12
+ join,
13
+ relative,
14
+ resolve,
15
+ } from "node:path";
16
+
17
+ import { z } from "zod";
18
+
19
+ import { Sha256Schema } from "../contracts";
20
+ import {
21
+ canonicalJson,
22
+ sha256Hex,
23
+ } from "../core/canonical-json";
24
+ import { ensurePrivateDirectory } from "../cli/paths";
25
+ import { ApplicationError } from "./errors";
26
+ import type {
27
+ OperationExecutionContext,
28
+ OperationKind,
29
+ } from "./operation";
30
+
31
+ export const OPERATION_COMPLETION_CHECKPOINT_FILE =
32
+ "operation-completion.v1.json";
33
+
34
+ const MAXIMUM_CHECKPOINT_BYTES = 65 * 1024 * 1024;
35
+ const OUTPUT_DIGEST_DOMAIN = "studio.workflow.operation-completion-output/v1";
36
+
37
+ const OperationCompletionCheckpointSchema = z.strictObject({
38
+ identity: z.strictObject({
39
+ inputSchemaId: z.string().min(1).max(256),
40
+ kind: z.string().min(1).max(128),
41
+ nodeKey: z.string().min(1).max(255).regex(
42
+ /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*(?:\/[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*)*$/u,
43
+ ),
44
+ nodePlanSha256: Sha256Schema,
45
+ outputSchemaId: z.string().min(1).max(256),
46
+ runId: z.string().min(1).max(256),
47
+ version: z.number().int().safe().positive(),
48
+ }),
49
+ kind: z.literal("slopcamera.workflow-operation-completion"),
50
+ output: z.unknown(),
51
+ outputSha256: Sha256Schema,
52
+ schemaVersion: z.literal(1),
53
+ }).superRefine((checkpoint, context) => {
54
+ let digest: string;
55
+ try {
56
+ digest = operationCheckpointOutputSha256(checkpoint.output);
57
+ } catch {
58
+ context.addIssue({
59
+ code: "custom",
60
+ message: "Operation completion output must be canonical JSON.",
61
+ path: ["output"],
62
+ });
63
+ return;
64
+ }
65
+ if (digest !== checkpoint.outputSha256) {
66
+ context.addIssue({
67
+ code: "custom",
68
+ message: "Operation completion output digest does not match its payload.",
69
+ path: ["outputSha256"],
70
+ });
71
+ }
72
+ });
73
+
74
+ export interface OperationCheckpointDefinitionIdentity {
75
+ readonly inputSchemaId: string;
76
+ readonly kind: OperationKind;
77
+ readonly outputSchemaId: string;
78
+ readonly version: number;
79
+ }
80
+
81
+ export interface OperationCheckpointExecutionIdentity
82
+ extends OperationCheckpointDefinitionIdentity {
83
+ readonly nodeKey: string;
84
+ readonly nodePlanSha256: string;
85
+ readonly runId: string;
86
+ }
87
+
88
+ export type OperationCompletionCheckpoint = z.infer<
89
+ typeof OperationCompletionCheckpointSchema
90
+ >;
91
+
92
+ function operationCheckpointOutputSha256(output: unknown): string {
93
+ return sha256Hex(
94
+ `${OUTPUT_DIGEST_DOMAIN}\0${canonicalJson(output)}`,
95
+ );
96
+ }
97
+
98
+ function isWithin(root: string, candidate: string): boolean {
99
+ const fromRoot = relative(root, candidate);
100
+ return fromRoot === ""
101
+ || (!fromRoot.startsWith("..") && !isAbsolute(fromRoot));
102
+ }
103
+
104
+ async function physicalPrivateWorkspace(
105
+ privateRootInput: string,
106
+ workspaceInput: string,
107
+ ): Promise<string> {
108
+ await ensurePrivateDirectory(privateRootInput);
109
+ const privateRoot = await realpath(resolve(privateRootInput));
110
+ const workspace = resolve(workspaceInput);
111
+ const details = await lstat(workspace).catch((error: unknown) => {
112
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
113
+ throw new ApplicationError(
114
+ "invalid-data",
115
+ "Operation completion workspace does not exist.",
116
+ );
117
+ }
118
+ throw error;
119
+ });
120
+ if (
121
+ details.isSymbolicLink()
122
+ || !details.isDirectory()
123
+ || (details.mode & 0o077) !== 0
124
+ ) {
125
+ throw new ApplicationError(
126
+ "unsafe-path",
127
+ "Operation completion workspace must be a private physical directory.",
128
+ );
129
+ }
130
+ const physical = await realpath(workspace);
131
+ if (physical === privateRoot || !isWithin(privateRoot, physical)) {
132
+ throw new ApplicationError(
133
+ "unsafe-path",
134
+ "Operation completion workspace escaped the application private root.",
135
+ );
136
+ }
137
+ return physical;
138
+ }
139
+
140
+ async function syncDirectory(path: string): Promise<void> {
141
+ const directory = await open(
142
+ path,
143
+ constants.O_RDONLY | (constants.O_DIRECTORY ?? 0),
144
+ );
145
+ try {
146
+ await directory.sync();
147
+ } finally {
148
+ await directory.close();
149
+ }
150
+ }
151
+
152
+ function checkpointFor(
153
+ identity: OperationCheckpointExecutionIdentity,
154
+ output: unknown,
155
+ ): OperationCompletionCheckpoint {
156
+ return OperationCompletionCheckpointSchema.parse({
157
+ identity,
158
+ kind: "slopcamera.workflow-operation-completion",
159
+ output,
160
+ outputSha256: operationCheckpointOutputSha256(output),
161
+ schemaVersion: 1,
162
+ });
163
+ }
164
+
165
+ async function readCheckpointFile(
166
+ path: string,
167
+ ): Promise<OperationCompletionCheckpoint | null> {
168
+ let handle;
169
+ try {
170
+ handle = await open(
171
+ path,
172
+ constants.O_RDONLY
173
+ | (constants.O_NOFOLLOW ?? 0)
174
+ | (constants.O_NONBLOCK ?? 0),
175
+ );
176
+ } catch (error) {
177
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
178
+ return null;
179
+ }
180
+ throw error;
181
+ }
182
+ try {
183
+ const before = await handle.stat();
184
+ if (
185
+ !before.isFile()
186
+ || before.nlink !== 1
187
+ || before.size < 1
188
+ || before.size > MAXIMUM_CHECKPOINT_BYTES
189
+ || (before.mode & 0o077) !== 0
190
+ ) {
191
+ throw new ApplicationError(
192
+ "invalid-data",
193
+ "Operation completion checkpoint is unsafe or exceeds its size bound.",
194
+ );
195
+ }
196
+ const text = await handle.readFile("utf8");
197
+ const after = await handle.stat();
198
+ if (
199
+ before.dev !== after.dev
200
+ || before.ino !== after.ino
201
+ || before.size !== after.size
202
+ || before.mtimeMs !== after.mtimeMs
203
+ || before.ctimeMs !== after.ctimeMs
204
+ ) {
205
+ throw new ApplicationError(
206
+ "conflict",
207
+ "Operation completion checkpoint changed while it was being read.",
208
+ );
209
+ }
210
+ let input: unknown;
211
+ try {
212
+ input = JSON.parse(text) as unknown;
213
+ } catch {
214
+ throw new ApplicationError(
215
+ "invalid-data",
216
+ "Operation completion checkpoint is not valid JSON.",
217
+ );
218
+ }
219
+ const parsed = OperationCompletionCheckpointSchema.parse(input);
220
+ if (`${canonicalJson(parsed)}\n` !== text) {
221
+ throw new ApplicationError(
222
+ "invalid-data",
223
+ "Operation completion checkpoint is not canonical immutable JSON.",
224
+ );
225
+ }
226
+ return parsed;
227
+ } finally {
228
+ await handle.close();
229
+ }
230
+ }
231
+
232
+ function assertCheckpointIdentity(
233
+ actual: OperationCompletionCheckpoint["identity"],
234
+ expected: OperationCheckpointExecutionIdentity,
235
+ ): void {
236
+ if (canonicalJson(actual) !== canonicalJson(expected)) {
237
+ throw new ApplicationError(
238
+ "conflict",
239
+ "Operation completion checkpoint belongs to a different exact node plan.",
240
+ {
241
+ actualNodePlanSha256: actual.nodePlanSha256,
242
+ expectedNodePlanSha256: expected.nodePlanSha256,
243
+ nodeKey: expected.nodeKey,
244
+ },
245
+ );
246
+ }
247
+ }
248
+
249
+ export async function writeOperationCompletionCheckpoint(
250
+ context: OperationExecutionContext,
251
+ definition: OperationCheckpointDefinitionIdentity,
252
+ output: unknown,
253
+ ): Promise<void> {
254
+ const workflow = context.workflow;
255
+ if (workflow === undefined) return;
256
+ const workspace = await physicalPrivateWorkspace(
257
+ context.application.paths.privateRoot,
258
+ workflow.workspaceDirectory,
259
+ );
260
+ const checkpoint = checkpointFor({
261
+ ...definition,
262
+ nodeKey: workflow.nodeKey,
263
+ nodePlanSha256: workflow.nodePlanSha256,
264
+ runId: workflow.runId,
265
+ }, output);
266
+ const source = `${canonicalJson(checkpoint)}\n`;
267
+ const bytes = new TextEncoder().encode(source);
268
+ if (bytes.byteLength > MAXIMUM_CHECKPOINT_BYTES) {
269
+ throw new ApplicationError(
270
+ "invalid-data",
271
+ "Operation completion checkpoint exceeds its size bound.",
272
+ );
273
+ }
274
+ await workflow.beforePublication();
275
+ const temporary = join(
276
+ workspace,
277
+ `.operation-completion-${randomUUID()}.json`,
278
+ );
279
+ const target = join(workspace, OPERATION_COMPLETION_CHECKPOINT_FILE);
280
+ const handle = await open(
281
+ temporary,
282
+ constants.O_CREAT
283
+ | constants.O_EXCL
284
+ | constants.O_WRONLY
285
+ | (constants.O_NOFOLLOW ?? 0),
286
+ 0o600,
287
+ );
288
+ try {
289
+ await handle.writeFile(bytes);
290
+ await handle.sync();
291
+ } finally {
292
+ await handle.close();
293
+ }
294
+ try {
295
+ try {
296
+ await link(temporary, target);
297
+ await syncDirectory(workspace);
298
+ } catch (error) {
299
+ if (!(error instanceof Error && "code" in error && error.code === "EEXIST")) {
300
+ throw error;
301
+ }
302
+ const existing = await readCheckpointFile(target);
303
+ if (
304
+ existing === null
305
+ || canonicalJson(existing) !== canonicalJson(checkpoint)
306
+ ) {
307
+ throw new ApplicationError(
308
+ "conflict",
309
+ "The exact node workspace already contains a different completion checkpoint.",
310
+ );
311
+ }
312
+ }
313
+ } finally {
314
+ await rm(temporary, { force: true });
315
+ }
316
+ }
317
+
318
+ export async function readOperationCompletionCheckpoint(options: {
319
+ readonly expected: OperationCheckpointExecutionIdentity;
320
+ readonly privateRoot: string;
321
+ readonly workspaceDirectory: string;
322
+ }): Promise<OperationCompletionCheckpoint | null> {
323
+ const workspace = await physicalPrivateWorkspace(
324
+ options.privateRoot,
325
+ options.workspaceDirectory,
326
+ );
327
+ const checkpoint = await readCheckpointFile(
328
+ join(workspace, OPERATION_COMPLETION_CHECKPOINT_FILE),
329
+ );
330
+ if (checkpoint === null) return null;
331
+ assertCheckpointIdentity(checkpoint.identity, options.expected);
332
+ return checkpoint;
333
+ }
@@ -0,0 +1,94 @@
1
+ import { Cause, Effect, Exit } from "effect";
2
+
3
+ export type OperationFailurePhase = "input" | "execution" | "output" | "media" | "capability" | "project" | "workspace" | "publication" | "checkpoint" | "cleanup";
4
+ export type OperationEffectFailure = Readonly<{
5
+ _tag: "OperationBoundaryFailure";
6
+ phase: OperationFailurePhase;
7
+ cause: unknown;
8
+ /** Earlier native failures; never part of the public rejection or a receipt. */
9
+ priorCause?: Cause.Cause<OperationEffectFailure>;
10
+ }>;
11
+
12
+ /** Native application ports preserve their existing public exception identity. */
13
+ export function operationBoundary<A>(
14
+ phase: OperationFailurePhase,
15
+ execute: () => A | Promise<A>,
16
+ ): Effect.Effect<A, OperationEffectFailure> {
17
+ return Effect.tryPromise({
18
+ try: async () => await execute(),
19
+ catch: (cause): OperationEffectFailure => ({ _tag: "OperationBoundaryFailure", phase, cause }),
20
+ });
21
+ }
22
+
23
+ export function operationValidation<A>(
24
+ phase: OperationFailurePhase,
25
+ evaluate: () => A,
26
+ ): Effect.Effect<A, OperationEffectFailure> {
27
+ return Effect.try({
28
+ try: evaluate,
29
+ catch: (cause): OperationEffectFailure => ({ _tag: "OperationBoundaryFailure", phase, cause }),
30
+ });
31
+ }
32
+
33
+ function operationCauseValue(cause: Cause.Cause<OperationEffectFailure>): unknown {
34
+ const failures = [
35
+ ...Array.from(Cause.failures(cause), failure => failure.cause),
36
+ ...Cause.defects(cause),
37
+ ];
38
+ if (failures.length === 1) return failures[0];
39
+ if (failures.length > 1) return new AggregateError(failures, "Operation execution and cleanup failed.");
40
+ return Cause.squash(cause);
41
+ }
42
+
43
+ export function operationExitValue<A>(exit: Exit.Exit<A, OperationEffectFailure>): A {
44
+ if (Exit.isSuccess(exit)) return exit.value;
45
+ throw operationCauseValue(exit.cause);
46
+ }
47
+
48
+ /** Preserve native finally precedence without losing the earlier typed Cause. */
49
+ export function operationFinally<A, R, R2>(
50
+ use: Effect.Effect<A, OperationEffectFailure, R>,
51
+ release: Effect.Effect<void, OperationEffectFailure, R2>,
52
+ ): Effect.Effect<A, OperationEffectFailure, R | R2> {
53
+ return Effect.uninterruptibleMask(restore => Effect.gen(function*() {
54
+ const result = yield* Effect.exit(restore(use));
55
+ const cleanup = yield* Effect.exit(release);
56
+ if (Exit.isSuccess(cleanup)) return yield* result;
57
+ const selected = Cause.failureOption(cleanup.cause);
58
+ const failure: OperationEffectFailure = selected._tag === "Some"
59
+ && Array.from(Cause.failures(cleanup.cause)).length === 1
60
+ && Array.from(Cause.defects(cleanup.cause)).length === 0
61
+ ? Exit.isSuccess(result) ? selected.value : {
62
+ ...selected.value,
63
+ priorCause: selected.value.priorCause === undefined
64
+ ? result.cause
65
+ : Cause.sequential(result.cause, selected.value.priorCause),
66
+ }
67
+ : {
68
+ _tag: "OperationBoundaryFailure",
69
+ phase: "cleanup",
70
+ cause: operationCauseValue(cleanup.cause),
71
+ ...(Exit.isFailure(result) ? { priorCause: result.cause } : {}),
72
+ };
73
+ return yield* Effect.fail(failure);
74
+ }));
75
+ }
76
+
77
+ /** Acquisition cannot escape before its native release has an owner. */
78
+ export function operationResource<A, B, R, R2, R3>(
79
+ acquire: Effect.Effect<A, OperationEffectFailure, R>,
80
+ use: (value: A) => Effect.Effect<B, OperationEffectFailure, R2>,
81
+ release: (value: A) => Effect.Effect<void, OperationEffectFailure, R3>,
82
+ ): Effect.Effect<B, OperationEffectFailure, R | R2 | R3> {
83
+ return Effect.uninterruptibleMask(restore => Effect.gen(function*() {
84
+ const value = yield* acquire;
85
+ return yield* operationFinally(Effect.suspend(() => restore(use(value))), Effect.suspend(() => release(value)));
86
+ }));
87
+ }
88
+
89
+ /** Compatibility root for a standalone operation; schedulers compose directly. */
90
+ export async function runStandaloneOperation<A>(
91
+ program: Effect.Effect<A, OperationEffectFailure>,
92
+ ): Promise<A> {
93
+ return operationExitValue(await Effect.runPromiseExit(program));
94
+ }
@@ -0,0 +1,224 @@
1
+ import type { Effect } from "effect";
2
+ import type { OperationEffectFailure } from "./operation-effects";
3
+ import type { z } from "zod";
4
+
5
+ import type { ApplicationContext } from "./context";
6
+
7
+ export const SLOPCAMERA_APPLICATION_TOOL_VERSION = "slopcamera-3.2.4" as const;
8
+
9
+ export const OPERATION_KINDS = [
10
+ "scene.inspect",
11
+ "scene.patch",
12
+ "scene.evaluate",
13
+ "scene.render",
14
+ "slopcamera.studio.run",
15
+ "spatial.project.snapshot",
16
+ "spatial.project.migrate",
17
+ "spatial.project.patch",
18
+ "spatial.project.restore",
19
+ "spatial.project.add-shot",
20
+ "spatial.project.add-candidate",
21
+ "spatial.project.select-candidate",
22
+ "spatial.project.reconcile",
23
+ "project.snapshot",
24
+ "analysis.project-inactivity",
25
+ "analysis.faces",
26
+ "analysis.music",
27
+ "analysis.scenes",
28
+ "analysis.project-auto-zooms",
29
+ "derive.edit-batch",
30
+ "project.commit-edits",
31
+ "derive.follow-faces",
32
+ "edit.create-revision",
33
+ "edit.create-candidate-revision",
34
+ "edit.bind-candidate-revision",
35
+ "edit.freeze-revision",
36
+ "iteration.create-candidate",
37
+ "iteration.create-matrix",
38
+ "iteration.select",
39
+ "project.promote-selection",
40
+ "render.bind-candidate-output",
41
+ "render.project-plan",
42
+ "render.project",
43
+ "render.materialize-selection",
44
+ "media.ingest",
45
+ "media.overlay",
46
+ "media.html-overlay",
47
+ "media.audio-effects",
48
+ "media.color-grade",
49
+ "gateway.image",
50
+ "gateway.video",
51
+ "gateway.speech",
52
+ "gateway.transcription",
53
+ "recording.start",
54
+ "recording.pause",
55
+ "recording.resume",
56
+ "recording.stop",
57
+ "slopcamera.diagram.check",
58
+ "slopcamera.diagram.render",
59
+ "slopcamera.image.vectorize",
60
+ "slopcamera.image.generate",
61
+ ] as const;
62
+
63
+ export type OperationKind = typeof OPERATION_KINDS[number];
64
+
65
+ export const RESOURCE_KINDS = [
66
+ "cpu",
67
+ "local-io",
68
+ "ffmpeg",
69
+ "vision",
70
+ "whisper",
71
+ "network",
72
+ "paid-call",
73
+ "project-render",
74
+ "project-publication",
75
+ "output-publication",
76
+ "capture-device",
77
+ "browser",
78
+ ] as const;
79
+
80
+ export type OperationResourceKind = typeof RESOURCE_KINDS[number];
81
+
82
+ export type OperationEffectClass =
83
+ | "pure"
84
+ | "local-read"
85
+ | "local-derived-write"
86
+ | "project-mutation"
87
+ | "paid-cloud"
88
+ | "live-control";
89
+
90
+ export type OperationResumeClass =
91
+ | "deterministic"
92
+ | "verified-receipt"
93
+ | "recoverable-transaction"
94
+ | "ambiguous-after-dispatch"
95
+ | "non-resumable-live";
96
+
97
+ export interface OperationResourceClaim {
98
+ readonly amount: number;
99
+ readonly resource: OperationResourceKind;
100
+ }
101
+
102
+ export interface OperationPolicy {
103
+ readonly cache: "none" | "exact-run" | "content-addressed";
104
+ readonly cancellable: boolean;
105
+ readonly effect: OperationEffectClass;
106
+ readonly maxDurationMs: number;
107
+ readonly maxFanOut: number;
108
+ readonly maxInputBytes: number;
109
+ readonly maxOutputBytes: number;
110
+ readonly preparation: readonly (
111
+ | "project-state"
112
+ | "recording-metadata"
113
+ | "screen-capture"
114
+ | "camera"
115
+ | "microphone"
116
+ | "system-audio"
117
+ | "typed-text"
118
+ | "window-metadata"
119
+ | "local-media"
120
+ | "provider-options"
121
+ )[];
122
+ readonly resources: readonly OperationResourceClaim[];
123
+ readonly resume: OperationResumeClass;
124
+ }
125
+
126
+ export interface BoundedOperationSummary {
127
+ readonly fields: Readonly<Record<string, boolean | null | number | string>>;
128
+ readonly kind: OperationKind;
129
+ }
130
+
131
+ export interface OperationExecutionContext {
132
+ readonly abortSignal: AbortSignal;
133
+ readonly application: ApplicationContext;
134
+ readonly expectedProjectGeneration?: string;
135
+ readonly runFence?: {
136
+ readonly generation: number;
137
+ readonly owner: string;
138
+ readonly token: string;
139
+ };
140
+ /**
141
+ * Ephemeral runner-owned state. It is never accepted from graph input or
142
+ * persisted as operation authority.
143
+ */
144
+ readonly workflow?: {
145
+ /**
146
+ * Revalidates the physical run fence and durable cancellation marker at
147
+ * the last safe point before an operation publishes external bytes.
148
+ */
149
+ beforePublication(): Promise<void>;
150
+ readonly nodeKey: string;
151
+ readonly nodePlanSha256: string;
152
+ readonly runId: string;
153
+ /** Private, deterministic, exact-run/node-plan staging directory. */
154
+ readonly workspaceDirectory: string;
155
+ };
156
+ }
157
+
158
+ interface LifecycleBase<Input, Output> {
159
+ execute(context: OperationExecutionContext, input: Input): Promise<Output>;
160
+ /** Local native composition only; never part of discovery or graph identity. */
161
+ executeEffect?(context: OperationExecutionContext, input: Input): Effect.Effect<Output, OperationEffectFailure>;
162
+ }
163
+
164
+ export interface PureLifecycle<Input, Output> extends LifecycleBase<Input, Output> {
165
+ readonly kind: "pure";
166
+ }
167
+
168
+ export interface LocalArtifactLifecycle<Input, Output> extends LifecycleBase<Input, Output> {
169
+ readonly kind: "local-artifact";
170
+ }
171
+
172
+ export interface ProjectTransactionLifecycle<Input, Output> extends LifecycleBase<Input, Output> {
173
+ readonly kind: "project-transaction";
174
+ }
175
+
176
+ export interface PaidDispatchLifecycle<Input, Output> extends LifecycleBase<Input, Output> {
177
+ readonly kind: "paid-dispatch";
178
+ }
179
+
180
+ export interface LiveControlLifecycle<Input, Output> extends LifecycleBase<Input, Output> {
181
+ readonly kind: "live-control";
182
+ }
183
+
184
+ export type OperationLifecycle<Input, Output> =
185
+ | PureLifecycle<Input, Output>
186
+ | LocalArtifactLifecycle<Input, Output>
187
+ | ProjectTransactionLifecycle<Input, Output>
188
+ | PaidDispatchLifecycle<Input, Output>
189
+ | LiveControlLifecycle<Input, Output>;
190
+
191
+ export interface OperationDefinition<
192
+ Kind extends OperationKind = OperationKind,
193
+ Input = unknown,
194
+ Output = unknown,
195
+ > {
196
+ readonly inputSchema: z.ZodType<Input>;
197
+ readonly inputSchemaId: string;
198
+ readonly kind: Kind;
199
+ readonly lifecycle: OperationLifecycle<Input, Output>;
200
+ readonly outputSchema: z.ZodType<Output>;
201
+ readonly outputSchemaId: string;
202
+ readonly policy: OperationPolicy;
203
+ /**
204
+ * Selects the operation-owned authoritative receipt after output parsing.
205
+ * The scheduler records this reference; it does not replace the receipt.
206
+ */
207
+ readonly receiptReference?: (output: Output) => string | undefined;
208
+ summarize(output: Output): BoundedOperationSummary;
209
+ readonly version: number;
210
+ }
211
+
212
+ export interface OperationRequest {
213
+ readonly input: unknown;
214
+ readonly kind: OperationKind;
215
+ readonly version: number;
216
+ }
217
+
218
+ export interface OperationResult {
219
+ readonly kind: OperationKind;
220
+ readonly output: unknown;
221
+ readonly receiptReference?: string;
222
+ readonly summary: BoundedOperationSummary;
223
+ readonly version: number;
224
+ }