@imgly/codesign-mcp 0.1.0

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 (816) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +158 -0
  3. package/assets/docs/api/SKILL.md +49 -0
  4. package/assets/docs/api/index.d.ts +10518 -0
  5. package/assets/docs/guide/SKILL.md +142 -0
  6. package/assets/docs/guide/actions.md +1038 -0
  7. package/assets/docs/guide/animation/create/base.md +467 -0
  8. package/assets/docs/guide/animation/create/text.md +453 -0
  9. package/assets/docs/guide/animation/create.md +558 -0
  10. package/assets/docs/guide/animation/edit.md +501 -0
  11. package/assets/docs/guide/animation/overview.md +22 -0
  12. package/assets/docs/guide/animation/types.md +430 -0
  13. package/assets/docs/guide/animation.md +23 -0
  14. package/assets/docs/guide/api/AssetAPI.md +602 -0
  15. package/assets/docs/guide/api/BlockAPI.md +6152 -0
  16. package/assets/docs/guide/api/CreativeEngine.md +180 -0
  17. package/assets/docs/guide/api/EditorAPI.md +1261 -0
  18. package/assets/docs/guide/api/EventAPI.md +25 -0
  19. package/assets/docs/guide/api/SceneAPI.md +729 -0
  20. package/assets/docs/guide/api/VariableAPI.md +59 -0
  21. package/assets/docs/guide/api/types.md +71 -0
  22. package/assets/docs/guide/api-reference/overview.md +20 -0
  23. package/assets/docs/guide/automation/auto-resize.md +412 -0
  24. package/assets/docs/guide/automation/batch-processing.md +474 -0
  25. package/assets/docs/guide/automation/data-merge.md +406 -0
  26. package/assets/docs/guide/automation/design-generation.md +107 -0
  27. package/assets/docs/guide/automation/overview.md +16 -0
  28. package/assets/docs/guide/automation.md +24 -0
  29. package/assets/docs/guide/browser-support.md +38 -0
  30. package/assets/docs/guide/capabilities.md +18 -0
  31. package/assets/docs/guide/colors/adjust.md +551 -0
  32. package/assets/docs/guide/colors/apply.md +349 -0
  33. package/assets/docs/guide/colors/basics.md +440 -0
  34. package/assets/docs/guide/colors/conversion.md +504 -0
  35. package/assets/docs/guide/colors/create-color-palette.md +426 -0
  36. package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
  37. package/assets/docs/guide/colors/for-print/spot.md +751 -0
  38. package/assets/docs/guide/colors/for-print.md +21 -0
  39. package/assets/docs/guide/colors/for-screen/p3.md +60 -0
  40. package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
  41. package/assets/docs/guide/colors/for-screen.md +21 -0
  42. package/assets/docs/guide/colors/overview.md +20 -0
  43. package/assets/docs/guide/colors/replace.md +535 -0
  44. package/assets/docs/guide/colors.md +28 -0
  45. package/assets/docs/guide/compatibility.md +27 -0
  46. package/assets/docs/guide/concepts/architecture.md +99 -0
  47. package/assets/docs/guide/concepts/assets.md +360 -0
  48. package/assets/docs/guide/concepts/blocks.md +750 -0
  49. package/assets/docs/guide/concepts/buffers.md +546 -0
  50. package/assets/docs/guide/concepts/design-units.md +333 -0
  51. package/assets/docs/guide/concepts/edit-modes.md +431 -0
  52. package/assets/docs/guide/concepts/editing-workflow.md +303 -0
  53. package/assets/docs/guide/concepts/events.md +466 -0
  54. package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
  55. package/assets/docs/guide/concepts/pages.md +396 -0
  56. package/assets/docs/guide/concepts/resources.md +496 -0
  57. package/assets/docs/guide/concepts/scenes.md +443 -0
  58. package/assets/docs/guide/concepts/templating.md +194 -0
  59. package/assets/docs/guide/concepts/terminology.md +296 -0
  60. package/assets/docs/guide/concepts/undo-and-history.md +461 -0
  61. package/assets/docs/guide/concepts.md +38 -0
  62. package/assets/docs/guide/configuration.md +469 -0
  63. package/assets/docs/guide/conversion/overview.md +22 -0
  64. package/assets/docs/guide/conversion/to-base64.md +234 -0
  65. package/assets/docs/guide/conversion/to-pdf.md +616 -0
  66. package/assets/docs/guide/conversion/to-png.md +290 -0
  67. package/assets/docs/guide/conversion.md +23 -0
  68. package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
  69. package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
  70. package/assets/docs/guide/create-audio/audio/loop.md +370 -0
  71. package/assets/docs/guide/create-audio/audio.md +336 -0
  72. package/assets/docs/guide/create-composition/add-background.md +395 -0
  73. package/assets/docs/guide/create-composition/blend-modes.md +372 -0
  74. package/assets/docs/guide/create-composition/collage.md +432 -0
  75. package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
  76. package/assets/docs/guide/create-composition/layer-management.md +503 -0
  77. package/assets/docs/guide/create-composition/layout.md +396 -0
  78. package/assets/docs/guide/create-composition/lock-design.md +362 -0
  79. package/assets/docs/guide/create-composition/multi-page.md +204 -0
  80. package/assets/docs/guide/create-composition/overview.md +18 -0
  81. package/assets/docs/guide/create-composition/programmatic.md +593 -0
  82. package/assets/docs/guide/create-composition.md +30 -0
  83. package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
  84. package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
  85. package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
  86. package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
  87. package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
  88. package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
  89. package/assets/docs/guide/create-templates/from-scratch.md +558 -0
  90. package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
  91. package/assets/docs/guide/create-templates/import.md +244 -0
  92. package/assets/docs/guide/create-templates/lock.md +325 -0
  93. package/assets/docs/guide/create-templates/overview.md +16 -0
  94. package/assets/docs/guide/create-templates.md +32 -0
  95. package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
  96. package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
  97. package/assets/docs/guide/create-video/control.md +285 -0
  98. package/assets/docs/guide/create-video/limitations.md +396 -0
  99. package/assets/docs/guide/create-video/overview.md +224 -0
  100. package/assets/docs/guide/create-video/timeline-editor.md +622 -0
  101. package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
  102. package/assets/docs/guide/create-video.md +32 -0
  103. package/assets/docs/guide/edit-image/add-watermark.md +497 -0
  104. package/assets/docs/guide/edit-image/overview.md +22 -0
  105. package/assets/docs/guide/edit-image/remove-bg.md +420 -0
  106. package/assets/docs/guide/edit-image/replace-colors.md +680 -0
  107. package/assets/docs/guide/edit-image/transform/crop.md +523 -0
  108. package/assets/docs/guide/edit-image/transform/move.md +279 -0
  109. package/assets/docs/guide/edit-image/transform/resize.md +301 -0
  110. package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
  111. package/assets/docs/guide/edit-image/transform/scale.md +278 -0
  112. package/assets/docs/guide/edit-image/transform.md +24 -0
  113. package/assets/docs/guide/edit-image/vectorize.md +204 -0
  114. package/assets/docs/guide/edit-image.md +25 -0
  115. package/assets/docs/guide/edit-video/add-captions.md +589 -0
  116. package/assets/docs/guide/edit-video/add-watermark.md +429 -0
  117. package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
  118. package/assets/docs/guide/edit-video/redaction.md +544 -0
  119. package/assets/docs/guide/edit-video/split.md +634 -0
  120. package/assets/docs/guide/edit-video/transform/crop.md +380 -0
  121. package/assets/docs/guide/edit-video/transform/flip.md +182 -0
  122. package/assets/docs/guide/edit-video/transform/move.md +413 -0
  123. package/assets/docs/guide/edit-video/transform/resize.md +534 -0
  124. package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
  125. package/assets/docs/guide/edit-video/transform/scale.md +603 -0
  126. package/assets/docs/guide/edit-video/transform.md +25 -0
  127. package/assets/docs/guide/edit-video/trim.md +773 -0
  128. package/assets/docs/guide/engine-interface.md +108 -0
  129. package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
  130. package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
  131. package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
  132. package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
  133. package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
  134. package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
  135. package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
  136. package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
  137. package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
  138. package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
  139. package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
  140. package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
  141. package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
  142. package/assets/docs/guide/export-save-publish/export.md +36 -0
  143. package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
  144. package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
  145. package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
  146. package/assets/docs/guide/export-save-publish/save.md +340 -0
  147. package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
  148. package/assets/docs/guide/file-format-support.md +34 -0
  149. package/assets/docs/guide/fills/color.md +678 -0
  150. package/assets/docs/guide/fills/image.md +539 -0
  151. package/assets/docs/guide/fills/overview.md +144 -0
  152. package/assets/docs/guide/fills/video.md +641 -0
  153. package/assets/docs/guide/fills.md +24 -0
  154. package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
  155. package/assets/docs/guide/filters-and-effects/blur.md +382 -0
  156. package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
  157. package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
  158. package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
  159. package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
  160. package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
  161. package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
  162. package/assets/docs/guide/filters-and-effects/overview.md +22 -0
  163. package/assets/docs/guide/filters-and-effects/support.md +623 -0
  164. package/assets/docs/guide/filters-and-effects.md +28 -0
  165. package/assets/docs/guide/get-started/agent-skills.md +119 -0
  166. package/assets/docs/guide/get-started/build-with-ai.md +45 -0
  167. package/assets/docs/guide/get-started/mcp-server.md +119 -0
  168. package/assets/docs/guide/get-started/overview.md +28 -0
  169. package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
  170. package/assets/docs/guide/grid-and-rulers.md +222 -0
  171. package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
  172. package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
  173. package/assets/docs/guide/guides.md +49 -0
  174. package/assets/docs/guide/import-media/asset-library.md +23 -0
  175. package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
  176. package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
  177. package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
  178. package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
  179. package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
  180. package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
  181. package/assets/docs/guide/import-media/concepts.md +173 -0
  182. package/assets/docs/guide/import-media/content-json-schema.md +615 -0
  183. package/assets/docs/guide/import-media/default-assets.md +381 -0
  184. package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
  185. package/assets/docs/guide/import-media/file-format-support.md +178 -0
  186. package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
  187. package/assets/docs/guide/import-media/from-local-source.md +20 -0
  188. package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
  189. package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
  190. package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
  191. package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
  192. package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
  193. package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
  194. package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
  195. package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
  196. package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
  197. package/assets/docs/guide/import-media/from-remote-source.md +28 -0
  198. package/assets/docs/guide/import-media/overview.md +32 -0
  199. package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
  200. package/assets/docs/guide/import-media/size-limits.md +20 -0
  201. package/assets/docs/guide/import-media/source-sets.md +476 -0
  202. package/assets/docs/guide/import-media.md +32 -0
  203. package/assets/docs/guide/insert-media/audio.md +291 -0
  204. package/assets/docs/guide/insert-media/images.md +380 -0
  205. package/assets/docs/guide/insert-media/position-and-align.md +734 -0
  206. package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
  207. package/assets/docs/guide/insert-media/videos.md +308 -0
  208. package/assets/docs/guide/insert-media.md +24 -0
  209. package/assets/docs/guide/key-capabilities.md +24 -0
  210. package/assets/docs/guide/key-concepts.md +83 -0
  211. package/assets/docs/guide/licensing.md +45 -0
  212. package/assets/docs/guide/llms-txt.md +53 -0
  213. package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
  214. package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
  215. package/assets/docs/guide/open-the-editor/from-image.md +205 -0
  216. package/assets/docs/guide/open-the-editor/from-template.md +189 -0
  217. package/assets/docs/guide/open-the-editor/from-video.md +274 -0
  218. package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
  219. package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
  220. package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
  221. package/assets/docs/guide/open-the-editor/import-design.md +481 -0
  222. package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
  223. package/assets/docs/guide/open-the-editor/overview.md +20 -0
  224. package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
  225. package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
  226. package/assets/docs/guide/open-the-editor.md +29 -0
  227. package/assets/docs/guide/outlines/overview.md +14 -0
  228. package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
  229. package/assets/docs/guide/outlines/strokes.md +292 -0
  230. package/assets/docs/guide/outlines.md +22 -0
  231. package/assets/docs/guide/overview.md +22 -0
  232. package/assets/docs/guide/performance.md +217 -0
  233. package/assets/docs/guide/plugins/asset-sources.md +553 -0
  234. package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
  235. package/assets/docs/guide/plugins.md +36 -0
  236. package/assets/docs/guide/rules/asset-handling.md +180 -0
  237. package/assets/docs/guide/rules/common-pitfalls.md +272 -0
  238. package/assets/docs/guide/rules/content-fill-mode.md +29 -0
  239. package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
  240. package/assets/docs/guide/rules/lock-content.md +478 -0
  241. package/assets/docs/guide/rules/moderate-content.md +761 -0
  242. package/assets/docs/guide/rules/overview.md +514 -0
  243. package/assets/docs/guide/rules/silent-init-errors.md +137 -0
  244. package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
  245. package/assets/docs/guide/rules.md +23 -0
  246. package/assets/docs/guide/security.md +199 -0
  247. package/assets/docs/guide/serve-assets.md +332 -0
  248. package/assets/docs/guide/settings.md +199 -0
  249. package/assets/docs/guide/shapes.md +23 -0
  250. package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
  251. package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
  252. package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
  253. package/assets/docs/guide/starterkits/ai-editor.md +749 -0
  254. package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
  255. package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
  256. package/assets/docs/guide/starterkits/assets.md +27 -0
  257. package/assets/docs/guide/starterkits/auto-resize.md +586 -0
  258. package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
  259. package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
  260. package/assets/docs/guide/starterkits/content-moderation.md +863 -0
  261. package/assets/docs/guide/starterkits/creative-automation.md +28 -0
  262. package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
  263. package/assets/docs/guide/starterkits/customization.md +29 -0
  264. package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
  265. package/assets/docs/guide/starterkits/data-merge.md +850 -0
  266. package/assets/docs/guide/starterkits/design-editor.md +698 -0
  267. package/assets/docs/guide/starterkits/design-generation.md +719 -0
  268. package/assets/docs/guide/starterkits/design-validation.md +808 -0
  269. package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
  270. package/assets/docs/guide/starterkits/export-options.md +724 -0
  271. package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
  272. package/assets/docs/guide/starterkits/extensibility.md +28 -0
  273. package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
  274. package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
  275. package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
  276. package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
  277. package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
  278. package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
  279. package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
  280. package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
  281. package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
  282. package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
  283. package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
  284. package/assets/docs/guide/starterkits/photo-editor.md +755 -0
  285. package/assets/docs/guide/starterkits/photo-ui.md +186 -0
  286. package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
  287. package/assets/docs/guide/starterkits/placeholders.md +678 -0
  288. package/assets/docs/guide/starterkits/player.md +405 -0
  289. package/assets/docs/guide/starterkits/plugins.md +25 -0
  290. package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
  291. package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
  292. package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
  293. package/assets/docs/guide/starterkits/product-editor.md +773 -0
  294. package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
  295. package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
  296. package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
  297. package/assets/docs/guide/starterkits/start-with-image.md +684 -0
  298. package/assets/docs/guide/starterkits/start-with-video.md +651 -0
  299. package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
  300. package/assets/docs/guide/starterkits/templating.md +23 -0
  301. package/assets/docs/guide/starterkits/theming.md +662 -0
  302. package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
  303. package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
  304. package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
  305. package/assets/docs/guide/starterkits/version-history.md +745 -0
  306. package/assets/docs/guide/starterkits/video-animations.md +853 -0
  307. package/assets/docs/guide/starterkits/video-captions.md +884 -0
  308. package/assets/docs/guide/starterkits/video-editing.md +25 -0
  309. package/assets/docs/guide/starterkits/video-editor.md +696 -0
  310. package/assets/docs/guide/starterkits/video-export-options.md +676 -0
  311. package/assets/docs/guide/starterkits/viewer.md +400 -0
  312. package/assets/docs/guide/starterkits.md +41 -0
  313. package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
  314. package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
  315. package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
  316. package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
  317. package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
  318. package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
  319. package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
  320. package/assets/docs/guide/stickers.md +21 -0
  321. package/assets/docs/guide/text/add.md +641 -0
  322. package/assets/docs/guide/text/adjust-spacing.md +288 -0
  323. package/assets/docs/guide/text/auto-size.md +404 -0
  324. package/assets/docs/guide/text/custom-fonts.md +401 -0
  325. package/assets/docs/guide/text/decorations.md +330 -0
  326. package/assets/docs/guide/text/edit.md +458 -0
  327. package/assets/docs/guide/text/effects.md +244 -0
  328. package/assets/docs/guide/text/emojis.md +310 -0
  329. package/assets/docs/guide/text/enumerations.md +258 -0
  330. package/assets/docs/guide/text/language-support.md +604 -0
  331. package/assets/docs/guide/text/overview.md +14 -0
  332. package/assets/docs/guide/text/styling.md +390 -0
  333. package/assets/docs/guide/text/text-designs.md +834 -0
  334. package/assets/docs/guide/text.md +33 -0
  335. package/assets/docs/guide/to-v1-10.md +131 -0
  336. package/assets/docs/guide/to-v1-13.md +165 -0
  337. package/assets/docs/guide/to-v1-19.md +315 -0
  338. package/assets/docs/guide/to-v1-32.md +110 -0
  339. package/assets/docs/guide/to-v1-69.md +468 -0
  340. package/assets/docs/guide/to-v1-72.md +193 -0
  341. package/assets/docs/guide/upgrade.md +25 -0
  342. package/assets/docs/guide/use-templates/apply-template.md +279 -0
  343. package/assets/docs/guide/use-templates/generate.md +405 -0
  344. package/assets/docs/guide/use-templates/library.md +450 -0
  345. package/assets/docs/guide/use-templates/overview.md +20 -0
  346. package/assets/docs/guide/use-templates/programmatic.md +482 -0
  347. package/assets/docs/guide/use-templates/replace-content.md +399 -0
  348. package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
  349. package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
  350. package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
  351. package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
  352. package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
  353. package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
  354. package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
  355. package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
  356. package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
  357. package/assets/docs/guide/user-interface/ai-integration.md +30 -0
  358. package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
  359. package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
  360. package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
  361. package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
  362. package/assets/docs/guide/user-interface/appearance.md +23 -0
  363. package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
  364. package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
  365. package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
  366. package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
  367. package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
  368. package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
  369. package/assets/docs/guide/user-interface/customization/dock.md +399 -0
  370. package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
  371. package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
  372. package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
  373. package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
  374. package/assets/docs/guide/user-interface/customization/panel.md +605 -0
  375. package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
  376. package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
  377. package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
  378. package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
  379. package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
  380. package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
  381. package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
  382. package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
  383. package/assets/docs/guide/user-interface/customization/reference.md +12 -0
  384. package/assets/docs/guide/user-interface/customization.md +39 -0
  385. package/assets/docs/guide/user-interface/localization.md +633 -0
  386. package/assets/docs/guide/user-interface/overview.md +167 -0
  387. package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
  388. package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
  389. package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
  390. package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
  391. package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
  392. package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
  393. package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
  394. package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
  395. package/assets/docs/guide/user-interface.md +25 -0
  396. package/assets/docs/guide/what-is-cesdk.md +319 -0
  397. package/assets/docs/handbook/SKILL.md +521 -0
  398. package/assets/prompts/evals-assetGenerate.md +12 -0
  399. package/assets/prompts/evals-brutalistCore.md +34 -0
  400. package/assets/prompts/evals-danskCatalogue.md +31 -0
  401. package/assets/prompts/evals-exportRoundTrip.md +12 -0
  402. package/assets/prompts/evals-inspectPriorCode.md +16 -0
  403. package/assets/prompts/evals-listProjectFiles.md +6 -0
  404. package/assets/prompts/evals-readAndExplainScript.md +6 -0
  405. package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
  406. package/assets/prompts/evals-rewindRecovery.md +10 -0
  407. package/assets/prompts/evals-searchAcrossFiles.md +6 -0
  408. package/assets/prompts/evals-weddingCard.md +20 -0
  409. package/assets/prompts/explain.md +6 -0
  410. package/assets/prompts/review.md +6 -0
  411. package/dist/assets/inline.generated.d.ts +2 -0
  412. package/dist/assets/inline.generated.d.ts.map +1 -0
  413. package/dist/assets/inline.generated.js +413 -0
  414. package/dist/assets/inline.generated.js.map +1 -0
  415. package/dist/assets/load-browser.d.ts +8 -0
  416. package/dist/assets/load-browser.d.ts.map +1 -0
  417. package/dist/assets/load-browser.js +11 -0
  418. package/dist/assets/load-browser.js.map +1 -0
  419. package/dist/assets/load-node.d.ts +8 -0
  420. package/dist/assets/load-node.d.ts.map +1 -0
  421. package/dist/assets/load-node.js +11 -0
  422. package/dist/assets/load-node.js.map +1 -0
  423. package/dist/cli/http.d.ts +2 -0
  424. package/dist/cli/http.d.ts.map +1 -0
  425. package/dist/cli/http.js +231 -0
  426. package/dist/cli/http.js.map +1 -0
  427. package/dist/cli/redirect-console.d.ts +10 -0
  428. package/dist/cli/redirect-console.d.ts.map +1 -0
  429. package/dist/cli/redirect-console.js +18 -0
  430. package/dist/cli/redirect-console.js.map +1 -0
  431. package/dist/cli/resolve-license.d.ts +2 -0
  432. package/dist/cli/resolve-license.d.ts.map +1 -0
  433. package/dist/cli/resolve-license.js +13 -0
  434. package/dist/cli/resolve-license.js.map +1 -0
  435. package/dist/cli/stdio.d.ts +2 -0
  436. package/dist/cli/stdio.d.ts.map +1 -0
  437. package/dist/cli/stdio.js +124 -0
  438. package/dist/cli/stdio.js.map +1 -0
  439. package/dist/cli/trial-license.generated.d.ts +2 -0
  440. package/dist/cli/trial-license.generated.d.ts.map +1 -0
  441. package/dist/cli/trial-license.generated.js +4 -0
  442. package/dist/cli/trial-license.generated.js.map +1 -0
  443. package/dist/cli.d.ts +3 -0
  444. package/dist/cli.d.ts.map +1 -0
  445. package/dist/cli.js +64 -0
  446. package/dist/cli.js.map +1 -0
  447. package/dist/config.d.ts +61 -0
  448. package/dist/config.d.ts.map +1 -0
  449. package/dist/config.js +102 -0
  450. package/dist/config.js.map +1 -0
  451. package/dist/cross-ref.d.ts +2 -0
  452. package/dist/cross-ref.d.ts.map +1 -0
  453. package/dist/cross-ref.js +31 -0
  454. package/dist/cross-ref.js.map +1 -0
  455. package/dist/dashboard/router.d.ts +3 -0
  456. package/dist/dashboard/router.d.ts.map +1 -0
  457. package/dist/dashboard/router.js +19 -0
  458. package/dist/dashboard/router.js.map +1 -0
  459. package/dist/dashboard/spa-assets.generated.d.ts +2 -0
  460. package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
  461. package/dist/dashboard/spa-assets.generated.js +220 -0
  462. package/dist/dashboard/spa-assets.generated.js.map +1 -0
  463. package/dist/engine/asset-sources.d.ts +17 -0
  464. package/dist/engine/asset-sources.d.ts.map +1 -0
  465. package/dist/engine/asset-sources.js +75 -0
  466. package/dist/engine/asset-sources.js.map +1 -0
  467. package/dist/engine/cesdk-adapter.d.ts +10 -0
  468. package/dist/engine/cesdk-adapter.d.ts.map +1 -0
  469. package/dist/engine/cesdk-adapter.js +19 -0
  470. package/dist/engine/cesdk-adapter.js.map +1 -0
  471. package/dist/engine/index.d.ts +3 -0
  472. package/dist/engine/index.d.ts.map +1 -0
  473. package/dist/engine/index.js +3 -0
  474. package/dist/engine/index.js.map +1 -0
  475. package/dist/engine/mutex.d.ts +5 -0
  476. package/dist/engine/mutex.d.ts.map +1 -0
  477. package/dist/engine/mutex.js +42 -0
  478. package/dist/engine/mutex.js.map +1 -0
  479. package/dist/engine/session.d.ts +50 -0
  480. package/dist/engine/session.d.ts.map +1 -0
  481. package/dist/engine/session.js +95 -0
  482. package/dist/engine/session.js.map +1 -0
  483. package/dist/engine/uri-resolver.d.ts +14 -0
  484. package/dist/engine/uri-resolver.d.ts.map +1 -0
  485. package/dist/engine/uri-resolver.js +12 -0
  486. package/dist/engine/uri-resolver.js.map +1 -0
  487. package/dist/frontmatter.d.ts +15 -0
  488. package/dist/frontmatter.d.ts.map +1 -0
  489. package/dist/frontmatter.js +46 -0
  490. package/dist/frontmatter.js.map +1 -0
  491. package/dist/gateway/hosted-stub.d.ts +6 -0
  492. package/dist/gateway/hosted-stub.d.ts.map +1 -0
  493. package/dist/gateway/hosted-stub.js +11 -0
  494. package/dist/gateway/hosted-stub.js.map +1 -0
  495. package/dist/gateway/index.d.ts +4 -0
  496. package/dist/gateway/index.d.ts.map +1 -0
  497. package/dist/gateway/index.js +4 -0
  498. package/dist/gateway/index.js.map +1 -0
  499. package/dist/gateway/local.d.ts +14 -0
  500. package/dist/gateway/local.d.ts.map +1 -0
  501. package/dist/gateway/local.js +41 -0
  502. package/dist/gateway/local.js.map +1 -0
  503. package/dist/gateway/types.d.ts +24 -0
  504. package/dist/gateway/types.d.ts.map +1 -0
  505. package/dist/gateway/types.js +7 -0
  506. package/dist/gateway/types.js.map +1 -0
  507. package/dist/http/server.d.ts +80 -0
  508. package/dist/http/server.d.ts.map +1 -0
  509. package/dist/http/server.js +183 -0
  510. package/dist/http/server.js.map +1 -0
  511. package/dist/http/session-manager.d.ts +42 -0
  512. package/dist/http/session-manager.d.ts.map +1 -0
  513. package/dist/http/session-manager.js +82 -0
  514. package/dist/http/session-manager.js.map +1 -0
  515. package/dist/http/workspace-auth.d.ts +9 -0
  516. package/dist/http/workspace-auth.d.ts.map +1 -0
  517. package/dist/http/workspace-auth.js +29 -0
  518. package/dist/http/workspace-auth.js.map +1 -0
  519. package/dist/index.d.ts +10 -0
  520. package/dist/index.d.ts.map +1 -0
  521. package/dist/index.js +10 -0
  522. package/dist/index.js.map +1 -0
  523. package/dist/metrics/mount.d.ts +11 -0
  524. package/dist/metrics/mount.d.ts.map +1 -0
  525. package/dist/metrics/mount.js +13 -0
  526. package/dist/metrics/mount.js.map +1 -0
  527. package/dist/metrics/recorder.d.ts +55 -0
  528. package/dist/metrics/recorder.d.ts.map +1 -0
  529. package/dist/metrics/recorder.js +97 -0
  530. package/dist/metrics/recorder.js.map +1 -0
  531. package/dist/revisions/hash.d.ts +7 -0
  532. package/dist/revisions/hash.d.ts.map +1 -0
  533. package/dist/revisions/hash.js +24 -0
  534. package/dist/revisions/hash.js.map +1 -0
  535. package/dist/revisions/index.d.ts +4 -0
  536. package/dist/revisions/index.d.ts.map +1 -0
  537. package/dist/revisions/index.js +4 -0
  538. package/dist/revisions/index.js.map +1 -0
  539. package/dist/revisions/store.d.ts +69 -0
  540. package/dist/revisions/store.d.ts.map +1 -0
  541. package/dist/revisions/store.js +196 -0
  542. package/dist/revisions/store.js.map +1 -0
  543. package/dist/revisions/types.d.ts +39 -0
  544. package/dist/revisions/types.d.ts.map +1 -0
  545. package/dist/revisions/types.js +2 -0
  546. package/dist/revisions/types.js.map +1 -0
  547. package/dist/server.d.ts +51 -0
  548. package/dist/server.d.ts.map +1 -0
  549. package/dist/server.js +175 -0
  550. package/dist/server.js.map +1 -0
  551. package/dist/skill-tools.d.ts +3 -0
  552. package/dist/skill-tools.d.ts.map +1 -0
  553. package/dist/skill-tools.js +105 -0
  554. package/dist/skill-tools.js.map +1 -0
  555. package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
  556. package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
  557. package/dist/test/test/cli/dispatcher.test.js +47 -0
  558. package/dist/test/test/cli/dispatcher.test.js.map +1 -0
  559. package/dist/test/test/cross-ref.test.d.ts +2 -0
  560. package/dist/test/test/cross-ref.test.d.ts.map +1 -0
  561. package/dist/test/test/cross-ref.test.js +39 -0
  562. package/dist/test/test/cross-ref.test.js.map +1 -0
  563. package/dist/test/test/engine/session.test.d.ts +2 -0
  564. package/dist/test/test/engine/session.test.d.ts.map +1 -0
  565. package/dist/test/test/engine/session.test.js +144 -0
  566. package/dist/test/test/engine/session.test.js.map +1 -0
  567. package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
  568. package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
  569. package/dist/test/test/engine/uri-resolver.test.js +38 -0
  570. package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
  571. package/dist/test/test/frontmatter.test.d.ts +2 -0
  572. package/dist/test/test/frontmatter.test.d.ts.map +1 -0
  573. package/dist/test/test/frontmatter.test.js +55 -0
  574. package/dist/test/test/frontmatter.test.js.map +1 -0
  575. package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
  576. package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
  577. package/dist/test/test/gateway/hosted-stub.test.js +11 -0
  578. package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
  579. package/dist/test/test/gateway/local.test.d.ts +2 -0
  580. package/dist/test/test/gateway/local.test.d.ts.map +1 -0
  581. package/dist/test/test/gateway/local.test.js +29 -0
  582. package/dist/test/test/gateway/local.test.js.map +1 -0
  583. package/dist/test/test/handbook-contract.test.d.ts +2 -0
  584. package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
  585. package/dist/test/test/handbook-contract.test.js +71 -0
  586. package/dist/test/test/handbook-contract.test.js.map +1 -0
  587. package/dist/test/test/http/server.test.d.ts +2 -0
  588. package/dist/test/test/http/server.test.d.ts.map +1 -0
  589. package/dist/test/test/http/server.test.js +245 -0
  590. package/dist/test/test/http/server.test.js.map +1 -0
  591. package/dist/test/test/http/session-manager.test.d.ts +2 -0
  592. package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
  593. package/dist/test/test/http/session-manager.test.js +83 -0
  594. package/dist/test/test/http/session-manager.test.js.map +1 -0
  595. package/dist/test/test/revisions/hash.test.d.ts +2 -0
  596. package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
  597. package/dist/test/test/revisions/hash.test.js +33 -0
  598. package/dist/test/test/revisions/hash.test.js.map +1 -0
  599. package/dist/test/test/revisions/store.test.d.ts +2 -0
  600. package/dist/test/test/revisions/store.test.d.ts.map +1 -0
  601. package/dist/test/test/revisions/store.test.js +245 -0
  602. package/dist/test/test/revisions/store.test.js.map +1 -0
  603. package/dist/test/test/server.test.d.ts +2 -0
  604. package/dist/test/test/server.test.d.ts.map +1 -0
  605. package/dist/test/test/server.test.js +157 -0
  606. package/dist/test/test/server.test.js.map +1 -0
  607. package/dist/test/test/skill-tools.test.d.ts +2 -0
  608. package/dist/test/test/skill-tools.test.d.ts.map +1 -0
  609. package/dist/test/test/skill-tools.test.js +84 -0
  610. package/dist/test/test/skill-tools.test.js.map +1 -0
  611. package/dist/test/test/smoke.test.d.ts +2 -0
  612. package/dist/test/test/smoke.test.d.ts.map +1 -0
  613. package/dist/test/test/smoke.test.js +8 -0
  614. package/dist/test/test/smoke.test.js.map +1 -0
  615. package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
  616. package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
  617. package/dist/test/test/tools/asset-generate.test.js +66 -0
  618. package/dist/test/test/tools/asset-generate.test.js.map +1 -0
  619. package/dist/test/test/tools/edit.test.d.ts +2 -0
  620. package/dist/test/test/tools/edit.test.d.ts.map +1 -0
  621. package/dist/test/test/tools/edit.test.js +205 -0
  622. package/dist/test/test/tools/edit.test.js.map +1 -0
  623. package/dist/test/test/tools/export.test.d.ts +2 -0
  624. package/dist/test/test/tools/export.test.d.ts.map +1 -0
  625. package/dist/test/test/tools/export.test.js +144 -0
  626. package/dist/test/test/tools/export.test.js.map +1 -0
  627. package/dist/test/test/tools/history.test.d.ts +2 -0
  628. package/dist/test/test/tools/history.test.d.ts.map +1 -0
  629. package/dist/test/test/tools/history.test.js +29 -0
  630. package/dist/test/test/tools/history.test.js.map +1 -0
  631. package/dist/test/test/tools/inspect.test.d.ts +2 -0
  632. package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
  633. package/dist/test/test/tools/inspect.test.js +62 -0
  634. package/dist/test/test/tools/inspect.test.js.map +1 -0
  635. package/dist/test/test/tools/list.test.d.ts +2 -0
  636. package/dist/test/test/tools/list.test.d.ts.map +1 -0
  637. package/dist/test/test/tools/list.test.js +23 -0
  638. package/dist/test/test/tools/list.test.js.map +1 -0
  639. package/dist/test/test/tools/open-editor.test.d.ts +2 -0
  640. package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
  641. package/dist/test/test/tools/open-editor.test.js +53 -0
  642. package/dist/test/test/tools/open-editor.test.js.map +1 -0
  643. package/dist/test/test/tools/preview.test.d.ts +2 -0
  644. package/dist/test/test/tools/preview.test.d.ts.map +1 -0
  645. package/dist/test/test/tools/preview.test.js +73 -0
  646. package/dist/test/test/tools/preview.test.js.map +1 -0
  647. package/dist/test/test/tools/rename.test.d.ts +2 -0
  648. package/dist/test/test/tools/rename.test.d.ts.map +1 -0
  649. package/dist/test/test/tools/rename.test.js +17 -0
  650. package/dist/test/test/tools/rename.test.js.map +1 -0
  651. package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
  652. package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
  653. package/dist/test/test/viewer/broadcaster.test.js +53 -0
  654. package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
  655. package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
  656. package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
  657. package/dist/test/test/viewer/resource-route.test.js +70 -0
  658. package/dist/test/test/viewer/resource-route.test.js.map +1 -0
  659. package/dist/test/test/viewer/router.test.d.ts +2 -0
  660. package/dist/test/test/viewer/router.test.d.ts.map +1 -0
  661. package/dist/test/test/viewer/router.test.js +171 -0
  662. package/dist/test/test/viewer/router.test.js.map +1 -0
  663. package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
  664. package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
  665. package/dist/test/test/viewer/url-builder.test.js +31 -0
  666. package/dist/test/test/viewer/url-builder.test.js.map +1 -0
  667. package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
  668. package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
  669. package/dist/test/test/workspace/hosted-stub.test.js +30 -0
  670. package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
  671. package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
  672. package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
  673. package/dist/test/test/workspace/in-memory.test.js +4 -0
  674. package/dist/test/test/workspace/in-memory.test.js.map +1 -0
  675. package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
  676. package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
  677. package/dist/test/test/workspace/node-fs.test.js +20 -0
  678. package/dist/test/test/workspace/node-fs.test.js.map +1 -0
  679. package/dist/test/test/workspace/shared-contract.d.ts +3 -0
  680. package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
  681. package/dist/test/test/workspace/shared-contract.js +92 -0
  682. package/dist/test/test/workspace/shared-contract.js.map +1 -0
  683. package/dist/test/tsconfig.test.tsbuildinfo +1 -0
  684. package/dist/test/vitest.config.d.ts +3 -0
  685. package/dist/test/vitest.config.d.ts.map +1 -0
  686. package/dist/test/vitest.config.js +8 -0
  687. package/dist/test/vitest.config.js.map +1 -0
  688. package/dist/tools/asset-generate.d.ts +12 -0
  689. package/dist/tools/asset-generate.d.ts.map +1 -0
  690. package/dist/tools/asset-generate.js +112 -0
  691. package/dist/tools/asset-generate.js.map +1 -0
  692. package/dist/tools/asset-search.d.ts +10 -0
  693. package/dist/tools/asset-search.d.ts.map +1 -0
  694. package/dist/tools/asset-search.js +120 -0
  695. package/dist/tools/asset-search.js.map +1 -0
  696. package/dist/tools/content-types.d.ts +11 -0
  697. package/dist/tools/content-types.d.ts.map +1 -0
  698. package/dist/tools/content-types.js +2 -0
  699. package/dist/tools/content-types.js.map +1 -0
  700. package/dist/tools/edit.d.ts +29 -0
  701. package/dist/tools/edit.d.ts.map +1 -0
  702. package/dist/tools/edit.js +165 -0
  703. package/dist/tools/edit.js.map +1 -0
  704. package/dist/tools/engine.d.ts +31 -0
  705. package/dist/tools/engine.d.ts.map +1 -0
  706. package/dist/tools/engine.js +59 -0
  707. package/dist/tools/engine.js.map +1 -0
  708. package/dist/tools/export.d.ts +19 -0
  709. package/dist/tools/export.d.ts.map +1 -0
  710. package/dist/tools/export.js +179 -0
  711. package/dist/tools/export.js.map +1 -0
  712. package/dist/tools/history.d.ts +7 -0
  713. package/dist/tools/history.d.ts.map +1 -0
  714. package/dist/tools/history.js +54 -0
  715. package/dist/tools/history.js.map +1 -0
  716. package/dist/tools/index.d.ts +35 -0
  717. package/dist/tools/index.d.ts.map +1 -0
  718. package/dist/tools/index.js +72 -0
  719. package/dist/tools/index.js.map +1 -0
  720. package/dist/tools/inspect.d.ts +7 -0
  721. package/dist/tools/inspect.d.ts.map +1 -0
  722. package/dist/tools/inspect.js +80 -0
  723. package/dist/tools/inspect.js.map +1 -0
  724. package/dist/tools/list.d.ts +7 -0
  725. package/dist/tools/list.d.ts.map +1 -0
  726. package/dist/tools/list.js +18 -0
  727. package/dist/tools/list.js.map +1 -0
  728. package/dist/tools/metrics.d.ts +11 -0
  729. package/dist/tools/metrics.d.ts.map +1 -0
  730. package/dist/tools/metrics.js +28 -0
  731. package/dist/tools/metrics.js.map +1 -0
  732. package/dist/tools/open-editor.d.ts +10 -0
  733. package/dist/tools/open-editor.d.ts.map +1 -0
  734. package/dist/tools/open-editor.js +62 -0
  735. package/dist/tools/open-editor.js.map +1 -0
  736. package/dist/tools/preview.d.ts +12 -0
  737. package/dist/tools/preview.d.ts.map +1 -0
  738. package/dist/tools/preview.js +104 -0
  739. package/dist/tools/preview.js.map +1 -0
  740. package/dist/tools/rename.d.ts +7 -0
  741. package/dist/tools/rename.d.ts.map +1 -0
  742. package/dist/tools/rename.js +39 -0
  743. package/dist/tools/rename.js.map +1 -0
  744. package/dist/tools/result.d.ts +12 -0
  745. package/dist/tools/result.d.ts.map +1 -0
  746. package/dist/tools/result.js +55 -0
  747. package/dist/tools/result.js.map +1 -0
  748. package/dist/tools/save.d.ts +19 -0
  749. package/dist/tools/save.d.ts.map +1 -0
  750. package/dist/tools/save.js +117 -0
  751. package/dist/tools/save.js.map +1 -0
  752. package/dist/viewer/broadcaster.d.ts +13 -0
  753. package/dist/viewer/broadcaster.d.ts.map +1 -0
  754. package/dist/viewer/broadcaster.js +44 -0
  755. package/dist/viewer/broadcaster.js.map +1 -0
  756. package/dist/viewer/index.d.ts +7 -0
  757. package/dist/viewer/index.d.ts.map +1 -0
  758. package/dist/viewer/index.js +7 -0
  759. package/dist/viewer/index.js.map +1 -0
  760. package/dist/viewer/listener.d.ts +16 -0
  761. package/dist/viewer/listener.d.ts.map +1 -0
  762. package/dist/viewer/listener.js +30 -0
  763. package/dist/viewer/listener.js.map +1 -0
  764. package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
  765. package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
  766. package/dist/viewer/presigned-r2-url-builder.js +40 -0
  767. package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
  768. package/dist/viewer/resource-route.d.ts +9 -0
  769. package/dist/viewer/resource-route.d.ts.map +1 -0
  770. package/dist/viewer/resource-route.js +59 -0
  771. package/dist/viewer/resource-route.js.map +1 -0
  772. package/dist/viewer/router.d.ts +20 -0
  773. package/dist/viewer/router.d.ts.map +1 -0
  774. package/dist/viewer/router.js +142 -0
  775. package/dist/viewer/router.js.map +1 -0
  776. package/dist/viewer/session-mount.d.ts +10 -0
  777. package/dist/viewer/session-mount.d.ts.map +1 -0
  778. package/dist/viewer/session-mount.js +24 -0
  779. package/dist/viewer/session-mount.js.map +1 -0
  780. package/dist/viewer/spa-assets.generated.d.ts +2 -0
  781. package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
  782. package/dist/viewer/spa-assets.generated.js +989 -0
  783. package/dist/viewer/spa-assets.generated.js.map +1 -0
  784. package/dist/viewer/url-builder.d.ts +48 -0
  785. package/dist/viewer/url-builder.d.ts.map +1 -0
  786. package/dist/viewer/url-builder.js +38 -0
  787. package/dist/viewer/url-builder.js.map +1 -0
  788. package/dist/workspace/hosted-stub.d.ts +28 -0
  789. package/dist/workspace/hosted-stub.d.ts.map +1 -0
  790. package/dist/workspace/hosted-stub.js +44 -0
  791. package/dist/workspace/hosted-stub.js.map +1 -0
  792. package/dist/workspace/in-memory.d.ts +23 -0
  793. package/dist/workspace/in-memory.d.ts.map +1 -0
  794. package/dist/workspace/in-memory.js +161 -0
  795. package/dist/workspace/in-memory.js.map +1 -0
  796. package/dist/workspace/index.d.ts +6 -0
  797. package/dist/workspace/index.d.ts.map +1 -0
  798. package/dist/workspace/index.js +6 -0
  799. package/dist/workspace/index.js.map +1 -0
  800. package/dist/workspace/node-fs.d.ts +23 -0
  801. package/dist/workspace/node-fs.d.ts.map +1 -0
  802. package/dist/workspace/node-fs.js +90 -0
  803. package/dist/workspace/node-fs.js.map +1 -0
  804. package/dist/workspace/s3.d.ts +32 -0
  805. package/dist/workspace/s3.d.ts.map +1 -0
  806. package/dist/workspace/s3.js +191 -0
  807. package/dist/workspace/s3.js.map +1 -0
  808. package/dist/workspace/scoped.d.ts +32 -0
  809. package/dist/workspace/scoped.d.ts.map +1 -0
  810. package/dist/workspace/scoped.js +76 -0
  811. package/dist/workspace/scoped.js.map +1 -0
  812. package/dist/workspace/types.d.ts +75 -0
  813. package/dist/workspace/types.d.ts.map +1 -0
  814. package/dist/workspace/types.js +18 -0
  815. package/dist/workspace/types.js.map +1 -0
  816. package/package.json +80 -0
@@ -0,0 +1,16 @@
1
+ import type { Server } from 'node:http';
2
+ import type { Router } from 'express';
3
+ import { type Express } from 'express';
4
+ export interface ViewerListener {
5
+ app: Express;
6
+ server: Server;
7
+ base: string;
8
+ close(): Promise<void>;
9
+ }
10
+ export interface StartViewerListenerOptions {
11
+ router: Router;
12
+ host?: string;
13
+ port?: number;
14
+ }
15
+ export declare function startViewerListener(opts: StartViewerListenerOptions): Promise<ViewerListener>;
16
+ //# sourceMappingURL=listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../src/viewer/listener.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,cAAc,CAAC,CAuBzB"}
@@ -0,0 +1,30 @@
1
+ //
2
+ // Ephemeral localhost HTTP listener used by stdio mode. Mounts the viewer
3
+ // router; selects an OS-assigned free port (port: 0); reports the base URL.
4
+ // In http mode the same router mounts onto the transport's express app —
5
+ // no listener needed.
6
+ import express from 'express';
7
+ export async function startViewerListener(opts) {
8
+ const host = opts.host ?? '127.0.0.1';
9
+ const app = express();
10
+ app.use(opts.router);
11
+ const server = app.listen(opts.port ?? 0, host);
12
+ await new Promise((resolve, reject) => {
13
+ server.once('listening', () => resolve());
14
+ server.once('error', (err) => reject(err));
15
+ });
16
+ const addr = server.address();
17
+ if (!addr || typeof addr === 'string')
18
+ throw new Error('viewer listener: failed to read bound address');
19
+ const base = `http://${host}:${addr.port}`;
20
+ return {
21
+ app,
22
+ server,
23
+ base,
24
+ close: () => new Promise((resolve) => {
25
+ server.close(() => resolve());
26
+ server.closeAllConnections?.();
27
+ })
28
+ };
29
+ }
30
+ //# sourceMappingURL=listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener.js","sourceRoot":"","sources":["../../src/viewer/listener.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,sBAAsB;AAItB,OAAO,OAAyB,MAAM,SAAS,CAAC;AAehD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAgC;IAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QACnC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO;QACL,GAAG;QACH,MAAM;QACN,IAAI;QACJ,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACjC,CAAC,CAAC;KACL,CAAC;AACJ,CAAC","sourcesContent":["//\n// Ephemeral localhost HTTP listener used by stdio mode. Mounts the viewer\n// router; selects an OS-assigned free port (port: 0); reports the base URL.\n// In http mode the same router mounts onto the transport's express app —\n// no listener needed.\n\nimport type { Server } from 'node:http';\nimport type { Router } from 'express';\nimport express, { type Express } from 'express';\n\nexport interface ViewerListener {\n app: Express;\n server: Server;\n base: string;\n close(): Promise<void>;\n}\n\nexport interface StartViewerListenerOptions {\n router: Router;\n host?: string;\n port?: number;\n}\n\nexport async function startViewerListener(\n opts: StartViewerListenerOptions\n): Promise<ViewerListener> {\n const host = opts.host ?? '127.0.0.1';\n const app = express();\n app.use(opts.router);\n const server = app.listen(opts.port ?? 0, host);\n await new Promise<void>((resolve, reject) => {\n server.once('listening', () => resolve());\n server.once('error', (err) => reject(err));\n });\n const addr = server.address();\n if (!addr || typeof addr === 'string')\n throw new Error('viewer listener: failed to read bound address');\n const base = `http://${host}:${addr.port}`;\n return {\n app,\n server,\n base,\n close: () =>\n new Promise<void>((resolve) => {\n server.close(() => resolve());\n server.closeAllConnections?.();\n })\n };\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import { type S3Client } from '@aws-sdk/client-s3';
2
+ import { LocalViewerUrlBuilder, type LocalUrlBuilderOptions } from './url-builder.js';
3
+ export interface PresignedR2UrlBuilderOptions extends LocalUrlBuilderOptions {
4
+ client: S3Client;
5
+ bucket: string;
6
+ /** The session's workspace id — the R2 key is `workspaces/<workspaceId>/<relpath>`. */
7
+ workspaceId: string;
8
+ /** Presigned URL lifetime in seconds. Default 3600. */
9
+ expiresIn?: number;
10
+ }
11
+ /**
12
+ * URL builder for S3/R2-backed hosted deployments.
13
+ *
14
+ * Inherits all sync viewer URL methods from LocalViewerUrlBuilder
15
+ * (forDesign / forPinnedRevision / forStudio / forResource), so the
16
+ * synchronous CE.SDK `workspace://` URI resolver callback continues to work
17
+ * unchanged. Only `forDownload` is overridden to return a presigned GET URL
18
+ * so the MCP client can download artifacts directly from R2 rather than
19
+ * going through the `/r/` Express route (which is not mounted on the hosted
20
+ * Cloudflare deployment).
21
+ */
22
+ export declare class PresignedR2UrlBuilder extends LocalViewerUrlBuilder {
23
+ private readonly client;
24
+ private readonly bucket;
25
+ private readonly workspaceId;
26
+ private readonly expiresIn;
27
+ constructor(opts: PresignedR2UrlBuilderOptions);
28
+ forDownload(relpath: string): Promise<string>;
29
+ }
30
+ //# sourceMappingURL=presigned-r2-url-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presigned-r2-url-builder.d.ts","sourceRoot":"","sources":["../../src/viewer/presigned-r2-url-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EACL,qBAAqB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,4BAA6B,SAAQ,sBAAsB;IAC1E,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,qBAAsB,SAAQ,qBAAqB;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,4BAA4B;IAQ/B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAc7D"}
@@ -0,0 +1,40 @@
1
+ // packages/codesign-mcp/src/viewer/presigned-r2-url-builder.ts
2
+ //
3
+ // Node-only. NOT exported from viewer/index.ts or the main package entrypoint
4
+ // — keeps @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner out of the
5
+ // browser bundle (mirrors the pattern used by S3WorkspaceFS in workspace/s3.ts).
6
+ // Imported directly by cli/http.ts for the S3/R2 hosted deployment.
7
+ import { GetObjectCommand } from '@aws-sdk/client-s3';
8
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
9
+ import { LocalViewerUrlBuilder } from './url-builder.js';
10
+ /**
11
+ * URL builder for S3/R2-backed hosted deployments.
12
+ *
13
+ * Inherits all sync viewer URL methods from LocalViewerUrlBuilder
14
+ * (forDesign / forPinnedRevision / forStudio / forResource), so the
15
+ * synchronous CE.SDK `workspace://` URI resolver callback continues to work
16
+ * unchanged. Only `forDownload` is overridden to return a presigned GET URL
17
+ * so the MCP client can download artifacts directly from R2 rather than
18
+ * going through the `/r/` Express route (which is not mounted on the hosted
19
+ * Cloudflare deployment).
20
+ */
21
+ export class PresignedR2UrlBuilder extends LocalViewerUrlBuilder {
22
+ constructor(opts) {
23
+ super(opts);
24
+ this.client = opts.client;
25
+ this.bucket = opts.bucket;
26
+ this.workspaceId = opts.workspaceId;
27
+ this.expiresIn = opts.expiresIn ?? 3600;
28
+ }
29
+ async forDownload(relpath) {
30
+ // workspaceId is used raw (no sanitize here) on purpose: it is the SAME id
31
+ // ScopedWorkspaceFS used to store the artifact, and ScopedWorkspaceFS already
32
+ // sanitised it (rejecting traversal) before any bytes were written. So a key
33
+ // we can presign always corresponds to a stored object, and sanitize is an
34
+ // identity on accepted ids — re-sanitising here would only risk drift from
35
+ // the storage key.
36
+ const key = `workspaces/${this.workspaceId}/${relpath}`;
37
+ return getSignedUrl(this.client, new GetObjectCommand({ Bucket: this.bucket, Key: key }), { expiresIn: this.expiresIn });
38
+ }
39
+ }
40
+ //# sourceMappingURL=presigned-r2-url-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presigned-r2-url-builder.js","sourceRoot":"","sources":["../../src/viewer/presigned-r2-url-builder.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,iFAAiF;AACjF,oEAAoE;AACpE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EACL,qBAAqB,EAEtB,MAAM,kBAAkB,CAAC;AAW1B;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAsB,SAAQ,qBAAqB;IAM9D,YAAY,IAAkC;QAC5C,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IAC1C,CAAC;IAEQ,KAAK,CAAC,WAAW,CAAC,OAAe;QACxC,2EAA2E;QAC3E,8EAA8E;QAC9E,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,mBAAmB;QACnB,MAAM,GAAG,GAAG,cAAc,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;QACxD,OAAO,YAAY,CACjB,IAAI,CAAC,MAAM,EACX,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EACvD,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAC9B,CAAC;IACJ,CAAC;CACF","sourcesContent":["// packages/codesign-mcp/src/viewer/presigned-r2-url-builder.ts\n//\n// Node-only. NOT exported from viewer/index.ts or the main package entrypoint\n// — keeps @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner out of the\n// browser bundle (mirrors the pattern used by S3WorkspaceFS in workspace/s3.ts).\n// Imported directly by cli/http.ts for the S3/R2 hosted deployment.\nimport { GetObjectCommand, type S3Client } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport {\n LocalViewerUrlBuilder,\n type LocalUrlBuilderOptions\n} from './url-builder.js';\n\nexport interface PresignedR2UrlBuilderOptions extends LocalUrlBuilderOptions {\n client: S3Client;\n bucket: string;\n /** The session's workspace id — the R2 key is `workspaces/<workspaceId>/<relpath>`. */\n workspaceId: string;\n /** Presigned URL lifetime in seconds. Default 3600. */\n expiresIn?: number;\n}\n\n/**\n * URL builder for S3/R2-backed hosted deployments.\n *\n * Inherits all sync viewer URL methods from LocalViewerUrlBuilder\n * (forDesign / forPinnedRevision / forStudio / forResource), so the\n * synchronous CE.SDK `workspace://` URI resolver callback continues to work\n * unchanged. Only `forDownload` is overridden to return a presigned GET URL\n * so the MCP client can download artifacts directly from R2 rather than\n * going through the `/r/` Express route (which is not mounted on the hosted\n * Cloudflare deployment).\n */\nexport class PresignedR2UrlBuilder extends LocalViewerUrlBuilder {\n private readonly client: S3Client;\n private readonly bucket: string;\n private readonly workspaceId: string;\n private readonly expiresIn: number;\n\n constructor(opts: PresignedR2UrlBuilderOptions) {\n super(opts);\n this.client = opts.client;\n this.bucket = opts.bucket;\n this.workspaceId = opts.workspaceId;\n this.expiresIn = opts.expiresIn ?? 3600;\n }\n\n override async forDownload(relpath: string): Promise<string> {\n // workspaceId is used raw (no sanitize here) on purpose: it is the SAME id\n // ScopedWorkspaceFS used to store the artifact, and ScopedWorkspaceFS already\n // sanitised it (rejecting traversal) before any bytes were written. So a key\n // we can presign always corresponds to a stored object, and sanitize is an\n // identity on accepted ids — re-sanitising here would only risk drift from\n // the storage key.\n const key = `workspaces/${this.workspaceId}/${relpath}`;\n return getSignedUrl(\n this.client,\n new GetObjectCommand({ Bucket: this.bucket, Key: key }),\n { expiresIn: this.expiresIn }\n );\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { Router } from 'express';
2
+ import type { WorkspaceFS } from '../workspace/types.js';
3
+ export interface CreateResourceRouteOptions {
4
+ fs: WorkspaceFS;
5
+ /** Absolute workspace root for the disk-streaming fast path. Empty on object-store backends. */
6
+ workspaceRoot: string;
7
+ }
8
+ export declare function createResourceRoute(opts: CreateResourceRouteOptions): Router;
9
+ //# sourceMappingURL=resource-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-route.d.ts","sourceRoot":"","sources":["../../src/viewer/resource-route.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,MAAM,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAkBzD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,WAAW,CAAC;IAChB,gGAAgG;IAChG,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,MAAM,CAoC5E"}
@@ -0,0 +1,59 @@
1
+ //
2
+ // GET /r/<relpath> — serves workspace binary (generated assets, exports) over
3
+ // HTTP: CE.SDK fetching an asset, or a human opening an export. Prefix-
4
+ // allowlisted to assets/ and exports/ — nothing else is reachable, so the
5
+ // route cannot be used to browse the workspace. Local streams from disk
6
+ // (Range requests work); object-store backends fall back to a buffered send.
7
+ import { normalize } from 'node:path';
8
+ import { Router } from 'express';
9
+ const ALLOWED_PREFIXES = ['assets/', 'exports/'];
10
+ const CONTENT_TYPES = {
11
+ png: 'image/png',
12
+ jpg: 'image/jpeg',
13
+ jpeg: 'image/jpeg',
14
+ webp: 'image/webp',
15
+ pdf: 'application/pdf',
16
+ mp4: 'video/mp4'
17
+ };
18
+ function contentTypeFor(name) {
19
+ const ext = name.split('.').pop() ?? '';
20
+ return CONTENT_TYPES[ext] ?? 'application/octet-stream';
21
+ }
22
+ export function createResourceRoute(opts) {
23
+ const router = Router();
24
+ // Wildcard param `0` is Express 4's capture for `*` in a route pattern.
25
+ const handler = (req, res) => {
26
+ // Normalising collapses any `..`; an escaping path then fails the
27
+ // allowlist check below, so traversal and allowlist are one guard.
28
+ const relpath = normalize(req.params['0'] ?? '');
29
+ if (!ALLOWED_PREFIXES.some((p) => relpath.startsWith(p))) {
30
+ res.status(404).type('text').send('not found');
31
+ return;
32
+ }
33
+ if (opts.workspaceRoot) {
34
+ // Local: stream from disk. `root` confines sendFile to the workspace
35
+ // and rejects `..`; res.sendFile honours Range headers (HTTP 206).
36
+ res.sendFile(relpath, { root: opts.workspaceRoot }, (err) => {
37
+ if (err && !res.headersSent)
38
+ res.status(404).type('text').send('not found');
39
+ });
40
+ return;
41
+ }
42
+ // Object-store backend (and tests): buffered send, no Range support.
43
+ opts.fs
44
+ .readFile(relpath)
45
+ .then((bytes) => {
46
+ res.type(contentTypeFor(relpath)).send(Buffer.from(bytes));
47
+ })
48
+ .catch((err) => {
49
+ const enoent = err.code === 'ENOENT';
50
+ res
51
+ .status(enoent ? 404 : 500)
52
+ .type('text')
53
+ .send(enoent ? 'not found' : 'error');
54
+ });
55
+ };
56
+ router.get('/r/*', handler);
57
+ return router;
58
+ }
59
+ //# sourceMappingURL=resource-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-route.js","sourceRoot":"","sources":["../../src/viewer/resource-route.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,8EAA8E;AAC9E,wEAAwE;AACxE,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAuB,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtD,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEjD,MAAM,aAAa,GAA2B;IAC5C,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACxC,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAC1D,CAAC;AAQD,MAAM,UAAU,mBAAmB,CAAC,IAAgC;IAClE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,wEAAwE;IACxE,MAAM,OAAO,GAAoC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5D,kEAAkE;QAClE,mEAAmE;QACnE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,qEAAqE;YACrE,mEAAmE;YACnE,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC1D,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW;oBACzB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,qEAAqE;QACrE,IAAI,CAAC,EAAE;aACJ,QAAQ,CAAC,OAAO,CAAC;aACjB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,MAAM,MAAM,GAAI,GAAyB,CAAC,IAAI,KAAK,QAAQ,CAAC;YAC5D,GAAG;iBACA,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;iBAC1B,IAAI,CAAC,MAAM,CAAC;iBACZ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["//\n// GET /r/<relpath> — serves workspace binary (generated assets, exports) over\n// HTTP: CE.SDK fetching an asset, or a human opening an export. Prefix-\n// allowlisted to assets/ and exports/ — nothing else is reachable, so the\n// route cannot be used to browse the workspace. Local streams from disk\n// (Range requests work); object-store backends fall back to a buffered send.\nimport { normalize } from 'node:path';\nimport { type RequestHandler, Router } from 'express';\nimport type { WorkspaceFS } from '../workspace/types.js';\n\nconst ALLOWED_PREFIXES = ['assets/', 'exports/'];\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n pdf: 'application/pdf',\n mp4: 'video/mp4'\n};\n\nfunction contentTypeFor(name: string): string {\n const ext = name.split('.').pop() ?? '';\n return CONTENT_TYPES[ext] ?? 'application/octet-stream';\n}\n\nexport interface CreateResourceRouteOptions {\n fs: WorkspaceFS;\n /** Absolute workspace root for the disk-streaming fast path. Empty on object-store backends. */\n workspaceRoot: string;\n}\n\nexport function createResourceRoute(opts: CreateResourceRouteOptions): Router {\n const router = Router();\n // Wildcard param `0` is Express 4's capture for `*` in a route pattern.\n const handler: RequestHandler<{ '0': string }> = (req, res) => {\n // Normalising collapses any `..`; an escaping path then fails the\n // allowlist check below, so traversal and allowlist are one guard.\n const relpath = normalize(req.params['0'] ?? '');\n if (!ALLOWED_PREFIXES.some((p) => relpath.startsWith(p))) {\n res.status(404).type('text').send('not found');\n return;\n }\n if (opts.workspaceRoot) {\n // Local: stream from disk. `root` confines sendFile to the workspace\n // and rejects `..`; res.sendFile honours Range headers (HTTP 206).\n res.sendFile(relpath, { root: opts.workspaceRoot }, (err) => {\n if (err && !res.headersSent)\n res.status(404).type('text').send('not found');\n });\n return;\n }\n // Object-store backend (and tests): buffered send, no Range support.\n opts.fs\n .readFile(relpath)\n .then((bytes) => {\n res.type(contentTypeFor(relpath)).send(Buffer.from(bytes));\n })\n .catch((err: unknown) => {\n const enoent = (err as { code?: string }).code === 'ENOENT';\n res\n .status(enoent ? 404 : 500)\n .type('text')\n .send(enoent ? 'not found' : 'error');\n });\n };\n router.get('/r/*', handler);\n return router;\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { Router } from 'express';
2
+ import type { RevisionStore } from '../revisions/store.js';
3
+ import type { WorkspaceFS } from '../workspace/types.js';
4
+ import type { SseBroadcaster } from './broadcaster.js';
5
+ export interface CreateViewerRouterOptions {
6
+ store: RevisionStore;
7
+ fs: WorkspaceFS;
8
+ broadcaster: SseBroadcaster;
9
+ /**
10
+ * CE.SDK license served to the browser viewer via `/api/config`.
11
+ * Without it, the SPA can't initialise CreativeEditorSDK and shows a
12
+ * license error. The viewer requires a browser-shape license (which may
13
+ * be a separate SKU from the @cesdk/node license used by the agent).
14
+ */
15
+ cesdkLicense?: string;
16
+ /** Absolute workspace root, forwarded to the `/r/` route for disk streaming. Empty on object-store backends. */
17
+ workspaceRoot?: string;
18
+ }
19
+ export declare function createViewerRouter(opts: CreateViewerRouterOptions): Router;
20
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/viewer/router.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,MAAM,EACP,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,aAAa,CAAC;IACrB,EAAE,EAAE,WAAW,CAAC;IAChB,WAAW,EAAE,cAAc,CAAC;IAC5B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gHAAgH;IAChH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAgJ1E"}
@@ -0,0 +1,142 @@
1
+ //
2
+ // Express router serving the read-only viewer + mini-studio + JSON snapshot
3
+ // API + SSE channel. Stateless: every request reads through the supplied
4
+ // store/fs. Same router mounts on the stdio listener and on the HTTP
5
+ // transport's express app (one impl, no fork).
6
+ import { Router } from 'express';
7
+ import { createResourceRoute } from './resource-route.js';
8
+ import { SPA_ASSETS } from './spa-assets.generated.js';
9
+ export function createViewerRouter(opts) {
10
+ const { store, fs, broadcaster } = opts;
11
+ const router = Router();
12
+ // The SPA is mounted at root on the stdio listener (req.baseUrl === "") and
13
+ // under "/viewer" on the HTTP transport (req.baseUrl === "/viewer"). Its
14
+ // HTML/JS address assets and API routes by path, so we inject the live mount
15
+ // prefix at serve time: the `{{VIEWER_BASE}}` token in the HTML becomes
16
+ // req.baseUrl, and the inline `window.__VIEWER_BASE__` global it sets lets
17
+ // the SPA's JS build matching URLs at runtime. Without this the absolute
18
+ // paths resolve against the origin root and 404 under "/viewer".
19
+ const renderHtml = (html, baseUrl) => html.replaceAll('{{VIEWER_BASE}}', baseUrl);
20
+ router.get('/api/config', (req, res) => {
21
+ // `resourceBase` is where the browser viewer resolves workspace:// asset
22
+ // URIs. `req.baseUrl` is "" on the stdio listener, "/viewer" on HTTP.
23
+ res.json({
24
+ license: opts.cesdkLicense ?? '',
25
+ resourceBase: `${req.baseUrl}/r/`
26
+ });
27
+ });
28
+ router.use(createResourceRoute({ fs, workspaceRoot: opts.workspaceRoot ?? '' }));
29
+ router.get('/', (req, res) => {
30
+ res.type('html').send(renderHtml(SPA_ASSETS['studio.html'], req.baseUrl));
31
+ });
32
+ // `/d/<root>` (LIVE) and `/d/<root>/<rev>` (PINNED) both serve the viewer
33
+ // SPA; viewer.js reads the path depth to choose the mode. The old
34
+ // per-revision `/s/<rev>` route is gone — `open_editor` hands out `/d/`.
35
+ const serveViewer = (req, res) => {
36
+ res.type('html').send(renderHtml(SPA_ASSETS['index.html'], req.baseUrl));
37
+ };
38
+ router.get('/d/:root', serveViewer);
39
+ router.get('/d/:root/:rev', serveViewer);
40
+ router.get('/static/:name', (req, res, next) => {
41
+ const body = SPA_ASSETS[req.params.name];
42
+ if (!body)
43
+ return next();
44
+ const ext = req.params.name.split('.').pop();
45
+ const ctype = ext === 'html'
46
+ ? 'text/html'
47
+ : ext === 'js'
48
+ ? 'application/javascript'
49
+ : 'text/plain';
50
+ res.type(ctype).send(body);
51
+ });
52
+ // NOTE: thumbnail MUST be registered before /snapshot/:rev so Express
53
+ // matches it first (route registration order is resolution order).
54
+ router.get('/snapshot/:rev/thumbnail', async (req, res, next) => {
55
+ try {
56
+ const rev = req.params.rev;
57
+ const shard = rev.slice(0, 2);
58
+ const rest = rev.slice(2);
59
+ const relPath = `exports/${shard}/${rest}/preview.webp`;
60
+ if (!(await fs.exists(relPath)))
61
+ return next();
62
+ const bytes = await fs.readFile(relPath);
63
+ res.type('image/webp').send(Buffer.from(bytes));
64
+ }
65
+ catch (err) {
66
+ next(err);
67
+ }
68
+ });
69
+ router.get('/snapshot/:rev', async (req, res, next) => {
70
+ try {
71
+ const revision = await store.read(req.params.rev);
72
+ const chain = await store.historyOf(req.params.rev);
73
+ const rootRevision = chain[0].id;
74
+ res.json({
75
+ revision: revision.id,
76
+ rootRevision,
77
+ scene: revision.scene,
78
+ title: await store.currentTitle(rootRevision),
79
+ note: revision.meta.note,
80
+ createdAt: revision.meta.createdAt
81
+ });
82
+ }
83
+ catch (err) {
84
+ if (err.code === 'ENOENT') {
85
+ res.status(404).json({ error: 'unknown revision' });
86
+ return;
87
+ }
88
+ // Non-ENOENT errors carry fs paths in their message — hand to the
89
+ // sanitising error handler rather than echoing err.message.
90
+ next(err);
91
+ }
92
+ });
93
+ router.get('/sse/:root', (req, res) => {
94
+ broadcaster.subscribe(req.params.root, res);
95
+ });
96
+ router.get('/api/designs', async (_req, res, next) => {
97
+ try {
98
+ res.json(await store.listRoots());
99
+ }
100
+ catch (err) {
101
+ next(err);
102
+ }
103
+ });
104
+ router.get('/api/design/:root', async (req, res, next) => {
105
+ try {
106
+ const roots = await store.listRoots();
107
+ const design = roots.find((d) => d.rootRevision === req.params.root);
108
+ if (!design) {
109
+ res.status(404).json({ error: 'unknown design' });
110
+ return;
111
+ }
112
+ res.json(design);
113
+ }
114
+ catch (err) {
115
+ next(err);
116
+ }
117
+ });
118
+ router.get('/api/design/:root/revisions', async (req, res, next) => {
119
+ try {
120
+ const tree = await store.treeOf(req.params.root);
121
+ if (tree.length === 0) {
122
+ res.status(404).json({ error: 'unknown design' });
123
+ return;
124
+ }
125
+ res.json(tree);
126
+ }
127
+ catch (err) {
128
+ next(err);
129
+ }
130
+ });
131
+ // Sanitising error handler — fs errors embed the absolute workspace path in
132
+ // their message; convert every error to a generic response so the path
133
+ // never reaches a client. MUST be last, and MUST take all four args for
134
+ // Express to recognise it as an error handler.
135
+ router.use((_err, _req, res, _next) => {
136
+ if (res.headersSent)
137
+ return;
138
+ res.status(500).type('text').send('internal error');
139
+ });
140
+ return router;
141
+ }
142
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/viewer/router.ts"],"names":[],"mappings":"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","sourcesContent":["//\n// Express router serving the read-only viewer + mini-studio + JSON snapshot\n// API + SSE channel. Stateless: every request reads through the supplied\n// store/fs. Same router mounts on the stdio listener and on the HTTP\n// transport's express app (one impl, no fork).\nimport {\n type NextFunction,\n type Request,\n type Response,\n Router\n} from 'express';\nimport type { RevisionStore } from '../revisions/store.js';\nimport type { WorkspaceFS } from '../workspace/types.js';\nimport type { SseBroadcaster } from './broadcaster.js';\nimport { createResourceRoute } from './resource-route.js';\nimport { SPA_ASSETS } from './spa-assets.generated.js';\n\nexport interface CreateViewerRouterOptions {\n store: RevisionStore;\n fs: WorkspaceFS;\n broadcaster: SseBroadcaster;\n /**\n * CE.SDK license served to the browser viewer via `/api/config`.\n * Without it, the SPA can't initialise CreativeEditorSDK and shows a\n * license error. The viewer requires a browser-shape license (which may\n * be a separate SKU from the @cesdk/node license used by the agent).\n */\n cesdkLicense?: string;\n /** Absolute workspace root, forwarded to the `/r/` route for disk streaming. Empty on object-store backends. */\n workspaceRoot?: string;\n}\n\nexport function createViewerRouter(opts: CreateViewerRouterOptions): Router {\n const { store, fs, broadcaster } = opts;\n const router = Router();\n\n // The SPA is mounted at root on the stdio listener (req.baseUrl === \"\") and\n // under \"/viewer\" on the HTTP transport (req.baseUrl === \"/viewer\"). Its\n // HTML/JS address assets and API routes by path, so we inject the live mount\n // prefix at serve time: the `{{VIEWER_BASE}}` token in the HTML becomes\n // req.baseUrl, and the inline `window.__VIEWER_BASE__` global it sets lets\n // the SPA's JS build matching URLs at runtime. Without this the absolute\n // paths resolve against the origin root and 404 under \"/viewer\".\n const renderHtml = (html: string, baseUrl: string): string =>\n html.replaceAll('{{VIEWER_BASE}}', baseUrl);\n\n router.get('/api/config', (req, res) => {\n // `resourceBase` is where the browser viewer resolves workspace:// asset\n // URIs. `req.baseUrl` is \"\" on the stdio listener, \"/viewer\" on HTTP.\n res.json({\n license: opts.cesdkLicense ?? '',\n resourceBase: `${req.baseUrl}/r/`\n });\n });\n\n router.use(\n createResourceRoute({ fs, workspaceRoot: opts.workspaceRoot ?? '' })\n );\n\n router.get('/', (req, res) => {\n res.type('html').send(renderHtml(SPA_ASSETS['studio.html'], req.baseUrl));\n });\n\n // `/d/<root>` (LIVE) and `/d/<root>/<rev>` (PINNED) both serve the viewer\n // SPA; viewer.js reads the path depth to choose the mode. The old\n // per-revision `/s/<rev>` route is gone — `open_editor` hands out `/d/`.\n const serveViewer = (req: Request, res: Response): void => {\n res.type('html').send(renderHtml(SPA_ASSETS['index.html'], req.baseUrl));\n };\n router.get('/d/:root', serveViewer);\n router.get('/d/:root/:rev', serveViewer);\n\n router.get('/static/:name', (req, res, next) => {\n const body = SPA_ASSETS[req.params.name];\n if (!body) return next();\n const ext = req.params.name.split('.').pop();\n const ctype =\n ext === 'html'\n ? 'text/html'\n : ext === 'js'\n ? 'application/javascript'\n : 'text/plain';\n res.type(ctype).send(body);\n });\n\n // NOTE: thumbnail MUST be registered before /snapshot/:rev so Express\n // matches it first (route registration order is resolution order).\n router.get('/snapshot/:rev/thumbnail', async (req, res, next) => {\n try {\n const rev = req.params.rev;\n const shard = rev.slice(0, 2);\n const rest = rev.slice(2);\n const relPath = `exports/${shard}/${rest}/preview.webp`;\n if (!(await fs.exists(relPath))) return next();\n const bytes = await fs.readFile(relPath);\n res.type('image/webp').send(Buffer.from(bytes));\n } catch (err) {\n next(err);\n }\n });\n\n router.get('/snapshot/:rev', async (req, res, next) => {\n try {\n const revision = await store.read(req.params.rev);\n const chain = await store.historyOf(req.params.rev);\n const rootRevision = chain[0].id;\n res.json({\n revision: revision.id,\n rootRevision,\n scene: revision.scene,\n title: await store.currentTitle(rootRevision),\n note: revision.meta.note,\n createdAt: revision.meta.createdAt\n });\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n res.status(404).json({ error: 'unknown revision' });\n return;\n }\n // Non-ENOENT errors carry fs paths in their message — hand to the\n // sanitising error handler rather than echoing err.message.\n next(err);\n }\n });\n\n router.get('/sse/:root', (req, res) => {\n broadcaster.subscribe(req.params.root, res);\n });\n\n router.get('/api/designs', async (_req, res, next) => {\n try {\n res.json(await store.listRoots());\n } catch (err) {\n next(err);\n }\n });\n\n router.get('/api/design/:root', async (req, res, next) => {\n try {\n const roots = await store.listRoots();\n const design = roots.find((d) => d.rootRevision === req.params.root);\n if (!design) {\n res.status(404).json({ error: 'unknown design' });\n return;\n }\n res.json(design);\n } catch (err) {\n next(err);\n }\n });\n\n router.get('/api/design/:root/revisions', async (req, res, next) => {\n try {\n const tree = await store.treeOf(req.params.root);\n if (tree.length === 0) {\n res.status(404).json({ error: 'unknown design' });\n return;\n }\n res.json(tree);\n } catch (err) {\n next(err);\n }\n });\n\n // Sanitising error handler — fs errors embed the absolute workspace path in\n // their message; convert every error to a generic response so the path\n // never reaches a client. MUST be last, and MUST take all four args for\n // Express to recognise it as an error handler.\n router.use(\n (_err: unknown, _req: Request, res: Response, _next: NextFunction) => {\n if (res.headersSent) return;\n res.status(500).type('text').send('internal error');\n }\n );\n\n return router;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { Express } from 'express';
2
+ import type { WorkspaceFS } from '../workspace/types.js';
3
+ import type { SseBroadcaster } from './broadcaster.js';
4
+ export interface MountSessionViewerOptions {
5
+ rawFs: WorkspaceFS;
6
+ broadcaster: SseBroadcaster;
7
+ cesdkLicense: string | undefined;
8
+ }
9
+ export declare function mountSessionViewer(app: Express, opts: MountSessionViewerOptions): void;
10
+ //# sourceMappingURL=session-mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mount.d.ts","sourceRoot":"","sources":["../../src/viewer/session-mount.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAGxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,cAAc,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,yBAAyB,GAC9B,IAAI,CAkBN"}
@@ -0,0 +1,24 @@
1
+ import { RevisionStore } from '../revisions/store.js';
2
+ import { ScopedWorkspaceFS } from '../workspace/scoped.js';
3
+ import { createViewerRouter } from './router.js';
4
+ export function mountSessionViewer(app, opts) {
5
+ app.use('/v/:sid', (req, res, next) => {
6
+ let scopedFs;
7
+ try {
8
+ scopedFs = new ScopedWorkspaceFS(opts.rawFs, `s/${req.params.sid}`);
9
+ }
10
+ catch {
11
+ // sanitizeWorkspaceId rejected the sid (traversal / control chars).
12
+ res.status(404).type('text').send('not found');
13
+ return;
14
+ }
15
+ const router = createViewerRouter({
16
+ store: new RevisionStore(scopedFs),
17
+ fs: scopedFs,
18
+ broadcaster: opts.broadcaster,
19
+ ...(opts.cesdkLicense ? { cesdkLicense: opts.cesdkLicense } : {})
20
+ });
21
+ router(req, res, next);
22
+ });
23
+ }
24
+ //# sourceMappingURL=session-mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mount.js","sourceRoot":"","sources":["../../src/viewer/session-mount.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQjD,MAAM,UAAU,kBAAkB,CAChC,GAAY,EACZ,IAA+B;IAE/B,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACrE,IAAI,QAA2B,CAAC;QAChC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC;YAChC,KAAK,EAAE,IAAI,aAAa,CAAC,QAAQ,CAAC;YAClC,EAAE,EAAE,QAAQ;YACZ,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["// packages/codesign-mcp/src/viewer/session-mount.ts\n//\n// Multi-tenant viewer mount for `session` workspace mode: GET /v/<sid>/...\n// serves the same read-only viewer router, scoped to that session's workspace\n// `s/<sid>` — the SAME derivation makeWorkspaceResolver applies on /mcp, so a\n// session always finds its own designs. The sid in the URL is a bearer\n// capability mirroring the /mcp trust posture (unguessable session id); real\n// authentication is a follow-up. The router is built per request: construction\n// is cheap and stateless, and caching by sid would be an unbounded,\n// attacker-fillable map on a public endpoint.\nimport type { Express, NextFunction, Request, Response } from 'express';\nimport { RevisionStore } from '../revisions/store.js';\nimport { ScopedWorkspaceFS } from '../workspace/scoped.js';\nimport type { WorkspaceFS } from '../workspace/types.js';\nimport type { SseBroadcaster } from './broadcaster.js';\nimport { createViewerRouter } from './router.js';\n\nexport interface MountSessionViewerOptions {\n rawFs: WorkspaceFS;\n broadcaster: SseBroadcaster;\n cesdkLicense: string | undefined;\n}\n\nexport function mountSessionViewer(\n app: Express,\n opts: MountSessionViewerOptions\n): void {\n app.use('/v/:sid', (req: Request, res: Response, next: NextFunction) => {\n let scopedFs: ScopedWorkspaceFS;\n try {\n scopedFs = new ScopedWorkspaceFS(opts.rawFs, `s/${req.params.sid}`);\n } catch {\n // sanitizeWorkspaceId rejected the sid (traversal / control chars).\n res.status(404).type('text').send('not found');\n return;\n }\n const router = createViewerRouter({\n store: new RevisionStore(scopedFs),\n fs: scopedFs,\n broadcaster: opts.broadcaster,\n ...(opts.cesdkLicense ? { cesdkLicense: opts.cesdkLicense } : {})\n });\n router(req, res, next);\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const SPA_ASSETS: Record<string, string>;
2
+ //# sourceMappingURL=spa-assets.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spa-assets.generated.d.ts","sourceRoot":"","sources":["../../src/viewer/spa-assets.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA09B7C,CAAC"}