@elementor/editor-canvas 4.4.0-1146 → 4.4.0-1147
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/dist/index.js +46 -56
- package/dist/index.mjs +3 -13
- package/package.json +20 -20
- package/src/mcp/__tests__/canvas-mcp.test.ts +33 -0
- package/src/mcp/canvas-mcp.ts +1 -4
- package/src/mcp/tools/configure-element/__tests__/prompt.test.ts +34 -0
- package/src/mcp/tools/configure-element/prompt.ts +2 -6
- package/src/mcp/icon-library-experiment.ts +0 -5
package/dist/index.js
CHANGED
|
@@ -4344,11 +4344,6 @@ function initTabsModelExtensions() {
|
|
|
4344
4344
|
// src/mcp/canvas-mcp.ts
|
|
4345
4345
|
var import_editor_props8 = require("@elementor/editor-props");
|
|
4346
4346
|
|
|
4347
|
-
// src/mcp/icon-library-experiment.ts
|
|
4348
|
-
var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
|
|
4349
|
-
var ICON_LIBRARY_EXPERIMENT = "e_svg_library";
|
|
4350
|
-
var isIconLibraryActive = () => (0, import_editor_v1_adapters18.isExperimentActive)(ICON_LIBRARY_EXPERIMENT);
|
|
4351
|
-
|
|
4352
4347
|
// src/mcp/resources/available-widgets-resource.ts
|
|
4353
4348
|
var import_http_client3 = require("@elementor/http-client");
|
|
4354
4349
|
var MCP_PROXY_URL2 = "elementor/v1/mcp-proxy";
|
|
@@ -4425,7 +4420,7 @@ var initBestPracticesResource = (reg) => {
|
|
|
4425
4420
|
|
|
4426
4421
|
// src/mcp/resources/document-structure-resource.ts
|
|
4427
4422
|
var import_editor_elements10 = require("@elementor/editor-elements");
|
|
4428
|
-
var
|
|
4423
|
+
var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
|
|
4429
4424
|
var DOCUMENT_STRUCTURE_URI = "elementor://document/structure";
|
|
4430
4425
|
var initDocumentStructureResource = (reg) => {
|
|
4431
4426
|
const { resource, sendResourceUpdated } = reg;
|
|
@@ -4438,15 +4433,15 @@ var initDocumentStructureResource = (reg) => {
|
|
|
4438
4433
|
sendResourceUpdated({ uri: DOCUMENT_STRUCTURE_URI });
|
|
4439
4434
|
}
|
|
4440
4435
|
};
|
|
4441
|
-
(0,
|
|
4436
|
+
(0, import_editor_v1_adapters18.__privateListenTo)(
|
|
4442
4437
|
[
|
|
4443
|
-
(0,
|
|
4444
|
-
(0,
|
|
4445
|
-
(0,
|
|
4446
|
-
(0,
|
|
4447
|
-
(0,
|
|
4448
|
-
(0,
|
|
4449
|
-
(0,
|
|
4438
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("document/elements/create"),
|
|
4439
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("document/elements/delete"),
|
|
4440
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("document/elements/move"),
|
|
4441
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("document/elements/copy"),
|
|
4442
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("document/elements/paste"),
|
|
4443
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("editor/documents/attach-preview"),
|
|
4444
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("editor/documents/switch")
|
|
4450
4445
|
],
|
|
4451
4446
|
updateDocumentStructure
|
|
4452
4447
|
);
|
|
@@ -4549,7 +4544,7 @@ var initDynamicTagsResource = (reg) => {
|
|
|
4549
4544
|
};
|
|
4550
4545
|
|
|
4551
4546
|
// src/mcp/resources/editor-state-resource.ts
|
|
4552
|
-
var
|
|
4547
|
+
var import_editor_v1_adapters19 = require("@elementor/editor-v1-adapters");
|
|
4553
4548
|
var CURRENTLY_VIEWED_SCREEN = "The user is currently viewing the Elementor editor";
|
|
4554
4549
|
var PAGE_CONTENT_CHARACTER_LIMIT = 500;
|
|
4555
4550
|
var PREVIEW_TEXT_NODE_MIN_LENGTH = 2;
|
|
@@ -4570,8 +4565,8 @@ var initEditorStateResource = (reg) => {
|
|
|
4570
4565
|
lastSerializedState = serialized;
|
|
4571
4566
|
sendResourceUpdated({ uri: EDITOR_STATE_URI });
|
|
4572
4567
|
};
|
|
4573
|
-
(0,
|
|
4574
|
-
[(0,
|
|
4568
|
+
(0, import_editor_v1_adapters19.__privateListenTo)(
|
|
4569
|
+
[(0, import_editor_v1_adapters19.commandEndEvent)("editor/documents/switch"), (0, import_editor_v1_adapters19.commandEndEvent)("editor/documents/attach-preview")],
|
|
4575
4570
|
notifyIfChanged
|
|
4576
4571
|
);
|
|
4577
4572
|
lastSerializedState = JSON.stringify(buildState());
|
|
@@ -4645,7 +4640,7 @@ function getPageTitle() {
|
|
|
4645
4640
|
}
|
|
4646
4641
|
|
|
4647
4642
|
// src/mcp/resources/general-context-resource.ts
|
|
4648
|
-
var
|
|
4643
|
+
var import_editor_v1_adapters20 = require("@elementor/editor-v1-adapters");
|
|
4649
4644
|
var GENERAL_CONTEXT_URI = "elementor://context/general";
|
|
4650
4645
|
var initGeneralContextResource = (reg) => {
|
|
4651
4646
|
const { resource, sendResourceUpdated } = reg;
|
|
@@ -4706,11 +4701,11 @@ var initGeneralContextResource = (reg) => {
|
|
|
4706
4701
|
};
|
|
4707
4702
|
}
|
|
4708
4703
|
);
|
|
4709
|
-
(0,
|
|
4704
|
+
(0, import_editor_v1_adapters20.__privateListenTo)(
|
|
4710
4705
|
[
|
|
4711
|
-
(0,
|
|
4712
|
-
(0,
|
|
4713
|
-
(0,
|
|
4706
|
+
(0, import_editor_v1_adapters20.commandEndEvent)("editor/documents/switch"),
|
|
4707
|
+
(0, import_editor_v1_adapters20.commandEndEvent)("editor/documents/attach-preview"),
|
|
4708
|
+
(0, import_editor_v1_adapters20.commandEndEvent)("document/elements/settings")
|
|
4714
4709
|
],
|
|
4715
4710
|
pushUpdateIfChanged
|
|
4716
4711
|
);
|
|
@@ -4719,7 +4714,7 @@ var initGeneralContextResource = (reg) => {
|
|
|
4719
4714
|
|
|
4720
4715
|
// src/mcp/resources/selected-element-resource.ts
|
|
4721
4716
|
var import_editor_elements11 = require("@elementor/editor-elements");
|
|
4722
|
-
var
|
|
4717
|
+
var import_editor_v1_adapters21 = require("@elementor/editor-v1-adapters");
|
|
4723
4718
|
var SELECTED_ELEMENT_URI = "elementor://context/selected-element";
|
|
4724
4719
|
var initSelectedElementResource = (reg) => {
|
|
4725
4720
|
const { resource, sendResourceUpdated } = reg;
|
|
@@ -4750,11 +4745,11 @@ var initSelectedElementResource = (reg) => {
|
|
|
4750
4745
|
}
|
|
4751
4746
|
publishIfChanged(readSelectionFromEditor());
|
|
4752
4747
|
};
|
|
4753
|
-
(0,
|
|
4748
|
+
(0, import_editor_v1_adapters21.__privateListenTo)(
|
|
4754
4749
|
[
|
|
4755
|
-
(0,
|
|
4756
|
-
(0,
|
|
4757
|
-
(0,
|
|
4750
|
+
(0, import_editor_v1_adapters21.commandEndEvent)("document/elements/select"),
|
|
4751
|
+
(0, import_editor_v1_adapters21.commandEndEvent)("document/elements/deselect-all"),
|
|
4752
|
+
(0, import_editor_v1_adapters21.commandEndEvent)("document/elements/settings")
|
|
4758
4753
|
],
|
|
4759
4754
|
onCommand
|
|
4760
4755
|
);
|
|
@@ -4872,7 +4867,7 @@ var import_editor_props7 = require("@elementor/editor-props");
|
|
|
4872
4867
|
var import_editor_elements13 = require("@elementor/editor-elements");
|
|
4873
4868
|
var import_editor_props6 = require("@elementor/editor-props");
|
|
4874
4869
|
var import_editor_styles4 = require("@elementor/editor-styles");
|
|
4875
|
-
var
|
|
4870
|
+
var import_editor_v1_adapters23 = require("@elementor/editor-v1-adapters");
|
|
4876
4871
|
|
|
4877
4872
|
// src/mcp/utils/merge-custom-css.ts
|
|
4878
4873
|
var CUSTOM_CSS_SEPARATOR = "\n";
|
|
@@ -4941,11 +4936,11 @@ function resolveCanonicalPropKeys(elementType, props) {
|
|
|
4941
4936
|
}
|
|
4942
4937
|
|
|
4943
4938
|
// src/mcp/utils/resolve-dynamic-tag.ts
|
|
4944
|
-
var
|
|
4939
|
+
var import_editor_v1_adapters22 = require("@elementor/editor-v1-adapters");
|
|
4945
4940
|
var DYNAMIC_PROP_TYPE_KEY = "dynamic";
|
|
4946
4941
|
var OMITTED_DYNAMIC_SETTING_KEYS = ["fallback"];
|
|
4947
4942
|
var getAtomicDynamicTags = () => {
|
|
4948
|
-
const config = (0,
|
|
4943
|
+
const config = (0, import_editor_v1_adapters22.getElementorConfig)();
|
|
4949
4944
|
return config.atomicDynamicTags?.tags ?? {};
|
|
4950
4945
|
};
|
|
4951
4946
|
var getDynamicTagNamesByCategories = (categories) => {
|
|
@@ -5146,7 +5141,7 @@ Expected Schema: ${jsonSchema}`
|
|
|
5146
5141
|
},
|
|
5147
5142
|
withHistory: false
|
|
5148
5143
|
});
|
|
5149
|
-
(0,
|
|
5144
|
+
(0, import_editor_v1_adapters23.__privateRunCommandSync)("document/save/set-is-modified", { status: true }, { internal: true });
|
|
5150
5145
|
};
|
|
5151
5146
|
|
|
5152
5147
|
// src/mcp/tools/configure-element/prompt.ts
|
|
@@ -5190,7 +5185,6 @@ Setting a Font Awesome icon on an e-svg, after resolving it with \`find-icons\`:
|
|
|
5190
5185
|
`;
|
|
5191
5186
|
var CONFIGURE_ELEMENT_GUIDE_URI = "elementor://canvas/tools/configure-element-guide";
|
|
5192
5187
|
var generatePrompt = () => {
|
|
5193
|
-
const iconLibraryActive = isIconLibraryActive();
|
|
5194
5188
|
const configureElementToolPrompt = (0, import_editor_mcp2.toolPrompts)("configure-element");
|
|
5195
5189
|
configureElementToolPrompt.description(`
|
|
5196
5190
|
Configure an existing element on the page.
|
|
@@ -5249,7 +5243,7 @@ Put the dynamic object EXACTLY at the node whose schema offers the "dynamic" var
|
|
|
5249
5243
|
Image example: { "$$type": "image", "value": { "src": { "$$type": "dynamic", "value": { "name": "<image tag>", "settings": { ... } } } } }
|
|
5250
5244
|
Do NOT send "group" (it is resolved automatically). Use { "settings": {} } only when the tag has no settings.
|
|
5251
5245
|
|
|
5252
|
-
${
|
|
5246
|
+
${ICONS_SECTION}`);
|
|
5253
5247
|
configureElementToolPrompt.parameter("elementId", "The ID of the element to configure. MANDATORY.");
|
|
5254
5248
|
configureElementToolPrompt.parameter(
|
|
5255
5249
|
"elementType",
|
|
@@ -5286,9 +5280,7 @@ ${iconLibraryActive ? ICONS_SECTION : ""}`);
|
|
|
5286
5280
|
};
|
|
5287
5281
|
\`\`\`
|
|
5288
5282
|
`);
|
|
5289
|
-
|
|
5290
|
-
configureElementToolPrompt.example(ICON_EXAMPLE);
|
|
5291
|
-
}
|
|
5283
|
+
configureElementToolPrompt.example(ICON_EXAMPLE);
|
|
5292
5284
|
configureElementToolPrompt.instruction(
|
|
5293
5285
|
"The $$type property is MANDATORY for every value in propertiesToChange; it is not used in the style parameter (raw CSS only)."
|
|
5294
5286
|
);
|
|
@@ -5651,9 +5643,7 @@ var initCanvasMcp = (reg) => {
|
|
|
5651
5643
|
initGeneralContextResource(reg);
|
|
5652
5644
|
initBestPracticesResource(reg);
|
|
5653
5645
|
initConfigureElementTool(reg);
|
|
5654
|
-
|
|
5655
|
-
initFindIconsTool(reg);
|
|
5656
|
-
}
|
|
5646
|
+
initFindIconsTool(reg);
|
|
5657
5647
|
initGetPageStructureTool(reg);
|
|
5658
5648
|
initBreakpointsResource(reg);
|
|
5659
5649
|
};
|
|
@@ -5757,14 +5747,14 @@ Note: The "size" property controls image resolution/loading, not visual size. Se
|
|
|
5757
5747
|
// src/prevent-link-in-link-commands.ts
|
|
5758
5748
|
var import_editor_elements15 = require("@elementor/editor-elements");
|
|
5759
5749
|
var import_editor_notifications6 = require("@elementor/editor-notifications");
|
|
5760
|
-
var
|
|
5750
|
+
var import_editor_v1_adapters24 = require("@elementor/editor-v1-adapters");
|
|
5761
5751
|
var import_i18n7 = require("@wordpress/i18n");
|
|
5762
5752
|
function initLinkInLinkPrevention() {
|
|
5763
|
-
(0,
|
|
5753
|
+
(0, import_editor_v1_adapters24.blockCommand)({
|
|
5764
5754
|
command: "document/elements/paste",
|
|
5765
5755
|
condition: blockLinkInLinkPaste
|
|
5766
5756
|
});
|
|
5767
|
-
(0,
|
|
5757
|
+
(0, import_editor_v1_adapters24.blockCommand)({
|
|
5768
5758
|
command: "document/elements/move",
|
|
5769
5759
|
condition: blockLinkInLinkMove
|
|
5770
5760
|
});
|
|
@@ -5840,7 +5830,7 @@ function shouldBlock(sourceElements, targetElements) {
|
|
|
5840
5830
|
// src/style-commands/paste-style.ts
|
|
5841
5831
|
var import_editor_elements18 = require("@elementor/editor-elements");
|
|
5842
5832
|
var import_editor_props10 = require("@elementor/editor-props");
|
|
5843
|
-
var
|
|
5833
|
+
var import_editor_v1_adapters26 = require("@elementor/editor-v1-adapters");
|
|
5844
5834
|
|
|
5845
5835
|
// src/utils/command-utils.ts
|
|
5846
5836
|
var import_editor_elements16 = require("@elementor/editor-elements");
|
|
@@ -5887,9 +5877,9 @@ function getTitleForContainers(containers) {
|
|
|
5887
5877
|
// src/style-commands/undoable-actions/paste-element-style.ts
|
|
5888
5878
|
var import_editor_elements17 = require("@elementor/editor-elements");
|
|
5889
5879
|
var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
|
|
5890
|
-
var
|
|
5880
|
+
var import_editor_v1_adapters25 = require("@elementor/editor-v1-adapters");
|
|
5891
5881
|
var import_i18n9 = require("@wordpress/i18n");
|
|
5892
|
-
var undoablePasteElementStyle = () => (0,
|
|
5882
|
+
var undoablePasteElementStyle = () => (0, import_editor_v1_adapters25.undoable)(
|
|
5893
5883
|
{
|
|
5894
5884
|
do: ({ containers, newStyle }) => {
|
|
5895
5885
|
return containers.map((container) => {
|
|
@@ -5965,12 +5955,12 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters26.undoable)(
|
|
|
5965
5955
|
// src/style-commands/paste-style.ts
|
|
5966
5956
|
function initPasteStyleCommand() {
|
|
5967
5957
|
const pasteElementStyleCommand = undoablePasteElementStyle();
|
|
5968
|
-
(0,
|
|
5958
|
+
(0, import_editor_v1_adapters26.blockCommand)({
|
|
5969
5959
|
command: "document/elements/paste-style",
|
|
5970
5960
|
condition: hasAtomicWidgets
|
|
5971
5961
|
});
|
|
5972
|
-
(0,
|
|
5973
|
-
(0,
|
|
5962
|
+
(0, import_editor_v1_adapters26.__privateListenTo)(
|
|
5963
|
+
(0, import_editor_v1_adapters26.commandStartEvent)("document/elements/paste-style"),
|
|
5974
5964
|
(e) => pasteStyles(e.args, pasteElementStyleCommand)
|
|
5975
5965
|
);
|
|
5976
5966
|
}
|
|
@@ -6021,14 +6011,14 @@ function pasteClasses(containers, classes) {
|
|
|
6021
6011
|
}
|
|
6022
6012
|
|
|
6023
6013
|
// src/style-commands/reset-style.ts
|
|
6024
|
-
var
|
|
6014
|
+
var import_editor_v1_adapters28 = require("@elementor/editor-v1-adapters");
|
|
6025
6015
|
|
|
6026
6016
|
// src/style-commands/undoable-actions/reset-element-style.ts
|
|
6027
6017
|
var import_editor_elements19 = require("@elementor/editor-elements");
|
|
6028
6018
|
var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
|
|
6029
|
-
var
|
|
6019
|
+
var import_editor_v1_adapters27 = require("@elementor/editor-v1-adapters");
|
|
6030
6020
|
var import_i18n10 = require("@wordpress/i18n");
|
|
6031
|
-
var undoableResetElementStyle = () => (0,
|
|
6021
|
+
var undoableResetElementStyle = () => (0, import_editor_v1_adapters27.undoable)(
|
|
6032
6022
|
{
|
|
6033
6023
|
do: ({ containers }) => {
|
|
6034
6024
|
return containers.map((container) => {
|
|
@@ -6072,12 +6062,12 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters28.undoable)(
|
|
|
6072
6062
|
// src/style-commands/reset-style.ts
|
|
6073
6063
|
function initResetStyleCommand() {
|
|
6074
6064
|
const resetElementStyles = undoableResetElementStyle();
|
|
6075
|
-
(0,
|
|
6065
|
+
(0, import_editor_v1_adapters28.blockCommand)({
|
|
6076
6066
|
command: "document/elements/reset-style",
|
|
6077
6067
|
condition: hasAtomicWidgets
|
|
6078
6068
|
});
|
|
6079
|
-
(0,
|
|
6080
|
-
(0,
|
|
6069
|
+
(0, import_editor_v1_adapters28.__privateListenTo)(
|
|
6070
|
+
(0, import_editor_v1_adapters28.commandStartEvent)("document/elements/reset-style"),
|
|
6081
6071
|
(e) => resetStyles(e.args, resetElementStyles)
|
|
6082
6072
|
);
|
|
6083
6073
|
}
|
|
@@ -6229,9 +6219,9 @@ function getRectClipPath(rect, viewport) {
|
|
|
6229
6219
|
}
|
|
6230
6220
|
|
|
6231
6221
|
// src/hooks/use-canvas-document.ts
|
|
6232
|
-
var
|
|
6222
|
+
var import_editor_v1_adapters29 = require("@elementor/editor-v1-adapters");
|
|
6233
6223
|
function useCanvasDocument() {
|
|
6234
|
-
return (0,
|
|
6224
|
+
return (0, import_editor_v1_adapters29.__privateUseListenTo)((0, import_editor_v1_adapters29.commandEndEvent)("editor/documents/attach-preview"), () => (0, import_editor_v1_adapters29.getCanvasIframeDocument)());
|
|
6235
6225
|
}
|
|
6236
6226
|
|
|
6237
6227
|
// src/hooks/use-escape-on-canvas.ts
|
package/dist/index.mjs
CHANGED
|
@@ -4314,11 +4314,6 @@ function initTabsModelExtensions() {
|
|
|
4314
4314
|
// src/mcp/canvas-mcp.ts
|
|
4315
4315
|
import { Schema as Schema3 } from "@elementor/editor-props";
|
|
4316
4316
|
|
|
4317
|
-
// src/mcp/icon-library-experiment.ts
|
|
4318
|
-
import { isExperimentActive } from "@elementor/editor-v1-adapters";
|
|
4319
|
-
var ICON_LIBRARY_EXPERIMENT = "e_svg_library";
|
|
4320
|
-
var isIconLibraryActive = () => isExperimentActive(ICON_LIBRARY_EXPERIMENT);
|
|
4321
|
-
|
|
4322
4317
|
// src/mcp/resources/available-widgets-resource.ts
|
|
4323
4318
|
import { httpService as httpService3 } from "@elementor/http-client";
|
|
4324
4319
|
var MCP_PROXY_URL2 = "elementor/v1/mcp-proxy";
|
|
@@ -5171,7 +5166,6 @@ Setting a Font Awesome icon on an e-svg, after resolving it with \`find-icons\`:
|
|
|
5171
5166
|
`;
|
|
5172
5167
|
var CONFIGURE_ELEMENT_GUIDE_URI = "elementor://canvas/tools/configure-element-guide";
|
|
5173
5168
|
var generatePrompt = () => {
|
|
5174
|
-
const iconLibraryActive = isIconLibraryActive();
|
|
5175
5169
|
const configureElementToolPrompt = toolPrompts("configure-element");
|
|
5176
5170
|
configureElementToolPrompt.description(`
|
|
5177
5171
|
Configure an existing element on the page.
|
|
@@ -5230,7 +5224,7 @@ Put the dynamic object EXACTLY at the node whose schema offers the "dynamic" var
|
|
|
5230
5224
|
Image example: { "$$type": "image", "value": { "src": { "$$type": "dynamic", "value": { "name": "<image tag>", "settings": { ... } } } } }
|
|
5231
5225
|
Do NOT send "group" (it is resolved automatically). Use { "settings": {} } only when the tag has no settings.
|
|
5232
5226
|
|
|
5233
|
-
${
|
|
5227
|
+
${ICONS_SECTION}`);
|
|
5234
5228
|
configureElementToolPrompt.parameter("elementId", "The ID of the element to configure. MANDATORY.");
|
|
5235
5229
|
configureElementToolPrompt.parameter(
|
|
5236
5230
|
"elementType",
|
|
@@ -5267,9 +5261,7 @@ ${iconLibraryActive ? ICONS_SECTION : ""}`);
|
|
|
5267
5261
|
};
|
|
5268
5262
|
\`\`\`
|
|
5269
5263
|
`);
|
|
5270
|
-
|
|
5271
|
-
configureElementToolPrompt.example(ICON_EXAMPLE);
|
|
5272
|
-
}
|
|
5264
|
+
configureElementToolPrompt.example(ICON_EXAMPLE);
|
|
5273
5265
|
configureElementToolPrompt.instruction(
|
|
5274
5266
|
"The $$type property is MANDATORY for every value in propertiesToChange; it is not used in the style parameter (raw CSS only)."
|
|
5275
5267
|
);
|
|
@@ -5632,9 +5624,7 @@ var initCanvasMcp = (reg) => {
|
|
|
5632
5624
|
initGeneralContextResource(reg);
|
|
5633
5625
|
initBestPracticesResource(reg);
|
|
5634
5626
|
initConfigureElementTool(reg);
|
|
5635
|
-
|
|
5636
|
-
initFindIconsTool(reg);
|
|
5637
|
-
}
|
|
5627
|
+
initFindIconsTool(reg);
|
|
5638
5628
|
initGetPageStructureTool(reg);
|
|
5639
5629
|
initBreakpointsResource(reg);
|
|
5640
5630
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-canvas",
|
|
3
3
|
"description": "Elementor Editor Canvas",
|
|
4
|
-
"version": "4.4.0-
|
|
4
|
+
"version": "4.4.0-1147",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -37,26 +37,26 @@
|
|
|
37
37
|
"react-dom": "^18.3.1"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@elementor/editor": "4.4.0-
|
|
41
|
-
"@elementor/editor-controls": "4.4.0-
|
|
42
|
-
"@elementor/editor-documents": "4.4.0-
|
|
43
|
-
"@elementor/editor-elements": "4.4.0-
|
|
44
|
-
"@elementor/editor-interactions": "4.4.0-
|
|
45
|
-
"@elementor/editor-mcp": "4.4.0-
|
|
46
|
-
"@elementor/editor-notifications": "4.4.0-
|
|
47
|
-
"@elementor/editor-props": "4.4.0-
|
|
48
|
-
"@elementor/editor-responsive": "4.4.0-
|
|
49
|
-
"@elementor/editor-styles": "4.4.0-
|
|
50
|
-
"@elementor/editor-styles-repository": "4.4.0-
|
|
51
|
-
"@elementor/editor-ui": "4.4.0-
|
|
52
|
-
"@elementor/editor-v1-adapters": "4.4.0-
|
|
53
|
-
"@elementor/events": "4.4.0-
|
|
54
|
-
"@elementor/http-client": "4.4.0-
|
|
55
|
-
"@elementor/schema": "4.4.0-
|
|
56
|
-
"@elementor/twing": "4.4.0-
|
|
40
|
+
"@elementor/editor": "4.4.0-1147",
|
|
41
|
+
"@elementor/editor-controls": "4.4.0-1147",
|
|
42
|
+
"@elementor/editor-documents": "4.4.0-1147",
|
|
43
|
+
"@elementor/editor-elements": "4.4.0-1147",
|
|
44
|
+
"@elementor/editor-interactions": "4.4.0-1147",
|
|
45
|
+
"@elementor/editor-mcp": "4.4.0-1147",
|
|
46
|
+
"@elementor/editor-notifications": "4.4.0-1147",
|
|
47
|
+
"@elementor/editor-props": "4.4.0-1147",
|
|
48
|
+
"@elementor/editor-responsive": "4.4.0-1147",
|
|
49
|
+
"@elementor/editor-styles": "4.4.0-1147",
|
|
50
|
+
"@elementor/editor-styles-repository": "4.4.0-1147",
|
|
51
|
+
"@elementor/editor-ui": "4.4.0-1147",
|
|
52
|
+
"@elementor/editor-v1-adapters": "4.4.0-1147",
|
|
53
|
+
"@elementor/events": "4.4.0-1147",
|
|
54
|
+
"@elementor/http-client": "4.4.0-1147",
|
|
55
|
+
"@elementor/schema": "4.4.0-1147",
|
|
56
|
+
"@elementor/twing": "4.4.0-1147",
|
|
57
57
|
"@elementor/ui": "1.41.4",
|
|
58
|
-
"@elementor/utils": "4.4.0-
|
|
59
|
-
"@elementor/wp-media": "4.4.0-
|
|
58
|
+
"@elementor/utils": "4.4.0-1147",
|
|
59
|
+
"@elementor/wp-media": "4.4.0-1147",
|
|
60
60
|
"@floating-ui/react": "^0.27.5",
|
|
61
61
|
"@wordpress/i18n": "^5.13.0",
|
|
62
62
|
"dompurify": "^3.2.6"
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { initCanvasMcp } from '../canvas-mcp';
|
|
2
|
+
import { initFindIconsTool } from '../tools/find-icons/tool';
|
|
3
|
+
|
|
4
|
+
jest.mock( '@elementor/editor-props', () => ( {
|
|
5
|
+
Schema: { setDynamicTagNamesResolver: jest.fn() },
|
|
6
|
+
} ) );
|
|
7
|
+
|
|
8
|
+
jest.mock( '../resources/available-widgets-resource', () => ( { initAvailableWidgetsResource: jest.fn() } ) );
|
|
9
|
+
jest.mock( '../resources/best-practices-resource', () => ( { initBestPracticesResource: jest.fn() } ) );
|
|
10
|
+
jest.mock( '../resources/breakpoints-resource', () => ( { initBreakpointsResource: jest.fn() } ) );
|
|
11
|
+
jest.mock( '../resources/document-structure-resource', () => ( { initDocumentStructureResource: jest.fn() } ) );
|
|
12
|
+
jest.mock( '../resources/dynamic-tags-resource', () => ( { initDynamicTagsResource: jest.fn() } ) );
|
|
13
|
+
jest.mock( '../resources/editor-state-resource', () => ( { initEditorStateResource: jest.fn() } ) );
|
|
14
|
+
jest.mock( '../resources/general-context-resource', () => ( { initGeneralContextResource: jest.fn() } ) );
|
|
15
|
+
jest.mock( '../resources/selected-element-resource', () => ( { initSelectedElementResource: jest.fn() } ) );
|
|
16
|
+
jest.mock( '../resources/widgets-schema-resource', () => ( { initWidgetsSchemaResource: jest.fn() } ) );
|
|
17
|
+
jest.mock( '../tools/configure-element/tool', () => ( { initConfigureElementTool: jest.fn() } ) );
|
|
18
|
+
jest.mock( '../tools/find-icons/tool', () => ( { initFindIconsTool: jest.fn() } ) );
|
|
19
|
+
jest.mock( '../tools/get-page-structure/tool', () => ( { initGetPageStructureTool: jest.fn() } ) );
|
|
20
|
+
jest.mock( '../utils/resolve-dynamic-tag', () => ( { getDynamicTagNamesByCategories: jest.fn() } ) );
|
|
21
|
+
|
|
22
|
+
describe( 'initCanvasMcp', () => {
|
|
23
|
+
it( 'should always register the find-icons tool', () => {
|
|
24
|
+
// Arrange.
|
|
25
|
+
const reg = { addTool: jest.fn() } as never;
|
|
26
|
+
|
|
27
|
+
// Act.
|
|
28
|
+
initCanvasMcp( reg );
|
|
29
|
+
|
|
30
|
+
// Assert.
|
|
31
|
+
expect( initFindIconsTool ).toHaveBeenCalledWith( reg );
|
|
32
|
+
} );
|
|
33
|
+
} );
|
package/src/mcp/canvas-mcp.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type MCPRegistryEntry } from '@elementor/editor-mcp';
|
|
2
2
|
import { Schema } from '@elementor/editor-props';
|
|
3
3
|
|
|
4
|
-
import { isIconLibraryActive } from './icon-library-experiment';
|
|
5
4
|
import { initAvailableWidgetsResource } from './resources/available-widgets-resource';
|
|
6
5
|
import { initBestPracticesResource } from './resources/best-practices-resource';
|
|
7
6
|
import { initBreakpointsResource } from './resources/breakpoints-resource';
|
|
@@ -30,9 +29,7 @@ export const initCanvasMcp = ( reg: MCPRegistryEntry ) => {
|
|
|
30
29
|
initGeneralContextResource( reg );
|
|
31
30
|
initBestPracticesResource( reg );
|
|
32
31
|
initConfigureElementTool( reg );
|
|
33
|
-
|
|
34
|
-
initFindIconsTool( reg );
|
|
35
|
-
}
|
|
32
|
+
initFindIconsTool( reg );
|
|
36
33
|
initGetPageStructureTool( reg );
|
|
37
34
|
initBreakpointsResource( reg );
|
|
38
35
|
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { generatePrompt } from '../prompt';
|
|
2
|
+
|
|
3
|
+
const mockPromptParts: string[] = [];
|
|
4
|
+
|
|
5
|
+
jest.mock( '@elementor/editor-mcp', () => ( {
|
|
6
|
+
toolPrompts: () => {
|
|
7
|
+
const record = ( ...args: unknown[] ) => {
|
|
8
|
+
mockPromptParts.push( ...args.filter( ( arg ): arg is string => 'string' === typeof arg ) );
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
description: record,
|
|
13
|
+
parameter: record,
|
|
14
|
+
example: record,
|
|
15
|
+
instruction: record,
|
|
16
|
+
prompt: () => mockPromptParts.join( '\n' ),
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
} ) );
|
|
20
|
+
|
|
21
|
+
describe( 'configure-element prompt', () => {
|
|
22
|
+
beforeEach( () => {
|
|
23
|
+
mockPromptParts.length = 0;
|
|
24
|
+
} );
|
|
25
|
+
|
|
26
|
+
it( 'should always point agents at the find-icons tool for the svg property', () => {
|
|
27
|
+
// Act.
|
|
28
|
+
const prompt = generatePrompt();
|
|
29
|
+
|
|
30
|
+
// Assert.
|
|
31
|
+
expect( prompt ).toContain( '# Icons (the `svg` property on e-svg)' );
|
|
32
|
+
expect( prompt ).toContain( 'find-icons' );
|
|
33
|
+
} );
|
|
34
|
+
} );
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { toolPrompts } from '@elementor/editor-mcp';
|
|
2
2
|
|
|
3
|
-
import { isIconLibraryActive } from '../../icon-library-experiment';
|
|
4
3
|
import { DYNAMIC_TAGS_URI } from '../../resources/dynamic-tags-resource';
|
|
5
4
|
import { WIDGET_SCHEMA_URI } from '../../resources/widgets-schema-resource';
|
|
6
5
|
|
|
@@ -46,7 +45,6 @@ Setting a Font Awesome icon on an e-svg, after resolving it with \`find-icons\`:
|
|
|
46
45
|
export const CONFIGURE_ELEMENT_GUIDE_URI = 'elementor://canvas/tools/configure-element-guide';
|
|
47
46
|
|
|
48
47
|
export const generatePrompt = () => {
|
|
49
|
-
const iconLibraryActive = isIconLibraryActive();
|
|
50
48
|
const configureElementToolPrompt = toolPrompts( 'configure-element' );
|
|
51
49
|
|
|
52
50
|
configureElementToolPrompt.description( `
|
|
@@ -106,7 +104,7 @@ Put the dynamic object EXACTLY at the node whose schema offers the "dynamic" var
|
|
|
106
104
|
Image example: { "$$type": "image", "value": { "src": { "$$type": "dynamic", "value": { "name": "<image tag>", "settings": { ... } } } } }
|
|
107
105
|
Do NOT send "group" (it is resolved automatically). Use { "settings": {} } only when the tag has no settings.
|
|
108
106
|
|
|
109
|
-
${
|
|
107
|
+
${ ICONS_SECTION }` );
|
|
110
108
|
|
|
111
109
|
configureElementToolPrompt.parameter( 'elementId', 'The ID of the element to configure. MANDATORY.' );
|
|
112
110
|
|
|
@@ -149,9 +147,7 @@ ${ iconLibraryActive ? ICONS_SECTION : '' }` );
|
|
|
149
147
|
\`\`\`
|
|
150
148
|
` );
|
|
151
149
|
|
|
152
|
-
|
|
153
|
-
configureElementToolPrompt.example( ICON_EXAMPLE );
|
|
154
|
-
}
|
|
150
|
+
configureElementToolPrompt.example( ICON_EXAMPLE );
|
|
155
151
|
|
|
156
152
|
configureElementToolPrompt.instruction(
|
|
157
153
|
'The $$type property is MANDATORY for every value in propertiesToChange; it is not used in the style parameter (raw CSS only).'
|