@elementor/editor-mcp 4.2.0-946 → 4.2.0-beta2
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.d.mts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +56 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +54 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/adapters/types.ts +1 -1
- package/src/adapters/web-mcp-adapter.ts +11 -8
- package/src/events/mcp-styles-applied-event.ts +9 -0
- package/src/index.ts +5 -0
- package/src/init.ts +11 -6
- package/src/mcp-registry.ts +5 -5
- package/src/utils/get-model-context.ts +14 -1
- package/src/utils/register-model-context-tool.ts +15 -0
package/dist/index.d.mts
CHANGED
|
@@ -33,7 +33,7 @@ interface IMcpRegistrationAdapter {
|
|
|
33
33
|
/**
|
|
34
34
|
* Called once at startup to activate the adapter's server registrations.
|
|
35
35
|
*/
|
|
36
|
-
activate: () =>
|
|
36
|
+
activate: () => Promise<void>;
|
|
37
37
|
/**
|
|
38
38
|
* Called once per tool when addTool() is invoked.
|
|
39
39
|
*/
|
|
@@ -71,7 +71,7 @@ type ResourceList = {
|
|
|
71
71
|
|
|
72
72
|
declare const registerMcpAdapter: (adapter: IMcpRegistrationAdapter) => void;
|
|
73
73
|
declare const signalMcpReady: () => void;
|
|
74
|
-
declare const createAndRegisterAdapters: () => void
|
|
74
|
+
declare const createAndRegisterAdapters: () => Promise<void>;
|
|
75
75
|
declare const registerMcp: (mcp: McpServer, name: string) => void;
|
|
76
76
|
declare const getRegisteredMcpServers: () => Array<[string, McpServer, string]>;
|
|
77
77
|
/**
|
|
@@ -397,8 +397,14 @@ declare const installAngiePlugin: () => Promise<InstallAngieResult>;
|
|
|
397
397
|
|
|
398
398
|
declare const saveAngieConsent: () => Promise<void>;
|
|
399
399
|
|
|
400
|
-
declare function startMCPServer(): void
|
|
400
|
+
declare function startMCPServer(): Promise<void>;
|
|
401
|
+
|
|
402
|
+
declare const MCP_STYLES_APPLIED_EVENT = "elementor/mcp/styles-applied";
|
|
403
|
+
type McpStylesAppliedPayload = {
|
|
404
|
+
styleValue: Record<string, unknown>;
|
|
405
|
+
};
|
|
406
|
+
declare function dispatchMcpStylesAppliedEvent(payload: McpStylesAppliedPayload): void;
|
|
401
407
|
|
|
402
408
|
declare const getAngieSdk: () => _elementor_external_angie_sdk.AngieMcpSdk;
|
|
403
409
|
|
|
404
|
-
export { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type ActiveChatInfo, type AngieModelPreferences, type InstallAngieResult, type MCPRegistryEntry, createAndRegisterAdapters, createSampler, getActiveChatInfo, getAngieSdk, getMCPByDomain, getRegisteredMcpServers, installAngiePlugin, isAngieAvailable, isAngieSidebarOpen, redirectToAppAdmin, redirectToInstallation, registerMcp, registerMcpAdapter, saveAngieConsent, sendPromptToAngie, signalMcpReady, startMCPServer, toolPrompts };
|
|
410
|
+
export { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type ActiveChatInfo, type AngieModelPreferences, type InstallAngieResult, type MCPRegistryEntry, MCP_STYLES_APPLIED_EVENT, type McpStylesAppliedPayload, createAndRegisterAdapters, createSampler, dispatchMcpStylesAppliedEvent, getActiveChatInfo, getAngieSdk, getMCPByDomain, getRegisteredMcpServers, installAngiePlugin, isAngieAvailable, isAngieSidebarOpen, redirectToAppAdmin, redirectToInstallation, registerMcp, registerMcpAdapter, saveAngieConsent, sendPromptToAngie, signalMcpReady, startMCPServer, toolPrompts };
|
package/dist/index.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ interface IMcpRegistrationAdapter {
|
|
|
33
33
|
/**
|
|
34
34
|
* Called once at startup to activate the adapter's server registrations.
|
|
35
35
|
*/
|
|
36
|
-
activate: () =>
|
|
36
|
+
activate: () => Promise<void>;
|
|
37
37
|
/**
|
|
38
38
|
* Called once per tool when addTool() is invoked.
|
|
39
39
|
*/
|
|
@@ -71,7 +71,7 @@ type ResourceList = {
|
|
|
71
71
|
|
|
72
72
|
declare const registerMcpAdapter: (adapter: IMcpRegistrationAdapter) => void;
|
|
73
73
|
declare const signalMcpReady: () => void;
|
|
74
|
-
declare const createAndRegisterAdapters: () => void
|
|
74
|
+
declare const createAndRegisterAdapters: () => Promise<void>;
|
|
75
75
|
declare const registerMcp: (mcp: McpServer, name: string) => void;
|
|
76
76
|
declare const getRegisteredMcpServers: () => Array<[string, McpServer, string]>;
|
|
77
77
|
/**
|
|
@@ -397,8 +397,14 @@ declare const installAngiePlugin: () => Promise<InstallAngieResult>;
|
|
|
397
397
|
|
|
398
398
|
declare const saveAngieConsent: () => Promise<void>;
|
|
399
399
|
|
|
400
|
-
declare function startMCPServer(): void
|
|
400
|
+
declare function startMCPServer(): Promise<void>;
|
|
401
|
+
|
|
402
|
+
declare const MCP_STYLES_APPLIED_EVENT = "elementor/mcp/styles-applied";
|
|
403
|
+
type McpStylesAppliedPayload = {
|
|
404
|
+
styleValue: Record<string, unknown>;
|
|
405
|
+
};
|
|
406
|
+
declare function dispatchMcpStylesAppliedEvent(payload: McpStylesAppliedPayload): void;
|
|
401
407
|
|
|
402
408
|
declare const getAngieSdk: () => _elementor_external_angie_sdk.AngieMcpSdk;
|
|
403
409
|
|
|
404
|
-
export { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type ActiveChatInfo, type AngieModelPreferences, type InstallAngieResult, type MCPRegistryEntry, createAndRegisterAdapters, createSampler, getActiveChatInfo, getAngieSdk, getMCPByDomain, getRegisteredMcpServers, installAngiePlugin, isAngieAvailable, isAngieSidebarOpen, redirectToAppAdmin, redirectToInstallation, registerMcp, registerMcpAdapter, saveAngieConsent, sendPromptToAngie, signalMcpReady, startMCPServer, toolPrompts };
|
|
410
|
+
export { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type ActiveChatInfo, type AngieModelPreferences, type InstallAngieResult, type MCPRegistryEntry, MCP_STYLES_APPLIED_EVENT, type McpStylesAppliedPayload, createAndRegisterAdapters, createSampler, dispatchMcpStylesAppliedEvent, getActiveChatInfo, getAngieSdk, getMCPByDomain, getRegisteredMcpServers, installAngiePlugin, isAngieAvailable, isAngieSidebarOpen, redirectToAppAdmin, redirectToInstallation, registerMcp, registerMcpAdapter, saveAngieConsent, sendPromptToAngie, signalMcpReady, startMCPServer, toolPrompts };
|
package/dist/index.js
CHANGED
|
@@ -33,11 +33,13 @@ __export(index_exports, {
|
|
|
33
33
|
ANGIE_MODEL_PREFERENCES: () => ANGIE_MODEL_PREFERENCES,
|
|
34
34
|
ANGIE_REQUIRED_RESOURCES: () => ANGIE_REQUIRED_RESOURCES,
|
|
35
35
|
AngieMessageEvenetType: () => import_angie_sdk2.MessageEventType,
|
|
36
|
+
MCP_STYLES_APPLIED_EVENT: () => MCP_STYLES_APPLIED_EVENT,
|
|
36
37
|
McpServer: () => import_mcp2.McpServer,
|
|
37
38
|
ResourceTemplate: () => import_mcp2.ResourceTemplate,
|
|
38
39
|
SamplingMessageSchema: () => import_types2.SamplingMessageSchema,
|
|
39
40
|
createAndRegisterAdapters: () => createAndRegisterAdapters,
|
|
40
41
|
createSampler: () => createSampler,
|
|
42
|
+
dispatchMcpStylesAppliedEvent: () => dispatchMcpStylesAppliedEvent,
|
|
41
43
|
getActiveChatInfo: () => getActiveChatInfo,
|
|
42
44
|
getAngieIframe: () => import_angie_sdk2.getAngieIframe,
|
|
43
45
|
getAngieSdk: () => getAngieSdk,
|
|
@@ -166,6 +168,17 @@ var AngieMcpAdapter = class {
|
|
|
166
168
|
// src/adapters/web-mcp-adapter.ts
|
|
167
169
|
var import_zod_to_json_schema = require("zod-to-json-schema");
|
|
168
170
|
var import_schema = require("@elementor/schema");
|
|
171
|
+
|
|
172
|
+
// src/utils/register-model-context-tool.ts
|
|
173
|
+
async function registerModelContextTool(registerTool, tool) {
|
|
174
|
+
try {
|
|
175
|
+
await Promise.resolve(registerTool(tool));
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error("Tool registration failed:", error);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// src/adapters/web-mcp-adapter.ts
|
|
169
182
|
var WebMCPAdapter = class {
|
|
170
183
|
constructor(ctx) {
|
|
171
184
|
this.ctx = ctx;
|
|
@@ -175,10 +188,10 @@ var WebMCPAdapter = class {
|
|
|
175
188
|
activated = false;
|
|
176
189
|
activate() {
|
|
177
190
|
if (this.activated) {
|
|
178
|
-
return;
|
|
191
|
+
return Promise.resolve();
|
|
179
192
|
}
|
|
180
193
|
this.activated = true;
|
|
181
|
-
this.ctx.registerTool
|
|
194
|
+
return registerModelContextTool(this.ctx.registerTool, {
|
|
182
195
|
name: "editor-resource-getter",
|
|
183
196
|
description: "Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.",
|
|
184
197
|
inputSchema: {
|
|
@@ -235,7 +248,8 @@ ${available}`);
|
|
|
235
248
|
jsonSchema = tool.inputSchema;
|
|
236
249
|
}
|
|
237
250
|
if (this.registeredToolNames.has(tool.name)) {
|
|
238
|
-
this.ctx.unregisterTool(tool.name);
|
|
251
|
+
this.ctx.unregisterTool?.(tool.name);
|
|
252
|
+
this.registeredToolNames.delete(tool.name);
|
|
239
253
|
}
|
|
240
254
|
let resourcesDescription = "";
|
|
241
255
|
if (extraData) {
|
|
@@ -255,13 +269,14 @@ ${extraData.requiredResources?.join("\n")}
|
|
|
255
269
|
|
|
256
270
|
`;
|
|
257
271
|
}
|
|
258
|
-
this.ctx.registerTool
|
|
272
|
+
void registerModelContextTool(this.ctx.registerTool, {
|
|
259
273
|
name: tool.name,
|
|
260
274
|
description: `${resourcesDescription}${tool.description}`,
|
|
261
275
|
inputSchema: jsonSchema,
|
|
262
276
|
execute: tool.execute
|
|
277
|
+
}).then(() => {
|
|
278
|
+
this.registeredToolNames.add(tool.name);
|
|
263
279
|
});
|
|
264
|
-
this.registeredToolNames.add(tool.name);
|
|
265
280
|
}
|
|
266
281
|
onResourceRegistered(_name, uriOrTemplate, handler) {
|
|
267
282
|
if (typeof uriOrTemplate === "string") {
|
|
@@ -322,10 +337,22 @@ var mockMcpRegistry = () => {
|
|
|
322
337
|
};
|
|
323
338
|
|
|
324
339
|
// src/utils/get-model-context.ts
|
|
340
|
+
function bindModelContextMethods(host) {
|
|
341
|
+
return {
|
|
342
|
+
registerTool: host.registerTool.bind(host),
|
|
343
|
+
unregisterTool: host.unregisterTool ? host.unregisterTool.bind(host) : void 0
|
|
344
|
+
};
|
|
345
|
+
}
|
|
325
346
|
function getModelContext() {
|
|
326
347
|
const documentModelContext = typeof document !== "undefined" ? document.modelContext : void 0;
|
|
348
|
+
if (documentModelContext?.registerTool) {
|
|
349
|
+
return bindModelContextMethods(documentModelContext);
|
|
350
|
+
}
|
|
327
351
|
const navigatorModelContext = typeof navigator !== "undefined" ? navigator.modelContext : void 0;
|
|
328
|
-
|
|
352
|
+
if (navigatorModelContext?.registerTool) {
|
|
353
|
+
return bindModelContextMethods(navigatorModelContext);
|
|
354
|
+
}
|
|
355
|
+
return void 0;
|
|
329
356
|
}
|
|
330
357
|
|
|
331
358
|
// src/utils/merge-required-resources.ts
|
|
@@ -391,7 +418,7 @@ var registerMcpAdapter = (adapter) => {
|
|
|
391
418
|
var signalMcpReady = () => {
|
|
392
419
|
resolveReady();
|
|
393
420
|
};
|
|
394
|
-
var createAndRegisterAdapters = () => {
|
|
421
|
+
var createAndRegisterAdapters = async () => {
|
|
395
422
|
const modelContext = getModelContext();
|
|
396
423
|
if (modelContext) {
|
|
397
424
|
registerMcpAdapter(new WebMCPAdapter(modelContext));
|
|
@@ -399,12 +426,12 @@ var createAndRegisterAdapters = () => {
|
|
|
399
426
|
if (isAngieAvailable()) {
|
|
400
427
|
registerMcpAdapter(new AngieMcpAdapter(getSDK(), getRegisteredMcpServers));
|
|
401
428
|
}
|
|
402
|
-
registrationAdapters.
|
|
429
|
+
await Promise.all(registrationAdapters.map((adapter) => adapter.activate()));
|
|
403
430
|
};
|
|
404
|
-
function callAdapters(fn) {
|
|
405
|
-
for (const adapter of registrationAdapters) {
|
|
431
|
+
async function callAdapters(fn) {
|
|
432
|
+
for await (const adapter of registrationAdapters) {
|
|
406
433
|
try {
|
|
407
|
-
fn(adapter);
|
|
434
|
+
await Promise.resolve(fn(adapter));
|
|
408
435
|
} catch {
|
|
409
436
|
}
|
|
410
437
|
}
|
|
@@ -763,18 +790,29 @@ var saveAngieConsent = async () => {
|
|
|
763
790
|
|
|
764
791
|
// src/init.ts
|
|
765
792
|
var isInitialized = false;
|
|
766
|
-
function startMCPServer() {
|
|
793
|
+
async function startMCPServer() {
|
|
767
794
|
if (isInitialized) {
|
|
768
795
|
return;
|
|
769
796
|
}
|
|
770
797
|
isInitialized = true;
|
|
771
|
-
|
|
772
|
-
|
|
798
|
+
try {
|
|
799
|
+
await createAndRegisterAdapters();
|
|
800
|
+
} catch (error) {
|
|
801
|
+
console.error("MCP adapter activation failed:", error);
|
|
802
|
+
} finally {
|
|
803
|
+
signalMcpReady();
|
|
804
|
+
}
|
|
773
805
|
}
|
|
774
806
|
if (typeof document !== "undefined") {
|
|
775
|
-
document.addEventListener("DOMContentLoaded", () => startMCPServer(), { once: true });
|
|
807
|
+
document.addEventListener("DOMContentLoaded", () => void startMCPServer(), { once: true });
|
|
776
808
|
} else {
|
|
777
|
-
startMCPServer();
|
|
809
|
+
void startMCPServer();
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
// src/events/mcp-styles-applied-event.ts
|
|
813
|
+
var MCP_STYLES_APPLIED_EVENT = "elementor/mcp/styles-applied";
|
|
814
|
+
function dispatchMcpStylesAppliedEvent(payload) {
|
|
815
|
+
window.dispatchEvent(new CustomEvent(MCP_STYLES_APPLIED_EVENT, { detail: payload }));
|
|
778
816
|
}
|
|
779
817
|
|
|
780
818
|
// src/index.ts
|
|
@@ -784,11 +822,13 @@ var getAngieSdk = () => getSDK();
|
|
|
784
822
|
ANGIE_MODEL_PREFERENCES,
|
|
785
823
|
ANGIE_REQUIRED_RESOURCES,
|
|
786
824
|
AngieMessageEvenetType,
|
|
825
|
+
MCP_STYLES_APPLIED_EVENT,
|
|
787
826
|
McpServer,
|
|
788
827
|
ResourceTemplate,
|
|
789
828
|
SamplingMessageSchema,
|
|
790
829
|
createAndRegisterAdapters,
|
|
791
830
|
createSampler,
|
|
831
|
+
dispatchMcpStylesAppliedEvent,
|
|
792
832
|
getActiveChatInfo,
|
|
793
833
|
getAngieIframe,
|
|
794
834
|
getAngieSdk,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/get-sdk.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts"],"sourcesContent":["import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\n","import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = () => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tregistrationAdapters.forEach( ( adapter ) => adapter.activate() );\n};\n\n// utility function to run a callback on all MCP interfaces\nfunction callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tfn( adapter );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ( tool: McpToolDescriptor ) => void;\n\tunregisterTool: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): void {\n\t\tif ( this.activated ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activated = true;\n\t\tthis.ctx.registerTool( {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tthis.ctx.registerTool( {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} );\n\t\tthis.registeredToolNames.add( tool.name );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\n\treturn documentModelContext || navigatorModelContext;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\n\tcreateAndRegisterAdapters();\n\tsignalMcpReady();\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => startMCPServer(), { once: true } );\n} else {\n\tstartMCPServer();\n}\n"],"mappings":"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","names":["import_angie_sdk","import_mcp","import_types","import_angie_sdk","import_angie_sdk","import_schema","sdk","getRegisteredMcpServers","import_angie_sdk","import_angie_sdk","import_angie_sdk","apiFetch","import_api_fetch","apiFetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/get-sdk.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/utils/register-model-context-tool.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts","../src/events/mcp-styles-applied-event.ts"],"sourcesContent":["import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\nexport {\n\tdispatchMcpStylesAppliedEvent,\n\tMCP_STYLES_APPLIED_EVENT,\n\ttype McpStylesAppliedPayload,\n} from './events/mcp-styles-applied-event';\n","import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = async (): Promise< void > => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tawait Promise.all( registrationAdapters.map( ( adapter ) => adapter.activate() ) );\n};\n\n// utility function to run a callback on all MCP interfaces\nasync function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor await ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tawait Promise.resolve( fn( adapter ) );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport { type ModelContextRegisterTool, registerModelContextTool } from '../utils/register-model-context-tool';\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ModelContextRegisterTool;\n\tunregisterTool?: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): Promise< void > {\n\t\tif ( this.activated ) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tthis.activated = true;\n\t\treturn registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool?.( tool.name );\n\t\t\tthis.registeredToolNames.delete( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tvoid registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} ).then( () => {\n\t\t\tthis.registeredToolNames.add( tool.name );\n\t\t} );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","import { type McpToolDescriptor } from '../adapters/types';\n\nexport type ModelContextRegisterTool = ( tool: McpToolDescriptor ) => void | Promise< void >;\n\nexport async function registerModelContextTool(\n\tregisterTool: ModelContextRegisterTool,\n\ttool: McpToolDescriptor\n): Promise< void > {\n\ttry {\n\t\tawait Promise.resolve( registerTool( tool ) );\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'Tool registration failed:', error );\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nfunction bindModelContextMethods( host: ModelContext ): ModelContext {\n\treturn {\n\t\tregisterTool: host.registerTool.bind( host ),\n\t\tunregisterTool: host.unregisterTool ? host.unregisterTool.bind( host ) : undefined,\n\t};\n}\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( documentModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( documentModelContext );\n\t}\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( navigatorModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( navigatorModelContext );\n\t}\n\n\treturn undefined;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport async function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\ttry {\n\t\tawait createAndRegisterAdapters();\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'MCP adapter activation failed:', error );\n\t} finally {\n\t\tsignalMcpReady();\n\t}\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => void startMCPServer(), { once: true } );\n} else {\n\tvoid startMCPServer();\n}\n","export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';\n\nexport type McpStylesAppliedPayload = {\n\tstyleValue: Record< string, unknown >;\n};\n\nexport function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {\n\twindow.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );\n}\n"],"mappings":"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","names":["import_angie_sdk","import_mcp","import_types","import_angie_sdk","import_angie_sdk","import_schema","sdk","getRegisteredMcpServers","import_angie_sdk","import_angie_sdk","import_angie_sdk","apiFetch","import_api_fetch","apiFetch"]}
|
package/dist/index.mjs
CHANGED
|
@@ -109,6 +109,17 @@ var AngieMcpAdapter = class {
|
|
|
109
109
|
// src/adapters/web-mcp-adapter.ts
|
|
110
110
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
111
111
|
import { z } from "@elementor/schema";
|
|
112
|
+
|
|
113
|
+
// src/utils/register-model-context-tool.ts
|
|
114
|
+
async function registerModelContextTool(registerTool, tool) {
|
|
115
|
+
try {
|
|
116
|
+
await Promise.resolve(registerTool(tool));
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error("Tool registration failed:", error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/adapters/web-mcp-adapter.ts
|
|
112
123
|
var WebMCPAdapter = class {
|
|
113
124
|
constructor(ctx) {
|
|
114
125
|
this.ctx = ctx;
|
|
@@ -118,10 +129,10 @@ var WebMCPAdapter = class {
|
|
|
118
129
|
activated = false;
|
|
119
130
|
activate() {
|
|
120
131
|
if (this.activated) {
|
|
121
|
-
return;
|
|
132
|
+
return Promise.resolve();
|
|
122
133
|
}
|
|
123
134
|
this.activated = true;
|
|
124
|
-
this.ctx.registerTool
|
|
135
|
+
return registerModelContextTool(this.ctx.registerTool, {
|
|
125
136
|
name: "editor-resource-getter",
|
|
126
137
|
description: "Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.",
|
|
127
138
|
inputSchema: {
|
|
@@ -178,7 +189,8 @@ ${available}`);
|
|
|
178
189
|
jsonSchema = tool.inputSchema;
|
|
179
190
|
}
|
|
180
191
|
if (this.registeredToolNames.has(tool.name)) {
|
|
181
|
-
this.ctx.unregisterTool(tool.name);
|
|
192
|
+
this.ctx.unregisterTool?.(tool.name);
|
|
193
|
+
this.registeredToolNames.delete(tool.name);
|
|
182
194
|
}
|
|
183
195
|
let resourcesDescription = "";
|
|
184
196
|
if (extraData) {
|
|
@@ -198,13 +210,14 @@ ${extraData.requiredResources?.join("\n")}
|
|
|
198
210
|
|
|
199
211
|
`;
|
|
200
212
|
}
|
|
201
|
-
this.ctx.registerTool
|
|
213
|
+
void registerModelContextTool(this.ctx.registerTool, {
|
|
202
214
|
name: tool.name,
|
|
203
215
|
description: `${resourcesDescription}${tool.description}`,
|
|
204
216
|
inputSchema: jsonSchema,
|
|
205
217
|
execute: tool.execute
|
|
218
|
+
}).then(() => {
|
|
219
|
+
this.registeredToolNames.add(tool.name);
|
|
206
220
|
});
|
|
207
|
-
this.registeredToolNames.add(tool.name);
|
|
208
221
|
}
|
|
209
222
|
onResourceRegistered(_name, uriOrTemplate, handler) {
|
|
210
223
|
if (typeof uriOrTemplate === "string") {
|
|
@@ -265,10 +278,22 @@ var mockMcpRegistry = () => {
|
|
|
265
278
|
};
|
|
266
279
|
|
|
267
280
|
// src/utils/get-model-context.ts
|
|
281
|
+
function bindModelContextMethods(host) {
|
|
282
|
+
return {
|
|
283
|
+
registerTool: host.registerTool.bind(host),
|
|
284
|
+
unregisterTool: host.unregisterTool ? host.unregisterTool.bind(host) : void 0
|
|
285
|
+
};
|
|
286
|
+
}
|
|
268
287
|
function getModelContext() {
|
|
269
288
|
const documentModelContext = typeof document !== "undefined" ? document.modelContext : void 0;
|
|
289
|
+
if (documentModelContext?.registerTool) {
|
|
290
|
+
return bindModelContextMethods(documentModelContext);
|
|
291
|
+
}
|
|
270
292
|
const navigatorModelContext = typeof navigator !== "undefined" ? navigator.modelContext : void 0;
|
|
271
|
-
|
|
293
|
+
if (navigatorModelContext?.registerTool) {
|
|
294
|
+
return bindModelContextMethods(navigatorModelContext);
|
|
295
|
+
}
|
|
296
|
+
return void 0;
|
|
272
297
|
}
|
|
273
298
|
|
|
274
299
|
// src/utils/merge-required-resources.ts
|
|
@@ -334,7 +359,7 @@ var registerMcpAdapter = (adapter) => {
|
|
|
334
359
|
var signalMcpReady = () => {
|
|
335
360
|
resolveReady();
|
|
336
361
|
};
|
|
337
|
-
var createAndRegisterAdapters = () => {
|
|
362
|
+
var createAndRegisterAdapters = async () => {
|
|
338
363
|
const modelContext = getModelContext();
|
|
339
364
|
if (modelContext) {
|
|
340
365
|
registerMcpAdapter(new WebMCPAdapter(modelContext));
|
|
@@ -342,12 +367,12 @@ var createAndRegisterAdapters = () => {
|
|
|
342
367
|
if (isAngieAvailable()) {
|
|
343
368
|
registerMcpAdapter(new AngieMcpAdapter(getSDK(), getRegisteredMcpServers));
|
|
344
369
|
}
|
|
345
|
-
registrationAdapters.
|
|
370
|
+
await Promise.all(registrationAdapters.map((adapter) => adapter.activate()));
|
|
346
371
|
};
|
|
347
|
-
function callAdapters(fn) {
|
|
348
|
-
for (const adapter of registrationAdapters) {
|
|
372
|
+
async function callAdapters(fn) {
|
|
373
|
+
for await (const adapter of registrationAdapters) {
|
|
349
374
|
try {
|
|
350
|
-
fn(adapter);
|
|
375
|
+
await Promise.resolve(fn(adapter));
|
|
351
376
|
} catch {
|
|
352
377
|
}
|
|
353
378
|
}
|
|
@@ -706,18 +731,29 @@ var saveAngieConsent = async () => {
|
|
|
706
731
|
|
|
707
732
|
// src/init.ts
|
|
708
733
|
var isInitialized = false;
|
|
709
|
-
function startMCPServer() {
|
|
734
|
+
async function startMCPServer() {
|
|
710
735
|
if (isInitialized) {
|
|
711
736
|
return;
|
|
712
737
|
}
|
|
713
738
|
isInitialized = true;
|
|
714
|
-
|
|
715
|
-
|
|
739
|
+
try {
|
|
740
|
+
await createAndRegisterAdapters();
|
|
741
|
+
} catch (error) {
|
|
742
|
+
console.error("MCP adapter activation failed:", error);
|
|
743
|
+
} finally {
|
|
744
|
+
signalMcpReady();
|
|
745
|
+
}
|
|
716
746
|
}
|
|
717
747
|
if (typeof document !== "undefined") {
|
|
718
|
-
document.addEventListener("DOMContentLoaded", () => startMCPServer(), { once: true });
|
|
748
|
+
document.addEventListener("DOMContentLoaded", () => void startMCPServer(), { once: true });
|
|
719
749
|
} else {
|
|
720
|
-
startMCPServer();
|
|
750
|
+
void startMCPServer();
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
// src/events/mcp-styles-applied-event.ts
|
|
754
|
+
var MCP_STYLES_APPLIED_EVENT = "elementor/mcp/styles-applied";
|
|
755
|
+
function dispatchMcpStylesAppliedEvent(payload) {
|
|
756
|
+
window.dispatchEvent(new CustomEvent(MCP_STYLES_APPLIED_EVENT, { detail: payload }));
|
|
721
757
|
}
|
|
722
758
|
|
|
723
759
|
// src/index.ts
|
|
@@ -726,11 +762,13 @@ export {
|
|
|
726
762
|
ANGIE_MODEL_PREFERENCES,
|
|
727
763
|
ANGIE_REQUIRED_RESOURCES,
|
|
728
764
|
MessageEventType as AngieMessageEvenetType,
|
|
765
|
+
MCP_STYLES_APPLIED_EVENT,
|
|
729
766
|
McpServer2 as McpServer,
|
|
730
767
|
ResourceTemplate,
|
|
731
768
|
SamplingMessageSchema2 as SamplingMessageSchema,
|
|
732
769
|
createAndRegisterAdapters,
|
|
733
770
|
createSampler,
|
|
771
|
+
dispatchMcpStylesAppliedEvent,
|
|
734
772
|
getActiveChatInfo,
|
|
735
773
|
getAngieIframe,
|
|
736
774
|
getAngieSdk,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/get-sdk.ts","../src/index.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts"],"sourcesContent":["import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = () => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tregistrationAdapters.forEach( ( adapter ) => adapter.activate() );\n};\n\n// utility function to run a callback on all MCP interfaces\nfunction callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tfn( adapter );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ( tool: McpToolDescriptor ) => void;\n\tunregisterTool: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): void {\n\t\tif ( this.activated ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activated = true;\n\t\tthis.ctx.registerTool( {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tthis.ctx.registerTool( {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} );\n\t\tthis.registeredToolNames.add( tool.name );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\n\treturn documentModelContext || navigatorModelContext;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\n\tcreateAndRegisterAdapters();\n\tsignalMcpReady();\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => startMCPServer(), { once: true } );\n} else {\n\tstartMCPServer();\n}\n"],"mappings":"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","names":["McpServer","SamplingMessageSchema","getAngieIframe","z","sdk","getRegisteredMcpServers","z","getAngieIframe","ANGIE_SIDEBAR_STATE_OPEN","setReferrerRedirect","apiFetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/get-sdk.ts","../src/index.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/utils/register-model-context-tool.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts","../src/events/mcp-styles-applied-event.ts"],"sourcesContent":["import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\nexport {\n\tdispatchMcpStylesAppliedEvent,\n\tMCP_STYLES_APPLIED_EVENT,\n\ttype McpStylesAppliedPayload,\n} from './events/mcp-styles-applied-event';\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = async (): Promise< void > => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tawait Promise.all( registrationAdapters.map( ( adapter ) => adapter.activate() ) );\n};\n\n// utility function to run a callback on all MCP interfaces\nasync function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor await ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tawait Promise.resolve( fn( adapter ) );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport { type ModelContextRegisterTool, registerModelContextTool } from '../utils/register-model-context-tool';\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ModelContextRegisterTool;\n\tunregisterTool?: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): Promise< void > {\n\t\tif ( this.activated ) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tthis.activated = true;\n\t\treturn registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool?.( tool.name );\n\t\t\tthis.registeredToolNames.delete( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tvoid registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} ).then( () => {\n\t\t\tthis.registeredToolNames.add( tool.name );\n\t\t} );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","import { type McpToolDescriptor } from '../adapters/types';\n\nexport type ModelContextRegisterTool = ( tool: McpToolDescriptor ) => void | Promise< void >;\n\nexport async function registerModelContextTool(\n\tregisterTool: ModelContextRegisterTool,\n\ttool: McpToolDescriptor\n): Promise< void > {\n\ttry {\n\t\tawait Promise.resolve( registerTool( tool ) );\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'Tool registration failed:', error );\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nfunction bindModelContextMethods( host: ModelContext ): ModelContext {\n\treturn {\n\t\tregisterTool: host.registerTool.bind( host ),\n\t\tunregisterTool: host.unregisterTool ? host.unregisterTool.bind( host ) : undefined,\n\t};\n}\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( documentModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( documentModelContext );\n\t}\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( navigatorModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( navigatorModelContext );\n\t}\n\n\treturn undefined;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport async function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\ttry {\n\t\tawait createAndRegisterAdapters();\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'MCP adapter activation failed:', error );\n\t} finally {\n\t\tsignalMcpReady();\n\t}\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => void startMCPServer(), { once: true } );\n} else {\n\tvoid startMCPServer();\n}\n","export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';\n\nexport type McpStylesAppliedPayload = {\n\tstyleValue: Record< string, unknown >;\n};\n\nexport function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {\n\twindow.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );\n}\n"],"mappings":"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","names":["McpServer","SamplingMessageSchema","getAngieIframe","z","sdk","getRegisteredMcpServers","z","getAngieIframe","ANGIE_SIDEBAR_STATE_OPEN","setReferrerRedirect","apiFetch"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-mcp",
|
|
3
|
-
"version": "4.2.0-
|
|
3
|
+
"version": "4.2.0-beta2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@elementor-external/angie-sdk": "npm:@elementor/angie-sdk@^1.4.5",
|
|
46
|
-
"@elementor/editor-v1-adapters": "4.2.0-
|
|
47
|
-
"@elementor/schema": "4.2.0-
|
|
48
|
-
"@elementor/store": "4.2.0-
|
|
46
|
+
"@elementor/editor-v1-adapters": "4.2.0-beta2",
|
|
47
|
+
"@elementor/schema": "4.2.0-beta2",
|
|
48
|
+
"@elementor/store": "4.2.0-beta2",
|
|
49
49
|
"@modelcontextprotocol/sdk": "1.27.1",
|
|
50
50
|
"@wordpress/api-fetch": "^6.42.0",
|
|
51
51
|
"zod-to-json-schema": "3.24.6"
|
package/src/adapters/types.ts
CHANGED
|
@@ -22,7 +22,7 @@ export interface IMcpRegistrationAdapter {
|
|
|
22
22
|
/**
|
|
23
23
|
* Called once at startup to activate the adapter's server registrations.
|
|
24
24
|
*/
|
|
25
|
-
activate: () =>
|
|
25
|
+
activate: () => Promise< void >;
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Called once per tool when addTool() is invoked.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
2
2
|
import { z, type z3 } from '@elementor/schema';
|
|
3
3
|
|
|
4
|
+
import { type ModelContextRegisterTool, registerModelContextTool } from '../utils/register-model-context-tool';
|
|
4
5
|
import {
|
|
5
6
|
type IMcpRegistrationAdapter,
|
|
6
7
|
type McpResourceHandler,
|
|
@@ -12,8 +13,8 @@ import {
|
|
|
12
13
|
type ZodRawShape = z3.ZodRawShape;
|
|
13
14
|
|
|
14
15
|
export type ModelContext = {
|
|
15
|
-
registerTool:
|
|
16
|
-
unregisterTool
|
|
16
|
+
registerTool: ModelContextRegisterTool;
|
|
17
|
+
unregisterTool?: ( name: string ) => void;
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
type ResourceEntry = {
|
|
@@ -29,12 +30,12 @@ export class WebMCPAdapter implements IMcpRegistrationAdapter {
|
|
|
29
30
|
|
|
30
31
|
constructor( private readonly ctx: ModelContext ) {}
|
|
31
32
|
|
|
32
|
-
activate(): void {
|
|
33
|
+
activate(): Promise< void > {
|
|
33
34
|
if ( this.activated ) {
|
|
34
|
-
return;
|
|
35
|
+
return Promise.resolve();
|
|
35
36
|
}
|
|
36
37
|
this.activated = true;
|
|
37
|
-
this.ctx.registerTool
|
|
38
|
+
return registerModelContextTool( this.ctx.registerTool, {
|
|
38
39
|
name: 'editor-resource-getter',
|
|
39
40
|
description:
|
|
40
41
|
'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',
|
|
@@ -98,7 +99,8 @@ export class WebMCPAdapter implements IMcpRegistrationAdapter {
|
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
if ( this.registeredToolNames.has( tool.name ) ) {
|
|
101
|
-
this.ctx.unregisterTool( tool.name );
|
|
102
|
+
this.ctx.unregisterTool?.( tool.name );
|
|
103
|
+
this.registeredToolNames.delete( tool.name );
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
let resourcesDescription = '';
|
|
@@ -111,13 +113,14 @@ export class WebMCPAdapter implements IMcpRegistrationAdapter {
|
|
|
111
113
|
}
|
|
112
114
|
resourcesDescription += `To read resources, use editor-resource-getter tool.\n\n`;
|
|
113
115
|
}
|
|
114
|
-
this.ctx.registerTool
|
|
116
|
+
void registerModelContextTool( this.ctx.registerTool, {
|
|
115
117
|
name: tool.name,
|
|
116
118
|
description: `${ resourcesDescription }${ tool.description }`,
|
|
117
119
|
inputSchema: jsonSchema,
|
|
118
120
|
execute: tool.execute,
|
|
121
|
+
} ).then( () => {
|
|
122
|
+
this.registeredToolNames.add( tool.name );
|
|
119
123
|
} );
|
|
120
|
-
this.registeredToolNames.add( tool.name );
|
|
121
124
|
}
|
|
122
125
|
|
|
123
126
|
onResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';
|
|
2
|
+
|
|
3
|
+
export type McpStylesAppliedPayload = {
|
|
4
|
+
styleValue: Record< string, unknown >;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {
|
|
8
|
+
window.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );
|
|
9
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -22,3 +22,8 @@ export { installAngiePlugin, type InstallAngieResult } from './utils/install-ang
|
|
|
22
22
|
export { saveAngieConsent } from './utils/save-angie-consent';
|
|
23
23
|
export const getAngieSdk = () => getSDK();
|
|
24
24
|
export * from './init';
|
|
25
|
+
export {
|
|
26
|
+
dispatchMcpStylesAppliedEvent,
|
|
27
|
+
MCP_STYLES_APPLIED_EVENT,
|
|
28
|
+
type McpStylesAppliedPayload,
|
|
29
|
+
} from './events/mcp-styles-applied-event';
|
package/src/init.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';
|
|
2
2
|
|
|
3
3
|
let isInitialized = false;
|
|
4
|
-
export function startMCPServer() {
|
|
4
|
+
export async function startMCPServer() {
|
|
5
5
|
if ( isInitialized ) {
|
|
6
6
|
return;
|
|
7
7
|
}
|
|
8
8
|
isInitialized = true;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
try {
|
|
10
|
+
await createAndRegisterAdapters();
|
|
11
|
+
} catch ( error ) {
|
|
12
|
+
/* eslint-disable-next-line no-console */
|
|
13
|
+
console.error( 'MCP adapter activation failed:', error );
|
|
14
|
+
} finally {
|
|
15
|
+
signalMcpReady();
|
|
16
|
+
}
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
if ( typeof document !== 'undefined' ) {
|
|
15
|
-
document.addEventListener( 'DOMContentLoaded', () => startMCPServer(), { once: true } );
|
|
20
|
+
document.addEventListener( 'DOMContentLoaded', () => void startMCPServer(), { once: true } );
|
|
16
21
|
} else {
|
|
17
|
-
startMCPServer();
|
|
22
|
+
void startMCPServer();
|
|
18
23
|
}
|
package/src/mcp-registry.ts
CHANGED
|
@@ -58,7 +58,7 @@ export const signalMcpReady = (): void => {
|
|
|
58
58
|
resolveReady();
|
|
59
59
|
};
|
|
60
60
|
|
|
61
|
-
export const createAndRegisterAdapters = () => {
|
|
61
|
+
export const createAndRegisterAdapters = async (): Promise< void > => {
|
|
62
62
|
const modelContext = getModelContext();
|
|
63
63
|
|
|
64
64
|
if ( modelContext ) {
|
|
@@ -69,14 +69,14 @@ export const createAndRegisterAdapters = () => {
|
|
|
69
69
|
registerMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
registrationAdapters.
|
|
72
|
+
await Promise.all( registrationAdapters.map( ( adapter ) => adapter.activate() ) );
|
|
73
73
|
};
|
|
74
74
|
|
|
75
75
|
// utility function to run a callback on all MCP interfaces
|
|
76
|
-
function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {
|
|
77
|
-
for ( const adapter of registrationAdapters ) {
|
|
76
|
+
async function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {
|
|
77
|
+
for await ( const adapter of registrationAdapters ) {
|
|
78
78
|
try {
|
|
79
|
-
fn( adapter );
|
|
79
|
+
await Promise.resolve( fn( adapter ) );
|
|
80
80
|
} catch {
|
|
81
81
|
// adapter failed — exit quietly, continue to next
|
|
82
82
|
}
|
|
@@ -4,11 +4,24 @@ type ModelContextHost = {
|
|
|
4
4
|
modelContext?: ModelContext;
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
function bindModelContextMethods( host: ModelContext ): ModelContext {
|
|
8
|
+
return {
|
|
9
|
+
registerTool: host.registerTool.bind( host ),
|
|
10
|
+
unregisterTool: host.unregisterTool ? host.unregisterTool.bind( host ) : undefined,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
7
14
|
export function getModelContext(): ModelContext | undefined {
|
|
8
15
|
const documentModelContext =
|
|
9
16
|
typeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;
|
|
17
|
+
if ( documentModelContext?.registerTool ) {
|
|
18
|
+
return bindModelContextMethods( documentModelContext );
|
|
19
|
+
}
|
|
10
20
|
const navigatorModelContext =
|
|
11
21
|
typeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;
|
|
22
|
+
if ( navigatorModelContext?.registerTool ) {
|
|
23
|
+
return bindModelContextMethods( navigatorModelContext );
|
|
24
|
+
}
|
|
12
25
|
|
|
13
|
-
return
|
|
26
|
+
return undefined;
|
|
14
27
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type McpToolDescriptor } from '../adapters/types';
|
|
2
|
+
|
|
3
|
+
export type ModelContextRegisterTool = ( tool: McpToolDescriptor ) => void | Promise< void >;
|
|
4
|
+
|
|
5
|
+
export async function registerModelContextTool(
|
|
6
|
+
registerTool: ModelContextRegisterTool,
|
|
7
|
+
tool: McpToolDescriptor
|
|
8
|
+
): Promise< void > {
|
|
9
|
+
try {
|
|
10
|
+
await Promise.resolve( registerTool( tool ) );
|
|
11
|
+
} catch ( error ) {
|
|
12
|
+
/* eslint-disable-next-line no-console */
|
|
13
|
+
console.error( 'Tool registration failed:', error );
|
|
14
|
+
}
|
|
15
|
+
}
|