@imgly/codesign-mcp 0.1.5 → 0.1.6
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/README.md +51 -1
- package/assets/docs/guide/SKILL.md +45 -53
- package/assets/docs/guide/animation/create/base.md +234 -243
- package/assets/docs/guide/animation/create/text.md +250 -231
- package/assets/docs/guide/animation/create.md +197 -231
- package/assets/docs/guide/animation/edit.md +196 -271
- package/assets/docs/guide/animation/types.md +182 -185
- package/assets/docs/guide/animation.md +9 -6
- package/assets/docs/guide/api/AssetAPI.md +7 -53
- package/assets/docs/guide/api/BlockAPI.md +725 -648
- package/assets/docs/guide/api/CreativeEngine.md +7 -16
- package/assets/docs/guide/api/EditorAPI.md +32 -93
- package/assets/docs/guide/api/EventAPI.md +1 -2
- package/assets/docs/guide/api/SceneAPI.md +47 -98
- package/assets/docs/guide/api/VariableAPI.md +1 -4
- package/assets/docs/guide/api/node/classes/assetapi.md +1090 -0
- package/assets/docs/guide/api/node/classes/blockapi.md +12965 -0
- package/assets/docs/guide/api/node/classes/creativeengine.md +319 -0
- package/assets/docs/guide/api/node/classes/editorapi.md +3417 -0
- package/assets/docs/guide/api/node/classes/engineactions.md +319 -0
- package/assets/docs/guide/api/node/classes/eventapi.md +56 -0
- package/assets/docs/guide/api/node/classes/sceneapi.md +1370 -0
- package/assets/docs/guide/api/node/classes/variableapi.md +143 -0
- package/assets/docs/guide/api/node/enumerations/compressionformat.md +23 -0
- package/assets/docs/guide/api/node/enumerations/compressionlevel.md +24 -0
- package/assets/docs/guide/api/node/functions/iscmykcolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isrgbacolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isspotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/addvideooptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/applyassetoptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/asset.md +30 -0
- package/assets/docs/guide/api/node/interfaces/assetbooleanproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcmykcolor.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetcolorproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcontentaspectratio.md +23 -0
- package/assets/docs/guide/api/node/interfaces/assetdefinition.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetenumproperty.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedaspectratio.md +24 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedsize.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetfreeaspectratio.md +22 -0
- package/assets/docs/guide/api/node/interfaces/assetnumberproperty.md +28 -0
- package/assets/docs/guide/api/node/interfaces/assetpayload.md +27 -0
- package/assets/docs/guide/api/node/interfaces/assetquerydata.md +32 -0
- package/assets/docs/guide/api/node/interfaces/assetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/assetrgbcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsource.md +111 -0
- package/assets/docs/guide/api/node/interfaces/assetspotcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsqueryresult.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetstringproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepreset.md +39 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepresetanimation.md +23 -0
- package/assets/docs/guide/api/node/interfaces/audiotrackinfo.md +32 -0
- package/assets/docs/guide/api/node/interfaces/blockevent.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateerror.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstatepending.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateready.md +25 -0
- package/assets/docs/guide/api/node/interfaces/buffer.md +26 -0
- package/assets/docs/guide/api/node/interfaces/characterinkbox.md +29 -0
- package/assets/docs/guide/api/node/interfaces/cmykcolor.md +34 -0
- package/assets/docs/guide/api/node/interfaces/completeassetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/configuration.md +38 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolorsoptions.md +23 -0
- package/assets/docs/guide/api/node/interfaces/engineactioninfo.md +24 -0
- package/assets/docs/guide/api/node/interfaces/engineactionsregistry.md +18 -0
- package/assets/docs/guide/api/node/interfaces/engineplugin.md +30 -0
- package/assets/docs/guide/api/node/interfaces/font.md +27 -0
- package/assets/docs/guide/api/node/interfaces/fontmetrics.md +32 -0
- package/assets/docs/guide/api/node/interfaces/gradientcolorstop.md +28 -0
- package/assets/docs/guide/api/node/interfaces/logger.md +39 -0
- package/assets/docs/guide/api/node/interfaces/pageduration.md +23 -0
- package/assets/docs/guide/api/node/interfaces/range.md +23 -0
- package/assets/docs/guide/api/node/interfaces/rgbacolor.md +32 -0
- package/assets/docs/guide/api/node/interfaces/rgbcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/settings.md +126 -0
- package/assets/docs/guide/api/node/interfaces/size2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/source.md +24 -0
- package/assets/docs/guide/api/node/interfaces/spotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/textdecorationconfig.md +31 -0
- package/assets/docs/guide/api/node/interfaces/textfontsizeoptions.md +24 -0
- package/assets/docs/guide/api/node/interfaces/textruninfo.md +33 -0
- package/assets/docs/guide/api/node/interfaces/transientresource.md +26 -0
- package/assets/docs/guide/api/node/interfaces/typeface.md +23 -0
- package/assets/docs/guide/api/node/interfaces/vec2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/vec3.md +22 -0
- package/assets/docs/guide/api/node/type-aliases/addimageoptions.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/animationbaselinedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationblockswipetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationeasing.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationentry.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationgrowdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationjumploopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationkenburnsdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationmergetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationspindirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationspinloopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypewritertextwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationwipedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/applicationmimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/assetcolor.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/assetfilter.md +47 -0
- package/assets/docs/guide/api/node/type-aliases/assetgroups.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetmetadata.md +42 -0
- package/assets/docs/guide/api/node/type-aliases/assetproperty.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertyfilter.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertypath.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetanimationproperties.md +34 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetproperties.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetpropertyvalue.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetscalableproperty.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/assettransformpreset.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/asyncuriresolver.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/audioexportoptions.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/audiofromvideooptions.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/audiomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/blendmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/blockenumtype.md +63 -0
- package/assets/docs/guide/api/node/type-aliases/blockstate.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/blurtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/booleanoperation.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/boolpropertyname.md +79 -0
- package/assets/docs/guide/api/node/type-aliases/cameraclampingovershootmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionhorizontalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/cmyk.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/color.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/colorpickercolormode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/colorpropertyname.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/colorspace.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/contentfillmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmomovehandlevisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoresizehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmorotatehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoscalehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/createsceneoptions.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/cutoutoperation.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/cutouttype.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/defaultassetsourceid.md +37 -0
- package/assets/docs/guide/api/node/type-aliases/demoassetsourceid.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/designblockid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/designunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doubleclickselectionmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doublepropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/dropshadowoptions.md +32 -0
- package/assets/docs/guide/api/node/type-aliases/editmode.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/effecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/engineactionid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/enginecustomactionfunction.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/engineplugincontext.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/enumpropertyname.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/enumvalues.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/exportoptions.md +57 -0
- package/assets/docs/guide/api/node/type-aliases/fillpixelstreamorientation.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/filltype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/filltypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/filltypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/floatpropertyname.md +184 -0
- package/assets/docs/guide/api/node/type-aliases/fontsizeunit.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/fontstyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/fontweight.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/gradientstoprgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/heightmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/hexcolorstring.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyupdate.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontaltextalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/imagemimetype.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/intpropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/liststyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/locale.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/loglevel.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/mimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/objecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypelonghand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypeshorthand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/optionalprefix.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/pageguidessource.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/palettecolor.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/positionmode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/positionxmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/positionymode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/propertytype.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/rgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/rolestring.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/scenefontsizeunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenelayout.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenemode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scope.md +50 -0
- package/assets/docs/guide/api/node/type-aliases/settingboolpropertyname.md +62 -0
- package/assets/docs/guide/api/node/type-aliases/settingcolorpropertyname.md +38 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumpropertyname.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumtype.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumvalues.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingfloatpropertyname.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/settingintpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingkey.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingsbool.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolor.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolorrgba.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/settingsenum.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsfloat.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsint.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsstring.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingstringpropertyname.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/settingtype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingvaluetype.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/shapetype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/shapevectorpathfillrule.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/sizemode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/sortingorder.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/sourcesetpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/splitoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/stringpropertyname.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/strokecap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokecornergeometry.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashstartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeposition.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/syncuriresolver.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/textanimationwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/textcase.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationline.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationstyle.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/textverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/timelinetrackvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchpinchaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchrotateaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/typefacedefinition.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/verticalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/verticalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/videoexportoptions.md +54 -0
- package/assets/docs/guide/api/node/type-aliases/videomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/widthmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/xywh.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/zoomautofitaxis.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/zoomoptions.md +27 -0
- package/assets/docs/guide/api/node/variables/animation_types.md +21 -0
- package/assets/docs/guide/api/node/variables/animationbaselinedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationblockswipetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationeasingvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationgrowdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationjumploopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationkenburnsdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationmergetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspindirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspinloopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationtypewritertextwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationwipedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blendmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blur_types.md +21 -0
- package/assets/docs/guide/api/node/variables/cameraclampingovershootmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionhorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/colorpickercolormodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/contentfillmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmomovehandlevisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoresizehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmorotatehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoscalehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/cutouttypevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/design_block_types.md +21 -0
- package/assets/docs/guide/api/node/variables/doubleclickselectionmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/effect_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fill_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fillpixelstreamorientationvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/heightmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/horizontalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/loglevel.md +37 -0
- package/assets/docs/guide/api/node/variables/mimetype.md +41 -0
- package/assets/docs/guide/api/node/variables/pageguidessourcevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionxmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionymodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenedesignunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenefontsizeunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenelayoutvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenemodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/shape_types.md +21 -0
- package/assets/docs/guide/api/node/variables/shapevectorpathfillrulevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecornergeometryvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashstartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokeendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokepositionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textanimationwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/texthorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/timelinetrackvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchpinchactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchrotateactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/verticalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/widthmodevalues.md +18 -0
- package/assets/docs/guide/api/types.md +5 -9
- package/assets/docs/guide/api-reference/overview.md +7 -7
- package/assets/docs/guide/automation/auto-resize.md +263 -300
- package/assets/docs/guide/automation/data-merge.md +246 -275
- package/assets/docs/guide/automation/design-generation.md +102 -31
- package/assets/docs/guide/automation/multi-image-generation.md +758 -0
- package/assets/docs/guide/automation/overview.md +21 -4
- package/assets/docs/guide/automation.md +10 -5
- package/assets/docs/guide/capabilities.md +6 -4
- package/assets/docs/guide/colors/adjust.md +247 -249
- package/assets/docs/guide/colors/apply.md +127 -138
- package/assets/docs/guide/colors/basics.md +126 -150
- package/assets/docs/guide/colors/conversion.md +171 -177
- package/assets/docs/guide/colors/create-color-palette.md +244 -245
- package/assets/docs/guide/colors/extract-colors.md +144 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +292 -352
- package/assets/docs/guide/colors/for-print/spot.md +521 -578
- package/assets/docs/guide/colors/for-print.md +9 -4
- package/assets/docs/guide/colors/for-screen/p3.md +12 -10
- package/assets/docs/guide/colors/for-screen/srgb.md +107 -133
- package/assets/docs/guide/colors/for-screen.md +9 -4
- package/assets/docs/guide/colors/overview.md +6 -4
- package/assets/docs/guide/colors/replace.md +381 -419
- package/assets/docs/guide/colors.md +9 -4
- package/assets/docs/guide/compatibility.md +7 -5
- package/assets/docs/guide/concepts/architecture.md +17 -15
- package/assets/docs/guide/concepts/assets.md +152 -140
- package/assets/docs/guide/concepts/blocks.md +227 -323
- package/assets/docs/guide/concepts/buffers.md +147 -276
- package/assets/docs/guide/concepts/design-units.md +95 -145
- package/assets/docs/guide/concepts/editing-workflow.md +69 -183
- package/assets/docs/guide/concepts/events.md +80 -122
- package/assets/docs/guide/concepts/headless-mode.md +237 -0
- package/assets/docs/guide/concepts/pages.md +137 -127
- package/assets/docs/guide/concepts/resources.md +156 -217
- package/assets/docs/guide/concepts/scenes.md +191 -210
- package/assets/docs/guide/concepts/templating.md +118 -74
- package/assets/docs/guide/concepts/terminology.md +49 -47
- package/assets/docs/guide/concepts/undo-and-history.md +229 -303
- package/assets/docs/guide/concepts.md +9 -7
- package/assets/docs/guide/configuration.md +252 -380
- package/assets/docs/guide/conversion/overview.md +33 -4
- package/assets/docs/guide/conversion/to-base64.md +127 -167
- package/assets/docs/guide/conversion/to-pdf.md +24 -474
- package/assets/docs/guide/conversion/to-png.md +168 -211
- package/assets/docs/guide/conversion.md +9 -4
- package/assets/docs/guide/create-audio/audio/add-music.md +301 -327
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +475 -359
- package/assets/docs/guide/create-audio/audio/loop.md +232 -272
- package/assets/docs/guide/create-composition/add-background.md +237 -239
- package/assets/docs/guide/create-composition/blend-modes.md +118 -209
- package/assets/docs/guide/create-composition/collage.md +538 -320
- package/assets/docs/guide/create-composition/group-and-ungroup.md +216 -261
- package/assets/docs/guide/create-composition/layer-management.md +219 -257
- package/assets/docs/guide/create-composition/layout.md +513 -315
- package/assets/docs/guide/create-composition/lock-design.md +90 -109
- package/assets/docs/guide/create-composition/multi-page.md +133 -113
- package/assets/docs/guide/create-composition/overview.md +16 -4
- package/assets/docs/guide/create-composition/programmatic.md +288 -344
- package/assets/docs/guide/create-composition.md +10 -5
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +443 -569
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +567 -470
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +179 -516
- package/assets/docs/guide/create-templates/add-dynamic-content.md +226 -224
- package/assets/docs/guide/create-templates/add-to-template-library.md +183 -193
- package/assets/docs/guide/create-templates/edit-or-remove.md +297 -303
- package/assets/docs/guide/create-templates/from-scratch.md +207 -268
- package/assets/docs/guide/create-templates/import/from-scene-file.md +158 -236
- package/assets/docs/guide/create-templates/import.md +145 -161
- package/assets/docs/guide/create-templates/lock.md +42 -295
- package/assets/docs/guide/create-templates/overview.md +33 -4
- package/assets/docs/guide/create-templates.md +9 -5
- package/assets/docs/guide/create-video/audio/adjust-speed.md +157 -207
- package/assets/docs/guide/create-video/audio/adjust-volume.md +116 -227
- package/assets/docs/guide/create-video/control.md +352 -193
- package/assets/docs/guide/create-video/limitations.md +175 -280
- package/assets/docs/guide/create-video.md +11 -10
- package/assets/docs/guide/edit-image/add-watermark.md +283 -330
- package/assets/docs/guide/edit-image/overview.md +29 -4
- package/assets/docs/guide/edit-image/remove-bg.md +283 -337
- package/assets/docs/guide/edit-image/replace-colors.md +424 -502
- package/assets/docs/guide/edit-image/transform/crop.md +463 -402
- package/assets/docs/guide/edit-image/transform/flip.md +353 -0
- package/assets/docs/guide/edit-image/transform/move.md +143 -100
- package/assets/docs/guide/edit-image/transform/resize.md +118 -88
- package/assets/docs/guide/edit-image/transform/rotate.md +132 -165
- package/assets/docs/guide/edit-image/transform/scale.md +230 -228
- package/assets/docs/guide/edit-image/transform.md +10 -5
- package/assets/docs/guide/edit-image.md +11 -7
- package/assets/docs/guide/edit-video/add-captions.md +344 -421
- package/assets/docs/guide/edit-video/add-watermark.md +312 -258
- package/assets/docs/guide/edit-video/join-and-arrange.md +237 -371
- package/assets/docs/guide/edit-video/redaction.md +419 -385
- package/assets/docs/guide/edit-video/split.md +243 -493
- package/assets/docs/guide/edit-video/transform/crop.md +21 -352
- package/assets/docs/guide/edit-video/transform/flip.md +102 -76
- package/assets/docs/guide/edit-video/transform/move.md +258 -310
- package/assets/docs/guide/edit-video/transform/resize.md +264 -428
- package/assets/docs/guide/edit-video/transform/rotate.md +265 -228
- package/assets/docs/guide/edit-video/transform/scale.md +320 -417
- package/assets/docs/guide/edit-video/transform.md +10 -6
- package/assets/docs/guide/edit-video/trim.md +448 -494
- package/assets/docs/guide/engine-interface.md +51 -62
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +148 -184
- package/assets/docs/guide/export-save-publish/export/compress.md +161 -559
- package/assets/docs/guide/export-save-publish/export/overview.md +224 -373
- package/assets/docs/guide/export-save-publish/export/partial-export.md +386 -577
- package/assets/docs/guide/export-save-publish/export/size-limits.md +215 -310
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +132 -213
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +139 -267
- package/assets/docs/guide/export-save-publish/export/to-png.md +121 -165
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +187 -234
- package/assets/docs/guide/export-save-publish/export/to-webp.md +160 -190
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +359 -203
- package/assets/docs/guide/export-save-publish/export.md +14 -11
- package/assets/docs/guide/export-save-publish/for-printing.md +141 -237
- package/assets/docs/guide/export-save-publish/for-social-media.md +124 -261
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +436 -522
- package/assets/docs/guide/export-save-publish/save.md +167 -226
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +97 -162
- package/assets/docs/guide/file-format-support.md +9 -9
- package/assets/docs/guide/fills/color.md +370 -347
- package/assets/docs/guide/fills/image.md +167 -196
- package/assets/docs/guide/fills/overview.md +6 -4
- package/assets/docs/guide/fills/video.md +286 -438
- package/assets/docs/guide/fills.md +12 -8
- package/assets/docs/guide/filters-and-effects/apply.md +598 -664
- package/assets/docs/guide/filters-and-effects/blur.md +261 -159
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +194 -293
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +548 -466
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +176 -244
- package/assets/docs/guide/filters-and-effects/distortion.md +317 -384
- package/assets/docs/guide/filters-and-effects/duotone.md +221 -217
- package/assets/docs/guide/filters-and-effects/gradients.md +670 -813
- package/assets/docs/guide/filters-and-effects/overview.md +7 -7
- package/assets/docs/guide/filters-and-effects/support.md +97 -132
- package/assets/docs/guide/filters-and-effects.md +11 -6
- package/assets/docs/guide/get-started/agent-skills.md +20 -18
- package/assets/docs/guide/get-started/build-with-ai.md +7 -4
- package/assets/docs/guide/get-started/bun.md +219 -0
- package/assets/docs/guide/get-started/deno.md +161 -0
- package/assets/docs/guide/get-started/mcp-server.md +6 -4
- package/assets/docs/guide/get-started/overview.md +11 -6
- package/assets/docs/guide/get-started/vanilla-aws-lambda.md +506 -0
- package/assets/docs/guide/get-started/vanilla-clone-github-project.md +124 -0
- package/assets/docs/guide/get-started/vanilla.md +235 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +80 -66
- package/assets/docs/guide/guides.md +10 -9
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +259 -288
- package/assets/docs/guide/import-media/concepts.md +20 -38
- package/assets/docs/guide/import-media/content-json-schema.md +145 -125
- package/assets/docs/guide/import-media/default-assets.md +113 -161
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +391 -395
- package/assets/docs/guide/import-media/file-format-support.md +78 -61
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +273 -244
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +152 -222
- package/assets/docs/guide/import-media/from-remote-source.md +9 -11
- package/assets/docs/guide/import-media/overview.md +5 -5
- package/assets/docs/guide/import-media/retrieve-mimetype.md +216 -108
- package/assets/docs/guide/import-media/size-limits.md +6 -4
- package/assets/docs/guide/import-media/source-sets.md +190 -251
- package/assets/docs/guide/import-media.md +10 -8
- package/assets/docs/guide/insert-media/audio.md +202 -195
- package/assets/docs/guide/insert-media/images.md +190 -188
- package/assets/docs/guide/insert-media/position-and-align.md +284 -551
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +402 -418
- package/assets/docs/guide/insert-media/videos.md +236 -203
- package/assets/docs/guide/insert-media.md +10 -5
- package/assets/docs/guide/key-capabilities.md +36 -4
- package/assets/docs/guide/key-concepts.md +6 -4
- package/assets/docs/guide/licensing.md +6 -4
- package/assets/docs/guide/llms-txt.md +11 -7
- package/assets/docs/guide/open-the-editor/blank-canvas.md +102 -63
- package/assets/docs/guide/open-the-editor/from-image.md +157 -127
- package/assets/docs/guide/open-the-editor/from-template.md +131 -92
- package/assets/docs/guide/open-the-editor/from-video.md +204 -212
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +310 -360
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +716 -513
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +667 -695
- package/assets/docs/guide/open-the-editor/import-design.md +228 -266
- package/assets/docs/guide/open-the-editor/load-scene.md +72 -68
- package/assets/docs/guide/open-the-editor/overview.md +6 -4
- package/assets/docs/guide/open-the-editor/uri-resolver.md +160 -251
- package/assets/docs/guide/open-the-editor.md +11 -9
- package/assets/docs/guide/outlines/overview.md +12 -4
- package/assets/docs/guide/outlines/shadows-and-glows.md +105 -410
- package/assets/docs/guide/outlines/strokes.md +218 -166
- package/assets/docs/guide/outlines.md +9 -4
- package/assets/docs/guide/overview.md +14 -6
- package/assets/docs/guide/performance.md +220 -113
- package/assets/docs/guide/plugins/print-ready-pdf.md +273 -368
- package/assets/docs/guide/plugins.md +10 -16
- package/assets/docs/guide/rules/asset-handling.md +7 -18
- package/assets/docs/guide/rules/common-pitfalls.md +25 -42
- package/assets/docs/guide/rules/content-fill-mode.md +4 -4
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +398 -567
- package/assets/docs/guide/rules/lock-content.md +188 -231
- package/assets/docs/guide/rules/moderate-content.md +580 -571
- package/assets/docs/guide/rules/overview.md +345 -380
- package/assets/docs/guide/rules/silent-init-errors.md +4 -1
- package/assets/docs/guide/rules/verify-properties-before-use.md +2 -11
- package/assets/docs/guide/rules.md +10 -5
- package/assets/docs/guide/security.md +7 -5
- package/assets/docs/guide/serve-assets.md +57 -284
- package/assets/docs/guide/settings.md +96 -74
- package/assets/docs/guide/shapes.md +10 -5
- package/assets/docs/guide/stickers-and-shapes/combine.md +397 -583
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +181 -268
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +418 -431
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +147 -226
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +138 -123
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +151 -149
- package/assets/docs/guide/stickers.md +9 -4
- package/assets/docs/guide/text/add.md +470 -482
- package/assets/docs/guide/text/adjust-spacing.md +179 -214
- package/assets/docs/guide/text/auto-size.md +210 -271
- package/assets/docs/guide/text/edit.md +294 -309
- package/assets/docs/guide/text/effects.md +154 -190
- package/assets/docs/guide/text/emojis.md +199 -232
- package/assets/docs/guide/text/language-support.md +369 -382
- package/assets/docs/guide/text/overview.md +41 -4
- package/assets/docs/guide/text/styling.md +239 -273
- package/assets/docs/guide/text/text-designs.md +405 -544
- package/assets/docs/guide/text.md +10 -9
- package/assets/docs/guide/to-v1-19.md +12 -10
- package/assets/docs/guide/upgrade.md +8 -9
- package/assets/docs/guide/use-templates/apply-template.md +174 -163
- package/assets/docs/guide/use-templates/generate.md +171 -152
- package/assets/docs/guide/use-templates/overview.md +32 -4
- package/assets/docs/guide/use-templates/programmatic.md +266 -301
- package/assets/docs/guide/use-templates/replace-content.md +181 -171
- package/assets/docs/guide/what-is-cesdk.md +71 -282
- package/assets/docs/handbook/SKILL.md +24 -0
- package/dist/assets/inline.generated.d.ts.map +1 -1
- package/dist/assets/inline.generated.js +544 -406
- package/dist/assets/inline.generated.js.map +1 -1
- package/dist/assets/load-browser.d.ts +1 -1
- package/dist/assets/load-browser.js +1 -1
- package/dist/assets/load-browser.js.map +1 -1
- package/dist/assets/load-node.d.ts +1 -1
- package/dist/assets/load-node.js +1 -1
- package/dist/assets/load-node.js.map +1 -1
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +4 -28
- package/dist/cli/http.js.map +1 -1
- package/dist/cli/redirect-console.d.ts +1 -1
- package/dist/cli/redirect-console.d.ts.map +1 -1
- package/dist/cli/redirect-console.js +12 -3
- package/dist/cli/redirect-console.js.map +1 -1
- package/dist/cli/resolve-license.d.ts.map +1 -1
- package/dist/cli/resolve-license.js +8 -6
- package/dist/cli/resolve-license.js.map +1 -1
- package/dist/cli/stdio.d.ts +9 -0
- package/dist/cli/stdio.d.ts.map +1 -1
- package/dist/cli/stdio.js +48 -4
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/diagnostics/bundle.d.ts +10 -0
- package/dist/diagnostics/bundle.d.ts.map +1 -0
- package/dist/diagnostics/bundle.js +148 -0
- package/dist/diagnostics/bundle.js.map +1 -0
- package/dist/diagnostics/compose.d.ts +3 -0
- package/dist/diagnostics/compose.d.ts.map +1 -0
- package/dist/diagnostics/compose.js +15 -0
- package/dist/diagnostics/compose.js.map +1 -0
- package/dist/diagnostics/events.d.ts +34 -0
- package/dist/diagnostics/events.d.ts.map +1 -0
- package/dist/diagnostics/events.js +3 -0
- package/dist/diagnostics/events.js.map +1 -0
- package/dist/diagnostics/file-sink.d.ts +38 -0
- package/dist/diagnostics/file-sink.d.ts.map +1 -0
- package/dist/diagnostics/file-sink.js +157 -0
- package/dist/diagnostics/file-sink.js.map +1 -0
- package/dist/diagnostics/redact.d.ts +7 -0
- package/dist/diagnostics/redact.d.ts.map +1 -0
- package/dist/diagnostics/redact.js +43 -0
- package/dist/diagnostics/redact.js.map +1 -0
- package/dist/diagnostics/tool-call-adapter.d.ts +4 -0
- package/dist/diagnostics/tool-call-adapter.d.ts.map +1 -0
- package/dist/diagnostics/tool-call-adapter.js +21 -0
- package/dist/diagnostics/tool-call-adapter.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +5 -1
- package/dist/engine/cesdk-adapter.d.ts.map +1 -1
- package/dist/engine/cesdk-adapter.js +9 -2
- package/dist/engine/cesdk-adapter.js.map +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +4 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/scene-resource-schemes.d.ts +2 -0
- package/dist/engine/scene-resource-schemes.d.ts.map +1 -0
- package/dist/engine/scene-resource-schemes.js +20 -0
- package/dist/engine/scene-resource-schemes.js.map +1 -0
- package/dist/http/server.d.ts +0 -6
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +1 -2
- package/dist/http/server.js.map +1 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -60
- package/dist/server.js.map +1 -1
- package/dist/test/scripts/changelog-add.d.ts +8 -0
- package/dist/test/scripts/changelog-add.d.ts.map +1 -0
- package/dist/test/scripts/changelog-add.js +50 -0
- package/dist/test/scripts/changelog-add.js.map +1 -0
- package/dist/test/scripts/changelog-collate.d.ts +38 -0
- package/dist/test/scripts/changelog-collate.d.ts.map +1 -0
- package/dist/test/scripts/changelog-collate.js +171 -0
- package/dist/test/scripts/changelog-collate.js.map +1 -0
- package/dist/test/test/changelog.test.d.ts +2 -0
- package/dist/test/test/changelog.test.d.ts.map +1 -0
- package/dist/test/test/changelog.test.js +293 -0
- package/dist/test/test/changelog.test.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +10 -3
- package/dist/test/test/cli/dispatcher.test.js.map +1 -1
- package/dist/test/test/cli/redirect-console.test.js +31 -0
- package/dist/test/test/cli/redirect-console.test.js.map +1 -1
- package/dist/test/test/cli/resolve-license.test.js +10 -1
- package/dist/test/test/cli/resolve-license.test.js.map +1 -1
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts +2 -0
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts.map +1 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js +31 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js.map +1 -0
- package/dist/test/test/config.test.js +17 -13
- package/dist/test/test/config.test.js.map +1 -1
- package/dist/test/test/diagnostics/bundle.test.d.ts +2 -0
- package/dist/test/test/diagnostics/bundle.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/bundle.test.js +53 -0
- package/dist/test/test/diagnostics/bundle.test.js.map +1 -0
- package/dist/test/test/diagnostics/compose.test.d.ts +2 -0
- package/dist/test/test/diagnostics/compose.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/compose.test.js +31 -0
- package/dist/test/test/diagnostics/compose.test.js.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts +2 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.js +113 -0
- package/dist/test/test/diagnostics/file-sink.test.js.map +1 -0
- package/dist/test/test/diagnostics/redact.test.d.ts +2 -0
- package/dist/test/test/diagnostics/redact.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/redact.test.js +59 -0
- package/dist/test/test/diagnostics/redact.test.js.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts +2 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js +34 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts +2 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.js +32 -0
- package/dist/test/test/engine/cesdk-adapter.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.js +6 -2
- package/dist/test/test/handbook-contract.test.js.map +1 -1
- package/dist/test/test/http/server.test.js +0 -36
- package/dist/test/test/http/server.test.js.map +1 -1
- package/dist/test/test/http/workspace-auth.test.js +0 -1
- package/dist/test/test/http/workspace-auth.test.js.map +1 -1
- package/dist/test/test/server.test.js +0 -40
- package/dist/test/test/server.test.js.map +1 -1
- package/dist/test/test/tools/edit-harness.d.ts +14 -0
- package/dist/test/test/tools/edit-harness.d.ts.map +1 -0
- package/dist/test/test/tools/edit-harness.js +30 -0
- package/dist/test/test/tools/edit-harness.js.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.js +46 -0
- package/dist/test/test/tools/edit.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/export-harness.d.ts +13 -0
- package/dist/test/test/tools/export-harness.d.ts.map +1 -0
- package/dist/test/test/tools/export-harness.js +27 -0
- package/dist/test/test/tools/export-harness.js.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.js +65 -0
- package/dist/test/test/tools/export.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/import.test.d.ts +2 -0
- package/dist/test/test/tools/import.test.d.ts.map +1 -0
- package/dist/test/test/tools/import.test.js +122 -0
- package/dist/test/test/tools/import.test.js.map +1 -0
- package/dist/test/test/tools/index.test.js +78 -16
- package/dist/test/test/tools/index.test.js.map +1 -1
- package/dist/test/test/tools/load.integration.test.d.ts +2 -0
- package/dist/test/test/tools/load.integration.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.integration.test.js +165 -0
- package/dist/test/test/tools/load.integration.test.js.map +1 -0
- package/dist/test/test/tools/load.test.d.ts +2 -0
- package/dist/test/test/tools/load.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.test.js +387 -0
- package/dist/test/test/tools/load.test.js.map +1 -0
- package/dist/test/test/tools/preview-harness.d.ts +9 -0
- package/dist/test/test/tools/preview-harness.d.ts.map +1 -0
- package/dist/test/test/tools/preview-harness.js +23 -0
- package/dist/test/test/tools/preview-harness.js.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.js +36 -0
- package/dist/test/test/tools/preview.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.d.ts +13 -0
- package/dist/test/test/tools/schema-best-practices.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.js +169 -0
- package/dist/test/test/tools/schema-best-practices.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts +3 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.js +194 -0
- package/dist/test/test/tools/schema-best-practices.test.js.map +1 -0
- package/dist/test/test/tools/spans.test.d.ts +2 -0
- package/dist/test/test/tools/spans.test.d.ts.map +1 -0
- package/dist/test/test/tools/spans.test.js +84 -0
- package/dist/test/test/tools/spans.test.js.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts +2 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js +19 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js.map +1 -0
- package/dist/test/test/viewer/config-route.test.d.ts +2 -0
- package/dist/test/test/viewer/config-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/config-route.test.js +28 -0
- package/dist/test/test/viewer/config-route.test.js.map +1 -0
- package/dist/test/test/viewer/spa-version.test.d.ts +2 -0
- package/dist/test/test/viewer/spa-version.test.d.ts.map +1 -0
- package/dist/test/test/viewer/spa-version.test.js +14 -0
- package/dist/test/test/viewer/spa-version.test.js.map +1 -0
- package/dist/test/test/workspace/content-hash.test.d.ts +2 -0
- package/dist/test/test/workspace/content-hash.test.d.ts.map +1 -0
- package/dist/test/test/workspace/content-hash.test.js +17 -0
- package/dist/test/test/workspace/content-hash.test.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -1
- package/dist/test/vitest.config.js +1 -1
- package/dist/test/vitest.config.js.map +1 -1
- package/dist/tools/asset-generate.d.ts.map +1 -1
- package/dist/tools/asset-generate.js +1 -8
- package/dist/tools/asset-generate.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +145 -96
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/export.d.ts +3 -0
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +146 -108
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/import.d.ts +12 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +144 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +44 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/load.d.ts +26 -0
- package/dist/tools/load.d.ts.map +1 -0
- package/dist/tools/load.js +400 -0
- package/dist/tools/load.js.map +1 -0
- package/dist/tools/preview.d.ts +3 -0
- package/dist/tools/preview.d.ts.map +1 -1
- package/dist/tools/preview.js +79 -44
- package/dist/tools/preview.js.map +1 -1
- package/dist/tools/result.d.ts +1 -1
- package/dist/tools/result.js +2 -2
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/spans.d.ts +45 -0
- package/dist/tools/spans.d.ts.map +1 -0
- package/dist/tools/spans.js +77 -0
- package/dist/tools/spans.js.map +1 -0
- package/dist/tools/telemetry-wrapper.d.ts +4 -0
- package/dist/tools/telemetry-wrapper.d.ts.map +1 -0
- package/dist/tools/telemetry-wrapper.js +43 -0
- package/dist/tools/telemetry-wrapper.js.map +1 -0
- package/dist/viewer/cesdk-cdn.d.ts +16 -0
- package/dist/viewer/cesdk-cdn.d.ts.map +1 -0
- package/dist/viewer/cesdk-cdn.js +30 -0
- package/dist/viewer/cesdk-cdn.js.map +1 -0
- package/dist/viewer/router.d.ts +6 -0
- package/dist/viewer/router.d.ts.map +1 -1
- package/dist/viewer/router.js +4 -1
- package/dist/viewer/router.js.map +1 -1
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
- package/dist/viewer/spa-assets.generated.js +2 -3
- package/dist/viewer/spa-assets.generated.js.map +1 -1
- package/dist/workspace/content-hash.d.ts +2 -0
- package/dist/workspace/content-hash.d.ts.map +1 -0
- package/dist/workspace/content-hash.js +15 -0
- package/dist/workspace/content-hash.js.map +1 -0
- package/package.json +18 -9
- package/assets/docs/guide/actions.md +0 -1038
- package/assets/docs/guide/animation/overview.md +0 -22
- package/assets/docs/guide/automation/batch-processing.md +0 -474
- package/assets/docs/guide/browser-support.md +0 -38
- package/assets/docs/guide/concepts/edit-modes.md +0 -431
- package/assets/docs/guide/concepts/headless-mode/browser.md +0 -291
- package/assets/docs/guide/create-audio/audio.md +0 -336
- package/assets/docs/guide/create-video/overview.md +0 -224
- package/assets/docs/guide/create-video/timeline-editor.md +0 -622
- package/assets/docs/guide/create-video/update-caption-presets.md +0 -676
- package/assets/docs/guide/edit-image/vectorize.md +0 -204
- package/assets/docs/guide/export-save-publish/export/to-html5.md +0 -474
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +0 -364
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +0 -175
- package/assets/docs/guide/grid-and-rulers.md +0 -222
- package/assets/docs/guide/guides/text/rendering-internals.md +0 -796
- package/assets/docs/guide/import-media/asset-library.md +0 -23
- package/assets/docs/guide/import-media/asset-panel/basics.md +0 -324
- package/assets/docs/guide/import-media/asset-panel/customize.md +0 -478
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +0 -633
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +0 -137
- package/assets/docs/guide/import-media/capture-from-camera.md +0 -20
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +0 -438
- package/assets/docs/guide/import-media/from-local-source.md +0 -20
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +0 -627
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +0 -625
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +0 -692
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +0 -497
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +0 -51
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +0 -914
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +0 -764
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +0 -228
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +0 -303
- package/assets/docs/guide/plugins/asset-sources.md +0 -553
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +0 -748
- package/assets/docs/guide/starterkits/advanced-editor.md +0 -698
- package/assets/docs/guide/starterkits/advanced-video-editor.md +0 -696
- package/assets/docs/guide/starterkits/ai-editor.md +0 -749
- package/assets/docs/guide/starterkits/airtable-image-editor.md +0 -672
- package/assets/docs/guide/starterkits/apparel-ui.md +0 -188
- package/assets/docs/guide/starterkits/assets.md +0 -27
- package/assets/docs/guide/starterkits/auto-resize.md +0 -586
- package/assets/docs/guide/starterkits/automated-video-generation.md +0 -692
- package/assets/docs/guide/starterkits/background-removal-editor.md +0 -480
- package/assets/docs/guide/starterkits/content-moderation.md +0 -863
- package/assets/docs/guide/starterkits/creative-automation.md +0 -28
- package/assets/docs/guide/starterkits/custom-built-uis.md +0 -26
- package/assets/docs/guide/starterkits/customization.md +0 -29
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +0 -470
- package/assets/docs/guide/starterkits/data-merge.md +0 -850
- package/assets/docs/guide/starterkits/design-editor.md +0 -698
- package/assets/docs/guide/starterkits/design-generation.md +0 -719
- package/assets/docs/guide/starterkits/design-validation.md +0 -808
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +0 -14
- package/assets/docs/guide/starterkits/export-options.md +0 -724
- package/assets/docs/guide/starterkits/export-using-renderer.md +0 -708
- package/assets/docs/guide/starterkits/extensibility.md +0 -28
- package/assets/docs/guide/starterkits/force-crop-editor.md +0 -675
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +0 -522
- package/assets/docs/guide/starterkits/getty-images-editor.md +0 -700
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +0 -719
- package/assets/docs/guide/starterkits/indesign-template-import.md +0 -580
- package/assets/docs/guide/starterkits/layouts-editor.md +0 -724
- package/assets/docs/guide/starterkits/mobile-ui.md +0 -185
- package/assets/docs/guide/starterkits/mockup-editor.md +0 -745
- package/assets/docs/guide/starterkits/multi-image-generation.md +0 -542
- package/assets/docs/guide/starterkits/page-sizes-editor.md +0 -657
- package/assets/docs/guide/starterkits/pexels-image-editor.md +0 -665
- package/assets/docs/guide/starterkits/photo-editor.md +0 -755
- package/assets/docs/guide/starterkits/photo-ui.md +0 -186
- package/assets/docs/guide/starterkits/photobook-ui.md +0 -188
- package/assets/docs/guide/starterkits/placeholders.md +0 -678
- package/assets/docs/guide/starterkits/player.md +0 -405
- package/assets/docs/guide/starterkits/plugins.md +0 -25
- package/assets/docs/guide/starterkits/postcard-editor.md +0 -202
- package/assets/docs/guide/starterkits/pptx-template-import.md +0 -581
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +0 -746
- package/assets/docs/guide/starterkits/product-editor.md +0 -773
- package/assets/docs/guide/starterkits/psd-template-import.md +0 -580
- package/assets/docs/guide/starterkits/qr-code-editor.md +0 -470
- package/assets/docs/guide/starterkits/single-page-editor.md +0 -661
- package/assets/docs/guide/starterkits/start-with-image.md +0 -684
- package/assets/docs/guide/starterkits/start-with-video.md +0 -651
- package/assets/docs/guide/starterkits/t-shirt-designer.md +0 -742
- package/assets/docs/guide/starterkits/templating.md +0 -23
- package/assets/docs/guide/starterkits/theming.md +0 -662
- package/assets/docs/guide/starterkits/translation-internationalization.md +0 -662
- package/assets/docs/guide/starterkits/unsplash-editor.md +0 -839
- package/assets/docs/guide/starterkits/vectorizer-editor.md +0 -466
- package/assets/docs/guide/starterkits/version-history.md +0 -745
- package/assets/docs/guide/starterkits/video-animations.md +0 -853
- package/assets/docs/guide/starterkits/video-captions.md +0 -884
- package/assets/docs/guide/starterkits/video-editing.md +0 -25
- package/assets/docs/guide/starterkits/video-editor.md +0 -696
- package/assets/docs/guide/starterkits/video-export-options.md +0 -676
- package/assets/docs/guide/starterkits/viewer.md +0 -400
- package/assets/docs/guide/starterkits.md +0 -41
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +0 -362
- package/assets/docs/guide/text/custom-fonts.md +0 -401
- package/assets/docs/guide/text/decorations.md +0 -330
- package/assets/docs/guide/text/enumerations.md +0 -258
- package/assets/docs/guide/to-v1-10.md +0 -131
- package/assets/docs/guide/to-v1-13.md +0 -165
- package/assets/docs/guide/to-v1-32.md +0 -110
- package/assets/docs/guide/to-v1-69.md +0 -468
- package/assets/docs/guide/to-v1-72.md +0 -193
- package/assets/docs/guide/use-templates/library.md +0 -450
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +0 -428
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +0 -337
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +0 -853
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +0 -1045
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +0 -641
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +0 -966
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +0 -99
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +0 -498
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +0 -493
- package/assets/docs/guide/user-interface/ai-integration.md +0 -30
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +0 -316
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +0 -509
- package/assets/docs/guide/user-interface/appearance/icons.md +0 -373
- package/assets/docs/guide/user-interface/appearance/theming.md +0 -665
- package/assets/docs/guide/user-interface/appearance.md +0 -23
- package/assets/docs/guide/user-interface/build-your-own-ui.md +0 -620
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +0 -412
- package/assets/docs/guide/user-interface/customization/canvas.md +0 -281
- package/assets/docs/guide/user-interface/customization/color-palette.md +0 -413
- package/assets/docs/guide/user-interface/customization/crop-presets.md +0 -384
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +0 -676
- package/assets/docs/guide/user-interface/customization/dock.md +0 -399
- package/assets/docs/guide/user-interface/customization/force-crop.md +0 -289
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +0 -371
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +0 -516
- package/assets/docs/guide/user-interface/customization/page-format.md +0 -436
- package/assets/docs/guide/user-interface/customization/panel.md +0 -605
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +0 -531
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +0 -358
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +0 -374
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +0 -323
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +0 -294
- package/assets/docs/guide/user-interface/customization/quick-start.md +0 -12
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +0 -519
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +0 -333
- package/assets/docs/guide/user-interface/customization/reference.md +0 -12
- package/assets/docs/guide/user-interface/customization.md +0 -39
- package/assets/docs/guide/user-interface/localization.md +0 -633
- package/assets/docs/guide/user-interface/overview.md +0 -167
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +0 -411
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +0 -721
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +0 -331
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +0 -553
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +0 -672
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +0 -415
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +0 -521
- package/assets/docs/guide/user-interface/ui-extensions.md +0 -26
- package/assets/docs/guide/user-interface.md +0 -25
- package/assets/prompts/evals-assetGenerate.md +0 -12
- package/assets/prompts/evals-brutalistCore.md +0 -34
- package/assets/prompts/evals-danskCatalogue.md +0 -31
- package/assets/prompts/evals-exportRoundTrip.md +0 -12
- package/assets/prompts/evals-inspectPriorCode.md +0 -16
- package/assets/prompts/evals-listProjectFiles.md +0 -6
- package/assets/prompts/evals-readAndExplainScript.md +0 -6
- package/assets/prompts/evals-resumeAcrossRestart.md +0 -15
- package/assets/prompts/evals-rewindRecovery.md +0 -10
- package/assets/prompts/evals-searchAcrossFiles.md +0 -6
- package/assets/prompts/evals-weddingCard.md +0 -20
- package/assets/prompts/explain.md +0 -6
- package/assets/prompts/review.md +0 -6
- package/dist/frontmatter.d.ts +0 -15
- package/dist/frontmatter.d.ts.map +0 -1
- package/dist/frontmatter.js +0 -46
- package/dist/frontmatter.js.map +0 -1
- package/dist/test/test/frontmatter.test.d.ts +0 -2
- package/dist/test/test/frontmatter.test.d.ts.map +0 -1
- package/dist/test/test/frontmatter.test.js +0 -55
- package/dist/test/test/frontmatter.test.js.map +0 -1
package/dist/tools/index.js
CHANGED
|
@@ -14,12 +14,15 @@ import { createAssetSearchTool } from './asset-search.js';
|
|
|
14
14
|
import { createEditTool } from './edit.js';
|
|
15
15
|
import { createExportTool } from './export.js';
|
|
16
16
|
import { createHistoryTool } from './history.js';
|
|
17
|
+
import { createImportTool } from './import.js';
|
|
17
18
|
import { createInspectTool } from './inspect.js';
|
|
18
19
|
import { createListTool } from './list.js';
|
|
20
|
+
import { createLoadTool } from './load.js';
|
|
19
21
|
import { createOpenEditorTool } from './open-editor.js';
|
|
20
22
|
import { createPreviewTool } from './preview.js';
|
|
21
23
|
import { createRenameTool } from './rename.js';
|
|
22
24
|
import { createSaveTool } from './save.js';
|
|
25
|
+
import { wrapWithTelemetry } from './telemetry-wrapper.js';
|
|
23
26
|
// Beta kill-switch for asset_generate. Off for the beta (the feature isn't
|
|
24
27
|
// supported yet); set to true to re-expose the tool once it ships.
|
|
25
28
|
const ASSET_GENERATE_ENABLED = false;
|
|
@@ -31,12 +34,14 @@ export function buildDesignToolRegistrations(opts) {
|
|
|
31
34
|
engineLock: opts.engineLock,
|
|
32
35
|
onLeafWritten: opts.onLeafWritten,
|
|
33
36
|
renderThumbnail: opts.renderThumbnail,
|
|
34
|
-
fs: opts.fs
|
|
37
|
+
fs: opts.fs,
|
|
38
|
+
telemetry: opts.telemetry
|
|
35
39
|
}),
|
|
36
40
|
createPreviewTool({
|
|
37
41
|
store: opts.store,
|
|
38
42
|
session: opts.session,
|
|
39
|
-
engineLock: opts.engineLock
|
|
43
|
+
engineLock: opts.engineLock,
|
|
44
|
+
telemetry: opts.telemetry
|
|
40
45
|
}),
|
|
41
46
|
createExportTool({
|
|
42
47
|
fs: opts.fs,
|
|
@@ -44,7 +49,8 @@ export function buildDesignToolRegistrations(opts) {
|
|
|
44
49
|
session: opts.session,
|
|
45
50
|
engineLock: opts.engineLock,
|
|
46
51
|
urlBuilder: opts.urlBuilder,
|
|
47
|
-
allowOutPath: opts.allowOutPath
|
|
52
|
+
allowOutPath: opts.allowOutPath,
|
|
53
|
+
telemetry: opts.telemetry
|
|
48
54
|
}),
|
|
49
55
|
createSaveTool({
|
|
50
56
|
fs: opts.fs,
|
|
@@ -54,6 +60,17 @@ export function buildDesignToolRegistrations(opts) {
|
|
|
54
60
|
urlBuilder: opts.urlBuilder,
|
|
55
61
|
allowOutPath: opts.allowOutPath
|
|
56
62
|
}),
|
|
63
|
+
createLoadTool({
|
|
64
|
+
fs: opts.fs,
|
|
65
|
+
store: opts.store,
|
|
66
|
+
session: opts.session,
|
|
67
|
+
engineLock: opts.engineLock,
|
|
68
|
+
// Same Local-only disk gate as save/export's outPath: a `{ path }`
|
|
69
|
+
// source only makes sense where the process shares a disk with the user.
|
|
70
|
+
allowPath: opts.allowOutPath,
|
|
71
|
+
onLeafWritten: opts.onLeafWritten,
|
|
72
|
+
renderThumbnail: opts.renderThumbnail
|
|
73
|
+
}),
|
|
57
74
|
createListTool({ store: opts.store }),
|
|
58
75
|
createHistoryTool({ store: opts.store }),
|
|
59
76
|
createInspectTool({ store: opts.store }),
|
|
@@ -64,6 +81,18 @@ export function buildDesignToolRegistrations(opts) {
|
|
|
64
81
|
engineLock: opts.engineLock
|
|
65
82
|
})
|
|
66
83
|
];
|
|
84
|
+
// `import` is Local-only for now: its sole source arm (`{ path }`) needs a
|
|
85
|
+
// server that shares the caller's disk. On Hosted there is no byte transport
|
|
86
|
+
// until CODE-42, so we HIDE the tool there rather than show the model a tool
|
|
87
|
+
// whose every call would fail. `allowOutPath` is the same Local(true)/
|
|
88
|
+
// Hosted(false) signal export/save already use.
|
|
89
|
+
if (opts.allowOutPath) {
|
|
90
|
+
registrations.push(createImportTool({
|
|
91
|
+
fs: opts.fs,
|
|
92
|
+
urlBuilder: opts.urlBuilder,
|
|
93
|
+
allowLocalPath: true
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
67
96
|
// BETA: asset_generate is hidden for the beta — not supported yet, and we
|
|
68
97
|
// don't want the model to see a tool it can't use. The implementation
|
|
69
98
|
// (asset-generate.ts, gateway plumbing) is intentionally kept intact; flip
|
|
@@ -77,6 +106,17 @@ export function buildDesignToolRegistrations(opts) {
|
|
|
77
106
|
urlBuilder: opts.urlBuilder
|
|
78
107
|
}));
|
|
79
108
|
}
|
|
80
|
-
|
|
109
|
+
// Diagnostics coverage. The engine tools (edit/preview/export) self-report a
|
|
110
|
+
// rich ToolCallReport with phase spans (they were passed `telemetry` above).
|
|
111
|
+
// Wrap EVERY other tool so its calls are recorded too — args, result, timing,
|
|
112
|
+
// success — just with empty spans. Without a telemetry sink, nothing is
|
|
113
|
+
// wrapped (zero overhead, byte-equivalent to before).
|
|
114
|
+
if (!opts.telemetry)
|
|
115
|
+
return registrations;
|
|
116
|
+
const telemetry = opts.telemetry;
|
|
117
|
+
const selfReporting = new Set(['edit', 'preview', 'export']);
|
|
118
|
+
return registrations.map((registration) => selfReporting.has(registration.name)
|
|
119
|
+
? registration
|
|
120
|
+
: wrapWithTelemetry(registration, telemetry));
|
|
81
121
|
}
|
|
82
122
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/tools/index.ts\n//\n// Builds the design + workspace tool registrations from a fully-DI'd set of\n// primitives: the always-on design + workspace tools, plus `asset_generate`\n// — currently hidden for the beta (see ASSET_GENERATE_ENABLED below), and\n// otherwise gated on a usable gateway (Local: API_KEY set). A hidden tool\n// never shows up in tools/list, so the model won't attempt a call that can\n// only fail.\n// Each variant's CLI bootstrap (cli/stdio.ts, cli/http.ts)\n// constructs these primitives once and passes them in; this file owns no\n// engine bootstrap, no FS bootstrap, no gateway selection.\n\nimport type { Mutex } from '../engine/mutex.js';\nimport type { EngineSession } from '../engine/session.js';\nimport type { GatewayClient } from '../gateway/types.js';\nimport type { RevisionStore } from '../revisions/store.js';\nimport type { CodesignMcpToolRegistration } from '../server.js';\nimport type { ViewerUrlBuilder } from '../viewer/url-builder.js';\nimport type { WorkspaceFS } from '../workspace/types.js';\nimport { createAssetGenerateTool } from './asset-generate.js';\nimport { createAssetSearchTool } from './asset-search.js';\nimport { createEditTool } from './edit.js';\nimport { createExportTool } from './export.js';\nimport { createHistoryTool } from './history.js';\nimport { createInspectTool } from './inspect.js';\nimport { createListTool } from './list.js';\nimport { createOpenEditorTool } from './open-editor.js';\nimport { createPreviewTool } from './preview.js';\nimport { createRenameTool } from './rename.js';\nimport { createSaveTool } from './save.js';\n\n// Beta kill-switch for asset_generate. Off for the beta (the feature isn't\n// supported yet); set to true to re-expose the tool once it ships.\nconst ASSET_GENERATE_ENABLED = false;\n\nexport interface BuildDesignToolRegistrationsOptions<E = unknown> {\n fs: WorkspaceFS;\n store: RevisionStore;\n session: EngineSession<E>;\n /**\n * Serializes access to the shared CE.SDK engine across the edit/preview/\n * export tools. One engine today (process singleton) ⇒ one lock shared by\n * every session. See engine/mutex.ts and the bootstrap (cli/http.ts,\n * cli/stdio.ts) for where it is created.\n */\n engineLock: Mutex;\n gateway: GatewayClient;\n urlBuilder: ViewerUrlBuilder;\n /** True on Local (the `outPath?` escape hatch is allowed); false on Hosted/sandbox. */\n allowOutPath: boolean;\n /** Called when `edit` writes a new leaf revision (viewer SSE hook). */\n onLeafWritten?: (event: {\n revision: string;\n rootRevision: string;\n }) => void | Promise<void>;\n /** Render a thumbnail for a newly committed revision. Optional; best-effort. */\n renderThumbnail?: (event: {\n revision: string;\n engine: E;\n }) => Promise<Uint8Array>;\n}\n\nexport function buildDesignToolRegistrations<E = unknown>(\n opts: BuildDesignToolRegistrationsOptions<E>\n): CodesignMcpToolRegistration[] {\n const registrations: CodesignMcpToolRegistration[] = [\n createEditTool({\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n onLeafWritten: opts.onLeafWritten,\n renderThumbnail: opts.renderThumbnail,\n fs: opts.fs\n }),\n createPreviewTool({\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock\n }),\n createExportTool({\n fs: opts.fs,\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n urlBuilder: opts.urlBuilder,\n allowOutPath: opts.allowOutPath\n }),\n createSaveTool({\n fs: opts.fs,\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n urlBuilder: opts.urlBuilder,\n allowOutPath: opts.allowOutPath\n }),\n createListTool({ store: opts.store }),\n createHistoryTool({ store: opts.store }),\n createInspectTool({ store: opts.store }),\n createRenameTool({ store: opts.store }),\n createOpenEditorTool({ urlBuilder: opts.urlBuilder, store: opts.store }),\n createAssetSearchTool({\n session: opts.session,\n engineLock: opts.engineLock\n })\n ];\n\n // BETA: asset_generate is hidden for the beta — not supported yet, and we\n // don't want the model to see a tool it can't use. The implementation\n // (asset-generate.ts, gateway plumbing) is intentionally kept intact; flip\n // ASSET_GENERATE_ENABLED back to true to re-expose it. Hiding the tool also\n // drops the handbook/instructions hint, which keys off tool presence.\n // Opt-in: only expose asset_generate when the gateway can fulfil a request.\n if (ASSET_GENERATE_ENABLED && opts.gateway.available) {\n registrations.push(\n createAssetGenerateTool({\n gateway: opts.gateway,\n fs: opts.fs,\n urlBuilder: opts.urlBuilder\n })\n );\n }\n\n return registrations;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/tools/index.ts\n//\n// Builds the design + workspace tool registrations from a fully-DI'd set of\n// primitives: the always-on design + workspace tools, plus `asset_generate`\n// — currently hidden for the beta (see ASSET_GENERATE_ENABLED below), and\n// otherwise gated on a usable gateway (Local: API_KEY set). A hidden tool\n// never shows up in tools/list, so the model won't attempt a call that can\n// only fail.\n// Each variant's CLI bootstrap (cli/stdio.ts, cli/http.ts)\n// constructs these primitives once and passes them in; this file owns no\n// engine bootstrap, no FS bootstrap, no gateway selection.\n\nimport type { Mutex } from '../engine/mutex.js';\nimport type { EngineSession } from '../engine/session.js';\nimport type { GatewayClient } from '../gateway/types.js';\nimport type { RevisionStore } from '../revisions/store.js';\nimport type { CodesignMcpToolRegistration } from '../server.js';\nimport type { ViewerUrlBuilder } from '../viewer/url-builder.js';\nimport type { WorkspaceFS } from '../workspace/types.js';\nimport type { TelemetrySink } from './spans.js';\nimport { createAssetGenerateTool } from './asset-generate.js';\nimport { createAssetSearchTool } from './asset-search.js';\nimport { createEditTool } from './edit.js';\nimport { createExportTool } from './export.js';\nimport { createHistoryTool } from './history.js';\nimport { createImportTool } from './import.js';\nimport { createInspectTool } from './inspect.js';\nimport { createListTool } from './list.js';\nimport { createLoadTool } from './load.js';\nimport { createOpenEditorTool } from './open-editor.js';\nimport { createPreviewTool } from './preview.js';\nimport { createRenameTool } from './rename.js';\nimport { createSaveTool } from './save.js';\nimport { wrapWithTelemetry } from './telemetry-wrapper.js';\n\n// Beta kill-switch for asset_generate. Off for the beta (the feature isn't\n// supported yet); set to true to re-expose the tool once it ships.\nconst ASSET_GENERATE_ENABLED = false;\n\nexport interface BuildDesignToolRegistrationsOptions<E = unknown> {\n fs: WorkspaceFS;\n store: RevisionStore;\n session: EngineSession<E>;\n /**\n * Serializes access to the shared CE.SDK engine across the edit/preview/\n * export tools. One engine today (process singleton) ⇒ one lock shared by\n * every session. See engine/mutex.ts and the bootstrap (cli/http.ts,\n * cli/stdio.ts) for where it is created.\n */\n engineLock: Mutex;\n gateway: GatewayClient;\n urlBuilder: ViewerUrlBuilder;\n /** True on Local (the `outPath?` escape hatch is allowed); false on Hosted/sandbox. */\n allowOutPath: boolean;\n /** Called when `edit` writes a new leaf revision (viewer SSE hook). */\n onLeafWritten?: (event: {\n revision: string;\n rootRevision: string;\n }) => void | Promise<void>;\n /** Render a thumbnail for a newly committed revision. Optional; best-effort. */\n renderThumbnail?: (event: {\n revision: string;\n engine: E;\n }) => Promise<Uint8Array>;\n /** Diagnostics telemetry port, threaded into the engine tools (edit/preview/export). */\n telemetry?: TelemetrySink;\n}\n\nexport function buildDesignToolRegistrations<E = unknown>(\n opts: BuildDesignToolRegistrationsOptions<E>\n): CodesignMcpToolRegistration[] {\n const registrations: CodesignMcpToolRegistration[] = [\n createEditTool({\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n onLeafWritten: opts.onLeafWritten,\n renderThumbnail: opts.renderThumbnail,\n fs: opts.fs,\n telemetry: opts.telemetry\n }),\n createPreviewTool({\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n telemetry: opts.telemetry\n }),\n createExportTool({\n fs: opts.fs,\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n urlBuilder: opts.urlBuilder,\n allowOutPath: opts.allowOutPath,\n telemetry: opts.telemetry\n }),\n createSaveTool({\n fs: opts.fs,\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n urlBuilder: opts.urlBuilder,\n allowOutPath: opts.allowOutPath\n }),\n createLoadTool({\n fs: opts.fs,\n store: opts.store,\n session: opts.session,\n engineLock: opts.engineLock,\n // Same Local-only disk gate as save/export's outPath: a `{ path }`\n // source only makes sense where the process shares a disk with the user.\n allowPath: opts.allowOutPath,\n onLeafWritten: opts.onLeafWritten,\n renderThumbnail: opts.renderThumbnail\n }),\n createListTool({ store: opts.store }),\n createHistoryTool({ store: opts.store }),\n createInspectTool({ store: opts.store }),\n createRenameTool({ store: opts.store }),\n createOpenEditorTool({ urlBuilder: opts.urlBuilder, store: opts.store }),\n createAssetSearchTool({\n session: opts.session,\n engineLock: opts.engineLock\n })\n ];\n\n // `import` is Local-only for now: its sole source arm (`{ path }`) needs a\n // server that shares the caller's disk. On Hosted there is no byte transport\n // until CODE-42, so we HIDE the tool there rather than show the model a tool\n // whose every call would fail. `allowOutPath` is the same Local(true)/\n // Hosted(false) signal export/save already use.\n if (opts.allowOutPath) {\n registrations.push(\n createImportTool({\n fs: opts.fs,\n urlBuilder: opts.urlBuilder,\n allowLocalPath: true\n })\n );\n }\n\n // BETA: asset_generate is hidden for the beta — not supported yet, and we\n // don't want the model to see a tool it can't use. The implementation\n // (asset-generate.ts, gateway plumbing) is intentionally kept intact; flip\n // ASSET_GENERATE_ENABLED back to true to re-expose it. Hiding the tool also\n // drops the handbook/instructions hint, which keys off tool presence.\n // Opt-in: only expose asset_generate when the gateway can fulfil a request.\n if (ASSET_GENERATE_ENABLED && opts.gateway.available) {\n registrations.push(\n createAssetGenerateTool({\n gateway: opts.gateway,\n fs: opts.fs,\n urlBuilder: opts.urlBuilder\n })\n );\n }\n\n // Diagnostics coverage. The engine tools (edit/preview/export) self-report a\n // rich ToolCallReport with phase spans (they were passed `telemetry` above).\n // Wrap EVERY other tool so its calls are recorded too — args, result, timing,\n // success — just with empty spans. Without a telemetry sink, nothing is\n // wrapped (zero overhead, byte-equivalent to before).\n if (!opts.telemetry) return registrations;\n const telemetry = opts.telemetry;\n const selfReporting = new Set(['edit', 'preview', 'export']);\n return registrations.map((registration) =>\n selfReporting.has(registration.name)\n ? registration\n : wrapWithTelemetry(registration, telemetry)\n );\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Mutex } from '../engine/mutex.js';
|
|
2
|
+
import type { EngineSession } from '../engine/session.js';
|
|
3
|
+
import type { RevisionStore } from '../revisions/store.js';
|
|
4
|
+
import type { CodesignMcpToolRegistration } from '../server.js';
|
|
5
|
+
import type { WorkspaceFS } from '../workspace/types.js';
|
|
6
|
+
export interface CreateLoadToolOptions<E = unknown> {
|
|
7
|
+
fs: WorkspaceFS;
|
|
8
|
+
store: RevisionStore;
|
|
9
|
+
session: EngineSession<E>;
|
|
10
|
+
/** Guards the shared engine — load-then-explode must not interleave with another engine-touching call. */
|
|
11
|
+
engineLock: Mutex;
|
|
12
|
+
/** Whether to honour a `{ path }` source (Local: yes; Hosted/sandbox: no). */
|
|
13
|
+
allowPath?: boolean;
|
|
14
|
+
/** Called after the new root revision is written (viewer SSE hook). */
|
|
15
|
+
onLeafWritten?: (event: {
|
|
16
|
+
revision: string;
|
|
17
|
+
rootRevision: string;
|
|
18
|
+
}) => void | Promise<void>;
|
|
19
|
+
/** Render a thumbnail for the new revision. Best-effort: failures are swallowed. */
|
|
20
|
+
renderThumbnail?: (event: {
|
|
21
|
+
revision: string;
|
|
22
|
+
engine: E;
|
|
23
|
+
}) => Promise<Uint8Array>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createLoadTool<E = unknown>(opts: CreateLoadToolOptions<E>): CodesignMcpToolRegistration;
|
|
26
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/tools/load.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA8TzD,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChD,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1B,0GAA0G;IAC1G,UAAU,EAAE,KAAK,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,oFAAoF;IACpF,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,CAAC,CAAC;KACX,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,CAAC,GAAG,OAAO,EACxC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAC7B,2BAA2B,CAmK7B"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
// packages/codesign-mcp/src/tools/load.ts
|
|
2
|
+
//
|
|
3
|
+
// `load` — ingest a native CE.SDK `.scene` file or `.zip` scene archive as a
|
|
4
|
+
// NEW design root revision (the inverse of `save`). Archives are "exploded":
|
|
5
|
+
// after `loadFromArchiveURL` their bundled asset bytes live in the engine as
|
|
6
|
+
// ephemeral `buffer:` resources (which scene-level `saveToString` rejects —
|
|
7
|
+
// the CODE-3 bug); we extract each one into the content-addressed asset store
|
|
8
|
+
// (`assets/<sha>.<ext>`), relocate it to a durable `workspace://` URI, and
|
|
9
|
+
// only then serialize. Bare `.scene` files carry no asset bytes: they persist
|
|
10
|
+
// as-is, plus a classification report of every referenced asset URI.
|
|
11
|
+
//
|
|
12
|
+
// Both source variants normalize to bytes up front (fetch for `url`, disk
|
|
13
|
+
// read for `path` — Local only), then dispatch on the zip magic bytes.
|
|
14
|
+
// Archive bytes are staged to a temp file and loaded via a `file://` URL:
|
|
15
|
+
// scene-level CE.SDK v1.77 has no `loadFromArchive(path/bytes)`, only
|
|
16
|
+
// `loadFromArchiveURL`, and `file` is a first-class engine scheme.
|
|
17
|
+
import { promises as nodeFs } from 'node:fs';
|
|
18
|
+
import { tmpdir } from 'node:os';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { pathToFileURL } from 'node:url';
|
|
21
|
+
import { SCENE_ALLOWED_RESOURCE_SCHEMES } from '../engine/scene-resource-schemes.js';
|
|
22
|
+
import { shortHash } from '../workspace/content-hash.js';
|
|
23
|
+
const DESCRIPTION = [
|
|
24
|
+
'Load a native CE.SDK design — a `.scene` file or a `.zip` scene archive (e.g. a template) — as a NEW design root revision. The inverse of `save`.',
|
|
25
|
+
'',
|
|
26
|
+
'Source: `{ url }` (http/https) or `{ path }` (absolute local file path; Local only). Archives are ingested: bundled asset bytes are extracted into the workspace as content-addressed `assets/<sha>.<ext>` files, so the loaded design is durable and behaves exactly like a natively-built one.',
|
|
27
|
+
'',
|
|
28
|
+
'Returns JSON `{ revision, title }` — continue with `edit({ parent: revision, … })`. Bare `.scene` loads additionally return `assets`: a classification of every referenced asset URI by scheme (`workspace` / `external` / `bundle` / `transient` / `other`). External URLs are NOT fetched.'
|
|
29
|
+
].join('\n');
|
|
30
|
+
// The schema is built per-backend, like `save`'s outPath: the `{ path }`
|
|
31
|
+
// source arm is advertised ONLY where local disk paths exist (Local).
|
|
32
|
+
//
|
|
33
|
+
// `source` is a FLAT object with optional `url`/`path` — deliberately NOT a
|
|
34
|
+
// `oneOf` union. A `oneOf` here is the single construct most likely to break
|
|
35
|
+
// tool calling: OpenAI bans it in strict mode, and weaker models (e.g.
|
|
36
|
+
// openrouter:xiaomi/mimo-v2.5-pro, and Claude per samchon/openapi#88) serialize
|
|
37
|
+
// the whole union value as an escaped JSON string, which then fails validation.
|
|
38
|
+
// The "exactly one of url/path" invariant is enforced in `call` below, with a
|
|
39
|
+
// clear error message instead of an opaque oneOf mismatch. This mirrors
|
|
40
|
+
// `import`'s `source` shape. See test/tools/schema-best-practices.test.ts.
|
|
41
|
+
function buildLoadInputSchema(allowPath) {
|
|
42
|
+
const sourceProperties = {
|
|
43
|
+
url: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'http(s) URL of a `.scene` file or `.zip` scene archive.'
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
if (allowPath) {
|
|
49
|
+
sourceProperties.path = {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Absolute local file path of a `.scene` file or `.zip` scene archive. Local-only.'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
type: 'object',
|
|
56
|
+
properties: {
|
|
57
|
+
source: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
description: allowPath
|
|
60
|
+
? 'The design to load. Provide exactly one of `url` (http/https) or `path` (absolute local file path; Local only).'
|
|
61
|
+
: 'The design to load. Provide `url` (http/https).',
|
|
62
|
+
properties: sourceProperties,
|
|
63
|
+
additionalProperties: false
|
|
64
|
+
},
|
|
65
|
+
title: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: "Display name for the new design. Defaults to the source file's basename."
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
required: ['source'],
|
|
71
|
+
additionalProperties: false
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Standard zip local-file-header magic: PK\x03\x04. */
|
|
75
|
+
function isZip(bytes) {
|
|
76
|
+
return (bytes.length >= 4 &&
|
|
77
|
+
bytes[0] === 0x50 &&
|
|
78
|
+
bytes[1] === 0x4b &&
|
|
79
|
+
bytes[2] === 0x03 &&
|
|
80
|
+
bytes[3] === 0x04);
|
|
81
|
+
}
|
|
82
|
+
/** Basename of the source, minus a `.zip`/`.scene` extension. */
|
|
83
|
+
function deriveTitle(source) {
|
|
84
|
+
let base;
|
|
85
|
+
if ('url' in source) {
|
|
86
|
+
const raw = new URL(source.url).pathname.split('/').pop() ?? '';
|
|
87
|
+
try {
|
|
88
|
+
base = decodeURIComponent(raw);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
base = raw; // malformed percent sequence — use the basename as-is
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Local paths are literal filenames — never percent-decode them.
|
|
96
|
+
base = source.path.split('/').pop() ?? '';
|
|
97
|
+
}
|
|
98
|
+
const name = base.replace(/\.(zip|scene)$/i, '');
|
|
99
|
+
return name === '' ? undefined : name;
|
|
100
|
+
}
|
|
101
|
+
// Broad enough for what CE.SDK archives actually bundle (images, fonts,
|
|
102
|
+
// audio/video). Unknown types get a neutral `.bin` — the workspace store and
|
|
103
|
+
// the /r/ route are extension-agnostic.
|
|
104
|
+
const MIME_EXT = {
|
|
105
|
+
'image/png': 'png',
|
|
106
|
+
'image/jpeg': 'jpg',
|
|
107
|
+
'image/webp': 'webp',
|
|
108
|
+
'image/gif': 'gif',
|
|
109
|
+
'image/svg+xml': 'svg',
|
|
110
|
+
'video/mp4': 'mp4',
|
|
111
|
+
'video/quicktime': 'mov',
|
|
112
|
+
'audio/mpeg': 'mp3',
|
|
113
|
+
'audio/wav': 'wav',
|
|
114
|
+
'audio/x-wav': 'wav',
|
|
115
|
+
'audio/mp4': 'm4a',
|
|
116
|
+
'font/ttf': 'ttf',
|
|
117
|
+
'font/otf': 'otf',
|
|
118
|
+
'font/woff': 'woff',
|
|
119
|
+
'font/woff2': 'woff2',
|
|
120
|
+
'application/x-font-ttf': 'ttf',
|
|
121
|
+
'application/font-sfnt': 'ttf'
|
|
122
|
+
};
|
|
123
|
+
function extForMime(mime) {
|
|
124
|
+
return MIME_EXT[mime] ?? 'bin';
|
|
125
|
+
}
|
|
126
|
+
function concatChunks(chunks) {
|
|
127
|
+
const total = chunks.reduce((n, c) => n + c.byteLength, 0);
|
|
128
|
+
const out = new Uint8Array(total);
|
|
129
|
+
let offset = 0;
|
|
130
|
+
for (const c of chunks) {
|
|
131
|
+
out.set(c, offset);
|
|
132
|
+
offset += c.byteLength;
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Persist one engine resource's bytes into the content-addressed asset store
|
|
138
|
+
* and return its workspace-relative path. Identical bytes land at the
|
|
139
|
+
* identical path regardless of caller (automatic dedup).
|
|
140
|
+
*/
|
|
141
|
+
async function persistResourceBytes(eng, fs, uri) {
|
|
142
|
+
const chunks = [];
|
|
143
|
+
eng.editor.getResourceData(uri, 1 << 20, (chunk) => {
|
|
144
|
+
chunks.push(chunk.slice()); // copy — the engine may reuse the buffer
|
|
145
|
+
return true;
|
|
146
|
+
});
|
|
147
|
+
const bytes = concatChunks(chunks);
|
|
148
|
+
const sha = await shortHash(bytes);
|
|
149
|
+
const ext = extForMime(await eng.editor.getMimeType(uri));
|
|
150
|
+
const relPath = `assets/${sha}.${ext}`;
|
|
151
|
+
if (!(await fs.exists(relPath))) {
|
|
152
|
+
await fs.writeFile(relPath, bytes);
|
|
153
|
+
}
|
|
154
|
+
return relPath;
|
|
155
|
+
}
|
|
156
|
+
/** The engine's error code when a serialized scene still carries a scheme
|
|
157
|
+
* outside `allowedResourceSchemes` (e.g. a lingering `buffer:`). */
|
|
158
|
+
const DISALLOWED_SCHEMES_CODE = 'SCENE.DISALLOWED_SCHEMES';
|
|
159
|
+
function isDisallowedSchemesError(err) {
|
|
160
|
+
return (err instanceof Error &&
|
|
161
|
+
err.code === DISALLOWED_SCHEMES_CODE);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Extract every transient (`buffer:`) resource into the content-addressed
|
|
165
|
+
* asset store and relocate it to its durable `workspace://` URI, then
|
|
166
|
+
* serialize with the shared scene-scheme allowlist (which permits `workspace`
|
|
167
|
+
* but not `buffer` — see scene-resource-schemes.ts), so a missed transient
|
|
168
|
+
* still fails loudly instead of silently persisting an unloadable scene.
|
|
169
|
+
*/
|
|
170
|
+
async function explodeArchiveIntoWorkspace(eng, fs) {
|
|
171
|
+
// Persist + relocate every transient, remembering each URL's workspace path.
|
|
172
|
+
const persistedByUrl = new Map();
|
|
173
|
+
for (const resource of eng.editor.findAllTransientResources()) {
|
|
174
|
+
const relPath = await persistResourceBytes(eng, fs, resource.URL);
|
|
175
|
+
persistedByUrl.set(resource.URL, relPath);
|
|
176
|
+
eng.editor.relocateResource(resource.URL, `workspace://${relPath}`);
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
// Common case: every transient relocated cleanly, so no scheme is disallowed.
|
|
180
|
+
return await eng.scene.saveToString({
|
|
181
|
+
allowedResourceSchemes: SCENE_ALLOWED_RESOURCE_SCHEMES
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
if (!isDisallowedSchemesError(err))
|
|
186
|
+
throw err;
|
|
187
|
+
// A duplicate-content transient survived: relocateResource no-ops when two
|
|
188
|
+
// transients share a content-addressed target (seen with duplicated fonts
|
|
189
|
+
// in premium-template archives), so the engine still serializes that
|
|
190
|
+
// straggler's buffer: URL. Retry with a drain callback that rewrites it in
|
|
191
|
+
// the OUTPUT to its already-persisted workspace:// form.
|
|
192
|
+
//
|
|
193
|
+
// Two engine constraints shape this (CE.SDK v1.77): (1) the callback MUST
|
|
194
|
+
// NOT re-enter the engine — getResourceData/getMimeType from inside it
|
|
195
|
+
// deadlocks saveToString (it holds the engine while awaiting the callback),
|
|
196
|
+
// so every straggler must be a transient we persisted above and the
|
|
197
|
+
// callback is a pure lookup; (2) we attach the callback ONLY here, on the
|
|
198
|
+
// failure path — passing onDisallowedResourceScheme when nothing is
|
|
199
|
+
// disallowed hangs saveToString.
|
|
200
|
+
const scene = await eng.scene.saveToString({
|
|
201
|
+
allowedResourceSchemes: SCENE_ALLOWED_RESOURCE_SCHEMES,
|
|
202
|
+
onDisallowedResourceScheme: async (url) => {
|
|
203
|
+
const relPath = persistedByUrl.get(url);
|
|
204
|
+
if (relPath === undefined) {
|
|
205
|
+
// A buffer: URL we never enumerated as a transient — should not
|
|
206
|
+
// happen; fail loudly rather than persist an unloadable scene.
|
|
207
|
+
throw new Error(`load: cannot drain transient "${url}" — not persisted during explode.`);
|
|
208
|
+
}
|
|
209
|
+
return `workspace://${relPath}`;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
// The drain fixed the serialized OUTPUT, but the engine still holds the
|
|
213
|
+
// un-relocatable straggler in memory — its live state now diverges from the
|
|
214
|
+
// persisted scene. `load` commits this slot warm for the next edit, so
|
|
215
|
+
// reload the drained scene to realign: reloading collapses the duplicate
|
|
216
|
+
// typeface onto its single workspace:// URI, leaving no buffer: straggler.
|
|
217
|
+
// Without this, the next edit reuses the warm slot and its plain
|
|
218
|
+
// saveToString (no drain) fails on the lingering buffer: URL.
|
|
219
|
+
await eng.scene.loadFromString(scene, false, true);
|
|
220
|
+
return scene;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Classify one asset URI by its scheme. Only a `buffer:` URI is genuinely
|
|
225
|
+
* `transient` (in-memory, silently lost on the next save); every scheme in
|
|
226
|
+
* SCENE_ALLOWED_RESOURCE_SCHEMES (workspace/http/https/bundle/file/…) is durable.
|
|
227
|
+
*/
|
|
228
|
+
function classifyUri(uri) {
|
|
229
|
+
if (uri.startsWith('workspace://'))
|
|
230
|
+
return 'workspace';
|
|
231
|
+
if (uri.startsWith('http://') || uri.startsWith('https://'))
|
|
232
|
+
return 'external';
|
|
233
|
+
if (uri.startsWith('bundle://'))
|
|
234
|
+
return 'bundle';
|
|
235
|
+
if (uri.startsWith('buffer:'))
|
|
236
|
+
return 'transient';
|
|
237
|
+
return 'other';
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Classify every asset reference of a bare `.scene` (which carries no asset
|
|
241
|
+
* bytes) by scheme. A referenced asset does NOT reliably surface in
|
|
242
|
+
* `findAllMediaURIs()` alone: durable re-fetchable refs the engine keeps as
|
|
243
|
+
* URLs (e.g. http(s)) come back there, while anything it had to load into
|
|
244
|
+
* memory — `workspace://` (resolved via our URI resolver), `bundle://`
|
|
245
|
+
* fallbacks, and genuine `buffer:` orphans — comes back from
|
|
246
|
+
* `findAllTransientResources()` carrying its real URI. So we read BOTH lists
|
|
247
|
+
* and classify by scheme, deduped by URI.
|
|
248
|
+
*
|
|
249
|
+
* Verified against the real engine (CODE-3): after a waitForResources load a
|
|
250
|
+
* resolved `workspace://` asset appears ONLY as a transient resource (never in
|
|
251
|
+
* findAllMediaURIs), and an UNRESOLVABLE `workspace://` ref is silently dropped
|
|
252
|
+
* and substituted (e.g. a bundled fallback font) — so there is no reliable
|
|
253
|
+
* "dangling" signal to report, and no such class exists. External URLs are
|
|
254
|
+
* reported, never fetched.
|
|
255
|
+
*/
|
|
256
|
+
function classifyAssets(eng) {
|
|
257
|
+
const uris = new Set([
|
|
258
|
+
...eng.editor.findAllMediaURIs(),
|
|
259
|
+
...eng.editor.findAllTransientResources().map((r) => r.URL)
|
|
260
|
+
]);
|
|
261
|
+
return [...uris].map((uri) => ({ uri, class: classifyUri(uri) }));
|
|
262
|
+
}
|
|
263
|
+
function errorResult(text) {
|
|
264
|
+
return { isError: true, content: [{ type: 'text', text }] };
|
|
265
|
+
}
|
|
266
|
+
export function createLoadTool(opts) {
|
|
267
|
+
const { fs, store, session, engineLock, allowPath = false, onLeafWritten, renderThumbnail } = opts;
|
|
268
|
+
return {
|
|
269
|
+
name: 'load',
|
|
270
|
+
description: DESCRIPTION,
|
|
271
|
+
inputSchema: buildLoadInputSchema(allowPath),
|
|
272
|
+
call: async (rawArgs) => {
|
|
273
|
+
const args = (rawArgs ?? {});
|
|
274
|
+
const source = args.source;
|
|
275
|
+
if (source === undefined ||
|
|
276
|
+
typeof source !== 'object' ||
|
|
277
|
+
'url' in source === 'path' in source) {
|
|
278
|
+
return errorResult('load: `source` is required — exactly one of `{ url }` or `{ path }`.');
|
|
279
|
+
}
|
|
280
|
+
if ('path' in source && !allowPath) {
|
|
281
|
+
return errorResult('load: `source.path` is not supported on this (hosted) backend. Pass a `{ url }` source instead.');
|
|
282
|
+
}
|
|
283
|
+
// Ingest bytes OUTSIDE the engine lock — network/disk I/O must not
|
|
284
|
+
// block concurrent engine work.
|
|
285
|
+
let bytes;
|
|
286
|
+
if ('url' in source) {
|
|
287
|
+
let parsed;
|
|
288
|
+
try {
|
|
289
|
+
parsed = new URL(source.url);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return errorResult(`load: invalid URL "${source.url}".`);
|
|
293
|
+
}
|
|
294
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
295
|
+
return errorResult('load: `source.url` must be http(s).');
|
|
296
|
+
}
|
|
297
|
+
let resp;
|
|
298
|
+
try {
|
|
299
|
+
resp = await fetch(source.url);
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
return errorResult(`load: fetching "${source.url}" failed — ${err instanceof Error ? err.message : String(err)}`);
|
|
303
|
+
}
|
|
304
|
+
if (!resp.ok) {
|
|
305
|
+
return errorResult(`load: fetching "${source.url}" failed with HTTP ${resp.status}.`);
|
|
306
|
+
}
|
|
307
|
+
try {
|
|
308
|
+
bytes = new Uint8Array(await resp.arrayBuffer());
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
return errorResult(`load: reading the response body of "${source.url}" failed — ${err instanceof Error ? err.message : String(err)}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
try {
|
|
316
|
+
bytes = new Uint8Array(await nodeFs.readFile(source.path));
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
return errorResult(`load: reading "${source.path}" failed — ${err instanceof Error ? err.message : String(err)}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const title = args.title ?? deriveTitle(source);
|
|
323
|
+
// The engine is loaded and mutated across several awaits — serialize
|
|
324
|
+
// against any other engine-touching tool call.
|
|
325
|
+
return engineLock.runExclusive(async () => {
|
|
326
|
+
const slot = await session.acquire(null);
|
|
327
|
+
const eng = slot.engine;
|
|
328
|
+
try {
|
|
329
|
+
let scene;
|
|
330
|
+
let assets;
|
|
331
|
+
if (isZip(bytes)) {
|
|
332
|
+
// Stage to a temp file and load via file:// — scene-level CE.SDK
|
|
333
|
+
// has no loadFromArchive(bytes/path), only loadFromArchiveURL.
|
|
334
|
+
const stagedDir = await nodeFs.mkdtemp(join(tmpdir(), 'codesign-load-'));
|
|
335
|
+
const staged = join(stagedDir, 'archive.zip');
|
|
336
|
+
try {
|
|
337
|
+
await nodeFs.writeFile(staged, bytes);
|
|
338
|
+
// waitForResources: the archive's bundled bytes must be fully
|
|
339
|
+
// materialized as buffer: resources before we enumerate them.
|
|
340
|
+
await eng.scene.loadFromArchiveURL(pathToFileURL(staged).href, false, true);
|
|
341
|
+
}
|
|
342
|
+
finally {
|
|
343
|
+
await nodeFs
|
|
344
|
+
.rm(stagedDir, { recursive: true, force: true })
|
|
345
|
+
.catch(() => { });
|
|
346
|
+
}
|
|
347
|
+
scene = await explodeArchiveIntoWorkspace(eng, fs);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
const content = new TextDecoder().decode(bytes).trim();
|
|
351
|
+
await eng.scene.loadFromString(content, false, true);
|
|
352
|
+
assets = classifyAssets(eng);
|
|
353
|
+
scene = content;
|
|
354
|
+
}
|
|
355
|
+
const written = await store.write({ scene, parent: null, title });
|
|
356
|
+
session.commit(slot, written.id);
|
|
357
|
+
// Thumbnail block mirrors edit.ts — duplication is deliberate (KISS).
|
|
358
|
+
if (renderThumbnail) {
|
|
359
|
+
try {
|
|
360
|
+
const thumb = await renderThumbnail({
|
|
361
|
+
revision: written.id,
|
|
362
|
+
engine: slot.engine
|
|
363
|
+
});
|
|
364
|
+
const shard = written.id.slice(0, 2);
|
|
365
|
+
const rest = written.id.slice(2);
|
|
366
|
+
await fs.writeFile(`exports/${shard}/${rest}/preview.webp`, thumb);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// best-effort; thumbnail failure must not poison the load
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (onLeafWritten) {
|
|
373
|
+
// A new root is its own lineage root.
|
|
374
|
+
await onLeafWritten({
|
|
375
|
+
revision: written.id,
|
|
376
|
+
rootRevision: written.id
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
return {
|
|
380
|
+
content: [
|
|
381
|
+
{
|
|
382
|
+
type: 'text',
|
|
383
|
+
text: JSON.stringify({
|
|
384
|
+
revision: written.id,
|
|
385
|
+
title: await store.currentTitle(written.id),
|
|
386
|
+
...(assets !== undefined ? { assets } : {})
|
|
387
|
+
})
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
catch (err) {
|
|
393
|
+
session.markDirty(slot);
|
|
394
|
+
return errorResult(`load: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/tools/load.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/tools/load.ts\n//\n// `load` — ingest a native CE.SDK `.scene` file or `.zip` scene archive as a\n// NEW design root revision (the inverse of `save`). Archives are \"exploded\":\n// after `loadFromArchiveURL` their bundled asset bytes live in the engine as\n// ephemeral `buffer:` resources (which scene-level `saveToString` rejects —\n// the CODE-3 bug); we extract each one into the content-addressed asset store\n// (`assets/<sha>.<ext>`), relocate it to a durable `workspace://` URI, and\n// only then serialize. Bare `.scene` files carry no asset bytes: they persist\n// as-is, plus a classification report of every referenced asset URI.\n//\n// Both source variants normalize to bytes up front (fetch for `url`, disk\n// read for `path` — Local only), then dispatch on the zip magic bytes.\n// Archive bytes are staged to a temp file and loaded via a `file://` URL:\n// scene-level CE.SDK v1.77 has no `loadFromArchive(path/bytes)`, only\n// `loadFromArchiveURL`, and `file` is a first-class engine scheme.\n\nimport { promises as nodeFs } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { Mutex } from '../engine/mutex.js';\nimport { SCENE_ALLOWED_RESOURCE_SCHEMES } from '../engine/scene-resource-schemes.js';\nimport type { EngineSession } from '../engine/session.js';\nimport type { RevisionStore } from '../revisions/store.js';\nimport type { CodesignMcpToolRegistration } from '../server.js';\nimport { shortHash } from '../workspace/content-hash.js';\nimport type { WorkspaceFS } from '../workspace/types.js';\n\n/** The slice of CreativeEngine this tool touches — keeps it testable. */\ninterface MinimalLoadEngine {\n scene: {\n loadFromArchiveURL(\n url: string,\n overrideEditorConfig?: boolean,\n waitForResources?: boolean\n ): Promise<number>;\n loadFromString(\n content: string,\n overrideEditorConfig?: boolean,\n waitForResources?: boolean\n ): Promise<number>;\n saveToString(options?: {\n allowedResourceSchemes?: string[];\n onDisallowedResourceScheme?: (\n url: string,\n dataHash: string\n ) => Promise<string>;\n }): Promise<string>;\n };\n editor: {\n findAllTransientResources(): Array<{ URL: string; size: number }>;\n findAllMediaURIs(): string[];\n getResourceData(\n uri: string,\n chunkSize: number,\n onData: (result: Uint8Array) => boolean\n ): void;\n relocateResource(currentUrl: string, relocatedUrl: string): void;\n getMimeType(uri: string): Promise<string>;\n };\n}\n\ntype LoadSource = { url: string } | { path: string };\n\ninterface LoadArgs {\n source: LoadSource;\n title?: string;\n}\n\nconst DESCRIPTION = [\n 'Load a native CE.SDK design — a `.scene` file or a `.zip` scene archive (e.g. a template) — as a NEW design root revision. The inverse of `save`.',\n '',\n 'Source: `{ url }` (http/https) or `{ path }` (absolute local file path; Local only). Archives are ingested: bundled asset bytes are extracted into the workspace as content-addressed `assets/<sha>.<ext>` files, so the loaded design is durable and behaves exactly like a natively-built one.',\n '',\n 'Returns JSON `{ revision, title }` — continue with `edit({ parent: revision, … })`. Bare `.scene` loads additionally return `assets`: a classification of every referenced asset URI by scheme (`workspace` / `external` / `bundle` / `transient` / `other`). External URLs are NOT fetched.'\n].join('\\n');\n\n// The schema is built per-backend, like `save`'s outPath: the `{ path }`\n// source arm is advertised ONLY where local disk paths exist (Local).\n//\n// `source` is a FLAT object with optional `url`/`path` — deliberately NOT a\n// `oneOf` union. A `oneOf` here is the single construct most likely to break\n// tool calling: OpenAI bans it in strict mode, and weaker models (e.g.\n// openrouter:xiaomi/mimo-v2.5-pro, and Claude per samchon/openapi#88) serialize\n// the whole union value as an escaped JSON string, which then fails validation.\n// The \"exactly one of url/path\" invariant is enforced in `call` below, with a\n// clear error message instead of an opaque oneOf mismatch. This mirrors\n// `import`'s `source` shape. See test/tools/schema-best-practices.test.ts.\nfunction buildLoadInputSchema(allowPath: boolean) {\n const sourceProperties: Record<string, unknown> = {\n url: {\n type: 'string' as const,\n description: 'http(s) URL of a `.scene` file or `.zip` scene archive.'\n }\n };\n if (allowPath) {\n sourceProperties.path = {\n type: 'string' as const,\n description:\n 'Absolute local file path of a `.scene` file or `.zip` scene archive. Local-only.'\n };\n }\n return {\n type: 'object' as const,\n properties: {\n source: {\n type: 'object' as const,\n description: allowPath\n ? 'The design to load. Provide exactly one of `url` (http/https) or `path` (absolute local file path; Local only).'\n : 'The design to load. Provide `url` (http/https).',\n properties: sourceProperties,\n additionalProperties: false\n },\n title: {\n type: 'string' as const,\n description:\n \"Display name for the new design. Defaults to the source file's basename.\"\n }\n },\n required: ['source'],\n additionalProperties: false\n };\n}\n\n/** Standard zip local-file-header magic: PK\\x03\\x04. */\nfunction isZip(bytes: Uint8Array): boolean {\n return (\n bytes.length >= 4 &&\n bytes[0] === 0x50 &&\n bytes[1] === 0x4b &&\n bytes[2] === 0x03 &&\n bytes[3] === 0x04\n );\n}\n\n/** Basename of the source, minus a `.zip`/`.scene` extension. */\nfunction deriveTitle(source: LoadSource): string | undefined {\n let base: string;\n if ('url' in source) {\n const raw = new URL(source.url).pathname.split('/').pop() ?? '';\n try {\n base = decodeURIComponent(raw);\n } catch {\n base = raw; // malformed percent sequence — use the basename as-is\n }\n } else {\n // Local paths are literal filenames — never percent-decode them.\n base = source.path.split('/').pop() ?? '';\n }\n const name = base.replace(/\\.(zip|scene)$/i, '');\n return name === '' ? undefined : name;\n}\n\n// Broad enough for what CE.SDK archives actually bundle (images, fonts,\n// audio/video). Unknown types get a neutral `.bin` — the workspace store and\n// the /r/ route are extension-agnostic.\nconst MIME_EXT: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n 'image/svg+xml': 'svg',\n 'video/mp4': 'mp4',\n 'video/quicktime': 'mov',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'audio/x-wav': 'wav',\n 'audio/mp4': 'm4a',\n 'font/ttf': 'ttf',\n 'font/otf': 'otf',\n 'font/woff': 'woff',\n 'font/woff2': 'woff2',\n 'application/x-font-ttf': 'ttf',\n 'application/font-sfnt': 'ttf'\n};\n\nfunction extForMime(mime: string): string {\n return MIME_EXT[mime] ?? 'bin';\n}\n\nfunction concatChunks(chunks: Uint8Array[]): Uint8Array {\n const total = chunks.reduce((n, c) => n + c.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n}\n\n/**\n * Persist one engine resource's bytes into the content-addressed asset store\n * and return its workspace-relative path. Identical bytes land at the\n * identical path regardless of caller (automatic dedup).\n */\nasync function persistResourceBytes(\n eng: MinimalLoadEngine,\n fs: WorkspaceFS,\n uri: string\n): Promise<string> {\n const chunks: Uint8Array[] = [];\n eng.editor.getResourceData(uri, 1 << 20, (chunk) => {\n chunks.push(chunk.slice()); // copy — the engine may reuse the buffer\n return true;\n });\n const bytes = concatChunks(chunks);\n const sha = await shortHash(bytes);\n const ext = extForMime(await eng.editor.getMimeType(uri));\n const relPath = `assets/${sha}.${ext}`;\n if (!(await fs.exists(relPath))) {\n await fs.writeFile(relPath, bytes);\n }\n return relPath;\n}\n\n/** The engine's error code when a serialized scene still carries a scheme\n * outside `allowedResourceSchemes` (e.g. a lingering `buffer:`). */\nconst DISALLOWED_SCHEMES_CODE = 'SCENE.DISALLOWED_SCHEMES';\n\nfunction isDisallowedSchemesError(err: unknown): boolean {\n return (\n err instanceof Error &&\n (err as Error & { code?: string }).code === DISALLOWED_SCHEMES_CODE\n );\n}\n\n/**\n * Extract every transient (`buffer:`) resource into the content-addressed\n * asset store and relocate it to its durable `workspace://` URI, then\n * serialize with the shared scene-scheme allowlist (which permits `workspace`\n * but not `buffer` — see scene-resource-schemes.ts), so a missed transient\n * still fails loudly instead of silently persisting an unloadable scene.\n */\nasync function explodeArchiveIntoWorkspace(\n eng: MinimalLoadEngine,\n fs: WorkspaceFS\n): Promise<string> {\n // Persist + relocate every transient, remembering each URL's workspace path.\n const persistedByUrl = new Map<string, string>();\n for (const resource of eng.editor.findAllTransientResources()) {\n const relPath = await persistResourceBytes(eng, fs, resource.URL);\n persistedByUrl.set(resource.URL, relPath);\n eng.editor.relocateResource(resource.URL, `workspace://${relPath}`);\n }\n try {\n // Common case: every transient relocated cleanly, so no scheme is disallowed.\n return await eng.scene.saveToString({\n allowedResourceSchemes: SCENE_ALLOWED_RESOURCE_SCHEMES\n });\n } catch (err) {\n if (!isDisallowedSchemesError(err)) throw err;\n // A duplicate-content transient survived: relocateResource no-ops when two\n // transients share a content-addressed target (seen with duplicated fonts\n // in premium-template archives), so the engine still serializes that\n // straggler's buffer: URL. Retry with a drain callback that rewrites it in\n // the OUTPUT to its already-persisted workspace:// form.\n //\n // Two engine constraints shape this (CE.SDK v1.77): (1) the callback MUST\n // NOT re-enter the engine — getResourceData/getMimeType from inside it\n // deadlocks saveToString (it holds the engine while awaiting the callback),\n // so every straggler must be a transient we persisted above and the\n // callback is a pure lookup; (2) we attach the callback ONLY here, on the\n // failure path — passing onDisallowedResourceScheme when nothing is\n // disallowed hangs saveToString.\n const scene = await eng.scene.saveToString({\n allowedResourceSchemes: SCENE_ALLOWED_RESOURCE_SCHEMES,\n onDisallowedResourceScheme: async (url) => {\n const relPath = persistedByUrl.get(url);\n if (relPath === undefined) {\n // A buffer: URL we never enumerated as a transient — should not\n // happen; fail loudly rather than persist an unloadable scene.\n throw new Error(\n `load: cannot drain transient \"${url}\" — not persisted during explode.`\n );\n }\n return `workspace://${relPath}`;\n }\n });\n // The drain fixed the serialized OUTPUT, but the engine still holds the\n // un-relocatable straggler in memory — its live state now diverges from the\n // persisted scene. `load` commits this slot warm for the next edit, so\n // reload the drained scene to realign: reloading collapses the duplicate\n // typeface onto its single workspace:// URI, leaving no buffer: straggler.\n // Without this, the next edit reuses the warm slot and its plain\n // saveToString (no drain) fails on the lingering buffer: URL.\n await eng.scene.loadFromString(scene, false, true);\n return scene;\n }\n}\n\ntype AssetClass = 'workspace' | 'external' | 'bundle' | 'transient' | 'other';\n\ninterface AssetReportEntry {\n uri: string;\n class: AssetClass;\n}\n\n/**\n * Classify one asset URI by its scheme. Only a `buffer:` URI is genuinely\n * `transient` (in-memory, silently lost on the next save); every scheme in\n * SCENE_ALLOWED_RESOURCE_SCHEMES (workspace/http/https/bundle/file/…) is durable.\n */\nfunction classifyUri(uri: string): AssetClass {\n if (uri.startsWith('workspace://')) return 'workspace';\n if (uri.startsWith('http://') || uri.startsWith('https://'))\n return 'external';\n if (uri.startsWith('bundle://')) return 'bundle';\n if (uri.startsWith('buffer:')) return 'transient';\n return 'other';\n}\n\n/**\n * Classify every asset reference of a bare `.scene` (which carries no asset\n * bytes) by scheme. A referenced asset does NOT reliably surface in\n * `findAllMediaURIs()` alone: durable re-fetchable refs the engine keeps as\n * URLs (e.g. http(s)) come back there, while anything it had to load into\n * memory — `workspace://` (resolved via our URI resolver), `bundle://`\n * fallbacks, and genuine `buffer:` orphans — comes back from\n * `findAllTransientResources()` carrying its real URI. So we read BOTH lists\n * and classify by scheme, deduped by URI.\n *\n * Verified against the real engine (CODE-3): after a waitForResources load a\n * resolved `workspace://` asset appears ONLY as a transient resource (never in\n * findAllMediaURIs), and an UNRESOLVABLE `workspace://` ref is silently dropped\n * and substituted (e.g. a bundled fallback font) — so there is no reliable\n * \"dangling\" signal to report, and no such class exists. External URLs are\n * reported, never fetched.\n */\nfunction classifyAssets(eng: MinimalLoadEngine): AssetReportEntry[] {\n const uris = new Set<string>([\n ...eng.editor.findAllMediaURIs(),\n ...eng.editor.findAllTransientResources().map((r) => r.URL)\n ]);\n return [...uris].map((uri) => ({ uri, class: classifyUri(uri) }));\n}\n\nfunction errorResult(text: string): {\n isError: true;\n content: Array<{ type: 'text'; text: string }>;\n} {\n return { isError: true, content: [{ type: 'text' as const, text }] };\n}\n\nexport interface CreateLoadToolOptions<E = unknown> {\n fs: WorkspaceFS;\n store: RevisionStore;\n session: EngineSession<E>;\n /** Guards the shared engine — load-then-explode must not interleave with another engine-touching call. */\n engineLock: Mutex;\n /** Whether to honour a `{ path }` source (Local: yes; Hosted/sandbox: no). */\n allowPath?: boolean;\n /** Called after the new root revision is written (viewer SSE hook). */\n onLeafWritten?: (event: {\n revision: string;\n rootRevision: string;\n }) => void | Promise<void>;\n /** Render a thumbnail for the new revision. Best-effort: failures are swallowed. */\n renderThumbnail?: (event: {\n revision: string;\n engine: E;\n }) => Promise<Uint8Array>;\n}\n\nexport function createLoadTool<E = unknown>(\n opts: CreateLoadToolOptions<E>\n): CodesignMcpToolRegistration {\n const {\n fs,\n store,\n session,\n engineLock,\n allowPath = false,\n onLeafWritten,\n renderThumbnail\n } = opts;\n return {\n name: 'load',\n description: DESCRIPTION,\n inputSchema: buildLoadInputSchema(allowPath),\n call: async (rawArgs) => {\n const args = (rawArgs ?? {}) as Partial<LoadArgs>;\n const source = args.source;\n if (\n source === undefined ||\n typeof source !== 'object' ||\n 'url' in source === 'path' in source\n ) {\n return errorResult(\n 'load: `source` is required — exactly one of `{ url }` or `{ path }`.'\n );\n }\n if ('path' in source && !allowPath) {\n return errorResult(\n 'load: `source.path` is not supported on this (hosted) backend. Pass a `{ url }` source instead.'\n );\n }\n // Ingest bytes OUTSIDE the engine lock — network/disk I/O must not\n // block concurrent engine work.\n let bytes: Uint8Array;\n if ('url' in source) {\n let parsed: URL;\n try {\n parsed = new URL(source.url);\n } catch {\n return errorResult(`load: invalid URL \"${source.url}\".`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return errorResult('load: `source.url` must be http(s).');\n }\n let resp: Response;\n try {\n resp = await fetch(source.url);\n } catch (err) {\n return errorResult(\n `load: fetching \"${source.url}\" failed — ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n if (!resp.ok) {\n return errorResult(\n `load: fetching \"${source.url}\" failed with HTTP ${resp.status}.`\n );\n }\n try {\n bytes = new Uint8Array(await resp.arrayBuffer());\n } catch (err) {\n return errorResult(\n `load: reading the response body of \"${source.url}\" failed — ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n } else {\n try {\n bytes = new Uint8Array(await nodeFs.readFile(source.path));\n } catch (err) {\n return errorResult(\n `load: reading \"${source.path}\" failed — ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n const title = args.title ?? deriveTitle(source);\n // The engine is loaded and mutated across several awaits — serialize\n // against any other engine-touching tool call.\n return engineLock.runExclusive(async () => {\n const slot = await session.acquire(null);\n const eng = slot.engine as MinimalLoadEngine;\n try {\n let scene: string;\n let assets: AssetReportEntry[] | undefined;\n if (isZip(bytes)) {\n // Stage to a temp file and load via file:// — scene-level CE.SDK\n // has no loadFromArchive(bytes/path), only loadFromArchiveURL.\n const stagedDir = await nodeFs.mkdtemp(\n join(tmpdir(), 'codesign-load-')\n );\n const staged = join(stagedDir, 'archive.zip');\n try {\n await nodeFs.writeFile(staged, bytes);\n // waitForResources: the archive's bundled bytes must be fully\n // materialized as buffer: resources before we enumerate them.\n await eng.scene.loadFromArchiveURL(\n pathToFileURL(staged).href,\n false,\n true\n );\n } finally {\n await nodeFs\n .rm(stagedDir, { recursive: true, force: true })\n .catch(() => {});\n }\n scene = await explodeArchiveIntoWorkspace(eng, fs);\n } else {\n const content = new TextDecoder().decode(bytes).trim();\n await eng.scene.loadFromString(content, false, true);\n assets = classifyAssets(eng);\n scene = content;\n }\n const written = await store.write({ scene, parent: null, title });\n session.commit(slot, written.id);\n // Thumbnail block mirrors edit.ts — duplication is deliberate (KISS).\n if (renderThumbnail) {\n try {\n const thumb = await renderThumbnail({\n revision: written.id,\n engine: slot.engine\n });\n const shard = written.id.slice(0, 2);\n const rest = written.id.slice(2);\n await fs.writeFile(\n `exports/${shard}/${rest}/preview.webp`,\n thumb\n );\n } catch {\n // best-effort; thumbnail failure must not poison the load\n }\n }\n if (onLeafWritten) {\n // A new root is its own lineage root.\n await onLeafWritten({\n revision: written.id,\n rootRevision: written.id\n });\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n revision: written.id,\n title: await store.currentTitle(written.id),\n ...(assets !== undefined ? { assets } : {})\n })\n }\n ]\n };\n } catch (err) {\n session.markDirty(slot);\n return errorResult(\n `load: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`\n );\n }\n });\n }\n };\n}\n"]}
|