@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.
- package/LICENSE.md +16 -0
- package/README.md +158 -0
- package/assets/docs/api/SKILL.md +49 -0
- package/assets/docs/api/index.d.ts +10518 -0
- package/assets/docs/guide/SKILL.md +142 -0
- package/assets/docs/guide/actions.md +1038 -0
- package/assets/docs/guide/animation/create/base.md +467 -0
- package/assets/docs/guide/animation/create/text.md +453 -0
- package/assets/docs/guide/animation/create.md +558 -0
- package/assets/docs/guide/animation/edit.md +501 -0
- package/assets/docs/guide/animation/overview.md +22 -0
- package/assets/docs/guide/animation/types.md +430 -0
- package/assets/docs/guide/animation.md +23 -0
- package/assets/docs/guide/api/AssetAPI.md +602 -0
- package/assets/docs/guide/api/BlockAPI.md +6152 -0
- package/assets/docs/guide/api/CreativeEngine.md +180 -0
- package/assets/docs/guide/api/EditorAPI.md +1261 -0
- package/assets/docs/guide/api/EventAPI.md +25 -0
- package/assets/docs/guide/api/SceneAPI.md +729 -0
- package/assets/docs/guide/api/VariableAPI.md +59 -0
- package/assets/docs/guide/api/types.md +71 -0
- package/assets/docs/guide/api-reference/overview.md +20 -0
- package/assets/docs/guide/automation/auto-resize.md +412 -0
- package/assets/docs/guide/automation/batch-processing.md +474 -0
- package/assets/docs/guide/automation/data-merge.md +406 -0
- package/assets/docs/guide/automation/design-generation.md +107 -0
- package/assets/docs/guide/automation/overview.md +16 -0
- package/assets/docs/guide/automation.md +24 -0
- package/assets/docs/guide/browser-support.md +38 -0
- package/assets/docs/guide/capabilities.md +18 -0
- package/assets/docs/guide/colors/adjust.md +551 -0
- package/assets/docs/guide/colors/apply.md +349 -0
- package/assets/docs/guide/colors/basics.md +440 -0
- package/assets/docs/guide/colors/conversion.md +504 -0
- package/assets/docs/guide/colors/create-color-palette.md +426 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
- package/assets/docs/guide/colors/for-print/spot.md +751 -0
- package/assets/docs/guide/colors/for-print.md +21 -0
- package/assets/docs/guide/colors/for-screen/p3.md +60 -0
- package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
- package/assets/docs/guide/colors/for-screen.md +21 -0
- package/assets/docs/guide/colors/overview.md +20 -0
- package/assets/docs/guide/colors/replace.md +535 -0
- package/assets/docs/guide/colors.md +28 -0
- package/assets/docs/guide/compatibility.md +27 -0
- package/assets/docs/guide/concepts/architecture.md +99 -0
- package/assets/docs/guide/concepts/assets.md +360 -0
- package/assets/docs/guide/concepts/blocks.md +750 -0
- package/assets/docs/guide/concepts/buffers.md +546 -0
- package/assets/docs/guide/concepts/design-units.md +333 -0
- package/assets/docs/guide/concepts/edit-modes.md +431 -0
- package/assets/docs/guide/concepts/editing-workflow.md +303 -0
- package/assets/docs/guide/concepts/events.md +466 -0
- package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
- package/assets/docs/guide/concepts/pages.md +396 -0
- package/assets/docs/guide/concepts/resources.md +496 -0
- package/assets/docs/guide/concepts/scenes.md +443 -0
- package/assets/docs/guide/concepts/templating.md +194 -0
- package/assets/docs/guide/concepts/terminology.md +296 -0
- package/assets/docs/guide/concepts/undo-and-history.md +461 -0
- package/assets/docs/guide/concepts.md +38 -0
- package/assets/docs/guide/configuration.md +469 -0
- package/assets/docs/guide/conversion/overview.md +22 -0
- package/assets/docs/guide/conversion/to-base64.md +234 -0
- package/assets/docs/guide/conversion/to-pdf.md +616 -0
- package/assets/docs/guide/conversion/to-png.md +290 -0
- package/assets/docs/guide/conversion.md +23 -0
- package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
- package/assets/docs/guide/create-audio/audio/loop.md +370 -0
- package/assets/docs/guide/create-audio/audio.md +336 -0
- package/assets/docs/guide/create-composition/add-background.md +395 -0
- package/assets/docs/guide/create-composition/blend-modes.md +372 -0
- package/assets/docs/guide/create-composition/collage.md +432 -0
- package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
- package/assets/docs/guide/create-composition/layer-management.md +503 -0
- package/assets/docs/guide/create-composition/layout.md +396 -0
- package/assets/docs/guide/create-composition/lock-design.md +362 -0
- package/assets/docs/guide/create-composition/multi-page.md +204 -0
- package/assets/docs/guide/create-composition/overview.md +18 -0
- package/assets/docs/guide/create-composition/programmatic.md +593 -0
- package/assets/docs/guide/create-composition.md +30 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
- package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
- package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
- package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
- package/assets/docs/guide/create-templates/from-scratch.md +558 -0
- package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
- package/assets/docs/guide/create-templates/import.md +244 -0
- package/assets/docs/guide/create-templates/lock.md +325 -0
- package/assets/docs/guide/create-templates/overview.md +16 -0
- package/assets/docs/guide/create-templates.md +32 -0
- package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
- package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
- package/assets/docs/guide/create-video/control.md +285 -0
- package/assets/docs/guide/create-video/limitations.md +396 -0
- package/assets/docs/guide/create-video/overview.md +224 -0
- package/assets/docs/guide/create-video/timeline-editor.md +622 -0
- package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
- package/assets/docs/guide/create-video.md +32 -0
- package/assets/docs/guide/edit-image/add-watermark.md +497 -0
- package/assets/docs/guide/edit-image/overview.md +22 -0
- package/assets/docs/guide/edit-image/remove-bg.md +420 -0
- package/assets/docs/guide/edit-image/replace-colors.md +680 -0
- package/assets/docs/guide/edit-image/transform/crop.md +523 -0
- package/assets/docs/guide/edit-image/transform/move.md +279 -0
- package/assets/docs/guide/edit-image/transform/resize.md +301 -0
- package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
- package/assets/docs/guide/edit-image/transform/scale.md +278 -0
- package/assets/docs/guide/edit-image/transform.md +24 -0
- package/assets/docs/guide/edit-image/vectorize.md +204 -0
- package/assets/docs/guide/edit-image.md +25 -0
- package/assets/docs/guide/edit-video/add-captions.md +589 -0
- package/assets/docs/guide/edit-video/add-watermark.md +429 -0
- package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
- package/assets/docs/guide/edit-video/redaction.md +544 -0
- package/assets/docs/guide/edit-video/split.md +634 -0
- package/assets/docs/guide/edit-video/transform/crop.md +380 -0
- package/assets/docs/guide/edit-video/transform/flip.md +182 -0
- package/assets/docs/guide/edit-video/transform/move.md +413 -0
- package/assets/docs/guide/edit-video/transform/resize.md +534 -0
- package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
- package/assets/docs/guide/edit-video/transform/scale.md +603 -0
- package/assets/docs/guide/edit-video/transform.md +25 -0
- package/assets/docs/guide/edit-video/trim.md +773 -0
- package/assets/docs/guide/engine-interface.md +108 -0
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
- package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
- package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
- package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
- package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
- package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
- package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
- package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
- package/assets/docs/guide/export-save-publish/export.md +36 -0
- package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
- package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
- package/assets/docs/guide/export-save-publish/save.md +340 -0
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
- package/assets/docs/guide/file-format-support.md +34 -0
- package/assets/docs/guide/fills/color.md +678 -0
- package/assets/docs/guide/fills/image.md +539 -0
- package/assets/docs/guide/fills/overview.md +144 -0
- package/assets/docs/guide/fills/video.md +641 -0
- package/assets/docs/guide/fills.md +24 -0
- package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
- package/assets/docs/guide/filters-and-effects/blur.md +382 -0
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
- package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
- package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
- package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
- package/assets/docs/guide/filters-and-effects/overview.md +22 -0
- package/assets/docs/guide/filters-and-effects/support.md +623 -0
- package/assets/docs/guide/filters-and-effects.md +28 -0
- package/assets/docs/guide/get-started/agent-skills.md +119 -0
- package/assets/docs/guide/get-started/build-with-ai.md +45 -0
- package/assets/docs/guide/get-started/mcp-server.md +119 -0
- package/assets/docs/guide/get-started/overview.md +28 -0
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
- package/assets/docs/guide/grid-and-rulers.md +222 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
- package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
- package/assets/docs/guide/guides.md +49 -0
- package/assets/docs/guide/import-media/asset-library.md +23 -0
- package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
- package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
- package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
- package/assets/docs/guide/import-media/concepts.md +173 -0
- package/assets/docs/guide/import-media/content-json-schema.md +615 -0
- package/assets/docs/guide/import-media/default-assets.md +381 -0
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
- package/assets/docs/guide/import-media/file-format-support.md +178 -0
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
- package/assets/docs/guide/import-media/from-local-source.md +20 -0
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
- package/assets/docs/guide/import-media/from-remote-source.md +28 -0
- package/assets/docs/guide/import-media/overview.md +32 -0
- package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
- package/assets/docs/guide/import-media/size-limits.md +20 -0
- package/assets/docs/guide/import-media/source-sets.md +476 -0
- package/assets/docs/guide/import-media.md +32 -0
- package/assets/docs/guide/insert-media/audio.md +291 -0
- package/assets/docs/guide/insert-media/images.md +380 -0
- package/assets/docs/guide/insert-media/position-and-align.md +734 -0
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
- package/assets/docs/guide/insert-media/videos.md +308 -0
- package/assets/docs/guide/insert-media.md +24 -0
- package/assets/docs/guide/key-capabilities.md +24 -0
- package/assets/docs/guide/key-concepts.md +83 -0
- package/assets/docs/guide/licensing.md +45 -0
- package/assets/docs/guide/llms-txt.md +53 -0
- package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
- package/assets/docs/guide/open-the-editor/from-image.md +205 -0
- package/assets/docs/guide/open-the-editor/from-template.md +189 -0
- package/assets/docs/guide/open-the-editor/from-video.md +274 -0
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
- package/assets/docs/guide/open-the-editor/import-design.md +481 -0
- package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
- package/assets/docs/guide/open-the-editor/overview.md +20 -0
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
- package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
- package/assets/docs/guide/open-the-editor.md +29 -0
- package/assets/docs/guide/outlines/overview.md +14 -0
- package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
- package/assets/docs/guide/outlines/strokes.md +292 -0
- package/assets/docs/guide/outlines.md +22 -0
- package/assets/docs/guide/overview.md +22 -0
- package/assets/docs/guide/performance.md +217 -0
- package/assets/docs/guide/plugins/asset-sources.md +553 -0
- package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
- package/assets/docs/guide/plugins.md +36 -0
- package/assets/docs/guide/rules/asset-handling.md +180 -0
- package/assets/docs/guide/rules/common-pitfalls.md +272 -0
- package/assets/docs/guide/rules/content-fill-mode.md +29 -0
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
- package/assets/docs/guide/rules/lock-content.md +478 -0
- package/assets/docs/guide/rules/moderate-content.md +761 -0
- package/assets/docs/guide/rules/overview.md +514 -0
- package/assets/docs/guide/rules/silent-init-errors.md +137 -0
- package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
- package/assets/docs/guide/rules.md +23 -0
- package/assets/docs/guide/security.md +199 -0
- package/assets/docs/guide/serve-assets.md +332 -0
- package/assets/docs/guide/settings.md +199 -0
- package/assets/docs/guide/shapes.md +23 -0
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
- package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
- package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
- package/assets/docs/guide/starterkits/ai-editor.md +749 -0
- package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
- package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
- package/assets/docs/guide/starterkits/assets.md +27 -0
- package/assets/docs/guide/starterkits/auto-resize.md +586 -0
- package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
- package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
- package/assets/docs/guide/starterkits/content-moderation.md +863 -0
- package/assets/docs/guide/starterkits/creative-automation.md +28 -0
- package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
- package/assets/docs/guide/starterkits/customization.md +29 -0
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
- package/assets/docs/guide/starterkits/data-merge.md +850 -0
- package/assets/docs/guide/starterkits/design-editor.md +698 -0
- package/assets/docs/guide/starterkits/design-generation.md +719 -0
- package/assets/docs/guide/starterkits/design-validation.md +808 -0
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
- package/assets/docs/guide/starterkits/export-options.md +724 -0
- package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
- package/assets/docs/guide/starterkits/extensibility.md +28 -0
- package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
- package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
- package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
- package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
- package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
- package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
- package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
- package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
- package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
- package/assets/docs/guide/starterkits/photo-editor.md +755 -0
- package/assets/docs/guide/starterkits/photo-ui.md +186 -0
- package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
- package/assets/docs/guide/starterkits/placeholders.md +678 -0
- package/assets/docs/guide/starterkits/player.md +405 -0
- package/assets/docs/guide/starterkits/plugins.md +25 -0
- package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
- package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
- package/assets/docs/guide/starterkits/product-editor.md +773 -0
- package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
- package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
- package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
- package/assets/docs/guide/starterkits/start-with-image.md +684 -0
- package/assets/docs/guide/starterkits/start-with-video.md +651 -0
- package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
- package/assets/docs/guide/starterkits/templating.md +23 -0
- package/assets/docs/guide/starterkits/theming.md +662 -0
- package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
- package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
- package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
- package/assets/docs/guide/starterkits/version-history.md +745 -0
- package/assets/docs/guide/starterkits/video-animations.md +853 -0
- package/assets/docs/guide/starterkits/video-captions.md +884 -0
- package/assets/docs/guide/starterkits/video-editing.md +25 -0
- package/assets/docs/guide/starterkits/video-editor.md +696 -0
- package/assets/docs/guide/starterkits/video-export-options.md +676 -0
- package/assets/docs/guide/starterkits/viewer.md +400 -0
- package/assets/docs/guide/starterkits.md +41 -0
- package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
- package/assets/docs/guide/stickers.md +21 -0
- package/assets/docs/guide/text/add.md +641 -0
- package/assets/docs/guide/text/adjust-spacing.md +288 -0
- package/assets/docs/guide/text/auto-size.md +404 -0
- package/assets/docs/guide/text/custom-fonts.md +401 -0
- package/assets/docs/guide/text/decorations.md +330 -0
- package/assets/docs/guide/text/edit.md +458 -0
- package/assets/docs/guide/text/effects.md +244 -0
- package/assets/docs/guide/text/emojis.md +310 -0
- package/assets/docs/guide/text/enumerations.md +258 -0
- package/assets/docs/guide/text/language-support.md +604 -0
- package/assets/docs/guide/text/overview.md +14 -0
- package/assets/docs/guide/text/styling.md +390 -0
- package/assets/docs/guide/text/text-designs.md +834 -0
- package/assets/docs/guide/text.md +33 -0
- package/assets/docs/guide/to-v1-10.md +131 -0
- package/assets/docs/guide/to-v1-13.md +165 -0
- package/assets/docs/guide/to-v1-19.md +315 -0
- package/assets/docs/guide/to-v1-32.md +110 -0
- package/assets/docs/guide/to-v1-69.md +468 -0
- package/assets/docs/guide/to-v1-72.md +193 -0
- package/assets/docs/guide/upgrade.md +25 -0
- package/assets/docs/guide/use-templates/apply-template.md +279 -0
- package/assets/docs/guide/use-templates/generate.md +405 -0
- package/assets/docs/guide/use-templates/library.md +450 -0
- package/assets/docs/guide/use-templates/overview.md +20 -0
- package/assets/docs/guide/use-templates/programmatic.md +482 -0
- package/assets/docs/guide/use-templates/replace-content.md +399 -0
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
- package/assets/docs/guide/user-interface/ai-integration.md +30 -0
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
- package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
- package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
- package/assets/docs/guide/user-interface/appearance.md +23 -0
- package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
- package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
- package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
- package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
- package/assets/docs/guide/user-interface/customization/dock.md +399 -0
- package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
- package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
- package/assets/docs/guide/user-interface/customization/panel.md +605 -0
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
- package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
- package/assets/docs/guide/user-interface/customization/reference.md +12 -0
- package/assets/docs/guide/user-interface/customization.md +39 -0
- package/assets/docs/guide/user-interface/localization.md +633 -0
- package/assets/docs/guide/user-interface/overview.md +167 -0
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
- package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
- package/assets/docs/guide/user-interface.md +25 -0
- package/assets/docs/guide/what-is-cesdk.md +319 -0
- package/assets/docs/handbook/SKILL.md +521 -0
- package/assets/prompts/evals-assetGenerate.md +12 -0
- package/assets/prompts/evals-brutalistCore.md +34 -0
- package/assets/prompts/evals-danskCatalogue.md +31 -0
- package/assets/prompts/evals-exportRoundTrip.md +12 -0
- package/assets/prompts/evals-inspectPriorCode.md +16 -0
- package/assets/prompts/evals-listProjectFiles.md +6 -0
- package/assets/prompts/evals-readAndExplainScript.md +6 -0
- package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
- package/assets/prompts/evals-rewindRecovery.md +10 -0
- package/assets/prompts/evals-searchAcrossFiles.md +6 -0
- package/assets/prompts/evals-weddingCard.md +20 -0
- package/assets/prompts/explain.md +6 -0
- package/assets/prompts/review.md +6 -0
- package/dist/assets/inline.generated.d.ts +2 -0
- package/dist/assets/inline.generated.d.ts.map +1 -0
- package/dist/assets/inline.generated.js +413 -0
- package/dist/assets/inline.generated.js.map +1 -0
- package/dist/assets/load-browser.d.ts +8 -0
- package/dist/assets/load-browser.d.ts.map +1 -0
- package/dist/assets/load-browser.js +11 -0
- package/dist/assets/load-browser.js.map +1 -0
- package/dist/assets/load-node.d.ts +8 -0
- package/dist/assets/load-node.d.ts.map +1 -0
- package/dist/assets/load-node.js +11 -0
- package/dist/assets/load-node.js.map +1 -0
- package/dist/cli/http.d.ts +2 -0
- package/dist/cli/http.d.ts.map +1 -0
- package/dist/cli/http.js +231 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/redirect-console.d.ts +10 -0
- package/dist/cli/redirect-console.d.ts.map +1 -0
- package/dist/cli/redirect-console.js +18 -0
- package/dist/cli/redirect-console.js.map +1 -0
- package/dist/cli/resolve-license.d.ts +2 -0
- package/dist/cli/resolve-license.d.ts.map +1 -0
- package/dist/cli/resolve-license.js +13 -0
- package/dist/cli/resolve-license.js.map +1 -0
- package/dist/cli/stdio.d.ts +2 -0
- package/dist/cli/stdio.d.ts.map +1 -0
- package/dist/cli/stdio.js +124 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/trial-license.generated.d.ts +2 -0
- package/dist/cli/trial-license.generated.d.ts.map +1 -0
- package/dist/cli/trial-license.generated.js +4 -0
- package/dist/cli/trial-license.generated.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/cross-ref.d.ts +2 -0
- package/dist/cross-ref.d.ts.map +1 -0
- package/dist/cross-ref.js +31 -0
- package/dist/cross-ref.js.map +1 -0
- package/dist/dashboard/router.d.ts +3 -0
- package/dist/dashboard/router.d.ts.map +1 -0
- package/dist/dashboard/router.js +19 -0
- package/dist/dashboard/router.js.map +1 -0
- package/dist/dashboard/spa-assets.generated.d.ts +2 -0
- package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
- package/dist/dashboard/spa-assets.generated.js +220 -0
- package/dist/dashboard/spa-assets.generated.js.map +1 -0
- package/dist/engine/asset-sources.d.ts +17 -0
- package/dist/engine/asset-sources.d.ts.map +1 -0
- package/dist/engine/asset-sources.js +75 -0
- package/dist/engine/asset-sources.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +10 -0
- package/dist/engine/cesdk-adapter.d.ts.map +1 -0
- package/dist/engine/cesdk-adapter.js +19 -0
- package/dist/engine/cesdk-adapter.js.map +1 -0
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +3 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/mutex.d.ts +5 -0
- package/dist/engine/mutex.d.ts.map +1 -0
- package/dist/engine/mutex.js +42 -0
- package/dist/engine/mutex.js.map +1 -0
- package/dist/engine/session.d.ts +50 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/engine/session.js +95 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/uri-resolver.d.ts +14 -0
- package/dist/engine/uri-resolver.d.ts.map +1 -0
- package/dist/engine/uri-resolver.js +12 -0
- package/dist/engine/uri-resolver.js.map +1 -0
- package/dist/frontmatter.d.ts +15 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +46 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gateway/hosted-stub.d.ts +6 -0
- package/dist/gateway/hosted-stub.d.ts.map +1 -0
- package/dist/gateway/hosted-stub.js +11 -0
- package/dist/gateway/hosted-stub.js.map +1 -0
- package/dist/gateway/index.d.ts +4 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +4 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/local.d.ts +14 -0
- package/dist/gateway/local.d.ts.map +1 -0
- package/dist/gateway/local.js +41 -0
- package/dist/gateway/local.js.map +1 -0
- package/dist/gateway/types.d.ts +24 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +7 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/http/server.d.ts +80 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +183 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/session-manager.d.ts +42 -0
- package/dist/http/session-manager.d.ts.map +1 -0
- package/dist/http/session-manager.js +82 -0
- package/dist/http/session-manager.js.map +1 -0
- package/dist/http/workspace-auth.d.ts +9 -0
- package/dist/http/workspace-auth.d.ts.map +1 -0
- package/dist/http/workspace-auth.js +29 -0
- package/dist/http/workspace-auth.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/mount.d.ts +11 -0
- package/dist/metrics/mount.d.ts.map +1 -0
- package/dist/metrics/mount.js +13 -0
- package/dist/metrics/mount.js.map +1 -0
- package/dist/metrics/recorder.d.ts +55 -0
- package/dist/metrics/recorder.d.ts.map +1 -0
- package/dist/metrics/recorder.js +97 -0
- package/dist/metrics/recorder.js.map +1 -0
- package/dist/revisions/hash.d.ts +7 -0
- package/dist/revisions/hash.d.ts.map +1 -0
- package/dist/revisions/hash.js +24 -0
- package/dist/revisions/hash.js.map +1 -0
- package/dist/revisions/index.d.ts +4 -0
- package/dist/revisions/index.d.ts.map +1 -0
- package/dist/revisions/index.js +4 -0
- package/dist/revisions/index.js.map +1 -0
- package/dist/revisions/store.d.ts +69 -0
- package/dist/revisions/store.d.ts.map +1 -0
- package/dist/revisions/store.js +196 -0
- package/dist/revisions/store.js.map +1 -0
- package/dist/revisions/types.d.ts +39 -0
- package/dist/revisions/types.d.ts.map +1 -0
- package/dist/revisions/types.js +2 -0
- package/dist/revisions/types.js.map +1 -0
- package/dist/server.d.ts +51 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/skill-tools.d.ts +3 -0
- package/dist/skill-tools.d.ts.map +1 -0
- package/dist/skill-tools.js +105 -0
- package/dist/skill-tools.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
- package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +47 -0
- package/dist/test/test/cli/dispatcher.test.js.map +1 -0
- package/dist/test/test/cross-ref.test.d.ts +2 -0
- package/dist/test/test/cross-ref.test.d.ts.map +1 -0
- package/dist/test/test/cross-ref.test.js +39 -0
- package/dist/test/test/cross-ref.test.js.map +1 -0
- package/dist/test/test/engine/session.test.d.ts +2 -0
- package/dist/test/test/engine/session.test.d.ts.map +1 -0
- package/dist/test/test/engine/session.test.js +144 -0
- package/dist/test/test/engine/session.test.js.map +1 -0
- package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
- package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
- package/dist/test/test/engine/uri-resolver.test.js +38 -0
- package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
- package/dist/test/test/frontmatter.test.d.ts +2 -0
- package/dist/test/test/frontmatter.test.d.ts.map +1 -0
- package/dist/test/test/frontmatter.test.js +55 -0
- package/dist/test/test/frontmatter.test.js.map +1 -0
- package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
- package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
- package/dist/test/test/gateway/hosted-stub.test.js +11 -0
- package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
- package/dist/test/test/gateway/local.test.d.ts +2 -0
- package/dist/test/test/gateway/local.test.d.ts.map +1 -0
- package/dist/test/test/gateway/local.test.js +29 -0
- package/dist/test/test/gateway/local.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.d.ts +2 -0
- package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
- package/dist/test/test/handbook-contract.test.js +71 -0
- package/dist/test/test/handbook-contract.test.js.map +1 -0
- package/dist/test/test/http/server.test.d.ts +2 -0
- package/dist/test/test/http/server.test.d.ts.map +1 -0
- package/dist/test/test/http/server.test.js +245 -0
- package/dist/test/test/http/server.test.js.map +1 -0
- package/dist/test/test/http/session-manager.test.d.ts +2 -0
- package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
- package/dist/test/test/http/session-manager.test.js +83 -0
- package/dist/test/test/http/session-manager.test.js.map +1 -0
- package/dist/test/test/revisions/hash.test.d.ts +2 -0
- package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
- package/dist/test/test/revisions/hash.test.js +33 -0
- package/dist/test/test/revisions/hash.test.js.map +1 -0
- package/dist/test/test/revisions/store.test.d.ts +2 -0
- package/dist/test/test/revisions/store.test.d.ts.map +1 -0
- package/dist/test/test/revisions/store.test.js +245 -0
- package/dist/test/test/revisions/store.test.js.map +1 -0
- package/dist/test/test/server.test.d.ts +2 -0
- package/dist/test/test/server.test.d.ts.map +1 -0
- package/dist/test/test/server.test.js +157 -0
- package/dist/test/test/server.test.js.map +1 -0
- package/dist/test/test/skill-tools.test.d.ts +2 -0
- package/dist/test/test/skill-tools.test.d.ts.map +1 -0
- package/dist/test/test/skill-tools.test.js +84 -0
- package/dist/test/test/skill-tools.test.js.map +1 -0
- package/dist/test/test/smoke.test.d.ts +2 -0
- package/dist/test/test/smoke.test.d.ts.map +1 -0
- package/dist/test/test/smoke.test.js +8 -0
- package/dist/test/test/smoke.test.js.map +1 -0
- package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
- package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
- package/dist/test/test/tools/asset-generate.test.js +66 -0
- package/dist/test/test/tools/asset-generate.test.js.map +1 -0
- package/dist/test/test/tools/edit.test.d.ts +2 -0
- package/dist/test/test/tools/edit.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.test.js +205 -0
- package/dist/test/test/tools/edit.test.js.map +1 -0
- package/dist/test/test/tools/export.test.d.ts +2 -0
- package/dist/test/test/tools/export.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.test.js +144 -0
- package/dist/test/test/tools/export.test.js.map +1 -0
- package/dist/test/test/tools/history.test.d.ts +2 -0
- package/dist/test/test/tools/history.test.d.ts.map +1 -0
- package/dist/test/test/tools/history.test.js +29 -0
- package/dist/test/test/tools/history.test.js.map +1 -0
- package/dist/test/test/tools/inspect.test.d.ts +2 -0
- package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
- package/dist/test/test/tools/inspect.test.js +62 -0
- package/dist/test/test/tools/inspect.test.js.map +1 -0
- package/dist/test/test/tools/list.test.d.ts +2 -0
- package/dist/test/test/tools/list.test.d.ts.map +1 -0
- package/dist/test/test/tools/list.test.js +23 -0
- package/dist/test/test/tools/list.test.js.map +1 -0
- package/dist/test/test/tools/open-editor.test.d.ts +2 -0
- package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
- package/dist/test/test/tools/open-editor.test.js +53 -0
- package/dist/test/test/tools/open-editor.test.js.map +1 -0
- package/dist/test/test/tools/preview.test.d.ts +2 -0
- package/dist/test/test/tools/preview.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.test.js +73 -0
- package/dist/test/test/tools/preview.test.js.map +1 -0
- package/dist/test/test/tools/rename.test.d.ts +2 -0
- package/dist/test/test/tools/rename.test.d.ts.map +1 -0
- package/dist/test/test/tools/rename.test.js +17 -0
- package/dist/test/test/tools/rename.test.js.map +1 -0
- package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
- package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
- package/dist/test/test/viewer/broadcaster.test.js +53 -0
- package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
- package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
- package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/resource-route.test.js +70 -0
- package/dist/test/test/viewer/resource-route.test.js.map +1 -0
- package/dist/test/test/viewer/router.test.d.ts +2 -0
- package/dist/test/test/viewer/router.test.d.ts.map +1 -0
- package/dist/test/test/viewer/router.test.js +171 -0
- package/dist/test/test/viewer/router.test.js.map +1 -0
- package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
- package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
- package/dist/test/test/viewer/url-builder.test.js +31 -0
- package/dist/test/test/viewer/url-builder.test.js.map +1 -0
- package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
- package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
- package/dist/test/test/workspace/hosted-stub.test.js +30 -0
- package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
- package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
- package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
- package/dist/test/test/workspace/in-memory.test.js +4 -0
- package/dist/test/test/workspace/in-memory.test.js.map +1 -0
- package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
- package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
- package/dist/test/test/workspace/node-fs.test.js +20 -0
- package/dist/test/test/workspace/node-fs.test.js.map +1 -0
- package/dist/test/test/workspace/shared-contract.d.ts +3 -0
- package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
- package/dist/test/test/workspace/shared-contract.js +92 -0
- package/dist/test/test/workspace/shared-contract.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -0
- package/dist/test/vitest.config.d.ts +3 -0
- package/dist/test/vitest.config.d.ts.map +1 -0
- package/dist/test/vitest.config.js +8 -0
- package/dist/test/vitest.config.js.map +1 -0
- package/dist/tools/asset-generate.d.ts +12 -0
- package/dist/tools/asset-generate.d.ts.map +1 -0
- package/dist/tools/asset-generate.js +112 -0
- package/dist/tools/asset-generate.js.map +1 -0
- package/dist/tools/asset-search.d.ts +10 -0
- package/dist/tools/asset-search.d.ts.map +1 -0
- package/dist/tools/asset-search.js +120 -0
- package/dist/tools/asset-search.js.map +1 -0
- package/dist/tools/content-types.d.ts +11 -0
- package/dist/tools/content-types.d.ts.map +1 -0
- package/dist/tools/content-types.js +2 -0
- package/dist/tools/content-types.js.map +1 -0
- package/dist/tools/edit.d.ts +29 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +165 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/engine.d.ts +31 -0
- package/dist/tools/engine.d.ts.map +1 -0
- package/dist/tools/engine.js +59 -0
- package/dist/tools/engine.js.map +1 -0
- package/dist/tools/export.d.ts +19 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +179 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/history.d.ts +7 -0
- package/dist/tools/history.d.ts.map +1 -0
- package/dist/tools/history.js +54 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/index.d.ts +35 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +72 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspect.d.ts +7 -0
- package/dist/tools/inspect.d.ts.map +1 -0
- package/dist/tools/inspect.js +80 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/list.d.ts +7 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +18 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/metrics.d.ts +11 -0
- package/dist/tools/metrics.d.ts.map +1 -0
- package/dist/tools/metrics.js +28 -0
- package/dist/tools/metrics.js.map +1 -0
- package/dist/tools/open-editor.d.ts +10 -0
- package/dist/tools/open-editor.d.ts.map +1 -0
- package/dist/tools/open-editor.js +62 -0
- package/dist/tools/open-editor.js.map +1 -0
- package/dist/tools/preview.d.ts +12 -0
- package/dist/tools/preview.d.ts.map +1 -0
- package/dist/tools/preview.js +104 -0
- package/dist/tools/preview.js.map +1 -0
- package/dist/tools/rename.d.ts +7 -0
- package/dist/tools/rename.d.ts.map +1 -0
- package/dist/tools/rename.js +39 -0
- package/dist/tools/rename.js.map +1 -0
- package/dist/tools/result.d.ts +12 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js +55 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/save.d.ts +19 -0
- package/dist/tools/save.d.ts.map +1 -0
- package/dist/tools/save.js +117 -0
- package/dist/tools/save.js.map +1 -0
- package/dist/viewer/broadcaster.d.ts +13 -0
- package/dist/viewer/broadcaster.d.ts.map +1 -0
- package/dist/viewer/broadcaster.js +44 -0
- package/dist/viewer/broadcaster.js.map +1 -0
- package/dist/viewer/index.d.ts +7 -0
- package/dist/viewer/index.d.ts.map +1 -0
- package/dist/viewer/index.js +7 -0
- package/dist/viewer/index.js.map +1 -0
- package/dist/viewer/listener.d.ts +16 -0
- package/dist/viewer/listener.d.ts.map +1 -0
- package/dist/viewer/listener.js +30 -0
- package/dist/viewer/listener.js.map +1 -0
- package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
- package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
- package/dist/viewer/presigned-r2-url-builder.js +40 -0
- package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
- package/dist/viewer/resource-route.d.ts +9 -0
- package/dist/viewer/resource-route.d.ts.map +1 -0
- package/dist/viewer/resource-route.js +59 -0
- package/dist/viewer/resource-route.js.map +1 -0
- package/dist/viewer/router.d.ts +20 -0
- package/dist/viewer/router.d.ts.map +1 -0
- package/dist/viewer/router.js +142 -0
- package/dist/viewer/router.js.map +1 -0
- package/dist/viewer/session-mount.d.ts +10 -0
- package/dist/viewer/session-mount.d.ts.map +1 -0
- package/dist/viewer/session-mount.js +24 -0
- package/dist/viewer/session-mount.js.map +1 -0
- package/dist/viewer/spa-assets.generated.d.ts +2 -0
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
- package/dist/viewer/spa-assets.generated.js +989 -0
- package/dist/viewer/spa-assets.generated.js.map +1 -0
- package/dist/viewer/url-builder.d.ts +48 -0
- package/dist/viewer/url-builder.d.ts.map +1 -0
- package/dist/viewer/url-builder.js +38 -0
- package/dist/viewer/url-builder.js.map +1 -0
- package/dist/workspace/hosted-stub.d.ts +28 -0
- package/dist/workspace/hosted-stub.d.ts.map +1 -0
- package/dist/workspace/hosted-stub.js +44 -0
- package/dist/workspace/hosted-stub.js.map +1 -0
- package/dist/workspace/in-memory.d.ts +23 -0
- package/dist/workspace/in-memory.d.ts.map +1 -0
- package/dist/workspace/in-memory.js +161 -0
- package/dist/workspace/in-memory.js.map +1 -0
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/node-fs.d.ts +23 -0
- package/dist/workspace/node-fs.d.ts.map +1 -0
- package/dist/workspace/node-fs.js +90 -0
- package/dist/workspace/node-fs.js.map +1 -0
- package/dist/workspace/s3.d.ts +32 -0
- package/dist/workspace/s3.d.ts.map +1 -0
- package/dist/workspace/s3.js +191 -0
- package/dist/workspace/s3.js.map +1 -0
- package/dist/workspace/scoped.d.ts +32 -0
- package/dist/workspace/scoped.d.ts.map +1 -0
- package/dist/workspace/scoped.js +76 -0
- package/dist/workspace/scoped.js.map +1 -0
- package/dist/workspace/types.d.ts +75 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +18 -0
- package/dist/workspace/types.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// packages/codesign-mcp/src/engine/asset-sources.ts
|
|
2
|
+
//
|
|
3
|
+
// Registers CE.SDK's default + demo asset sources on the headless engine so
|
|
4
|
+
// `asset_search` has content to discover. Manifest roots default to the
|
|
5
|
+
// IMG.LY CDN and are overridable via IMGLY_DEFAULT_ASSETS_BASE_URL /
|
|
6
|
+
// IMGLY_DEMO_ASSETS_BASE_URL for self-hosted deployments. Idempotent:
|
|
7
|
+
// skips when the demo image source is already present — ensureHeadlessEngine
|
|
8
|
+
// is a process singleton, and the HTTP transport calls this once per session.
|
|
9
|
+
// Best-effort: a CDN failure logs to stderr and leaves the engine usable.
|
|
10
|
+
// Note: retries after total failure may re-add assets to already-populated
|
|
11
|
+
// default sources (CE.SDK guards duplicate source ids, not duplicate assets);
|
|
12
|
+
// partial failures after ly.img.image has landed are NOT retried.
|
|
13
|
+
// `ly.img.text`'s manifest is not published on the CDN root (404), and the
|
|
14
|
+
// SDK loads all manifests with Promise.all — one 404 rejects the whole call
|
|
15
|
+
// and leaves WHICH sources registered up to fetch timing. Excluding it makes
|
|
16
|
+
// registration deterministic.
|
|
17
|
+
const MISSING_DEFAULT_SOURCES = ['ly.img.text'];
|
|
18
|
+
/** Registered by addDemoAssetSources — its presence means we already ran. */
|
|
19
|
+
const SENTINEL_SOURCE = 'ly.img.image';
|
|
20
|
+
// Concurrent callers (HTTP createSession) share one in-flight registration —
|
|
21
|
+
// the engine is a process singleton, so the guard lives at module level.
|
|
22
|
+
let inFlight;
|
|
23
|
+
export function ensureEngineAssetSources(engine) {
|
|
24
|
+
inFlight ??= registerOnce(engine);
|
|
25
|
+
return inFlight;
|
|
26
|
+
}
|
|
27
|
+
// Manifest roots for the JSON-defined asset sources. The @cesdk/node npm
|
|
28
|
+
// package only bundles the WASM core (no manifests), so without an explicit
|
|
29
|
+
// baseURL both calls resolve against the engine's file:// baseURL and fail.
|
|
30
|
+
// The IMG.LY CDN is the fallback; deployments that self-host their asset
|
|
31
|
+
// manifests override via env. These URLs are server configuration only —
|
|
32
|
+
// agents never see them and must always go through engine.asset/asset_search.
|
|
33
|
+
function defaultAssetsBaseUrl() {
|
|
34
|
+
return (process.env.IMGLY_DEFAULT_ASSETS_BASE_URL ?? 'https://cdn.img.ly/assets/v3');
|
|
35
|
+
}
|
|
36
|
+
function demoAssetsBaseUrl() {
|
|
37
|
+
return (process.env.IMGLY_DEMO_ASSETS_BASE_URL ??
|
|
38
|
+
'https://cdn.img.ly/assets/demo/v3');
|
|
39
|
+
}
|
|
40
|
+
function logSourceFailure(label, err) {
|
|
41
|
+
process.stderr.write(`codesign-mcp: ${label} failed (asset_search will see fewer sources): ${err instanceof Error ? err.message : String(err)}\n`);
|
|
42
|
+
}
|
|
43
|
+
async function registerOnce(engine) {
|
|
44
|
+
if (engine.asset.findAllSources().includes(SENTINEL_SOURCE))
|
|
45
|
+
return;
|
|
46
|
+
// Each call is independent so a failure in one doesn't block the other.
|
|
47
|
+
let anyFailed = false;
|
|
48
|
+
try {
|
|
49
|
+
await engine.addDefaultAssetSources({
|
|
50
|
+
baseURL: defaultAssetsBaseUrl(),
|
|
51
|
+
excludeAssetSourceIds: MISSING_DEFAULT_SOURCES
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
logSourceFailure('addDefaultAssetSources', err);
|
|
56
|
+
anyFailed = true;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await engine.addDemoAssetSources({ baseURL: demoAssetsBaseUrl() });
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
logSourceFailure('addDemoAssetSources', err);
|
|
63
|
+
anyFailed = true;
|
|
64
|
+
}
|
|
65
|
+
// If the sentinel source still isn't present after both attempts, clear
|
|
66
|
+
// the guard so the next call can retry.
|
|
67
|
+
if (anyFailed && !engine.asset.findAllSources().includes(SENTINEL_SOURCE)) {
|
|
68
|
+
inFlight = undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** @internal test-only — resets the module-level in-flight guard. */
|
|
72
|
+
export function resetEngineAssetSourcesForTest() {
|
|
73
|
+
inFlight = undefined;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=asset-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-sources.js","sourceRoot":"","sources":["../../src/engine/asset-sources.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,4EAA4E;AAC5E,wEAAwE;AACxE,qEAAqE;AACrE,sEAAsE;AACtE,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,kEAAkE;AAYlE,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,8BAA8B;AAC9B,MAAM,uBAAuB,GAAG,CAAC,aAAa,CAAC,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,6EAA6E;AAC7E,yEAAyE;AACzE,IAAI,QAAmC,CAAC;AAExC,MAAM,UAAU,wBAAwB,CACtC,MAAyB;IAEzB,QAAQ,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,yEAAyE;AACzE,8EAA8E;AAC9E,SAAS,oBAAoB;IAC3B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,8BAA8B,CAC5E,CAAC;AACJ,CAAC;AACD,SAAS,iBAAiB;IACxB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,mCAAmC,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,GAAY;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iBAAiB,KAAK,kDACpB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,IAAI,CACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAyB;IACnD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO;IAEpE,wEAAwE;IACxE,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,sBAAsB,CAAC;YAClC,OAAO,EAAE,oBAAoB,EAAE;YAC/B,qBAAqB,EAAE,uBAAuB;SAC/C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAChD,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC7C,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,wEAAwE;IACxE,wCAAwC;IACxC,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1E,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,8BAA8B;IAC5C,QAAQ,GAAG,SAAS,CAAC;AACvB,CAAC","sourcesContent":["// packages/codesign-mcp/src/engine/asset-sources.ts\n//\n// Registers CE.SDK's default + demo asset sources on the headless engine so\n// `asset_search` has content to discover. Manifest roots default to the\n// IMG.LY CDN and are overridable via IMGLY_DEFAULT_ASSETS_BASE_URL /\n// IMGLY_DEMO_ASSETS_BASE_URL for self-hosted deployments. Idempotent:\n// skips when the demo image source is already present — ensureHeadlessEngine\n// is a process singleton, and the HTTP transport calls this once per session.\n// Best-effort: a CDN failure logs to stderr and leaves the engine usable.\n// Note: retries after total failure may re-add assets to already-populated\n// default sources (CE.SDK guards duplicate source ids, not duplicate assets);\n// partial failures after ly.img.image has landed are NOT retried.\n\n/** The slice of CreativeEngine this module needs — keeps it testable. */\nexport interface AssetSourceEngine {\n asset: { findAllSources(): string[] };\n addDefaultAssetSources(opts?: {\n baseURL?: string;\n excludeAssetSourceIds?: string[];\n }): Promise<void>;\n addDemoAssetSources(opts?: { baseURL?: string }): Promise<void>;\n}\n\n// `ly.img.text`'s manifest is not published on the CDN root (404), and the\n// SDK loads all manifests with Promise.all — one 404 rejects the whole call\n// and leaves WHICH sources registered up to fetch timing. Excluding it makes\n// registration deterministic.\nconst MISSING_DEFAULT_SOURCES = ['ly.img.text'];\n\n/** Registered by addDemoAssetSources — its presence means we already ran. */\nconst SENTINEL_SOURCE = 'ly.img.image';\n\n// Concurrent callers (HTTP createSession) share one in-flight registration —\n// the engine is a process singleton, so the guard lives at module level.\nlet inFlight: Promise<void> | undefined;\n\nexport function ensureEngineAssetSources(\n engine: AssetSourceEngine\n): Promise<void> {\n inFlight ??= registerOnce(engine);\n return inFlight;\n}\n\n// Manifest roots for the JSON-defined asset sources. The @cesdk/node npm\n// package only bundles the WASM core (no manifests), so without an explicit\n// baseURL both calls resolve against the engine's file:// baseURL and fail.\n// The IMG.LY CDN is the fallback; deployments that self-host their asset\n// manifests override via env. These URLs are server configuration only —\n// agents never see them and must always go through engine.asset/asset_search.\nfunction defaultAssetsBaseUrl(): string {\n return (\n process.env.IMGLY_DEFAULT_ASSETS_BASE_URL ?? 'https://cdn.img.ly/assets/v3'\n );\n}\nfunction demoAssetsBaseUrl(): string {\n return (\n process.env.IMGLY_DEMO_ASSETS_BASE_URL ??\n 'https://cdn.img.ly/assets/demo/v3'\n );\n}\n\nfunction logSourceFailure(label: string, err: unknown): void {\n process.stderr.write(\n `codesign-mcp: ${label} failed (asset_search will see fewer sources): ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n );\n}\n\nasync function registerOnce(engine: AssetSourceEngine): Promise<void> {\n if (engine.asset.findAllSources().includes(SENTINEL_SOURCE)) return;\n\n // Each call is independent so a failure in one doesn't block the other.\n let anyFailed = false;\n try {\n await engine.addDefaultAssetSources({\n baseURL: defaultAssetsBaseUrl(),\n excludeAssetSourceIds: MISSING_DEFAULT_SOURCES\n });\n } catch (err) {\n logSourceFailure('addDefaultAssetSources', err);\n anyFailed = true;\n }\n try {\n await engine.addDemoAssetSources({ baseURL: demoAssetsBaseUrl() });\n } catch (err) {\n logSourceFailure('addDemoAssetSources', err);\n anyFailed = true;\n }\n\n // If the sentinel source still isn't present after both attempts, clear\n // the guard so the next call can retry.\n if (anyFailed && !engine.asset.findAllSources().includes(SENTINEL_SOURCE)) {\n inFlight = undefined;\n }\n}\n\n/** @internal test-only — resets the module-level in-flight guard. */\nexport function resetEngineAssetSourcesForTest(): void {\n inFlight = undefined;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type CreativeEngine from '@cesdk/engine';
|
|
2
|
+
import type { EngineAdapter } from './session.js';
|
|
3
|
+
/**
|
|
4
|
+
* Adapts a `@cesdk/engine` CreativeEngine instance to the EngineSession's
|
|
5
|
+
* generic EngineAdapter shape. One-to-one mapping; the only quirk is `reset`
|
|
6
|
+
* (CE.SDK has no `reset()` — we wipe by creating a new scene via the same
|
|
7
|
+
* patched create path `ensureHeadlessEngine` installed for the design-unit fix).
|
|
8
|
+
*/
|
|
9
|
+
export declare function cesdkAdapter(engine: CreativeEngine): EngineAdapter<CreativeEngine>;
|
|
10
|
+
//# sourceMappingURL=cesdk-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cesdk-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/cesdk-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,GACrB,aAAa,CAAC,cAAc,CAAC,CAW/B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapts a `@cesdk/engine` CreativeEngine instance to the EngineSession's
|
|
3
|
+
* generic EngineAdapter shape. One-to-one mapping; the only quirk is `reset`
|
|
4
|
+
* (CE.SDK has no `reset()` — we wipe by creating a new scene via the same
|
|
5
|
+
* patched create path `ensureHeadlessEngine` installed for the design-unit fix).
|
|
6
|
+
*/
|
|
7
|
+
export function cesdkAdapter(engine) {
|
|
8
|
+
return {
|
|
9
|
+
create: () => engine, // single-engine adapter: always the same instance
|
|
10
|
+
reset: async (eng) => {
|
|
11
|
+
eng.scene.create(); // wipes the active scene; design-unit patch from tools/engine.ts re-applies
|
|
12
|
+
},
|
|
13
|
+
loadFromString: async (eng, scene) => {
|
|
14
|
+
await eng.scene.loadFromString(scene);
|
|
15
|
+
},
|
|
16
|
+
saveToString: async (eng) => eng.scene.saveToString()
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cesdk-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cesdk-adapter.js","sourceRoot":"","sources":["../../src/engine/cesdk-adapter.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAsB;IAEtB,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,kDAAkD;QACxE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACnB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,4EAA4E;QAClG,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACnC,MAAM,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE;KACtD,CAAC;AACJ,CAAC","sourcesContent":["import type CreativeEngine from '@cesdk/engine';\nimport type { EngineAdapter } from './session.js';\n\n/**\n * Adapts a `@cesdk/engine` CreativeEngine instance to the EngineSession's\n * generic EngineAdapter shape. One-to-one mapping; the only quirk is `reset`\n * (CE.SDK has no `reset()` — we wipe by creating a new scene via the same\n * patched create path `ensureHeadlessEngine` installed for the design-unit fix).\n */\nexport function cesdkAdapter(\n engine: CreativeEngine\n): EngineAdapter<CreativeEngine> {\n return {\n create: () => engine, // single-engine adapter: always the same instance\n reset: async (eng) => {\n eng.scene.create(); // wipes the active scene; design-unit patch from tools/engine.ts re-applies\n },\n loadFromString: async (eng, scene) => {\n await eng.scene.loadFromString(scene);\n },\n saveToString: async (eng) => eng.scene.saveToString()\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,KAAK,aAAa,EAClB,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAEL,aAAa,EAGd,MAAM,cAAc,CAAC","sourcesContent":["export { cesdkAdapter } from './cesdk-adapter.js';\nexport {\n type EngineAdapter,\n EngineSession,\n type EngineSessionOptions,\n type EngineSlot\n} from './session.js';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../src/engine/mutex.ts"],"names":[],"mappings":"AAoBA,qBAAa,KAAK;IAIhB,OAAO,CAAC,IAAI,CAAuC;IAEnD,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAgBlD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// A minimal FIFO async mutex.
|
|
2
|
+
//
|
|
3
|
+
// Why this exists: JavaScript is single-threaded, so plain variables never
|
|
4
|
+
// suffer data races — but `await` is a yield point. Any code holding a
|
|
5
|
+
// reference to shared mutable state across an `await` can be interrupted by
|
|
6
|
+
// another in-flight async task that mutates the same state. Our CE.SDK engine
|
|
7
|
+
// is exactly such shared state: the `edit` / `preview` / `export` tools
|
|
8
|
+
// `loadFromString` a revision into the engine, run code against it, then
|
|
9
|
+
// `saveToString` — a sequence of awaits. Two overlapping sessions sharing one
|
|
10
|
+
// engine would interleave at those awaits and serialize the wrong scene.
|
|
11
|
+
//
|
|
12
|
+
// This mutex serializes such critical sections: each `runExclusive(fn)` runs
|
|
13
|
+
// only after every previously-enqueued section has settled, so the engine is
|
|
14
|
+
// loaded → mutated → saved by exactly one caller at a time. There is no timer
|
|
15
|
+
// and no busy-waiting — it is pure promise chaining, so a waiting caller costs
|
|
16
|
+
// nothing but a microtask.
|
|
17
|
+
//
|
|
18
|
+
// Not reentrant: calling runExclusive() from inside a section already holding
|
|
19
|
+
// this mutex would wait for itself and deadlock. Our critical sections never
|
|
20
|
+
// re-enter, so this is fine — but don't nest them.
|
|
21
|
+
export class Mutex {
|
|
22
|
+
constructor() {
|
|
23
|
+
// The tail of the queue. Resolves once the most-recently-enqueued section
|
|
24
|
+
// has settled. Starts already-resolved so the very first caller runs on the
|
|
25
|
+
// next microtask with no extra wait.
|
|
26
|
+
this.tail = Promise.resolve();
|
|
27
|
+
}
|
|
28
|
+
runExclusive(fn) {
|
|
29
|
+
// Chain our section after whatever is queued. We attach `fn` as BOTH the
|
|
30
|
+
// fulfilment and rejection handler of the tail so our section runs no
|
|
31
|
+
// matter how the previous one settled — one throwing section must not
|
|
32
|
+
// wedge the queue. (`fn` ignores the settle value it is handed.)
|
|
33
|
+
const result = this.tail.then(fn, fn);
|
|
34
|
+
// The next caller waits for OUR section to settle. We park a result-
|
|
35
|
+
// swallowing continuation as the new tail so (a) the next section proceeds
|
|
36
|
+
// on either outcome and (b) this internal chain never raises an unhandled
|
|
37
|
+
// rejection. The real value/rejection still propagates through `result`.
|
|
38
|
+
this.tail = result.then(() => undefined, () => undefined);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=mutex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/engine/mutex.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAC5E,8EAA8E;AAC9E,wEAAwE;AACxE,yEAAyE;AACzE,8EAA8E;AAC9E,yEAAyE;AACzE,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,2BAA2B;AAC3B,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,mDAAmD;AACnD,MAAM,OAAO,KAAK;IAAlB;QACE,0EAA0E;QAC1E,4EAA4E;QAC5E,qCAAqC;QAC7B,SAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAkBrD,CAAC;IAhBC,YAAY,CAAI,EAAoB;QAClC,yEAAyE;QACzE,sEAAsE;QACtE,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACtC,qEAAqE;QACrE,2EAA2E;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CACrB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["// A minimal FIFO async mutex.\n//\n// Why this exists: JavaScript is single-threaded, so plain variables never\n// suffer data races — but `await` is a yield point. Any code holding a\n// reference to shared mutable state across an `await` can be interrupted by\n// another in-flight async task that mutates the same state. Our CE.SDK engine\n// is exactly such shared state: the `edit` / `preview` / `export` tools\n// `loadFromString` a revision into the engine, run code against it, then\n// `saveToString` — a sequence of awaits. Two overlapping sessions sharing one\n// engine would interleave at those awaits and serialize the wrong scene.\n//\n// This mutex serializes such critical sections: each `runExclusive(fn)` runs\n// only after every previously-enqueued section has settled, so the engine is\n// loaded → mutated → saved by exactly one caller at a time. There is no timer\n// and no busy-waiting — it is pure promise chaining, so a waiting caller costs\n// nothing but a microtask.\n//\n// Not reentrant: calling runExclusive() from inside a section already holding\n// this mutex would wait for itself and deadlock. Our critical sections never\n// re-enter, so this is fine — but don't nest them.\nexport class Mutex {\n // The tail of the queue. Resolves once the most-recently-enqueued section\n // has settled. Starts already-resolved so the very first caller runs on the\n // next microtask with no extra wait.\n private tail: Promise<unknown> = Promise.resolve();\n\n runExclusive<T>(fn: () => Promise<T>): Promise<T> {\n // Chain our section after whatever is queued. We attach `fn` as BOTH the\n // fulfilment and rejection handler of the tail so our section runs no\n // matter how the previous one settled — one throwing section must not\n // wedge the queue. (`fn` ignores the settle value it is handed.)\n const result = this.tail.then(fn, fn);\n // The next caller waits for OUR section to settle. We park a result-\n // swallowing continuation as the new tail so (a) the next section proceeds\n // on either outcome and (b) this internal chain never raises an unhandled\n // rejection. The real value/rejection still propagates through `result`.\n this.tail = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface EngineAdapter<E = unknown> {
|
|
2
|
+
/** Construct (or check out from a pool) an engine instance. */
|
|
3
|
+
create(): E | Promise<E>;
|
|
4
|
+
/** Reset the engine to an empty scene (used when parent === null). */
|
|
5
|
+
reset(engine: E): Promise<void>;
|
|
6
|
+
/** Load a scene snapshot into the engine. */
|
|
7
|
+
loadFromString(engine: E, sceneBytes: string): Promise<void>;
|
|
8
|
+
/** Serialize the engine's current scene to a string. */
|
|
9
|
+
saveToString(engine: E): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export interface EngineSlot<E = unknown> {
|
|
12
|
+
engine: E;
|
|
13
|
+
currentRevision: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface EngineSessionOptions<E = unknown> {
|
|
16
|
+
size: number;
|
|
17
|
+
adapter: EngineAdapter<E>;
|
|
18
|
+
}
|
|
19
|
+
export declare class EngineSession<E = unknown> {
|
|
20
|
+
private readonly opts;
|
|
21
|
+
private readonly slots;
|
|
22
|
+
private readonly stagedScenes;
|
|
23
|
+
constructor(opts: EngineSessionOptions<E>);
|
|
24
|
+
/**
|
|
25
|
+
* Pre-stage a scene snapshot so `acquire(rev)` can load it without going
|
|
26
|
+
* to the workspace. Used by RevisionStore-backed flows: the caller reads
|
|
27
|
+
* the .scene from the workspace once, then calls populate so subsequent
|
|
28
|
+
* acquire() calls in the same edit don't re-read.
|
|
29
|
+
*
|
|
30
|
+
* NOTE: This is an internal contract between EngineSession and the edit
|
|
31
|
+
* tool's load-then-acquire flow. Phase 2 may replace it with a direct
|
|
32
|
+
* `acquire(rev, sceneLoader)` callback.
|
|
33
|
+
*/
|
|
34
|
+
populate(revision: string, sceneBytes: string): Promise<void>;
|
|
35
|
+
/** Drop a staged scene (call after acquire consumed it). */
|
|
36
|
+
private consumeStaged;
|
|
37
|
+
acquire(parent: string | null): Promise<EngineSlot<E>>;
|
|
38
|
+
commit(slot: EngineSlot<E>, newRevision: string): void;
|
|
39
|
+
markDirty(slot: EngineSlot<E>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Return the first warm slot (currentRevision !== null) without any side
|
|
42
|
+
* effects, or undefined if no slot is currently warm. Used by tools that
|
|
43
|
+
* want to read the engine's current state (e.g. `preview` without a revision)
|
|
44
|
+
* without triggering a reset.
|
|
45
|
+
*/
|
|
46
|
+
currentSlot(): EngineSlot<E> | undefined;
|
|
47
|
+
get size(): number;
|
|
48
|
+
private pickSlot;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/engine/session.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,+DAA+D;IAC/D,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,sEAAsE;IACtE,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,6CAA6C;IAC7C,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,wDAAwD;IACxD,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,MAAM,EAAE,CAAC,CAAC;IACV,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAC3B;AAED,qBAAa,aAAa,CAAC,CAAC,GAAG,OAAO;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAE7B,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE1D;;;;;;;;;OASG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,4DAA4D;IAC5D,OAAO,CAAC,aAAa;IAMf,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAwB5D,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAItD,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpC;;;;;OAKG;IACH,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS;IAIxC,IAAI,IAAI,IAAI,MAAM,CAEjB;YAEa,QAAQ;CAcvB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// EngineSession — owns N {engine, currentRevision} slots and the §4.7
|
|
2
|
+
// contract that the engine state matches a requested `parent` before edit
|
|
3
|
+
// code runs. Production wires it as size=1 (single CE.SDK engine via
|
|
4
|
+
// cesdkAdapter); the multi-slot scaffolding is kept for a future Hosted
|
|
5
|
+
// pool but is dormant today.
|
|
6
|
+
//
|
|
7
|
+
// What "session" means here: a long-lived engine context that tracks which
|
|
8
|
+
// revision it is currently positioned at. Linear edits cost zero reloads
|
|
9
|
+
// (sticky routing in pickSlot); markDirty invalidates the slot so the next
|
|
10
|
+
// acquire pays a reload.
|
|
11
|
+
//
|
|
12
|
+
// The session is engine-agnostic: it talks to an EngineAdapter. Production
|
|
13
|
+
// passes a CE.SDK adapter; tests pass a fake.
|
|
14
|
+
export class EngineSession {
|
|
15
|
+
constructor(opts) {
|
|
16
|
+
this.opts = opts;
|
|
17
|
+
this.slots = [];
|
|
18
|
+
this.stagedScenes = new Map();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Pre-stage a scene snapshot so `acquire(rev)` can load it without going
|
|
22
|
+
* to the workspace. Used by RevisionStore-backed flows: the caller reads
|
|
23
|
+
* the .scene from the workspace once, then calls populate so subsequent
|
|
24
|
+
* acquire() calls in the same edit don't re-read.
|
|
25
|
+
*
|
|
26
|
+
* NOTE: This is an internal contract between EngineSession and the edit
|
|
27
|
+
* tool's load-then-acquire flow. Phase 2 may replace it with a direct
|
|
28
|
+
* `acquire(rev, sceneLoader)` callback.
|
|
29
|
+
*/
|
|
30
|
+
async populate(revision, sceneBytes) {
|
|
31
|
+
this.stagedScenes.set(revision, sceneBytes);
|
|
32
|
+
}
|
|
33
|
+
/** Drop a staged scene (call after acquire consumed it). */
|
|
34
|
+
consumeStaged(revision) {
|
|
35
|
+
const scene = this.stagedScenes.get(revision);
|
|
36
|
+
this.stagedScenes.delete(revision);
|
|
37
|
+
return scene;
|
|
38
|
+
}
|
|
39
|
+
async acquire(parent) {
|
|
40
|
+
const slot = await this.pickSlot(parent);
|
|
41
|
+
if (slot.currentRevision === parent && parent !== null) {
|
|
42
|
+
// Linear edit on a warm slot — no reload, no reset.
|
|
43
|
+
return slot;
|
|
44
|
+
}
|
|
45
|
+
if (parent === null) {
|
|
46
|
+
await this.opts.adapter.reset(slot.engine);
|
|
47
|
+
slot.currentRevision = null;
|
|
48
|
+
return slot;
|
|
49
|
+
}
|
|
50
|
+
const staged = this.consumeStaged(parent);
|
|
51
|
+
if (staged === undefined) {
|
|
52
|
+
const err = new Error(`EngineSession.acquire: scene for revision "${parent}" was not staged. ` +
|
|
53
|
+
`The caller must populate(parent, sceneBytes) before acquire(parent) for non-null parents.`);
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
await this.opts.adapter.loadFromString(slot.engine, staged);
|
|
57
|
+
slot.currentRevision = parent;
|
|
58
|
+
return slot;
|
|
59
|
+
}
|
|
60
|
+
commit(slot, newRevision) {
|
|
61
|
+
slot.currentRevision = newRevision;
|
|
62
|
+
}
|
|
63
|
+
markDirty(slot) {
|
|
64
|
+
slot.currentRevision = null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Return the first warm slot (currentRevision !== null) without any side
|
|
68
|
+
* effects, or undefined if no slot is currently warm. Used by tools that
|
|
69
|
+
* want to read the engine's current state (e.g. `preview` without a revision)
|
|
70
|
+
* without triggering a reset.
|
|
71
|
+
*/
|
|
72
|
+
currentSlot() {
|
|
73
|
+
return this.slots.find((s) => s.currentRevision !== null);
|
|
74
|
+
}
|
|
75
|
+
get size() {
|
|
76
|
+
return this.slots.length;
|
|
77
|
+
}
|
|
78
|
+
async pickSlot(parent) {
|
|
79
|
+
// Sticky routing: prefer the slot whose currentRevision matches parent.
|
|
80
|
+
for (const s of this.slots)
|
|
81
|
+
if (s.currentRevision === parent)
|
|
82
|
+
return s;
|
|
83
|
+
// Otherwise pick the first free slot, or create a new one if under cap.
|
|
84
|
+
if (this.slots.length < this.opts.size) {
|
|
85
|
+
const engine = await this.opts.adapter.create();
|
|
86
|
+
const slot = { engine, currentRevision: null };
|
|
87
|
+
this.slots.push(slot);
|
|
88
|
+
return slot;
|
|
89
|
+
}
|
|
90
|
+
// Cap reached — pick a dirty slot first, else the oldest.
|
|
91
|
+
const dirty = this.slots.find((s) => s.currentRevision === null);
|
|
92
|
+
return dirty ?? this.slots[0];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/engine/session.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0EAA0E;AAC1E,qEAAqE;AACrE,wEAAwE;AACxE,6BAA6B;AAC7B,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,yBAAyB;AACzB,EAAE;AACF,2EAA2E;AAC3E,8CAA8C;AAuB9C,MAAM,OAAO,aAAa;IAIxB,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;QAHzC,UAAK,GAAoB,EAAE,CAAC;QAC5B,iBAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEG,CAAC;IAE9D;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAAkB;QACjD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,4DAA4D;IACpD,aAAa,CAAC,QAAgB;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,eAAe,KAAK,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACvD,oDAAoD;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,KAAK,CACnB,8CAA8C,MAAM,oBAAoB;gBACtE,2FAA2F,CAC9F,CAAC;YACF,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAmB,EAAE,WAAmB;QAC7C,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,IAAmB;QAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAqB;QAC1C,wEAAwE;QACxE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,CAAC,eAAe,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAC;QACvE,wEAAwE;QACxE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,GAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,0DAA0D;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC;QACjE,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;CACF","sourcesContent":["// EngineSession — owns N {engine, currentRevision} slots and the §4.7\n// contract that the engine state matches a requested `parent` before edit\n// code runs. Production wires it as size=1 (single CE.SDK engine via\n// cesdkAdapter); the multi-slot scaffolding is kept for a future Hosted\n// pool but is dormant today.\n//\n// What \"session\" means here: a long-lived engine context that tracks which\n// revision it is currently positioned at. Linear edits cost zero reloads\n// (sticky routing in pickSlot); markDirty invalidates the slot so the next\n// acquire pays a reload.\n//\n// The session is engine-agnostic: it talks to an EngineAdapter. Production\n// passes a CE.SDK adapter; tests pass a fake.\n\nexport interface EngineAdapter<E = unknown> {\n /** Construct (or check out from a pool) an engine instance. */\n create(): E | Promise<E>;\n /** Reset the engine to an empty scene (used when parent === null). */\n reset(engine: E): Promise<void>;\n /** Load a scene snapshot into the engine. */\n loadFromString(engine: E, sceneBytes: string): Promise<void>;\n /** Serialize the engine's current scene to a string. */\n saveToString(engine: E): Promise<string>;\n}\n\nexport interface EngineSlot<E = unknown> {\n engine: E;\n currentRevision: string | null;\n}\n\nexport interface EngineSessionOptions<E = unknown> {\n size: number;\n adapter: EngineAdapter<E>;\n}\n\nexport class EngineSession<E = unknown> {\n private readonly slots: EngineSlot<E>[] = [];\n private readonly stagedScenes = new Map<string, string>();\n\n constructor(private readonly opts: EngineSessionOptions<E>) {}\n\n /**\n * Pre-stage a scene snapshot so `acquire(rev)` can load it without going\n * to the workspace. Used by RevisionStore-backed flows: the caller reads\n * the .scene from the workspace once, then calls populate so subsequent\n * acquire() calls in the same edit don't re-read.\n *\n * NOTE: This is an internal contract between EngineSession and the edit\n * tool's load-then-acquire flow. Phase 2 may replace it with a direct\n * `acquire(rev, sceneLoader)` callback.\n */\n async populate(revision: string, sceneBytes: string): Promise<void> {\n this.stagedScenes.set(revision, sceneBytes);\n }\n\n /** Drop a staged scene (call after acquire consumed it). */\n private consumeStaged(revision: string): string | undefined {\n const scene = this.stagedScenes.get(revision);\n this.stagedScenes.delete(revision);\n return scene;\n }\n\n async acquire(parent: string | null): Promise<EngineSlot<E>> {\n const slot = await this.pickSlot(parent);\n if (slot.currentRevision === parent && parent !== null) {\n // Linear edit on a warm slot — no reload, no reset.\n return slot;\n }\n if (parent === null) {\n await this.opts.adapter.reset(slot.engine);\n slot.currentRevision = null;\n return slot;\n }\n const staged = this.consumeStaged(parent);\n if (staged === undefined) {\n const err = new Error(\n `EngineSession.acquire: scene for revision \"${parent}\" was not staged. ` +\n `The caller must populate(parent, sceneBytes) before acquire(parent) for non-null parents.`\n );\n throw err;\n }\n await this.opts.adapter.loadFromString(slot.engine, staged);\n slot.currentRevision = parent;\n return slot;\n }\n\n commit(slot: EngineSlot<E>, newRevision: string): void {\n slot.currentRevision = newRevision;\n }\n\n markDirty(slot: EngineSlot<E>): void {\n slot.currentRevision = null;\n }\n\n /**\n * Return the first warm slot (currentRevision !== null) without any side\n * effects, or undefined if no slot is currently warm. Used by tools that\n * want to read the engine's current state (e.g. `preview` without a revision)\n * without triggering a reset.\n */\n currentSlot(): EngineSlot<E> | undefined {\n return this.slots.find((s) => s.currentRevision !== null);\n }\n\n get size(): number {\n return this.slots.length;\n }\n\n private async pickSlot(parent: string | null): Promise<EngineSlot<E>> {\n // Sticky routing: prefer the slot whose currentRevision matches parent.\n for (const s of this.slots) if (s.currentRevision === parent) return s;\n // Otherwise pick the first free slot, or create a new one if under cap.\n if (this.slots.length < this.opts.size) {\n const engine = await this.opts.adapter.create();\n const slot: EngineSlot<E> = { engine, currentRevision: null };\n this.slots.push(slot);\n return slot;\n }\n // Cap reached — pick a dirty slot first, else the oldest.\n const dirty = this.slots.find((s) => s.currentRevision === null);\n return dirty ?? this.slots[0];\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ViewerUrlBuilder } from '../viewer/url-builder.js';
|
|
2
|
+
/** The minimal slice of CreativeEngine this module needs — keeps it testable. */
|
|
3
|
+
export interface UriResolvableEngine {
|
|
4
|
+
editor: {
|
|
5
|
+
setURIResolver(resolver: (uri: string, defaultResolver: (uri: string) => string) => string): void;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Make the engine resolve `workspace://…` asset URIs to the `/r/` HTTP route.
|
|
10
|
+
* Scenes persist the durable `workspace://` form; this rewrites it to a live
|
|
11
|
+
* fetch URL at load time, so a design survives a process restart / rewind.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerWorkspaceUriResolver(engine: UriResolvableEngine, urlBuilder: ViewerUrlBuilder): void;
|
|
14
|
+
//# sourceMappingURL=uri-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri-resolver.d.ts","sourceRoot":"","sources":["../../src/engine/uri-resolver.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE;QACN,cAAc,CACZ,QAAQ,EAAE,CACR,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KACrC,MAAM,GACV,IAAI,CAAC;KACT,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,gBAAgB,GAC3B,IAAI,CAMN"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const WORKSPACE_URI_PREFIX = 'workspace://';
|
|
2
|
+
/**
|
|
3
|
+
* Make the engine resolve `workspace://…` asset URIs to the `/r/` HTTP route.
|
|
4
|
+
* Scenes persist the durable `workspace://` form; this rewrites it to a live
|
|
5
|
+
* fetch URL at load time, so a design survives a process restart / rewind.
|
|
6
|
+
*/
|
|
7
|
+
export function registerWorkspaceUriResolver(engine, urlBuilder) {
|
|
8
|
+
engine.editor.setURIResolver((uri, defaultResolver) => uri.startsWith(WORKSPACE_URI_PREFIX)
|
|
9
|
+
? urlBuilder.forResource(uri.slice(WORKSPACE_URI_PREFIX.length))
|
|
10
|
+
: defaultResolver(uri));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=uri-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri-resolver.js","sourceRoot":"","sources":["../../src/engine/uri-resolver.ts"],"names":[],"mappings":"AAOA,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAc5C;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAA2B,EAC3B,UAA4B;IAE5B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,CACpD,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAClC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CACzB,CAAC;AACJ,CAAC","sourcesContent":["//\n// Registers a CE.SDK URI resolver that rewrites `workspace://<relpath>` asset\n// URIs (stored durably in scenes) to the HTTP `/r/` URL the engine can fetch.\n// Everything else delegates to CE.SDK's default resolver. Used by the headless\n// node engine; the browser viewer mirrors this logic in viewer.js.\nimport type { ViewerUrlBuilder } from '../viewer/url-builder.js';\n\nconst WORKSPACE_URI_PREFIX = 'workspace://';\n\n/** The minimal slice of CreativeEngine this module needs — keeps it testable. */\nexport interface UriResolvableEngine {\n editor: {\n setURIResolver(\n resolver: (\n uri: string,\n defaultResolver: (uri: string) => string\n ) => string\n ): void;\n };\n}\n\n/**\n * Make the engine resolve `workspace://…` asset URIs to the `/r/` HTTP route.\n * Scenes persist the durable `workspace://` form; this rewrites it to a live\n * fetch URL at load time, so a design survives a process restart / rewind.\n */\nexport function registerWorkspaceUriResolver(\n engine: UriResolvableEngine,\n urlBuilder: ViewerUrlBuilder\n): void {\n engine.editor.setURIResolver((uri, defaultResolver) =>\n uri.startsWith(WORKSPACE_URI_PREFIX)\n ? urlBuilder.forResource(uri.slice(WORKSPACE_URI_PREFIX.length))\n : defaultResolver(uri)\n );\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of parsing a markdown file with optional YAML-ish frontmatter at the
|
|
3
|
+
* top. Only `name` and `description` keys are recognized; everything else in
|
|
4
|
+
* the fence block is ignored. Values are trimmed of surrounding whitespace.
|
|
5
|
+
*
|
|
6
|
+
* `body` is the input with any frontmatter fence stripped. When no fence is
|
|
7
|
+
* present, `body` equals the input verbatim.
|
|
8
|
+
*/
|
|
9
|
+
export interface ParsedFrontmatter {
|
|
10
|
+
name?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
body: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function parseFrontmatter(input: string): ParsedFrontmatter;
|
|
15
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAqCjE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const FENCE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
|
|
2
|
+
export function parseFrontmatter(input) {
|
|
3
|
+
const match = input.match(FENCE);
|
|
4
|
+
if (!match)
|
|
5
|
+
return { body: input };
|
|
6
|
+
const block = match[1];
|
|
7
|
+
const body = input.slice(match[0].length);
|
|
8
|
+
const out = { body };
|
|
9
|
+
const lines = block.split(/\r?\n/);
|
|
10
|
+
for (let i = 0; i < lines.length; i++) {
|
|
11
|
+
const line = lines[i];
|
|
12
|
+
const m = line.match(/^([A-Za-z0-9_-]+)\s*:\s*(.*)$/);
|
|
13
|
+
if (!m)
|
|
14
|
+
continue;
|
|
15
|
+
const [, key, rawValue] = m;
|
|
16
|
+
const trimmed = rawValue.trim();
|
|
17
|
+
// YAML pipe block scalar: `description: |` followed by indented lines.
|
|
18
|
+
// Treat the indented continuation as the value (joined with single
|
|
19
|
+
// spaces; the description field is logically a paragraph). Folded
|
|
20
|
+
// scalars (`>`) get the same treatment.
|
|
21
|
+
let value = trimmed;
|
|
22
|
+
if (trimmed === '|' || trimmed === '>') {
|
|
23
|
+
const collected = [];
|
|
24
|
+
let j = i + 1;
|
|
25
|
+
while (j < lines.length) {
|
|
26
|
+
const nextLine = lines[j];
|
|
27
|
+
if (nextLine === '' || /^\s+/.test(nextLine)) {
|
|
28
|
+
if (nextLine.trim().length > 0)
|
|
29
|
+
collected.push(nextLine.trim());
|
|
30
|
+
j++;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
value = collected.join(' ').trim();
|
|
37
|
+
i = j - 1;
|
|
38
|
+
}
|
|
39
|
+
if (key === 'name')
|
|
40
|
+
out.name = value;
|
|
41
|
+
else if (key === 'description')
|
|
42
|
+
out.description = value;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAcA,MAAM,KAAK,GAAG,mCAAmC,CAAC;AAElD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAsB,EAAE,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,uEAAuE;QACvE,mEAAmE;QACnE,kEAAkE;QAClE,wCAAwC;QACxC,IAAI,KAAK,GAAG,OAAO,CAAC;QACpB,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACvC,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;wBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChE,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,MAAM;gBACR,CAAC;YACH,CAAC;YACD,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,GAAG,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;aAChC,IAAI,GAAG,KAAK,aAAa;YAAE,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/**\n * Result of parsing a markdown file with optional YAML-ish frontmatter at the\n * top. Only `name` and `description` keys are recognized; everything else in\n * the fence block is ignored. Values are trimmed of surrounding whitespace.\n *\n * `body` is the input with any frontmatter fence stripped. When no fence is\n * present, `body` equals the input verbatim.\n */\nexport interface ParsedFrontmatter {\n name?: string;\n description?: string;\n body: string;\n}\n\nconst FENCE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\nexport function parseFrontmatter(input: string): ParsedFrontmatter {\n const match = input.match(FENCE);\n if (!match) return { body: input };\n const block = match[1];\n const body = input.slice(match[0].length);\n const out: ParsedFrontmatter = { body };\n const lines = block.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const m = line.match(/^([A-Za-z0-9_-]+)\\s*:\\s*(.*)$/);\n if (!m) continue;\n const [, key, rawValue] = m;\n const trimmed = rawValue.trim();\n // YAML pipe block scalar: `description: |` followed by indented lines.\n // Treat the indented continuation as the value (joined with single\n // spaces; the description field is logically a paragraph). Folded\n // scalars (`>`) get the same treatment.\n let value = trimmed;\n if (trimmed === '|' || trimmed === '>') {\n const collected: string[] = [];\n let j = i + 1;\n while (j < lines.length) {\n const nextLine = lines[j];\n if (nextLine === '' || /^\\s+/.test(nextLine)) {\n if (nextLine.trim().length > 0) collected.push(nextLine.trim());\n j++;\n } else {\n break;\n }\n }\n value = collected.join(' ').trim();\n i = j - 1;\n }\n if (key === 'name') out.name = value;\n else if (key === 'description') out.description = value;\n }\n return out;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GatewayClient, GenerateImageInput, GenerateImageOutput } from './types.js';
|
|
2
|
+
export declare class HostedStubGatewayClient implements GatewayClient {
|
|
3
|
+
readonly available = false;
|
|
4
|
+
generateImage(_input: GenerateImageInput): Promise<GenerateImageOutput>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=hosted-stub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-stub.d.ts","sourceRoot":"","sources":["../../src/gateway/hosted-stub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,uBAAwB,YAAW,aAAa;IAG3D,QAAQ,CAAC,SAAS,SAAS;IAErB,aAAa,CACjB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,mBAAmB,CAAC;CAKhC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class HostedStubGatewayClient {
|
|
2
|
+
constructor() {
|
|
3
|
+
// Phase 2 wiring is not implemented yet, so the hosted gateway can't
|
|
4
|
+
// fulfil requests — keep `asset_generate` hidden until it can.
|
|
5
|
+
this.available = false;
|
|
6
|
+
}
|
|
7
|
+
async generateImage(_input) {
|
|
8
|
+
throw new Error('HostedStubGatewayClient.generateImage: Phase 2 wires Clerk-bound gateway calls (not implemented)');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=hosted-stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-stub.js","sourceRoot":"","sources":["../../src/gateway/hosted-stub.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,uBAAuB;IAApC;QACE,qEAAqE;QACrE,+DAA+D;QACtD,cAAS,GAAG,KAAK,CAAC;IAS7B,CAAC;IAPC,KAAK,CAAC,aAAa,CACjB,MAA0B;QAE1B,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type {\n GatewayClient,\n GenerateImageInput,\n GenerateImageOutput\n} from './types.js';\n\nexport class HostedStubGatewayClient implements GatewayClient {\n // Phase 2 wiring is not implemented yet, so the hosted gateway can't\n // fulfil requests — keep `asset_generate` hidden until it can.\n readonly available = false;\n\n async generateImage(\n _input: GenerateImageInput\n ): Promise<GenerateImageOutput> {\n throw new Error(\n 'HostedStubGatewayClient.generateImage: Phase 2 wires Clerk-bound gateway calls (not implemented)'\n );\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,cAAc,YAAY,CAAC","sourcesContent":["export { HostedStubGatewayClient } from './hosted-stub.js';\nexport { LocalGatewayClient } from './local.js';\nexport * from './types.js';\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type GatewayClient, type GenerateImageInput, type GenerateImageOutput } from './types.js';
|
|
2
|
+
export interface LocalGatewayClientOptions {
|
|
3
|
+
apiKey: string | undefined;
|
|
4
|
+
endpoint?: string;
|
|
5
|
+
fetch?: typeof globalThis.fetch;
|
|
6
|
+
}
|
|
7
|
+
export declare class LocalGatewayClient implements GatewayClient {
|
|
8
|
+
private readonly opts;
|
|
9
|
+
constructor(opts: LocalGatewayClientOptions);
|
|
10
|
+
/** Available only when an `API_KEY` was provided. */
|
|
11
|
+
get available(): boolean;
|
|
12
|
+
generateImage(input: GenerateImageInput): Promise<GenerateImageOutput>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/gateway/local.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,kBAAmB,YAAW,aAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,yBAAyB;IAE5D,qDAAqD;IACrD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAmC7E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GatewayDisabledError } from './types.js';
|
|
2
|
+
const DEFAULT_ENDPOINT = 'https://gateway.img.ly/v1/images/generate';
|
|
3
|
+
export class LocalGatewayClient {
|
|
4
|
+
constructor(opts) {
|
|
5
|
+
this.opts = opts;
|
|
6
|
+
}
|
|
7
|
+
/** Available only when an `API_KEY` was provided. */
|
|
8
|
+
get available() {
|
|
9
|
+
return Boolean(this.opts.apiKey);
|
|
10
|
+
}
|
|
11
|
+
async generateImage(input) {
|
|
12
|
+
if (!this.opts.apiKey) {
|
|
13
|
+
throw new GatewayDisabledError('asset generation is disabled: set `API_KEY` (your IMG.LY gateway key) to enable. See `handbook` → `asset_generate`.');
|
|
14
|
+
}
|
|
15
|
+
const f = this.opts.fetch ?? globalThis.fetch;
|
|
16
|
+
const res = await f(this.opts.endpoint ?? DEFAULT_ENDPOINT, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${this.opts.apiKey}`,
|
|
20
|
+
'content-type': 'application/json'
|
|
21
|
+
},
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
prompt: input.prompt,
|
|
24
|
+
width: input.width,
|
|
25
|
+
height: input.height
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
throw new Error(`asset_generate: gateway returned ${res.status} ${res.statusText}`);
|
|
30
|
+
}
|
|
31
|
+
const ct = res.headers.get('content-type') ?? 'image/png';
|
|
32
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
33
|
+
const mimeType = (ct.startsWith('image/jpeg')
|
|
34
|
+
? 'image/jpeg'
|
|
35
|
+
: ct.startsWith('image/webp')
|
|
36
|
+
? 'image/webp'
|
|
37
|
+
: 'image/png');
|
|
38
|
+
return { bytes, mimeType };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=local.js.map
|