@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 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/gateway/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAEpB,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AAQrE,MAAM,OAAO,kBAAkB;IAC7B,YAA6B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;IAAG,CAAC;IAEhE,qDAAqD;IACrD,IAAI,SAAS;QACX,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAyB;QAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAC5B,qHAAqH,CACtH,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,gBAAgB,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,oCAAoC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CACnE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,CACf,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YACzB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;gBAC3B,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,WAAW,CAC2B,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;CACF","sourcesContent":["import {\n type GatewayClient,\n GatewayDisabledError,\n type GenerateImageInput,\n type GenerateImageOutput\n} from './types.js';\n\nconst DEFAULT_ENDPOINT = 'https://gateway.img.ly/v1/images/generate';\n\nexport interface LocalGatewayClientOptions {\n apiKey: string | undefined;\n endpoint?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class LocalGatewayClient implements GatewayClient {\n constructor(private readonly opts: LocalGatewayClientOptions) {}\n\n /** Available only when an `API_KEY` was provided. */\n get available(): boolean {\n return Boolean(this.opts.apiKey);\n }\n\n async generateImage(input: GenerateImageInput): Promise<GenerateImageOutput> {\n if (!this.opts.apiKey) {\n throw new GatewayDisabledError(\n 'asset generation is disabled: set `API_KEY` (your IMG.LY gateway key) to enable. See `handbook` → `asset_generate`.'\n );\n }\n const f = this.opts.fetch ?? globalThis.fetch;\n const res = await f(this.opts.endpoint ?? DEFAULT_ENDPOINT, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.opts.apiKey}`,\n 'content-type': 'application/json'\n },\n body: JSON.stringify({\n prompt: input.prompt,\n width: input.width,\n height: input.height\n })\n });\n if (!res.ok) {\n throw new Error(\n `asset_generate: gateway returned ${res.status} ${res.statusText}`\n );\n }\n const ct = res.headers.get('content-type') ?? 'image/png';\n const bytes = new Uint8Array(await res.arrayBuffer());\n const mimeType = (\n ct.startsWith('image/jpeg')\n ? 'image/jpeg'\n : ct.startsWith('image/webp')\n ? 'image/webp'\n : 'image/png'\n ) as 'image/png' | 'image/jpeg' | 'image/webp';\n return { bytes, mimeType };\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ export interface GenerateImageInput {
2
+ prompt: string;
3
+ width?: number;
4
+ height?: number;
5
+ }
6
+ export interface GenerateImageOutput {
7
+ /** Raw image bytes (PNG). */
8
+ bytes: Uint8Array;
9
+ mimeType: 'image/png' | 'image/jpeg' | 'image/webp';
10
+ }
11
+ export interface GatewayClient {
12
+ /**
13
+ * Whether the gateway can actually fulfil a generation request right now
14
+ * (e.g. Local has an `API_KEY`). Callers use this to decide whether to
15
+ * expose the `asset_generate` tool at all — an unavailable gateway means
16
+ * the tool is hidden from `tools/list` rather than offered and then failing.
17
+ */
18
+ readonly available: boolean;
19
+ generateImage(input: GenerateImageInput): Promise<GenerateImageOutput>;
20
+ }
21
+ export declare class GatewayDisabledError extends Error {
22
+ constructor(message: string);
23
+ }
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACxE;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,7 @@
1
+ export class GatewayDisabledError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'GatewayDisabledError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"AAuBA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF","sourcesContent":["export interface GenerateImageInput {\n prompt: string;\n width?: number;\n height?: number;\n}\n\nexport interface GenerateImageOutput {\n /** Raw image bytes (PNG). */\n bytes: Uint8Array;\n mimeType: 'image/png' | 'image/jpeg' | 'image/webp';\n}\n\nexport interface GatewayClient {\n /**\n * Whether the gateway can actually fulfil a generation request right now\n * (e.g. Local has an `API_KEY`). Callers use this to decide whether to\n * expose the `asset_generate` tool at all — an unavailable gateway means\n * the tool is hidden from `tools/list` rather than offered and then failing.\n */\n readonly available: boolean;\n generateImage(input: GenerateImageInput): Promise<GenerateImageOutput>;\n}\n\nexport class GatewayDisabledError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GatewayDisabledError';\n }\n}\n"]}
@@ -0,0 +1,80 @@
1
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
2
+ import { type CorsOptions } from 'cors';
3
+ import { type Express, type Request, type RequestHandler } from 'express';
4
+ import { type CodesignMcpToolRegistration, createCodesignMcpServer } from '../server.js';
5
+ import { SessionManager } from './session-manager.js';
6
+ import type { MetricsRecorder } from '../metrics/recorder.js';
7
+ /**
8
+ * Per-session state held by the SessionManager: the engine, the MCP server,
9
+ * and the per-session HTTP transport. Every incoming request with this
10
+ * session's id is routed to `transport.handleRequest`.
11
+ */
12
+ export interface CodesignHttpSession {
13
+ id: string;
14
+ engine: unknown;
15
+ server: ReturnType<typeof createCodesignMcpServer>;
16
+ transport: StreamableHTTPServerTransport;
17
+ dispose?: () => Promise<void>;
18
+ }
19
+ export interface CreateCodesignHttpServerOptions {
20
+ assets: Record<string, string>;
21
+ resourceScheme?: string;
22
+ maxSessions: number;
23
+ idleTimeoutMs: number;
24
+ /**
25
+ * Resolve the front-asserted workspaceId for a new MCP session. Receives the
26
+ * freshly-minted session id (so `session` mode can derive `s/<id>`). May throw
27
+ * WorkspaceAuthError → 401. Default: a fixed "default" workspace.
28
+ */
29
+ resolveWorkspaceId?: (req: Request, sessionId: string) => string;
30
+ /**
31
+ * When set, an `initialize` request carrying this (case-insensitive) header uses
32
+ * its value as the MCP session id instead of minting one. The Worker/front
33
+ * mints the id so it can route follow-ups to the same warm instance (spec §3).
34
+ * The front MUST strip any client-supplied value of this header — same trust
35
+ * posture as the workspace header. Absent header → mint as normal.
36
+ */
37
+ trustedSessionIdHeader?: string;
38
+ /** Build everything needed for one session in one go. */
39
+ createSession: (ctx: {
40
+ sessionId: string;
41
+ workspaceId: string;
42
+ }) => Promise<{
43
+ engine: unknown;
44
+ tools: CodesignMcpToolRegistration[];
45
+ dispose?: () => Promise<void>;
46
+ }>;
47
+ /** Optional: mount additional routes (viewer router, dashboards) before MCP. */
48
+ mountExtras?: (app: Express) => void;
49
+ /**
50
+ * Optional metrics recorder, DI'd into every session's MCP server so tool
51
+ * calls are timed at the single dispatch chokepoint. Absent → no timing.
52
+ */
53
+ metrics?: MetricsRecorder;
54
+ /** Build identity reported as `serverInfo.version`. Default `'dev'`. */
55
+ buildId?: string;
56
+ /** Optional auth middleware — runs before MCP routing. Default: no-op. */
57
+ auth?: RequestHandler;
58
+ /** Optional CORS options. Default: disabled. */
59
+ cors?: CorsOptions | false;
60
+ }
61
+ /**
62
+ * Express app exposing MCP over Streamable HTTP at /mcp. Stateful sessions:
63
+ * each MCP `initialize` call spawns a fresh session (engine + server +
64
+ * transport); follow-up requests carry `Mcp-Session-Id` to route back. The
65
+ * underlying SessionManager enforces idle eviction and a session cap.
66
+ *
67
+ * The returned object exposes:
68
+ * .listen / .use / etc. — Express's surface (composes into larger apps)
69
+ * .sessions — the SessionManager (testing + ops insight)
70
+ * .shutdown() — destroy every active session, dispose engines
71
+ */
72
+ export interface CodesignHttpServer extends Express {
73
+ sessions: SessionManager<CodesignHttpSession, {
74
+ sessionId: string;
75
+ workspaceId: string;
76
+ }>;
77
+ shutdown(): Promise<void>;
78
+ }
79
+ export declare function createCodesignHttpServer(opts: CreateCodesignHttpServerOptions): Promise<CodesignHttpServer>;
80
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAa,EAAE,KAAK,WAAW,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAgB,EACd,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,cAAc,EAEpB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,KAAK,2BAA2B,EAChC,uBAAuB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAA2B,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;IACnD,SAAS,EAAE,6BAA6B,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACjE;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,yDAAyD;IACzD,aAAa,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAC1E,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,2BAA2B,EAAE,CAAC;QACrC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/B,CAAC,CAAC;IACH,gFAAgF;IAChF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,gDAAgD;IAChD,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAmB,SAAQ,OAAO;IACjD,QAAQ,EAAE,cAAc,CACtB,mBAAmB,EACnB;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAC3C,CAAC;IACF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,+BAA+B,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAyL7B"}
@@ -0,0 +1,183 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
+ import cors from 'cors';
4
+ import express from 'express';
5
+ import { createCodesignMcpServer } from '../server.js';
6
+ import { SessionCapExceededError, SessionManager } from './session-manager.js';
7
+ import { WorkspaceAuthError } from './workspace-auth.js';
8
+ export async function createCodesignHttpServer(opts) {
9
+ const resolveWorkspaceId = opts.resolveWorkspaceId ?? (() => 'default');
10
+ const sessionMgr = new SessionManager({
11
+ maxSessions: opts.maxSessions,
12
+ idleTimeoutMs: opts.idleTimeoutMs,
13
+ create: async (ctx) => {
14
+ if (!ctx)
15
+ throw new Error('createCodesignHttpServer: session context is required');
16
+ const id = ctx.sessionId;
17
+ const { engine, tools, dispose } = await opts.createSession({
18
+ sessionId: id,
19
+ workspaceId: ctx.workspaceId
20
+ });
21
+ const server = createCodesignMcpServer({
22
+ engine,
23
+ assets: opts.assets,
24
+ resourceScheme: opts.resourceScheme,
25
+ tools,
26
+ ...(opts.buildId ? { buildId: opts.buildId } : {}),
27
+ ...(opts.metrics ? { metrics: opts.metrics } : {})
28
+ });
29
+ const transport = new StreamableHTTPServerTransport({
30
+ sessionIdGenerator: () => id,
31
+ // A client `DELETE /mcp` (graceful termination) fires this before the
32
+ // transport closes itself. Bridge it to the SessionManager so the slot
33
+ // and its engine are reclaimed immediately instead of squatting until
34
+ // idle eviction. Only fires on the DELETE path — not from transport
35
+ // `close()` during `destroy` — so there is no re-entrancy: `delete`
36
+ // removes the map entry first, then runs `destroy` (a redundant,
37
+ // idempotent second `transport.close()`).
38
+ onsessionclosed: (sid) => {
39
+ void sessionMgr.delete(sid).catch(() => {
40
+ // Already gone (idle-evicted, or a duplicate close) — nothing to do.
41
+ });
42
+ }
43
+ });
44
+ await server.connect(transport);
45
+ return { id, engine, server, transport, dispose };
46
+ },
47
+ destroy: async (s) => {
48
+ try {
49
+ await s.transport.close();
50
+ }
51
+ catch {
52
+ // ignore — best-effort
53
+ }
54
+ try {
55
+ await s.server.close();
56
+ }
57
+ catch {
58
+ // ignore
59
+ }
60
+ // Call the session's dispose callback if provided (e.g. engine teardown).
61
+ try {
62
+ await s.dispose?.();
63
+ }
64
+ catch {
65
+ // ignore
66
+ }
67
+ }
68
+ });
69
+ const app = express();
70
+ app.sessions = sessionMgr;
71
+ if (opts.cors !== false) {
72
+ app.use(cors(opts.cors));
73
+ }
74
+ if (opts.auth) {
75
+ app.use(opts.auth);
76
+ }
77
+ app.use(express.json({ limit: '16mb' }));
78
+ /** Narrow `code` out of an unknown thrown value without `as any`. */
79
+ function errCode(e) {
80
+ return typeof e === 'object' && e !== null && 'code' in e
81
+ ? e.code
82
+ : undefined;
83
+ }
84
+ const handle = async (req, res) => {
85
+ const sessionId = req.header('mcp-session-id');
86
+ // Initialization (POST without session id) → spawn a new session.
87
+ if (req.method === 'POST' && !sessionId) {
88
+ const injected = opts.trustedSessionIdHeader
89
+ ? req.header(opts.trustedSessionIdHeader)?.trim() || undefined
90
+ : undefined;
91
+ const newSessionId = injected ?? randomUUID();
92
+ let workspaceId;
93
+ try {
94
+ workspaceId = resolveWorkspaceId(req, newSessionId);
95
+ }
96
+ catch (err) {
97
+ if (err instanceof WorkspaceAuthError) {
98
+ res.status(401).json({
99
+ jsonrpc: '2.0',
100
+ error: { code: -32002, message: err.message },
101
+ id: null
102
+ });
103
+ return;
104
+ }
105
+ res.status(500).json({
106
+ jsonrpc: '2.0',
107
+ error: { code: -32603, message: 'internal error' },
108
+ id: null
109
+ });
110
+ return;
111
+ }
112
+ let session;
113
+ try {
114
+ session = await sessionMgr.create({
115
+ sessionId: newSessionId,
116
+ workspaceId
117
+ });
118
+ }
119
+ catch (err) {
120
+ if (err instanceof SessionCapExceededError) {
121
+ res
122
+ .status(503)
123
+ .set('Retry-After', '30')
124
+ .json({
125
+ jsonrpc: '2.0',
126
+ error: { code: -32000, message: err.message },
127
+ id: null
128
+ });
129
+ return;
130
+ }
131
+ if (errCode(err) === 'EINVAL') {
132
+ res.status(400).json({
133
+ jsonrpc: '2.0',
134
+ error: {
135
+ code: -32602,
136
+ message: err instanceof Error ? err.message : 'invalid workspaceId'
137
+ },
138
+ id: null
139
+ });
140
+ return;
141
+ }
142
+ res.status(500).json({
143
+ jsonrpc: '2.0',
144
+ error: { code: -32603, message: 'internal error' },
145
+ id: null
146
+ });
147
+ return;
148
+ }
149
+ await session.transport.handleRequest(req, res, req.body);
150
+ return;
151
+ }
152
+ // Subsequent requests must carry a known session id.
153
+ if (!sessionId) {
154
+ res.status(400).json({
155
+ jsonrpc: '2.0',
156
+ error: { code: -32600, message: 'Mcp-Session-Id header required' },
157
+ id: null
158
+ });
159
+ return;
160
+ }
161
+ const session = sessionMgr.get(sessionId);
162
+ if (!session) {
163
+ res.status(404).json({
164
+ jsonrpc: '2.0',
165
+ error: { code: -32001, message: `unknown session: ${sessionId}` },
166
+ id: null
167
+ });
168
+ return;
169
+ }
170
+ sessionMgr.touch(sessionId);
171
+ await session.transport.handleRequest(req, res, req.body);
172
+ };
173
+ if (opts.mountExtras)
174
+ opts.mountExtras(app);
175
+ app.post('/mcp', handle);
176
+ app.get('/mcp', handle);
177
+ app.delete('/mcp', handle);
178
+ app.shutdown = async () => {
179
+ await sessionMgr.destroyAll();
180
+ };
181
+ return app;
182
+ }
183
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,IAA0B,MAAM,MAAM,CAAC;AAC9C,OAAO,OAKN,MAAM,SAAS,CAAC;AACjB,OAAO,EAEL,uBAAuB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AA2EzD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAqC;IAErC,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,UAAU,GAAG,IAAI,cAAc,CAGnC;QACA,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpB,IAAI,CAAC,GAAG;gBACN,MAAM,IAAI,KAAK,CACb,uDAAuD,CACxD,CAAC;YACJ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;gBAC1D,SAAS,EAAE,EAAE;gBACb,WAAW,EAAE,GAAG,CAAC,WAAW;aAC7B,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,uBAAuB,CAAC;gBACrC,MAAM;gBACN,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,KAAK;gBACL,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnD,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,EAAE;gBAC5B,sEAAsE;gBACtE,uEAAuE;gBACvE,sEAAsE;gBACtE,oEAAoE;gBACpE,oEAAoE;gBACpE,iEAAiE;gBACjE,0CAA0C;gBAC1C,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE;oBACvB,KAAK,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBACrC,qEAAqE;oBACvE,CAAC,CAAC,CAAC;gBACL,CAAC;aACF,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,0EAA0E;YAC1E,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO,EAAwB,CAAC;IAC5C,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC;IAE1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,qEAAqE;IACrE,SAAS,OAAO,CAAC,CAAU;QACzB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC;YACvD,CAAC,CAAG,CAAwB,CAAC,IAA2B;YACxD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAClE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAE/C,kEAAkE;QAClE,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB;gBAC1C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;gBAC9D,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,YAAY,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC9C,IAAI,WAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,WAAW,GAAG,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;oBACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACnB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;wBAC7C,EAAE,EAAE,IAAI;qBACT,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE;oBAClD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,OAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC;oBAChC,SAAS,EAAE,YAAY;oBACvB,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;oBAC3C,GAAG;yBACA,MAAM,CAAC,GAAG,CAAC;yBACX,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;yBACxB,IAAI,CAAC;wBACJ,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;wBAC7C,EAAE,EAAE,IAAI;qBACT,CAAC,CAAC;oBACL,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACnB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE;4BACL,IAAI,EAAE,CAAC,KAAK;4BACZ,OAAO,EACL,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;yBAC7D;wBACD,EAAE,EAAE,IAAI;qBACT,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE;oBAClD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,gCAAgC,EAAE;gBAClE,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,oBAAoB,SAAS,EAAE,EAAE;gBACjE,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEF,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE5C,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3B,GAAG,CAAC,QAAQ,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport cors, { type CorsOptions } from 'cors';\nimport express, {\n type Express,\n type Request,\n type RequestHandler,\n type Response\n} from 'express';\nimport {\n type CodesignMcpToolRegistration,\n createCodesignMcpServer\n} from '../server.js';\nimport { SessionCapExceededError, SessionManager } from './session-manager.js';\nimport { WorkspaceAuthError } from './workspace-auth.js';\nimport type { MetricsRecorder } from '../metrics/recorder.js';\n\n/**\n * Per-session state held by the SessionManager: the engine, the MCP server,\n * and the per-session HTTP transport. Every incoming request with this\n * session's id is routed to `transport.handleRequest`.\n */\nexport interface CodesignHttpSession {\n id: string;\n engine: unknown;\n server: ReturnType<typeof createCodesignMcpServer>;\n transport: StreamableHTTPServerTransport;\n dispose?: () => Promise<void>;\n}\n\nexport interface CreateCodesignHttpServerOptions {\n assets: Record<string, string>;\n resourceScheme?: string;\n maxSessions: number;\n idleTimeoutMs: number;\n /**\n * Resolve the front-asserted workspaceId for a new MCP session. Receives the\n * freshly-minted session id (so `session` mode can derive `s/<id>`). May throw\n * WorkspaceAuthError → 401. Default: a fixed \"default\" workspace.\n */\n resolveWorkspaceId?: (req: Request, sessionId: string) => string;\n /**\n * When set, an `initialize` request carrying this (case-insensitive) header uses\n * its value as the MCP session id instead of minting one. The Worker/front\n * mints the id so it can route follow-ups to the same warm instance (spec §3).\n * The front MUST strip any client-supplied value of this header — same trust\n * posture as the workspace header. Absent header → mint as normal.\n */\n trustedSessionIdHeader?: string;\n /** Build everything needed for one session in one go. */\n createSession: (ctx: { sessionId: string; workspaceId: string }) => Promise<{\n engine: unknown;\n tools: CodesignMcpToolRegistration[];\n dispose?: () => Promise<void>;\n }>;\n /** Optional: mount additional routes (viewer router, dashboards) before MCP. */\n mountExtras?: (app: Express) => void;\n /**\n * Optional metrics recorder, DI'd into every session's MCP server so tool\n * calls are timed at the single dispatch chokepoint. Absent → no timing.\n */\n metrics?: MetricsRecorder;\n /** Build identity reported as `serverInfo.version`. Default `'dev'`. */\n buildId?: string;\n /** Optional auth middleware — runs before MCP routing. Default: no-op. */\n auth?: RequestHandler;\n /** Optional CORS options. Default: disabled. */\n cors?: CorsOptions | false;\n}\n\n/**\n * Express app exposing MCP over Streamable HTTP at /mcp. Stateful sessions:\n * each MCP `initialize` call spawns a fresh session (engine + server +\n * transport); follow-up requests carry `Mcp-Session-Id` to route back. The\n * underlying SessionManager enforces idle eviction and a session cap.\n *\n * The returned object exposes:\n * .listen / .use / etc. — Express's surface (composes into larger apps)\n * .sessions — the SessionManager (testing + ops insight)\n * .shutdown() — destroy every active session, dispose engines\n */\nexport interface CodesignHttpServer extends Express {\n sessions: SessionManager<\n CodesignHttpSession,\n { sessionId: string; workspaceId: string }\n >;\n shutdown(): Promise<void>;\n}\n\nexport async function createCodesignHttpServer(\n opts: CreateCodesignHttpServerOptions\n): Promise<CodesignHttpServer> {\n const resolveWorkspaceId = opts.resolveWorkspaceId ?? (() => 'default');\n\n const sessionMgr = new SessionManager<\n CodesignHttpSession,\n { sessionId: string; workspaceId: string }\n >({\n maxSessions: opts.maxSessions,\n idleTimeoutMs: opts.idleTimeoutMs,\n create: async (ctx) => {\n if (!ctx)\n throw new Error(\n 'createCodesignHttpServer: session context is required'\n );\n const id = ctx.sessionId;\n const { engine, tools, dispose } = await opts.createSession({\n sessionId: id,\n workspaceId: ctx.workspaceId\n });\n const server = createCodesignMcpServer({\n engine,\n assets: opts.assets,\n resourceScheme: opts.resourceScheme,\n tools,\n ...(opts.buildId ? { buildId: opts.buildId } : {}),\n ...(opts.metrics ? { metrics: opts.metrics } : {})\n });\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => id,\n // A client `DELETE /mcp` (graceful termination) fires this before the\n // transport closes itself. Bridge it to the SessionManager so the slot\n // and its engine are reclaimed immediately instead of squatting until\n // idle eviction. Only fires on the DELETE path — not from transport\n // `close()` during `destroy` — so there is no re-entrancy: `delete`\n // removes the map entry first, then runs `destroy` (a redundant,\n // idempotent second `transport.close()`).\n onsessionclosed: (sid) => {\n void sessionMgr.delete(sid).catch(() => {\n // Already gone (idle-evicted, or a duplicate close) — nothing to do.\n });\n }\n });\n await server.connect(transport);\n return { id, engine, server, transport, dispose };\n },\n destroy: async (s) => {\n try {\n await s.transport.close();\n } catch {\n // ignore — best-effort\n }\n try {\n await s.server.close();\n } catch {\n // ignore\n }\n // Call the session's dispose callback if provided (e.g. engine teardown).\n try {\n await s.dispose?.();\n } catch {\n // ignore\n }\n }\n });\n\n const app = express() as CodesignHttpServer;\n app.sessions = sessionMgr;\n\n if (opts.cors !== false) {\n app.use(cors(opts.cors));\n }\n if (opts.auth) {\n app.use(opts.auth);\n }\n app.use(express.json({ limit: '16mb' }));\n\n /** Narrow `code` out of an unknown thrown value without `as any`. */\n function errCode(e: unknown): string | undefined {\n return typeof e === 'object' && e !== null && 'code' in e\n ? ((e as { code?: unknown }).code as string | undefined)\n : undefined;\n }\n\n const handle = async (req: Request, res: Response): Promise<void> => {\n const sessionId = req.header('mcp-session-id');\n\n // Initialization (POST without session id) → spawn a new session.\n if (req.method === 'POST' && !sessionId) {\n const injected = opts.trustedSessionIdHeader\n ? req.header(opts.trustedSessionIdHeader)?.trim() || undefined\n : undefined;\n const newSessionId = injected ?? randomUUID();\n let workspaceId: string;\n try {\n workspaceId = resolveWorkspaceId(req, newSessionId);\n } catch (err) {\n if (err instanceof WorkspaceAuthError) {\n res.status(401).json({\n jsonrpc: '2.0',\n error: { code: -32002, message: err.message },\n id: null\n });\n return;\n }\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'internal error' },\n id: null\n });\n return;\n }\n let session: CodesignHttpSession;\n try {\n session = await sessionMgr.create({\n sessionId: newSessionId,\n workspaceId\n });\n } catch (err) {\n if (err instanceof SessionCapExceededError) {\n res\n .status(503)\n .set('Retry-After', '30')\n .json({\n jsonrpc: '2.0',\n error: { code: -32000, message: err.message },\n id: null\n });\n return;\n }\n if (errCode(err) === 'EINVAL') {\n res.status(400).json({\n jsonrpc: '2.0',\n error: {\n code: -32602,\n message:\n err instanceof Error ? err.message : 'invalid workspaceId'\n },\n id: null\n });\n return;\n }\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'internal error' },\n id: null\n });\n return;\n }\n await session.transport.handleRequest(req, res, req.body);\n return;\n }\n\n // Subsequent requests must carry a known session id.\n if (!sessionId) {\n res.status(400).json({\n jsonrpc: '2.0',\n error: { code: -32600, message: 'Mcp-Session-Id header required' },\n id: null\n });\n return;\n }\n const session = sessionMgr.get(sessionId);\n if (!session) {\n res.status(404).json({\n jsonrpc: '2.0',\n error: { code: -32001, message: `unknown session: ${sessionId}` },\n id: null\n });\n return;\n }\n sessionMgr.touch(sessionId);\n await session.transport.handleRequest(req, res, req.body);\n };\n\n if (opts.mountExtras) opts.mountExtras(app);\n\n app.post('/mcp', handle);\n app.get('/mcp', handle);\n app.delete('/mcp', handle);\n\n app.shutdown = async () => {\n await sessionMgr.destroyAll();\n };\n\n return app;\n}\n"]}
@@ -0,0 +1,42 @@
1
+ export declare class SessionCapExceededError extends Error {
2
+ readonly maxSessions: number;
3
+ constructor(maxSessions: number);
4
+ }
5
+ export declare class SessionNotFoundError extends Error {
6
+ readonly id: string;
7
+ constructor(id: string);
8
+ }
9
+ export interface SessionManagerOptions<T, C = void> {
10
+ /** Max concurrent sessions. New `create()` calls throw past this. */
11
+ maxSessions: number;
12
+ /**
13
+ * Sessions that have not been `touch`-ed for this long (ms) become eligible
14
+ * for eviction on the next `evictIdle()` call. Use a periodic timer in the
15
+ * HTTP server to drive eviction (this module does no scheduling itself).
16
+ */
17
+ idleTimeoutMs: number;
18
+ /** Construct a new session — engine bootstrap, transport wiring, etc. */
19
+ create: (ctx?: C) => Promise<T> | T;
20
+ /** Tear down a session — dispose engine, close transport. Idempotent. */
21
+ destroy: (session: T) => Promise<void> | void;
22
+ }
23
+ export interface SessionEntry<T> {
24
+ session: T;
25
+ id: string;
26
+ lastActivityAt: number;
27
+ }
28
+ export declare class SessionManager<T extends {
29
+ id: string;
30
+ }, C = void> {
31
+ private readonly opts;
32
+ private readonly entries;
33
+ constructor(opts: SessionManagerOptions<T, C>);
34
+ get size(): number;
35
+ create(ctx?: C): Promise<T>;
36
+ get(id: string): T | undefined;
37
+ touch(id: string): void;
38
+ evictIdle(): Promise<string[]>;
39
+ delete(id: string): Promise<void>;
40
+ destroyAll(): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/http/session-manager.ts"],"names":[],"mappings":"AAaA,qBAAa,uBAAwB,SAAQ,KAAK;aACpB,WAAW,EAAE,MAAM;gBAAnB,WAAW,EAAE,MAAM;CAIhD;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aACjB,EAAE,EAAE,MAAM;gBAAV,EAAE,EAAE,MAAM;CAIvC;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI;IAChD,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,yEAAyE;IACzE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAAG,IAAI;IAGhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAEjC,IAAI,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAajC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI9B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKjB,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAa9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlC"}
@@ -0,0 +1,82 @@
1
+ // SessionManager — pure logic for the HTTP transport.
2
+ //
3
+ // Responsibilities:
4
+ // - Hand out session ids (`create`).
5
+ // - Look up active sessions (`get`).
6
+ // - Bump activity timestamps (`touch`).
7
+ // - Evict idle sessions past `idleTimeoutMs` (`evictIdle`).
8
+ // - Cap concurrent sessions at `maxSessions` (`create` rejects past cap).
9
+ // - Tear down on demand (`delete`, `destroyAll`).
10
+ //
11
+ // Engine + transport + server lifecycle live in caller-supplied `create` /
12
+ // `destroy` callbacks so this file stays decoupled from CE.SDK / express.
13
+ export class SessionCapExceededError extends Error {
14
+ constructor(maxSessions) {
15
+ super(`session cap reached (max=${maxSessions})`);
16
+ this.maxSessions = maxSessions;
17
+ this.name = 'SessionCapExceededError';
18
+ }
19
+ }
20
+ export class SessionNotFoundError extends Error {
21
+ constructor(id) {
22
+ super(`unknown session id: ${id}`);
23
+ this.id = id;
24
+ this.name = 'SessionNotFoundError';
25
+ }
26
+ }
27
+ export class SessionManager {
28
+ constructor(opts) {
29
+ this.opts = opts;
30
+ this.entries = new Map();
31
+ }
32
+ get size() {
33
+ return this.entries.size;
34
+ }
35
+ async create(ctx) {
36
+ if (this.entries.size >= this.opts.maxSessions) {
37
+ throw new SessionCapExceededError(this.opts.maxSessions);
38
+ }
39
+ const session = await this.opts.create(ctx);
40
+ this.entries.set(session.id, {
41
+ session,
42
+ id: session.id,
43
+ lastActivityAt: Date.now()
44
+ });
45
+ return session;
46
+ }
47
+ get(id) {
48
+ return this.entries.get(id)?.session;
49
+ }
50
+ touch(id) {
51
+ const entry = this.entries.get(id);
52
+ if (entry)
53
+ entry.lastActivityAt = Date.now();
54
+ }
55
+ async evictIdle() {
56
+ const cutoff = Date.now() - this.opts.idleTimeoutMs;
57
+ const evicted = [];
58
+ for (const [id, entry] of this.entries) {
59
+ if (entry.lastActivityAt < cutoff) {
60
+ this.entries.delete(id);
61
+ await this.opts.destroy(entry.session);
62
+ evicted.push(id);
63
+ }
64
+ }
65
+ return evicted;
66
+ }
67
+ async delete(id) {
68
+ const entry = this.entries.get(id);
69
+ if (!entry)
70
+ throw new SessionNotFoundError(id);
71
+ this.entries.delete(id);
72
+ await this.opts.destroy(entry.session);
73
+ }
74
+ async destroyAll() {
75
+ const all = Array.from(this.entries.values());
76
+ this.entries.clear();
77
+ for (const entry of all) {
78
+ await this.opts.destroy(entry.session);
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/http/session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// SessionManager — pure logic for the HTTP transport.\n//\n// Responsibilities:\n// - Hand out session ids (`create`).\n// - Look up active sessions (`get`).\n// - Bump activity timestamps (`touch`).\n// - Evict idle sessions past `idleTimeoutMs` (`evictIdle`).\n// - Cap concurrent sessions at `maxSessions` (`create` rejects past cap).\n// - Tear down on demand (`delete`, `destroyAll`).\n//\n// Engine + transport + server lifecycle live in caller-supplied `create` /\n// `destroy` callbacks so this file stays decoupled from CE.SDK / express.\n\nexport class SessionCapExceededError extends Error {\n constructor(public readonly maxSessions: number) {\n super(`session cap reached (max=${maxSessions})`);\n this.name = 'SessionCapExceededError';\n }\n}\n\nexport class SessionNotFoundError extends Error {\n constructor(public readonly id: string) {\n super(`unknown session id: ${id}`);\n this.name = 'SessionNotFoundError';\n }\n}\n\nexport interface SessionManagerOptions<T, C = void> {\n /** Max concurrent sessions. New `create()` calls throw past this. */\n maxSessions: number;\n /**\n * Sessions that have not been `touch`-ed for this long (ms) become eligible\n * for eviction on the next `evictIdle()` call. Use a periodic timer in the\n * HTTP server to drive eviction (this module does no scheduling itself).\n */\n idleTimeoutMs: number;\n /** Construct a new session — engine bootstrap, transport wiring, etc. */\n create: (ctx?: C) => Promise<T> | T;\n /** Tear down a session — dispose engine, close transport. Idempotent. */\n destroy: (session: T) => Promise<void> | void;\n}\n\nexport interface SessionEntry<T> {\n session: T;\n id: string;\n lastActivityAt: number;\n}\n\nexport class SessionManager<T extends { id: string }, C = void> {\n private readonly entries = new Map<string, SessionEntry<T>>();\n\n constructor(private readonly opts: SessionManagerOptions<T, C>) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n async create(ctx?: C): Promise<T> {\n if (this.entries.size >= this.opts.maxSessions) {\n throw new SessionCapExceededError(this.opts.maxSessions);\n }\n const session = await this.opts.create(ctx);\n this.entries.set(session.id, {\n session,\n id: session.id,\n lastActivityAt: Date.now()\n });\n return session;\n }\n\n get(id: string): T | undefined {\n return this.entries.get(id)?.session;\n }\n\n touch(id: string): void {\n const entry = this.entries.get(id);\n if (entry) entry.lastActivityAt = Date.now();\n }\n\n async evictIdle(): Promise<string[]> {\n const cutoff = Date.now() - this.opts.idleTimeoutMs;\n const evicted: string[] = [];\n for (const [id, entry] of this.entries) {\n if (entry.lastActivityAt < cutoff) {\n this.entries.delete(id);\n await this.opts.destroy(entry.session);\n evicted.push(id);\n }\n }\n return evicted;\n }\n\n async delete(id: string): Promise<void> {\n const entry = this.entries.get(id);\n if (!entry) throw new SessionNotFoundError(id);\n this.entries.delete(id);\n await this.opts.destroy(entry.session);\n }\n\n async destroyAll(): Promise<void> {\n const all = Array.from(this.entries.values());\n this.entries.clear();\n for (const entry of all) {\n await this.opts.destroy(entry.session);\n }\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { Request } from 'express';
2
+ import type { ServerConfig } from '../config.js';
3
+ /** Thrown when a required workspace claim is missing — mapped to HTTP 401. */
4
+ export declare class WorkspaceAuthError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export type ResolveWorkspaceId = (req: Request, sessionId: string) => string;
8
+ export declare function makeWorkspaceResolver(cfg: ServerConfig): ResolveWorkspaceId;
9
+ //# sourceMappingURL=workspace-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-auth.d.ts","sourceRoot":"","sources":["../../src/http/workspace-auth.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,8EAA8E;AAC9E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;AAE7E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAwB3E"}
@@ -0,0 +1,29 @@
1
+ /** Thrown when a required workspace claim is missing — mapped to HTTP 401. */
2
+ export class WorkspaceAuthError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'WorkspaceAuthError';
6
+ }
7
+ }
8
+ export function makeWorkspaceResolver(cfg) {
9
+ switch (cfg.auth.mode) {
10
+ case 'single': {
11
+ const id = cfg.auth.fixedWorkspaceId;
12
+ if (!id)
13
+ throw new Error('workspace-auth: single mode requires a fixed workspaceId');
14
+ return () => id;
15
+ }
16
+ case 'session':
17
+ return (_req, sessionId) => `s/${sessionId}`;
18
+ case 'header': {
19
+ const header = cfg.auth.header;
20
+ return (req) => {
21
+ const value = req.header(header);
22
+ if (!value)
23
+ throw new WorkspaceAuthError(`missing trusted workspace header "${header}"`);
24
+ return value;
25
+ };
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=workspace-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-auth.js","sourceRoot":"","sources":["../../src/http/workspace-auth.ts"],"names":[],"mappings":"AAcA,8EAA8E;AAC9E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAID,MAAM,UAAU,qBAAqB,CAAC,GAAiB;IACrD,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACrC,IAAI,CAAC,EAAE;gBACL,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;YACJ,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC;QAClB,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;QAC/C,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,OAAO,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,CAAC,KAAK;oBACR,MAAM,IAAI,kBAAkB,CAC1B,qCAAqC,MAAM,GAAG,CAC/C,CAAC;gBACJ,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["// packages/codesign-mcp/src/http/workspace-auth.ts\n//\n// The auth seam (spec §3, §8.7). The container does NOT verify tokens — it\n// trusts a pre-verified, front-asserted workspaceId and derives storage scope\n// from it. This module turns the configured mode into a pure\n// `resolveWorkspaceId(req, sessionId)` function:\n// - header : trust a front-injected header (the front strips any client value)\n// - session: ephemeral `s/<sessionId>` (no front; the unguessable session id\n// acts as a bearer capability — a private scratchpad)\n// - single : a fixed id (single-tenant on-prem / local dev)\n// The returned id is opaque; ScopedWorkspaceFS sanitises it before use.\nimport type { Request } from 'express';\nimport type { ServerConfig } from '../config.js';\n\n/** Thrown when a required workspace claim is missing — mapped to HTTP 401. */\nexport class WorkspaceAuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WorkspaceAuthError';\n }\n}\n\nexport type ResolveWorkspaceId = (req: Request, sessionId: string) => string;\n\nexport function makeWorkspaceResolver(cfg: ServerConfig): ResolveWorkspaceId {\n switch (cfg.auth.mode) {\n case 'single': {\n const id = cfg.auth.fixedWorkspaceId;\n if (!id)\n throw new Error(\n 'workspace-auth: single mode requires a fixed workspaceId'\n );\n return () => id;\n }\n case 'session':\n return (_req, sessionId) => `s/${sessionId}`;\n case 'header': {\n const header = cfg.auth.header;\n return (req) => {\n const value = req.header(header);\n if (!value)\n throw new WorkspaceAuthError(\n `missing trusted workspace header \"${header}\"`\n );\n return value;\n };\n }\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ export * as engine from './engine/index.js';
2
+ export * as gateway from './gateway/index.js';
3
+ export { createCodesignHttpServer } from './http/server.js';
4
+ export * as revisions from './revisions/index.js';
5
+ export type { CodesignMcpServerOptions, CodesignMcpToolRegistration } from './server.js';
6
+ export { createCodesignMcpServer } from './server.js';
7
+ export { buildDesignToolRegistrations } from './tools/index.js';
8
+ export * as viewer from './viewer/index.js';
9
+ export * as workspace from './workspace/index.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,YAAY,EACV,wBAAwB,EACxB,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // packages/codesign-mcp/src/index.ts
2
+ export * as engine from './engine/index.js';
3
+ export * as gateway from './gateway/index.js';
4
+ export { createCodesignHttpServer } from './http/server.js';
5
+ export * as revisions from './revisions/index.js';
6
+ export { createCodesignMcpServer } from './server.js';
7
+ export { buildDesignToolRegistrations } from './tools/index.js';
8
+ export * as viewer from './viewer/index.js';
9
+ export * as workspace from './workspace/index.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAKlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC","sourcesContent":["// packages/codesign-mcp/src/index.ts\n\nexport * as engine from './engine/index.js';\nexport * as gateway from './gateway/index.js';\nexport { createCodesignHttpServer } from './http/server.js';\nexport * as revisions from './revisions/index.js';\nexport type {\n CodesignMcpServerOptions,\n CodesignMcpToolRegistration\n} from './server.js';\nexport { createCodesignMcpServer } from './server.js';\nexport { buildDesignToolRegistrations } from './tools/index.js';\nexport * as viewer from './viewer/index.js';\nexport * as workspace from './workspace/index.js';\n"]}
@@ -0,0 +1,11 @@
1
+ import type { Express } from 'express';
2
+ import type { MetricsRecorder } from './recorder.js';
3
+ export interface MountMetricsOptions {
4
+ recorder: MetricsRecorder;
5
+ /** The session/RAM cap (ServerConfig.maxEngines) — the gauge denominator. */
6
+ maxSessions: number;
7
+ /** Live active-session count, read at request time. */
8
+ activeSessions: () => number;
9
+ }
10
+ export declare function mountMetricsEndpoints(app: Express, opts: MountMetricsOptions): void;
11
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/metrics/mount.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,EAAE,MAAM,MAAM,CAAC;CAC9B;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,mBAAmB,GACxB,IAAI,CAUN"}
@@ -0,0 +1,13 @@
1
+ import { createDashboardRouter } from '../dashboard/router.js';
2
+ export function mountMetricsEndpoints(app, opts) {
3
+ app.get('/metrics', (_req, res) => {
4
+ res.json({
5
+ ...opts.recorder.snapshot(),
6
+ activeSessions: opts.activeSessions(),
7
+ maxSessions: opts.maxSessions,
8
+ uptimeMs: Math.round(process.uptime() * 1000)
9
+ });
10
+ });
11
+ app.use('/dashboard', createDashboardRouter());
12
+ }
13
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/metrics/mount.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAW/D,MAAM,UAAU,qBAAqB,CACnC,GAAY,EACZ,IAAyB;IAEzB,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChC,GAAG,CAAC,IAAI,CAAC;YACP,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,qBAAqB,EAAE,CAAC,CAAC;AACjD,CAAC","sourcesContent":["// packages/codesign-mcp/src/metrics/mount.ts\n//\n// Mounts the metrics surface — GET /metrics (JSON) + the /dashboard SPA — onto\n// an Express app. Factored out of the HTTP composition root so the route and\n// its merged-snapshot shape are unit-testable without booting a real engine.\n// The route reads server-level facts (active sessions, uptime) LIVE at request\n// time; the recorder owns only the per-tool/memory state.\nimport type { Express } from 'express';\nimport { createDashboardRouter } from '../dashboard/router.js';\nimport type { MetricsRecorder } from './recorder.js';\n\nexport interface MountMetricsOptions {\n recorder: MetricsRecorder;\n /** The session/RAM cap (ServerConfig.maxEngines) — the gauge denominator. */\n maxSessions: number;\n /** Live active-session count, read at request time. */\n activeSessions: () => number;\n}\n\nexport function mountMetricsEndpoints(\n app: Express,\n opts: MountMetricsOptions\n): void {\n app.get('/metrics', (_req, res) => {\n res.json({\n ...opts.recorder.snapshot(),\n activeSessions: opts.activeSessions(),\n maxSessions: opts.maxSessions,\n uptimeMs: Math.round(process.uptime() * 1000)\n });\n });\n app.use('/dashboard', createDashboardRouter());\n}\n"]}