@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,501 @@
1
+ import { HTML_OVERLAY_SCAFFOLD_KINDS } from "../html-overlay";
2
+
3
+ const HTML_OVERLAY_SCAFFOLD_KIND_HELP =
4
+ HTML_OVERLAY_SCAFFOLD_KINDS.join("|");
5
+
6
+ const GLOBAL_HELP = `slopcamera — creative scenes and non-destructive media editing for coding agents
7
+
8
+ Usage: slopcamera <command> [options]
9
+
10
+ Commands:
11
+ operations list|show Discover host-owned typed operations and policies
12
+ diagram init|check|render Create, validate, or render portable diagram sources
13
+ scene init|check|inspect|patch|evaluate|camera-track|plan|render
14
+ Author and inspect editable directed 3D scene sources
15
+ direct init|plan|start|generate|review|assemble
16
+ Direct short Gateway clips with retained takes and budgets
17
+ studio init|bundle|plan|probe|run|encode|asset|assemble|inspect|reconcile
18
+ Author and render retained Blender, CAD and Manim productions
19
+ image vectorize|generate Create a local SVG or generated image file
20
+ html catalog|scaffold Inspect or create a transparent HTML overlay starter
21
+ workflows list|show|plan|run Plan or run a reviewed reusable workflow
22
+ code init|check|plan|run Author, preflight, and run trusted TypeScript workflows
23
+ runs list|show|resume|approve|cancel
24
+ Inspect and control durable workflow runs
25
+ doctor Check local capture, render, and asset capabilities
26
+ ai models|image|video|speech|transcribe
27
+ Discover and run Vercel AI Gateway media models
28
+ media audio|color Apply local non-destructive audio and video effects
29
+ record start|pause|resume|stop|status
30
+ Control the repository-local capture session
31
+ recordings list List recording bundles
32
+ projects list|create List projects or create one from a recording
33
+ project inspect|add|edit|render
34
+ Manage synchronized project media, global edits, and output
35
+ align analyze|apply Align independent project clips from their audio
36
+ fillers list|apply Inspect or safely apply synchronized filler-word cuts
37
+ faces list Inspect bounded local face-geometry tracks
38
+ inspect <recording> Summarize tracks, segments, events, and edits
39
+ events <recording> Query bounded metadata events
40
+ edit <recording> <operation> Build a non-destructive edit plan
41
+ analyze faces|inactivity|music|scenes|speech
42
+ Analyze inactivity or structured project media
43
+ render plan|run <recording> Resolve or execute a render plan
44
+ assets emoji search|resolve Find checked local emoji overlays
45
+
46
+ Run slopcamera help <command> for command-specific help.`;
47
+
48
+ const HELP: Readonly<Record<string, string>> = {
49
+ studio: `Usage:
50
+ slopcamera studio init <new-directory> [--template blender-product|blender-character|blender-shaded-street|blender-cloth|blender-fluid|cadquery-bracket|manim-lesson] [--json]
51
+ slopcamera studio bundle <source.json> [--source-root <directory>] [--json]
52
+ slopcamera studio plan <job.json> [--json]
53
+ slopcamera studio probe <job.json> [--blender-bin <executable>|--python <venv-python>] [--json]
54
+ slopcamera studio run <job.json> --allow-trusted-code [--blender-bin <executable>|--python <venv-python>] [--json]
55
+ slopcamera studio inspect|reconcile <studio-id> [--json]
56
+ slopcamera studio encode <studio-id> --output-id <sequence-id> [--json]
57
+ slopcamera studio asset <studio-id> --output-id <id> --asset-id <asset-id> --representation native|encoded-video [--frame <integer>] [--json]
58
+ slopcamera studio assemble <studio-id> --output-id <sequence-id> [--name <title>] [--json]
59
+ slopcamera studio assets search <query.json> [--json]
60
+ slopcamera studio assets describe <poly-haven-asset-id> [--json]
61
+ slopcamera studio assets plan <selection.json> [--json]
62
+ slopcamera studio assets import <asset-plan.json> [--json]
63
+
64
+ Init writes a new editable source bundle and job. Bundle retains only explicitly listed
65
+ files without executing them. After source edits, bind the returned bundleSha256 into
66
+ a new job ID. Plan is inert; probe loads the selected installed engine and fixed driver.
67
+ Run executes trusted current-user native source without an OS sandbox. Runtime plugins
68
+ and ambient dependencies are not fully hermetic. Provider credentials are not inherited.
69
+ Blender/Cycles GPU requests fail if unavailable; no CPU fallback is implicit. Native
70
+ scenes, simulation caches and exact frames remain retained beside verified receipts.
71
+ Reconcile can restore a missing receipt only after a closed successful completion and
72
+ an unchanged validation checkpoint. Ambiguous work is never automatically resubmitted.
73
+
74
+ For local SDK workflows, code run, workflows run and runs resume accept
75
+ --studio-python <venv-python>, --studio-blender-bin <executable> and
76
+ --allow-trusted-code. Runtime selection alone grants no authored-code permission.
77
+ The fixed local operation is slopcamera.studio.run; its SDK surface is studio.run().`,
78
+ direct: `Usage:
79
+ slopcamera direct init <recipe.json> [--json]
80
+ slopcamera direct anchor --input <image> [--json]
81
+ slopcamera direct plan <recipe.json> [--json]
82
+ slopcamera direct start <recipe.json> --budget-usd <USD> [--json]
83
+ slopcamera direct inspect <direct-id> [--json]
84
+ slopcamera direct revise <direct-id> --recipe <recipe.json> [--json]
85
+ slopcamera direct generate <direct-id> --shot <shot-id> --attempt <take-id>
86
+ --allow-paid-generation [--allow-cloud-upload] [--allow-reference-hosting] [--json]
87
+ slopcamera direct cleanup <direct-id> --attempt <take-id> [--json]
88
+ slopcamera direct resume <direct-id> --attempt <take-id> [--json]
89
+ slopcamera direct review <direct-id> --attempt <take-id>
90
+ --decision accepted|rejected --note <review> [--json]
91
+ slopcamera direct assemble <direct-id> [--json]
92
+
93
+ Init writes a new recipe without overwriting. Edit its ID, shots, prompts and settings.
94
+ Anchor imports one explicit local image and returns a hash-bound source reference.
95
+ Plan checks live Gateway video capabilities and duration pricing without a paid call.
96
+ Start retains one budget for the direct ID; starting again cannot reset it.
97
+ Generate dispatches at most one new take and requires a unique take_<id>. Local images,
98
+ including a predecessor's endpoint, require --allow-cloud-upload on that invocation.
99
+ URL-only models require --allow-reference-hosting and a private Vercel Blob store.
100
+ Only exact reference images receive short-lived signed read URLs. Signed URLs and
101
+ credentials are not saved. Cleanup deletes those exact objects; inspect cleanup
102
+ receipts and use direct cleanup after interruptions. Blob charges are separate
103
+ from the model catalog estimate and require room in your overall spending limit.
104
+ Every dispatched, rejected, or ambiguous take retains its catalog cost reservation.
105
+ These USD reservations are estimates, not settled invoices or a provider-enforced cap.
106
+ Resume only reconciles retained local receipts and extracts missing endpoints; it never
107
+ resubmits a provider call. A completed take can be accepted after reviewing its video.
108
+ A shot-end reference uses the accepted predecessor's actual final decoded frame.
109
+ Revising a shot or choosing a different predecessor makes affected downstream takes stale.
110
+ Assemble requires current accepted takes for all shots and publishes an ordinary video
111
+ project for slopcamera project render run. Review and assembly work without cloud credentials.
112
+ This workflow retains image and prompt continuity; it has no provider neural checkpoint
113
+ or real-time session. Use slopcamera ai models list --type video for live model discovery.`,
114
+ scene: `Usage:
115
+ slopcamera scene init <scene.json> [--json]
116
+ slopcamera scene check <scene.json> [--json]
117
+ slopcamera scene inspect <scene.json> [--json]
118
+ slopcamera scene patch <scene.json> --patch <patch.json> --output <new-scene.json> [--json]
119
+ slopcamera scene evaluate <scene.json> --camera <camera-id> --time-us <integer> [--json]
120
+ slopcamera scene camera-track <scene.json> --request <sampling.json> --output <new-track.json> [--json]
121
+ slopcamera scene plan|render <scene.json> --request <request.json> [--assets <bindings.json>] [--profile <profile>] [--json]
122
+ slopcamera scene project snapshot <project-id> [--json]
123
+ slopcamera scene project prepare-render <project-id> --input <request.json> --output <prepared-render.json> [--profile <profile>] [--json]
124
+ slopcamera scene project migrate|patch|restore|add-shot|add-candidate|select-candidate|reconcile
125
+ <project-id> --input <request.json> [--json]
126
+ slopcamera scene world import --input <import.json> --source-root <directory>
127
+ --output-root <directory-below-artifacts/slopcamera/generated> [--json]
128
+
129
+ Hardware profiles: three-webgl2-hardware-v1 and three-spark-webgl2-hardware-v1.
130
+ An explicit profile must agree with the request; omitting it preserves the request.
131
+ Saved-world import works offline and preserves imported provenance receipts.
132
+ Scene sources retain stable entities, cameras, asset manifests and animation channels.
133
+ Inspect reports editable controls and known bounds without decoding assets. Patch requires
134
+ the exact expected scene digest in its patch document and writes a new source without
135
+ overwriting either revision. Evaluate samples absolute time without launching a renderer.
136
+ Project operations use the exact full project ID and a versioned whole-project basis.
137
+ Discover each request with slopcamera operations show spatial.project.<action> --json.
138
+ Migration retains the frozen media/edit pair in V2 authority. Legacy project commands
139
+ cannot modify a migrated project. Ambiguous publication returns its attempt for explicit
140
+ reconciliation and never automatically overwrites a later revision.`,
141
+ diagram: `Usage:
142
+ slopcamera diagram init [diagram.json]
143
+ slopcamera diagram check <diagram.json> [--config <file>] [--strict]
144
+ slopcamera diagram render <diagram.json> [--out-dir <directory>]
145
+ [--config <file>] [--scale <number>]
146
+
147
+ These commands delegate to the canonical @hraness/slopcamera parser. Init never overwrites.
148
+ Check parses and lints without writing; --strict exits 2 on findings. Render replaces the same five
149
+ portable derivatives: editable .tldr plus light/dark SVG and PNG. The registered Slopcamera diagram
150
+ operations separately publish equivalent derivatives by content hash for workflow composition.`,
151
+ image: `Usage:
152
+ slopcamera image vectorize <raster-path> --output <file.svg> [--json]
153
+ [--duotone '<#primary,#secondary>'] [--alpha-cutoff <n>] [--timeout-ms <n>]
154
+ slopcamera image generate <prompt> --output <file.webp> [--model <model>]
155
+ [--idempotency-key <key>] [--json]
156
+ slopcamera image generate --model <gateway-model> --prompt <prompt>
157
+
158
+ Explicit --output file commands delegate to @hraness/slopcamera. Vectorization is local,
159
+ bounded, checksum-pinned, and emits inert SVG. File generation uses Vercel AI Gateway with the
160
+ caller's environment credential. The --prompt spelling without --output is an alias for the desktop
161
+ content-addressed \`ai image generate\` lane and returns project-composable content hash references.`,
162
+ html: `Usage:
163
+ slopcamera html catalog [--json]
164
+ slopcamera html scaffold <${HTML_OVERLAY_SCAFFOLD_KIND_HELP}> --output <file.html>
165
+
166
+ Catalog lists the closed scaffold profiles in stable order with their primary jobs, render
167
+ substrates, and current exact browser-library versions. Scaffold creates a complete transparent
168
+ HTML overlay without overwriting an existing file. Scaffolds use the existing
169
+ @hraness/slopcamera/local/html-overlay API and exact locked import maps. Render the document through
170
+ workflow.media.htmlOverlay to receive a deterministic transparent video layer.`,
171
+ operations: `Usage:
172
+ slopcamera operations list [--json]
173
+ slopcamera operations show <kind>[@<version>] [--json]
174
+
175
+ Operation discovery is generated from the closed host registry. Workflow code may request these
176
+ operations but cannot override their schemas, privacy policy, resources, consent, or retry class.
177
+ List output is compact; show --json expands only the selected operation's input and output JSON
178
+ Schemas.`,
179
+ workflows: `Usage:
180
+ slopcamera workflows list [--json]
181
+ slopcamera workflows show <id> [--json]
182
+ slopcamera workflows plan <id> --input <json-file> [--json]
183
+ slopcamera workflows run <id> --input <json-file> [--provider-options <json-file>]
184
+ [--jobs <n>] [--json|--jsonl]
185
+ [--studio-python <venv-python>] [--studio-blender-bin <executable>] [--allow-trusted-code]
186
+
187
+ Built-ins are explicit versioned TypeScript graph recipes over the same operation registry as
188
+ custom code. Planning resolves structural project identity and policy bounds without executing
189
+ registered effects. Workflow execution may still evaluate trusted repository code; it is not a
190
+ sandbox. List output is compact; show --json expands only the selected workflow's input JSON
191
+ Schema.
192
+
193
+ Provider options are invocation-scoped. The raw JSON is never stored in a run or journal; only its
194
+ digest and sorted provider namespaces enter the exact plan. A resume must supply the same file
195
+ before a matching paid Gateway request can dispatch.`,
196
+ code: `Usage:
197
+ slopcamera code init <path>
198
+ slopcamera code check <path> [--json]
199
+ slopcamera code plan <path> --input <json-file> [--json]
200
+ slopcamera code run <path> --input <json-file> [--plan <sha256>]
201
+ [--provider-options <json-file>] [--jobs <n>] [--json|--jsonl]
202
+ [--studio-python <venv-python>] [--studio-blender-bin <executable>] [--allow-trusted-code]
203
+
204
+ Code mode bundles one repository-local TypeScript module and its physical local imports, builds a
205
+ strict typed operation graph in a separate process, and keeps stdout/stderr separate from framed
206
+ protocol data. --plan fails if source, input, structural bindings, registry, or runtime changed.
207
+ Raw provider options are ephemeral: only their digest and namespace list may enter an exact plan.
208
+
209
+ Trusted code mode is not a sandbox. Module top-level and later acknowledged compute callbacks run
210
+ with the current user's filesystem, process, and network authority. Slopcamera injects no
211
+ credentials or privileged handles into the worker.`,
212
+ runs: `Usage:
213
+ slopcamera runs list [--limit <n>] [--json]
214
+ slopcamera runs show <run-id> [--nodes failed|all] [--json]
215
+ slopcamera runs resume <run-id> [--replay-ambiguous-code <node-key> ...]
216
+ [--provider-options <json-file>] [--jobs <n>] [--json|--jsonl]
217
+ [--studio-python <venv-python>] [--studio-blender-bin <executable>] [--allow-trusted-code]
218
+ slopcamera runs approve <run-id> <node-key> --preparation-plan <sha256> [--json]
219
+ slopcamera runs approve <run-id> <node-key> --node-plan <sha256> [--json]
220
+ slopcamera runs cancel <run-id> [--json]
221
+
222
+ Approvals bind one exact preparation or node plan. Approve records authority and releases the
223
+ claim; only a later resume executes work. A normal resume never evaluates persisted trusted code.
224
+ Each --replay-ambiguous-code option authorizes the exact bundle, compute callback, node plan, and
225
+ next attempt named by that node. Cancellation is durable and prevents new dispatch or publication
226
+ without rolling back already published outcomes. Paid Gateway nodes that reference provider
227
+ options require the digest-matching file again on resume; raw values are never recovered from the
228
+ run journal.`,
229
+ ai: `Usage:
230
+ slopcamera ai provider-options inspect <json-file> [--json]
231
+ slopcamera ai models list [--type <all|image|video|speech|transcription>]
232
+ [--provider <name>] [--query <text>] [--limit <n>] [--refresh] [--json]
233
+ slopcamera ai models show <model-id> [--refresh] [--json]
234
+ slopcamera ai image generate --model <id> (--prompt <text> | --prompt-file <path>)
235
+ [--image <path-or-https-url> ...] [--mask <path-or-https-url>]
236
+ [--count <n>] [--max-per-call <n>]
237
+ [--size <width>x<height>] [--aspect-ratio <width>:<height>] [--seed <n>]
238
+ [--max-output-tokens <n>] [--temperature <n>] [--stop <text> ...]
239
+ [--provider-options <json-file>] [--timeout <time>]
240
+ [--allow-cloud-upload] [--json]
241
+ slopcamera ai video generate --model <id> [--prompt <text> | --prompt-file <path>]
242
+ [--image <path-or-https-url>] [--frame first=<path-or-https-url>]
243
+ [--frame last=<path-or-https-url>]
244
+ [--reference <media-path-or-https-url> ...] [--count <n>] [--max-per-call <n>]
245
+ [--aspect-ratio <width>:<height>] [--resolution <width>x<height>|<quality>]
246
+ [--duration <seconds>] [--fps <n>] [--seed <n>] [--generate-audio <bool>]
247
+ [--provider-options <json-file>] [--timeout <time>]
248
+ [--allow-cloud-upload] [--json]
249
+ slopcamera ai speech generate --model <id> (--text <text> | --text-file <path>)
250
+ [--voice <id>] [--format <format>] [--instructions <text> | --instructions-file <path>]
251
+ [--speed <0.25..4>] [--language <tag>] [--provider-options <json-file>]
252
+ [--timeout <time>] [--json]
253
+ slopcamera ai transcribe <audio-path> --model <id> --allow-cloud-audio-upload
254
+ [--format <all|json|text|srt|vtt>] [--provider-options <json-file>]
255
+ [--timeout <time>] [--json]
256
+
257
+ Set AI_GATEWAY_API_KEY in the process environment, or run through a linked Vercel project with
258
+ \`vercel env run -- slopcamera …\` so VERCEL_OIDC_TOKEN is injected. Slopcamera never persists,
259
+ prints, or accepts either credential through argv.
260
+
261
+ The media-model catalog is fetched live from Vercel AI Gateway and cached with a deterministic
262
+ revision. Every image, video, speech, and batch-transcription model of the matching operation is
263
+ executable; streaming-only transcription models remain discoverable and are labeled as such.
264
+ models are not limited by a checked adapter roster. models show preserves the live provider
265
+ capabilities and exposes model-aware parameter hints.
266
+
267
+ Provider-specific options are read from one bounded JSON object. Its outer keys are provider
268
+ names and its values are arbitrary bounded JSON objects, so newly released model controls remain
269
+ available without a CLI update. gateway.models is rejected because fallback models have not been
270
+ independently catalog-validated or accounted. Provider-specific sample-count fields are rejected;
271
+ use --count with --max-per-call at least as large so one job remains one AI SDK call. Options may contain BYOK credentials, webhook
272
+ secrets, or similar sensitive values: keep the source JSON ignored and owner-protected. Slopcamera
273
+ persists only its digest and namespace list, never its raw values. Common video controls are
274
+ first-class flags, including primary image, first/last frames, image/audio/video references, count,
275
+ aspect ratio, resolution, duration, FPS, seed, and generated audio. Frame inputs and generic
276
+ references are mutually exclusive because the AI SDK otherwise ignores the references; a primary
277
+ image cannot accompany a first frame.
278
+
279
+ provider-options inspect emits exactly the secret-free {sha256,namespaces} reference that workflow
280
+ nodes store in their exact request; it never prints or persists the raw option values.
281
+
282
+ Reference media and transcription audio never upload implicitly. The appropriate explicit
283
+ --allow-cloud-* acknowledgement is required after local files pass type and byte bounds. Image
284
+ and video references may instead use a public credential-free HTTPS URL when the live catalog
285
+ permits URL input or does not declare a source restriction; an explicit non-URL source list fails
286
+ locally. Add a <media-type>= prefix when the URL path has no recognized extension. Private/local
287
+ literal targets are rejected, and receipts retain only the URL digest and media type, never the
288
+ URL. Direct URL arguments remain visible to shell and process history, so use only references safe
289
+ for that exposure. The AI SDK client uses
290
+ maxRetries=0, and Slopcamera never resubmits an ambiguous paid call. AI Gateway can still route or
291
+ fail over one request across multiple providers, so one command may have multiple provider
292
+ attempts; provider timeouts may still incur charges. Outputs and immutable receipts are written
293
+ under gitignored artifacts/slopcamera/generated/. Receipts report complete, partial, or overproduced
294
+ sample fulfillment. Self-describing generated media is fully decoded locally before an import
295
+ command is emitted; invalid paid bytes remain quarantined with no import command. Headerless PCM, L16, A-law, basic, and mu-law speech
296
+ is saved and hashed but receives no project-add command; convert it with explicit sample metadata
297
+ first.`,
298
+ analyze: `Usage:
299
+ slopcamera analyze faces <project> --source <asset:video-stream> [options] [--json]
300
+ slopcamera analyze inactivity <recording|project> [options]
301
+ slopcamera analyze zooms <recording> [--apply] [--json]
302
+ slopcamera analyze music <project> --source <asset:audio-stream> [--window <time>] [--json]
303
+ slopcamera analyze scenes <project> --source <asset:video-stream> [options]
304
+ slopcamera analyze speech <project> --source <asset:audio-stream> --model <whisper-model> [options]
305
+
306
+ Scene options: --max-scene-duration <time> --scene-threshold <0..1>
307
+ --model <google/gemini-*> --execute --allow-cloud-upload --json
308
+ Scene analysis is local planning by default. Execution uploads only selected derived frames and requires explicit acknowledgement.
309
+
310
+ Face options: --backend <auto|vision> --sample-fps <n>
311
+ --min-confidence <0..1> --max-track-gap <time> --max-faces <n> --json
312
+ Face detection runs locally against immutable project media. Track IDs are geometry continuity only; no recognition, embeddings, names, crops, or cloud upload are produced.
313
+
314
+ Inactivity options: --min-duration <time> --motion-threshold <0..1>
315
+ --protect-audio <bool> --handle <cut|speed|keep>
316
+ --speed-rate <1..64> --apply --json
317
+ Projects analyze every enabled screen stream, optionally require silence on every enabled audio stream, and map reference-recording interactions through accepted placement sync. Project evidence is always persisted; --apply adds one global cut or speed decision per recommended range.
318
+
319
+ Speech options: --whisper <path> --language <auto|tag> --threads <n> --processors <n>
320
+ --no-gpu --min-filler-confidence <0..1> --speech-handle <time>
321
+ --protect-music <bool> --json
322
+ The whisper executable may come from SLOPCAMERA_WHISPER_CPP and the model from SLOPCAMERA_WHISPER_MODEL.`,
323
+ align: `Usage:
324
+ slopcamera align analyze <project> --reference <asset:stream> --target <asset:stream>
325
+ [--reference-placement <id>] [--target-placement <id>] [--max-offset <time>]
326
+ [--apply] [--candidate <id>] [--json]
327
+ slopcamera align apply <project> <analysis-id> --candidate <id>
328
+ [--reference-placement <id>] [--target-placement <id>] [--json]
329
+
330
+ Analysis writes immutable evidence. Automatic application requires an unambiguous high-confidence candidate; an explicit candidate may be applied after inspection.`,
331
+ assets: `Usage: slopcamera assets emoji <search|resolve> <glyph|name|hex-id|brand-domain> [options]
332
+
333
+ Options: --provider <all|auto|apple-emoji-pack|brand-catalog>
334
+ --variant <color|duotone> --limit <n> --json
335
+
336
+ Brand-catalog overlays use SVG assets verified by size and hash. Search reports their available color or duotone variants.`,
337
+ doctor: `Usage: slopcamera doctor [--json]`,
338
+ edit: `Usage: slopcamera edit <recording> <operation> [options]
339
+
340
+ Operations:
341
+ init | show
342
+ trim <from> <to>
343
+ cut <from> <to>
344
+ speed <from> <to> <rate>
345
+ zoom [add] --from <time> --to <time> --target <rect|point|cursor|window|focused-input>
346
+ [--rect <x,y,width,height> | --point <x,y> | --window <id-or-title>]
347
+ [--display <id>] [--scale <number>] [--enter-duration <time>]
348
+ [--exit-duration <time>] [--easing <linear|ease-in|ease-out|ease-in-out|spring>]
349
+ zoom remove <id>
350
+ overlay add --kind <image|svg|gif|video|emoji> --source <value> --from <time> --to <time>
351
+ [--position <x,y>] [--anchor <top-left|top|top-right|left|center|right|bottom-left|bottom|bottom-right>]
352
+ [--width <px>] [--height <px>] [--scale <number>] [--rotation <degrees>]
353
+ [--opacity <0..1>] [--z-index <integer>]
354
+ [--entrance <none|fade|scale|slide-up|slide-down|slide-left|slide-right>]
355
+ [--entrance-duration <time>] [--exit <none|fade|scale|slide-up|slide-down|slide-left|slide-right>]
356
+ [--exit-duration <time>] [--easing <linear|ease-in|ease-out|ease-in-out|spring>]
357
+ [--source-in <time>] [--source-out <time>] [--playback-rate <number>]
358
+ [--loop <bool>] [--freeze-end <bool>] [--animated-audio <mute|mix|duck>]
359
+ [--audio-volume <0..4>] [--duck-primary-to <0..1>]
360
+ [--fit <contain|cover|fill>] [--crop <left,top,right,bottom>]
361
+ [--blend-mode <normal|addition|darken|lighten|multiply|overlay|screen>]
362
+ [--corner-radius <px>] [--slide-distance <px>]
363
+ [--entrance-from-scale <number>] [--exit-to-scale <number>]
364
+ [--keyframe <offset,x,y,scale,rotation,opacity>] (repeatable)
365
+ [--provider <auto|apple-emoji-pack|brand-catalog>] [--variant <color|duotone>]
366
+ overlay remove <id>
367
+ cursor <on|off>
368
+ clicks <on|off>
369
+ keystrokes <on|off>
370
+ typed-text <on|off>
371
+
372
+ All mutations support --json and return the resulting plan hash.`,
373
+ events: `Usage: slopcamera events <recording> --kind <kind> [options]
374
+
375
+ Options: --kind <kind[,kind]> (repeatable) --from <time> --to <time>
376
+ --around <time> --limit <1..10000> --json | --jsonl`,
377
+ inspect: `Usage: slopcamera inspect <recording> [--fields <csv>] [--json]`,
378
+ media: `Usage:
379
+ slopcamera media audio <media-path> [effects] [--audio-stream <index>]
380
+ [--output <relative-path>] [--json]
381
+ slopcamera media color <video-path> [grade] [--video-stream <index>]
382
+ [--output <relative-path>] [--json]
383
+
384
+ Audio effects may be combined in one deterministic chain:
385
+ --volume-db <-60..24>
386
+ --compressor [--compressor-threshold-db <-60..0>] [--compressor-ratio <1..20>]
387
+ [--compressor-attack-ms <0.1..2000>] [--compressor-release-ms <1..9000>]
388
+ [--compressor-makeup-db <0..36>]
389
+ --delay-ms <1..10000> [--delay-mix <0..1>] [--delay-feedback <0..0.95>]
390
+ --reverb <room|hall|plate> [--reverb-wet <0..1>]
391
+ --denoise [--denoise-reduction-db <0.01..97>]
392
+
393
+ Color grading supports --preset <clean|warm|cool|cinematic|vivid|flat|mono> plus independently
394
+ bounded --brightness, --contrast, --saturation, --gamma, --temperature, --tint, and
395
+ --hue-degrees controls.
396
+
397
+ Transforms call the checked local FFmpeg executable with an argv array, never a shell. They never
398
+ overwrite the source. Each output uses fresh no-replace publication, then post-render verification
399
+ and a receipt under gitignored artifacts/slopcamera/generated/. A crash after output publication but
400
+ before receipt publication can leave an orphan; the next run reports a conflict for explicit
401
+ inspection and removal. JSON output includes SHA-256 provenance and an exact project-add next
402
+ command.`,
403
+ fillers: `Usage:
404
+ slopcamera fillers list <project> <speech-analysis-id> [--auto-only] [--json]
405
+ slopcamera fillers apply <project> <speech-analysis-id> <candidate-id> [--placement <id>] [--json]
406
+
407
+ Apply accepts only candidates with safe acoustic boundaries and current placement synchronization. Every enabled audio stream must have a current music analysis; all detected music is projected into project time and missing coverage or overlap fails closed. Manual project cuts remain available for editorial overrides.`,
408
+ faces: `Usage:
409
+ slopcamera faces list <project> <face-analysis-id> [--at <asset-time>]
410
+ [--min-duration <time>] [--min-confidence <0..1>] [--limit <1..1000>] [--json]
411
+
412
+ Face track IDs describe local geometry continuity inside one immutable analysis. They do not identify a person.`,
413
+ record: `Usage:
414
+ slopcamera record start [--display <id> ...]
415
+ [--camera-device <id>] [--microphone-device <id>]
416
+ [--webcam <true|false>] [--microphone <true|false>]
417
+ [--system-audio <true|false>] [--typed-text <true|false>]
418
+ [--strict-inputs] [--json]
419
+ slopcamera record pause|resume|stop|status [--json]
420
+
421
+ Capture defaults to every current display, system audio, the default microphone,
422
+ and the default camera. Repeat --display to record an exact non-empty subset.
423
+ Device IDs select the exact camera or microphone reported by slopcamera doctor;
424
+ unknown or duplicate IDs fail closed. Typed-text capture remains opt-in with
425
+ --typed-text true.`,
426
+ recordings: `Usage: slopcamera recordings list [--limit <n>] [--json]`,
427
+ projects: `Usage:
428
+ slopcamera projects list [--limit <n>] [--json]
429
+ slopcamera projects create --from-recording <recording> [--name <name>] [--json]`,
430
+ project: `Usage:
431
+ slopcamera project inspect <project> [--json]
432
+ slopcamera project add <project> <media-path> --role <screen|camera|b-roll|system-audio|microphone|portable-audio|music|dialogue|other> [--at <project-time>] [--json]
433
+ slopcamera project edit <project> cut <from> <to> [--json]
434
+ slopcamera project edit <project> trim <from> <to> [--json]
435
+ slopcamera project edit <project> speed <from> <to> <rate> [--json]
436
+ slopcamera project edit <project> camera push --placement <id> --stream <id>
437
+ --from <time> --to <time> --center <x,y> --end-zoom <z>
438
+ [--start-zoom <z>] [--easing <name>] [--json]
439
+ slopcamera project edit <project> camera reframe --placement <id> --stream <id>
440
+ --from <time> --to <time> --from-frame <x,y,z> --to-frame <x,y,z>
441
+ [--easing <name>] [--json]
442
+ slopcamera project edit <project> camera path --placement <id> --stream <id>
443
+ --keyframe <time,x,y,zoom> --keyframe <time,x,y,zoom> [...]
444
+ [--easing <name>] [--json]
445
+ slopcamera project edit <project> camera follow-faces --placement <id> --analysis <id>
446
+ --from <time> --to <time> (--track <id> ... | --select <largest|all>)
447
+ [--framing <tight|medium|wide|group>] [--gap-policy <hold|fallback|fail>]
448
+ [--require-all-selected]
449
+ [--min-zoom <n>] [--max-zoom <n>] [--smoothing <seconds>] [--headroom <ratio>]
450
+ [--output-width <even-px>] [--output-height <even-px>] [--json]
451
+ slopcamera project edit <project> camera show|remove [camera-move-id] [--json]
452
+ slopcamera project edit <project> zoom [add] --from <time> --to <time> --target <rect|point|cursor|window|focused-input>
453
+ [zoom-options] [--source-placement <recording-backed-placement>] [--json]
454
+ slopcamera project edit <project> zoom remove <id> [--json]
455
+ slopcamera project edit <project> cursor|clicks|keystrokes|typed-text <on|off>
456
+ [effect-options] [--source-placement <recording-backed-placement>] [--json]
457
+ slopcamera project edit <project> overlay add --kind <image|svg|gif|video|emoji> --source <value> --from <time> --to <time> [overlay-options]
458
+ slopcamera project edit <project> overlay remove <id> [--json]
459
+ slopcamera project render <plan|run> <project> [--width <px>] [--height <px>] [--fps <n>]
460
+ [--output <renders/path.mp4>] [--dry-run] [--allow-unverified-sync] [--json]
461
+
462
+ Imported media starts unverified. Align its audio before relying on synchronization. Structural edits are project-time operations and affect every placement. Camera moves address any placed video stream; metadata-driven screen zooms still require a recording-backed source placement. Face analysis and geometry tracks remain local. --select largest follows the largest currently visible prepared-layer face per frame. --require-all-selected makes a missing explicit/all-selected face invoke the chosen gap policy.`,
463
+ render: `Usage: slopcamera render <plan|run> <recording> [--display <id|primary>] [--output <path>] [--dry-run] [--keep-inactivity] [--json]
464
+
465
+ Long inactivity is analyzed and removed by default; use --keep-inactivity to opt out.`,
466
+ };
467
+
468
+ export function commandHelp(topic: readonly string[]): string {
469
+ if (topic.length === 0) return GLOBAL_HELP;
470
+ return HELP[topic[0]!] ?? GLOBAL_HELP;
471
+ }
472
+
473
+ export function completions(words: readonly string[]): readonly string[] {
474
+ const topLevel = [
475
+ "operations", "diagram", "direct", "studio", "image", "workflows", "code", "runs", "doctor", "ai", "media", "record", "recordings", "projects", "project", "inspect", "events", "edit", "analyze", "align", "faces", "fillers", "render", "assets",
476
+ ];
477
+ if (words.length <= 1) return topLevel;
478
+ const command = words[0];
479
+ if (command === "direct") return ["init", "anchor", "plan", "start", "inspect", "revise", "generate", "resume", "review", "assemble", "cleanup"];
480
+ if (command === "studio") return words[2] === "assets" || words[1] === "assets" ? ["search", "describe", "plan", "import"] : ["init", "bundle", "plan", "probe", "run", "encode", "asset", "assemble", "inspect", "reconcile", "assets"];
481
+ if (command === "operations") return ["list", "show"];
482
+ if (command === "diagram") return ["check", "render"];
483
+ if (command === "image") return ["vectorize"];
484
+ if (command === "workflows") return ["list", "show", "plan", "run"];
485
+ if (command === "code") return ["init", "check", "plan", "run"];
486
+ if (command === "runs") return ["list", "show", "resume", "approve", "cancel"];
487
+ if (command === "record") return ["start", "pause", "resume", "stop", "status"];
488
+ if (command === "recordings") return ["list"];
489
+ if (command === "projects") return ["list", "create"];
490
+ if (command === "project") return ["inspect", "add", "edit", "render"];
491
+ if (command === "edit") return ["init", "show", "trim", "cut", "speed", "zoom", "overlay", "cursor", "clicks", "keystrokes", "typed-text"];
492
+ if (command === "analyze") return ["faces", "inactivity", "zooms", "music", "scenes", "speech"];
493
+ if (command === "faces") return ["list"];
494
+ if (command === "align") return ["analyze", "apply"];
495
+ if (command === "fillers") return ["list", "apply"];
496
+ if (command === "ai") return ["models", "provider-options", "image", "video", "speech", "transcribe"];
497
+ if (command === "media") return ["audio", "color"];
498
+ if (command === "render") return ["plan", "run"];
499
+ if (command === "assets") return ["emoji"];
500
+ return [];
501
+ }
@@ -0,0 +1,97 @@
1
+ import { release } from "node:os";
2
+ import type { Browser, JSHandle, Page } from "playwright-core";
3
+ import { z } from "zod";
4
+ import {
5
+ HtmlOverlayBrowserGpuEvidenceSchema, HtmlOverlayWebGlContextEvidenceSchema,
6
+ parseHtmlOverlayGpuEvidence, type HtmlOverlayExecutionProfile, type HtmlOverlayGpuEvidence,
7
+ } from "../html-overlay/execution-profile";
8
+
9
+ type WebGlContextEvidence = z.infer<typeof HtmlOverlayWebGlContextEvidenceSchema>;
10
+ export interface HtmlOverlayGpuProbe { inspect(): WebGlContextEvidence }
11
+
12
+ /** Install before authored code. Keep native methods and the active context outside its globals. */
13
+ export async function installHtmlOverlayGpuProbe(page: Page): Promise<JSHandle<HtmlOverlayGpuProbe>> {
14
+ return await page.evaluateHandle(() => {
15
+ const apply = Reflect.apply;
16
+ const queryAll = Document.prototype.querySelectorAll;
17
+ const getContext = HTMLCanvasElement.prototype.getContext;
18
+ const glPrototype = WebGL2RenderingContext.prototype;
19
+ const getParameter = glPrototype.getParameter;
20
+ const getExtension = glPrototype.getExtension;
21
+ const isContextLost = glPrototype.isContextLost;
22
+ const getError = glPrototype.getError;
23
+ const finish = glPrototype.finish;
24
+ const addEventListener = EventTarget.prototype.addEventListener;
25
+ let observedCanvas: HTMLCanvasElement | undefined;
26
+ let observedContext: WebGL2RenderingContext | undefined;
27
+ let lost = false;
28
+ return {
29
+ inspect() {
30
+ const canvases = apply(queryAll, document, ["canvas"]) as NodeListOf<HTMLCanvasElement>;
31
+ if (canvases.length !== 1) throw new Error("Hardware scene capture requires exactly one visible render canvas.");
32
+ const canvas = canvases[0]!;
33
+ const gl = apply(getContext, canvas, ["webgl2"]) as WebGL2RenderingContext | null;
34
+ if (gl === null || (observedContext !== undefined && (gl !== observedContext || canvas !== observedCanvas))) throw new Error("Hardware scene changed or lacks its actual WebGL2 context.");
35
+ if (observedContext === undefined) {
36
+ observedCanvas = canvas; observedContext = gl;
37
+ apply(addEventListener, canvas, ["webglcontextlost", () => { lost = true; }]);
38
+ }
39
+ if (lost || apply(isContextLost, gl, [])) throw new Error("Hardware scene WebGL2 context was lost.");
40
+ apply(finish, gl, []);
41
+ if (lost || apply(isContextLost, gl, []) || apply(getError, gl, []) !== 0) throw new Error("Hardware scene GPU work failed before capture completed.");
42
+ const debug = apply(getExtension, gl, ["WEBGL_debug_renderer_info"]) as WEBGL_debug_renderer_info | null;
43
+ if (debug === null) throw new Error("Hardware scene requires observable active GPU identity.");
44
+ const parameter = (key: number): unknown => apply(getParameter, gl, [key]);
45
+ const viewport = parameter(0x0d3a) as Int32Array;
46
+ return {
47
+ vendor: parameter(0x1f00) as string, renderer: parameter(0x1f01) as string,
48
+ version: parameter(0x1f02) as string, shadingLanguageVersion: parameter(0x8b8c) as string,
49
+ unmaskedVendor: parameter(0x9245) as string,
50
+ unmaskedRenderer: parameter(0x9246) as string,
51
+ maxTextureSize: parameter(0x0d33) as number, maxRenderbufferSize: parameter(0x84e8) as number,
52
+ maxViewportDimensions: [viewport[0]!, viewport[1]!] as [number, number],
53
+ halfFloatColorBuffer: (apply(getExtension, gl, ["EXT_color_buffer_float"]) !== null) as true,
54
+ };
55
+ },
56
+ };
57
+ });
58
+ }
59
+
60
+ /** Retain only graphics fields; never raw CDP machine, command-line or process information. */
61
+ export async function inspectHtmlOverlayBrowserGpu(browser: Browser) {
62
+ const session = await browser.newBrowserCDPSession();
63
+ try {
64
+ const result = z.object({ gpu: z.object({
65
+ devices: z.array(z.object({
66
+ vendorId: z.number().int().min(0).max(0xffff_ffff).default(0), deviceId: z.number().int().min(0).max(0xffff_ffff).default(0),
67
+ vendorString: z.string().max(1_024).default(""), deviceString: z.string().max(1_024).default(""),
68
+ driverVendor: z.string().max(1_024).default(""), driverVersion: z.string().max(1_024).default(""),
69
+ })).min(1).max(8),
70
+ auxAttributes: z.object({ glVendor: z.string(), glRenderer: z.string(), glVersion: z.string() }),
71
+ featureStatus: z.object({ webgl: z.literal("enabled"), webgl2: z.literal("enabled").optional() }),
72
+ }) }).parse(await session.send("SystemInfo.getInfo"));
73
+ const gpu = result.gpu;
74
+ return HtmlOverlayBrowserGpuEvidenceSchema.parse({
75
+ devices: gpu.devices.map(device => ({
76
+ vendorId: device.vendorId, deviceId: device.deviceId, vendorString: device.vendorString,
77
+ deviceString: device.deviceString, driverVendor: device.driverVendor, driverVersion: device.driverVersion,
78
+ })),
79
+ glVendor: gpu.auxAttributes?.glVendor, glRenderer: gpu.auxAttributes?.glRenderer,
80
+ glVersion: gpu.auxAttributes?.glVersion,
81
+ webgl: gpu.featureStatus.webgl,
82
+ ...(gpu.featureStatus.webgl2 === undefined ? {} : { webgl2: gpu.featureStatus.webgl2 }),
83
+ });
84
+ } finally { await session.detach(); }
85
+ }
86
+
87
+ export function createHtmlOverlayGpuEvidence(
88
+ executionProfile: HtmlOverlayExecutionProfile,
89
+ context: unknown,
90
+ browserGpu: unknown,
91
+ ): HtmlOverlayGpuEvidence {
92
+ return parseHtmlOverlayGpuEvidence({
93
+ kind: "slopcamera.html-overlay-gpu-evidence", schemaVersion: 1, executionProfile,
94
+ api: "webgl2", backend: "angle-metal", platform: process.platform,
95
+ architecture: process.arch, osRelease: release(), context, browserGpu,
96
+ });
97
+ }