@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,290 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { Buffer } from 'node:buffer';
3
+ import process from 'node:process';
4
+ import { clearTimeout, setTimeout } from 'node:timers';
5
+ import { createRequire } from 'node:module';
6
+ import { lstat, mkdir, readFile, realpath, writeFile } from 'node:fs/promises';
7
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
8
+ import { fileURLToPath, pathToFileURL } from 'node:url';
9
+
10
+ export const FPS = Object.freeze({ numerator: 24, denominator: 1 });
11
+ export const ENERGY = Object.freeze({ incident: 100, shadedFraction: 0.62, reflectance: 0.18 });
12
+ const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex');
13
+
14
+ export function validateOptions(input) {
15
+ if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('Expected render options');
16
+ const allowed = new Set(['runtimeRoot', 'outputRoot', 'width', 'height', 'frames', 'startFrame']);
17
+ if (Object.keys(input).some((key) => !allowed.has(key))) throw new Error('Unknown render option');
18
+ for (const key of ['runtimeRoot', 'outputRoot']) if (typeof input[key] !== 'string' || !isAbsolute(input[key])) throw new Error(`${key} must be absolute`);
19
+ const value = { ...input, width: input.width ?? 768, height: input.height ?? 432, frames: input.frames ?? 96, startFrame: input.startFrame ?? 0 };
20
+ for (const [key, min, max] of [['width', 384, 1024], ['height', 216, 1024], ['frames', 1, 240], ['startFrame', 0, 100000]]) {
21
+ if (!Number.isSafeInteger(value[key]) || value[key] < min || value[key] > max) throw new Error(`${key} is outside the bounded profile`);
22
+ }
23
+ if (value.width * 9 !== value.height * 16) throw new Error('The authored graphic requires a 16:9 frame');
24
+ return Object.freeze(value);
25
+ }
26
+
27
+ export function rejectAmbientGpuOverrides(env) {
28
+ const names = Object.keys(env).filter((name) => /^(VGPU_|NODE_OPTIONS$|NODE_PATH$)/u.test(name));
29
+ if (names.length) throw new Error(`Remove ambient runtime overrides: ${names.sort().join(', ')}`);
30
+ }
31
+
32
+ export function verifyMetalHardware(adapter, hardware) {
33
+ if (adapter?.type !== 'gpu' || hardware?.isFallbackAdapter !== false || !hardware.vendor || !hardware.device
34
+ || !/apple|amd|radeon|intel|nvidia/iu.test(`${hardware.vendor} ${hardware.device}`)
35
+ || !/metal/iu.test(`${hardware.architecture} ${hardware.description}`)) throw new Error('No identifiable non-fallback Metal hardware observed');
36
+ return { ...Object.fromEntries(['vendor', 'architecture', 'device', 'description', 'backend', 'backendType'].flatMap((key) => typeof hardware[key] === 'string' ? [[key, hardware[key].slice(0, 256)]] : [])), isFallbackAdapter: false };
37
+ }
38
+
39
+ export function frameSchedule(startFrame, frames) {
40
+ if (!Number.isSafeInteger(startFrame) || startFrame < 0 || startFrame > 100000 || !Number.isSafeInteger(frames) || frames < 1 || frames > 240) throw new Error('Invalid frame interval');
41
+ return Array.from({ length: frames }, (_, index) => ({ index, absoluteFrame: startFrame + index, timeNumerator: startFrame + index, timeDenominator: FPS.numerator, timeSeconds: (startFrame + index) / FPS.numerator }));
42
+ }
43
+
44
+ export function energySplit({ incident, shadedFraction, reflectance }) {
45
+ if (![incident, shadedFraction, reflectance].every(Number.isFinite) || incident <= 0 || incident > 10000 || shadedFraction < 0 || shadedFraction > 1 || reflectance < 0 || reflectance > 1) throw new Error('Invalid illustrative energy split');
46
+ const blocked = incident * shadedFraction;
47
+ const reflected = (incident - blocked) * reflectance;
48
+ const absorbed = incident - blocked - reflected;
49
+ return Object.freeze({ incident, blocked, reflected, absorbed });
50
+ }
51
+
52
+ const COLOR_FUNCTIONS = `
53
+ fn linear(c: vec3f) -> vec3f { return select(c / 12.92, pow((c + 0.055) / 1.055, vec3f(2.4)), c > vec3f(0.04045)); }
54
+ fn srgb(c: vec3f) -> vec3f { let x = clamp(c, vec3f(0), vec3f(1)); return select(x * 12.92, 1.055 * pow(x, vec3f(1.0 / 2.4)) - 0.055, x > vec3f(0.0031308)); }
55
+ `;
56
+
57
+ export const CALIBRATION_WGSL = `${COLOR_FUNCTIONS}
58
+ @fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
59
+ var c = vec3f(1, 0, 0);
60
+ if (uv.x >= 0.5 && uv.y < 0.5) { c = vec3f(0, 1, 0); }
61
+ if (uv.x < 0.5 && uv.y >= 0.5) { c = vec3f(0, 0, 1); }
62
+ if (uv.x >= 0.5 && uv.y >= 0.5) { c = linear(vec3f(128.0 / 255.0)); }
63
+ return vec4f(srgb(c), 1);
64
+ }`;
65
+
66
+ export const HEAT_FIELD_WGSL = `${COLOR_FUNCTIONS}
67
+ struct Params { time: f32, blocked: f32, reflected: f32, absorbed: f32 }
68
+ @group(0) @binding(0) var<uniform> params: Params;
69
+ fn line(p: vec2f, a: vec2f, b: vec2f, thickness: f32) -> f32 {
70
+ let delta = b - a;
71
+ let d = length(p - a - delta * clamp(dot(p - a, delta) / dot(delta, delta), 0.0, 1.0));
72
+ return 1.0 - smoothstep(thickness, thickness + 0.0015, d);
73
+ }
74
+ fn rect(p: vec2f, lo: vec2f, hi: vec2f, radius: f32) -> f32 {
75
+ let q = abs(p - (lo + hi) * 0.5) - (hi - lo) * 0.5 + radius;
76
+ let d = length(max(q, vec2f(0))) + min(max(q.x, q.y), 0.0) - radius;
77
+ return 1.0 - smoothstep(-0.001, 0.001, d);
78
+ }
79
+ @fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
80
+ let p = uv;
81
+ let amber = linear(vec3f(1.0, 0.68, 0.24));
82
+ let cyan = linear(vec3f(0.28, 0.87, 0.87));
83
+ let purple = linear(vec3f(0.67, 0.57, 0.95));
84
+ var c = linear(vec3f(0.027, 0.055, 0.085));
85
+ c += linear(vec3f(0.035, 0.075, 0.09)) * exp(-4.0 * length((p - vec2f(0.48, 0.5)) * vec2f(1, 1.7)));
86
+ let card = rect(p, vec2f(0.035, 0.22), vec2f(0.695, 0.79), 0.014);
87
+ c = mix(c, linear(vec3f(0.05, 0.093, 0.12)), card);
88
+ let grid = max(1.0 - smoothstep(0.0, 0.001, abs(fract(p.x * 28.0) - 0.5) / 28.0), 1.0 - smoothstep(0.0, 0.001, abs(fract(p.y * 18.0) - 0.5) / 18.0));
89
+ c += linear(vec3f(0.065, 0.1, 0.12)) * grid * card * 0.28;
90
+ let sun = vec2f(0.122, 0.365);
91
+ c += amber * 0.08 * exp(-30.0 * length((p - sun) * vec2f(1, 0.5625)));
92
+ c = mix(c, amber, 1.0 - smoothstep(0.025, 0.027, length((p - sun) * vec2f(1, 0.5625))));
93
+ // Rays carry a periodic pulse; the energy split remains fixed and illustrative.
94
+ for (var i = 0; i < 5; i += 1) {
95
+ let start = vec2f(0.18, 0.30 + f32(i) * 0.064);
96
+ let finish = vec2f(0.60, 0.49 + f32(i) * 0.048);
97
+ let ray = line(p, start, finish, 0.0012);
98
+ let pulse = pow(0.5 + 0.5 * cos((p.x - params.time * 0.14 + f32(i) * 0.016) * 60.0), 12.0);
99
+ c = mix(c, amber, ray * (0.30 + 0.65 * pulse));
100
+ }
101
+ let wall = rect(p, vec2f(0.53, 0.38), vec2f(0.645, 0.72), 0.003);
102
+ c = mix(c, linear(vec3f(0.25, 0.34, 0.36)), wall);
103
+ let glass = rect(p, vec2f(0.543, 0.405), vec2f(0.632, 0.682), 0.001);
104
+ let heat = smoothstep(0.49, 0.68, p.y) * (0.70 + 0.08 * sin(params.time * 2.0 + p.y * 26.0 + p.x * 19.0));
105
+ c = mix(c, mix(linear(vec3f(0.08, 0.25, 0.31)), amber * 0.32, heat), glass);
106
+ c = mix(c, cyan * 0.55, line(p, vec2f(0.587, 0.405), vec2f(0.587, 0.682), 0.001));
107
+ c = mix(c, cyan * 0.30, line(p, vec2f(0.543, 0.545), vec2f(0.632, 0.545), 0.001));
108
+ // A canopy and its qualitative shade are separate from the numeric data model.
109
+ c = mix(c, linear(vec3f(0.13, 0.27, 0.31)), rect(p, vec2f(0.45, 0.355), vec2f(0.65, 0.388), 0.003));
110
+ c = mix(c, cyan, line(p, vec2f(0.45, 0.357), vec2f(0.65, 0.357), 0.0014));
111
+ c = mix(c, cyan * 0.65, line(p, vec2f(0.41, 0.72), vec2f(0.667, 0.72), 0.001));
112
+ c = mix(c, purple, line(p, vec2f(0.545, 0.60), vec2f(0.454, 0.65), 0.0013) * (0.55 + 0.4 * sin(params.time * 4.0) * sin(params.time * 4.0)));
113
+ c = mix(c, purple, line(p, vec2f(0.454, 0.65), vec2f(0.47, 0.631), 0.0013));
114
+ c = mix(c, purple, line(p, vec2f(0.454, 0.65), vec2f(0.477, 0.648), 0.0013));
115
+ let quantities = array<f32, 3>(params.blocked, params.reflected, params.absorbed);
116
+ let colors = array<vec3f, 3>(cyan, purple, amber);
117
+ for (var row = 0; row < 3; row += 1) {
118
+ let y = 0.38 + f32(row) * 0.148;
119
+ c = mix(c, linear(vec3f(0.12, 0.17, 0.20)), rect(p, vec2f(0.735, y), vec2f(0.957, y + 0.017), 0.003));
120
+ c = mix(c, colors[row], rect(p, vec2f(0.735, y), vec2f(0.735 + 0.222 * quantities[row], y + 0.017), 0.003));
121
+ }
122
+ c = mix(c, linear(vec3f(0.12, 0.2, 0.24)), line(p, vec2f(0.035, 0.848), vec2f(0.962, 0.848), 0.0007));
123
+ return vec4f(srgb(c), 1);
124
+ }`;
125
+
126
+ // Original 5×7 bitmap lettering keeps this optional example font- and browser-free.
127
+ const GLYPHS = {
128
+ A:'01110100011000111111100011000110001', B:'11110100011000111110100011000111110', C:'01111100001000010000100001000001111', D:'11110100011000110001100011000111110', E:'11111100001000011110100001000011111', F:'11111100001000011110100001000010000', G:'01111100001000010111100011000101111', H:'10001100011000111111100011000110001', I:'11111001000010000100001000010011111', J:'00111000100001000010000101001001100', K:'10001100101010011000101001001010001', L:'10000100001000010000100001000011111', M:'10001110111010110101100011000110001', N:'10001110011010110011100011000110001', O:'01110100011000110001100011000101110', P:'11110100011000111110100001000010000', Q:'01110100011000110001101011001001101', R:'11110100011000111110101001001010001', S:'01111100001000001110000010000111110', T:'11111001000010000100001000010000100', U:'10001100011000110001100011000101110', V:'10001100011000110001100010101000100', W:'10001100011000110101101011101110001', X:'10001100010101000100010101000110001', Y:'10001100010101000100001000010000100', Z:'11111000010001000100010001000011111',
129
+ '0':'01110100011001110101110011000101110', '1':'00100011000010000100001000010001110', '2':'01110100010000100010001000100011111', '3':'11110000010000101110000010000111110', '4':'00010001100101010010111110001000010', '5':'11111100001000011110000010000111110', '6':'01110100001000011110100011000101110', '7':'11111000010001000100010000100001000', '8':'01110100011000101110100011000101110', '9':'01110100011000101111000010000101110', '%':'11001110100001000100010001001110011', '/':'00001000100001000100010000100010000', '.':'00000000000000000000000000011000110', '-':'00000000000000011111000000000000000', ':':'00000011000110000000011000110000000', ' ':'00000000000000000000000000000000000',
130
+ };
131
+
132
+ export function annotate(rgba, width, height, frame) {
133
+ if (!(rgba instanceof Uint8Array) || rgba.length !== width * height * 4) throw new Error('Invalid RGBA raster');
134
+ const unit = width / 768;
135
+ function text(message, x, y, size, color) {
136
+ let cursor = x * unit;
137
+ const scale = size * unit;
138
+ for (const character of message) {
139
+ const bits = GLYPHS[character];
140
+ if (!bits) throw new Error(`Unsupported authored glyph ${character}`);
141
+ for (let gy = 0; gy < 7; gy++) for (let gx = 0; gx < 5; gx++) if (bits[gy * 5 + gx] === '1') {
142
+ for (let py = Math.floor(y * unit + gy * scale); py < Math.floor(y * unit + (gy + 1) * scale); py++) for (let px = Math.floor(cursor + gx * scale); px < Math.floor(cursor + (gx + 1) * scale); px++) {
143
+ if (px < 0 || px >= width || py < 0 || py >= height) throw new Error('Authored label exceeds frame');
144
+ rgba.set([...color, 255], (py * width + px) * 4);
145
+ }
146
+ }
147
+ cursor += 6 * scale;
148
+ }
149
+ }
150
+ text('SOLAR ENERGY', 28, 27, 3, [235, 243, 240]);
151
+ text('SHADE / RAY FLOW', 29, 64, 1.5, [126, 162, 176]);
152
+ text('100 UNITS', 557, 28, 2.5, [255, 187, 92]);
153
+ text('NORMALIZED INPUT', 557, 57, 1.4, [126, 162, 176]);
154
+ text('CANOPY', 342, 128, 1.3, [116, 220, 216]);
155
+ text('GLAZING', 377, 319, 1.3, [164, 190, 197]);
156
+ text('62% BLOCKED', 564, 126, 1.5, [106, 223, 219]);
157
+ text('7% REFLECTED', 564, 190, 1.5, [178, 155, 248]);
158
+ text('31% ABSORBED', 564, 254, 1.5, [255, 187, 92]);
159
+ text('ILLUSTRATIVE ENERGY SPLIT', 28, 386, 1.6, [196, 216, 219]);
160
+ text('T ' + frame.timeSeconds.toFixed(2) + ' S', 571, 386, 1.6, [126, 162, 176]);
161
+ return rgba;
162
+ }
163
+
164
+ export function verifyCalibration(bytes, width, height) {
165
+ const expected = [[1, 1, [255, 0, 0, 255]], [width - 2, 1, [0, 255, 0, 255]], [1, height - 2, [0, 0, 255, 255]], [width - 2, height - 2, [128, 128, 128, 255]]];
166
+ if (bytes.length !== width * height * 4) throw new Error('Calibration byte count mismatch');
167
+ for (const [x, y, pixel] of expected) for (let channel = 0; channel < 4; channel++) if (Math.abs(bytes[(y * width + x) * 4 + channel] - pixel[channel]) > 1) throw new Error('GPU orientation or sRGB calibration failed');
168
+ return { origin: 'top-left', channels: 'rgba', alpha: 'opaque', graySrgbByte: 128, toleranceBytes: 1 };
169
+ }
170
+
171
+ export function tagSrgbPng(png) {
172
+ if (png.length < 33 || png.subarray(0, 8).toString('hex') !== '89504e470d0a1a0a' || png.subarray(12, 16).toString() !== 'IHDR') throw new Error('Expected an encoded PNG');
173
+ // Standard PNG sRGB chunk: one-byte perceptual intent, with the specified CRC.
174
+ // No approximate gamma exponent replaces the shader's piecewise sRGB transfer.
175
+ return Buffer.concat([png.subarray(0, 33), Buffer.from('000000017352474200aece1ce9', 'hex'), png.subarray(33)]);
176
+ }
177
+
178
+ async function physical(path, type) {
179
+ const stat = await lstat(path);
180
+ if (stat.isSymbolicLink() || !(type === 'directory' ? stat.isDirectory() : stat.isFile()) || await realpath(path) !== path) throw new Error(`Expected physical ${type}: ${path}`);
181
+ return stat;
182
+ }
183
+
184
+ export async function renderHeatField(input) {
185
+ const options = validateOptions(input);
186
+ rejectAmbientGpuOverrides(process.env);
187
+ if (process.platform !== 'darwin') throw new Error('This qualified example requires macOS Metal; qualify another backend separately');
188
+ if (Number(process.versions.node.split('.')[0]) < 22) throw new Error('vgpu requires Node22+');
189
+ await physical(options.runtimeRoot, 'directory');
190
+ await physical(dirname(options.outputRoot), 'directory');
191
+ const runtimeRequire = createRequire(join(options.runtimeRoot, 'package.json'));
192
+ const versions = {};
193
+ for (const [name, expected] of [['vgpu', '0.4.1'], ['@vgpu/adapter-node', '0.4.1'], ['webgpu', '0.4.0'], ['pngjs', '7.0.0']]) {
194
+ const packagePath = join(options.runtimeRoot, 'node_modules', name, 'package.json');
195
+ await physical(packagePath, 'file');
196
+ const value = JSON.parse(await readFile(packagePath, 'utf8'));
197
+ if (value.version !== expected) throw new Error(`Expected ${name}@${expected}`);
198
+ versions[name] = expected;
199
+ }
200
+ const source = await readFile(fileURLToPath(import.meta.url));
201
+ const lock = await readFile(join(options.runtimeRoot, 'package-lock.json'));
202
+ const nativePath = join(options.runtimeRoot, 'node_modules/webgpu/dist/darwin-universal.dawn.node');
203
+ await physical(nativePath, 'file');
204
+ const nativeSha256 = sha256(await readFile(nativePath));
205
+ const nodeSha256 = sha256(await readFile(await realpath(process.execPath)));
206
+ await mkdir(options.outputRoot, { mode: 0o700 });
207
+ await writeFile(join(options.outputRoot, 'heat-field.source.mjs'), source, { flag: 'wx', mode: 0o600 });
208
+ await writeFile(join(options.outputRoot, 'runtime-lock.json'), lock, { flag: 'wx', mode: 0o600 });
209
+ await writeFile(join(options.outputRoot, 'intent.json'), JSON.stringify({ kind: 'slopcamera-vgpu-example-intent', options: { width: options.width, height: options.height, frames: options.frames, startFrame: options.startFrame }, sourceSha256: sha256(source), lockSha256: sha256(lock), execution: 'explicit-trusted-current-user', hermetic: false, status: 'incomplete-until-manifest' }, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
210
+ const deadline = setTimeout(() => { process.stderr.write('GPU example exceeded120s; incomplete outputs retained\n'); process.kill(process.pid, 'SIGTERM'); }, 120000);
211
+ deadline.unref();
212
+ let gpu;
213
+ try {
214
+ const { init, effect, target, frame } = await import(pathToFileURL(runtimeRequire.resolve('vgpu/node')).href);
215
+ const { PNG } = runtimeRequire('pngjs');
216
+ gpu = await init({ adapter: 'hardware', backend: 'webgpu', backendFlags: ['backend=metal'] });
217
+ const hardware = gpu.device.adapterInfo;
218
+ const adapterInfo = verifyMetalHardware(gpu.adapter, hardware);
219
+ const errors = [];
220
+ gpu.onError((error) => { errors.push(error); });
221
+ const settle = async () => { await gpu.settled(); if (errors.length) throw new Error('GPU validation failed: ' + errors.map((error) => error.code ?? 'unknown').join(', ')); };
222
+ const output = target(gpu, { size: [options.width, options.height], format: 'rgba8unorm' });
223
+ const calibration = effect(gpu, CALIBRATION_WGSL);
224
+ await calibration.compile(output);
225
+ frame(gpu, (f) => f.pass(output, calibration));
226
+ await settle();
227
+ const calibrationBytes = await output.read();
228
+ await settle();
229
+ const calibrationEvidence = verifyCalibration(calibrationBytes, options.width, options.height);
230
+ const calibrationPng = tagSrgbPng(PNG.sync.write({ width: options.width, height: options.height, data: Buffer.from(calibrationBytes) }, { colorType: 2 }));
231
+ await writeFile(join(options.outputRoot, 'calibration.png'), calibrationPng, { flag: 'wx', mode: 0o600 });
232
+ const energy = energySplit(ENERGY);
233
+ const params = { time: 0, blocked: energy.blocked / energy.incident, reflected: energy.reflected / energy.incident, absorbed: energy.absorbed / energy.incident };
234
+ const graphic = effect(gpu, HEAT_FIELD_WGSL, { set: { params } });
235
+ await graphic.compile(output);
236
+ const frames = [];
237
+ let totalBytes = calibrationPng.length;
238
+ for (const item of frameSchedule(options.startFrame, options.frames)) {
239
+ graphic.set({ params: { ...params, time: item.timeSeconds } });
240
+ frame(gpu, (f) => f.pass(output, graphic));
241
+ await settle();
242
+ const raw = await output.read();
243
+ await settle();
244
+ if (raw.length !== options.width * options.height * 4) throw new Error('RGBA readback size mismatch');
245
+ for (let index = 3; index < raw.length; index += 4) if (raw[index] !== 255) throw new Error('Expected opaque GPU output');
246
+ const rawSha256 = sha256(raw);
247
+ const annotated = annotate(raw.slice(), options.width, options.height, item);
248
+ const png = tagSrgbPng(PNG.sync.write({ width: options.width, height: options.height, data: Buffer.from(annotated) }, { colorType: 2 }));
249
+ totalBytes += png.length;
250
+ if (totalBytes > 128 * 1024 * 1024) throw new Error('Output byte limit exceeded');
251
+ const path = `frame-${String(item.index).padStart(6, '0')}.png`;
252
+ await writeFile(join(options.outputRoot, path), png, { flag: 'wx', mode: 0o600 });
253
+ const retained = await readFile(join(options.outputRoot, path));
254
+ if (sha256(retained) !== sha256(png)) throw new Error('Retained frame changed');
255
+ const decoded = PNG.sync.read(retained);
256
+ if (decoded.width !== options.width || decoded.height !== options.height || !Buffer.from(decoded.data).equals(Buffer.from(annotated))) throw new Error('PNG changed GPU-derived pixels');
257
+ frames.push({ ...item, path, bytes: png.length, sha256: sha256(png), rawGpuRgbaSha256: rawSha256 });
258
+ }
259
+ if (frames.length > 1 && frames.every((entry) => entry.rawGpuRgbaSha256 === frames[0].rawGpuRgbaSha256)) throw new Error('Animation did not change GPU pixels');
260
+ await settle();
261
+ if (sha256(await readFile(nativePath)) !== nativeSha256 || sha256(await readFile(join(options.runtimeRoot, 'package-lock.json'))) !== sha256(lock) || sha256(await readFile(fileURLToPath(import.meta.url))) !== sha256(source)) throw new Error('Source or native runtime changed during rendering');
262
+ const nativeModules = Object.keys(runtimeRequire.cache).filter((path) => path.endsWith('.node'));
263
+ if (nativeModules.length !== 1 || nativeModules[0] !== nativePath) throw new Error('Unexpected loaded native dependency');
264
+ const manifest = { kind: 'slopcamera-vgpu-illustrative-sequence', schemaVersion: 1, execution: 'explicit-trusted-current-user', renderer: 'vgpu-offscreen-effect', sceneOwnership: 'external-existing-renderer', physicalSimulation: false, dimensions: { width: options.width, height: options.height }, fps: FPS, frameInterval: { startInclusive: options.startFrame, endExclusive: options.startFrame + options.frames }, color: { primaries: 'srgb', transfer: 'srgb', channels: 'rgb', dataType: 'uint8', alpha: 'opaque', origin: 'top-left', pngSrgbIntent: 'perceptual' }, energy, inputProvenance: 'authored-illustrative-values-not-measurements', annotations: 'project-owned-original-bitmap-labels-after-GPU-readback', sourceSha256: sha256(source), shaderSha256: sha256(HEAT_FIELD_WGSL), lockSha256: sha256(lock), runtime: { node: process.versions.node, nodeSha256, nativeBinary: 'webgpu/dist/darwin-universal.dawn.node', nativeSha256, platform: process.platform, arch: process.arch, versions }, adapter: gpu.adapter, adapterInfo, backendRequested: 'metal', calibration: { ...calibrationEvidence, path: 'calibration.png', sha256: sha256(calibrationPng) }, totalBytes, frames };
265
+ gpu.dispose();
266
+ gpu = undefined;
267
+ await writeFile(join(options.outputRoot, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
268
+ return manifest;
269
+ } finally {
270
+ gpu?.dispose();
271
+ clearTimeout(deadline);
272
+ }
273
+ }
274
+
275
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
276
+ const options = {};
277
+ const names = { '--runtime': 'runtimeRoot', '--output': 'outputRoot', '--width': 'width', '--height': 'height', '--frames': 'frames', '--start-frame': 'startFrame' };
278
+ try {
279
+ for (let index = 2; index < process.argv.length; index += 2) {
280
+ const key = names[process.argv[index]];
281
+ if (!key || options[key] !== undefined || !process.argv[index + 1]) throw new Error('Expected unique --runtime ABS --output ABS [--frames N --start-frame N --width N --height N]');
282
+ options[key] = ['runtimeRoot', 'outputRoot'].includes(key) ? process.argv[index + 1] : Number(process.argv[index + 1]);
283
+ }
284
+ const manifest = await renderHeatField(options);
285
+ process.stdout.write(JSON.stringify({ outputRoot: options.outputRoot, adapter: manifest.adapter, frames: manifest.frames.length, totalBytes: manifest.totalBytes }) + '\n');
286
+ } catch (error) {
287
+ process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
288
+ process.exitCode = 1;
289
+ }
290
+ }
package/package.json ADDED
@@ -0,0 +1,304 @@
1
+ {
2
+ "name": "@hraness/slopcamera",
3
+ "version": "3.2.4",
4
+ "description": "A local visual studio for coding agents: author scenes, combine generated and recorded media, and export images, diagrams, animation, and video from retained sources.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "./src/cli.ts",
9
+ "./src/code/advanced.ts",
10
+ "./src/code/index.ts",
11
+ "./src/generate.ts",
12
+ "./src/host-resources.ts",
13
+ "./src/index.ts",
14
+ "./src/operations.ts",
15
+ "./src/vectorize/worker.ts",
16
+ "./src/workflow.ts",
17
+ "./apps/desktop/cli/main.ts"
18
+ ],
19
+ "packageManager": "bun@1.3.14",
20
+ "engines": {
21
+ "bun": ">=1.3.14"
22
+ },
23
+ "workspaces": {
24
+ "packages": [
25
+ "apps/web",
26
+ "packages/*"
27
+ ],
28
+ "catalog": {
29
+ "@ai-sdk/gateway-v4": "npm:@ai-sdk/gateway@^4.0.27",
30
+ "@img/sharp-darwin-arm64": "0.35.3",
31
+ "@img/sharp-libvips-darwin-arm64": "1.3.2",
32
+ "@native-sdk/cli": "0.5.3",
33
+ "@types/bun": "^1.3.14",
34
+ "@types/node": "^24.10.0",
35
+ "@types/react": "^19.2.14",
36
+ "@types/react-dom": "^19.2.3",
37
+ "@vitejs/plugin-react": "^6.0.3",
38
+ "agent-browser": "0.32.3",
39
+ "ai-v7": "npm:ai@^7.0.36",
40
+ "chromium-bidi": "12.1.0",
41
+ "eslint": "^9.39.2",
42
+ "fast-check": "^4.8.0",
43
+ "motion": "12.42.0",
44
+ "@paper-design/shaders": "0.0.77",
45
+ "playwright-core": "1.62.0",
46
+ "react": "19.2.3",
47
+ "react-dom": "19.2.3",
48
+ "three": "0.183.2",
49
+ "typescript": "^6.0.3",
50
+ "vite": "^8.1.5",
51
+ "zod": "^4.4.3"
52
+ }
53
+ },
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "git+https://github.com/hraness/slopcamera.git"
57
+ },
58
+ "homepage": "https://slopcamera.com/",
59
+ "bugs": {
60
+ "url": "https://github.com/hraness/slopcamera/issues"
61
+ },
62
+ "keywords": [
63
+ "ai-media-generation",
64
+ "ai-video-generation",
65
+ "video-generation",
66
+ "video-editing",
67
+ "image-generation",
68
+ "screen-recording",
69
+ "motion-graphics",
70
+ "captions",
71
+ "speech-generation",
72
+ "transcription",
73
+ "diagrams",
74
+ "creative-coding",
75
+ "coding-agents",
76
+ "agent-skill",
77
+ "mcp-server",
78
+ "cli",
79
+ "typescript",
80
+ "bun",
81
+ "local-first"
82
+ ],
83
+ "exports": {
84
+ ".": {
85
+ "types": "./src/index.ts",
86
+ "import": "./dist/index.js"
87
+ },
88
+ "./cli": {
89
+ "types": "./src/cli.ts",
90
+ "import": "./dist/cli.js"
91
+ },
92
+ "./code": {
93
+ "types": "./src/code/index.ts",
94
+ "import": "./dist/code/index.js"
95
+ },
96
+ "./code/advanced": {
97
+ "types": "./src/code/advanced.ts",
98
+ "import": "./dist/code/advanced.js"
99
+ },
100
+ "./generate": {
101
+ "types": "./src/generate.ts",
102
+ "import": "./dist/generate.js"
103
+ },
104
+ "./host-resources": {
105
+ "types": "./src/host-resources.ts",
106
+ "import": "./dist/host-resources.js"
107
+ },
108
+ "./operations": {
109
+ "types": "./src/operations.ts",
110
+ "import": "./dist/operations.js"
111
+ },
112
+ "./workflow": {
113
+ "types": "./src/workflow.ts",
114
+ "import": "./dist/workflow.js"
115
+ },
116
+ "./scene": {
117
+ "types": "./packages/scene/src/index.ts",
118
+ "import": "./packages/scene/src/index.ts"
119
+ },
120
+ "./local/code": {
121
+ "types": "./apps/desktop/code/public.ts",
122
+ "import": "./apps/desktop/code/public.ts"
123
+ },
124
+ "./local/code/advanced": {
125
+ "types": "./apps/desktop/code/advanced.ts",
126
+ "import": "./apps/desktop/code/advanced.ts"
127
+ },
128
+ "./local/code/workflows": {
129
+ "types": "./apps/desktop/workflows/index.ts",
130
+ "import": "./apps/desktop/workflows/index.ts"
131
+ },
132
+ "./local/html-overlay": {
133
+ "types": "./apps/desktop/html-overlay/index.ts",
134
+ "import": "./apps/desktop/html-overlay/index.ts"
135
+ }
136
+ },
137
+ "bin": {
138
+ "slopcamera": "./apps/desktop/dist/cli/main.js"
139
+ },
140
+ "main": "./dist/index.js",
141
+ "types": "./src/index.ts",
142
+ "files": [
143
+ "dist",
144
+ "apps/desktop/analysis/protocol.ts",
145
+ "apps/desktop/capture/protocol.ts",
146
+ "apps/desktop/application/**/*.ts",
147
+ "!apps/desktop/application/**/*.test.ts",
148
+ "!apps/desktop/application/**/*.testing.ts",
149
+ "!apps/desktop/application/**/test-support.ts",
150
+ "!apps/desktop/application/**/*test-support.ts",
151
+ "apps/desktop/cli/**/*.ts",
152
+ "apps/desktop/studio/**/*.ts",
153
+ "!apps/desktop/studio/**/*.test.ts",
154
+ "!apps/desktop/studio/**/qualify-*.ts",
155
+ "apps/desktop/studio/**/*.py",
156
+ "!apps/desktop/studio/**/test_*.py",
157
+ "!apps/desktop/studio/**/qualify_*.py",
158
+ "examples/studio/**/*.py",
159
+ "examples/studio/**/*.json",
160
+ "examples/studio/**/README.md",
161
+ "docs/studio.md",
162
+ "examples/studio/native-workflow.ts",
163
+ "examples/studio/hybrid-scene.ts",
164
+ "examples/studio/vgpu/heat-field.mjs",
165
+ "apps/desktop/studio/assets/README.md",
166
+ "!apps/desktop/cli/**/*.test.ts",
167
+ "!apps/desktop/cli/build-compiled.ts",
168
+ "!apps/desktop/cli/compiled-bootstrap.ts",
169
+ "apps/desktop/code/**/*.ts",
170
+ "!apps/desktop/code/**/*.test.ts",
171
+ "!apps/desktop/code/**/*benchmark*.ts",
172
+ "apps/desktop/contracts/**/*.ts",
173
+ "!apps/desktop/contracts/**/*.test.ts",
174
+ "apps/desktop/core/**/*.ts",
175
+ "!apps/desktop/core/**/*.test.ts",
176
+ "!apps/desktop/core/**/test-support.ts",
177
+ "apps/desktop/dist/cli",
178
+ "apps/desktop/html-overlay/**/*.ts",
179
+ "!apps/desktop/html-overlay/**/*.test.ts",
180
+ "!apps/desktop/html-overlay/**/*.testing.ts",
181
+ "apps/desktop/workflows/**/*.ts",
182
+ "!apps/desktop/workflows/**/*.test.ts",
183
+ "packages/scene/src/**/*.ts",
184
+ "!packages/scene/src/**/*.test.ts",
185
+ "NOTICE.md",
186
+ "src/**/*.ts",
187
+ "!src/**/*.test.ts",
188
+ "!src/spatial-scene/test-fixture.ts",
189
+ "src/assets/fonts/nebula-sans",
190
+ "schema",
191
+ "skills",
192
+ "README.md",
193
+ "PRIVACY.md",
194
+ "SECURITY.md",
195
+ "LICENSE"
196
+ ],
197
+ "scripts": {
198
+ "build": "bun run build:sdk && bun run build:desktop && bun run build:web",
199
+ "build:sdk": "bun -e 'await (await import(\"node:fs/promises\")).rm(\"./dist\", { recursive: true, force: true })' && bun build ./src/index.ts ./src/cli.ts ./src/code/index.ts ./src/code/advanced.ts ./src/generate.ts ./src/host-resources.ts ./src/operations.ts ./src/workflow.ts ./src/vectorize/worker.ts --outdir ./dist --root ./src --target bun --format esm --splitting --packages external",
200
+ "build:desktop": "bun run build:desktop:cli && bun run build:desktop:frontend && bun run build:desktop:runtime",
201
+ "build:desktop:cli": "bun -e 'await (await import(\"node:fs/promises\")).rm(\"./apps/desktop/dist/cli\", { recursive: true, force: true })' && bun build --target=bun --minify --sourcemap=none --packages external --external @hraness/slopcamera/cli apps/desktop/cli/main.ts --outdir apps/desktop/dist/cli",
202
+ "build:desktop:frontend": "vite build --config apps/desktop/frontend/vite.config.ts && bun run check:desktop:direct-boundary",
203
+ "build:desktop:runtime": "bun build --compile --minify --sourcemap=none apps/desktop/runtime/src/main.ts --outfile apps/desktop/runtime/dist/slopcamera-gateway && bun run check:desktop:direct-boundary",
204
+ "build:web": "bun run --cwd apps/web build",
205
+ "dev:frontend": "vite --config apps/desktop/frontend/vite.config.ts",
206
+ "dev:direct": "vite --config apps/desktop/direct/vite.config.ts",
207
+ "fuzz:direct": "bun run ./apps/desktop/direct/fuzz-browser.ts",
208
+ "dev:desktop": "bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-native.ts dev",
209
+ "typecheck": "bun run typecheck:sdk && bun run typecheck:desktop",
210
+ "typecheck:sdk": "tsc --noEmit -p tsconfig.json",
211
+ "typecheck:desktop": "tsc --noEmit -p apps/desktop/tsconfig.json",
212
+ "lint": "bun run lint:sdk && bun run lint:desktop",
213
+ "lint:sdk": "eslint src packages/scene scripts",
214
+ "lint:desktop": "eslint apps/desktop/contracts apps/desktop/core apps/desktop/application apps/desktop/code apps/desktop/workflows apps/desktop/html-overlay apps/desktop/cli apps/desktop/qualification apps/desktop/capture apps/desktop/analysis apps/desktop/runtime apps/desktop/frontend apps/desktop/direct apps/desktop/studio",
215
+ "test": "bun run test:sdk && bun run test:desktop && bun run --cwd apps/web test",
216
+ "test:sdk": "bun test ./src ./packages/scene",
217
+ "test:desktop": "bun test ./apps/desktop/contracts ./apps/desktop/core ./apps/desktop/application ./apps/desktop/code ./apps/desktop/workflows ./apps/desktop/html-overlay ./apps/desktop/cli ./apps/desktop/capture ./apps/desktop/analysis ./apps/desktop/runtime ./apps/desktop/frontend ./apps/desktop/direct ./apps/desktop/studio",
218
+ "test:desktop:macos": "bun run build:desktop:capture:macos && bun test ./apps/desktop/capture/interruption-state.macos.test.ts ./apps/desktop/capture/timeline-prepared.macos.test.ts ./apps/desktop/capture/controller-orchestration.macos.test.ts ./apps/desktop/capture/finalization-state.macos.test.ts ./apps/desktop/capture/start-coordinator.macos.test.ts ./apps/desktop/capture/recorder-single-flight.macos.test.ts ./apps/desktop/capture/native-interruptions.macos.test.ts && bun run build:desktop:analysis:macos && bun test ./apps/desktop/analysis && bun run ./apps/desktop/runtime/run-zig.ts build test -Dplatform=macos",
219
+ "build:desktop:capture:macos": "bun run ./apps/desktop/capture/build.ts",
220
+ "build:desktop:analysis:macos": "bun run ./apps/desktop/analysis/build.ts",
221
+ "build:desktop:macos": "bun run build:desktop:capture:macos && bun run build:desktop:analysis:macos && bun run build:desktop:frontend && bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-zig.ts build -Dplatform=macos -Doptimize=ReleaseFast",
222
+ "start:desktop:macos": "bun run build:desktop:capture:macos && bun run build:desktop:analysis:macos && bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-native.ts run",
223
+ "package:desktop:macos": "bun run build:desktop:capture:macos && bun run build:desktop:analysis:macos && bun run build:desktop:frontend && bun run build:desktop:runtime && bun run ./apps/desktop/runtime/run-zig.ts build package -Dplatform=macos -Dpackage-target=macos && bun run ./apps/desktop/runtime/package-macos.ts",
224
+ "build:cli:macos": "bun run ./apps/desktop/cli/build-compiled.ts",
225
+ "test:cli:compiled:macos": "bun run build:cli:macos && SLOPCAMERA_RUN_COMPILED_CLI_SMOKE=1 bun test ./apps/desktop/cli/compiled-portable-surface.macos.test.ts",
226
+ "test:html-overlay": "bun test ./apps/desktop/html-overlay ./apps/desktop/application/html-overlay-browser-runtime.test.ts ./apps/desktop/application/html-overlay-integrity.test.ts ./apps/desktop/application/operations/media/html-overlay.test.ts ./apps/desktop/cli/html-overlay-renderer.security.test.ts ./apps/desktop/cli/html-overlay-snapshot-scavenger.test.ts ./apps/desktop/cli/html-overlay-renderer.macos.test.ts",
227
+ "qualify:spatial-scenes": "bun run ./apps/desktop/qualification/spatial-scenes.ts",
228
+ "qualify:creative-scenes": "bun run ./apps/desktop/qualification/creative-render.ts",
229
+ "qualify:saved-world": "bun run ./apps/desktop/qualification/world-render.ts",
230
+ "qualify:spatial-project": "bun run ./apps/desktop/qualification/project.ts",
231
+ "qualify:spatial-compositor": "bun run ./apps/desktop/qualification/spatial-compositor.ts",
232
+ "test:html-overlay:browser:macos": "SLOPCAMERA_RUN_HTML_OVERLAY_RENDERER_SMOKE=1 bun test ./apps/desktop/cli/html-overlay-renderer.macos.test.ts",
233
+ "test:html-overlay:libraries:macos": "SLOPCAMERA_RUN_HTML_OVERLAY_LIBRARY_SMOKE=1 bun test ./apps/desktop/cli/html-overlay-renderer.macos.test.ts",
234
+ "test:html-overlay:operation:macos": "SLOPCAMERA_RUN_HTML_OVERLAY_OPERATION_SMOKE=1 bun test ./apps/desktop/application/operations/media/html-overlay.test.ts",
235
+ "verify:html-overlay:macos": "bun run test:html-overlay:browser:macos && bun run test:html-overlay:libraries:macos && bun run test:html-overlay:operation:macos",
236
+ "test:capture:hardware:macos": "bun test ./apps/desktop/capture/hardware-smoke.macos.test.ts",
237
+ "doctor:macos": "native doctor --manifest apps/desktop/app.zon --strict",
238
+ "benchmark:code-concurrency": "bun run ./apps/desktop/code/concurrency-benchmark.ts",
239
+ "check:desktop:direct-boundary": "bun run ./apps/desktop/direct/check-production-boundary.ts",
240
+ "verify:direct": "bun run ./apps/desktop/direct/verify-browser.ts",
241
+ "check:release-workflows": "bun test ./scripts/release-workflow.test.ts ./scripts/github-release.test.ts",
242
+ "check:schema": "bun run ./scripts/validate-schema.ts",
243
+ "check:skill": "bun run ./scripts/validate-skill.ts",
244
+ "check:standalone": "bun run ./scripts/check-standalone.ts",
245
+ "test:vectorize:official": "bun run ./scripts/official-vectorizer-smoke.ts",
246
+ "test:package": "bun run ./scripts/package-smoke.ts",
247
+ "check:sdk": "bun run typecheck:sdk && bun run lint:sdk && bun run build:sdk && bun run test:sdk && bun run check:release-workflows && bun run check:schema && bun run check:skill",
248
+ "check:desktop": "bun run check:effect && bun run typecheck:desktop && bun run lint:desktop && bun run test:desktop && bun run build:desktop",
249
+ "check:web": "bun run --cwd apps/web check",
250
+ "kb:refresh": "bunx --bun github:hraness/kb#v0.15.2 refresh --root kb",
251
+ "kb:check:lane": "bunx --bun github:hraness/kb#v0.15.2 check --root kb --no-catalog",
252
+ "kb:check": "bunx --bun github:hraness/kb#v0.15.2 check --root kb && bunx --bun github:hraness/kb#v0.15.2 agents check --root kb --repo .",
253
+ "kb:catalog": "bunx --bun github:hraness/kb#v0.15.2 catalog --root kb",
254
+ "check": "bun run check:standalone && bun run check:sdk && bun run check:desktop && bun run check:web && bun run check:standalone && bun run test:package",
255
+ "prepack": "bun run check",
256
+ "check:effect": "bun run ./scripts/check-effect-policy.ts && bun test ./scripts/check-effect-architecture.test.ts"
257
+ },
258
+ "dependencies": {
259
+ "@ai-sdk/gateway-v4": "npm:@ai-sdk/gateway@^4.0.27",
260
+ "@noble/hashes": "2.2.0",
261
+ "@paper-design/shaders": "0.0.77",
262
+ "@resvg/resvg-js": "2.6.2",
263
+ "@vercel/blob": "2.8.0",
264
+ "ai-v7": "npm:ai@^7.0.36",
265
+ "chromium-bidi": "12.1.0",
266
+ "effect": "3.22.1",
267
+ "motion": "12.42.0",
268
+ "playwright-core": "1.62.0",
269
+ "react": "19.2.3",
270
+ "react-dom": "19.2.3",
271
+ "sharp": "0.35.3",
272
+ "three": "0.183.2",
273
+ "typescript": "^6.0.3",
274
+ "zod": "^4.4.3"
275
+ },
276
+ "optionalDependencies": {
277
+ "@img/sharp-darwin-arm64": "0.35.3",
278
+ "@img/sharp-libvips-darwin-arm64": "1.3.2"
279
+ },
280
+ "devDependencies": {
281
+ "@antithesishq/bombadil": "0.7.2",
282
+ "@eslint/js": "^9.39.2",
283
+ "@hraness/design-kit": "github:hraness/design-kit#v0.3.0",
284
+ "@hraness/direct": "github:hraness/direct#v0.7.20",
285
+ "@native-sdk/cli": "0.5.3",
286
+ "@types/bun": "^1.3.14",
287
+ "@types/json-schema": "^7.0.15",
288
+ "@types/node": "^24.10.0",
289
+ "@types/react": "^19.2.14",
290
+ "@types/react-dom": "^19.2.3",
291
+ "@vitejs/plugin-react": "^6.0.3",
292
+ "agent-browser": "0.32.3",
293
+ "ajv": "8.17.1",
294
+ "eslint": "^9.39.2",
295
+ "fast-check": "^4.8.0",
296
+ "tldraw": "5.2.5",
297
+ "typescript-eslint": "^8.53.0",
298
+ "vite": "^8.1.5"
299
+ },
300
+ "publishConfig": {
301
+ "access": "public",
302
+ "registry": "https://registry.npmjs.org"
303
+ }
304
+ }
@@ -0,0 +1 @@
1
+ export * from "./scene";