@strapi/core 5.46.1 → 5.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core-api/routes/index.js +2 -0
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +2 -0
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +13 -1
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +15 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +15 -2
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/package.json.js +14 -12
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +14 -12
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +3 -1
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/mcp.d.ts +3 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +39 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/mcp.mjs +37 -0
- package/dist/providers/mcp.mjs.map +1 -0
- package/dist/services/ai.d.ts.map +1 -1
- package/dist/services/ai.js +3 -0
- package/dist/services/ai.js.map +1 -1
- package/dist/services/ai.mjs +3 -0
- package/dist/services/ai.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +2 -16
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +0 -53
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +2 -53
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +2 -2
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/publication-filter.d.ts +6 -0
- package/dist/services/document-service/publication-filter.d.ts.map +1 -0
- package/dist/services/document-service/publication-filter.js +20 -0
- package/dist/services/document-service/publication-filter.js.map +1 -0
- package/dist/services/document-service/publication-filter.mjs +15 -0
- package/dist/services/document-service/publication-filter.mjs.map +1 -0
- package/dist/services/document-service/transform/query.d.ts +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +32 -19
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +33 -20
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/authentication.d.ts +23 -0
- package/dist/services/mcp/authentication.d.ts.map +1 -0
- package/dist/services/mcp/authentication.js +45 -0
- package/dist/services/mcp/authentication.js.map +1 -0
- package/dist/services/mcp/authentication.mjs +43 -0
- package/dist/services/mcp/authentication.mjs.map +1 -0
- package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
- package/dist/services/mcp/handlers/handlePost.js +59 -0
- package/dist/services/mcp/handlers/handlePost.js.map +1 -0
- package/dist/services/mcp/handlers/handlePost.mjs +57 -0
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
- package/dist/services/mcp/handlers/types.d.ts +12 -0
- package/dist/services/mcp/handlers/types.d.ts.map +1 -0
- package/dist/services/mcp/index.d.ts +6 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +101 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/index.mjs +99 -0
- package/dist/services/mcp/index.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.js +34 -0
- package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.js +71 -0
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
- package/dist/services/mcp/metrics/metrics.d.ts +29 -0
- package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/metrics.js +97 -0
- package/dist/services/mcp/metrics/metrics.js.map +1 -0
- package/dist/services/mcp/metrics/metrics.mjs +88 -0
- package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
- package/dist/services/mcp/prompt-registry.d.ts +16 -0
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
- package/dist/services/mcp/prompt-registry.js +77 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -0
- package/dist/services/mcp/prompt-registry.mjs +75 -0
- package/dist/services/mcp/prompt-registry.mjs.map +1 -0
- package/dist/services/mcp/resource-registry.d.ts +14 -0
- package/dist/services/mcp/resource-registry.d.ts.map +1 -0
- package/dist/services/mcp/resource-registry.js +67 -0
- package/dist/services/mcp/resource-registry.js.map +1 -0
- package/dist/services/mcp/resource-registry.mjs +65 -0
- package/dist/services/mcp/resource-registry.mjs.map +1 -0
- package/dist/services/mcp/routes.d.ts +11 -0
- package/dist/services/mcp/routes.d.ts.map +1 -0
- package/dist/services/mcp/routes.js +58 -0
- package/dist/services/mcp/routes.js.map +1 -0
- package/dist/services/mcp/routes.mjs +56 -0
- package/dist/services/mcp/routes.mjs.map +1 -0
- package/dist/services/mcp/tool-registry.d.ts +25 -0
- package/dist/services/mcp/tool-registry.d.ts.map +1 -0
- package/dist/services/mcp/tool-registry.js +102 -0
- package/dist/services/mcp/tool-registry.js.map +1 -0
- package/dist/services/mcp/tool-registry.mjs +99 -0
- package/dist/services/mcp/tool-registry.mjs.map +1 -0
- package/dist/services/mcp/tools/log.d.ts +87 -0
- package/dist/services/mcp/tools/log.d.ts.map +1 -0
- package/dist/services/mcp/tools/log.js +88 -0
- package/dist/services/mcp/tools/log.js.map +1 -0
- package/dist/services/mcp/tools/log.mjs +86 -0
- package/dist/services/mcp/tools/log.mjs.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
- package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
- package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
- package/dist/services/mcp/utils/withTimeout.js +23 -0
- package/dist/services/mcp/utils/withTimeout.js.map +1 -0
- package/dist/services/mcp/utils/withTimeout.mjs +21 -0
- package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +3 -1
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +3 -1
- package/dist/services/metrics/index.mjs.map +1 -1
- package/package.json +14 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSafeCapabilityRegistration.js","sources":["../../../../src/services/mcp/utils/createSafeCapabilityRegistration.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { RegisteredCapability } from '../internal/McpCapabilityRegistry';\nimport { wrapSafeHandler } from './safeHandlerWrapper';\n\n/**\n * A no-op registered capability used as fallback when SDK registration fails.\n *\n * This prevents one broken capability from aborting the entire registration loop.\n * The capability will appear as \"disabled\" and cannot be enabled.\n */\nexport const FAILED_REGISTERED_CAPABILITY: RegisteredCapability = Object.freeze({\n enabled: false,\n enable() {},\n disable() {},\n remove() {},\n});\n\n/**\n * Configuration for creating a safe capability registration\n */\nexport type SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered> = {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createHandler: (strapi: Core.Strapi) => THandler;\n createFallbackHandler: (errorMessage: string) => NoInfer<THandler>;\n createErrorResult: (error: Error, args: unknown[]) => TErrorResult;\n registerWithSdk: (safeHandler: THandler) => TRegistered;\n};\n\n/**\n * Creates a safe capability registration that protects Strapi core from user callback errors\n * at three levels:\n *\n * - Level 1: Catch factory invocation errors (createHandler throws)\n * - Level 2: Catch runtime execution errors (handler throws during invocation)\n * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)\n *\n * This prevents one broken capability from:\n * - Aborting the entire registration loop\n * - Crashing the MCP server\n * - Leaking unhandled errors to the user\n */\nexport const createSafeCapabilityRegistration = <THandler, TErrorResult, TRegistered>(\n config: SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered>\n): TRegistered => {\n const {\n strapi,\n capabilityType,\n name,\n createHandler,\n createFallbackHandler,\n createErrorResult,\n registerWithSdk,\n } = config;\n\n try {\n // Level 1: Safe factory invocation — catch errors from user's createHandler\n let rawHandler: THandler;\n\n try {\n rawHandler = createHandler(strapi);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" handler factory threw during initialization: ${message}`\n );\n\n // Substitute a fallback handler that always returns an error to the MCP client\n rawHandler = createFallbackHandler(message);\n }\n\n // Level 2: Safe runtime wrapping — catch errors from user's handler during execution\n const safeHandler = wrapSafeHandler(rawHandler as (...args: unknown[]) => Promise<unknown>, {\n strapi,\n capabilityType,\n name,\n createErrorResult,\n });\n\n return registerWithSdk(safeHandler as THandler);\n } catch (error) {\n // Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] Failed to register ${capabilityType.toLowerCase()} \"${name}\" with MCP server: ${message}`\n );\n return FAILED_REGISTERED_CAPABILITY as unknown as TRegistered;\n }\n};\n"],"names":["FAILED_REGISTERED_CAPABILITY","Object","freeze","enabled","enable","disable","remove","createSafeCapabilityRegistration","config","strapi","capabilityType","name","createHandler","createFallbackHandler","createErrorResult","registerWithSdk","rawHandler","error","message","Error","String","log","safeHandler","wrapSafeHandler","toLowerCase"],"mappings":";;;;AAIA;;;;;AAKC,IACM,MAAMA,4BAAAA,GAAqDC,MAAAA,CAAOC,MAAM,CAAC;IAC9EC,OAAAA,EAAS,KAAA;IACTC,MAAAA,CAAAA,GAAAA,CAAU,CAAA;IACVC,OAAAA,CAAAA,GAAAA,CAAW,CAAA;IACXC,MAAAA,CAAAA,GAAAA,CAAU;AACZ,CAAA;AAeA;;;;;;;;;;;;IAaO,MAAMC,gCAAAA,GAAmC,CAC9CC,MAAAA,GAAAA;AAEA,IAAA,MAAM,EACJC,MAAM,EACNC,cAAc,EACdC,IAAI,EACJC,aAAa,EACbC,qBAAqB,EACrBC,iBAAiB,EACjBC,eAAe,EAChB,GAAGP,MAAAA;IAEJ,IAAI;;QAEF,IAAIQ,UAAAA;QAEJ,IAAI;AACFA,YAAAA,UAAAA,GAAaJ,aAAAA,CAAcH,MAAAA,CAAAA;AAC7B,QAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;AACd,YAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,YAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEP,cAAAA,CAAe,EAAE,EAAEC,IAAAA,CAAK,+CAA+C,EAAEO,OAAAA,CAAAA,CAAS,CAAA;;AAI7FF,YAAAA,UAAAA,GAAaH,qBAAAA,CAAsBK,OAAAA,CAAAA;AACrC,QAAA;;QAGA,MAAMI,WAAAA,GAAcC,mCAAgBP,UAAAA,EAAwD;AAC1FP,YAAAA,MAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,IAAAA;AACAG,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,OAAOC,eAAAA,CAAgBO,WAAAA,CAAAA;AACzB,IAAA,CAAA,CAAE,OAAOL,KAAAA,EAAO;;AAEd,QAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,QAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,yBAAyB,EAAEP,cAAAA,CAAec,WAAW,GAAG,EAAE,EAAEb,IAAAA,CAAK,mBAAmB,EAAEO,OAAAA,CAAAA,CAAS,CAAA;QAElG,OAAOlB,4BAAAA;AACT,IAAA;AACF;;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { wrapSafeHandler } from './safeHandlerWrapper.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A no-op registered capability used as fallback when SDK registration fails.
|
|
5
|
+
*
|
|
6
|
+
* This prevents one broken capability from aborting the entire registration loop.
|
|
7
|
+
* The capability will appear as "disabled" and cannot be enabled.
|
|
8
|
+
*/ const FAILED_REGISTERED_CAPABILITY = Object.freeze({
|
|
9
|
+
enabled: false,
|
|
10
|
+
enable () {},
|
|
11
|
+
disable () {},
|
|
12
|
+
remove () {}
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Creates a safe capability registration that protects Strapi core from user callback errors
|
|
16
|
+
* at three levels:
|
|
17
|
+
*
|
|
18
|
+
* - Level 1: Catch factory invocation errors (createHandler throws)
|
|
19
|
+
* - Level 2: Catch runtime execution errors (handler throws during invocation)
|
|
20
|
+
* - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)
|
|
21
|
+
*
|
|
22
|
+
* This prevents one broken capability from:
|
|
23
|
+
* - Aborting the entire registration loop
|
|
24
|
+
* - Crashing the MCP server
|
|
25
|
+
* - Leaking unhandled errors to the user
|
|
26
|
+
*/ const createSafeCapabilityRegistration = (config)=>{
|
|
27
|
+
const { strapi, capabilityType, name, createHandler, createFallbackHandler, createErrorResult, registerWithSdk } = config;
|
|
28
|
+
try {
|
|
29
|
+
// Level 1: Safe factory invocation — catch errors from user's createHandler
|
|
30
|
+
let rawHandler;
|
|
31
|
+
try {
|
|
32
|
+
rawHandler = createHandler(strapi);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
35
|
+
strapi.log.error(`[MCP] ${capabilityType} "${name}" handler factory threw during initialization: ${message}`);
|
|
36
|
+
// Substitute a fallback handler that always returns an error to the MCP client
|
|
37
|
+
rawHandler = createFallbackHandler(message);
|
|
38
|
+
}
|
|
39
|
+
// Level 2: Safe runtime wrapping — catch errors from user's handler during execution
|
|
40
|
+
const safeHandler = wrapSafeHandler(rawHandler, {
|
|
41
|
+
strapi,
|
|
42
|
+
capabilityType,
|
|
43
|
+
name,
|
|
44
|
+
createErrorResult
|
|
45
|
+
});
|
|
46
|
+
return registerWithSdk(safeHandler);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
// Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
strapi.log.error(`[MCP] Failed to register ${capabilityType.toLowerCase()} "${name}" with MCP server: ${message}`);
|
|
51
|
+
return FAILED_REGISTERED_CAPABILITY;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { FAILED_REGISTERED_CAPABILITY, createSafeCapabilityRegistration };
|
|
56
|
+
//# sourceMappingURL=createSafeCapabilityRegistration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSafeCapabilityRegistration.mjs","sources":["../../../../src/services/mcp/utils/createSafeCapabilityRegistration.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { RegisteredCapability } from '../internal/McpCapabilityRegistry';\nimport { wrapSafeHandler } from './safeHandlerWrapper';\n\n/**\n * A no-op registered capability used as fallback when SDK registration fails.\n *\n * This prevents one broken capability from aborting the entire registration loop.\n * The capability will appear as \"disabled\" and cannot be enabled.\n */\nexport const FAILED_REGISTERED_CAPABILITY: RegisteredCapability = Object.freeze({\n enabled: false,\n enable() {},\n disable() {},\n remove() {},\n});\n\n/**\n * Configuration for creating a safe capability registration\n */\nexport type SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered> = {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createHandler: (strapi: Core.Strapi) => THandler;\n createFallbackHandler: (errorMessage: string) => NoInfer<THandler>;\n createErrorResult: (error: Error, args: unknown[]) => TErrorResult;\n registerWithSdk: (safeHandler: THandler) => TRegistered;\n};\n\n/**\n * Creates a safe capability registration that protects Strapi core from user callback errors\n * at three levels:\n *\n * - Level 1: Catch factory invocation errors (createHandler throws)\n * - Level 2: Catch runtime execution errors (handler throws during invocation)\n * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)\n *\n * This prevents one broken capability from:\n * - Aborting the entire registration loop\n * - Crashing the MCP server\n * - Leaking unhandled errors to the user\n */\nexport const createSafeCapabilityRegistration = <THandler, TErrorResult, TRegistered>(\n config: SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered>\n): TRegistered => {\n const {\n strapi,\n capabilityType,\n name,\n createHandler,\n createFallbackHandler,\n createErrorResult,\n registerWithSdk,\n } = config;\n\n try {\n // Level 1: Safe factory invocation — catch errors from user's createHandler\n let rawHandler: THandler;\n\n try {\n rawHandler = createHandler(strapi);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" handler factory threw during initialization: ${message}`\n );\n\n // Substitute a fallback handler that always returns an error to the MCP client\n rawHandler = createFallbackHandler(message);\n }\n\n // Level 2: Safe runtime wrapping — catch errors from user's handler during execution\n const safeHandler = wrapSafeHandler(rawHandler as (...args: unknown[]) => Promise<unknown>, {\n strapi,\n capabilityType,\n name,\n createErrorResult,\n });\n\n return registerWithSdk(safeHandler as THandler);\n } catch (error) {\n // Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] Failed to register ${capabilityType.toLowerCase()} \"${name}\" with MCP server: ${message}`\n );\n return FAILED_REGISTERED_CAPABILITY as unknown as TRegistered;\n }\n};\n"],"names":["FAILED_REGISTERED_CAPABILITY","Object","freeze","enabled","enable","disable","remove","createSafeCapabilityRegistration","config","strapi","capabilityType","name","createHandler","createFallbackHandler","createErrorResult","registerWithSdk","rawHandler","error","message","Error","String","log","safeHandler","wrapSafeHandler","toLowerCase"],"mappings":";;AAIA;;;;;AAKC,IACM,MAAMA,4BAAAA,GAAqDC,MAAAA,CAAOC,MAAM,CAAC;IAC9EC,OAAAA,EAAS,KAAA;IACTC,MAAAA,CAAAA,GAAAA,CAAU,CAAA;IACVC,OAAAA,CAAAA,GAAAA,CAAW,CAAA;IACXC,MAAAA,CAAAA,GAAAA,CAAU;AACZ,CAAA;AAeA;;;;;;;;;;;;IAaO,MAAMC,gCAAAA,GAAmC,CAC9CC,MAAAA,GAAAA;AAEA,IAAA,MAAM,EACJC,MAAM,EACNC,cAAc,EACdC,IAAI,EACJC,aAAa,EACbC,qBAAqB,EACrBC,iBAAiB,EACjBC,eAAe,EAChB,GAAGP,MAAAA;IAEJ,IAAI;;QAEF,IAAIQ,UAAAA;QAEJ,IAAI;AACFA,YAAAA,UAAAA,GAAaJ,aAAAA,CAAcH,MAAAA,CAAAA;AAC7B,QAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;AACd,YAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,YAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEP,cAAAA,CAAe,EAAE,EAAEC,IAAAA,CAAK,+CAA+C,EAAEO,OAAAA,CAAAA,CAAS,CAAA;;AAI7FF,YAAAA,UAAAA,GAAaH,qBAAAA,CAAsBK,OAAAA,CAAAA;AACrC,QAAA;;QAGA,MAAMI,WAAAA,GAAcC,gBAAgBP,UAAAA,EAAwD;AAC1FP,YAAAA,MAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,IAAAA;AACAG,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,OAAOC,eAAAA,CAAgBO,WAAAA,CAAAA;AACzB,IAAA,CAAA,CAAE,OAAOL,KAAAA,EAAO;;AAEd,QAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,QAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,yBAAyB,EAAEP,cAAAA,CAAec,WAAW,GAAG,EAAE,EAAEb,IAAAA,CAAK,mBAAmB,EAAEO,OAAAA,CAAAA,CAAS,CAAA;QAElG,OAAOlB,4BAAAA;AACT,IAAA;AACF;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC error codes and messages
|
|
3
|
+
* @see https://json-rpc.dev/docs/reference/error-codes
|
|
4
|
+
*/
|
|
5
|
+
export declare const JSON_RPC_ERRORS: {
|
|
6
|
+
readonly INTERNAL_ERROR: {
|
|
7
|
+
readonly code: -32603;
|
|
8
|
+
readonly message: "Internal error";
|
|
9
|
+
readonly httpStatus: 500;
|
|
10
|
+
};
|
|
11
|
+
readonly AUTHENTICATION_REQUIRED: {
|
|
12
|
+
readonly code: -32000;
|
|
13
|
+
readonly message: "Authentication required";
|
|
14
|
+
readonly httpStatus: 401;
|
|
15
|
+
};
|
|
16
|
+
readonly METHOD_NOT_ALLOWED: {
|
|
17
|
+
readonly code: -32601;
|
|
18
|
+
readonly message: "Method not allowed";
|
|
19
|
+
readonly httpStatus: 405;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=jsonRpcErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonRpcErrors.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/jsonRpcErrors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;CAgBlB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* JSON-RPC error codes and messages
|
|
5
|
+
* @see https://json-rpc.dev/docs/reference/error-codes
|
|
6
|
+
*/ const JSON_RPC_ERRORS = {
|
|
7
|
+
INTERNAL_ERROR: {
|
|
8
|
+
code: -32603,
|
|
9
|
+
message: 'Internal error',
|
|
10
|
+
httpStatus: 500
|
|
11
|
+
},
|
|
12
|
+
AUTHENTICATION_REQUIRED: {
|
|
13
|
+
code: -32e3,
|
|
14
|
+
message: 'Authentication required',
|
|
15
|
+
httpStatus: 401
|
|
16
|
+
},
|
|
17
|
+
METHOD_NOT_ALLOWED: {
|
|
18
|
+
code: -32601,
|
|
19
|
+
message: 'Method not allowed',
|
|
20
|
+
httpStatus: 405
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.JSON_RPC_ERRORS = JSON_RPC_ERRORS;
|
|
25
|
+
//# sourceMappingURL=jsonRpcErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonRpcErrors.js","sources":["../../../../src/services/mcp/utils/jsonRpcErrors.ts"],"sourcesContent":["/**\n * JSON-RPC error codes and messages\n * @see https://json-rpc.dev/docs/reference/error-codes\n */\nexport const JSON_RPC_ERRORS = {\n INTERNAL_ERROR: {\n code: -32603, // \tInternal error\n message: 'Internal error',\n httpStatus: 500,\n },\n AUTHENTICATION_REQUIRED: {\n code: -32000, // Server error\n message: 'Authentication required',\n httpStatus: 401,\n },\n METHOD_NOT_ALLOWED: {\n code: -32601, // Method not found\n message: 'Method not allowed',\n httpStatus: 405,\n },\n} as const;\n"],"names":["JSON_RPC_ERRORS","INTERNAL_ERROR","code","message","httpStatus","AUTHENTICATION_REQUIRED","METHOD_NOT_ALLOWED"],"mappings":";;AAAA;;;UAIaA,eAAAA,GAAkB;IAC7BC,cAAAA,EAAgB;AACdC,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,gBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAC,uBAAAA,EAAyB;AACvBH,QAAAA,IAAAA,EAAM,KAAC;QACPC,OAAAA,EAAS,yBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAE,kBAAAA,EAAoB;AAClBJ,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,oBAAA;QACTC,UAAAA,EAAY;AACd;AACF;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC error codes and messages
|
|
3
|
+
* @see https://json-rpc.dev/docs/reference/error-codes
|
|
4
|
+
*/ const JSON_RPC_ERRORS = {
|
|
5
|
+
INTERNAL_ERROR: {
|
|
6
|
+
code: -32603,
|
|
7
|
+
message: 'Internal error',
|
|
8
|
+
httpStatus: 500
|
|
9
|
+
},
|
|
10
|
+
AUTHENTICATION_REQUIRED: {
|
|
11
|
+
code: -32e3,
|
|
12
|
+
message: 'Authentication required',
|
|
13
|
+
httpStatus: 401
|
|
14
|
+
},
|
|
15
|
+
METHOD_NOT_ALLOWED: {
|
|
16
|
+
code: -32601,
|
|
17
|
+
message: 'Method not allowed',
|
|
18
|
+
httpStatus: 405
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { JSON_RPC_ERRORS };
|
|
23
|
+
//# sourceMappingURL=jsonRpcErrors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonRpcErrors.mjs","sources":["../../../../src/services/mcp/utils/jsonRpcErrors.ts"],"sourcesContent":["/**\n * JSON-RPC error codes and messages\n * @see https://json-rpc.dev/docs/reference/error-codes\n */\nexport const JSON_RPC_ERRORS = {\n INTERNAL_ERROR: {\n code: -32603, // \tInternal error\n message: 'Internal error',\n httpStatus: 500,\n },\n AUTHENTICATION_REQUIRED: {\n code: -32000, // Server error\n message: 'Authentication required',\n httpStatus: 401,\n },\n METHOD_NOT_ALLOWED: {\n code: -32601, // Method not found\n message: 'Method not allowed',\n httpStatus: 405,\n },\n} as const;\n"],"names":["JSON_RPC_ERRORS","INTERNAL_ERROR","code","message","httpStatus","AUTHENTICATION_REQUIRED","METHOD_NOT_ALLOWED"],"mappings":"AAAA;;;UAIaA,eAAAA,GAAkB;IAC7BC,cAAAA,EAAgB;AACdC,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,gBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAC,uBAAAA,EAAyB;AACvBH,QAAAA,IAAAA,EAAM,KAAC;QACPC,OAAAA,EAAS,yBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAE,kBAAAA,EAAoB;AAClBJ,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,oBAAA;QACTC,UAAAA,EAAY;AACd;AACF;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Core } from '@strapi/types';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps an MCP capability handler to catch and log errors from user-provided callbacks.
|
|
4
|
+
*
|
|
5
|
+
* This prevents externally-registered capabilities (from plugin developers)
|
|
6
|
+
* from crashing Strapi core when they throw during execution.
|
|
7
|
+
*
|
|
8
|
+
* Errors are:
|
|
9
|
+
* - Logged with full detail (message + stack) via Strapi's logger
|
|
10
|
+
* - Returned to the MCP client as a safe error response (no stack trace leak)
|
|
11
|
+
*/
|
|
12
|
+
export declare const wrapSafeHandler: <TArgs extends unknown[], TResult>(handler: (...args: TArgs) => Promise<TResult>, options: {
|
|
13
|
+
strapi: Core.Strapi;
|
|
14
|
+
capabilityType: string;
|
|
15
|
+
name: string;
|
|
16
|
+
createErrorResult: (error: Error, args: TArgs) => TResult;
|
|
17
|
+
}) => ((...args: TArgs) => Promise<TResult>);
|
|
18
|
+
//# sourceMappingURL=safeHandlerWrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeHandlerWrapper.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/safeHandlerWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,8CACjB,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,OAAO,CAAC,WACpC;IACP,MAAM,EAAE,KAAK,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;CAC3D,KACA,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,OAAO,CAAC,CAoBvC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wraps an MCP capability handler to catch and log errors from user-provided callbacks.
|
|
5
|
+
*
|
|
6
|
+
* This prevents externally-registered capabilities (from plugin developers)
|
|
7
|
+
* from crashing Strapi core when they throw during execution.
|
|
8
|
+
*
|
|
9
|
+
* Errors are:
|
|
10
|
+
* - Logged with full detail (message + stack) via Strapi's logger
|
|
11
|
+
* - Returned to the MCP client as a safe error response (no stack trace leak)
|
|
12
|
+
*/ const wrapSafeHandler = (handler, options)=>{
|
|
13
|
+
const { strapi, capabilityType, name, createErrorResult } = options;
|
|
14
|
+
return async (...args)=>{
|
|
15
|
+
try {
|
|
16
|
+
return await handler(...args);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
19
|
+
strapi.log.error(`[MCP] ${capabilityType} "${name}" threw an error during execution: ${normalized.message}`, {
|
|
20
|
+
error: normalized.message,
|
|
21
|
+
stack: normalized.stack
|
|
22
|
+
});
|
|
23
|
+
return createErrorResult(normalized, args);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
exports.wrapSafeHandler = wrapSafeHandler;
|
|
29
|
+
//# sourceMappingURL=safeHandlerWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeHandlerWrapper.js","sources":["../../../../src/services/mcp/utils/safeHandlerWrapper.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.\n *\n * This prevents externally-registered capabilities (from plugin developers)\n * from crashing Strapi core when they throw during execution.\n *\n * Errors are:\n * - Logged with full detail (message + stack) via Strapi's logger\n * - Returned to the MCP client as a safe error response (no stack trace leak)\n */\nexport const wrapSafeHandler = <TArgs extends unknown[], TResult>(\n handler: (...args: TArgs) => Promise<TResult>,\n options: {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createErrorResult: (error: Error, args: TArgs) => TResult;\n }\n): ((...args: TArgs) => Promise<TResult>) => {\n const { strapi, capabilityType, name, createErrorResult } = options;\n\n return async (...args: TArgs): Promise<TResult> => {\n try {\n return await handler(...args);\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" threw an error during execution: ${normalized.message}`,\n {\n error: normalized.message,\n stack: normalized.stack,\n }\n );\n\n return createErrorResult(normalized, args);\n }\n };\n};\n"],"names":["wrapSafeHandler","handler","options","strapi","capabilityType","name","createErrorResult","args","error","normalized","Error","String","log","message","stack"],"mappings":";;AAEA;;;;;;;;;AASC,IACM,MAAMA,eAAAA,GAAkB,CAC7BC,OAAAA,EACAC,OAAAA,GAAAA;IAOA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,iBAAiB,EAAE,GAAGJ,OAAAA;AAE5D,IAAA,OAAO,OAAO,GAAGK,IAAAA,GAAAA;QACf,IAAI;AACF,YAAA,OAAO,MAAMN,OAAAA,CAAAA,GAAWM,IAAAA,CAAAA;AAC1B,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,YAAA,MAAMC,aAAaD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,GAAQ,IAAIE,MAAMC,MAAAA,CAAOH,KAAAA,CAAAA,CAAAA;AAErEL,YAAAA,MAAAA,CAAOS,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEJ,cAAAA,CAAe,EAAE,EAAEC,KAAK,mCAAmC,EAAEI,UAAAA,CAAWI,OAAO,EAAE,EAC1F;AACEL,gBAAAA,KAAAA,EAAOC,WAAWI,OAAO;AACzBC,gBAAAA,KAAAA,EAAOL,WAAWK;AACpB,aAAA,CAAA;AAGF,YAAA,OAAOR,kBAAkBG,UAAAA,EAAYF,IAAAA,CAAAA;AACvC,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps an MCP capability handler to catch and log errors from user-provided callbacks.
|
|
3
|
+
*
|
|
4
|
+
* This prevents externally-registered capabilities (from plugin developers)
|
|
5
|
+
* from crashing Strapi core when they throw during execution.
|
|
6
|
+
*
|
|
7
|
+
* Errors are:
|
|
8
|
+
* - Logged with full detail (message + stack) via Strapi's logger
|
|
9
|
+
* - Returned to the MCP client as a safe error response (no stack trace leak)
|
|
10
|
+
*/ const wrapSafeHandler = (handler, options)=>{
|
|
11
|
+
const { strapi, capabilityType, name, createErrorResult } = options;
|
|
12
|
+
return async (...args)=>{
|
|
13
|
+
try {
|
|
14
|
+
return await handler(...args);
|
|
15
|
+
} catch (error) {
|
|
16
|
+
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
17
|
+
strapi.log.error(`[MCP] ${capabilityType} "${name}" threw an error during execution: ${normalized.message}`, {
|
|
18
|
+
error: normalized.message,
|
|
19
|
+
stack: normalized.stack
|
|
20
|
+
});
|
|
21
|
+
return createErrorResult(normalized, args);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { wrapSafeHandler };
|
|
27
|
+
//# sourceMappingURL=safeHandlerWrapper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeHandlerWrapper.mjs","sources":["../../../../src/services/mcp/utils/safeHandlerWrapper.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.\n *\n * This prevents externally-registered capabilities (from plugin developers)\n * from crashing Strapi core when they throw during execution.\n *\n * Errors are:\n * - Logged with full detail (message + stack) via Strapi's logger\n * - Returned to the MCP client as a safe error response (no stack trace leak)\n */\nexport const wrapSafeHandler = <TArgs extends unknown[], TResult>(\n handler: (...args: TArgs) => Promise<TResult>,\n options: {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createErrorResult: (error: Error, args: TArgs) => TResult;\n }\n): ((...args: TArgs) => Promise<TResult>) => {\n const { strapi, capabilityType, name, createErrorResult } = options;\n\n return async (...args: TArgs): Promise<TResult> => {\n try {\n return await handler(...args);\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" threw an error during execution: ${normalized.message}`,\n {\n error: normalized.message,\n stack: normalized.stack,\n }\n );\n\n return createErrorResult(normalized, args);\n }\n };\n};\n"],"names":["wrapSafeHandler","handler","options","strapi","capabilityType","name","createErrorResult","args","error","normalized","Error","String","log","message","stack"],"mappings":"AAEA;;;;;;;;;AASC,IACM,MAAMA,eAAAA,GAAkB,CAC7BC,OAAAA,EACAC,OAAAA,GAAAA;IAOA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,iBAAiB,EAAE,GAAGJ,OAAAA;AAE5D,IAAA,OAAO,OAAO,GAAGK,IAAAA,GAAAA;QACf,IAAI;AACF,YAAA,OAAO,MAAMN,OAAAA,CAAAA,GAAWM,IAAAA,CAAAA;AAC1B,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,YAAA,MAAMC,aAAaD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,GAAQ,IAAIE,MAAMC,MAAAA,CAAOH,KAAAA,CAAAA,CAAAA;AAErEL,YAAAA,MAAAA,CAAOS,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEJ,cAAAA,CAAe,EAAE,EAAEC,KAAK,mCAAmC,EAAEI,UAAAA,CAAWI,OAAO,EAAE,EAC1F;AACEL,gBAAAA,KAAAA,EAAOC,WAAWI,OAAO;AACzBC,gBAAAA,KAAAA,EAAOL,WAAWK;AACpB,aAAA,CAAA;AAGF,YAAA,OAAOR,kBAAkBG,UAAAA,EAAYF,IAAAA,CAAAA;AACvC,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { ServerResponse } from 'node:http';
|
|
3
|
+
import { JSON_RPC_ERRORS } from './jsonRpcErrors';
|
|
4
|
+
export declare const sendJsonRpcError: (res: ServerResponse, errorKey: keyof typeof JSON_RPC_ERRORS, customMessage?: string) => void;
|
|
5
|
+
//# sourceMappingURL=sendJsonRpcError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendJsonRpcError.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/sendJsonRpcError.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,eAAO,MAAM,gBAAgB,QACtB,cAAc,YACT,MAAM,sBAAsB,kBACtB,MAAM,KACrB,IAaF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsonRpcErrors = require('./jsonRpcErrors.js');
|
|
4
|
+
|
|
5
|
+
const sendJsonRpcError = (res, errorKey, customMessage)=>{
|
|
6
|
+
if (res.headersSent === false) {
|
|
7
|
+
const { code, message, httpStatus } = jsonRpcErrors.JSON_RPC_ERRORS[errorKey];
|
|
8
|
+
res.writeHead(httpStatus, {
|
|
9
|
+
'Content-Type': 'application/json'
|
|
10
|
+
});
|
|
11
|
+
res.end(JSON.stringify({
|
|
12
|
+
jsonrpc: '2.0',
|
|
13
|
+
error: {
|
|
14
|
+
code,
|
|
15
|
+
message: message
|
|
16
|
+
},
|
|
17
|
+
id: null
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
exports.sendJsonRpcError = sendJsonRpcError;
|
|
23
|
+
//# sourceMappingURL=sendJsonRpcError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendJsonRpcError.js","sources":["../../../../src/services/mcp/utils/sendJsonRpcError.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http';\nimport { JSON_RPC_ERRORS } from './jsonRpcErrors';\n\nexport const sendJsonRpcError = (\n res: ServerResponse,\n errorKey: keyof typeof JSON_RPC_ERRORS,\n customMessage?: string\n): void => {\n if (res.headersSent === false) {\n const { code, message, httpStatus } = JSON_RPC_ERRORS[errorKey];\n\n res.writeHead(httpStatus, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code, message: customMessage ?? message },\n id: null,\n })\n );\n }\n};\n"],"names":["sendJsonRpcError","res","errorKey","customMessage","headersSent","code","message","httpStatus","JSON_RPC_ERRORS","writeHead","end","JSON","stringify","jsonrpc","error","id"],"mappings":";;;;AAGO,MAAMA,gBAAAA,GAAmB,CAC9BC,GAAAA,EACAC,QAAAA,EACAC,aAAAA,GAAAA;IAEA,IAAIF,GAAAA,CAAIG,WAAW,KAAK,KAAA,EAAO;QAC7B,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,6BAAe,CAACN,QAAAA,CAAS;QAE/DD,GAAAA,CAAIQ,SAAS,CAACF,UAAAA,EAAY;YAAE,cAAA,EAAgB;AAAmB,SAAA,CAAA;AAC/DN,QAAAA,GAAAA,CAAIS,GAAG,CACLC,IAAAA,CAAKC,SAAS,CAAC;YACbC,OAAAA,EAAS,KAAA;YACTC,KAAAA,EAAO;AAAET,gBAAAA,IAAAA;AAAMC,gBAAAA,OAAAA,EAA0BA;AAAQ,aAAA;YACjDS,EAAAA,EAAI;AACN,SAAA,CAAA,CAAA;AAEJ,IAAA;AACF;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { JSON_RPC_ERRORS } from './jsonRpcErrors.mjs';
|
|
2
|
+
|
|
3
|
+
const sendJsonRpcError = (res, errorKey, customMessage)=>{
|
|
4
|
+
if (res.headersSent === false) {
|
|
5
|
+
const { code, message, httpStatus } = JSON_RPC_ERRORS[errorKey];
|
|
6
|
+
res.writeHead(httpStatus, {
|
|
7
|
+
'Content-Type': 'application/json'
|
|
8
|
+
});
|
|
9
|
+
res.end(JSON.stringify({
|
|
10
|
+
jsonrpc: '2.0',
|
|
11
|
+
error: {
|
|
12
|
+
code,
|
|
13
|
+
message: message
|
|
14
|
+
},
|
|
15
|
+
id: null
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { sendJsonRpcError };
|
|
21
|
+
//# sourceMappingURL=sendJsonRpcError.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendJsonRpcError.mjs","sources":["../../../../src/services/mcp/utils/sendJsonRpcError.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http';\nimport { JSON_RPC_ERRORS } from './jsonRpcErrors';\n\nexport const sendJsonRpcError = (\n res: ServerResponse,\n errorKey: keyof typeof JSON_RPC_ERRORS,\n customMessage?: string\n): void => {\n if (res.headersSent === false) {\n const { code, message, httpStatus } = JSON_RPC_ERRORS[errorKey];\n\n res.writeHead(httpStatus, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code, message: customMessage ?? message },\n id: null,\n })\n );\n }\n};\n"],"names":["sendJsonRpcError","res","errorKey","customMessage","headersSent","code","message","httpStatus","JSON_RPC_ERRORS","writeHead","end","JSON","stringify","jsonrpc","error","id"],"mappings":";;AAGO,MAAMA,gBAAAA,GAAmB,CAC9BC,GAAAA,EACAC,QAAAA,EACAC,aAAAA,GAAAA;IAEA,IAAIF,GAAAA,CAAIG,WAAW,KAAK,KAAA,EAAO;QAC7B,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,eAAe,CAACN,QAAAA,CAAS;QAE/DD,GAAAA,CAAIQ,SAAS,CAACF,UAAAA,EAAY;YAAE,cAAA,EAAgB;AAAmB,SAAA,CAAA;AAC/DN,QAAAA,GAAAA,CAAIS,GAAG,CACLC,IAAAA,CAAKC,SAAS,CAAC;YACbC,OAAAA,EAAS,KAAA;YACTC,KAAAA,EAAO;AAAET,gBAAAA,IAAAA;AAAMC,gBAAAA,OAAAA,EAA0BA;AAAQ,aAAA;YACjDS,EAAAA,EAAI;AACN,SAAA,CAAA,CAAA;AAEJ,IAAA;AACF;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a promise with a timeout to prevent hanging operations.
|
|
3
|
+
* The internal timer is always cleared once the race settles, preventing
|
|
4
|
+
* ref'd timer handles from keeping the event loop alive after the operation completes.
|
|
5
|
+
*/
|
|
6
|
+
export declare const withTimeout: <T>(promise: Promise<T>, timeoutMs: number, operation: string) => Promise<T>;
|
|
7
|
+
//# sourceMappingURL=withTimeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withTimeout.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/withTimeout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,eACb,QAAQ,CAAC,CAAC,aACR,MAAM,aACN,MAAM,KAChB,QAAQ,CAAC,CAYX,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wraps a promise with a timeout to prevent hanging operations.
|
|
5
|
+
* The internal timer is always cleared once the race settles, preventing
|
|
6
|
+
* ref'd timer handles from keeping the event loop alive after the operation completes.
|
|
7
|
+
*/ const withTimeout = (promise, timeoutMs, operation)=>{
|
|
8
|
+
let timeoutId;
|
|
9
|
+
const timeoutPromise = new Promise((_, reject)=>{
|
|
10
|
+
timeoutId = setTimeout(()=>{
|
|
11
|
+
reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));
|
|
12
|
+
}, timeoutMs);
|
|
13
|
+
});
|
|
14
|
+
return Promise.race([
|
|
15
|
+
promise,
|
|
16
|
+
timeoutPromise
|
|
17
|
+
]).finally(()=>{
|
|
18
|
+
clearTimeout(timeoutId);
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
exports.withTimeout = withTimeout;
|
|
23
|
+
//# sourceMappingURL=withTimeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withTimeout.js","sources":["../../../../src/services/mcp/utils/withTimeout.ts"],"sourcesContent":["/**\n * Wraps a promise with a timeout to prevent hanging operations.\n * The internal timer is always cleared once the race settles, preventing\n * ref'd timer handles from keeping the event loop alive after the operation completes.\n */\nexport const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string\n): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n};\n"],"names":["withTimeout","promise","timeoutMs","operation","timeoutId","timeoutPromise","Promise","_","reject","setTimeout","Error","race","finally","clearTimeout"],"mappings":";;AAAA;;;;AAIC,IACM,MAAMA,WAAAA,GAAc,CACzBC,SACAC,SAAAA,EACAC,SAAAA,GAAAA;IAEA,IAAIC,SAAAA;AAEJ,IAAA,MAAMC,cAAAA,GAAiB,IAAIC,OAAAA,CAAW,CAACC,CAAAA,EAAGC,MAAAA,GAAAA;AACxCJ,QAAAA,SAAAA,GAAYK,UAAAA,CAAW,IAAA;YACrBD,MAAAA,CAAO,IAAIE,KAAAA,CAAM,CAAC,WAAW,EAAEP,UAAU,kBAAkB,EAAED,SAAAA,CAAU,EAAE,CAAC,CAAA,CAAA;QAC5E,CAAA,EAAGA,SAAAA,CAAAA;AACL,IAAA,CAAA,CAAA;IAEA,OAAOI,OAAAA,CAAQK,IAAI,CAAC;AAACV,QAAAA,OAAAA;AAASI,QAAAA;AAAe,KAAA,CAAA,CAAEO,OAAO,CAAC,IAAA;QACrDC,YAAAA,CAAaT,SAAAA,CAAAA;AACf,IAAA,CAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a promise with a timeout to prevent hanging operations.
|
|
3
|
+
* The internal timer is always cleared once the race settles, preventing
|
|
4
|
+
* ref'd timer handles from keeping the event loop alive after the operation completes.
|
|
5
|
+
*/ const withTimeout = (promise, timeoutMs, operation)=>{
|
|
6
|
+
let timeoutId;
|
|
7
|
+
const timeoutPromise = new Promise((_, reject)=>{
|
|
8
|
+
timeoutId = setTimeout(()=>{
|
|
9
|
+
reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));
|
|
10
|
+
}, timeoutMs);
|
|
11
|
+
});
|
|
12
|
+
return Promise.race([
|
|
13
|
+
promise,
|
|
14
|
+
timeoutPromise
|
|
15
|
+
]).finally(()=>{
|
|
16
|
+
clearTimeout(timeoutId);
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { withTimeout };
|
|
21
|
+
//# sourceMappingURL=withTimeout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withTimeout.mjs","sources":["../../../../src/services/mcp/utils/withTimeout.ts"],"sourcesContent":["/**\n * Wraps a promise with a timeout to prevent hanging operations.\n * The internal timer is always cleared once the race settles, preventing\n * ref'd timer handles from keeping the event loop alive after the operation completes.\n */\nexport const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string\n): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Operation '${operation}' timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n};\n"],"names":["withTimeout","promise","timeoutMs","operation","timeoutId","timeoutPromise","Promise","_","reject","setTimeout","Error","race","finally","clearTimeout"],"mappings":"AAAA;;;;AAIC,IACM,MAAMA,WAAAA,GAAc,CACzBC,SACAC,SAAAA,EACAC,SAAAA,GAAAA;IAEA,IAAIC,SAAAA;AAEJ,IAAA,MAAMC,cAAAA,GAAiB,IAAIC,OAAAA,CAAW,CAACC,CAAAA,EAAGC,MAAAA,GAAAA;AACxCJ,QAAAA,SAAAA,GAAYK,UAAAA,CAAW,IAAA;YACrBD,MAAAA,CAAO,IAAIE,KAAAA,CAAM,CAAC,WAAW,EAAEP,UAAU,kBAAkB,EAAED,SAAAA,CAAU,EAAE,CAAC,CAAA,CAAA;QAC5E,CAAA,EAAGA,SAAAA,CAAAA;AACL,IAAA,CAAA,CAAA;IAEA,OAAOI,OAAAA,CAAQK,IAAI,CAAC;AAACV,QAAAA,OAAAA;AAASI,QAAAA;AAAe,KAAA,CAAA,CAAEO,OAAO,CAAC,IAAA;QACrDC,YAAAA,CAAaT,SAAAA,CAAAA;AACf,IAAA,CAAA,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAiB1C,QAAA,MAAM,uBAAuB,WAAY,KAAK,MAAM;;;;gBA6B9B,MAAM,YAAW,OAAO,MAAM,EAAE,OAAO,CAAC;;CAS7D,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -4,13 +4,15 @@ var rateLimiter = require('./rate-limiter.js');
|
|
|
4
4
|
var sender = require('./sender.js');
|
|
5
5
|
var middleware = require('./middleware.js');
|
|
6
6
|
var isTruthy = require('./is-truthy.js');
|
|
7
|
+
var metrics = require('../mcp/metrics/metrics.js');
|
|
7
8
|
|
|
8
9
|
const LIMITED_EVENTS = [
|
|
9
10
|
'didSaveMediaWithAlternativeText',
|
|
10
11
|
'didSaveMediaWithCaption',
|
|
11
12
|
'didDisableResponsiveDimensions',
|
|
12
13
|
'didEnableResponsiveDimensions',
|
|
13
|
-
'didInitializePluginUpload'
|
|
14
|
+
'didInitializePluginUpload',
|
|
15
|
+
...Object.values(metrics.MCP_LIMITED_TELEMETRY_EVENTS)
|
|
14
16
|
];
|
|
15
17
|
const createTelemetryInstance = (strapi)=>{
|
|
16
18
|
const uuid = strapi.config.get('uuid');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","Object","values","MCP_LIMITED_TELEMETRY_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,oCAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,WAASC,MAAAA,CAAaX,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,YAAkBH,QAAAA,EAAQ;QAAEI,aAAAA,EAAenB;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAAA,EAAY;gBACfL,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,UAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -2,13 +2,15 @@ import wrapWithRateLimit from './rate-limiter.mjs';
|
|
|
2
2
|
import createSender from './sender.mjs';
|
|
3
3
|
import createMiddleware from './middleware.mjs';
|
|
4
4
|
import isTruthy from './is-truthy.mjs';
|
|
5
|
+
import { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics.mjs';
|
|
5
6
|
|
|
6
7
|
const LIMITED_EVENTS = [
|
|
7
8
|
'didSaveMediaWithAlternativeText',
|
|
8
9
|
'didSaveMediaWithCaption',
|
|
9
10
|
'didDisableResponsiveDimensions',
|
|
10
11
|
'didEnableResponsiveDimensions',
|
|
11
|
-
'didInitializePluginUpload'
|
|
12
|
+
'didInitializePluginUpload',
|
|
13
|
+
...Object.values(MCP_LIMITED_TELEMETRY_EVENTS)
|
|
12
14
|
];
|
|
13
15
|
const createTelemetryInstance = (strapi)=>{
|
|
14
16
|
const uuid = strapi.config.get('uuid');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","Object","values","MCP_LIMITED_TELEMETRY_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,4BAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,SAASC,YAAAA,CAAaX,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,kBAAkBH,MAAAA,EAAQ;QAAEI,aAAAA,EAAenB;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAAA,EAAY;gBACfL,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,gBAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/core",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.47.0",
|
|
4
4
|
"description": "Core of Strapi",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -56,17 +56,19 @@
|
|
|
56
56
|
"test:unit:vitest:watch": "vitest --watch"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
+
"@casl/ability": "6.7.5",
|
|
59
60
|
"@koa/cors": "5.0.0",
|
|
60
61
|
"@koa/router": "12.0.2",
|
|
62
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
61
63
|
"@paralleldrive/cuid2": "2.2.2",
|
|
62
|
-
"@strapi/admin": "5.
|
|
63
|
-
"@strapi/database": "5.
|
|
64
|
-
"@strapi/generators": "5.
|
|
65
|
-
"@strapi/logger": "5.
|
|
66
|
-
"@strapi/permissions": "5.
|
|
67
|
-
"@strapi/types": "5.
|
|
68
|
-
"@strapi/typescript-utils": "5.
|
|
69
|
-
"@strapi/utils": "5.
|
|
64
|
+
"@strapi/admin": "5.47.0",
|
|
65
|
+
"@strapi/database": "5.47.0",
|
|
66
|
+
"@strapi/generators": "5.47.0",
|
|
67
|
+
"@strapi/logger": "5.47.0",
|
|
68
|
+
"@strapi/permissions": "5.47.0",
|
|
69
|
+
"@strapi/types": "5.47.0",
|
|
70
|
+
"@strapi/typescript-utils": "5.47.0",
|
|
71
|
+
"@strapi/utils": "5.47.0",
|
|
70
72
|
"@vercel/stega": "0.1.2",
|
|
71
73
|
"bcryptjs": "2.4.3",
|
|
72
74
|
"boxen": "5.1.2",
|
|
@@ -133,11 +135,11 @@
|
|
|
133
135
|
"@types/node": "24.10.0",
|
|
134
136
|
"@types/node-schedule": "2.1.7",
|
|
135
137
|
"@types/statuses": "2.0.1",
|
|
136
|
-
"eslint-config-custom": "5.
|
|
138
|
+
"eslint-config-custom": "5.47.0",
|
|
137
139
|
"supertest": "7.2.2",
|
|
138
|
-
"tsconfig": "5.
|
|
140
|
+
"tsconfig": "5.47.0",
|
|
139
141
|
"vitest": "catalog:",
|
|
140
|
-
"vitest-config": "5.
|
|
142
|
+
"vitest-config": "5.47.0"
|
|
141
143
|
},
|
|
142
144
|
"engines": {
|
|
143
145
|
"node": ">=20.0.0 <=24.x.x",
|