@strapi/core 5.48.1 → 5.49.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/Strapi.js +9 -5
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +0 -1
- package/dist/Strapi.mjs.map +1 -1
- package/dist/ai.d.ts +2 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +8 -0
- package/dist/ai.js.map +1 -0
- package/dist/ai.mjs +3 -0
- package/dist/ai.mjs.map +1 -0
- package/dist/configuration/config-loader.js +11 -6
- package/dist/configuration/config-loader.js.map +1 -1
- package/dist/configuration/index.js +22 -15
- package/dist/configuration/index.js.map +1 -1
- package/dist/configuration/urls.js +11 -7
- package/dist/configuration/urls.js.map +1 -1
- package/dist/core-api/routes/index.js +3 -2
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/validation/common.js +3 -2
- package/dist/core-api/routes/validation/common.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +3 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/mappers.js +3 -2
- package/dist/core-api/routes/validation/mappers.js.map +1 -1
- package/dist/core-api/routes/validation/utils.js +3 -2
- package/dist/core-api/routes/validation/utils.js.map +1 -1
- package/dist/domain/content-type/index.js +9 -5
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/validator.js +6 -2
- package/dist/domain/content-type/validator.js.map +1 -1
- package/dist/domain/module/index.js +6 -2
- package/dist/domain/module/index.js.map +1 -1
- package/dist/ee/license.js +8 -3
- package/dist/ee/license.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/loaders/admin.js +5 -1
- package/dist/loaders/admin.js.map +1 -1
- package/dist/loaders/apis.js +16 -11
- package/dist/loaders/apis.js.map +1 -1
- package/dist/loaders/components.js +6 -2
- package/dist/loaders/components.js.map +1 -1
- package/dist/loaders/middlewares.js +6 -2
- package/dist/loaders/middlewares.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js +5 -1
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.js +6 -2
- package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/loaders/plugins/index.js +8 -4
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/policies.js +6 -2
- package/dist/loaders/policies.js.map +1 -1
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +12 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mcp.mjs +4 -0
- package/dist/mcp.mjs.map +1 -0
- package/dist/middlewares/body.js +8 -3
- package/dist/middlewares/body.js.map +1 -1
- package/dist/middlewares/compression.js +5 -1
- package/dist/middlewares/compression.js.map +1 -1
- package/dist/middlewares/cors.js +5 -1
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/middlewares/favicon.js +5 -1
- package/dist/middlewares/favicon.js.map +1 -1
- package/dist/middlewares/ip.js +5 -1
- package/dist/middlewares/ip.js.map +1 -1
- package/dist/middlewares/public.js +5 -1
- package/dist/middlewares/public.js.map +1 -1
- package/dist/middlewares/query.js +6 -2
- package/dist/middlewares/query.js.map +1 -1
- package/dist/middlewares/security.js +5 -1
- package/dist/middlewares/security.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +5 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/first-published-at.js +5 -1
- package/dist/migrations/first-published-at.js.map +1 -1
- package/dist/package.json.js +15 -15
- package/dist/package.json.mjs +15 -15
- package/dist/registries/sanitizers.js +7 -3
- package/dist/registries/sanitizers.js.map +1 -1
- package/dist/registries/validators.js +7 -3
- package/dist/registries/validators.js.map +1 -1
- package/dist/services/auth/index.js +7 -3
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/content-api/index.js +10 -6
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/permissions/engine.js +5 -1
- package/dist/services/content-api/permissions/engine.js.map +1 -1
- package/dist/services/content-api/permissions/index.js +10 -6
- package/dist/services/content-api/permissions/index.js.map +1 -1
- package/dist/services/document-service/attributes/transforms.js +5 -1
- package/dist/services/document-service/attributes/transforms.js.map +1 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +14 -10
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +1 -1
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +1 -1
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +6 -2
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +7 -3
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/transform/data.d.ts +2 -0
- package/dist/services/document-service/transform/data.d.ts.map +1 -1
- package/dist/services/document-service/transform/data.js +7 -1
- package/dist/services/document-service/transform/data.js.map +1 -1
- package/dist/services/document-service/transform/data.mjs +7 -2
- package/dist/services/document-service/transform/data.mjs.map +1 -1
- package/dist/services/document-service/utils/populate.d.ts +1 -1
- package/dist/services/document-service/utils/populate.d.ts.map +1 -1
- package/dist/services/document-service/utils/populate.js.map +1 -1
- package/dist/services/document-service/utils/populate.mjs.map +1 -1
- package/dist/services/entity-service/index.js +9 -4
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +9 -4
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/services/entity-validator/validators.js +10 -6
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/errors.js +7 -3
- package/dist/services/errors.js.map +1 -1
- package/dist/services/fs.js +10 -5
- package/dist/services/fs.js.map +1 -1
- package/dist/services/mcp/prompt-registry.d.ts +31 -3
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
- package/dist/services/mcp/prompt-registry.js +31 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -1
- package/dist/services/mcp/prompt-registry.mjs +31 -1
- package/dist/services/mcp/prompt-registry.mjs.map +1 -1
- package/dist/services/mcp/resource-registry.d.ts +31 -1
- package/dist/services/mcp/resource-registry.d.ts.map +1 -1
- package/dist/services/mcp/resource-registry.js +31 -0
- package/dist/services/mcp/resource-registry.js.map +1 -1
- package/dist/services/mcp/resource-registry.mjs +31 -1
- package/dist/services/mcp/resource-registry.mjs.map +1 -1
- package/dist/services/mcp/tool-registry.d.ts +36 -9
- package/dist/services/mcp/tool-registry.d.ts.map +1 -1
- package/dist/services/mcp/tool-registry.js +35 -3
- package/dist/services/mcp/tool-registry.js.map +1 -1
- package/dist/services/mcp/tool-registry.mjs +35 -3
- package/dist/services/mcp/tool-registry.mjs.map +1 -1
- package/dist/services/mcp/tools/log.d.ts +15 -85
- package/dist/services/mcp/tools/log.d.ts.map +1 -1
- package/dist/services/metrics/admin-user-hash.js +5 -1
- package/dist/services/metrics/admin-user-hash.js.map +1 -1
- package/dist/services/metrics/is-truthy.js +5 -1
- package/dist/services/metrics/is-truthy.js.map +1 -1
- package/dist/services/metrics/sender.js +17 -9
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/server/api.js +5 -1
- package/dist/services/server/api.js.map +1 -1
- package/dist/services/server/compose-endpoint.js +5 -1
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/http-server.js +5 -1
- package/dist/services/server/http-server.js.map +1 -1
- package/dist/services/server/index.js +5 -1
- package/dist/services/server/index.js.map +1 -1
- package/dist/services/server/koa.js +12 -5
- package/dist/services/server/koa.js.map +1 -1
- package/dist/services/server/middleware.js +5 -1
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/openapi.js +11 -6
- package/dist/services/server/openapi.js.map +1 -1
- package/dist/services/server/register-routes.js +8 -4
- package/dist/services/server/register-routes.js.map +1 -1
- package/dist/services/server/routing.js +5 -1
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/session-manager.js +14 -9
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/webhook-runner.js +7 -2
- package/dist/services/webhook-runner.js.map +1 -1
- package/dist/services/worker-queue.js +5 -1
- package/dist/services/worker-queue.js.map +1 -1
- package/dist/utils/filepath-to-prop-path.js +13 -8
- package/dist/utils/filepath-to-prop-path.js.map +1 -1
- package/dist/utils/load-config-file.js +7 -2
- package/dist/utils/load-config-file.js.map +1 -1
- package/dist/utils/load-files.js +12 -6
- package/dist/utils/load-files.js.map +1 -1
- package/dist/utils/open-browser.js +5 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/resolve-working-dirs.js +6 -2
- package/dist/utils/resolve-working-dirs.js.map +1 -1
- package/dist/utils/startup-logger.js +27 -21
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/transform-content-types-to-models.js +10 -5
- package/dist/utils/transform-content-types-to-models.js.map +1 -1
- package/dist/utils/update-notifier/index.d.ts.map +1 -1
- package/dist/utils/update-notifier/index.js +21 -8
- package/dist/utils/update-notifier/index.js.map +1 -1
- package/dist/utils/update-notifier/index.mjs +6 -1
- package/dist/utils/update-notifier/index.mjs.map +1 -1
- package/package.json +15 -15
|
@@ -12,6 +12,36 @@ var id = 0;
|
|
|
12
12
|
function _class_private_field_loose_key(name) {
|
|
13
13
|
return "__private_" + id++ + "_" + name;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Defines a Strapi MCP resource with full type inference, ready to pass to
|
|
17
|
+
* `strapi.ai.mcp.registerResource()`. Exposed publicly as `ai.mcp.defineResource`.
|
|
18
|
+
*
|
|
19
|
+
* The returned value is the definition unchanged — this builder only exists to
|
|
20
|
+
* infer the `name` and narrow the access variant (`devModeOnly` vs `auth`) so the
|
|
21
|
+
* result is directly assignable to `registerResource`.
|
|
22
|
+
*
|
|
23
|
+
* @param resource - The resource definition. Provide either `devModeOnly: true`
|
|
24
|
+
* (dev-only, no auth) or an `auth` policy set — never both.
|
|
25
|
+
* @returns The same definition, with its access variant narrowed.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* import { ai } from '@strapi/strapi';
|
|
30
|
+
*
|
|
31
|
+
* const appInfo = ai.mcp.defineResource({
|
|
32
|
+
* name: 'app-info',
|
|
33
|
+
* uri: 'strapi://app/info',
|
|
34
|
+
* metadata: { description: 'Metadata about the app', mimeType: 'application/json' },
|
|
35
|
+
* devModeOnly: true,
|
|
36
|
+
* createHandler: (strapi) => async (uri) => ({
|
|
37
|
+
* contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ ok: true }) }],
|
|
38
|
+
* }),
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // later, in register() or bootstrap():
|
|
42
|
+
* strapi.ai.mcp.registerResource(appInfo);
|
|
43
|
+
* ```
|
|
44
|
+
*/ const makeMcpResourceDefinition = (definition)=>definition;
|
|
15
45
|
var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
|
|
16
46
|
class McpResourceRegistry extends McpCapabilityRegistryBase {
|
|
17
47
|
bind(mcpServer) {
|
|
@@ -61,5 +91,5 @@ class McpResourceRegistry extends McpCapabilityRegistryBase {
|
|
|
61
91
|
}
|
|
62
92
|
}
|
|
63
93
|
|
|
64
|
-
export { McpResourceRegistry };
|
|
94
|
+
export { McpResourceRegistry, makeMcpResourceDefinition };
|
|
65
95
|
//# sourceMappingURL=resource-registry.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-registry.mjs","sources":["../../../src/services/mcp/resource-registry.ts"],"sourcesContent":["import type {\n McpServer,\n RegisteredResource,\n // eslint-disable-next-line import/extensions\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\
|
|
1
|
+
{"version":3,"file":"resource-registry.mjs","sources":["../../../src/services/mcp/resource-registry.ts"],"sourcesContent":["import type {\n McpServer,\n RegisteredResource,\n // eslint-disable-next-line import/extensions\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\n/**\n * Defines a Strapi MCP resource with full type inference, ready to pass to\n * `strapi.ai.mcp.registerResource()`. Exposed publicly as `ai.mcp.defineResource`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name` and narrow the access variant (`devModeOnly` vs `auth`) so the\n * result is directly assignable to `registerResource`.\n *\n * @param resource - The resource definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const appInfo = ai.mcp.defineResource({\n * name: 'app-info',\n * uri: 'strapi://app/info',\n * metadata: { description: 'Metadata about the app', mimeType: 'application/json' },\n * devModeOnly: true,\n * createHandler: (strapi) => async (uri) => ({\n * contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ ok: true }) }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerResource(appInfo);\n * ```\n */\nexport const makeMcpResourceDefinition = ((definition: Modules.MCP.McpResourceDefinition) =>\n definition) as unknown as Modules.MCP.McpResourceBuilder;\n\nexport class McpResourceRegistry\n extends McpCapabilityRegistryBase<\n 'resource',\n Modules.MCP.McpResourceDefinition,\n RegisteredResource\n >\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, uri, metadata, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Resource',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async (resourceUri) => ({\n contents: [\n {\n uri: resourceUri.href,\n text: `Resource \"${name}\" failed to initialize: ${errorMessage}`,\n mimeType: 'text/plain',\n },\n ],\n });\n },\n createErrorResult(error, args) {\n return {\n contents: [\n {\n uri: args[0] instanceof URL ? args[0].href : uri,\n text: `Resource \"${name}\" execution failed: ${error.message}`,\n mimeType: 'text/plain',\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'resource',\n name,\n definition.telemetry,\n safeHandler\n );\n\n return mcpServer.registerResource(name, uri, metadata, sdkHandler);\n },\n });\n });\n }\n}\n"],"names":["makeMcpResourceDefinition","definition","McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","uri","metadata","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","resourceUri","contents","href","text","mimeType","createErrorResult","error","args","URL","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerResource","ctx","definitions"],"mappings":";;;;;;;;;;;;;;AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,yBAAAA,GAA6B,CAACC,aACzCA;AAUA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMC,mBAAAA,SACHC,yBAAAA,CAAAA;AAiBRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGV,UAAAA;AAE/C,YAAA,OAAOW,gCAAAA,CAAiC;AACtCN,gBAAAA,MAAAA;gBACAO,cAAAA,EAAgB,UAAA;AAChBL,gBAAAA,IAAAA;AACAG,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;oBAChC,OAAO,OAAOC,eAAiB;4BAC7BC,QAAAA,EAAU;AACR,gCAAA;AACER,oCAAAA,GAAAA,EAAKO,YAAYE,IAAI;AACrBC,oCAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,wBAAwB,EAAEO,YAAAA,CAAAA,CAAc;oCAChEK,QAAAA,EAAU;AACZ;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;gBACAC,iBAAAA,CAAAA,CAAkBC,KAAK,EAAEC,IAAI,EAAA;oBAC3B,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACER,GAAAA,EAAKc,IAAI,CAAC,CAAA,CAAE,YAAYC,GAAAA,GAAMD,IAAI,CAAC,CAAA,CAAE,CAACL,IAAI,GAAGT,GAAAA;gCAC7CU,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,oBAAoB,EAAEc,KAAAA,CAAMG,OAAO,CAAA,CAAE;gCAC7DL,QAAAA,EAAU;AACZ;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,aAAaC,+BAAAA,CACjBvB,MAAAA,EACA,YACAE,IAAAA,EACAP,UAAAA,CAAW6B,SAAS,EACpBH,WAAAA,CAAAA;AAGF,oBAAA,OAAOtB,SAAAA,CAAU0B,gBAAgB,CAACvB,IAAAA,EAAMC,KAAKC,QAAAA,EAAUkB,UAAAA,CAAAA;AACzD,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAtDA,IAAA,WAAA,CAAYI,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI1B,MAAM;AAC3B,IAAA;AAiDF;;;;"}
|
|
@@ -1,17 +1,44 @@
|
|
|
1
1
|
import type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { Core, Modules } from '@strapi/types';
|
|
3
|
-
import { z } from '@strapi/utils';
|
|
4
3
|
import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
|
|
5
4
|
import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
|
|
6
5
|
import type { McpAdminTokenAbility } from './authentication';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Defines a Strapi MCP tool with full type inference, ready to pass to
|
|
8
|
+
* `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.
|
|
9
|
+
*
|
|
10
|
+
* The returned value is the definition unchanged — this builder only exists to
|
|
11
|
+
* infer the `name`, input/output schemas and handler types, and to narrow the
|
|
12
|
+
* access variant (`devModeOnly` vs `auth`) so the result is directly assignable
|
|
13
|
+
* to `registerTool`.
|
|
14
|
+
*
|
|
15
|
+
* @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,
|
|
16
|
+
* no auth) or an `auth` policy set — never both.
|
|
17
|
+
* @returns The same definition, with its access variant narrowed.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { ai } from '@strapi/strapi';
|
|
22
|
+
* import { z } from '@strapi/utils';
|
|
23
|
+
*
|
|
24
|
+
* const greet = ai.mcp.defineTool({
|
|
25
|
+
* name: 'greet',
|
|
26
|
+
* title: 'Greet',
|
|
27
|
+
* description: 'Greets a user by name',
|
|
28
|
+
* devModeOnly: true,
|
|
29
|
+
* resolveInputSchema: () => z.object({ name: z.string() }),
|
|
30
|
+
* resolveOutputSchema: () => z.object({ message: z.string() }),
|
|
31
|
+
* createHandler: (strapi) => async ({ args }) => {
|
|
32
|
+
* const message = `Hello, ${args.name}!`;
|
|
33
|
+
* return { content: [{ type: 'text', text: message }], structuredContent: { message } };
|
|
34
|
+
* },
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // later, in register() or bootstrap():
|
|
38
|
+
* strapi.ai.mcp.registerTool(greet);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const makeMcpToolDefinition: Modules.MCP.McpToolBuilder;
|
|
15
42
|
export declare class McpToolRegistry extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool> implements McpCapabilityRegistry {
|
|
16
43
|
#private;
|
|
17
44
|
constructor(ctx: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/tool-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/tool-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,qBAAqB,4BACoB,CAAC;AAEvD,qBAAa,eACX,SAAQ,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CACvF,YAAW,qBAAqB;;gBAQpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpF,OAAO,EAAE,oBAAoB,CAAC;QAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KAC7C;IAOD,IAAI,CAAC,SAAS,EAAE,SAAS;CAwE1B"}
|
|
@@ -15,9 +15,41 @@ var id = 0;
|
|
|
15
15
|
function _class_private_field_loose_key(name) {
|
|
16
16
|
return "__private_" + id++ + "_" + name;
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Defines a Strapi MCP tool with full type inference, ready to pass to
|
|
20
|
+
* `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.
|
|
21
|
+
*
|
|
22
|
+
* The returned value is the definition unchanged — this builder only exists to
|
|
23
|
+
* infer the `name`, input/output schemas and handler types, and to narrow the
|
|
24
|
+
* access variant (`devModeOnly` vs `auth`) so the result is directly assignable
|
|
25
|
+
* to `registerTool`.
|
|
26
|
+
*
|
|
27
|
+
* @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,
|
|
28
|
+
* no auth) or an `auth` policy set — never both.
|
|
29
|
+
* @returns The same definition, with its access variant narrowed.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* import { ai } from '@strapi/strapi';
|
|
34
|
+
* import { z } from '@strapi/utils';
|
|
35
|
+
*
|
|
36
|
+
* const greet = ai.mcp.defineTool({
|
|
37
|
+
* name: 'greet',
|
|
38
|
+
* title: 'Greet',
|
|
39
|
+
* description: 'Greets a user by name',
|
|
40
|
+
* devModeOnly: true,
|
|
41
|
+
* resolveInputSchema: () => z.object({ name: z.string() }),
|
|
42
|
+
* resolveOutputSchema: () => z.object({ message: z.string() }),
|
|
43
|
+
* createHandler: (strapi) => async ({ args }) => {
|
|
44
|
+
* const message = `Hello, ${args.name}!`;
|
|
45
|
+
* return { content: [{ type: 'text', text: message }], structuredContent: { message } };
|
|
46
|
+
* },
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* // later, in register() or bootstrap():
|
|
50
|
+
* strapi.ai.mcp.registerTool(greet);
|
|
51
|
+
* ```
|
|
52
|
+
*/ const makeMcpToolDefinition = (definition)=>definition;
|
|
21
53
|
var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi"), _ability = /*#__PURE__*/ _class_private_field_loose_key("_ability"), _user = /*#__PURE__*/ _class_private_field_loose_key("_user");
|
|
22
54
|
class McpToolRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBase {
|
|
23
55
|
bind(mcpServer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.js","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport {
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport type { McpAdminTokenAbility } from './authentication';\n\n/**\n * Defines a Strapi MCP tool with full type inference, ready to pass to\n * `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`, input/output schemas and handler types, and to narrow the\n * access variant (`devModeOnly` vs `auth`) so the result is directly assignable\n * to `registerTool`.\n *\n * @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,\n * no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n * import { z } from '@strapi/utils';\n *\n * const greet = ai.mcp.defineTool({\n * name: 'greet',\n * title: 'Greet',\n * description: 'Greets a user by name',\n * devModeOnly: true,\n * resolveInputSchema: () => z.object({ name: z.string() }),\n * resolveOutputSchema: () => z.object({ message: z.string() }),\n * createHandler: (strapi) => async ({ args }) => {\n * const message = `Hello, ${args.name}!`;\n * return { content: [{ type: 'text', text: message }], structuredContent: { message } };\n * },\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerTool(greet);\n * ```\n */\nexport const makeMcpToolDefinition = ((definition: Modules.MCP.McpToolDefinition) =>\n definition) as unknown as Modules.MCP.McpToolBuilder;\n\nexport class McpToolRegistry\n extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n #ability: McpAdminTokenAbility;\n\n #user: Modules.MCP.McpHandlerContext['user'];\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n this.#ability = ctx.ability;\n this.#user = ctx.user;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } =\n definition;\n\n // Bind the session ability and token owner into the handler context so handlers can enforce\n // field-level and entity-level permission checks and set creator fields.\n const context: Modules.MCP.McpHandlerContext = {\n userAbility: this.#ability,\n user: this.#user,\n };\n const createHandlerWithContext = (strapi: Core.Strapi) => createHandler(strapi, context);\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Tool',\n name,\n createHandler: createHandlerWithContext,\n createFallbackHandler(errorMessage) {\n return async () => ({\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" failed to initialize: ${errorMessage}`,\n },\n ],\n isError: true,\n });\n },\n createErrorResult(error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" execution failed: ${error.message}`,\n },\n ],\n isError: true,\n };\n },\n registerWithSdk(safeHandler) {\n const inputSchema =\n resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;\n const outputSchema = resolveOutputSchema(context);\n\n // Adapt from our object-literal handler `({ args, extra })` to\n // the MCP SDK's positional form `(args, extra)` / `(extra)`.\n const baseHandler =\n inputSchema !== undefined\n ? (args: unknown, extra: unknown) =>\n safeHandler({ args, extra } as Parameters<typeof safeHandler>[0])\n : (extra: unknown) => safeHandler({ extra } as Parameters<typeof safeHandler>[0]);\n\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n baseHandler\n );\n\n return mcpServer.registerTool(\n name,\n { title, description, inputSchema, outputSchema },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpToolDefinition","definition","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","resolveInputSchema","resolveOutputSchema","createHandler","context","userAbility","user","createHandlerWithContext","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","content","type","text","isError","createErrorResult","error","message","registerWithSdk","safeHandler","inputSchema","undefined","outputSchema","baseHandler","args","extra","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerTool","ctx","definitions","ability"],"mappings":"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"}
|
|
@@ -13,9 +13,41 @@ var id = 0;
|
|
|
13
13
|
function _class_private_field_loose_key(name) {
|
|
14
14
|
return "__private_" + id++ + "_" + name;
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Defines a Strapi MCP tool with full type inference, ready to pass to
|
|
18
|
+
* `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.
|
|
19
|
+
*
|
|
20
|
+
* The returned value is the definition unchanged — this builder only exists to
|
|
21
|
+
* infer the `name`, input/output schemas and handler types, and to narrow the
|
|
22
|
+
* access variant (`devModeOnly` vs `auth`) so the result is directly assignable
|
|
23
|
+
* to `registerTool`.
|
|
24
|
+
*
|
|
25
|
+
* @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,
|
|
26
|
+
* no auth) or an `auth` policy set — never both.
|
|
27
|
+
* @returns The same definition, with its access variant narrowed.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { ai } from '@strapi/strapi';
|
|
32
|
+
* import { z } from '@strapi/utils';
|
|
33
|
+
*
|
|
34
|
+
* const greet = ai.mcp.defineTool({
|
|
35
|
+
* name: 'greet',
|
|
36
|
+
* title: 'Greet',
|
|
37
|
+
* description: 'Greets a user by name',
|
|
38
|
+
* devModeOnly: true,
|
|
39
|
+
* resolveInputSchema: () => z.object({ name: z.string() }),
|
|
40
|
+
* resolveOutputSchema: () => z.object({ message: z.string() }),
|
|
41
|
+
* createHandler: (strapi) => async ({ args }) => {
|
|
42
|
+
* const message = `Hello, ${args.name}!`;
|
|
43
|
+
* return { content: [{ type: 'text', text: message }], structuredContent: { message } };
|
|
44
|
+
* },
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // later, in register() or bootstrap():
|
|
48
|
+
* strapi.ai.mcp.registerTool(greet);
|
|
49
|
+
* ```
|
|
50
|
+
*/ const makeMcpToolDefinition = (definition)=>definition;
|
|
19
51
|
var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi"), _ability = /*#__PURE__*/ _class_private_field_loose_key("_ability"), _user = /*#__PURE__*/ _class_private_field_loose_key("_user");
|
|
20
52
|
class McpToolRegistry extends McpCapabilityRegistryBase {
|
|
21
53
|
bind(mcpServer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.mjs","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport {
|
|
1
|
+
{"version":3,"file":"tool-registry.mjs","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport type { McpAdminTokenAbility } from './authentication';\n\n/**\n * Defines a Strapi MCP tool with full type inference, ready to pass to\n * `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`, input/output schemas and handler types, and to narrow the\n * access variant (`devModeOnly` vs `auth`) so the result is directly assignable\n * to `registerTool`.\n *\n * @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,\n * no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n * import { z } from '@strapi/utils';\n *\n * const greet = ai.mcp.defineTool({\n * name: 'greet',\n * title: 'Greet',\n * description: 'Greets a user by name',\n * devModeOnly: true,\n * resolveInputSchema: () => z.object({ name: z.string() }),\n * resolveOutputSchema: () => z.object({ message: z.string() }),\n * createHandler: (strapi) => async ({ args }) => {\n * const message = `Hello, ${args.name}!`;\n * return { content: [{ type: 'text', text: message }], structuredContent: { message } };\n * },\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerTool(greet);\n * ```\n */\nexport const makeMcpToolDefinition = ((definition: Modules.MCP.McpToolDefinition) =>\n definition) as unknown as Modules.MCP.McpToolBuilder;\n\nexport class McpToolRegistry\n extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n #ability: McpAdminTokenAbility;\n\n #user: Modules.MCP.McpHandlerContext['user'];\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n this.#ability = ctx.ability;\n this.#user = ctx.user;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } =\n definition;\n\n // Bind the session ability and token owner into the handler context so handlers can enforce\n // field-level and entity-level permission checks and set creator fields.\n const context: Modules.MCP.McpHandlerContext = {\n userAbility: this.#ability,\n user: this.#user,\n };\n const createHandlerWithContext = (strapi: Core.Strapi) => createHandler(strapi, context);\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Tool',\n name,\n createHandler: createHandlerWithContext,\n createFallbackHandler(errorMessage) {\n return async () => ({\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" failed to initialize: ${errorMessage}`,\n },\n ],\n isError: true,\n });\n },\n createErrorResult(error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" execution failed: ${error.message}`,\n },\n ],\n isError: true,\n };\n },\n registerWithSdk(safeHandler) {\n const inputSchema =\n resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;\n const outputSchema = resolveOutputSchema(context);\n\n // Adapt from our object-literal handler `({ args, extra })` to\n // the MCP SDK's positional form `(args, extra)` / `(extra)`.\n const baseHandler =\n inputSchema !== undefined\n ? (args: unknown, extra: unknown) =>\n safeHandler({ args, extra } as Parameters<typeof safeHandler>[0])\n : (extra: unknown) => safeHandler({ extra } as Parameters<typeof safeHandler>[0]);\n\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n baseHandler\n );\n\n return mcpServer.registerTool(\n name,\n { title, description, inputSchema, outputSchema },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpToolDefinition","definition","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","resolveInputSchema","resolveOutputSchema","createHandler","context","userAbility","user","createHandlerWithContext","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","content","type","text","isError","createErrorResult","error","message","registerWithSdk","safeHandler","inputSchema","undefined","outputSchema","baseHandler","args","extra","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerTool","ctx","definitions","ability"],"mappings":"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"}
|
|
@@ -1,87 +1,17 @@
|
|
|
1
1
|
import { z } from '@strapi/utils';
|
|
2
|
-
export declare const logToolDefinition: {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
log: "log";
|
|
18
|
-
warn: "warn";
|
|
19
|
-
}>>;
|
|
20
|
-
}, z.core.$strip>> | undefined;
|
|
21
|
-
resolveOutputSchema: import("@strapi/types/dist/modules/mcp").McpToolSchemaResolver<z.ZodObject<{
|
|
22
|
-
status: z.ZodString;
|
|
23
|
-
message: z.ZodString;
|
|
24
|
-
level: z.ZodString;
|
|
25
|
-
timestamp: z.ZodString;
|
|
26
|
-
}, z.core.$strip>>;
|
|
27
|
-
createHandler: (strapi: import("@strapi/types/dist/core").Strapi, context: import("@strapi/types/dist/modules/mcp").McpHandlerContext) => import("@strapi/types/dist/modules/mcp").McpToolHandler<NoInfer<z.ZodObject<{
|
|
28
|
-
message: z.ZodString;
|
|
29
|
-
level: z.ZodDefault<z.ZodEnum<{
|
|
30
|
-
http: "http";
|
|
31
|
-
info: "info";
|
|
32
|
-
error: "error";
|
|
33
|
-
log: "log";
|
|
34
|
-
warn: "warn";
|
|
35
|
-
}>>;
|
|
36
|
-
}, z.core.$strip>>, NoInfer<z.ZodObject<{
|
|
37
|
-
status: z.ZodString;
|
|
38
|
-
message: z.ZodString;
|
|
39
|
-
level: z.ZodString;
|
|
40
|
-
timestamp: z.ZodString;
|
|
41
|
-
}, z.core.$strip>>>;
|
|
42
|
-
} & {
|
|
43
|
-
name: "log";
|
|
44
|
-
title: "Strapi Log";
|
|
45
|
-
description: "Logs a message to the Strapi logger with specified level";
|
|
46
|
-
resolveInputSchema: () => z.ZodObject<{
|
|
47
|
-
message: z.ZodString;
|
|
48
|
-
level: z.ZodDefault<z.ZodEnum<{
|
|
49
|
-
http: "http";
|
|
50
|
-
info: "info";
|
|
51
|
-
error: "error";
|
|
52
|
-
log: "log";
|
|
53
|
-
warn: "warn";
|
|
54
|
-
}>>;
|
|
55
|
-
}, z.core.$strip>;
|
|
56
|
-
resolveOutputSchema: () => z.ZodObject<{
|
|
57
|
-
status: z.ZodString;
|
|
58
|
-
message: z.ZodString;
|
|
59
|
-
level: z.ZodString;
|
|
60
|
-
timestamp: z.ZodString;
|
|
61
|
-
}, z.core.$strip>;
|
|
62
|
-
telemetry: {
|
|
63
|
-
source: string;
|
|
64
|
-
name: string;
|
|
65
|
-
};
|
|
66
|
-
devModeOnly: true;
|
|
67
|
-
createHandler: (strapi: import("@strapi/types/dist/core").Strapi) => ({ args }: {
|
|
68
|
-
extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>;
|
|
69
|
-
} & {
|
|
70
|
-
args: {
|
|
71
|
-
message: string;
|
|
72
|
-
level: "http" | "info" | "error" | "log" | "warn";
|
|
73
|
-
};
|
|
74
|
-
}) => Promise<{
|
|
75
|
-
content: {
|
|
76
|
-
type: "text";
|
|
77
|
-
text: string;
|
|
78
|
-
}[];
|
|
79
|
-
structuredContent: {
|
|
80
|
-
status: string;
|
|
81
|
-
message: string;
|
|
82
|
-
level: "http" | "info" | "error" | "log" | "warn";
|
|
83
|
-
timestamp: string;
|
|
84
|
-
};
|
|
85
|
-
}>;
|
|
86
|
-
};
|
|
2
|
+
export declare const logToolDefinition: import("@strapi/types/dist/modules/mcp").McpToolDefinitionFields<"log", z.ZodObject<{
|
|
3
|
+
message: z.ZodString;
|
|
4
|
+
level: z.ZodDefault<z.ZodEnum<{
|
|
5
|
+
http: "http";
|
|
6
|
+
info: "info";
|
|
7
|
+
error: "error";
|
|
8
|
+
log: "log";
|
|
9
|
+
warn: "warn";
|
|
10
|
+
}>>;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
status: z.ZodString;
|
|
13
|
+
message: z.ZodString;
|
|
14
|
+
level: z.ZodString;
|
|
15
|
+
timestamp: z.ZodString;
|
|
16
|
+
}, z.core.$strip>, "Strapi Log", "Logs a message to the Strapi logger with specified level"> & import("@strapi/types/dist/modules/mcp").McpDevModeAccess;
|
|
87
17
|
//# sourceMappingURL=log.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/tools/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAmBlC,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/tools/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAmBlC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;wJAwE5B,CAAC"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var crypto = require('crypto');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
8
|
+
|
|
5
9
|
/**
|
|
6
10
|
* Generate an admin user hash
|
|
7
11
|
*/ const generateAdminUserHash = (strapi)=>{
|
|
@@ -9,7 +13,7 @@ var crypto = require('crypto');
|
|
|
9
13
|
if (!ctx?.state?.user?.email) {
|
|
10
14
|
return '';
|
|
11
15
|
}
|
|
12
|
-
return
|
|
16
|
+
return crypto__default.default.createHash('sha256').update(ctx.state.user.email).digest('hex');
|
|
13
17
|
};
|
|
14
18
|
|
|
15
19
|
exports.generateAdminUserHash = generateAdminUserHash;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-user-hash.js","sources":["../../../src/services/metrics/admin-user-hash.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Core } from '@strapi/types';\n\n/**\n * Generate an admin user hash\n */\nconst generateAdminUserHash = (strapi: Core.Strapi) => {\n const ctx = strapi?.requestContext?.get();\n\n if (!ctx?.state?.user?.email) {\n return '';\n }\n return crypto.createHash('sha256').update(ctx.state.user.email).digest('hex');\n};\n\nexport { generateAdminUserHash };\n"],"names":["generateAdminUserHash","strapi","ctx","requestContext","get","state","user","email","crypto","createHash","update","digest"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin-user-hash.js","sources":["../../../src/services/metrics/admin-user-hash.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Core } from '@strapi/types';\n\n/**\n * Generate an admin user hash\n */\nconst generateAdminUserHash = (strapi: Core.Strapi) => {\n const ctx = strapi?.requestContext?.get();\n\n if (!ctx?.state?.user?.email) {\n return '';\n }\n return crypto.createHash('sha256').update(ctx.state.user.email).digest('hex');\n};\n\nexport { generateAdminUserHash };\n"],"names":["generateAdminUserHash","strapi","ctx","requestContext","get","state","user","email","crypto","createHash","update","digest"],"mappings":";;;;;;;;AAGA;;IAGA,MAAMA,wBAAwB,CAACC,MAAAA,GAAAA;IAC7B,MAAMC,GAAAA,GAAMD,QAAQE,cAAAA,EAAgBC,GAAAA,EAAAA;AAEpC,IAAA,IAAI,CAACF,GAAAA,EAAKG,KAAAA,EAAOC,IAAAA,EAAMC,KAAAA,EAAO;QAC5B,OAAO,EAAA;AACT,IAAA;AACA,IAAA,OAAOC,uBAAAA,CAAOC,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAACR,GAAAA,CAAIG,KAAK,CAACC,IAAI,CAACC,KAAK,CAAA,CAAEI,MAAM,CAAC,KAAA,CAAA;AACzE;;;;"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
8
|
+
|
|
5
9
|
const isTruthy = (val)=>{
|
|
6
10
|
return [
|
|
7
11
|
1,
|
|
@@ -9,7 +13,7 @@ const isTruthy = (val)=>{
|
|
|
9
13
|
].includes(val) || [
|
|
10
14
|
'true',
|
|
11
15
|
'1'
|
|
12
|
-
].includes(
|
|
16
|
+
].includes(___default.default.toLower(val));
|
|
13
17
|
};
|
|
14
18
|
|
|
15
19
|
module.exports = isTruthy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-truthy.js","sources":["../../../src/services/metrics/is-truthy.ts"],"sourcesContent":["import _ from 'lodash';\n\nconst isTruthy = (val: any) => {\n return [1, true].includes(val) || ['true', '1'].includes(_.toLower(val));\n};\n\nexport default isTruthy;\n"],"names":["isTruthy","val","includes","_","toLower"],"mappings":"
|
|
1
|
+
{"version":3,"file":"is-truthy.js","sources":["../../../src/services/metrics/is-truthy.ts"],"sourcesContent":["import _ from 'lodash';\n\nconst isTruthy = (val: any) => {\n return [1, true].includes(val) || ['true', '1'].includes(_.toLower(val));\n};\n\nexport default isTruthy;\n"],"names":["isTruthy","val","includes","_","toLower"],"mappings":";;;;;;;;AAEA,MAAMA,WAAW,CAACC,GAAAA,GAAAA;IAChB,OAAO;AAAC,QAAA,CAAA;AAAG,QAAA;KAAK,CAACC,QAAQ,CAACD,GAAAA,CAAAA,IAAQ;AAAC,QAAA,MAAA;AAAQ,QAAA;AAAI,KAAA,CAACC,QAAQ,CAACC,kBAAAA,CAAEC,OAAO,CAACH,GAAAA,CAAAA,CAAAA;AACrE;;;;"}
|
|
@@ -8,6 +8,14 @@ var ciEnv = require('ci-info');
|
|
|
8
8
|
var strapiUtils = require('@strapi/utils');
|
|
9
9
|
var adminUserHash = require('./admin-user-hash.js');
|
|
10
10
|
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var os__default = /*#__PURE__*/_interopDefault(os);
|
|
14
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
15
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
16
|
+
var isDocker__default = /*#__PURE__*/_interopDefault(isDocker);
|
|
17
|
+
var ciEnv__default = /*#__PURE__*/_interopDefault(ciEnv);
|
|
18
|
+
|
|
11
19
|
// Lazy: only resolved when telemetry is enabled and a sender is constructed
|
|
12
20
|
let lazyTsUtils;
|
|
13
21
|
const tsUtils = ()=>{
|
|
@@ -27,7 +35,7 @@ const defaultQueryOpts = {
|
|
|
27
35
|
* Add properties from the package.json strapi key in the metadata
|
|
28
36
|
*/ const addPackageJsonStrapiMetadata = (metadata, strapi)=>{
|
|
29
37
|
const { packageJsonStrapi = {} } = strapi.config;
|
|
30
|
-
|
|
38
|
+
___default.default.defaults(metadata, packageJsonStrapi);
|
|
31
39
|
};
|
|
32
40
|
/**
|
|
33
41
|
* Create a send function for event with all the necessary metadata
|
|
@@ -35,18 +43,18 @@ const defaultQueryOpts = {
|
|
|
35
43
|
const { uuid, installId: installIdFromPackageJson } = strapi.config;
|
|
36
44
|
const installId = strapiUtils.generateInstallId(uuid, installIdFromPackageJson);
|
|
37
45
|
const serverRootPath = strapi.dirs.app.root;
|
|
38
|
-
const adminRootPath =
|
|
46
|
+
const adminRootPath = path__default.default.join(strapi.dirs.app.root, 'src', 'admin');
|
|
39
47
|
const anonymousUserProperties = {
|
|
40
48
|
environment: strapi.config.environment,
|
|
41
|
-
os:
|
|
42
|
-
osPlatform:
|
|
43
|
-
osArch:
|
|
44
|
-
osRelease:
|
|
49
|
+
os: os__default.default.type(),
|
|
50
|
+
osPlatform: os__default.default.platform(),
|
|
51
|
+
osArch: os__default.default.arch(),
|
|
52
|
+
osRelease: os__default.default.release(),
|
|
45
53
|
nodeVersion: process.versions.node
|
|
46
54
|
};
|
|
47
55
|
const anonymousGroupProperties = {
|
|
48
|
-
docker: process.env.DOCKER ||
|
|
49
|
-
isCI:
|
|
56
|
+
docker: process.env.DOCKER || isDocker__default.default(),
|
|
57
|
+
isCI: ciEnv__default.default.isCI,
|
|
50
58
|
version: strapi.config.get('info.strapi'),
|
|
51
59
|
useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),
|
|
52
60
|
useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),
|
|
@@ -81,7 +89,7 @@ const defaultQueryOpts = {
|
|
|
81
89
|
...payload.groupProperties
|
|
82
90
|
}
|
|
83
91
|
}),
|
|
84
|
-
...
|
|
92
|
+
...___default.default.merge({
|
|
85
93
|
headers: {
|
|
86
94
|
'X-Strapi-Event': event
|
|
87
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sender.js","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\n// Lazy: only resolved when telemetry is enabled and a sender is constructed\nlet lazyTsUtils: typeof import('@strapi/typescript-utils') | undefined;\nconst tsUtils = (): typeof import('@strapi/typescript-utils') => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return lazyTsUtils as typeof import('@strapi/typescript-utils');\n};\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...eeGroupProps,\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["lazyTsUtils","tsUtils","require","defaultQueryOpts","timeout","headers","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sender.js","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\n// Lazy: only resolved when telemetry is enabled and a sender is constructed\nlet lazyTsUtils: typeof import('@strapi/typescript-utils') | undefined;\nconst tsUtils = (): typeof import('@strapi/typescript-utils') => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return lazyTsUtils as typeof import('@strapi/typescript-utils');\n};\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...eeGroupProps,\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["lazyTsUtils","tsUtils","require","defaultQueryOpts","timeout","headers","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":"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"}
|
|
@@ -3,9 +3,13 @@
|
|
|
3
3
|
var Router = require('@koa/router');
|
|
4
4
|
var routing = require('./routing.js');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var Router__default = /*#__PURE__*/_interopDefault(Router);
|
|
9
|
+
|
|
6
10
|
const createAPI = (strapi, opts = {})=>{
|
|
7
11
|
const { prefix, type } = opts;
|
|
8
|
-
const api = new
|
|
12
|
+
const api = new Router__default.default({
|
|
9
13
|
prefix
|
|
10
14
|
});
|
|
11
15
|
const routeManager = routing.createRouteManager(strapi, {
|