@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
package/src/tldr.ts ADDED
@@ -0,0 +1,474 @@
1
+ import { sanitizeIcon } from "./icons.js"
2
+ import { layoutBoxContent } from "./label-layout.js"
3
+ import { resolveEdge, resolveEdgeLabel } from "./render.js"
4
+ import { resolveTheme } from "./theme.js"
5
+ import type {
6
+ BoxShape,
7
+ DiagramConfig,
8
+ DiagramFontFamily,
9
+ DiagramShape,
10
+ DiagramSpec,
11
+ IconDefinition,
12
+ LineShape,
13
+ TextShape,
14
+ TextWeight,
15
+ Tone,
16
+ } from "./types.js"
17
+
18
+ type TldrawRecord = Readonly<Record<string, unknown>>
19
+
20
+ const schema = {
21
+ schemaVersion: 2,
22
+ sequences: {
23
+ "com.tldraw.store": 5,
24
+ "com.tldraw.asset": 1,
25
+ "com.tldraw.camera": 1,
26
+ "com.tldraw.document": 2,
27
+ "com.tldraw.instance": 26,
28
+ "com.tldraw.instance_page_state": 5,
29
+ "com.tldraw.page": 1,
30
+ "com.tldraw.instance_presence": 6,
31
+ "com.tldraw.pointer": 1,
32
+ "com.tldraw.shape": 4,
33
+ "com.tldraw.user": 1,
34
+ "com.tldraw.asset.image": 6,
35
+ "com.tldraw.asset.video": 5,
36
+ "com.tldraw.asset.bookmark": 2,
37
+ "com.tldraw.shape.group": 0,
38
+ "com.tldraw.shape.text": 4,
39
+ "com.tldraw.shape.bookmark": 2,
40
+ "com.tldraw.shape.draw": 5,
41
+ "com.tldraw.shape.geo": 11,
42
+ "com.tldraw.shape.note": 13,
43
+ "com.tldraw.shape.line": 5,
44
+ "com.tldraw.shape.frame": 1,
45
+ "com.tldraw.shape.arrow": 8,
46
+ "com.tldraw.shape.highlight": 4,
47
+ "com.tldraw.shape.embed": 4,
48
+ "com.tldraw.shape.image": 5,
49
+ "com.tldraw.shape.video": 4,
50
+ "com.tldraw.binding.arrow": 1,
51
+ },
52
+ } as const
53
+
54
+ const tldrawColors: Readonly<Record<Tone, string>> = {
55
+ neutral: "black",
56
+ blue: "blue",
57
+ orange: "orange",
58
+ green: "green",
59
+ red: "red",
60
+ purple: "violet",
61
+ yellow: "yellow",
62
+ }
63
+
64
+ function richText(text: string, weight: TextWeight = 400): Readonly<Record<string, unknown>> {
65
+ return {
66
+ type: "doc",
67
+ content: text.split("\n").map((line) => ({
68
+ type: "paragraph",
69
+ ...(line === ""
70
+ ? {}
71
+ : {
72
+ content: [
73
+ {
74
+ type: "text",
75
+ text: line,
76
+ ...(weight < 600 ? {} : { marks: [{ type: "bold" }] }),
77
+ },
78
+ ],
79
+ }),
80
+ })),
81
+ }
82
+ }
83
+
84
+ function authoredShapeId(id: string): string {
85
+ return `shape:${id}`
86
+ }
87
+
88
+ function generatedShapeId(kind: "box-icon" | "box-label" | "edge-label", id: string): string {
89
+ return `shape:slopcamera:${kind}:${id}`
90
+ }
91
+
92
+ function shapeMeta(sourceId: string): Readonly<Record<string, unknown>> {
93
+ return { diagram: { version: 1, sourceId } }
94
+ }
95
+
96
+ function indexKey(index: number): string {
97
+ if (!Number.isSafeInteger(index) || index < 0) {
98
+ throw new Error(`A .tldr index must be a non-negative safe integer, received ${index}`)
99
+ }
100
+ const digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
101
+ let width = 1
102
+ let remaining = index
103
+ let capacity = digits.length
104
+ while (remaining >= capacity) {
105
+ remaining -= capacity
106
+ width += 1
107
+ capacity *= digits.length
108
+ if (width > 26 || !Number.isSafeInteger(capacity)) {
109
+ throw new Error("A .tldr export contains too many generated records")
110
+ }
111
+ }
112
+ let suffix = ""
113
+ for (let place = 0; place < width; place += 1) {
114
+ suffix = `${digits[remaining % digits.length]}${suffix}`
115
+ remaining = Math.floor(remaining / digits.length)
116
+ }
117
+ return `${String.fromCharCode("a".charCodeAt(0) + width - 1)}${suffix}`
118
+ }
119
+
120
+ function baseShape(shape: DiagramShape, index: number): TldrawRecord {
121
+ return {
122
+ x: shape.x,
123
+ y: shape.y,
124
+ rotation: 0,
125
+ isLocked: false,
126
+ opacity: shape.opacity ?? 1,
127
+ meta: shapeMeta(shape.id),
128
+ id: authoredShapeId(shape.id),
129
+ parentId: "page:page",
130
+ index: indexKey(index),
131
+ typeName: "shape",
132
+ }
133
+ }
134
+
135
+ function textShape(options: {
136
+ readonly recordId: string
137
+ readonly sourceId: string
138
+ readonly x: number
139
+ readonly y: number
140
+ readonly width: number
141
+ readonly text: string
142
+ readonly tone: Tone
143
+ readonly size: "s" | "m" | "l" | "xl"
144
+ readonly align: "start" | "middle" | "end"
145
+ readonly index: number
146
+ readonly opacity?: number
147
+ readonly scale?: number
148
+ readonly fontFamily?: DiagramFontFamily
149
+ readonly weight?: TextWeight
150
+ }): TldrawRecord {
151
+ return {
152
+ x: options.x,
153
+ y: options.y,
154
+ rotation: 0,
155
+ isLocked: false,
156
+ opacity: options.opacity ?? 1,
157
+ meta: shapeMeta(options.sourceId),
158
+ id: options.recordId,
159
+ type: "text",
160
+ props: {
161
+ color: tldrawColors[options.tone],
162
+ size: options.size,
163
+ w: options.width,
164
+ font: options.fontFamily === "mono" ? "mono" : "sans",
165
+ textAlign: options.align,
166
+ autoSize: false,
167
+ scale: options.scale ?? 1,
168
+ richText: richText(options.text, options.weight),
169
+ },
170
+ parentId: "page:page",
171
+ index: indexKey(options.index),
172
+ typeName: "shape",
173
+ }
174
+ }
175
+
176
+ function svgIconAsset(icon: IconDefinition, color: string): string {
177
+ const clean = sanitizeIcon(icon)
178
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="${clean.viewBox}" fill="none" color="${color}">${clean.body}</svg>`
179
+ return `data:image/svg+xml;base64,${Buffer.from(svg).toString("base64")}`
180
+ }
181
+
182
+ const tldrawTextFontSizes = {
183
+ s: 18,
184
+ m: 24,
185
+ l: 36,
186
+ xl: 44,
187
+ } as const
188
+
189
+ function scaledTldrawSize(fontSize: number): {
190
+ readonly size: keyof typeof tldrawTextFontSizes
191
+ readonly scale: number
192
+ } {
193
+ const size = fontSize < 21 ? "s" : fontSize < 30 ? "m" : fontSize < 40 ? "l" : "xl"
194
+ return { size, scale: fontSize / tldrawTextFontSizes[size] }
195
+ }
196
+
197
+ export function serializeTldr(spec: DiagramSpec, config: DiagramConfig): string {
198
+ const records: TldrawRecord[] = [
199
+ {
200
+ gridSize: 10,
201
+ name: spec.name,
202
+ meta: { diagram: { version: 1 } },
203
+ id: "document:document",
204
+ typeName: "document",
205
+ },
206
+ {
207
+ meta: {},
208
+ id: "page:page",
209
+ name: "Page 1",
210
+ index: "a1",
211
+ typeName: "page",
212
+ },
213
+ ]
214
+ const icons = config.icons ?? {}
215
+ const lightTheme = resolveTheme("light", config)
216
+ let generatedIndex = 1
217
+
218
+ for (const shape of spec.shapes) {
219
+ generatedIndex += 1
220
+ if (shape.type === "rect" || shape.type === "ellipse") {
221
+ const box = shape as BoxShape
222
+ const hasIcon = box.icon !== undefined
223
+ const hasSeparateLabel =
224
+ box.labelRows !== undefined ||
225
+ (box.label !== undefined &&
226
+ (hasIcon ||
227
+ box.labelFontSize !== undefined ||
228
+ box.labelFontFamily !== undefined ||
229
+ box.labelWeight !== undefined))
230
+ records.push({
231
+ ...baseShape(box, generatedIndex),
232
+ type: "geo",
233
+ props: {
234
+ w: box.width,
235
+ h: box.height,
236
+ geo: box.type === "ellipse" ? "ellipse" : "rectangle",
237
+ dash: "solid",
238
+ growY: 0,
239
+ url: "",
240
+ scale: 1,
241
+ color: tldrawColors[box.tone ?? "neutral"],
242
+ labelColor: "black",
243
+ fill: box.fill === false ? "none" : "solid",
244
+ size: (box.strokeWidth ?? 2) >= 4 ? "l" : "m",
245
+ font: "sans",
246
+ align: "middle",
247
+ verticalAlign: "middle",
248
+ richText: richText(hasSeparateLabel ? "" : (box.label ?? ""), box.labelWeight),
249
+ },
250
+ })
251
+ const iconSize = Math.min(box.iconSize ?? 52, box.height * 0.45, box.width * 0.32)
252
+ const content = layoutBoxContent(box, hasIcon ? iconSize : undefined)
253
+ if (box.icon !== undefined) {
254
+ const icon = icons[box.icon]
255
+ if (icon === undefined) throw new Error(`Unknown icon "${box.icon}" on shape ${box.id}`)
256
+ if (content.icon === undefined) throw new Error(`Missing icon layout for shape ${box.id}`)
257
+ const assetId = `asset:icon-${box.id}`
258
+ records.push({
259
+ id: assetId,
260
+ type: "image",
261
+ typeName: "asset",
262
+ props: {
263
+ name: `${box.icon}.svg`,
264
+ src: svgIconAsset(icon, lightTheme.tones[box.tone ?? "neutral"].text),
265
+ w: 96,
266
+ h: 96,
267
+ mimeType: "image/svg+xml",
268
+ isAnimated: false,
269
+ },
270
+ meta: { diagram: { version: 1, icon: box.icon } },
271
+ })
272
+ generatedIndex += 1
273
+ records.push({
274
+ x: content.icon.x,
275
+ y: content.icon.y,
276
+ rotation: 0,
277
+ isLocked: false,
278
+ opacity: box.opacity ?? 1,
279
+ meta: shapeMeta(box.id),
280
+ id: generatedShapeId("box-icon", box.id),
281
+ type: "image",
282
+ props: {
283
+ w: iconSize,
284
+ h: iconSize,
285
+ assetId,
286
+ playing: true,
287
+ url: "",
288
+ crop: null,
289
+ flipX: false,
290
+ flipY: false,
291
+ altText:
292
+ box.labelRows?.map((row) => row.text).join(" ") ?? box.label ?? box.icon,
293
+ },
294
+ parentId: "page:page",
295
+ index: indexKey(generatedIndex),
296
+ typeName: "shape",
297
+ })
298
+ }
299
+ if (hasSeparateLabel) {
300
+ for (const [rowIndex, row] of content.rows.entries()) {
301
+ const textStyle = scaledTldrawSize(row.fontSize)
302
+ generatedIndex += 1
303
+ records.push(
304
+ textShape({
305
+ recordId: generatedShapeId("box-label", `${box.id}:${rowIndex + 1}`),
306
+ sourceId: box.id,
307
+ x: box.x + 16,
308
+ y: row.y,
309
+ width: Math.max(1, box.width - 32) / textStyle.scale,
310
+ text: row.lines.join("\n"),
311
+ tone: box.tone ?? "neutral",
312
+ size: textStyle.size,
313
+ align: "middle",
314
+ index: generatedIndex,
315
+ scale: textStyle.scale,
316
+ fontFamily: row.fontFamily,
317
+ weight: row.weight,
318
+ ...(box.opacity === undefined ? {} : { opacity: box.opacity }),
319
+ }),
320
+ )
321
+ }
322
+ }
323
+ continue
324
+ }
325
+
326
+ if (shape.type === "text") {
327
+ const text = shape as TextShape
328
+ const fontSize = text.fontSize ?? 24
329
+ const textStyle = scaledTldrawSize(fontSize)
330
+ const width = text.width ?? Math.max(8, text.text.length * fontSize * 0.58)
331
+ records.push(
332
+ textShape({
333
+ recordId: authoredShapeId(text.id),
334
+ sourceId: text.id,
335
+ x: text.x,
336
+ y: text.y,
337
+ width: width / textStyle.scale,
338
+ text: text.text,
339
+ tone: text.tone ?? "neutral",
340
+ size: textStyle.size,
341
+ align: text.align ?? "start",
342
+ index: generatedIndex,
343
+ scale: textStyle.scale,
344
+ ...(text.fontFamily === undefined ? {} : { fontFamily: text.fontFamily }),
345
+ ...(text.weight === undefined ? {} : { weight: text.weight }),
346
+ ...(text.opacity === undefined ? {} : { opacity: text.opacity }),
347
+ }),
348
+ )
349
+ continue
350
+ }
351
+
352
+ const line = shape as LineShape
353
+ records.push({
354
+ ...baseShape(line, generatedIndex),
355
+ type: "line",
356
+ props: {
357
+ dash: "solid",
358
+ size: (line.strokeWidth ?? 3) >= 4 ? "l" : "m",
359
+ color: tldrawColors[line.tone ?? "neutral"],
360
+ spline: "line",
361
+ points: {
362
+ a1: { id: "a1", index: "a1", x: 0, y: 0 },
363
+ a2: {
364
+ id: "a2",
365
+ index: "a2",
366
+ x: line.x2 - line.x,
367
+ y: line.y2 - line.y,
368
+ },
369
+ },
370
+ scale: 1,
371
+ },
372
+ })
373
+ }
374
+
375
+ for (const edge of spec.edges ?? []) {
376
+ const resolved = resolveEdge(spec, edge)
377
+ generatedIndex += 1
378
+ const arrowId = authoredShapeId(edge.id)
379
+ records.push({
380
+ x: resolved.start.x,
381
+ y: resolved.start.y,
382
+ rotation: 0,
383
+ isLocked: false,
384
+ opacity: 1,
385
+ meta: shapeMeta(edge.id),
386
+ id: arrowId,
387
+ type: "arrow",
388
+ props: {
389
+ kind: "arc",
390
+ elbowMidPoint: 0.5,
391
+ dash: "solid",
392
+ size: "m",
393
+ fill: "none",
394
+ color: tldrawColors[edge.tone ?? "neutral"],
395
+ labelColor: tldrawColors[edge.tone ?? "neutral"],
396
+ bend: (edge.bend ?? 0) / 2,
397
+ start: { x: 0, y: 0 },
398
+ end: {
399
+ x: resolved.end.x - resolved.start.x,
400
+ y: resolved.end.y - resolved.start.y,
401
+ },
402
+ arrowheadStart: "none",
403
+ arrowheadEnd: edge.arrowhead ?? "arrow",
404
+ richText: richText(""),
405
+ labelPosition: edge.labelPosition ?? 0.5,
406
+ font: edge.labelFontFamily === "mono" ? "mono" : "sans",
407
+ scale: 1,
408
+ },
409
+ parentId: "page:page",
410
+ index: indexKey(generatedIndex),
411
+ typeName: "shape",
412
+ })
413
+ if (edge.label !== undefined) {
414
+ const labelPoint = resolveEdgeLabel(resolved)
415
+ const fontSize = edge.labelFontSize ?? 18
416
+ const fontFamily = edge.labelFontFamily ?? "default"
417
+ const textStyle = scaledTldrawSize(fontSize)
418
+ const widthRatio = fontFamily === "mono" ? 0.62 : 0.56
419
+ const width = Math.max(fontSize, edge.label.length * fontSize * widthRatio)
420
+ generatedIndex += 1
421
+ records.push(
422
+ textShape({
423
+ recordId: generatedShapeId("edge-label", edge.id),
424
+ sourceId: edge.id,
425
+ x: labelPoint.x - width / 2,
426
+ y: labelPoint.y - (fontSize * 1.35) / 2,
427
+ width: width / textStyle.scale,
428
+ text: edge.label,
429
+ tone: edge.tone ?? "neutral",
430
+ size: textStyle.size,
431
+ align: "middle",
432
+ index: generatedIndex,
433
+ scale: textStyle.scale,
434
+ fontFamily,
435
+ weight: edge.labelWeight ?? 600,
436
+ }),
437
+ )
438
+ }
439
+ records.push(
440
+ {
441
+ meta: {},
442
+ id: `binding:${edge.id}-start`,
443
+ fromId: arrowId,
444
+ toId: authoredShapeId(edge.from),
445
+ type: "arrow",
446
+ props: {
447
+ isPrecise: edge.startPosition !== undefined,
448
+ isExact: false,
449
+ normalizedAnchor: resolved.start.normalized,
450
+ snap: "none",
451
+ terminal: "start",
452
+ },
453
+ typeName: "binding",
454
+ },
455
+ {
456
+ meta: {},
457
+ id: `binding:${edge.id}-end`,
458
+ fromId: arrowId,
459
+ toId: authoredShapeId(edge.to),
460
+ type: "arrow",
461
+ props: {
462
+ isPrecise: edge.endPosition !== undefined,
463
+ isExact: false,
464
+ normalizedAnchor: resolved.end.normalized,
465
+ snap: "none",
466
+ terminal: "end",
467
+ },
468
+ typeName: "binding",
469
+ },
470
+ )
471
+ }
472
+
473
+ return `${JSON.stringify({ tldrawFileFormatVersion: 1, schema, records }, null, 2)}\n`
474
+ }
package/src/types.ts ADDED
@@ -0,0 +1,212 @@
1
+ export const diagramVersion = 1 as const
2
+
3
+ export type Tone =
4
+ | "neutral"
5
+ | "blue"
6
+ | "orange"
7
+ | "green"
8
+ | "red"
9
+ | "purple"
10
+ | "yellow"
11
+
12
+ export type Anchor = "auto" | "top" | "right" | "bottom" | "left"
13
+ export type ColorMode = "light" | "dark"
14
+ export type DiagramFontFamily = "default" | "mono"
15
+ export type StackDirection = "horizontal" | "vertical"
16
+ export type StackAlign = "start" | "center" | "end"
17
+ export type TextWeight = 400 | 500 | 600 | 700
18
+
19
+ export interface DiagramCanvas {
20
+ readonly width: number
21
+ readonly height: number
22
+ readonly padding?: number
23
+ }
24
+
25
+ interface BaseShape {
26
+ readonly id: string
27
+ readonly x: number
28
+ readonly y: number
29
+ readonly tone?: Tone
30
+ readonly opacity?: number
31
+ }
32
+
33
+ export interface BoxLabelRow {
34
+ readonly text: string
35
+ readonly fontSize?: number
36
+ readonly fontFamily?: DiagramFontFamily
37
+ readonly weight?: TextWeight
38
+ }
39
+
40
+ interface BoxGeometry {
41
+ readonly type: "rect" | "ellipse"
42
+ readonly width: number
43
+ readonly height: number
44
+ readonly radius?: number
45
+ readonly icon?: string
46
+ readonly iconSize?: number
47
+ readonly strokeWidth?: number
48
+ readonly fill?: boolean
49
+ }
50
+
51
+ export interface BoxShape extends BaseShape, BoxGeometry {
52
+ readonly label?: string
53
+ readonly labelFontSize?: number
54
+ readonly labelFontFamily?: DiagramFontFamily
55
+ readonly labelWeight?: TextWeight
56
+ readonly labelRows?: readonly [BoxLabelRow, ...BoxLabelRow[]]
57
+ readonly labelRowGap?: number
58
+ }
59
+
60
+ export interface TextShape extends BaseShape {
61
+ readonly type: "text"
62
+ readonly text: string
63
+ readonly width?: number
64
+ readonly fontSize?: number
65
+ readonly fontFamily?: DiagramFontFamily
66
+ readonly weight?: TextWeight
67
+ readonly align?: "start" | "middle" | "end"
68
+ }
69
+
70
+ export interface LineShape extends BaseShape {
71
+ readonly type: "line"
72
+ readonly x2: number
73
+ readonly y2: number
74
+ readonly strokeWidth?: number
75
+ }
76
+
77
+ export type DiagramShape = BoxShape | TextShape | LineShape
78
+ export type StackShape = Omit<BoxShape, "x" | "y">
79
+
80
+ export interface DiagramEdge {
81
+ readonly id: string
82
+ readonly from: string
83
+ readonly to: string
84
+ readonly label?: string
85
+ readonly tone?: Tone
86
+ readonly start?: Anchor
87
+ readonly end?: Anchor
88
+ readonly bend?: number
89
+ readonly arrowhead?: "arrow" | "triangle" | "none"
90
+ readonly startPosition?: number
91
+ readonly endPosition?: number
92
+ readonly labelFontSize?: number
93
+ readonly labelFontFamily?: DiagramFontFamily
94
+ readonly labelWeight?: TextWeight
95
+ readonly labelPosition?: number
96
+ readonly labelOffset?: number
97
+ }
98
+
99
+ export interface StackDiagramEdge
100
+ extends Omit<
101
+ DiagramEdge,
102
+ "start" | "end" | "bend" | "startPosition" | "endPosition"
103
+ > {
104
+ readonly start?: "auto"
105
+ readonly end?: "auto"
106
+ readonly bend?: 0
107
+ readonly startPosition?: never
108
+ readonly endPosition?: never
109
+ }
110
+
111
+ export interface DiagramSpec {
112
+ readonly $schema?: string
113
+ readonly version: typeof diagramVersion
114
+ readonly name: string
115
+ readonly canvas: DiagramCanvas
116
+ readonly shapes: readonly DiagramShape[]
117
+ readonly edges?: readonly DiagramEdge[]
118
+ }
119
+
120
+ export interface StackLayout {
121
+ readonly type: "stack"
122
+ readonly direction: StackDirection
123
+ readonly gap?: number
124
+ readonly align?: StackAlign
125
+ }
126
+
127
+ export interface StackDiagramSource {
128
+ readonly $schema?: string
129
+ readonly version: typeof diagramVersion
130
+ readonly name: string
131
+ readonly canvas: DiagramCanvas
132
+ readonly layout: StackLayout
133
+ readonly shapes: readonly StackShape[]
134
+ readonly edges?: readonly StackDiagramEdge[]
135
+ }
136
+
137
+ export type DiagramSource = DiagramSpec | StackDiagramSource
138
+
139
+ export interface IconDefinition {
140
+ readonly viewBox: string
141
+ readonly body: string
142
+ }
143
+
144
+ export interface FontFile {
145
+ readonly path: string
146
+ readonly weight?: number
147
+ readonly style?: "normal" | "italic"
148
+ readonly embed?: boolean
149
+ }
150
+
151
+ export interface FontConfig {
152
+ readonly family: string
153
+ readonly monoFamily?: string
154
+ readonly files?: readonly FontFile[]
155
+ }
156
+
157
+ export interface ThemeColors {
158
+ readonly background: string
159
+ readonly foreground: string
160
+ readonly muted: string
161
+ readonly stroke: string
162
+ readonly tones: Readonly<
163
+ Record<Tone, { readonly fill: string; readonly stroke: string; readonly text: string }>
164
+ >
165
+ }
166
+
167
+ export interface DiagramConfig {
168
+ readonly font?: FontConfig
169
+ readonly icons?: Readonly<Record<string, IconDefinition>>
170
+ readonly theme?: {
171
+ readonly light?: PartialTheme
172
+ readonly dark?: PartialTheme
173
+ }
174
+ }
175
+
176
+ export interface PartialTheme {
177
+ readonly background?: string
178
+ readonly foreground?: string
179
+ readonly muted?: string
180
+ readonly stroke?: string
181
+ readonly tones?: Partial<
182
+ Record<Tone, Partial<{ readonly fill: string; readonly stroke: string; readonly text: string }>>
183
+ >
184
+ }
185
+
186
+ export interface LoadedConfig {
187
+ readonly filePath: string | null
188
+ readonly baseDirectory: string
189
+ readonly value: DiagramConfig
190
+ }
191
+
192
+ export interface LintFinding {
193
+ readonly code: string
194
+ readonly message: string
195
+ readonly shapeIds: readonly string[]
196
+ }
197
+
198
+ export interface RenderedDiagram {
199
+ readonly mode: ColorMode
200
+ readonly svg: string
201
+ readonly width: number
202
+ readonly height: number
203
+ }
204
+
205
+ export interface RenderArtifacts {
206
+ readonly spec: string
207
+ readonly tldr: string
208
+ readonly lightSvg: string
209
+ readonly darkSvg: string
210
+ readonly lightPng: string
211
+ readonly darkPng: string
212
+ }