@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,712 @@
1
+ // @bun
2
+ // src/code/errors.ts
3
+ class SlopcameraCodeError extends Error {
4
+ code;
5
+ details;
6
+ constructor(code, message, details) {
7
+ super(message);
8
+ this.name = "SlopcameraCodeError";
9
+ this.code = code;
10
+ this.details = details === undefined ? undefined : Object.freeze({ ...details });
11
+ }
12
+ }
13
+ function slopcameraCodeErrorMessage(error) {
14
+ return error instanceof Error ? error.message : String(error);
15
+ }
16
+ function asSlopcameraCodeError(error) {
17
+ if (error instanceof SlopcameraCodeError)
18
+ return error;
19
+ return new SlopcameraCodeError("internal", slopcameraCodeErrorMessage(error));
20
+ }
21
+
22
+ // src/code/sha256.ts
23
+ import { sha256 } from "@noble/hashes/sha2.js";
24
+ import { bytesToHex } from "@noble/hashes/utils.js";
25
+ var UTF8_ENCODER = new TextEncoder;
26
+ function createSha256HexHasher() {
27
+ if (typeof Bun !== "undefined") {
28
+ const hasher2 = new Bun.CryptoHasher("sha256");
29
+ return {
30
+ digestHex: () => hasher2.digest("hex"),
31
+ update: (input) => {
32
+ hasher2.update(input);
33
+ }
34
+ };
35
+ }
36
+ const hasher = sha256.create();
37
+ return {
38
+ digestHex: () => bytesToHex(hasher.digest()),
39
+ update: (input) => {
40
+ hasher.update(typeof input === "string" ? UTF8_ENCODER.encode(input) : input);
41
+ }
42
+ };
43
+ }
44
+ function sha256Hex(input) {
45
+ const hasher = createSha256HexHasher();
46
+ hasher.update(input);
47
+ return hasher.digestHex();
48
+ }
49
+
50
+ // src/code/json-utf8.ts
51
+ function jsonStringUtf8ByteLength(value, maximumBytes = Number.MAX_SAFE_INTEGER) {
52
+ if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 0)
53
+ return;
54
+ let bytes = 2;
55
+ if (bytes > maximumBytes)
56
+ return;
57
+ for (let index = 0;index < value.length; index += 1) {
58
+ const codeUnit = value.charCodeAt(index);
59
+ let additional;
60
+ if (codeUnit === 34 || codeUnit === 92 || codeUnit === 8 || codeUnit === 9 || codeUnit === 10 || codeUnit === 12 || codeUnit === 13) {
61
+ additional = 2;
62
+ } else if (codeUnit < 32) {
63
+ additional = 6;
64
+ } else if (codeUnit < 128) {
65
+ additional = 1;
66
+ } else if (codeUnit < 2048) {
67
+ additional = 2;
68
+ } else if (codeUnit >= 55296 && codeUnit <= 56319) {
69
+ const next = value.charCodeAt(index + 1);
70
+ if (next >= 56320 && next <= 57343) {
71
+ additional = 4;
72
+ index += 1;
73
+ } else {
74
+ additional = 6;
75
+ }
76
+ } else if (codeUnit >= 56320 && codeUnit <= 57343) {
77
+ additional = 6;
78
+ } else {
79
+ additional = 3;
80
+ }
81
+ if (additional > maximumBytes - bytes)
82
+ return;
83
+ bytes += additional;
84
+ }
85
+ return bytes;
86
+ }
87
+ function utf8ByteLength(value, maximumBytes = Number.MAX_SAFE_INTEGER) {
88
+ if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 0)
89
+ return;
90
+ let bytes = 0;
91
+ for (let index = 0;index < value.length; index += 1) {
92
+ const codeUnit = value.charCodeAt(index);
93
+ let additional;
94
+ if (codeUnit < 128) {
95
+ additional = 1;
96
+ } else if (codeUnit < 2048) {
97
+ additional = 2;
98
+ } else if (codeUnit >= 55296 && codeUnit <= 56319) {
99
+ const next = value.charCodeAt(index + 1);
100
+ if (next >= 56320 && next <= 57343) {
101
+ additional = 4;
102
+ index += 1;
103
+ } else {
104
+ additional = 3;
105
+ }
106
+ } else {
107
+ additional = 3;
108
+ }
109
+ if (additional > maximumBytes - bytes)
110
+ return;
111
+ bytes += additional;
112
+ }
113
+ return bytes;
114
+ }
115
+
116
+ // src/code/json-snapshot.ts
117
+ var DEFAULT_MAXIMUM_DEPTH = 128;
118
+ var DEFAULT_MAXIMUM_VALUES = 1e6;
119
+ var HASH_BUFFER_CODE_UNITS = 64 * 1024;
120
+ function invalidJson(message, details) {
121
+ throw new SlopcameraCodeError("invalid-data", message, details);
122
+ }
123
+ function positiveLimit(value, name) {
124
+ if (!Number.isSafeInteger(value) || value < 1) {
125
+ return invalidJson(`${name} must be a positive safe integer.`);
126
+ }
127
+ return value;
128
+ }
129
+ function enumerableSymbolDescriptor(descriptors) {
130
+ return Object.getOwnPropertySymbols(descriptors).some((symbol) => Reflect.get(descriptors, symbol)?.enumerable === true);
131
+ }
132
+ function captureJsonStructure(input, name, limits = {}) {
133
+ const maximumDepth = positiveLimit(limits.maximumDepth ?? DEFAULT_MAXIMUM_DEPTH, "JSON structure depth limit");
134
+ const maximumValues = positiveLimit(limits.maximumValues ?? DEFAULT_MAXIMUM_VALUES, "JSON structure value limit");
135
+ const maximumBytes = limits.maximumBytes === undefined ? undefined : positiveLimit(limits.maximumBytes, "JSON structure byte limit");
136
+ const active = new WeakSet;
137
+ const pending = [{ depth: 0, kind: "visit", value: input }];
138
+ let bytes = 0;
139
+ let discoveredValues = 1;
140
+ let root;
141
+ let rootAssigned = false;
142
+ const addBytes = (additional) => {
143
+ if (maximumBytes === undefined)
144
+ return;
145
+ if (additional > maximumBytes - bytes) {
146
+ return invalidJson(`${name} contains more than ${String(maximumBytes)} bytes.`, { actualLowerBound: bytes + additional, maximumBytes });
147
+ }
148
+ bytes += additional;
149
+ };
150
+ const addJsonString = (value) => {
151
+ if (maximumBytes === undefined)
152
+ return;
153
+ const additional = jsonStringUtf8ByteLength(value, maximumBytes - bytes);
154
+ if (additional === undefined) {
155
+ return invalidJson(`${name} contains more than ${String(maximumBytes)} bytes.`, { actualLowerBound: maximumBytes + 1, maximumBytes });
156
+ }
157
+ bytes += additional;
158
+ };
159
+ const discover = (additional) => {
160
+ if (additional > maximumValues - discoveredValues) {
161
+ return invalidJson(`${name} contains more than ${String(maximumValues)} structural values.`, { actualLowerBound: discoveredValues + additional, maximumValues });
162
+ }
163
+ discoveredValues += additional;
164
+ };
165
+ const assign = (assignment, value) => {
166
+ if (assignment === undefined) {
167
+ root = value;
168
+ rootAssigned = true;
169
+ return;
170
+ }
171
+ Object.defineProperty(assignment.target, assignment.key, {
172
+ configurable: true,
173
+ enumerable: true,
174
+ value,
175
+ writable: true
176
+ });
177
+ };
178
+ try {
179
+ while (pending.length > 0) {
180
+ const frame = pending.pop();
181
+ if (frame === undefined)
182
+ continue;
183
+ if (frame.kind === "exit") {
184
+ active.delete(frame.source);
185
+ continue;
186
+ }
187
+ if (frame.depth > maximumDepth) {
188
+ return invalidJson(`${name} nesting exceeds ${String(maximumDepth)} levels.`, { actual: frame.depth, maximumDepth });
189
+ }
190
+ const value = frame.value;
191
+ if (typeof value === "string") {
192
+ addJsonString(value);
193
+ assign(frame.assignment, value);
194
+ continue;
195
+ }
196
+ if (value === null) {
197
+ addBytes(4);
198
+ assign(frame.assignment, value);
199
+ continue;
200
+ }
201
+ if (typeof value === "boolean") {
202
+ addBytes(value ? 4 : 5);
203
+ assign(frame.assignment, value);
204
+ continue;
205
+ }
206
+ if (typeof value === "number") {
207
+ if (Number.isFinite(value)) {
208
+ addBytes(JSON.stringify(Object.is(value, -0) ? 0 : value).length);
209
+ }
210
+ assign(frame.assignment, value);
211
+ continue;
212
+ }
213
+ if (typeof value !== "object") {
214
+ assign(frame.assignment, value);
215
+ continue;
216
+ }
217
+ const isArray = Array.isArray(value);
218
+ if (!isArray) {
219
+ const prototype = Object.getPrototypeOf(value);
220
+ if (prototype !== Object.prototype && prototype !== null) {
221
+ assign(frame.assignment, value);
222
+ continue;
223
+ }
224
+ }
225
+ if (active.has(value)) {
226
+ return invalidJson(`${name} does not support cyclic plain-container values.`);
227
+ }
228
+ const arrayLength = isArray ? value.length : undefined;
229
+ if (arrayLength !== undefined && arrayLength > maximumValues - discoveredValues) {
230
+ return invalidJson(`${name} contains more than ${String(maximumValues)} structural values.`, { actualLowerBound: discoveredValues + arrayLength, maximumValues });
231
+ }
232
+ const descriptors = Object.getOwnPropertyDescriptors(value);
233
+ if (Object.getOwnPropertySymbols(descriptors).some((symbol) => Reflect.get(descriptors, symbol)?.enumerable === true)) {
234
+ return invalidJson(`${name} cannot contain enumerable symbol properties.`);
235
+ }
236
+ const keys = Object.keys(descriptors).filter((key) => descriptors[key]?.enumerable === true);
237
+ const namedArrayKeys = arrayLength === undefined ? [] : keys.filter((key) => {
238
+ const index = Number(key);
239
+ return !(Number.isSafeInteger(index) && index >= 0 && index < arrayLength && String(index) === key);
240
+ });
241
+ if (arrayLength !== undefined) {
242
+ discover(arrayLength);
243
+ discover(namedArrayKeys.length);
244
+ addBytes(2 + Math.max(0, arrayLength - 1));
245
+ for (const key of namedArrayKeys) {
246
+ addJsonString(key);
247
+ addBytes(1);
248
+ }
249
+ } else {
250
+ discover(keys.length);
251
+ addBytes(2 + Math.max(0, keys.length - 1));
252
+ for (const key of keys) {
253
+ addJsonString(key);
254
+ addBytes(1);
255
+ }
256
+ }
257
+ const clone = arrayLength === undefined ? {} : new Array(arrayLength);
258
+ assign(frame.assignment, clone);
259
+ active.add(value);
260
+ pending.push({ kind: "exit", source: value });
261
+ for (let index = keys.length - 1;index >= 0; index -= 1) {
262
+ const key = keys[index];
263
+ if (key === undefined)
264
+ continue;
265
+ const descriptor = descriptors[key];
266
+ if (descriptor === undefined || descriptor.get !== undefined || descriptor.set !== undefined) {
267
+ return invalidJson(`${name} properties must be plain data properties.`);
268
+ }
269
+ const numericKey = arrayLength !== undefined && Number.isSafeInteger(Number(key)) && Number(key) >= 0 && Number(key) < arrayLength && String(Number(key)) === key ? Number(key) : key;
270
+ pending.push({
271
+ assignment: { key: numericKey, target: clone },
272
+ depth: frame.depth + 1,
273
+ kind: "visit",
274
+ value: descriptor.value
275
+ });
276
+ }
277
+ }
278
+ } catch (error) {
279
+ if (error instanceof SlopcameraCodeError)
280
+ throw error;
281
+ throw new SlopcameraCodeError("invalid-data", `${name} could not be safely inspected.`, { cause: error instanceof Error ? error.message : String(error) });
282
+ }
283
+ if (!rootAssigned) {
284
+ return invalidJson(`${name} did not contain a capturable value.`);
285
+ }
286
+ return root;
287
+ }
288
+ function assignValue(assignment, value, setRoot) {
289
+ if (assignment === undefined) {
290
+ setRoot(value);
291
+ return;
292
+ }
293
+ if (Array.isArray(assignment.target)) {
294
+ assignment.target[assignment.key] = value;
295
+ } else {
296
+ Object.defineProperty(assignment.target, assignment.key, {
297
+ configurable: true,
298
+ enumerable: true,
299
+ value,
300
+ writable: true
301
+ });
302
+ }
303
+ }
304
+ function scalarJson(value) {
305
+ if (typeof value === "number") {
306
+ if (!Number.isFinite(value)) {
307
+ return invalidJson("JSON snapshots do not support non-finite numbers.");
308
+ }
309
+ return JSON.stringify(Object.is(value, -0) ? 0 : value);
310
+ }
311
+ return JSON.stringify(value);
312
+ }
313
+ function captureBoundedJson(input, maximumBytesInput, name, limits = {}, capture) {
314
+ const maximumBytes = positiveLimit(maximumBytesInput, "JSON snapshot byte limit");
315
+ const maximumDepth = positiveLimit(limits.maximumDepth ?? DEFAULT_MAXIMUM_DEPTH, "JSON snapshot depth limit");
316
+ const maximumValues = positiveLimit(limits.maximumValues ?? DEFAULT_MAXIMUM_VALUES, "JSON snapshot value limit");
317
+ const active = new WeakSet;
318
+ const hash = capture.hash ? createSha256HexHasher() : undefined;
319
+ let hashPart = capture.hashPrefix ?? "";
320
+ const flushHash = () => {
321
+ if (hash === undefined || hashPart.length === 0)
322
+ return;
323
+ hash.update(hashPart);
324
+ hashPart = "";
325
+ };
326
+ const captureCanonicalText = capture.captureText;
327
+ const canonicalParts = [];
328
+ let canonicalPart = "";
329
+ const pending = [{ depth: 0, kind: "visit", value: input }];
330
+ let bytes = 0;
331
+ let discoveredValues = 1;
332
+ let root;
333
+ const append = (text, exactBytes = text.length) => {
334
+ if (exactBytes > maximumBytes - bytes) {
335
+ return invalidJson(`${name} contains more than ${String(maximumBytes)} bytes.`, { actualLowerBound: bytes + exactBytes, maximumBytes });
336
+ }
337
+ if (hash !== undefined) {
338
+ hashPart += text;
339
+ if (hashPart.length >= HASH_BUFFER_CODE_UNITS)
340
+ flushHash();
341
+ }
342
+ if (captureCanonicalText) {
343
+ canonicalPart += text;
344
+ if (canonicalPart.length >= 64 * 1024) {
345
+ canonicalParts.push(canonicalPart);
346
+ canonicalPart = "";
347
+ }
348
+ }
349
+ bytes += exactBytes;
350
+ };
351
+ const discover = (additional) => {
352
+ if (additional > maximumValues - discoveredValues) {
353
+ return invalidJson(`${name} contains more than ${String(maximumValues)} JSON values.`, { actualLowerBound: discoveredValues + additional, maximumValues });
354
+ }
355
+ discoveredValues += additional;
356
+ };
357
+ const setRoot = (value) => {
358
+ root = value;
359
+ };
360
+ try {
361
+ while (pending.length > 0) {
362
+ const frame = pending.pop();
363
+ if (frame === undefined)
364
+ break;
365
+ if (frame.kind === "array") {
366
+ if (frame.index === frame.values) {
367
+ append("]");
368
+ active.delete(frame.source);
369
+ if (frame.clone !== undefined)
370
+ Object.freeze(frame.clone);
371
+ continue;
372
+ }
373
+ if (frame.index > 0)
374
+ append(",");
375
+ const descriptor = frame.descriptors[String(frame.index)];
376
+ if (descriptor === undefined || descriptor.get !== undefined || descriptor.set !== undefined) {
377
+ return invalidJson(`${name} arrays must contain plain data elements.`);
378
+ }
379
+ pending.push({ ...frame, index: frame.index + 1 });
380
+ pending.push({
381
+ ...frame.clone === undefined ? {} : { assignment: { key: frame.index, target: frame.clone } },
382
+ depth: frame.depth + 1,
383
+ kind: "visit",
384
+ value: descriptor.value
385
+ });
386
+ continue;
387
+ }
388
+ if (frame.kind === "object") {
389
+ if (frame.index === frame.keys.length) {
390
+ append("}");
391
+ active.delete(frame.source);
392
+ if (frame.clone !== undefined)
393
+ Object.freeze(frame.clone);
394
+ continue;
395
+ }
396
+ const key = frame.keys[frame.index];
397
+ if (key === undefined) {
398
+ return invalidJson(`${name} lost an object key during traversal.`);
399
+ }
400
+ if (frame.index > 0)
401
+ append(",");
402
+ const keyBytes = jsonStringUtf8ByteLength(key, maximumBytes - bytes);
403
+ if (keyBytes === undefined) {
404
+ return invalidJson(`${name} contains more than ${String(maximumBytes)} bytes.`, { actualLowerBound: maximumBytes + 1, maximumBytes });
405
+ }
406
+ append(scalarJson(key), keyBytes);
407
+ append(":");
408
+ const descriptor = frame.descriptors[key];
409
+ if (descriptor === undefined || descriptor.get !== undefined || descriptor.set !== undefined) {
410
+ return invalidJson(`${name} properties must be plain data properties.`);
411
+ }
412
+ pending.push({ ...frame, index: frame.index + 1 });
413
+ pending.push({
414
+ ...frame.clone === undefined ? {} : { assignment: { key, target: frame.clone } },
415
+ depth: frame.depth + 1,
416
+ kind: "visit",
417
+ value: descriptor.value
418
+ });
419
+ continue;
420
+ }
421
+ if (frame.depth > maximumDepth) {
422
+ return invalidJson(`${name} nesting exceeds ${String(maximumDepth)} levels.`, { actual: frame.depth, maximumDepth });
423
+ }
424
+ const value = frame.value;
425
+ if (value === null || typeof value === "boolean" || typeof value === "number" || typeof value === "string") {
426
+ const normalized = typeof value === "number" && Object.is(value, -0) ? 0 : value;
427
+ if (typeof value === "string") {
428
+ const stringBytes = jsonStringUtf8ByteLength(value, maximumBytes - bytes);
429
+ if (stringBytes === undefined) {
430
+ return invalidJson(`${name} contains more than ${String(maximumBytes)} bytes.`, { actualLowerBound: maximumBytes + 1, maximumBytes });
431
+ }
432
+ append(scalarJson(value), stringBytes);
433
+ } else {
434
+ append(scalarJson(value));
435
+ }
436
+ if (capture.captureValue) {
437
+ assignValue(frame.assignment, normalized, setRoot);
438
+ }
439
+ continue;
440
+ }
441
+ if (typeof value !== "object") {
442
+ return invalidJson(`${name} does not support ${typeof value} values.`);
443
+ }
444
+ if (active.has(value)) {
445
+ return invalidJson(`${name} does not support cyclic values.`);
446
+ }
447
+ const arrayLength = Array.isArray(value) ? value.length : undefined;
448
+ if (arrayLength !== undefined && arrayLength > maximumValues - discoveredValues) {
449
+ return invalidJson(`${name} contains more than ${String(maximumValues)} JSON values.`, {
450
+ actualLowerBound: discoveredValues + arrayLength,
451
+ maximumValues
452
+ });
453
+ }
454
+ if (arrayLength !== undefined) {
455
+ const punctuationBytes = 2 + Math.max(0, arrayLength - 1);
456
+ if (punctuationBytes > maximumBytes - bytes) {
457
+ return invalidJson(`${name} contains more than ${String(maximumBytes)} bytes.`, { actualLowerBound: bytes + punctuationBytes, maximumBytes });
458
+ }
459
+ }
460
+ active.add(value);
461
+ if (Array.isArray(value)) {
462
+ const length = arrayLength;
463
+ if (length === undefined) {
464
+ return invalidJson(`${name} lost an array length during traversal.`);
465
+ }
466
+ discoveredValues += length;
467
+ const descriptors2 = Object.getOwnPropertyDescriptors(value);
468
+ if (!capture.ignoreNonIndexArrayProperties) {
469
+ if (enumerableSymbolDescriptor(descriptors2)) {
470
+ return invalidJson(`${name} cannot contain enumerable symbol properties.`);
471
+ }
472
+ const keys2 = Object.keys(descriptors2).filter((key) => descriptors2[key]?.enumerable === true);
473
+ if (keys2.length !== length || keys2.some((key, index) => key !== String(index))) {
474
+ return invalidJson(`${name} arrays must be dense and cannot have named properties.`);
475
+ }
476
+ }
477
+ const clone2 = capture.captureValue ? [] : undefined;
478
+ if (clone2 !== undefined)
479
+ assignValue(frame.assignment, clone2, setRoot);
480
+ append("[");
481
+ pending.push({
482
+ clone: clone2,
483
+ depth: frame.depth,
484
+ descriptors: descriptors2,
485
+ index: 0,
486
+ kind: "array",
487
+ source: value,
488
+ values: length
489
+ });
490
+ continue;
491
+ }
492
+ const prototype = Object.getPrototypeOf(value);
493
+ if (prototype !== Object.prototype && prototype !== null) {
494
+ return invalidJson(`${name} accepts only arrays and plain objects.`);
495
+ }
496
+ const descriptors = Object.getOwnPropertyDescriptors(value);
497
+ if (enumerableSymbolDescriptor(descriptors)) {
498
+ return invalidJson(`${name} cannot contain enumerable symbol properties.`);
499
+ }
500
+ const keys = Object.keys(descriptors).filter((key) => descriptors[key]?.enumerable === true).sort();
501
+ discover(keys.length);
502
+ const clone = capture.captureValue ? {} : undefined;
503
+ if (clone !== undefined)
504
+ assignValue(frame.assignment, clone, setRoot);
505
+ append("{");
506
+ pending.push({
507
+ clone,
508
+ depth: frame.depth,
509
+ descriptors,
510
+ index: 0,
511
+ keys,
512
+ kind: "object",
513
+ source: value
514
+ });
515
+ }
516
+ } catch (error) {
517
+ if (error instanceof SlopcameraCodeError)
518
+ throw error;
519
+ throw new SlopcameraCodeError("invalid-data", `${name} could not be safely inspected.`, { cause: error instanceof Error ? error.message : String(error) });
520
+ }
521
+ if (capture.captureValue && root === undefined) {
522
+ return invalidJson(`${name} did not contain a JSON value.`);
523
+ }
524
+ if (captureCanonicalText && canonicalPart.length > 0) {
525
+ canonicalParts.push(canonicalPart);
526
+ }
527
+ flushHash();
528
+ return Object.freeze({
529
+ bytes,
530
+ ...captureCanonicalText ? { canonicalText: canonicalParts.join("") } : {},
531
+ ...hash === undefined ? {} : { sha256: hash.digestHex() },
532
+ ...capture.captureValue ? { value: root } : {},
533
+ values: discoveredValues
534
+ });
535
+ }
536
+ function createBoundedJsonValueSnapshot(input, maximumBytesInput, name, limits = {}) {
537
+ const captured = captureBoundedJson(input, maximumBytesInput, name, limits, {
538
+ captureText: false,
539
+ captureValue: true,
540
+ hash: false,
541
+ ignoreNonIndexArrayProperties: false
542
+ });
543
+ if (captured.value === undefined) {
544
+ return invalidJson(`${name} did not produce a complete JSON value snapshot.`);
545
+ }
546
+ return captured;
547
+ }
548
+ function createBoundedJsonSnapshot(input, maximumBytesInput, name, limits = {}) {
549
+ const captured = captureBoundedJson(input, maximumBytesInput, name, limits, {
550
+ captureText: limits.captureCanonicalText === true,
551
+ captureValue: true,
552
+ hash: true,
553
+ ignoreNonIndexArrayProperties: false
554
+ });
555
+ if (captured.sha256 === undefined || captured.value === undefined) {
556
+ return invalidJson(`${name} did not produce a complete JSON snapshot.`);
557
+ }
558
+ return captured;
559
+ }
560
+ function createBoundedCanonicalJson(input, maximumBytesInput, name, limits = {}) {
561
+ const captured = captureBoundedJson(input, maximumBytesInput, name, limits, {
562
+ captureText: true,
563
+ captureValue: false,
564
+ hash: false,
565
+ ignoreNonIndexArrayProperties: true
566
+ });
567
+ if (captured.canonicalText === undefined) {
568
+ return invalidJson(`${name} did not produce canonical JSON text.`);
569
+ }
570
+ return captured.canonicalText;
571
+ }
572
+ function createBoundedCanonicalFingerprint(input, maximumBytesInput, name, limits = {}, hashPrefix) {
573
+ const captured = captureBoundedJson(input, maximumBytesInput, name, limits, {
574
+ captureText: false,
575
+ captureValue: false,
576
+ hash: true,
577
+ ignoreNonIndexArrayProperties: true,
578
+ ...hashPrefix === undefined ? {} : { hashPrefix }
579
+ });
580
+ if (captured.sha256 === undefined) {
581
+ return invalidJson(`${name} did not produce a canonical JSON identity.`);
582
+ }
583
+ return Object.freeze({ bytes: captured.bytes, sha256: captured.sha256 });
584
+ }
585
+ function createBoundedCanonicalSha256(input, maximumBytesInput, name, limits = {}, hashPrefix) {
586
+ return createBoundedCanonicalFingerprint(input, maximumBytesInput, name, limits, hashPrefix).sha256;
587
+ }
588
+ function deepFreezeJson(value) {
589
+ const active = new WeakSet;
590
+ const completed = new WeakSet;
591
+ const pending = [{ exiting: false, value }];
592
+ try {
593
+ while (pending.length > 0) {
594
+ const item = pending.pop();
595
+ if (item === undefined)
596
+ break;
597
+ const current = item.value;
598
+ if (current === null || typeof current === "boolean" || typeof current === "string") {
599
+ continue;
600
+ }
601
+ if (typeof current === "number") {
602
+ if (!Number.isFinite(current)) {
603
+ return invalidJson("JSON snapshots do not support non-finite numbers.");
604
+ }
605
+ continue;
606
+ }
607
+ if (typeof current !== "object") {
608
+ return invalidJson(`JSON snapshots do not support ${typeof current} values.`);
609
+ }
610
+ if (item.exiting) {
611
+ active.delete(current);
612
+ completed.add(current);
613
+ Object.freeze(current);
614
+ continue;
615
+ }
616
+ if (completed.has(current))
617
+ continue;
618
+ if (active.has(current)) {
619
+ return invalidJson("JSON snapshots do not support cycles.");
620
+ }
621
+ active.add(current);
622
+ pending.push({ exiting: true, value: current });
623
+ if (Array.isArray(current)) {
624
+ const length = current.length;
625
+ const descriptors2 = Object.getOwnPropertyDescriptors(current);
626
+ if (enumerableSymbolDescriptor(descriptors2)) {
627
+ return invalidJson("JSON snapshots cannot contain enumerable symbol properties.");
628
+ }
629
+ const keys2 = Object.keys(descriptors2).filter((key) => descriptors2[key]?.enumerable === true);
630
+ if (keys2.length !== length || keys2.some((key, index) => key !== String(index))) {
631
+ return invalidJson("JSON snapshot arrays must be dense and cannot have named properties.");
632
+ }
633
+ for (let index = length - 1;index >= 0; index -= 1) {
634
+ const descriptor = descriptors2[String(index)];
635
+ if (descriptor === undefined || descriptor.get !== undefined || descriptor.set !== undefined) {
636
+ return invalidJson("JSON snapshot arrays must contain plain data elements.");
637
+ }
638
+ pending.push({ exiting: false, value: descriptor.value });
639
+ }
640
+ continue;
641
+ }
642
+ const prototype = Object.getPrototypeOf(current);
643
+ if (prototype !== Object.prototype && prototype !== null) {
644
+ return invalidJson("JSON snapshots accept only arrays and plain objects.");
645
+ }
646
+ const descriptors = Object.getOwnPropertyDescriptors(current);
647
+ if (enumerableSymbolDescriptor(descriptors)) {
648
+ return invalidJson("JSON snapshots cannot contain enumerable symbol properties.");
649
+ }
650
+ const keys = Object.keys(descriptors).filter((key) => descriptors[key]?.enumerable === true);
651
+ for (let index = keys.length - 1;index >= 0; index -= 1) {
652
+ const key = keys[index];
653
+ if (key === undefined)
654
+ continue;
655
+ const descriptor = descriptors[key];
656
+ if (descriptor === undefined || descriptor.get !== undefined || descriptor.set !== undefined) {
657
+ return invalidJson("JSON snapshot properties must be plain data properties.");
658
+ }
659
+ if (descriptor.value === undefined) {
660
+ return invalidJson(`JSON snapshot property ${key} is undefined.`);
661
+ }
662
+ pending.push({ exiting: false, value: descriptor.value });
663
+ }
664
+ }
665
+ } catch (error) {
666
+ if (error instanceof SlopcameraCodeError)
667
+ throw error;
668
+ throw new SlopcameraCodeError("invalid-data", "JSON snapshot could not be safely inspected.", { cause: error instanceof Error ? error.message : String(error) });
669
+ }
670
+ return value;
671
+ }
672
+
673
+ // src/code/canonical-json.ts
674
+ var MAX_CANONICAL_JSON_BYTES = Number.MAX_SAFE_INTEGER;
675
+ var MAX_CANONICAL_JSON_DEPTH = Number.MAX_SAFE_INTEGER;
676
+ var MAX_CANONICAL_JSON_VALUES = Number.MAX_SAFE_INTEGER;
677
+ function compareUtf16Strings(left, right) {
678
+ return left < right ? -1 : left > right ? 1 : 0;
679
+ }
680
+ function canonicalLimits(bounds) {
681
+ return {
682
+ maximumDepth: bounds?.maximumDepth ?? MAX_CANONICAL_JSON_DEPTH,
683
+ maximumValues: bounds?.maximumValues ?? MAX_CANONICAL_JSON_VALUES
684
+ };
685
+ }
686
+ function boundedCanonicalJson(value, bounds) {
687
+ return createBoundedCanonicalJson(value, bounds.maximumBytes, bounds.name ?? "Canonical JSON", canonicalLimits(bounds));
688
+ }
689
+ function boundedCanonicalJsonSha256(value, bounds, hashPrefix) {
690
+ return createBoundedCanonicalSha256(value, bounds.maximumBytes, bounds.name ?? "Canonical JSON", canonicalLimits(bounds), hashPrefix);
691
+ }
692
+ function boundedCanonicalJsonFingerprint(value, bounds, hashPrefix) {
693
+ return createBoundedCanonicalFingerprint(value, bounds.maximumBytes, bounds.name ?? "Canonical JSON", canonicalLimits(bounds), hashPrefix);
694
+ }
695
+ function canonicalJson(value) {
696
+ return boundedCanonicalJson(value, {
697
+ maximumBytes: MAX_CANONICAL_JSON_BYTES
698
+ });
699
+ }
700
+ function canonicalJsonSha256(value) {
701
+ return boundedCanonicalJsonSha256(value, {
702
+ maximumBytes: MAX_CANONICAL_JSON_BYTES
703
+ });
704
+ }
705
+ function canonicalJsonSha256Prefixed(prefix, value) {
706
+ return boundedCanonicalJsonSha256(value, { maximumBytes: MAX_CANONICAL_JSON_BYTES }, prefix);
707
+ }
708
+ function canonicalJsonFingerprint(value, hashPrefix) {
709
+ return boundedCanonicalJsonFingerprint(value, { maximumBytes: MAX_CANONICAL_JSON_BYTES }, hashPrefix);
710
+ }
711
+
712
+ export { SlopcameraCodeError, slopcameraCodeErrorMessage, asSlopcameraCodeError, utf8ByteLength, createSha256HexHasher, sha256Hex, captureJsonStructure, createBoundedJsonValueSnapshot, createBoundedJsonSnapshot, deepFreezeJson, compareUtf16Strings, boundedCanonicalJson, boundedCanonicalJsonSha256, boundedCanonicalJsonFingerprint, canonicalJson, canonicalJsonSha256, canonicalJsonSha256Prefixed, canonicalJsonFingerprint };