@elementor/editor-mcp 4.3.0-994 → 4.3.0-996
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +10 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12 -24
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/adapters/angie-adapter.ts +1 -5
- package/src/mcp-registry.ts +2 -4
- package/src/utils/get-sdk.ts +6 -11
- package/src/utils/is-angie-available.ts +3 -13
package/dist/index.js
CHANGED
|
@@ -64,26 +64,23 @@ module.exports = __toCommonJS(index_exports);
|
|
|
64
64
|
var import_angie_sdk = require("@elementor-external/angie-sdk");
|
|
65
65
|
var import_angie_sdk2 = require("@elementor-external/angie-sdk");
|
|
66
66
|
var sdk;
|
|
67
|
-
var LEGACY_ANGIE_WAIT_RETRY_COUNT = 3;
|
|
68
|
-
var LEGACY_ANGIE_WAIT_RETRY_DELAY_MS = 1e4;
|
|
69
67
|
var RetriableAngieSDK = class extends import_angie_sdk.AngieMcpSdk {
|
|
70
68
|
async waitForReady() {
|
|
71
|
-
let retryCount =
|
|
69
|
+
let retryCount = 3;
|
|
72
70
|
while (retryCount > 0) {
|
|
73
71
|
try {
|
|
74
72
|
await super.waitForReady();
|
|
75
73
|
return;
|
|
76
74
|
} catch {
|
|
77
75
|
retryCount--;
|
|
78
|
-
|
|
79
|
-
throw new Error("Angie SDK failed to become ready after retries");
|
|
80
|
-
}
|
|
81
|
-
await sleep(LEGACY_ANGIE_WAIT_RETRY_DELAY_MS);
|
|
76
|
+
await sleep();
|
|
82
77
|
}
|
|
83
78
|
}
|
|
79
|
+
return new Promise(() => {
|
|
80
|
+
});
|
|
84
81
|
}
|
|
85
82
|
};
|
|
86
|
-
var sleep = (ms) => new Promise((resolve) => {
|
|
83
|
+
var sleep = (ms = 1e4) => new Promise((resolve) => {
|
|
87
84
|
setTimeout(resolve, ms);
|
|
88
85
|
});
|
|
89
86
|
var getSDK = () => {
|
|
@@ -92,7 +89,7 @@ var getSDK = () => {
|
|
|
92
89
|
return {};
|
|
93
90
|
}
|
|
94
91
|
if (!sdk) {
|
|
95
|
-
sdk =
|
|
92
|
+
sdk = new RetriableAngieSDK();
|
|
96
93
|
}
|
|
97
94
|
return sdk;
|
|
98
95
|
};
|
|
@@ -103,14 +100,8 @@ var import_types2 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
103
100
|
|
|
104
101
|
// src/utils/is-angie-available.ts
|
|
105
102
|
var import_angie_sdk3 = require("@elementor-external/angie-sdk");
|
|
106
|
-
var
|
|
107
|
-
|
|
108
|
-
var isLegacyAngieAvailable = () => !(0, import_angie_sdk3.isAngiePluginAvailable)() && !!(0, import_angie_sdk3.getAngieIframe)();
|
|
109
|
-
var waitForAngieReady = async () => {
|
|
110
|
-
if ((0, import_angie_sdk3.isAngiePluginAvailable)()) {
|
|
111
|
-
return (0, import_angie_sdk3.waitForAngiePluginActive)(ANGIE_PLUGIN_DETECTION_TIMEOUT_MS);
|
|
112
|
-
}
|
|
113
|
-
return isAngieAvailable();
|
|
103
|
+
var isAngieAvailable = () => {
|
|
104
|
+
return !!(0, import_angie_sdk3.getAngieIframe)();
|
|
114
105
|
};
|
|
115
106
|
|
|
116
107
|
// src/utils/is-angie-sidebar-open.ts
|
|
@@ -137,9 +128,7 @@ var AngieMcpAdapter = class {
|
|
|
137
128
|
this.getRegisteredMcpServers = getRegisteredMcpServers2;
|
|
138
129
|
}
|
|
139
130
|
async activate() {
|
|
140
|
-
|
|
141
|
-
await this.sdk.waitForReady();
|
|
142
|
-
}
|
|
131
|
+
await this.sdk.waitForReady();
|
|
143
132
|
await this.registerEntries(this.getRegisteredMcpServers(), MAX_RETRIES);
|
|
144
133
|
}
|
|
145
134
|
async registerEntries(entries, retry) {
|
|
@@ -434,8 +423,7 @@ var createAndRegisterAdapters = async () => {
|
|
|
434
423
|
if (modelContext) {
|
|
435
424
|
registerMcpAdapter(new WebMCPAdapter(modelContext));
|
|
436
425
|
}
|
|
437
|
-
|
|
438
|
-
if (isAngieReady) {
|
|
426
|
+
if (isAngieAvailable()) {
|
|
439
427
|
registerMcpAdapter(new AngieMcpAdapter(getSDK(), getRegisteredMcpServers));
|
|
440
428
|
}
|
|
441
429
|
await Promise.all(registrationAdapters.map((adapter) => adapter.activate()));
|
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/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, isAngiePluginAvailable } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nconst LEGACY_ANGIE_WAIT_RETRY_COUNT = 3;\nconst LEGACY_ANGIE_WAIT_RETRY_DELAY_MS = 10_000;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = LEGACY_ANGIE_WAIT_RETRY_COUNT;\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\tif ( retryCount === 0 ) {\n\t\t\t\t\tthrow new Error( 'Angie SDK failed to become ready after retries' );\n\t\t\t\t}\n\t\t\t\tawait sleep( LEGACY_ANGIE_WAIT_RETRY_DELAY_MS );\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst sleep = ( ms: number ) =>\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 = isAngiePluginAvailable() ? new AngieMcpSdk() : new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getAngieIframe, isAngiePluginAvailable, waitForAngiePluginActive } from '@elementor-external/angie-sdk';\n\nconst ANGIE_PLUGIN_DETECTION_TIMEOUT_MS = 3_000;\n\nexport const isAngieAvailable = (): boolean => isAngiePluginAvailable() || !! getAngieIframe();\n\nexport const isLegacyAngieAvailable = (): boolean => ! isAngiePluginAvailable() && !! getAngieIframe();\n\nexport const waitForAngieReady = async (): Promise< boolean > => {\n\tif ( isAngiePluginAvailable() ) {\n\t\treturn waitForAngiePluginActive( ANGIE_PLUGIN_DETECTION_TIMEOUT_MS );\n\t}\n\n\treturn isAngieAvailable();\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 { waitForAngieReady } 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\tconst isAngieReady = await waitForAngieReady();\n\n\tif ( isAngieReady ) {\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\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 { isLegacyAngieAvailable } from '../utils/is-angie-available';\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\tif ( isLegacyAngieAvailable() ) {\n\t\t\tawait this.sdk.waitForReady();\n\t\t}\n\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://style/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"]}
|
|
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\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 { 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://style/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
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
// src/utils/get-sdk.ts
|
|
2
|
-
import { AngieMcpSdk
|
|
2
|
+
import { AngieMcpSdk } from "@elementor-external/angie-sdk";
|
|
3
3
|
import { getAngieIframe, MessageEventType } from "@elementor-external/angie-sdk";
|
|
4
4
|
var sdk;
|
|
5
|
-
var LEGACY_ANGIE_WAIT_RETRY_COUNT = 3;
|
|
6
|
-
var LEGACY_ANGIE_WAIT_RETRY_DELAY_MS = 1e4;
|
|
7
5
|
var RetriableAngieSDK = class extends AngieMcpSdk {
|
|
8
6
|
async waitForReady() {
|
|
9
|
-
let retryCount =
|
|
7
|
+
let retryCount = 3;
|
|
10
8
|
while (retryCount > 0) {
|
|
11
9
|
try {
|
|
12
10
|
await super.waitForReady();
|
|
13
11
|
return;
|
|
14
12
|
} catch {
|
|
15
13
|
retryCount--;
|
|
16
|
-
|
|
17
|
-
throw new Error("Angie SDK failed to become ready after retries");
|
|
18
|
-
}
|
|
19
|
-
await sleep(LEGACY_ANGIE_WAIT_RETRY_DELAY_MS);
|
|
14
|
+
await sleep();
|
|
20
15
|
}
|
|
21
16
|
}
|
|
17
|
+
return new Promise(() => {
|
|
18
|
+
});
|
|
22
19
|
}
|
|
23
20
|
};
|
|
24
|
-
var sleep = (ms) => new Promise((resolve) => {
|
|
21
|
+
var sleep = (ms = 1e4) => new Promise((resolve) => {
|
|
25
22
|
setTimeout(resolve, ms);
|
|
26
23
|
});
|
|
27
24
|
var getSDK = () => {
|
|
@@ -30,7 +27,7 @@ var getSDK = () => {
|
|
|
30
27
|
return {};
|
|
31
28
|
}
|
|
32
29
|
if (!sdk) {
|
|
33
|
-
sdk =
|
|
30
|
+
sdk = new RetriableAngieSDK();
|
|
34
31
|
}
|
|
35
32
|
return sdk;
|
|
36
33
|
};
|
|
@@ -43,15 +40,9 @@ import {
|
|
|
43
40
|
import { SamplingMessageSchema as SamplingMessageSchema2 } from "@modelcontextprotocol/sdk/types.js";
|
|
44
41
|
|
|
45
42
|
// src/utils/is-angie-available.ts
|
|
46
|
-
import { getAngieIframe as getAngieIframe2
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
var isLegacyAngieAvailable = () => !isAngiePluginAvailable2() && !!getAngieIframe2();
|
|
50
|
-
var waitForAngieReady = async () => {
|
|
51
|
-
if (isAngiePluginAvailable2()) {
|
|
52
|
-
return waitForAngiePluginActive(ANGIE_PLUGIN_DETECTION_TIMEOUT_MS);
|
|
53
|
-
}
|
|
54
|
-
return isAngieAvailable();
|
|
43
|
+
import { getAngieIframe as getAngieIframe2 } from "@elementor-external/angie-sdk";
|
|
44
|
+
var isAngieAvailable = () => {
|
|
45
|
+
return !!getAngieIframe2();
|
|
55
46
|
};
|
|
56
47
|
|
|
57
48
|
// src/utils/is-angie-sidebar-open.ts
|
|
@@ -78,9 +69,7 @@ var AngieMcpAdapter = class {
|
|
|
78
69
|
this.getRegisteredMcpServers = getRegisteredMcpServers2;
|
|
79
70
|
}
|
|
80
71
|
async activate() {
|
|
81
|
-
|
|
82
|
-
await this.sdk.waitForReady();
|
|
83
|
-
}
|
|
72
|
+
await this.sdk.waitForReady();
|
|
84
73
|
await this.registerEntries(this.getRegisteredMcpServers(), MAX_RETRIES);
|
|
85
74
|
}
|
|
86
75
|
async registerEntries(entries, retry) {
|
|
@@ -375,8 +364,7 @@ var createAndRegisterAdapters = async () => {
|
|
|
375
364
|
if (modelContext) {
|
|
376
365
|
registerMcpAdapter(new WebMCPAdapter(modelContext));
|
|
377
366
|
}
|
|
378
|
-
|
|
379
|
-
if (isAngieReady) {
|
|
367
|
+
if (isAngieAvailable()) {
|
|
380
368
|
registerMcpAdapter(new AngieMcpAdapter(getSDK(), getRegisteredMcpServers));
|
|
381
369
|
}
|
|
382
370
|
await Promise.all(registrationAdapters.map((adapter) => adapter.activate()));
|
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/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, isAngiePluginAvailable } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nconst LEGACY_ANGIE_WAIT_RETRY_COUNT = 3;\nconst LEGACY_ANGIE_WAIT_RETRY_DELAY_MS = 10_000;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = LEGACY_ANGIE_WAIT_RETRY_COUNT;\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\tif ( retryCount === 0 ) {\n\t\t\t\t\tthrow new Error( 'Angie SDK failed to become ready after retries' );\n\t\t\t\t}\n\t\t\t\tawait sleep( LEGACY_ANGIE_WAIT_RETRY_DELAY_MS );\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst sleep = ( ms: number ) =>\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 = isAngiePluginAvailable() ? new AngieMcpSdk() : 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, isAngiePluginAvailable, waitForAngiePluginActive } from '@elementor-external/angie-sdk';\n\nconst ANGIE_PLUGIN_DETECTION_TIMEOUT_MS = 3_000;\n\nexport const isAngieAvailable = (): boolean => isAngiePluginAvailable() || !! getAngieIframe();\n\nexport const isLegacyAngieAvailable = (): boolean => ! isAngiePluginAvailable() && !! getAngieIframe();\n\nexport const waitForAngieReady = async (): Promise< boolean > => {\n\tif ( isAngiePluginAvailable() ) {\n\t\treturn waitForAngiePluginActive( ANGIE_PLUGIN_DETECTION_TIMEOUT_MS );\n\t}\n\n\treturn isAngieAvailable();\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 { waitForAngieReady } 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\tconst isAngieReady = await waitForAngieReady();\n\n\tif ( isAngieReady ) {\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\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 { isLegacyAngieAvailable } from '../utils/is-angie-available';\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\tif ( isLegacyAngieAvailable() ) {\n\t\t\tawait this.sdk.waitForReady();\n\t\t}\n\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://style/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","isAngiePluginAvailable","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\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 { 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://style/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.3.0-
|
|
3
|
+
"version": "4.3.0-996",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"tsup": "^8.3.5"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@elementor-external/angie-sdk": "npm:@elementor/angie-sdk@^1.4.
|
|
46
|
-
"@elementor/editor-v1-adapters": "4.3.0-
|
|
47
|
-
"@elementor/schema": "4.3.0-
|
|
48
|
-
"@elementor/store": "4.3.0-
|
|
45
|
+
"@elementor-external/angie-sdk": "npm:@elementor/angie-sdk@^1.4.5",
|
|
46
|
+
"@elementor/editor-v1-adapters": "4.3.0-996",
|
|
47
|
+
"@elementor/schema": "4.3.0-996",
|
|
48
|
+
"@elementor/store": "4.3.0-996",
|
|
49
49
|
"@modelcontextprotocol/sdk": "1.27.1",
|
|
50
50
|
"@wordpress/api-fetch": "^6.42.0",
|
|
51
51
|
"zod-to-json-schema": "3.24.6"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type AngieMcpSdk } from '@elementor-external/angie-sdk';
|
|
2
2
|
|
|
3
3
|
import { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';
|
|
4
|
-
import { isLegacyAngieAvailable } from '../utils/is-angie-available';
|
|
5
4
|
import { toMCPTitle } from '../utils/to-mcp-title';
|
|
6
5
|
import { type IMcpRegistrationAdapter } from './types';
|
|
7
6
|
|
|
@@ -14,10 +13,7 @@ export class AngieMcpAdapter implements IMcpRegistrationAdapter {
|
|
|
14
13
|
) {}
|
|
15
14
|
|
|
16
15
|
async activate(): Promise< void > {
|
|
17
|
-
|
|
18
|
-
await this.sdk.waitForReady();
|
|
19
|
-
}
|
|
20
|
-
|
|
16
|
+
await this.sdk.waitForReady();
|
|
21
17
|
await this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );
|
|
22
18
|
}
|
|
23
19
|
|
package/src/mcp-registry.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import { mockMcpRegistry } from './test-utils/mock-mcp-registry';
|
|
16
16
|
import { getModelContext } from './utils/get-model-context';
|
|
17
17
|
import { getSDK } from './utils/get-sdk';
|
|
18
|
-
import {
|
|
18
|
+
import { isAngieAvailable } from './utils/is-angie-available';
|
|
19
19
|
import { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';
|
|
20
20
|
import { registerServerDocsResource } from './utils/register-server-docs-resource';
|
|
21
21
|
import { toMCPTitle } from './utils/to-mcp-title';
|
|
@@ -65,9 +65,7 @@ export const createAndRegisterAdapters = async (): Promise< void > => {
|
|
|
65
65
|
registerMcpAdapter( new WebMCPAdapter( modelContext ) );
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if ( isAngieReady ) {
|
|
68
|
+
if ( isAngieAvailable() ) {
|
|
71
69
|
registerMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );
|
|
72
70
|
}
|
|
73
71
|
|
package/src/utils/get-sdk.ts
CHANGED
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import { AngieMcpSdk
|
|
1
|
+
import { AngieMcpSdk } from '@elementor-external/angie-sdk';
|
|
2
2
|
export { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';
|
|
3
3
|
|
|
4
4
|
let sdk: AngieMcpSdk;
|
|
5
5
|
|
|
6
|
-
const LEGACY_ANGIE_WAIT_RETRY_COUNT = 3;
|
|
7
|
-
const LEGACY_ANGIE_WAIT_RETRY_DELAY_MS = 10_000;
|
|
8
|
-
|
|
9
6
|
class RetriableAngieSDK extends AngieMcpSdk {
|
|
10
7
|
public async waitForReady(): Promise< void > {
|
|
11
|
-
let retryCount =
|
|
8
|
+
let retryCount = 3;
|
|
12
9
|
while ( retryCount > 0 ) {
|
|
13
10
|
try {
|
|
14
11
|
await super.waitForReady();
|
|
15
12
|
return;
|
|
16
13
|
} catch {
|
|
17
14
|
retryCount--;
|
|
18
|
-
|
|
19
|
-
throw new Error( 'Angie SDK failed to become ready after retries' );
|
|
20
|
-
}
|
|
21
|
-
await sleep( LEGACY_ANGIE_WAIT_RETRY_DELAY_MS );
|
|
15
|
+
await sleep();
|
|
22
16
|
}
|
|
23
17
|
}
|
|
18
|
+
return new Promise( () => {} ); // never resolves
|
|
24
19
|
}
|
|
25
20
|
}
|
|
26
21
|
|
|
27
|
-
const sleep = ( ms
|
|
22
|
+
const sleep = ( ms = 10_000 ) =>
|
|
28
23
|
new Promise( ( resolve ) => {
|
|
29
24
|
setTimeout( resolve, ms );
|
|
30
25
|
} );
|
|
@@ -36,7 +31,7 @@ export const getSDK = () => {
|
|
|
36
31
|
return {} as unknown as AngieMcpSdk;
|
|
37
32
|
}
|
|
38
33
|
if ( ! sdk ) {
|
|
39
|
-
sdk =
|
|
34
|
+
sdk = new RetriableAngieSDK();
|
|
40
35
|
}
|
|
41
36
|
return sdk;
|
|
42
37
|
};
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
import { getAngieIframe
|
|
1
|
+
import { getAngieIframe } from '@elementor-external/angie-sdk';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
export const isAngieAvailable = (): boolean => isAngiePluginAvailable() || !! getAngieIframe();
|
|
6
|
-
|
|
7
|
-
export const isLegacyAngieAvailable = (): boolean => ! isAngiePluginAvailable() && !! getAngieIframe();
|
|
8
|
-
|
|
9
|
-
export const waitForAngieReady = async (): Promise< boolean > => {
|
|
10
|
-
if ( isAngiePluginAvailable() ) {
|
|
11
|
-
return waitForAngiePluginActive( ANGIE_PLUGIN_DETECTION_TIMEOUT_MS );
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return isAngieAvailable();
|
|
3
|
+
export const isAngieAvailable = (): boolean => {
|
|
4
|
+
return !! getAngieIframe();
|
|
15
5
|
};
|