@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,141 @@
1
+ import { ApplicationError } from "../application/errors";
2
+ import { Cause, Deferred, Effect, Exit, Fiber, FiberId, Layer, ManagedRuntime, Scope } from "effect";
3
+
4
+ export type WorkerFailure = Readonly<{
5
+ _tag: "WorkerBoundaryFailure";
6
+ phase: "protocol" | "admission" | "compute" | "retirement";
7
+ cause: unknown;
8
+ }>;
9
+
10
+ export function workerBoundary<A>(
11
+ phase: WorkerFailure["phase"], execute: () => A | Promise<A>,
12
+ ): Effect.Effect<A, WorkerFailure> {
13
+ return Effect.tryPromise({
14
+ try: async () => await execute(),
15
+ catch: (cause): WorkerFailure => ({ _tag: "WorkerBoundaryFailure", phase, cause }),
16
+ });
17
+ }
18
+
19
+ export function workerValidation<A>(
20
+ phase: WorkerFailure["phase"], execute: () => A,
21
+ ): Effect.Effect<A, WorkerFailure> {
22
+ return Effect.try({
23
+ try: execute,
24
+ catch: (cause): WorkerFailure => ({ _tag: "WorkerBoundaryFailure", phase, cause }),
25
+ });
26
+ }
27
+
28
+ export interface WorkerCompletion<A> {
29
+ readonly await: Effect.Effect<A, WorkerFailure>;
30
+ activate(): void;
31
+ complete(exit: Exit.Exit<A, WorkerFailure>): void;
32
+ fail(error: unknown): void;
33
+ succeed(value: A): void;
34
+ }
35
+
36
+ export class WorkerEffectRuntime {
37
+ readonly #runtime = ManagedRuntime.make(Layer.empty);
38
+ readonly #scope = Effect.runSync(Scope.make());
39
+ #active = 0;
40
+ #closed = false;
41
+ #closing: Promise<void> | undefined;
42
+ readonly serial = Effect.unsafeMakeSemaphore(1);
43
+
44
+ async run<A>(program: Effect.Effect<A, WorkerFailure>): Promise<A> {
45
+ const fiber = this.fork(program);
46
+ const exit = await this.#runtime.runPromiseExit(Fiber.join(fiber));
47
+ if (Exit.isSuccess(exit)) return exit.value;
48
+ const errors = [
49
+ ...Array.from(Cause.failures(exit.cause), failure => failure.cause),
50
+ ...Cause.defects(exit.cause),
51
+ ];
52
+ if (errors.length === 1) throw errors[0];
53
+ if (errors.length > 1) throw new AggregateError(errors, "Worker execution and retirement failed.");
54
+ throw Cause.squash(exit.cause);
55
+ }
56
+
57
+ fork<A, E>(program: Effect.Effect<A, E>): Fiber.RuntimeFiber<A, E> {
58
+ if (this.#closed) throw new ApplicationError("conflict", "Code-worker runtime is already closed.");
59
+ this.#active += 1;
60
+ try {
61
+ const fiber = this.#runtime.runFork(program, { scope: this.#scope });
62
+ fiber.addObserver(() => { this.#active -= 1; });
63
+ return fiber;
64
+ } catch (error) {
65
+ this.#active -= 1;
66
+ throw error;
67
+ }
68
+ }
69
+
70
+ /** Reserve in native tables before activation; all contenders settle one Deferred. */
71
+ completion<A>(timeoutMs: number, onDeadline: () => void): WorkerCompletion<A> {
72
+ const done = Deferred.unsafeMake<A, WorkerFailure>(FiberId.none);
73
+ let settled = false;
74
+ let activated = false;
75
+ const program = Deferred.await(done);
76
+ return {
77
+ await: program,
78
+ activate: () => {
79
+ if (activated || settled) return;
80
+ activated = true;
81
+ const watcher = this.fork(Effect.scoped(Effect.gen(function*() {
82
+ const deadline = yield* Effect.forkScoped(Effect.zipRight(
83
+ Effect.sleep(timeoutMs),
84
+ Effect.sync(() => { if (!settled) onDeadline(); }),
85
+ ));
86
+ deadline.addObserver(exit => {
87
+ if (Exit.isFailure(exit) && !settled) {
88
+ settled = true;
89
+ Deferred.unsafeDone(done, Effect.failCause(exit.cause));
90
+ }
91
+ });
92
+ // The consumer owns the terminal failure; this child owns only the deadline lifetime.
93
+ yield* Effect.asVoid(Effect.exit(program));
94
+ })));
95
+ watcher.addObserver(exit => {
96
+ if (Exit.isFailure(exit) && !settled) {
97
+ settled = true;
98
+ Deferred.unsafeDone(done, Effect.failCause(exit.cause));
99
+ }
100
+ });
101
+ },
102
+ complete: exit => {
103
+ if (settled) return;
104
+ settled = true;
105
+ Deferred.unsafeDone(done, exit);
106
+ },
107
+ succeed: value => {
108
+ if (settled) return;
109
+ settled = true;
110
+ Deferred.unsafeDone(done, Effect.succeed(value));
111
+ },
112
+ fail: cause => {
113
+ if (settled) return;
114
+ settled = true;
115
+ Deferred.unsafeDone(done, Effect.fail({ _tag: "WorkerBoundaryFailure", phase: "protocol", cause }));
116
+ },
117
+ };
118
+ }
119
+
120
+ alarm(timeoutMs: number, expire: () => void): () => void {
121
+ const completion = this.completion<void>(timeoutMs, () => {
122
+ completion.succeed(undefined);
123
+ expire();
124
+ });
125
+ completion.activate();
126
+ return () => completion.succeed(undefined);
127
+ }
128
+
129
+ get activeCount(): number { return this.#active; }
130
+
131
+ close(): Promise<void> {
132
+ this.#closed = true;
133
+ this.#closing ??= this.#close();
134
+ return this.#closing;
135
+ }
136
+
137
+ async #close(): Promise<void> {
138
+ await this.#runtime.runPromise(Scope.close(this.#scope, Exit.void));
139
+ await this.#runtime.dispose();
140
+ }
141
+ }
@@ -0,0 +1,435 @@
1
+ import { createHash } from "node:crypto";
2
+ import { closeSync, readFileSync } from "node:fs";
3
+ import { once } from "node:events";
4
+ import { createConnection, type Socket } from "node:net";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+
7
+ import { ApplicationError, asApplicationError } from "../application/errors";
8
+ import { canonicalJson } from "../core/canonical-json";
9
+ import {
10
+ isComputeGraphNode,
11
+ JsonValueSchema,
12
+ type AnyTrustedComputeDefinition,
13
+ type AuthoredWorkflowGraphV1,
14
+ type WorkflowOutputValue,
15
+ } from "./contracts";
16
+ import {
17
+ buildWorkflowRuntime,
18
+ buildWorkflowRuntimeFromParsedInput,
19
+ type WorkflowDefinition,
20
+ } from "./define-workflow";
21
+ import {
22
+ CODE_WORKER_PROTOCOL,
23
+ CodeWorkerRequestSchema,
24
+ CodeWorkerResponseSchema,
25
+ WorkerFrameDecoder,
26
+ encodeCodeWorkerDiagnosticBarrier,
27
+ encodeWorkerFrame,
28
+ type CodeWorkerRequest,
29
+ type CodeWorkerResponse,
30
+ } from "./worker-protocol";
31
+ import { establishCurrentWorkerProcessGroup } from "./worker-process-identity";
32
+
33
+ const WORKER_GENERATION = 1;
34
+ const GUARDIAN_READY = "guardian-ready\n";
35
+
36
+ function argument(name: string): string {
37
+ const index = process.argv.indexOf(name);
38
+ const value = index === -1 ? undefined : process.argv[index + 1];
39
+ if (value === undefined || value === "") {
40
+ throw new Error(`Missing code-worker argument: ${name}`);
41
+ }
42
+ return value;
43
+ }
44
+
45
+ function writeFrame(socket: Socket, message: unknown): Promise<void> {
46
+ const frame = encodeWorkerFrame(message);
47
+ return new Promise((resolveWrite, rejectWrite) => {
48
+ socket.write(frame, error => {
49
+ if (error === null || error === undefined) resolveWrite();
50
+ else rejectWrite(error);
51
+ });
52
+ });
53
+ }
54
+
55
+ function writeDiagnosticBarrier(
56
+ stream: NodeJS.WriteStream,
57
+ barrier: string,
58
+ diagnosticStream: "stderr" | "stdout",
59
+ ): Promise<void> {
60
+ const marker = encodeCodeWorkerDiagnosticBarrier(barrier, diagnosticStream);
61
+ return new Promise((resolveWrite, rejectWrite) => {
62
+ stream.write(marker, error => {
63
+ if (error === null || error === undefined) resolveWrite();
64
+ else rejectWrite(error);
65
+ });
66
+ });
67
+ }
68
+
69
+ async function writeResponse(
70
+ socket: Socket,
71
+ value: unknown,
72
+ ): Promise<void> {
73
+ const response = CodeWorkerResponseSchema.parse(value);
74
+ await Promise.all([
75
+ writeDiagnosticBarrier(process.stderr, response.diagnosticBarrier, "stderr"),
76
+ writeDiagnosticBarrier(process.stdout, response.diagnosticBarrier, "stdout"),
77
+ ]);
78
+ await writeFrame(socket, response);
79
+ }
80
+
81
+ function workerProtocolChunk(value: unknown): Uint8Array {
82
+ if (value instanceof Uint8Array) return value;
83
+ throw new TypeError("Code-worker protocol received a non-byte socket chunk.");
84
+ }
85
+
86
+ async function waitForGuardianReady(): Promise<void> {
87
+ process.stdin.setEncoding("utf8");
88
+ let input = "";
89
+ for await (const chunk of process.stdin) {
90
+ if (typeof chunk !== "string") {
91
+ throw new TypeError("Code-worker guardian startup gate was not UTF-8 text.");
92
+ }
93
+ input += chunk;
94
+ if (
95
+ input.length > GUARDIAN_READY.length
96
+ || !GUARDIAN_READY.startsWith(input)
97
+ ) {
98
+ throw new Error("Code-worker guardian startup gate is invalid.");
99
+ }
100
+ }
101
+ if (input !== GUARDIAN_READY) {
102
+ throw new Error("Code-worker guardian startup gate closed before readiness.");
103
+ }
104
+ }
105
+
106
+ function errorResponse(
107
+ request: CodeWorkerRequest,
108
+ error: unknown,
109
+ ): CodeWorkerResponse {
110
+ const failure = asApplicationError(error);
111
+ const rawCode = (
112
+ typeof error === "object"
113
+ && error !== null
114
+ && "code" in error
115
+ )
116
+ ? Reflect.get(error, "code")
117
+ : undefined;
118
+ const rawMessage = (
119
+ typeof error === "object"
120
+ && error !== null
121
+ && "message" in error
122
+ )
123
+ ? Reflect.get(error, "message")
124
+ : undefined;
125
+ const structuralCode = typeof rawCode === "string"
126
+ ? rawCode
127
+ : failure.code;
128
+ const structuralMessage = typeof rawMessage === "string"
129
+ ? rawMessage
130
+ : failure.message;
131
+ return {
132
+ diagnosticBarrier: request.requestId,
133
+ error: {
134
+ code: structuralCode === "cancelled"
135
+ ? "cancelled"
136
+ : structuralCode === "invalid-data" || structuralCode === "usage"
137
+ ? "invalid-output"
138
+ : "execution",
139
+ message: structuralMessage.slice(0, 2_000),
140
+ },
141
+ generation: request.generation,
142
+ kind: "response",
143
+ protocol: CODE_WORKER_PROTOCOL,
144
+ requestId: request.requestId,
145
+ status: "error",
146
+ };
147
+ }
148
+
149
+ async function main(): Promise<void> {
150
+ const bundlePath = argument("--bundle");
151
+ const expectedSha256 = argument("--sha256");
152
+ const socketPath = argument("--socket");
153
+ const preparationLeaseFd = Number(argument("--preparation-lease-fd"));
154
+ if (
155
+ !Number.isSafeInteger(preparationLeaseFd)
156
+ || preparationLeaseFd < 0
157
+ || (preparationLeaseFd > 0 && preparationLeaseFd < 3)
158
+ ) {
159
+ throw new Error("Code-worker preparation lease descriptor is invalid.");
160
+ }
161
+ let preparationLeaseReleased = preparationLeaseFd === 0;
162
+ const releasePreparationLease = () => {
163
+ if (preparationLeaseReleased) return;
164
+ closeSync(preparationLeaseFd);
165
+ preparationLeaseReleased = true;
166
+ };
167
+ establishCurrentWorkerProcessGroup();
168
+ // Authored modules may execute arbitrary synchronous top-level code. Do not
169
+ // read or evaluate them until the parent has installed the lease guardian.
170
+ // If the parent dies first, pipe EOF makes this worker exit without import.
171
+ await waitForGuardianReady();
172
+ const workerEntryBytes = readFileSync(fileURLToPath(import.meta.url));
173
+ const workerEntrySha256 = createHash("sha256")
174
+ .update(workerEntryBytes)
175
+ .digest("hex");
176
+ const bundleBytes = readFileSync(bundlePath);
177
+ const actualSha256 = createHash("sha256").update(bundleBytes).digest("hex");
178
+ if (actualSha256 !== expectedSha256) {
179
+ throw new Error("Code-worker bundle hash does not match the requested identity.");
180
+ }
181
+ const loaded: unknown = await import(
182
+ `${pathToFileURL(bundlePath).href}?sha256=${actualSha256}`
183
+ );
184
+ if (typeof loaded !== "object" || loaded === null || !("default" in loaded)) {
185
+ throw new Error("Workflow bundle must have one default workflow definition export.");
186
+ }
187
+ const definition = Reflect.get(loaded, "default") as WorkflowDefinition<
188
+ unknown,
189
+ WorkflowOutputValue
190
+ >;
191
+ let computeDefinitions = new Map<string, AnyTrustedComputeDefinition>();
192
+ let graph: AuthoredWorkflowGraphV1 | undefined;
193
+ const protocol = createConnection({ path: socketPath });
194
+ await once(protocol, "connect");
195
+ await writeFrame(protocol, {
196
+ bunRevision: Bun.revision,
197
+ bunVersion: Bun.version,
198
+ bundleSha256: actualSha256,
199
+ generation: WORKER_GENERATION,
200
+ kind: "hello",
201
+ protocol: CODE_WORKER_PROTOCOL,
202
+ workerEntrySha256,
203
+ });
204
+
205
+ const decoder = new WorkerFrameDecoder();
206
+ const activeComputations = new Map<string, AbortController>();
207
+ const queuedComputeRequests = new Map<string, Extract<
208
+ CodeWorkerRequest,
209
+ { readonly action: "compute" }
210
+ >>();
211
+ const terminallyCancelledQueuedRequests = new Set<string>();
212
+ let requestTail = Promise.resolve();
213
+
214
+ const cancellationError = (request: Extract<
215
+ CodeWorkerRequest,
216
+ { readonly action: "compute" }
217
+ >) => new ApplicationError(
218
+ "cancelled",
219
+ `Compute node ${request.nodeKey} was cancelled.`,
220
+ );
221
+
222
+ const executeCompute = async (
223
+ request: Extract<CodeWorkerRequest, { readonly action: "compute" }>,
224
+ ): Promise<void> => {
225
+ queuedComputeRequests.delete(request.requestId);
226
+ if (terminallyCancelledQueuedRequests.delete(request.requestId)) return;
227
+ const abortController = new AbortController();
228
+ activeComputations.set(request.requestId, abortController);
229
+ let response: CodeWorkerResponse;
230
+ try {
231
+ const node = graph?.nodes.find(candidate => candidate.key === request.nodeKey);
232
+ const compute = computeDefinitions.get(request.computeKey);
233
+ if (
234
+ node === undefined
235
+ || !isComputeGraphNode(node)
236
+ || node.executor.compute.key !== request.computeKey
237
+ || compute === undefined
238
+ ) {
239
+ response = CodeWorkerResponseSchema.parse({
240
+ diagnosticBarrier: request.requestId,
241
+ error: {
242
+ code: "unknown-compute",
243
+ message: `Unknown compute callback: ${request.computeKey}`,
244
+ },
245
+ generation: request.generation,
246
+ kind: "response",
247
+ protocol: CODE_WORKER_PROTOCOL,
248
+ requestId: request.requestId,
249
+ status: "error",
250
+ });
251
+ } else {
252
+ const input = compute.inputSchema.parse(request.input);
253
+ const inputJson = JsonValueSchema.parse(input);
254
+ if (
255
+ new TextEncoder().encode(canonicalJson(inputJson)).byteLength
256
+ > node.executor.compute.bounds.maxInputBytes
257
+ ) {
258
+ throw new Error(
259
+ `Compute input exceeds its bound for ${request.nodeKey}.`,
260
+ );
261
+ }
262
+ const output = compute.outputSchema.parse(await compute.run(input, {
263
+ abortSignal: abortController.signal,
264
+ nodeKey: request.nodeKey,
265
+ replayAcknowledged: request.replayAcknowledged,
266
+ }));
267
+ if (abortController.signal.aborted) {
268
+ throw cancellationError(request);
269
+ }
270
+ const outputJson = JsonValueSchema.parse(output);
271
+ if (
272
+ new TextEncoder().encode(canonicalJson(outputJson)).byteLength
273
+ > node.executor.compute.bounds.maxOutputBytes
274
+ ) {
275
+ throw new Error(
276
+ `Compute output exceeds its bound for ${request.nodeKey}.`,
277
+ );
278
+ }
279
+ response = CodeWorkerResponseSchema.parse({
280
+ diagnosticBarrier: request.requestId,
281
+ generation: request.generation,
282
+ kind: "response",
283
+ output: outputJson,
284
+ protocol: CODE_WORKER_PROTOCOL,
285
+ requestId: request.requestId,
286
+ status: "ok",
287
+ });
288
+ }
289
+ } catch (error) {
290
+ response = errorResponse(
291
+ request,
292
+ abortController.signal.aborted
293
+ ? cancellationError(request)
294
+ : error,
295
+ );
296
+ }
297
+ try {
298
+ await writeResponse(protocol, response);
299
+ } finally {
300
+ activeComputations.delete(request.requestId);
301
+ }
302
+ };
303
+
304
+ const executeRequest = async (request: CodeWorkerRequest): Promise<void> => {
305
+ if (request.action === "shutdown") {
306
+ await writeResponse(protocol, {
307
+ diagnosticBarrier: request.requestId,
308
+ generation: request.generation,
309
+ kind: "response",
310
+ output: { stopped: true },
311
+ protocol: CODE_WORKER_PROTOCOL,
312
+ requestId: request.requestId,
313
+ status: "ok",
314
+ });
315
+ protocol.destroy();
316
+ return;
317
+ }
318
+ if (request.action === "compute") {
319
+ await executeCompute(request);
320
+ return;
321
+ }
322
+ if (request.action === "cancel") {
323
+ throw new ApplicationError(
324
+ "internal",
325
+ "Code-worker cancellation escaped immediate dispatch.",
326
+ );
327
+ }
328
+ let response: CodeWorkerResponse;
329
+ try {
330
+ // The guardian owns crash-safe retention of the preparation lease from
331
+ // here. Drop the worker's copy before authored build code begins so this
332
+ // long-lived process cannot strand the full machine budget.
333
+ releasePreparationLease();
334
+ const built = request.inputMode === "parsed"
335
+ ? buildWorkflowRuntimeFromParsedInput(
336
+ definition,
337
+ { list: () => request.registry },
338
+ request.workflowInput,
339
+ )
340
+ : buildWorkflowRuntime(
341
+ definition,
342
+ { list: () => request.registry },
343
+ request.workflowInput,
344
+ );
345
+ graph = built.graph;
346
+ computeDefinitions = new Map(
347
+ built.computeDefinitions.map(compute => [compute.key, compute]),
348
+ );
349
+ response = CodeWorkerResponseSchema.parse({
350
+ diagnosticBarrier: request.requestId,
351
+ generation: request.generation,
352
+ kind: "response",
353
+ output: {
354
+ graph: built.graph,
355
+ input: built.input,
356
+ },
357
+ protocol: CODE_WORKER_PROTOCOL,
358
+ requestId: request.requestId,
359
+ status: "ok",
360
+ });
361
+ } catch (error) {
362
+ response = errorResponse(request, error);
363
+ }
364
+ await writeResponse(protocol, response);
365
+ };
366
+
367
+ for await (const chunk of protocol) {
368
+ for (const message of decoder.push(workerProtocolChunk(chunk))) {
369
+ const parsed = CodeWorkerRequestSchema.safeParse(message);
370
+ if (!parsed.success) continue;
371
+ const request = parsed.data;
372
+ if (request.generation !== WORKER_GENERATION) {
373
+ await writeResponse(
374
+ protocol,
375
+ errorResponse(request, new Error("Code-worker generation mismatch.")),
376
+ );
377
+ continue;
378
+ }
379
+ if (request.action === "cancel") {
380
+ const active = activeComputations.get(request.targetRequestId);
381
+ const queued = queuedComputeRequests.get(request.targetRequestId);
382
+ if (active !== undefined) {
383
+ active.abort(new ApplicationError(
384
+ "cancelled",
385
+ `Compute request ${request.targetRequestId} was cancelled.`,
386
+ ));
387
+ } else if (queued !== undefined) {
388
+ queuedComputeRequests.delete(request.targetRequestId);
389
+ terminallyCancelledQueuedRequests.add(request.targetRequestId);
390
+ // Complete a queued cancellation immediately. Otherwise the client
391
+ // waiter would retain its original execution timeout while unrelated
392
+ // active authored work is still ahead of it in request order.
393
+ await writeResponse(protocol, errorResponse(
394
+ queued,
395
+ cancellationError(queued),
396
+ ));
397
+ }
398
+ await writeResponse(protocol, {
399
+ diagnosticBarrier: request.requestId,
400
+ generation: request.generation,
401
+ kind: "response",
402
+ output: {
403
+ cancellation: active !== undefined
404
+ ? "active"
405
+ : queued !== undefined
406
+ ? "queued"
407
+ : "missing",
408
+ },
409
+ protocol: CODE_WORKER_PROTOCOL,
410
+ requestId: request.requestId,
411
+ status: "ok",
412
+ });
413
+ continue;
414
+ }
415
+ if (request.action === "compute") {
416
+ queuedComputeRequests.set(request.requestId, request);
417
+ }
418
+ requestTail = requestTail
419
+ .then(async () => await executeRequest(request))
420
+ .catch(() => {
421
+ protocol.destroy();
422
+ });
423
+ }
424
+ }
425
+ for (const abortController of activeComputations.values()) {
426
+ abortController.abort(new ApplicationError(
427
+ "cancelled",
428
+ "Code-worker protocol closed during compute.",
429
+ ));
430
+ }
431
+ decoder.finish();
432
+ protocol.destroy();
433
+ }
434
+
435
+ await main();