diff --git a/.changeset/application-keys-mcp-endpoint-tools.md b/.changeset/application-keys-mcp-endpoint-tools.md new file mode 100644 index 000000000..abf7c3c96 --- /dev/null +++ b/.changeset/application-keys-mcp-endpoint-tools.md @@ -0,0 +1,5 @@ +--- +"@epcc-sdk/sdks-application-keys": minor +--- + +`@epcc-sdk/sdks-application-keys` has a new `/mcp` export. It has one Model Context Protocol (MCP) tool factory for each of its 5 operations, such as `listApplicationKeysTool`, and `tools()`, which returns all 5. A factory returns the `name`, `config` and `handler` that `McpServer.registerTool` takes. Without a `client`, a tool uses the package's module level `client`, which has no credentials until you configure it. `@modelcontextprotocol/sdk` is an optional peer dependency. The main entry does not change. diff --git a/.changeset/currencies-mcp-endpoint-tools.md b/.changeset/currencies-mcp-endpoint-tools.md new file mode 100644 index 000000000..a23e7240c --- /dev/null +++ b/.changeset/currencies-mcp-endpoint-tools.md @@ -0,0 +1,5 @@ +--- +"@epcc-sdk/sdks-currencies": minor +--- + +`@epcc-sdk/sdks-currencies` has a new `/mcp` export. It has one Model Context Protocol (MCP) tool factory for each of its 5 operations, such as `getAllCurrenciesTool`, and `tools()`, which returns all 5. A factory returns the `name`, `config` and `handler` that `McpServer.registerTool` takes. Without a `client`, a tool uses the package's module level `client`, which has no credentials until you configure it. `@modelcontextprotocol/sdk` is an optional peer dependency. The main entry does not change. diff --git a/.changeset/merchant-realm-mapping-mcp-endpoint-tools.md b/.changeset/merchant-realm-mapping-mcp-endpoint-tools.md new file mode 100644 index 000000000..6bed621b1 --- /dev/null +++ b/.changeset/merchant-realm-mapping-mcp-endpoint-tools.md @@ -0,0 +1,5 @@ +--- +"@epcc-sdk/sdks-merchant-realm-mapping": minor +--- + +`@epcc-sdk/sdks-merchant-realm-mapping` has a new `/mcp` export. It has one Model Context Protocol (MCP) tool factory for each of its 3 operations, such as `getMerchantRealmMappingsTool`, and `tools()`, which returns all 3. A factory returns the `name`, `config` and `handler` that `McpServer.registerTool` takes. Without a `client`, a tool uses the package's module level `client`, which has no credentials until you configure it. `@modelcontextprotocol/sdk` is an optional peer dependency. The main entry does not change. diff --git a/.changeset/permissions-mcp-endpoint-tools.md b/.changeset/permissions-mcp-endpoint-tools.md new file mode 100644 index 000000000..e87601c6f --- /dev/null +++ b/.changeset/permissions-mcp-endpoint-tools.md @@ -0,0 +1,5 @@ +--- +"@epcc-sdk/permissions": minor +--- + +`@epcc-sdk/permissions` has a new `/mcp` export. It has one Model Context Protocol (MCP) tool factory for each of its 9 operations, such as `listStandardUserRolesTool`, and `tools()`, which returns all 9. A factory returns the `name`, `config` and `handler` that `McpServer.registerTool` takes. Without a `client`, a tool uses the package's module level `client`, which has no credentials until you configure it. `@modelcontextprotocol/sdk` is an optional peer dependency. The main entry does not change. diff --git a/.changeset/personal-data-mcp-endpoint-tools.md b/.changeset/personal-data-mcp-endpoint-tools.md new file mode 100644 index 000000000..f1cfafe43 --- /dev/null +++ b/.changeset/personal-data-mcp-endpoint-tools.md @@ -0,0 +1,5 @@ +--- +"@epcc-sdk/personal-data": minor +--- + +`@epcc-sdk/personal-data` has a new `/mcp` export. It has one Model Context Protocol (MCP) tool factory for each of its 7 operations, such as `getPersonalDataLogsTool`, and `tools()`, which returns all 7. A factory returns the `name`, `config` and `handler` that `McpServer.registerTool` takes. Without a `client`, a tool uses the package's module level `client`, which has no credentials until you configure it. `@modelcontextprotocol/sdk` is an optional peer dependency. The main entry does not change. diff --git a/.changeset/settings-mcp-endpoint-tools.md b/.changeset/settings-mcp-endpoint-tools.md new file mode 100644 index 000000000..81a511345 --- /dev/null +++ b/.changeset/settings-mcp-endpoint-tools.md @@ -0,0 +1,5 @@ +--- +"@epcc-sdk/settings": minor +--- + +`@epcc-sdk/settings` has a new `/mcp` export. It has one Model Context Protocol (MCP) tool factory for each of its 3 operations, such as `getV2SettingsTool`, and `tools()`, which returns all 3. A factory returns the `name`, `config` and `handler` that `McpServer.registerTool` takes. Without a `client`, a tool uses the package's module level `client`, which has no credentials until you configure it. `@modelcontextprotocol/sdk` is an optional peer dependency. The main entry does not change. diff --git a/.gitignore b/.gitignore index a5b187852..f8349f7ef 100644 --- a/.gitignore +++ b/.gitignore @@ -51,5 +51,11 @@ packages/sdks/catalogs/test/.generated-*/ packages/sdks/rule-promotions/test/.generated-*/ packages/sdks/cart-checkout-order/test/.generated-*/ packages/sdks/files/test/.generated-*/ +packages/sdks/personal-data/test/.generated-*/ +packages/sdks/permissions/test/.generated-*/ +packages/sdks/merchant-realm-mapping/test/.generated-*/ +packages/sdks/settings/test/.generated-*/ +packages/sdks/currencies/test/.generated-*/ +packages/sdks/application-keys/test/.generated-*/ .vercel .pnpm-store/ diff --git a/packages/sdks/application-keys/README.md b/packages/sdks/application-keys/README.md index aac3de1f5..adf71ebfd 100644 --- a/packages/sdks/application-keys/README.md +++ b/packages/sdks/application-keys/README.md @@ -2,7 +2,6 @@ Below you'll find instructions on how to install, set up, and use the client, along with a list of available operations. - ## Features - type-safe response data and errors @@ -13,7 +12,6 @@ Below you'll find instructions on how to install, set up, and use the client, al --- - ## Installation ```bash @@ -28,7 +26,6 @@ yarn add @epcc-sdk/sdks-application-keys ## Client Usage - Clients are responsible for sending the actual HTTP requests. The Fetch client is built as a thin wrapper on top of Fetch API, extending its functionality. If you're already familiar with Fetch, configuring your client will feel like working directly with Fetch API. @@ -40,23 +37,22 @@ You can configure the client in two ways: **When using the operation function to make requests, by default the global client will be used unless another is provided.** - ### 1. Configure the internal `client` instance directly This is the simpler approach. You can call the setConfig() method at the beginning of your application or anytime you need to update the client configuration. You can pass any Fetch API configuration option to setConfig(), and even your own Fetch implementation. ```ts -import { client } from "@epcc-sdk/sdks-application-keys"; +import { client } from "@epcc-sdk/sdks-application-keys" client.setConfig({ -// set default base url for requests -baseUrl: 'https://euwest.api.elasticpath.com', + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", -// set default headers for requests -headers: { -Authorization: 'Bearer YOUR_AUTH_TOKEN', -}, -}); + // set default headers for requests + headers: { + Authorization: "Bearer YOUR_AUTH_TOKEN", + }, +}) ``` The disadvantage of this approach is that your code may call the client instance before it's configured for the first time. Depending on your use case, you might need to use the second approach. @@ -66,27 +62,27 @@ The disadvantage of this approach is that your code may call the client instance This is useful when you want to use a different instance of the client for different parts of your application or when you want to use different configurations for different parts of your application. ```ts -import { createClient } from "@epcc-sdk/sdks-application-keys"; +import { createClient } from "@epcc-sdk/sdks-application-keys" // Create the client with your API base URL. const client = createClient({ - // set default base url for requests - baseUrl: "https://euwest.api.elasticpath.com", - /** - * Set default headers only for requests made by this client. - */ - headers: { - "Custom-Header": 'My Value', - }, -}); + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", + /** + * Set default headers only for requests made by this client. + */ + headers: { + "Custom-Header": "My Value", + }, +}) ``` You can also pass this instance to any SDK function through the client option. This will override the default instance from `import { client } from "@epcc-sdk/sdks-application-keys>". ```ts const response = await getKey({ - client: myClient, -}); + client: myClient, +}) ``` ### Direct configuration @@ -95,8 +91,8 @@ Alternatively, you can pass the client configuration options to each SDK functio ```ts const response = await getKey({ - baseUrl: 'https://example.com', // <-- override default configuration -}); + baseUrl: "https://example.com", // <-- override default configuration +}) ``` ## Interceptors (Middleware) @@ -104,35 +100,34 @@ const response = await getKey({ Interceptors (middleware) can be used to modify requests before they're sent or responses before they're returned to your application. They can be added with use and removed with eject. Below is an example request interceptor ```ts -import { client } from "@epcc-sdk/sdks-application-keys"; +import { client } from "@epcc-sdk/sdks-application-keys" // Supports async functions client.interceptors.request.use(async (request) => { - // do something - return request; -}); + // do something + return request +}) client.interceptors.request.eject((request) => { - // do something - return request; -}); - + // do something + return request +}) ``` and an example response interceptor ```ts -import { client } from "@epcc-sdk/sdks-application-keys"; +import { client } from "@epcc-sdk/sdks-application-keys" client.interceptors.response.use((response) => { - // do something - return response; -}); + // do something + return response +}) client.interceptors.response.eject((response) => { - // do something - return response; -}); + // do something + return response +}) ``` > **_Tip:_** To eject, you must provide a reference to the function that was passed to use(). @@ -146,15 +141,15 @@ source, sets the `auth` hook, refreshes and replays once on a 401, and backs off import { createApplicationKeysClient, listApplicationKeys, -} from "@epcc-sdk/sdks-application-keys"; +} from "@epcc-sdk/sdks-application-keys" const client = createApplicationKeysClient({ baseUrl: "https://euwest.api.elasticpath.com", clientId: process.env.EPCC_CLIENT_ID!, clientSecret: process.env.EPCC_CLIENT_SECRET!, -}); +}) -const { data } = await listApplicationKeys({ client }); +const { data } = await listApplicationKeys({ client }) ``` Credentials come from `source`, `provider`, `token`, `clientId` plus `clientSecret`, or @@ -176,11 +171,86 @@ Zod schemas for every request body, path and response are published under the `/ subpath. `zod` is an optional peer dependency (4.x), so the root entry never imports it. ```ts -import { zApplicationKey } from "@epcc-sdk/sdks-application-keys/zod"; +import { zApplicationKey } from "@epcc-sdk/sdks-application-keys/zod" -const key = zApplicationKey.parse(data?.data?.[0]); +const key = zApplicationKey.parse(data?.data?.[0]) ``` +## MCP endpoint tools + +The `/mcp` subpath turns each of the 5 application keys operations into a Model Context Protocol (MCP) tool. +The main entry imports none of it. `zod` 4 and `@modelcontextprotocol/sdk` are needed only for this +subpath. + +Each operation has one tool factory, named after its function with `Tool` added, such as +`listApplicationKeysTool`. A factory returns `{ name, config, handler }`, the three arguments that +`McpServer.registerTool` takes. `tools()` returns all 5 in operation order. A handler returns an API +error as an `isError` result and does not throw. + +Register one tool: + +```ts +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { listApplicationKeysTool } from "@epcc-sdk/sdks-application-keys/mcp" + +const server = new McpServer({ name: "application-keys", version: "1.0.0" }) +const tool = listApplicationKeysTool() +server.registerTool(tool.name, tool.config, tool.handler) +``` + +A tool built without a client calls through the package's module level `client`, like an operation +does. That client has no credentials until you configure it. Configure it once: + +```ts +import { + client, + createApplicationKeysClient, +} from "@epcc-sdk/sdks-application-keys" + +client.setConfig( + createApplicationKeysClient({ baseUrl, clientId, clientSecret }).getConfig(), +) +``` + +Register every tool, with a client that sends the same headers on every call: + +```ts +import * as applicationKeys from "@epcc-sdk/sdks-application-keys/mcp" + +const client = createApplicationKeysClient({ + baseUrl, + clientId, + clientSecret, + config: { headers: { "EP-Store-Id": storeId, "EP-Org-Id": orgId } }, +}) +applicationKeys + .tools({ client }) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Register the read-only tools only: + +```ts +applicationKeys + .tools({ client }) + .filter((t) => t.config._meta["com.elasticpath/operation"].risk === "read") + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Each tool is named `application_keys_`, and its arguments are grouped under `path`, +`query`, `headers` and `body`. The `path`, `query` and `headers` groups reject keys the spec does not +list. The `body` keeps them, so an attribute the spec does not list still reaches the API. The client +supplies the `Authorization` header, so no tool asks for it. Cancelling the MCP request cancels the +HTTP request. + +Each tool's description is written for a model choosing between tools: what the tool does, when to +use it rather than a similar tool, and any caveat that changes when to call it, in at most 600 +characters. The full spec description stays in the doc comment of the operation's function and its +tool factory. + +`config._meta["com.elasticpath/operation"]` holds the operation's `id`, `method`, `path` and `risk`. +The risk is `read`, `create`, `update` or `delete`, and the annotations follow from it. + ## Build URL If you need to access the compiled URL, you can use the buildUrl() method. It's loosely typed by default to accept almost any value; in practice, you will want to pass a type hint. @@ -188,34 +258,30 @@ If you need to access the compiled URL, you can use the buildUrl() method. It's ```ts type FooData = { path: { - fooId: number; - }; + fooId: number + } query?: { - bar?: string; - }; - url: '/foo/{fooId}'; -}; + bar?: string + } + url: "/foo/{fooId}" +} const url = client.buildUrl({ path: { fooId: 1, }, query: { - bar: 'baz', + bar: "baz", }, - url: '/foo/{fooId}', -}); -console.log(url); // prints '/foo/1?bar=baz' + url: "/foo/{fooId}", +}) +console.log(url) // prints '/foo/1?bar=baz' ``` - --- - - - - ## Operation Usage + The following examples demonstrate how to use the operation function to make requests. ```ts @@ -234,12 +300,8 @@ const product = await getKey({ --- - - ## Available Operations - - - **`getAllKeys`** (`GET /v2/application-keys`) - **`createKey`** (`POST /v2/application-keys`) @@ -250,7 +312,4 @@ const product = await getKey({ - **`updateKey`** (`PUT /v2/application-keys/{application_key_id}`) - - - ---- \ No newline at end of file +--- diff --git a/packages/sdks/application-keys/openapi-ts.config.ts b/packages/sdks/application-keys/openapi-ts.config.ts index 1fe54cc03..ea0a5c9b8 100644 --- a/packages/sdks/application-keys/openapi-ts.config.ts +++ b/packages/sdks/application-keys/openapi-ts.config.ts @@ -1,8 +1,9 @@ -import { defineConfig } from "@hey-api/openapi-ts" +import { $, defineConfig } from "@hey-api/openapi-ts" import { int64AsNumber } from "../specs/heyapi/int64-as-number" +import { mcpTools } from "../specs/heyapi/mcp-tools" export default defineConfig({ - input: "../specs/application-keys.yaml", + input: "../specs/bundled/application-keys_standalone.yaml", output: { path: "src/client", postProcess: ["prettier"] }, plugins: [ { @@ -16,5 +17,6 @@ export default defineConfig({ metadata: true, name: "zod", }, + mcpTools($, { api: "application_keys" }), ], }) diff --git a/packages/sdks/application-keys/package.json b/packages/sdks/application-keys/package.json index 5fb20e821..7931898c6 100644 --- a/packages/sdks/application-keys/package.json +++ b/packages/sdks/application-keys/package.json @@ -7,8 +7,9 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "pnpm openapi-ts && pnpm build:tsup", + "build": "pnpm oas:build && pnpm openapi-ts && pnpm build:tsup", "build:tsup": "tsup", + "oas:build": "redocly bundle application-keys-standalone@v1 --config ../specs/config/redocly.yaml", "openapi-ts": "openapi-ts", "test": "vitest run", "test:watch": "vitest" @@ -34,12 +35,25 @@ "default": "./dist/zod.cjs" } }, + "./mcp": { + "import": { + "types": "./dist/mcp.d.ts", + "default": "./dist/mcp.mjs" + }, + "require": { + "types": "./dist/mcp.d.cts", + "default": "./dist/mcp.cjs" + } + }, "./package.json": "./package.json" }, "typesVersions": { "*": { "zod": [ "./dist/zod.d.ts" + ], + "mcp": [ + "./dist/mcp.d.ts" ] } }, @@ -55,6 +69,9 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.99.0", + "@modelcontextprotocol/sdk": "1.31.0", + "@redocly/cli": "^1.21.0", + "@redocly/openapi-core": "^1.21.0", "@types/ejs": "^3.1.5", "ejs": "^3.1.10", "esbuild-fix-imports-plugin": "^1.0.19", @@ -65,9 +82,13 @@ "zod": "4.6.5" }, "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.31.0", "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, "zod": { "optional": true } diff --git a/packages/sdks/application-keys/pnpm-lock.yaml b/packages/sdks/application-keys/pnpm-lock.yaml index 0cb6732b4..6648e9398 100644 --- a/packages/sdks/application-keys/pnpm-lock.yaml +++ b/packages/sdks/application-keys/pnpm-lock.yaml @@ -15,6 +15,15 @@ importers: '@hey-api/openapi-ts': specifier: 0.99.0 version: 0.99.0(typescript@5.8.2) + '@modelcontextprotocol/sdk': + specifier: 1.31.0 + version: 1.31.0(zod@4.6.5) + '@redocly/cli': + specifier: ^1.21.0 + version: 1.34.21(ajv@8.20.0) + '@redocly/openapi-core': + specifier: ^1.21.0 + version: 1.34.21 '@types/ejs': specifier: ^3.1.5 version: 3.1.5 @@ -42,6 +51,24 @@ importers: packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} @@ -348,6 +375,13 @@ packages: cpu: [x64] os: [win32] + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@hey-api/codegen-core@0.9.1': resolution: {integrity: sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==} engines: {node: '>=22.18.0'} @@ -373,10 +407,24 @@ packages: '@hey-api/types@0.1.4': resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -401,20 +449,146 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsep-plugin/assignment@1.4.0': + resolution: {integrity: sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.1.0': + resolution: {integrity: sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/cli@1.34.21': + resolution: {integrity: sha512-cWZMh6z6AqJ5Q2nQz2K5XhOnwVWcidtnk4NMjMvdHHpGtjnsPSWKg4fdyWhY46ze5SXu6GxFLTLbMoXGz2JJHA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.21': + resolution: {integrity: sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.21': + resolution: {integrity: sha512-4qTfsJJg51mHqOqcgkw9QLy4wHckt+tqWcBeqhl9/w+4tiOmku06Sx4DqW2a3732jHXIPd0/T1xsehNt4lOhXw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.40.0': resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] @@ -640,6 +814,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -658,6 +835,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@vitest/expect@3.2.7': resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} @@ -687,6 +867,29 @@ packages: '@vitest/utils@3.2.7': resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -703,6 +906,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -710,6 +917,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -720,15 +930,31 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.1: resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} @@ -739,6 +965,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.3.4: resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: @@ -751,6 +981,17 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -771,6 +1012,16 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -782,6 +1033,16 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -793,6 +1054,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -803,10 +1068,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -825,6 +1120,9 @@ packages: supports-color: optional: true + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -844,16 +1142,42 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -865,9 +1189,32 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} @@ -885,16 +1232,68 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -915,15 +1314,55 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -935,10 +1374,69 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -957,6 +1455,12 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -972,14 +1476,36 @@ packages: engines: {node: '>=10'} hasBin: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -987,6 +1513,36 @@ packages: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsep@1.6.0: + resolution: {integrity: sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==} + engines: {node: '>= 20.16.0'} + + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1001,15 +1557,58 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1017,14 +1616,50 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1036,20 +1671,98 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.12: resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openapi-sampler@1.7.0: + resolution: {integrity: sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==} + + openapi-sampler@1.7.6: + resolution: {integrity: sha512-MvWOm3vdgX7CZ6CNfu2wOFMGhC/pq03BxYTL/DKCkyPWfR6XIwUJnOV32mQGgCcUm1tY/y1jj7F2yqx1DieIWw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1058,6 +1771,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1068,6 +1784,9 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1083,9 +1802,21 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.3.3: resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1112,13 +1843,70 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@3.1.0: resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} + peerDependencies: + react: ^19.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1127,6 +1915,27 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} + redoc@2.5.3: + resolution: {integrity: sha512-bBbat+Sx6xKWdyoCGTtA0BWeTEW9Vs4VnEja7q7ZLOk4IM7cHQLrf+kDxWF6dKeKxT8kOBnoy/OsNXCeLttpyQ==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1144,15 +1953,47 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1161,6 +2002,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1168,10 +2043,21 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1179,9 +2065,16 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1190,6 +2083,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1201,6 +2097,28 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1210,6 +2128,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1243,6 +2165,13 @@ packages: resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -1272,11 +2201,49 @@ packages: typescript: optional: true + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici@6.29.0: + resolution: {integrity: sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1350,9 +2317,15 @@ packages: jsdom: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -1366,6 +2339,9 @@ packages: engines: {node: '>=8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1374,15 +2350,74 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.10': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.25.2': optional: true @@ -1536,6 +2571,10 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@hey-api/codegen-core@0.9.1': dependencies: '@hey-api/types': 0.1.4 @@ -1586,6 +2625,12 @@ snapshots: '@hey-api/types@0.1.4': {} + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@humanwhocodes/momoa@2.0.4': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1595,6 +2640,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1616,14 +2665,216 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsep-plugin/assignment@1.4.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + + '@jsep-plugin/regex@1.1.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + '@lukeed/ms@2.0.2': {} + '@modelcontextprotocol/sdk@1.31.0(zod@4.6.5)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) + transitivePeerDependencies: + - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@nodable/entities@3.1.0': {} + + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/cli@1.34.21(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.21 + '@redocly/respect-core': 1.34.21(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 4.0.3 + colorette: 1.4.0 + core-js: 3.32.1 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.0.1 + glob: 7.2.3 + handlebars: 4.7.10 + js-yaml: 4.3.2 + mobx: 6.12.3 + pluralize: 8.0.0 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + redoc: 2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)) + semver: 7.7.4 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.21': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.21(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.21 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.3.2 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.0 + openapi-sampler: 1.7.0 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.29.0 + transitivePeerDependencies: + - ajv + - supports-color + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -1759,6 +3010,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.63.5': optional: true + '@sinclair/typebox@0.27.12': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -1774,6 +3027,9 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/trusted-types@2.0.7': + optional: true + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -1816,6 +3072,28 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1826,18 +3104,47 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} + anynum@1.0.1: {} + argparse@2.0.1: {} assertion-error@2.0.1: {} async@3.2.6: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1847,6 +3154,8 @@ snapshots: dependencies: balanced-match: 1.0.2 + buffer-from@1.1.2: {} + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -1856,6 +3165,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + c12@3.3.4: dependencies: chokidar: 5.0.0 @@ -1873,6 +3184,18 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -1896,6 +3219,16 @@ snapshots: dependencies: readdirp: 5.1.1 + classnames@2.5.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1904,24 +3237,58 @@ snapshots: color-support@1.1.3: {} + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@15.0.0: {} commander@4.1.1: {} concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} consola@3.4.2: {} + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-js@3.32.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -1930,6 +3297,8 @@ snapshots: dependencies: ms: 2.1.3 + decko@1.2.0: {} + deep-eql@5.0.2: {} default-browser-id@5.0.1: {} @@ -1943,12 +3312,32 @@ snapshots: defu@6.1.7: {} + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + diff-sequences@29.6.3: {} + + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.4.7: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -1957,8 +3346,27 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-promise@3.3.1: {} + esbuild-fix-imports-plugin@1.0.19: {} esbuild-plugin-file-path-extensions@1.0.0: {} @@ -2020,35 +3428,163 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} + + escape-html@1.0.3: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 - expect-type@1.4.0: {} + etag@1.8.1: {} - exsolve@1.1.1: {} + event-target-shim@5.0.1: {} - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + eventemitter3@5.0.4: {} - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 + eventsource-parser@3.1.1: {} - filelist@1.0.4: + eventsource@3.0.7: dependencies: - minimatch: 5.1.6 + eventsource-parser: 3.1.1 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + expect-type@1.4.0: {} - fsevents@2.3.3: - optional: true + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3 + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color - get-tsconfig@4.14.0: + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.8: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + foreach@2.0.6: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2063,8 +3599,72 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-client@1.3.5: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -2075,6 +3675,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-promise@4.0.0: {} + + is-unsafe@2.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -2094,16 +3698,62 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jiti@2.7.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.2.0: dependencies: argparse: 2.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsep@1.6.0: {} + + json-pointer@0.6.2: + dependencies: + foreach: 2.0.6 + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.4.0(jsep@1.6.0) + '@jsep-plugin/regex': 1.1.0(jsep@1.6.0) + jsep: 1.6.0 + + jsonpointer@5.0.1: {} + + leven@3.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2112,14 +3762,42 @@ snapshots: lodash.sortby@4.7.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} + lunr@2.3.9: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + mark.js@8.11.1: {} + + marked@4.3.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2128,12 +3806,36 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mobx-react-lite@4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx-react@9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + mobx-react-lite: 4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react: 19.3.1 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx@6.12.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -2144,10 +3846,76 @@ snapshots: nanoid@3.3.19: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + neo-async@2.6.2: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.12: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.1 + open@11.0.0: dependencies: default-browser: 5.5.1 @@ -2157,8 +3925,30 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openapi-sampler@1.7.0: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + openapi-sampler@1.7.6: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + outdent@0.8.0: {} + package-json-from-dist@1.0.1: {} + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -2166,12 +3956,16 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} perfect-debounce@2.1.0: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@4.0.2: {} @@ -2180,12 +3974,20 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-types@2.3.3: dependencies: confbox: 0.3.1 exsolve: 1.1.1 pathe: 2.0.3 + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.10 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28): dependencies: lilconfig: 3.1.3 @@ -2201,17 +4003,118 @@ snapshots: powershell-utils@0.1.0: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + rc9@3.1.0: dependencies: defu: 6.1.7 destr: 2.0.5 + react-dom@19.3.1(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.28.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-tabs@6.1.1(react@19.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.3.1 + + react@19.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.1.1: {} + redoc@2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)): + dependencies: + '@redocly/openapi-core': 1.34.21 + classnames: 2.5.1 + core-js: 3.32.1 + decko: 1.2.0 + dompurify: 3.4.17 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.12.3 + mobx-react: 9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + openapi-sampler: 1.7.6 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + react-tabs: 6.1.1(react@19.3.1) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + + reftools@1.1.9: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -2274,30 +4177,151 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.63.5 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-applescript@7.1.0: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.28.0: {} + + semver@7.7.4: {} + semver@7.8.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} + simple-websocket@9.1.0: + dependencies: + debug: 4.4.3 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + slugify@1.4.7: {} + source-map-js@1.2.1: {} + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@3.10.0: {} + stickyfill@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2310,6 +4334,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2322,6 +4350,21 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.3.1 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -2336,6 +4379,22 @@ snapshots: dependencies: has-flag: 4.0.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2364,6 +4423,10 @@ snapshots: tinyspy@4.0.6: {} + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -2399,8 +4462,35 @@ snapshots: - tsx - yaml + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + typescript@5.8.2: {} + uglify-js@3.19.3: + optional: true + + undici@6.29.0: {} + + unpipe@1.0.0: {} + + uri-js-replace@1.0.1: {} + + url-template@2.0.8: {} + + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + vite-node@3.2.4(jiti@2.7.0): dependencies: cac: 6.7.14 @@ -2473,8 +4563,15 @@ snapshots: - tsx - yaml + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -2490,6 +4587,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2502,9 +4601,37 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-naming@0.3.0: {} + + y18n@5.0.8: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + zod-to-json-schema@3.25.2(zod@4.6.5): + dependencies: + zod: 4.6.5 + zod@4.6.5: {} diff --git a/packages/sdks/application-keys/src/client/mcp-support.gen.ts b/packages/sdks/application-keys/src/client/mcp-support.gen.ts new file mode 100644 index 000000000..5aedf66aa --- /dev/null +++ b/packages/sdks/application-keys/src/client/mcp-support.gen.ts @@ -0,0 +1,260 @@ +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js" +import type { + CallToolResult, + ToolAnnotations, +} from "@modelcontextprotocol/sdk/types.js" +import * as z from "zod" + +export type OperationMeta = { + id: string + method: string + path: string + risk: "read" | "create" | "update" | "delete" +} + +export type ToolConfig = { + title?: string + description?: string + inputSchema: z.ZodObject>> + outputSchema?: AnySchema + annotations?: ToolAnnotations + _meta: { + "com.elasticpath/operation": OperationMeta + } +} + +export type Tool = { + readonly name: string + readonly config: ToolConfig + readonly handler: ToolCallback +} + +const messageOf = (error: unknown) => + error instanceof Error ? error.message : JSON.stringify(error) + +export const toToolResult = async ( + request: Promise<{ + data?: unknown + error?: unknown + response?: Response + }>, +): Promise => { + let text: string + try { + const result = await request + if (result.error === undefined) { + const structuredContent = + typeof result.data === "object" && + result.data !== null && + !Array.isArray(result.data) + ? (result.data as Record) + : { data: result.data ?? null } + return { + structuredContent, + content: [{ type: "text", text: JSON.stringify(structuredContent) }], + } + } + text = result.response + ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}` + : messageOf(result.error) + } catch (error) { + text = messageOf(error) + } + return { isError: true, content: [{ type: "text", text }] } +} + +export const loose = (schema: T): T => { + const def: any = schema._zod.def + const copy = (changes: object): T => + schema.clone({ ...def, ...changes }, { parent: true }) + if (def.type === "object") { + return copy({ + catchall: z.unknown(), + shape: Object.fromEntries( + Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]), + ), + }) + } + if (def.type === "array") { + return copy({ element: loose(def.element) }) + } + if (def.type === "record") { + return copy({ valueType: loose(def.valueType) }) + } + if (def.type === "lazy") { + return copy({ getter: () => loose(def.getter()) }) + } + if ( + [ + "optional", + "nullable", + "default", + "readonly", + "nonoptional", + "catch", + "prefault", + ].includes(def.type) + ) { + return copy({ innerType: loose(def.innerType) }) + } + if (def.type === "union") { + return copy({ options: def.options.map(loose) }) + } + if (def.type === "intersection") { + return copy({ left: loose(def.left), right: loose(def.right) }) + } + return schema +} + +type FileNameFields = { + [P in `${K}_name`]: z.ZodOptional +} + +export const dataUriFields = < + S extends z.ZodRawShape, + C extends z.core.$ZodObjectConfig, + K extends string, +>( + schema: z.ZodObject, + fields: ReadonlyArray, + maxBytes: number, +): z.ZodObject>, C> => + schema.extend( + Object.fromEntries( + fields.flatMap((field) => { + const current = schema.shape[field] as unknown as z.ZodType + const uri = z.string().meta({ + format: "uri", + "x-mcp-file": { maxSize: maxBytes }, + description: [ + current.description, + `Send the file as a data: URI, such as data:text/csv;base64,, at most ${maxBytes} bytes once decoded.`, + ] + .filter(Boolean) + .join(" "), + }) + const name = z + .string() + .meta({ + description: `The name of the file sent in ${field}, such as products.csv.`, + }) + .optional() + return [ + [field, current.isOptional() ? uri.optional() : uri], + [`${field}_name`, name], + ] + }), + ), + ) as unknown as z.ZodObject>, C> + +type DataUrisDecoded = T extends object + ? Omit & { + [P in K & keyof T]: undefined extends T[P] ? File | undefined : File + } + : T + +const DATA_URI = /^data:([^,]*),(.*)$/is +const PERCENT_ENCODED = /^[0-9a-f]{2}$/i + +const notADataUriError = (field: string) => + new Error( + `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`, + ) + +const fileTooBigError = (field: string, bytes: number, maxBytes: number) => + new Error( + `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`, + ) + +function percentDecoded(field: string, text: string) { + const bytes: number[] = [] + const encoder = new TextEncoder() + for (let index = 0; index < text.length; index++) { + if (text[index] === "%") { + const hex = text.slice(index + 1, index + 3) + if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field) + bytes.push(parseInt(hex, 16)) + index += 2 + } else { + const codePoint = text.codePointAt(index)! + const character = String.fromCodePoint(codePoint) + bytes.push(...encoder.encode(character)) + index += character.length - 1 + } + } + return new Uint8Array(bytes) +} + +function base64Decoded(field: string, text: string, maxBytes: number) { + const data = text.replace(/\s/g, "") + const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0 + const bytes = Math.floor((data.length * 3) / 4) - padding + if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes) + let binary: string + try { + binary = atob(data) + } catch { + throw new Error(`${field} is not valid base64`) + } + return Uint8Array.from(binary, (character) => character.charCodeAt(0)) +} + +function fileFromDataUri( + field: string, + uri: unknown, + maxBytes: number, + givenName: unknown, +) { + const match = typeof uri === "string" ? DATA_URI.exec(uri) : null + if (!match) throw notADataUriError(field) + const parameters = match[1]!.split(";") + const isBase64 = parameters.at(-1)!.toLowerCase() === "base64" + if (isBase64) parameters.pop() + const mediaType = parameters.shift()!.trim() + const nameParameter = parameters.find((parameter) => + parameter.trim().toLowerCase().startsWith("name="), + ) + let name = field + if (typeof givenName === "string" && givenName.trim()) { + name = givenName.trim() + } else if (nameParameter) { + try { + name = decodeURIComponent(nameParameter.trim().slice("name=".length)) + } catch { + throw notADataUriError(field) + } + } + const bytes = isBase64 + ? base64Decoded(field, match[2]!, maxBytes) + : percentDecoded(field, match[2]!) + if (bytes.length > maxBytes) + throw fileTooBigError(field, bytes.length, maxBytes) + return new File([bytes], name, { + type: mediaType.includes("/") ? mediaType : "text/plain", + }) +} + +export const decodeDataUris = async ( + body: T, + fields: ReadonlyArray, + maxBytes: number, +): Promise> => { + if (typeof body !== "object" || body === null) { + return body as DataUrisDecoded + } + const decoded = { ...body } as Record + for (const field of fields) { + const givenName = decoded[`${field}_name`] + delete decoded[`${field}_name`] + if (decoded[field] !== undefined) { + decoded[field] = fileFromDataUri( + field, + decoded[field], + maxBytes, + givenName, + ) + } + } + return decoded as DataUrisDecoded +} diff --git a/packages/sdks/application-keys/src/client/mcp.gen.ts b/packages/sdks/application-keys/src/client/mcp.gen.ts new file mode 100644 index 000000000..5274a0479 --- /dev/null +++ b/packages/sdks/application-keys/src/client/mcp.gen.ts @@ -0,0 +1,286 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import * as z from "zod" + +import type { Client } from "./client" +import { loose, type Tool, toToolResult } from "./mcp-support.gen" +import { + createAnApplicationKey, + deleteAnApplicationKey, + getAnApplicationKey, + listApplicationKeys, + updateAnApplicationKey, +} from "./sdk.gen" +import { + zCreateAnApplicationKeyBody, + zDeleteAnApplicationKeyPath, + zGetAnApplicationKeyPath, + zListApplicationKeysQuery, + zUpdateAnApplicationKeyBody, + zUpdateAnApplicationKeyPath, +} from "./zod.gen" + +type ToolOptions = { + client?: Client +} + +const listApplicationKeysInput = z + .object({ + query: zListApplicationKeysQuery.strict().optional(), + }) + .strict() + +/** + * List Application Keys + * + * Retrieves a list of Application Keys + * + */ +export const listApplicationKeysTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + listApplicationKeys({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "application_keys_list_application_keys" as const, + config: { + title: "List Application Keys", + description: + "Lists the application keys in the store or organization, with each key's name, client ID, reserved rate limit and last used time. The response metadata gives the total rate limit reserved across all keys. It does not return client secrets. Supports offset and limit pagination.", + inputSchema: listApplicationKeysInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "application_keys.listApplicationKeys", + method: "GET", + path: "/v2/application-keys", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const createAnApplicationKeyInput = z + .object({ + body: loose(zCreateAnApplicationKeyBody).optional(), + }) + .strict() + +/** + * Create an Application Key + * + * Create an Application Key + */ +export const createAnApplicationKeyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + createAnApplicationKey({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "application_keys_create_an_application_key" as const, + config: { + title: "Create an Application Key", + description: + "Creates an application key, identified by name and not tied to a user, that can be used to generate client_credentials and implicit tokens. The response includes the key's client ID and its client secret, which is a credential, so keep it out of logs and code. The optional reserved rate limit is rejected if the total reserved across all keys would exceed the store or organization limit.", + inputSchema: createAnApplicationKeyInput, + annotations: { + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "application_keys.createAnApplicationKey", + method: "POST", + path: "/v2/application-keys", + risk: "create" as const, + }, + }, + }, + handler, + } +} + +const deleteAnApplicationKeyInput = z + .object({ + path: zDeleteAnApplicationKeyPath.strict(), + }) + .strict() + +/** + * Delete an Application Key + * + * Delete an Application Key + */ +export const deleteAnApplicationKeyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + deleteAnApplicationKey({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "application_keys_delete_an_application_key" as const, + config: { + title: "Delete an Application Key", + description: + "Permanently deletes an application key by its ID. Check the key's last used time first, so you do not delete a key that an application still uses.", + inputSchema: deleteAnApplicationKeyInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "application_keys.deleteAnApplicationKey", + method: "DELETE", + path: "/v2/application-keys/{application-key-id}", + risk: "delete" as const, + }, + }, + }, + handler, + } +} + +const getAnApplicationKeyInput = z + .object({ + path: zGetAnApplicationKeyPath.strict(), + }) + .strict() + +/** + * Get an Application Key + * + * Get an Application Key + */ +export const getAnApplicationKeyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getAnApplicationKey({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "application_keys_get_an_application_key" as const, + config: { + title: "Get an Application Key", + description: + "Gets one application key by its ID, with its name, client ID, reserved rate limit and last used time. It does not return the client secret.", + inputSchema: getAnApplicationKeyInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "application_keys.getAnApplicationKey", + method: "GET", + path: "/v2/application-keys/{application-key-id}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const updateAnApplicationKeyInput = z + .object({ + path: zUpdateAnApplicationKeyPath.strict(), + body: loose(zUpdateAnApplicationKeyBody).optional(), + }) + .strict() + +/** + * Update an Application Key + * + * Update an Application Key + */ +export const updateAnApplicationKeyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + updateAnApplicationKey({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "application_keys_update_an_application_key" as const, + config: { + title: "Update an Application Key", + description: + "Changes an application key's name or reserved rate limit. The request fails if the new reserved limit would take the total reserved across all keys above the store or organization limit. Changes to the reserved rate limit can take up to one hour to take effect. It does not return the client secret.", + inputSchema: updateAnApplicationKeyInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "application_keys.updateAnApplicationKey", + method: "PUT", + path: "/v2/application-keys/{application-key-id}", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +export const tools = (options?: ToolOptions): Array => [ + listApplicationKeysTool(options), + createAnApplicationKeyTool(options), + deleteAnApplicationKeyTool(options), + getAnApplicationKeyTool(options), + updateAnApplicationKeyTool(options), +] diff --git a/packages/sdks/application-keys/src/mcp.test-d.ts b/packages/sdks/application-keys/src/mcp.test-d.ts new file mode 100644 index 000000000..0cb19e8a5 --- /dev/null +++ b/packages/sdks/application-keys/src/mcp.test-d.ts @@ -0,0 +1,84 @@ +import { describe, expectTypeOf, it } from "vitest" +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { z } from "zod" +import type { ListApplicationKeysData } from "./client/types.gen" +import { listApplicationKeysTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +declare const server: McpServer + +describe("registering the generated tools", () => { + it("registers one tool with its name, config and handler", () => { + const tool = listApplicationKeysTool() + + server.registerTool(tool.name, tool.config, tool.handler) + }) + + it("registers every tool from tools()", () => { + tools().forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("registers only the read-only tools", () => { + tools() + .filter( + (t) => t.config._meta["com.elasticpath/operation"].risk === "read", + ) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("rejects a tool without _meta or with an unknown risk", () => { + const register = (t: Tool) => + server.registerTool(t.name, t.config, t.handler) + const tool = listApplicationKeysTool() + const { _meta, ...configWithoutMeta } = tool.config + const withoutMeta = { ...tool, config: configWithoutMeta } + const unknownRisk = { + ...tool, + config: { + ...tool.config, + _meta: { + "com.elasticpath/operation": { + ..._meta["com.elasticpath/operation"], + risk: "erase" as const, + }, + }, + }, + } + + register(tool) + // @ts-expect-error + register(withoutMeta) + // @ts-expect-error + register(unknownRisk) + }) + + it("keeps typed arguments in a wrapped handler", () => { + const tool = listApplicationKeysTool() + + server.registerTool(tool.name, tool.config, (args, extra) => { + expectTypeOf(args.query).toEqualTypeOf() + // @ts-expect-error + tool.handler({ colour: "red" }, extra) + return tool.handler(args, extra) + }) + }) + + it("registers every tool with an extended input that sets a header", () => { + tools().forEach((t) => + server.registerTool( + t.name, + { + ...t.config, + inputSchema: t.config.inputSchema.extend({ + store_id: z.string().describe("The Elastic Path store to act on."), + }), + }, + ({ store_id, ...args }, extra) => + t.handler( + { ...args, headers: { ...args.headers, "EP-Store-Id": store_id } }, + extra, + ), + ), + ) + }) +}) diff --git a/packages/sdks/application-keys/src/mcp.test.ts b/packages/sdks/application-keys/src/mcp.test.ts new file mode 100644 index 000000000..406266156 --- /dev/null +++ b/packages/sdks/application-keys/src/mcp.test.ts @@ -0,0 +1,352 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { ToolSchema } from "@modelcontextprotocol/sdk/types.js" +import type { Tool as ListedTool } from "@modelcontextprotocol/sdk/types.js" +import fs from "node:fs" +import * as main from "./index" +import { client as defaultClient } from "./client/client.gen" +import * as mcp from "./mcp" +import { + createAnApplicationKeyTool, + listApplicationKeysTool, + tools, +} from "./mcp" +import type { Tool } from "./mcp" + +const baseUrl = "https://useast.api.elasticpath.com" +const OPERATION = "com.elasticpath/operation" + +function stubFetch(body: unknown, status = 200) { + const requests: Request[] = [] + const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push( + input instanceof Request && init === undefined + ? input + : new Request(input, init), + ) + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json" }, + }) + }) as typeof globalThis.fetch + return { requests, fetch } +} + +const clientWith = ( + fetch: typeof globalThis.fetch, + config?: { headers: Record }, +) => + main.createApplicationKeysClient({ + baseUrl, + token: "pre-issued", + fetch, + retry: false, + config, + }) + +const extraWith = (signal = new AbortController().signal) => + ({ signal }) as Parameters[1] + +async function connect(registered: Tool[]) { + const server = new McpServer({ name: "application-keys", version: "1.0.0" }) + registered.forEach((t) => server.registerTool(t.name, t.config, t.handler)) + const mcpClient = new Client({ name: "test-client", version: "1.0.0" }) + const [clientSide, serverSide] = InMemoryTransport.createLinkedPair() + await Promise.all([server.connect(serverSide), mcpClient.connect(clientSide)]) + return mcpClient +} + +const functionNamesInOperationOrder = () => + [ + ...fs + .readFileSync(new URL("./client/sdk.gen.ts", import.meta.url), "utf8") + .matchAll(/^export const (\w+) =/gm), + ].map((match) => match[1]!) + +const operationOf = (tool: Tool) => tool.config._meta[OPERATION] + +const overrides = new URL( + "../../specs/overrides/mcp/application-keys/", + import.meta.url, +) + +const writtenDescriptions = () => + fs.readdirSync(overrides).map((file) => + fs + .readFileSync(new URL(file, overrides), "utf8") + .split("x-mcp-description: >-")[1]! + .split(/\n(?=\S)/)[0]! + .trim() + .split(/\s*\n\s*/) + .join(" "), + ) + +describe("tools", () => { + it("holds 5 tools with valid, unique names, in operation order", () => { + const names = tools().map((tool) => tool.name) + + expect(names).toHaveLength(5) + for (const name of names) expect(name).toMatch(/^[a-zA-Z0-9_-]{1,64}$/) + expect(new Set(names).size).toBe(5) + expect(tools().map((tool) => operationOf(tool).id)).toEqual( + functionNamesInOperationOrder().map((name) => `application_keys.${name}`), + ) + }) + + it("exports one tool factory for each operation", () => { + const factories = Object.keys(mcp).filter((name) => name.endsWith("Tool")) + + expect(factories).toHaveLength(5) + }) + + describe("sends each tool's request to its own operation's method and path", () => { + const { requests, fetch } = stubFetch({}) + const client = clientWith(fetch) + + it.each(tools({ client }).map((tool) => [tool.name, tool] as const))( + "%s", + async (_name, tool) => { + requests.length = 0 + const { method, path } = operationOf(tool) + const params = [...path.matchAll(/\{([^}]+)\}/g)].map( + (match) => match[1]!, + ) + const args: Record = {} + if (params.length > 0) { + args.path = Object.fromEntries(params.map((p) => [p, `p-${p}`])) + } + if ("body" in tool.config.inputSchema.shape) args.body = {} + + await tool.handler(args, extraWith()) + + expect(requests).toHaveLength(1) + expect(requests[0]!.method).toBe(method) + expect(new URL(requests[0]!.url).pathname).toBe( + path.replace(/\{([^}]+)\}/g, (_match, p) => `p-${p}`), + ) + }, + ) + }) +}) + +describe("the client a tool calls through", () => { + const response = { data: [] } + let original: ReturnType + let viaDefault: ReturnType + + beforeEach(() => { + original = defaultClient.getConfig() + viaDefault = stubFetch(response) + defaultClient.setConfig({ fetch: viaDefault.fetch }) + }) + + afterEach(() => { + defaultClient.setConfig({ + ...original, + auth: original.auth, + fetch: original.fetch, + }) + }) + + it("calls through the package's default client when no client is given", async () => { + const result = await listApplicationKeysTool().handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(1) + expect(viaDefault.requests[0]!.url).toBe( + `${original.baseUrl}/v2/application-keys`, + ) + expect(result.structuredContent).toEqual(response) + }) + + it("sends the credentials of a default client configured from a application keys client", async () => { + defaultClient.setConfig(clientWith(viaDefault.fetch).getConfig()) + + await listApplicationKeysTool().handler({}, extraWith()) + + expect(viaDefault.requests[0]!.headers.get("Authorization")).toBe( + "Bearer pre-issued", + ) + }) + + it("uses a given client instead of the default", async () => { + const viaGiven = stubFetch(response) + + await listApplicationKeysTool({ + client: clientWith(viaGiven.fetch), + }).handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(0) + expect(viaGiven.requests).toHaveLength(1) + const url = new URL(viaGiven.requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/application-keys`) + }) + + it("sends headers configured on the client with every tool call", async () => { + const { requests, fetch } = stubFetch(response) + const client = clientWith(fetch, { + headers: { "EP-Store-Id": "store-1", "EP-Org-Id": "org-1" }, + }) + + await listApplicationKeysTool({ client }).handler({}, extraWith()) + + expect(requests[0]!.headers.get("EP-Store-Id")).toBe("store-1") + expect(requests[0]!.headers.get("EP-Org-Id")).toBe("org-1") + }) +}) + +describe("a tool's handler", () => { + it("aborts the request when the MCP request is cancelled", async () => { + const { requests, fetch } = stubFetch({}) + const controller = new AbortController() + + await listApplicationKeysTool({ client: clientWith(fetch) }).handler( + {}, + extraWith(controller.signal), + ) + expect(requests[0]!.signal.aborted).toBe(false) + controller.abort() + + expect(requests[0]!.signal.aborted).toBe(true) + }) + + it("returns an API error as an isError result with the HTTP status", async () => { + const errors = { errors: [{ status: 404, title: "Not Found" }] } + const { fetch } = stubFetch(errors, 404) + + const result = await listApplicationKeysTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result).toEqual({ + isError: true, + content: [{ type: "text", text: `HTTP 404: ${JSON.stringify(errors)}` }], + }) + }) + + it("returns a network failure as an isError result with its message", async () => { + const fetch = (async () => { + throw new TypeError("fetch failed") + }) as typeof globalThis.fetch + + const result = await listApplicationKeysTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result.isError).toBe(true) + expect(result.content).toEqual([ + { type: "text", text: expect.stringContaining("fetch failed") }, + ]) + }) +}) + +describe("a tool's description", () => { + it("is the description written for it in the spec overrides, for every tool", () => { + expect( + tools() + .map((tool) => tool.config.description) + .sort(), + ).toEqual(writtenDescriptions().sort()) + }) +}) + +describe("the application keys tools on an MCP server", () => { + let listed: ListedTool[] + + beforeAll(async () => { + const mcpClient = await connect( + tools({ client: clientWith(stubFetch({}).fetch) }), + ) + listed = (await mcpClient.listTools()).tools + }) + + it("describes every tool in at most 600 characters", () => { + for (const tool of listed) { + expect(tool.description!.length, tool.name).toBeLessThanOrEqual(600) + } + }) + + it("lists all 5, each passing the MCP SDK's ToolSchema", () => { + expect(listed).toHaveLength(5) + for (const tool of listed) { + expect(ToolSchema.safeParse(tool).success, tool.name).toBe(true) + } + }) + + it("asks no tool for an Authorization header", () => { + for (const tool of listed) { + const headers = (tool.inputSchema.properties as Record) + ?.headers + const names = Object.keys(headers?.properties ?? {}) + + expect(names.map((name) => name.toLowerCase())).not.toContain( + "authorization", + ) + } + }) + + it("rejects an unknown query key without sending the request", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + listApplicationKeysTool({ client: clientWith(fetch) }), + ]) + + const result = await mcpClient.callTool({ + name: "application_keys_list_application_keys", + arguments: { query: { colour: "red" } }, + }) + + expect(result.isError).toBe(true) + expect(requests).toHaveLength(0) + }) + + it("keeps a body attribute the spec does not list when the tool is called through an MCP server", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + createAnApplicationKeyTool({ client: clientWith(fetch) }), + ]) + const args = { + body: { + data: { + type: "application_key", + name: "sample", + unlisted_attribute: { nested: true }, + }, + unlisted_attribute: { nested: true }, + }, + } + + const result = await mcpClient.callTool({ + name: "application_keys_create_an_application_key", + arguments: args, + }) + + expect(result.isError).toBeFalsy() + expect(await requests[0]!.json()).toMatchObject(args.body) + }) + + it("sends a call through the given client and returns the data", async () => { + const response = { data: [] } + const { requests, fetch } = stubFetch(response) + const mcpClient = await connect(tools({ client: clientWith(fetch) })) + + const result = await mcpClient.callTool({ + name: "application_keys_list_application_keys", + arguments: {}, + }) + + expect(requests).toHaveLength(1) + const url = new URL(requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/application-keys`) + expect(requests[0]!.headers.get("Authorization")).toBe("Bearer pre-issued") + expect(result.structuredContent).toEqual(response) + }) +}) + +describe("the main entry", () => { + it("exports no MCP code", () => { + expect(main).not.toHaveProperty("tools") + expect(main).not.toHaveProperty("listApplicationKeysTool") + }) +}) diff --git a/packages/sdks/application-keys/src/mcp.ts b/packages/sdks/application-keys/src/mcp.ts new file mode 100644 index 000000000..fda10e5a5 --- /dev/null +++ b/packages/sdks/application-keys/src/mcp.ts @@ -0,0 +1,2 @@ +export * from "./client/mcp.gen" +export type { OperationMeta, Tool, ToolConfig } from "./client/mcp-support.gen" diff --git a/packages/sdks/application-keys/test-cjs-minimal.cjs b/packages/sdks/application-keys/test-cjs-minimal.cjs index 2e9a50b97..a890dbb5c 100644 --- a/packages/sdks/application-keys/test-cjs-minimal.cjs +++ b/packages/sdks/application-keys/test-cjs-minimal.cjs @@ -1,5 +1,7 @@ // This file is used to test that CommonJS requires work correctly const ApplicationKeys = require("./dist/index.cjs") +const mcp = require("./dist/mcp.cjs") console.log("ApplicationKeys:", Object.keys(ApplicationKeys)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/application-keys/test-esm-minimal.mjs b/packages/sdks/application-keys/test-esm-minimal.mjs index f54eccee7..a83c06f53 100644 --- a/packages/sdks/application-keys/test-esm-minimal.mjs +++ b/packages/sdks/application-keys/test-esm-minimal.mjs @@ -1,5 +1,7 @@ // This file is used to test that ESM imports work correctly import * as ApplicationKeys from "./dist/index.mjs" +import * as mcp from "./dist/mcp.mjs" console.log("ApplicationKeys:", Object.keys(ApplicationKeys)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/application-keys/test/built-output.test.ts b/packages/sdks/application-keys/test/built-output.test.ts new file mode 100644 index 000000000..70bbe4f0f --- /dev/null +++ b/packages/sdks/application-keys/test/built-output.test.ts @@ -0,0 +1,99 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { build } from "tsup" +import type { Options } from "tsup" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import tsupConfig from "../tsup.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const outDir = path.join(here, ".generated-dist") + +const SPECIFIER = + /(?:\bfrom\s*|\bimport\s*\(\s*|\brequire\s*\(\s*|^\s*import\s+)["']([^"']+)["']/gm + +function specifiersIn(file: string) { + const source = fs.readFileSync(file, "utf8") + return [...source.matchAll(SPECIFIER)].map((match) => match[1]!) +} + +function importGraph(entry: string) { + const files = new Set() + const packages = new Set() + const pending = [path.join(outDir, entry)] + while (pending.length > 0) { + const file = pending.pop()! + if (files.has(file)) continue + files.add(file) + for (const specifier of specifiersIn(file)) { + if (specifier.startsWith(".")) { + pending.push(path.resolve(path.dirname(file), specifier)) + } else { + packages.add(specifier) + } + } + } + return { + files: [...files].map((file) => path.relative(outDir, file)), + packages: [...packages], + } +} + +function builtFiles(directory = outDir): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(directory, entry.name) + if (entry.isDirectory()) return builtFiles(full) + return /\.(mjs|cjs)$/.test(entry.name) ? [full] : [] + }) +} + +beforeAll(async () => { + await build({ + ...(tsupConfig as Options), + config: false, + dts: false, + outDir, + silent: true, + sourcemap: false, + }) +}, 120_000) + +afterAll(() => { + fs.rmSync(outDir, { force: true, recursive: true }) +}) + +describe("the built package", () => { + it.each(["index.mjs", "index.cjs"])( + "reaches no MCP code from the main entry, %s", + (entry) => { + const graph = importGraph(entry) + + expect(graph.files).toContain( + path.join("client", `sdk.gen.${entry.split(".")[1]}`), + ) + expect(graph.files.filter((file) => file.includes("mcp"))).toEqual([]) + expect(graph.packages.filter((name) => name.includes("mcp"))).toEqual([]) + }, + ) + + it.each(["mcp.mjs", "mcp.cjs"])( + "reaches the generated tools from %s", + (entry) => { + const graph = importGraph(entry) + const extension = entry.split(".")[1] + + expect(graph.files).toContain(path.join("client", `mcp.gen.${extension}`)) + }, + ) + + it("imports the MCP SDK nowhere, because it is a type-only peer", () => { + for (const file of builtFiles()) { + expect( + specifiersIn(file).filter((name) => + name.includes("modelcontextprotocol"), + ), + file, + ).toEqual([]) + } + }) +}) diff --git a/packages/sdks/application-keys/test/mcp-generation.test.ts b/packages/sdks/application-keys/test/mcp-generation.test.ts new file mode 100644 index 000000000..f1b818728 --- /dev/null +++ b/packages/sdks/application-keys/test/mcp-generation.test.ts @@ -0,0 +1,74 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { createClient } from "@hey-api/openapi-ts" +import { execFileSync } from "node:child_process" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import config from "../openapi-ts.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const packageRoot = path.join(here, "..") +const committed = path.join(packageRoot, "src/client") +const firstRun = path.join(here, ".generated-mcp-first") +const secondRun = path.join(here, ".generated-mcp-second") +const workspaceBin = path.join(packageRoot, "../../../node_modules/.bin") +const mainEntryFiles = ["index.ts", "sdk.gen.ts", "types.gen.ts", "zod.gen.ts"] +const mcpFiles = ["mcp.gen.ts", "mcp-support.gen.ts"] + +const read = (directory: string, file: string) => + fs.readFileSync(path.join(directory, file), "utf8") + +async function generateInto(directory: string) { + const userConfig = await config + await createClient({ + ...userConfig, + input: path.join(packageRoot, "../specs/bundled/application-keys_standalone.yaml"), + output: { ...(userConfig.output as object), path: directory }, + }) +} + +beforeAll(async () => { + process.env.PATH = [workspaceBin, process.env.PATH].join(path.delimiter) + execFileSync( + path.join(packageRoot, "node_modules/.bin/redocly"), + [ + "bundle", + "application-keys-standalone@v1", + "--config", + "../specs/config/redocly.yaml", + ], + { cwd: packageRoot, stdio: "pipe" }, + ) + await generateInto(firstRun) + await generateInto(secondRun) +}, 120_000) + +afterAll(() => { + for (const directory of [firstRun, secondRun]) { + fs.rmSync(directory, { force: true, recursive: true }) + } +}) + +describe("generating the ./mcp export", () => { + it("writes the same MCP files byte for byte each time", () => { + for (const file of mcpFiles) { + expect(read(secondRun, file), file).toBe(read(firstRun, file)) + } + }) + + it("matches the committed MCP files", () => { + for (const file of mcpFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("leaves the main entry's generated files as committed", () => { + for (const file of mainEntryFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("keeps the MCP files out of the generated entry", () => { + expect(read(firstRun, "index.ts")).not.toContain("mcp") + }) +}) diff --git a/packages/sdks/application-keys/tsconfig.test.json b/packages/sdks/application-keys/tsconfig.test.json new file mode 100644 index 000000000..fc8520e73 --- /dev/null +++ b/packages/sdks/application-keys/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/sdks/application-keys/tsup.config.ts b/packages/sdks/application-keys/tsup.config.ts index 91c898b67..44169c968 100644 --- a/packages/sdks/application-keys/tsup.config.ts +++ b/packages/sdks/application-keys/tsup.config.ts @@ -6,7 +6,7 @@ import { } from "esbuild-fix-imports-plugin" export default defineConfig({ - entry: ["src/**/*.ts", "!src/**/*.test.ts"], + entry: ["src/**/*.ts", "!src/**/*.test.ts", "!src/**/*.test-d.ts"], format: ["esm", "cjs"], dts: true, splitting: false, diff --git a/packages/sdks/application-keys/vitest.config.ts b/packages/sdks/application-keys/vitest.config.ts index b7b707f74..4b27a5bb8 100644 --- a/packages/sdks/application-keys/vitest.config.ts +++ b/packages/sdks/application-keys/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from "vitest/config" export default defineConfig({ test: { include: ["**/*.{test,spec}.{js,ts}"], + typecheck: { + enabled: true, + include: ["src/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, }, }) diff --git a/packages/sdks/currencies/README.md b/packages/sdks/currencies/README.md index a9c1670c7..f4c583457 100644 --- a/packages/sdks/currencies/README.md +++ b/packages/sdks/currencies/README.md @@ -2,7 +2,6 @@ Below you'll find instructions on how to install, set up, and use the client, along with a list of available operations. - ## Features - type-safe response data and errors @@ -13,7 +12,6 @@ Below you'll find instructions on how to install, set up, and use the client, al --- - ## Installation ```bash @@ -28,7 +26,6 @@ yarn add @epcc-sdk/sdks-currencies ## Client Usage - Clients are responsible for sending the actual HTTP requests. The Fetch client is built as a thin wrapper on top of Fetch API, extending its functionality. If you're already familiar with Fetch, configuring your client will feel like working directly with Fetch API. @@ -40,23 +37,22 @@ You can configure the client in two ways: **When using the operation function to make requests, by default the global client will be used unless another is provided.** - ### 1. Configure the internal `client` instance directly This is the simpler approach. You can call the setConfig() method at the beginning of your application or anytime you need to update the client configuration. You can pass any Fetch API configuration option to setConfig(), and even your own Fetch implementation. ```ts -import { client } from "@epcc-sdk/sdks-currencies"; +import { client } from "@epcc-sdk/sdks-currencies" client.setConfig({ -// set default base url for requests -baseUrl: 'https://euwest.api.elasticpath.com', + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", -// set default headers for requests -headers: { -Authorization: 'Bearer YOUR_AUTH_TOKEN', -}, -}); + // set default headers for requests + headers: { + Authorization: "Bearer YOUR_AUTH_TOKEN", + }, +}) ``` The disadvantage of this approach is that your code may call the client instance before it's configured for the first time. Depending on your use case, you might need to use the second approach. @@ -66,27 +62,27 @@ The disadvantage of this approach is that your code may call the client instance This is useful when you want to use a different instance of the client for different parts of your application or when you want to use different configurations for different parts of your application. ```ts -import { createClient } from "@epcc-sdk/sdks-currencies"; +import { createClient } from "@epcc-sdk/sdks-currencies" // Create the client with your API base URL. const client = createClient({ - // set default base url for requests - baseUrl: "https://euwest.api.elasticpath.com", - /** - * Set default headers only for requests made by this client. - */ - headers: { - "Custom-Header": 'My Value', - }, -}); + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", + /** + * Set default headers only for requests made by this client. + */ + headers: { + "Custom-Header": "My Value", + }, +}) ``` You can also pass this instance to any SDK function through the client option. This will override the default instance from `import { client } from "@epcc-sdk/sdks-currencies>". ```ts const response = await getACurrency({ - client: myClient, -}); + client: myClient, +}) ``` ### Direct configuration @@ -95,8 +91,8 @@ Alternatively, you can pass the client configuration options to each SDK functio ```ts const response = await getACurrency({ - baseUrl: 'https://example.com', // <-- override default configuration -}); + baseUrl: "https://example.com", // <-- override default configuration +}) ``` ## Interceptors (Middleware) @@ -104,35 +100,34 @@ const response = await getACurrency({ Interceptors (middleware) can be used to modify requests before they're sent or responses before they're returned to your application. They can be added with use and removed with eject. Below is an example request interceptor ```ts -import { client } from "@epcc-sdk/sdks-currencies"; +import { client } from "@epcc-sdk/sdks-currencies" // Supports async functions client.interceptors.request.use(async (request) => { - // do something - return request; -}); + // do something + return request +}) client.interceptors.request.eject((request) => { - // do something - return request; -}); - + // do something + return request +}) ``` and an example response interceptor ```ts -import { client } from "@epcc-sdk/sdks-currencies"; +import { client } from "@epcc-sdk/sdks-currencies" client.interceptors.response.use((response) => { - // do something - return response; -}); + // do something + return response +}) client.interceptors.response.eject((response) => { - // do something - return response; -}); + // do something + return response +}) ``` > **_Tip:_** To eject, you must provide a reference to the function that was passed to use(). @@ -146,15 +141,15 @@ source, sets the `auth` hook, refreshes and replays once on a 401, and backs off import { createCurrenciesClient, getAllCurrencies, -} from "@epcc-sdk/sdks-currencies"; +} from "@epcc-sdk/sdks-currencies" const client = createCurrenciesClient({ baseUrl: "https://euwest.api.elasticpath.com", clientId: process.env.EPCC_CLIENT_ID!, clientSecret: process.env.EPCC_CLIENT_SECRET!, -}); +}) -const { data } = await getAllCurrencies({ client }); +const { data } = await getAllCurrencies({ client }) ``` Credentials come from `source`, `provider`, `token`, `clientId` plus `clientSecret`, or @@ -176,11 +171,83 @@ Zod schemas for every request body, path and response are published under the `/ subpath. `zod` is an optional peer dependency (4.x), so the root entry never imports it. ```ts -import { zResponseCurrency } from "@epcc-sdk/sdks-currencies/zod"; +import { zResponseCurrency } from "@epcc-sdk/sdks-currencies/zod" -const currency = zResponseCurrency.parse(data?.data?.[0]); +const currency = zResponseCurrency.parse(data?.data?.[0]) ``` +## MCP endpoint tools + +The `/mcp` subpath turns each of the 5 currencies operations into a Model Context Protocol (MCP) tool. +The main entry imports none of it. `zod` 4 and `@modelcontextprotocol/sdk` are needed only for this +subpath. + +Each operation has one tool factory, named after its function with `Tool` added, such as +`getAllCurrenciesTool`. A factory returns `{ name, config, handler }`, the three arguments that +`McpServer.registerTool` takes. `tools()` returns all 5 in operation order. A handler returns an API +error as an `isError` result and does not throw. + +Register one tool: + +```ts +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { getAllCurrenciesTool } from "@epcc-sdk/sdks-currencies/mcp" + +const server = new McpServer({ name: "currencies", version: "1.0.0" }) +const tool = getAllCurrenciesTool() +server.registerTool(tool.name, tool.config, tool.handler) +``` + +A tool built without a client calls through the package's module level `client`, like an operation +does. That client has no credentials until you configure it. Configure it once: + +```ts +import { client, createCurrenciesClient } from "@epcc-sdk/sdks-currencies" + +client.setConfig( + createCurrenciesClient({ baseUrl, clientId, clientSecret }).getConfig(), +) +``` + +Register every tool, with a client that sends the same headers on every call: + +```ts +import * as currencies from "@epcc-sdk/sdks-currencies/mcp" + +const client = createCurrenciesClient({ + baseUrl, + clientId, + clientSecret, + config: { headers: { "EP-Store-Id": storeId, "EP-Org-Id": orgId } }, +}) +currencies + .tools({ client }) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Register the read-only tools only: + +```ts +currencies + .tools({ client }) + .filter((t) => t.config._meta["com.elasticpath/operation"].risk === "read") + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Each tool is named `currencies_`, and its arguments are grouped under `path`, +`query`, `headers` and `body`. The `path`, `query` and `headers` groups reject keys the spec does not +list. The `body` keeps them, so an attribute the spec does not list still reaches the API. The client +supplies the `Authorization` header, so no tool asks for it. Cancelling the MCP request cancels the +HTTP request. + +Each tool's description is written for a model choosing between tools: what the tool does, when to +use it rather than a similar tool, and any caveat that changes when to call it, in at most 600 +characters. The full spec description stays in the doc comment of the operation's function and its +tool factory. + +`config._meta["com.elasticpath/operation"]` holds the operation's `id`, `method`, `path` and `risk`. +The risk is `read`, `create`, `update` or `delete`, and the annotations follow from it. + ## Build URL If you need to access the compiled URL, you can use the buildUrl() method. It's loosely typed by default to accept almost any value; in practice, you will want to pass a type hint. @@ -188,34 +255,30 @@ If you need to access the compiled URL, you can use the buildUrl() method. It's ```ts type FooData = { path: { - fooId: number; - }; + fooId: number + } query?: { - bar?: string; - }; - url: '/foo/{fooId}'; -}; + bar?: string + } + url: "/foo/{fooId}" +} const url = client.buildUrl({ path: { fooId: 1, }, query: { - bar: 'baz', + bar: "baz", }, - url: '/foo/{fooId}', -}); -console.log(url); // prints '/foo/1?bar=baz' + url: "/foo/{fooId}", +}) +console.log(url) // prints '/foo/1?bar=baz' ``` - --- - - - - ## Operation Usage + The following examples demonstrate how to use the operation function to make requests. ```ts @@ -234,12 +297,8 @@ const product = await getACurrency({ --- - - ## Available Operations - - - **`getAllCurrencies`** (`GET /v2/currencies`) - **`createACurrency`** (`POST /v2/currencies`) @@ -250,7 +309,4 @@ const product = await getACurrency({ - **`updateACurrency`** (`PUT /v2/currencies/{currencyID}`) - - - ---- \ No newline at end of file +--- diff --git a/packages/sdks/currencies/openapi-ts.config.ts b/packages/sdks/currencies/openapi-ts.config.ts index a1cd72560..41f4f0f7a 100644 --- a/packages/sdks/currencies/openapi-ts.config.ts +++ b/packages/sdks/currencies/openapi-ts.config.ts @@ -1,8 +1,9 @@ -import { defineConfig } from "@hey-api/openapi-ts" +import { $, defineConfig } from "@hey-api/openapi-ts" import { int64AsNumber } from "../specs/heyapi/int64-as-number" +import { mcpTools } from "../specs/heyapi/mcp-tools" export default defineConfig({ - input: "../specs/currencies.yaml", + input: "../specs/bundled/currencies_standalone.yaml", output: { path: "src/client", postProcess: ["prettier"] }, plugins: [ { @@ -16,5 +17,6 @@ export default defineConfig({ metadata: true, name: "zod", }, + mcpTools($, { api: "currencies" }), ], }) diff --git a/packages/sdks/currencies/package.json b/packages/sdks/currencies/package.json index f6f4b2419..b11c45114 100644 --- a/packages/sdks/currencies/package.json +++ b/packages/sdks/currencies/package.json @@ -7,9 +7,12 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "pnpm openapi-ts && pnpm build:tsup", + "build": "pnpm oas:build && pnpm openapi-ts && pnpm build:tsup", "build:tsup": "tsup", - "openapi-ts": "openapi-ts" + "oas:build": "redocly bundle currencies-standalone@v1 --config ../specs/config/redocly.yaml", + "openapi-ts": "openapi-ts", + "test": "vitest run", + "test:watch": "vitest" }, "exports": { ".": { @@ -32,12 +35,25 @@ "default": "./dist/zod.cjs" } }, + "./mcp": { + "import": { + "types": "./dist/mcp.d.ts", + "default": "./dist/mcp.mjs" + }, + "require": { + "types": "./dist/mcp.d.cts", + "default": "./dist/mcp.cjs" + } + }, "./package.json": "./package.json" }, "typesVersions": { "*": { "zod": [ "./dist/zod.d.ts" + ], + "mcp": [ + "./dist/mcp.d.ts" ] } }, @@ -53,18 +69,26 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.99.0", + "@modelcontextprotocol/sdk": "1.31.0", + "@redocly/cli": "^1.21.0", + "@redocly/openapi-core": "^1.21.0", "@types/ejs": "^3.1.5", "ejs": "^3.1.10", "esbuild-fix-imports-plugin": "^1.0.19", "esbuild-plugin-file-path-extensions": "^1.0.0", "tsup": "^8.4.0", "typescript": "^5.5.3", + "vitest": "^3.0.7", "zod": "4.6.5" }, "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.31.0", "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, "zod": { "optional": true } diff --git a/packages/sdks/currencies/pnpm-lock.yaml b/packages/sdks/currencies/pnpm-lock.yaml index 44ba3f63f..ae8283581 100644 --- a/packages/sdks/currencies/pnpm-lock.yaml +++ b/packages/sdks/currencies/pnpm-lock.yaml @@ -15,6 +15,15 @@ importers: '@hey-api/openapi-ts': specifier: 0.99.0 version: 0.99.0(typescript@5.8.2) + '@modelcontextprotocol/sdk': + specifier: 1.31.0 + version: 1.31.0(zod@4.6.5) + '@redocly/cli': + specifier: ^1.21.0 + version: 1.34.21(ajv@8.20.0) + '@redocly/openapi-core': + specifier: ^1.21.0 + version: 1.34.21 '@types/ejs': specifier: ^3.1.5 version: 3.1.5 @@ -29,166 +38,350 @@ importers: version: 1.0.0 tsup: specifier: ^8.4.0 - version: 8.4.0(jiti@2.7.0)(typescript@5.8.2) + version: 8.4.0(jiti@2.7.0)(postcss@8.5.30)(typescript@5.8.2) typescript: specifier: ^5.5.3 version: 5.8.2 + vitest: + specifier: ^3.0.7 + version: 3.2.7(jiti@2.7.0) zod: specifier: 4.6.5 version: 4.6.5 packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.2': resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.2': resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.2': resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.2': resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.2': resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.2': resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.2': resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.2': resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.2': resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.2': resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.2': resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.2': resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.2': resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.2': resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.2': resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.2': resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.2': resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.2': resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.2': resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.2': resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.2': resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.2': resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.2': resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.2': resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@hey-api/codegen-core@0.9.1': resolution: {integrity: sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==} engines: {node: '>=22.18.0'} @@ -214,10 +407,24 @@ packages: '@hey-api/types@0.1.4': resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -233,70 +440,265 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsep-plugin/assignment@1.4.0': + resolution: {integrity: sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.1.0': + resolution: {integrity: sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/cli@1.34.21': + resolution: {integrity: sha512-cWZMh6z6AqJ5Q2nQz2K5XhOnwVWcidtnk4NMjMvdHHpGtjnsPSWKg4fdyWhY46ze5SXu6GxFLTLbMoXGz2JJHA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.21': + resolution: {integrity: sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.21': + resolution: {integrity: sha512-4qTfsJJg51mHqOqcgkw9QLy4wHckt+tqWcBeqhl9/w+4tiOmku06Sx4DqW2a3732jHXIPd0/T1xsehNt4lOhXw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.40.0': resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.64.7': + resolution: {integrity: sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.40.0': resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.64.7': + resolution: {integrity: sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.40.0': resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.64.7': + resolution: {integrity: sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.40.0': resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.64.7': + resolution: {integrity: sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.40.0': resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.64.7': + resolution: {integrity: sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.40.0': resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.64.7': + resolution: {integrity: sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.64.7': + resolution: {integrity: sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.40.0': resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.64.7': + resolution: {integrity: sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.40.0': resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.64.7': + resolution: {integrity: sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.40.0': resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.64.7': + resolution: {integrity: sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.64.7': + resolution: {integrity: sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.64.7': + resolution: {integrity: sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} cpu: [loong64] @@ -307,71 +709,207 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.64.7': + resolution: {integrity: sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.64.7': + resolution: {integrity: sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.40.0': resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.64.7': + resolution: {integrity: sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.40.0': resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.64.7': + resolution: {integrity: sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.40.0': resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.64.7': + resolution: {integrity: sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.40.0': resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.64.7': + resolution: {integrity: sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.40.0': resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.64.7': + resolution: {integrity: sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.64.7': + resolution: {integrity: sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.64.7': + resolution: {integrity: sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.40.0': resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.64.7': + resolution: {integrity: sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.40.0': resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.64.7': + resolution: {integrity: sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.64.7': + resolution: {integrity: sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.40.0': resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.64.7': + resolution: {integrity: sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + '@vitest/expect@3.2.7': + resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + '@vitest/mocker@3.2.7': + resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + '@vitest/pretty-format@3.2.7': + resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} + + '@vitest/runner@3.2.7': + resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} + + '@vitest/snapshot@3.2.7': + resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} + + '@vitest/spy@3.2.7': + resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + + '@vitest/utils@3.2.7': + resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -379,21 +917,44 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.1: resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} @@ -404,6 +965,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.3.4: resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: @@ -416,10 +981,29 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -428,6 +1012,16 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -439,6 +1033,16 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -450,6 +1054,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -460,10 +1068,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -473,6 +1111,22 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + default-browser-id@5.0.1: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} @@ -488,16 +1142,42 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -509,6 +1189,32 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} @@ -521,9 +1227,73 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -532,18 +1302,67 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -555,10 +1374,69 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -577,6 +1455,12 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -592,18 +1476,73 @@ packages: engines: {node: '>=10'} hasBin: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.2.0: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsep@1.6.0: + resolution: {integrity: sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==} + engines: {node: '>= 20.16.0'} + + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -618,9 +1557,58 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -628,34 +1616,153 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.12: resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openapi-sampler@1.7.0: + resolution: {integrity: sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==} + + openapi-sampler@1.7.6: + resolution: {integrity: sha512-MvWOm3vdgX7CZ6CNfu2wOFMGhC/pq03BxYTL/DKCkyPWfR6XIwUJnOV32mQGgCcUm1tY/y1jj7F2yqx1DieIWw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -664,12 +1771,22 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -677,13 +1794,29 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.3.3: resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -702,25 +1835,107 @@ packages: yaml: optional: true + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} + engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@3.1.0: resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} + peerDependencies: + react: ^19.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} readdirp@5.1.1: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} + redoc@2.5.3: + resolution: {integrity: sha512-bBbat+Sx6xKWdyoCGTtA0BWeTEW9Vs4VnEja7q7ZLOk4IM7cHQLrf+kDxWF6dKeKxT8kOBnoy/OsNXCeLttpyQ==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -733,15 +1948,52 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.64.7: + resolution: {integrity: sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -750,14 +2002,79 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -766,6 +2083,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -774,6 +2094,31 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -783,6 +2128,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -790,6 +2139,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -797,6 +2149,29 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} + engines: {node: '>=14.0.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -826,14 +2201,131 @@ packages: typescript: optional: true + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici@6.29.0: + resolution: {integrity: sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.7: + resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.7: + resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.7 + '@vitest/ui': 3.2.7 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -842,6 +2334,14 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -850,90 +2350,231 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.10': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.25.2': optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + '@esbuild/android-arm64@0.25.2': optional: true + '@esbuild/android-arm64@0.28.2': + optional: true + '@esbuild/android-arm@0.25.2': optional: true + '@esbuild/android-arm@0.28.2': + optional: true + '@esbuild/android-x64@0.25.2': optional: true + '@esbuild/android-x64@0.28.2': + optional: true + '@esbuild/darwin-arm64@0.25.2': optional: true + '@esbuild/darwin-arm64@0.28.2': + optional: true + '@esbuild/darwin-x64@0.25.2': optional: true + '@esbuild/darwin-x64@0.28.2': + optional: true + '@esbuild/freebsd-arm64@0.25.2': optional: true + '@esbuild/freebsd-arm64@0.28.2': + optional: true + '@esbuild/freebsd-x64@0.25.2': optional: true + '@esbuild/freebsd-x64@0.28.2': + optional: true + '@esbuild/linux-arm64@0.25.2': optional: true + '@esbuild/linux-arm64@0.28.2': + optional: true + '@esbuild/linux-arm@0.25.2': optional: true + '@esbuild/linux-arm@0.28.2': + optional: true + '@esbuild/linux-ia32@0.25.2': optional: true + '@esbuild/linux-ia32@0.28.2': + optional: true + '@esbuild/linux-loong64@0.25.2': optional: true + '@esbuild/linux-loong64@0.28.2': + optional: true + '@esbuild/linux-mips64el@0.25.2': optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true + '@esbuild/linux-ppc64@0.25.2': optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true + '@esbuild/linux-riscv64@0.25.2': optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true + '@esbuild/linux-s390x@0.25.2': optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true + '@esbuild/linux-x64@0.25.2': optional: true + '@esbuild/linux-x64@0.28.2': + optional: true + '@esbuild/netbsd-arm64@0.25.2': optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true + '@esbuild/netbsd-x64@0.25.2': optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true + '@esbuild/openbsd-arm64@0.25.2': optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true + '@esbuild/openbsd-x64@0.25.2': optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + '@esbuild/sunos-x64@0.25.2': optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true + '@esbuild/win32-arm64@0.25.2': optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true + '@esbuild/win32-ia32@0.25.2': optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true + '@esbuild/win32-x64@0.25.2': optional: true + '@esbuild/win32-x64@0.28.2': + optional: true + + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@hey-api/codegen-core@0.9.1': dependencies: '@hey-api/types': 0.1.4 @@ -984,6 +2625,12 @@ snapshots: '@hey-api/types@0.1.4': {} + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@humanwhocodes/momoa@2.0.4': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -993,6 +2640,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1005,6 +2656,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -1012,77 +2665,435 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsep-plugin/assignment@1.4.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + + '@jsep-plugin/regex@1.1.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + '@lukeed/ms@2.0.2': {} - '@pkgjs/parseargs@0.11.0': - optional: true + '@modelcontextprotocol/sdk@1.31.0(zod@4.6.5)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) + transitivePeerDependencies: + - supports-color - '@rollup/rollup-android-arm-eabi@4.40.0': + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true - '@rollup/rollup-android-arm64@4.40.0': - optional: true + '@nodable/entities@3.1.0': {} - '@rollup/rollup-darwin-arm64@4.40.0': - optional: true + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.0 - '@rollup/rollup-darwin-x64@4.40.0': - optional: true + '@opentelemetry/api@1.9.0': {} - '@rollup/rollup-freebsd-arm64@4.40.0': - optional: true + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 - '@rollup/rollup-freebsd-x64@4.40.0': - optional: true + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.43.0 - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - optional: true + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - optional: true + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) - '@rollup/rollup-linux-arm64-gnu@4.40.0': - optional: true + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 - '@rollup/rollup-linux-arm64-musl@4.40.0': - optional: true + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - optional: true + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/cli@1.34.21(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.21 + '@redocly/respect-core': 1.34.21(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 4.0.3 + colorette: 1.4.0 + core-js: 3.32.1 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.0.1 + glob: 7.2.3 + handlebars: 4.7.10 + js-yaml: 4.3.2 + mobx: 6.12.3 + pluralize: 8.0.0 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + redoc: 2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)) + semver: 7.7.4 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.21': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.21(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.21 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.3.2 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.0 + openapi-sampler: 1.7.0 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.29.0 + transitivePeerDependencies: + - ajv + - supports-color + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.64.7': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.64.7': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.64.7': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.64.7': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.64.7': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.64.7': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.64.7': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.64.7': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.64.7': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.64.7': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.64.7': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.64.7': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.64.7': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.64.7': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.40.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.64.7': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.40.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.64.7': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.40.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.64.7': + optional: true + '@rollup/rollup-linux-x64-gnu@4.40.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.64.7': + optional: true + '@rollup/rollup-linux-x64-musl@4.40.0': optional: true + '@rollup/rollup-linux-x64-musl@4.64.7': + optional: true + + '@rollup/rollup-openbsd-x64@4.64.7': + optional: true + + '@rollup/rollup-openharmony-arm64@4.64.7': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.40.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.64.7': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.40.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.64.7': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.64.7': + optional: true + '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.64.7': + optional: true + + '@sinclair/typebox@0.27.12': {} + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + '@types/ejs@3.1.5': {} '@types/estree@1.0.7': {} + '@types/estree@1.0.9': {} + '@types/json-schema@7.0.15': {} + '@types/trusted-types@2.0.7': + optional: true + + '@vitest/expect@3.2.7': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.7(vite@7.3.7(jiti@2.7.0))': + dependencies: + '@vitest/spy': 3.2.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.7(jiti@2.7.0) + + '@vitest/pretty-format@3.2.7': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.7': + dependencies: + '@vitest/utils': 3.2.7 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.7': + dependencies: + tinyspy: 4.0.6 + + '@vitest/utils@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1093,16 +3104,47 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} + anynum@1.0.1: {} + argparse@2.0.1: {} + assertion-error@2.0.1: {} + async@3.2.6: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1112,6 +3154,8 @@ snapshots: dependencies: balanced-match: 1.0.2 + buffer-from@1.1.2: {} + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -1121,6 +3165,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + c12@3.3.4: dependencies: chokidar: 5.0.0 @@ -1138,11 +3184,33 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + check-error@2.1.3: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -1151,6 +3219,16 @@ snapshots: dependencies: readdirp: 5.1.1 + classnames@2.5.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1159,28 +3237,70 @@ snapshots: color-support@1.1.3: {} + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@15.0.0: {} commander@4.1.1: {} concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} consola@3.4.2: {} + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-js@3.32.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decko@1.2.0: {} + + deep-eql@5.0.2: {} + default-browser-id@5.0.1: {} default-browser@5.5.1: @@ -1192,12 +3312,32 @@ snapshots: defu@6.1.7: {} + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + diff-sequences@29.6.3: {} + + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.4.7: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -1206,6 +3346,27 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-promise@3.3.1: {} + esbuild-fix-imports-plugin@1.0.19: {} esbuild-plugin-file-path-extensions@1.0.0: {} @@ -1238,24 +3399,191 @@ snapshots: '@esbuild/win32-ia32': 0.25.2 '@esbuild/win32-x64': 0.25.2 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.4: {} + + eventsource-parser@3.1.1: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.1 + + expect-type@1.4.0: {} + + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3 + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color + + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.0 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + exsolve@1.1.1: {} + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.8: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + filelist@1.0.4: dependencies: minimatch: 5.1.6 + finalhandler@2.1.1: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + foreach@2.0.6: {} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -1271,8 +3599,72 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-client@1.3.5: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -1283,6 +3675,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-promise@4.0.0: {} + + is-unsafe@2.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -1295,20 +3691,68 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jiti@2.7.0: {} + + jose@6.2.12: {} + + joycon@3.1.1: {} + + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsep@1.6.0: {} + + json-pointer@0.6.2: dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + foreach: 2.0.6 - jiti@2.7.0: {} + json-schema-traverse@1.0.0: {} - joycon@3.1.1: {} + json-schema-typed@8.0.2: {} - js-yaml@4.2.0: + jsonpath-plus@10.3.0: dependencies: - argparse: 2.0.1 + '@jsep-plugin/assignment': 1.4.0(jsep@1.6.0) + '@jsep-plugin/regex': 1.1.0(jsep@1.6.0) + jsep: 1.6.0 + + jsonpointer@5.0.1: {} + + leven@3.1.0: {} lilconfig@3.1.3: {} @@ -1318,8 +3762,42 @@ snapshots: lodash.sortby@4.7.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.2.1: {} + lru-cache@10.4.3: {} + lunr@2.3.9: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + mark.js@8.11.1: {} + + marked@4.3.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -1328,12 +3806,36 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mobx-react-lite@4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx-react@9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + mobx-react-lite: 4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react: 19.3.1 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx@6.12.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -1342,10 +3844,78 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.20: {} + + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + neo-async@2.6.2: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.12: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.1 + open@11.0.0: dependencies: default-browser: 5.5.1 @@ -1355,8 +3925,30 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openapi-sampler@1.7.0: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + openapi-sampler@1.7.6: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + outdent@0.8.0: {} + package-json-from-dist@1.0.1: {} + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -1364,41 +3956,165 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} + pathval@2.0.1: {} + perfect-debounce@2.1.0: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@4.0.2: {} + picomatch@4.0.7: {} + pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-types@2.3.3: dependencies: confbox: 0.3.1 exsolve: 1.1.1 pathe: 2.0.3 - postcss-load-config@6.0.1(jiti@2.7.0): + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.10 + + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.30): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.7.0 + postcss: 8.5.30 + + postcss@8.5.30: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 powershell-utils@0.1.0: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + rc9@3.1.0: dependencies: defu: 6.1.7 destr: 2.0.5 + react-dom@19.3.1(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.28.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-tabs@6.1.1(react@19.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.3.1 + + react@19.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.1.1: {} + redoc@2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)): + dependencies: + '@redocly/openapi-core': 1.34.21 + classnames: 2.5.1 + core-js: 3.32.1 + decko: 1.2.0 + dompurify: 3.4.17 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.12.3 + mobx-react: 9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + openapi-sampler: 1.7.6 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + react-tabs: 6.1.1(react@19.3.1) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + + reftools@1.1.9: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -1429,22 +4145,183 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 + rollup@4.64.7: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.64.7 + '@rollup/rollup-android-arm64': 4.64.7 + '@rollup/rollup-darwin-arm64': 4.64.7 + '@rollup/rollup-darwin-x64': 4.64.7 + '@rollup/rollup-freebsd-arm64': 4.64.7 + '@rollup/rollup-freebsd-x64': 4.64.7 + '@rollup/rollup-linux-arm-gnueabihf': 4.64.7 + '@rollup/rollup-linux-arm-musleabihf': 4.64.7 + '@rollup/rollup-linux-arm64-gnu': 4.64.7 + '@rollup/rollup-linux-arm64-musl': 4.64.7 + '@rollup/rollup-linux-loong64-gnu': 4.64.7 + '@rollup/rollup-linux-loong64-musl': 4.64.7 + '@rollup/rollup-linux-ppc64-gnu': 4.64.7 + '@rollup/rollup-linux-ppc64-musl': 4.64.7 + '@rollup/rollup-linux-riscv64-gnu': 4.64.7 + '@rollup/rollup-linux-riscv64-musl': 4.64.7 + '@rollup/rollup-linux-s390x-gnu': 4.64.7 + '@rollup/rollup-linux-x64-gnu': 4.64.7 + '@rollup/rollup-linux-x64-musl': 4.64.7 + '@rollup/rollup-openbsd-x64': 4.64.7 + '@rollup/rollup-openharmony-arm64': 4.64.7 + '@rollup/rollup-win32-arm64-msvc': 4.64.7 + '@rollup/rollup-win32-ia32-msvc': 4.64.7 + '@rollup/rollup-win32-x64-gnu': 4.64.7 + '@rollup/rollup-win32-x64-msvc': 4.64.7 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.0 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-applescript@7.1.0: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.28.0: {} + + semver@7.7.4: {} + semver@7.8.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + signal-exit@4.1.0: {} + simple-websocket@9.1.0: + dependencies: + debug: 4.4.0 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + slugify@1.4.7: {} + + source-map-js@1.2.2: {} + + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stickyfill@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -1457,6 +4334,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -1465,6 +4346,25 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.3.1 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -1479,6 +4379,22 @@ snapshots: dependencies: has-flag: 4.0.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -1487,6 +4403,8 @@ snapshots: dependencies: any-promise: 1.3.0 + tinybench@2.9.0: {} + tinyexec@0.3.2: {} tinyglobby@0.2.12: @@ -1494,6 +4412,21 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.6: {} + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -1502,7 +4435,7 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.4.0(jiti@2.7.0)(typescript@5.8.2): + tsup@8.4.0(jiti@2.7.0)(postcss@8.5.30)(typescript@5.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.25.2) cac: 6.7.14 @@ -1512,7 +4445,7 @@ snapshots: esbuild: 0.25.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.7.0) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.30) resolve-from: 5.0.0 rollup: 4.40.0 source-map: 0.8.0-beta.0 @@ -1521,6 +4454,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: + postcss: 8.5.30 typescript: 5.8.2 transitivePeerDependencies: - jiti @@ -1528,10 +4462,116 @@ snapshots: - tsx - yaml + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + typescript@5.8.2: {} + uglify-js@3.19.3: + optional: true + + undici@6.29.0: {} + + unpipe@1.0.0: {} + + uri-js-replace@1.0.1: {} + + url-template@2.0.8: {} + + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + + vite-node@3.2.4(jiti@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.7(jiti@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.7(jiti@2.7.0): + dependencies: + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.30 + rollup: 4.64.7 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.7.0 + + vitest@3.2.7(jiti@2.7.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@7.3.7(jiti@2.7.0)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.7(jiti@2.7.0) + vite-node: 3.2.4(jiti@2.7.0) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -1542,6 +4582,13 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -1554,9 +4601,37 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-naming@0.3.0: {} + + y18n@5.0.8: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + zod-to-json-schema@3.25.2(zod@4.6.5): + dependencies: + zod: 4.6.5 + zod@4.6.5: {} diff --git a/packages/sdks/currencies/src/client/mcp-support.gen.ts b/packages/sdks/currencies/src/client/mcp-support.gen.ts new file mode 100644 index 000000000..5aedf66aa --- /dev/null +++ b/packages/sdks/currencies/src/client/mcp-support.gen.ts @@ -0,0 +1,260 @@ +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js" +import type { + CallToolResult, + ToolAnnotations, +} from "@modelcontextprotocol/sdk/types.js" +import * as z from "zod" + +export type OperationMeta = { + id: string + method: string + path: string + risk: "read" | "create" | "update" | "delete" +} + +export type ToolConfig = { + title?: string + description?: string + inputSchema: z.ZodObject>> + outputSchema?: AnySchema + annotations?: ToolAnnotations + _meta: { + "com.elasticpath/operation": OperationMeta + } +} + +export type Tool = { + readonly name: string + readonly config: ToolConfig + readonly handler: ToolCallback +} + +const messageOf = (error: unknown) => + error instanceof Error ? error.message : JSON.stringify(error) + +export const toToolResult = async ( + request: Promise<{ + data?: unknown + error?: unknown + response?: Response + }>, +): Promise => { + let text: string + try { + const result = await request + if (result.error === undefined) { + const structuredContent = + typeof result.data === "object" && + result.data !== null && + !Array.isArray(result.data) + ? (result.data as Record) + : { data: result.data ?? null } + return { + structuredContent, + content: [{ type: "text", text: JSON.stringify(structuredContent) }], + } + } + text = result.response + ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}` + : messageOf(result.error) + } catch (error) { + text = messageOf(error) + } + return { isError: true, content: [{ type: "text", text }] } +} + +export const loose = (schema: T): T => { + const def: any = schema._zod.def + const copy = (changes: object): T => + schema.clone({ ...def, ...changes }, { parent: true }) + if (def.type === "object") { + return copy({ + catchall: z.unknown(), + shape: Object.fromEntries( + Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]), + ), + }) + } + if (def.type === "array") { + return copy({ element: loose(def.element) }) + } + if (def.type === "record") { + return copy({ valueType: loose(def.valueType) }) + } + if (def.type === "lazy") { + return copy({ getter: () => loose(def.getter()) }) + } + if ( + [ + "optional", + "nullable", + "default", + "readonly", + "nonoptional", + "catch", + "prefault", + ].includes(def.type) + ) { + return copy({ innerType: loose(def.innerType) }) + } + if (def.type === "union") { + return copy({ options: def.options.map(loose) }) + } + if (def.type === "intersection") { + return copy({ left: loose(def.left), right: loose(def.right) }) + } + return schema +} + +type FileNameFields = { + [P in `${K}_name`]: z.ZodOptional +} + +export const dataUriFields = < + S extends z.ZodRawShape, + C extends z.core.$ZodObjectConfig, + K extends string, +>( + schema: z.ZodObject, + fields: ReadonlyArray, + maxBytes: number, +): z.ZodObject>, C> => + schema.extend( + Object.fromEntries( + fields.flatMap((field) => { + const current = schema.shape[field] as unknown as z.ZodType + const uri = z.string().meta({ + format: "uri", + "x-mcp-file": { maxSize: maxBytes }, + description: [ + current.description, + `Send the file as a data: URI, such as data:text/csv;base64,, at most ${maxBytes} bytes once decoded.`, + ] + .filter(Boolean) + .join(" "), + }) + const name = z + .string() + .meta({ + description: `The name of the file sent in ${field}, such as products.csv.`, + }) + .optional() + return [ + [field, current.isOptional() ? uri.optional() : uri], + [`${field}_name`, name], + ] + }), + ), + ) as unknown as z.ZodObject>, C> + +type DataUrisDecoded = T extends object + ? Omit & { + [P in K & keyof T]: undefined extends T[P] ? File | undefined : File + } + : T + +const DATA_URI = /^data:([^,]*),(.*)$/is +const PERCENT_ENCODED = /^[0-9a-f]{2}$/i + +const notADataUriError = (field: string) => + new Error( + `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`, + ) + +const fileTooBigError = (field: string, bytes: number, maxBytes: number) => + new Error( + `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`, + ) + +function percentDecoded(field: string, text: string) { + const bytes: number[] = [] + const encoder = new TextEncoder() + for (let index = 0; index < text.length; index++) { + if (text[index] === "%") { + const hex = text.slice(index + 1, index + 3) + if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field) + bytes.push(parseInt(hex, 16)) + index += 2 + } else { + const codePoint = text.codePointAt(index)! + const character = String.fromCodePoint(codePoint) + bytes.push(...encoder.encode(character)) + index += character.length - 1 + } + } + return new Uint8Array(bytes) +} + +function base64Decoded(field: string, text: string, maxBytes: number) { + const data = text.replace(/\s/g, "") + const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0 + const bytes = Math.floor((data.length * 3) / 4) - padding + if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes) + let binary: string + try { + binary = atob(data) + } catch { + throw new Error(`${field} is not valid base64`) + } + return Uint8Array.from(binary, (character) => character.charCodeAt(0)) +} + +function fileFromDataUri( + field: string, + uri: unknown, + maxBytes: number, + givenName: unknown, +) { + const match = typeof uri === "string" ? DATA_URI.exec(uri) : null + if (!match) throw notADataUriError(field) + const parameters = match[1]!.split(";") + const isBase64 = parameters.at(-1)!.toLowerCase() === "base64" + if (isBase64) parameters.pop() + const mediaType = parameters.shift()!.trim() + const nameParameter = parameters.find((parameter) => + parameter.trim().toLowerCase().startsWith("name="), + ) + let name = field + if (typeof givenName === "string" && givenName.trim()) { + name = givenName.trim() + } else if (nameParameter) { + try { + name = decodeURIComponent(nameParameter.trim().slice("name=".length)) + } catch { + throw notADataUriError(field) + } + } + const bytes = isBase64 + ? base64Decoded(field, match[2]!, maxBytes) + : percentDecoded(field, match[2]!) + if (bytes.length > maxBytes) + throw fileTooBigError(field, bytes.length, maxBytes) + return new File([bytes], name, { + type: mediaType.includes("/") ? mediaType : "text/plain", + }) +} + +export const decodeDataUris = async ( + body: T, + fields: ReadonlyArray, + maxBytes: number, +): Promise> => { + if (typeof body !== "object" || body === null) { + return body as DataUrisDecoded + } + const decoded = { ...body } as Record + for (const field of fields) { + const givenName = decoded[`${field}_name`] + delete decoded[`${field}_name`] + if (decoded[field] !== undefined) { + decoded[field] = fileFromDataUri( + field, + decoded[field], + maxBytes, + givenName, + ) + } + } + return decoded as DataUrisDecoded +} diff --git a/packages/sdks/currencies/src/client/mcp.gen.ts b/packages/sdks/currencies/src/client/mcp.gen.ts new file mode 100644 index 000000000..738d15356 --- /dev/null +++ b/packages/sdks/currencies/src/client/mcp.gen.ts @@ -0,0 +1,281 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import * as z from "zod" + +import type { Client } from "./client" +import { loose, type Tool, toToolResult } from "./mcp-support.gen" +import { + createACurrency, + deleteACurrency, + getACurrency, + getAllCurrencies, + updateACurrency, +} from "./sdk.gen" +import { + zCreateACurrencyBody, + zDeleteACurrencyPath, + zGetACurrencyPath, + zGetAllCurrenciesQuery, + zUpdateACurrencyBody, + zUpdateACurrencyPath, +} from "./zod.gen" + +type ToolOptions = { + client?: Client +} + +const getAllCurrenciesInput = z + .object({ + query: zGetAllCurrenciesQuery.strict().optional(), + }) + .strict() + +/** + * Get all Currencies + * + * Fetch all currencies. + * + */ +export const getAllCurrenciesTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + getAllCurrencies({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "currencies_get_all_currencies" as const, + config: { + title: "Get all Currencies", + description: + "Lists the currencies configured for the store, including each currency's code, exchange rate, display format, and whether it is the default and enabled. Supports offset and limit pagination. A store can have at most 10 currencies.", + inputSchema: getAllCurrenciesInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "currencies.getAllCurrencies", + method: "GET", + path: "/v2/currencies", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const createACurrencyInput = z + .object({ + body: loose(zCreateACurrencyBody).optional(), + }) + .strict() + +/** + * Create a Currency + * + * Create a currency. + * + */ +export const createACurrencyTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + createACurrency({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "currencies_create_a_currency" as const, + config: { + title: "Create a Currency", + description: + "Adds a currency to the store, with its three-letter code, exchange rate from the default currency, display format, separators, decimal places, and whether it is the default and enabled. It fails if the code already exists or the store already has 10 currencies.", + inputSchema: createACurrencyInput, + annotations: { + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "currencies.createACurrency", + method: "POST", + path: "/v2/currencies", + risk: "create" as const, + }, + }, + }, + handler, + } +} + +const deleteACurrencyInput = z + .object({ + path: zDeleteACurrencyPath.strict(), + }) + .strict() + +/** + * Delete a Currency + * + * Delete a currency. + * + * :::caution + * + * - You can’t delete a default currency. + * + * ::: + * + */ +export const deleteACurrencyTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + deleteACurrency({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "currencies_delete_a_currency" as const, + config: { + title: "Delete a Currency", + description: + "Deletes a currency by its ID. The default currency cannot be deleted, so make another currency the default first.", + inputSchema: deleteACurrencyInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "currencies.deleteACurrency", + method: "DELETE", + path: "/v2/currencies/{currencyID}", + risk: "delete" as const, + }, + }, + }, + handler, + } +} + +const getACurrencyInput = z + .object({ + path: zGetACurrencyPath.strict(), + }) + .strict() + +/** + * Get a Currency + * + * Fetch a currency by its ID. + * + */ +export const getACurrencyTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + getACurrency({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "currencies_get_a_currency" as const, + config: { + title: "Get a Currency", + description: + "Gets one currency by its ID, with its code, exchange rate, display format, separators, decimal places, and whether it is the default and enabled. To find a currency's ID, list the currencies.", + inputSchema: getACurrencyInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "currencies.getACurrency", + method: "GET", + path: "/v2/currencies/{currencyID}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const updateACurrencyInput = z + .object({ + path: zUpdateACurrencyPath.strict(), + body: loose(zUpdateACurrencyBody).optional(), + }) + .strict() + +/** + * Update a Currency + * + * Update a currency. + * + */ +export const updateACurrencyTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + updateACurrency({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "currencies_update_a_currency" as const, + config: { + title: "Update a Currency", + description: + "Updates a currency by its ID. The request body accepts only the default flag, so use it to make a currency the store's default; it cannot change the currency's code, exchange rate or format.", + inputSchema: updateACurrencyInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "currencies.updateACurrency", + method: "PUT", + path: "/v2/currencies/{currencyID}", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +export const tools = (options?: ToolOptions): Array => [ + getAllCurrenciesTool(options), + createACurrencyTool(options), + deleteACurrencyTool(options), + getACurrencyTool(options), + updateACurrencyTool(options), +] diff --git a/packages/sdks/currencies/src/mcp.test-d.ts b/packages/sdks/currencies/src/mcp.test-d.ts new file mode 100644 index 000000000..98b36a928 --- /dev/null +++ b/packages/sdks/currencies/src/mcp.test-d.ts @@ -0,0 +1,84 @@ +import { describe, expectTypeOf, it } from "vitest" +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { z } from "zod" +import type { GetAllCurrenciesData } from "./client/types.gen" +import { getAllCurrenciesTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +declare const server: McpServer + +describe("registering the generated tools", () => { + it("registers one tool with its name, config and handler", () => { + const tool = getAllCurrenciesTool() + + server.registerTool(tool.name, tool.config, tool.handler) + }) + + it("registers every tool from tools()", () => { + tools().forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("registers only the read-only tools", () => { + tools() + .filter( + (t) => t.config._meta["com.elasticpath/operation"].risk === "read", + ) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("rejects a tool without _meta or with an unknown risk", () => { + const register = (t: Tool) => + server.registerTool(t.name, t.config, t.handler) + const tool = getAllCurrenciesTool() + const { _meta, ...configWithoutMeta } = tool.config + const withoutMeta = { ...tool, config: configWithoutMeta } + const unknownRisk = { + ...tool, + config: { + ...tool.config, + _meta: { + "com.elasticpath/operation": { + ..._meta["com.elasticpath/operation"], + risk: "erase" as const, + }, + }, + }, + } + + register(tool) + // @ts-expect-error + register(withoutMeta) + // @ts-expect-error + register(unknownRisk) + }) + + it("keeps typed arguments in a wrapped handler", () => { + const tool = getAllCurrenciesTool() + + server.registerTool(tool.name, tool.config, (args, extra) => { + expectTypeOf(args.query).toEqualTypeOf() + // @ts-expect-error + tool.handler({ colour: "red" }, extra) + return tool.handler(args, extra) + }) + }) + + it("registers every tool with an extended input that sets a header", () => { + tools().forEach((t) => + server.registerTool( + t.name, + { + ...t.config, + inputSchema: t.config.inputSchema.extend({ + store_id: z.string().describe("The Elastic Path store to act on."), + }), + }, + ({ store_id, ...args }, extra) => + t.handler( + { ...args, headers: { ...args.headers, "EP-Store-Id": store_id } }, + extra, + ), + ), + ) + }) +}) diff --git a/packages/sdks/currencies/src/mcp.test.ts b/packages/sdks/currencies/src/mcp.test.ts new file mode 100644 index 000000000..830f0ba77 --- /dev/null +++ b/packages/sdks/currencies/src/mcp.test.ts @@ -0,0 +1,340 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { ToolSchema } from "@modelcontextprotocol/sdk/types.js" +import type { Tool as ListedTool } from "@modelcontextprotocol/sdk/types.js" +import fs from "node:fs" +import * as main from "./index" +import { client as defaultClient } from "./client/client.gen" +import * as mcp from "./mcp" +import { createACurrencyTool, getAllCurrenciesTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +const baseUrl = "https://useast.api.elasticpath.com" +const OPERATION = "com.elasticpath/operation" + +function stubFetch(body: unknown, status = 200) { + const requests: Request[] = [] + const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push( + input instanceof Request && init === undefined + ? input + : new Request(input, init), + ) + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json" }, + }) + }) as typeof globalThis.fetch + return { requests, fetch } +} + +const clientWith = ( + fetch: typeof globalThis.fetch, + config?: { headers: Record }, +) => + main.createCurrenciesClient({ + baseUrl, + token: "pre-issued", + fetch, + retry: false, + config, + }) + +const extraWith = (signal = new AbortController().signal) => + ({ signal }) as Parameters[1] + +async function connect(registered: Tool[]) { + const server = new McpServer({ name: "currencies", version: "1.0.0" }) + registered.forEach((t) => server.registerTool(t.name, t.config, t.handler)) + const mcpClient = new Client({ name: "test-client", version: "1.0.0" }) + const [clientSide, serverSide] = InMemoryTransport.createLinkedPair() + await Promise.all([server.connect(serverSide), mcpClient.connect(clientSide)]) + return mcpClient +} + +const functionNamesInOperationOrder = () => + [ + ...fs + .readFileSync(new URL("./client/sdk.gen.ts", import.meta.url), "utf8") + .matchAll(/^export const (\w+) =/gm), + ].map((match) => match[1]!) + +const operationOf = (tool: Tool) => tool.config._meta[OPERATION] + +const overrides = new URL( + "../../specs/overrides/mcp/currencies/", + import.meta.url, +) + +const writtenDescriptions = () => + fs.readdirSync(overrides).map((file) => + fs + .readFileSync(new URL(file, overrides), "utf8") + .split("x-mcp-description: >-")[1]! + .split(/\n(?=\S)/)[0]! + .trim() + .split(/\s*\n\s*/) + .join(" "), + ) + +describe("tools", () => { + it("holds 5 tools with valid, unique names, in operation order", () => { + const names = tools().map((tool) => tool.name) + + expect(names).toHaveLength(5) + for (const name of names) expect(name).toMatch(/^[a-zA-Z0-9_-]{1,64}$/) + expect(new Set(names).size).toBe(5) + expect(tools().map((tool) => operationOf(tool).id)).toEqual( + functionNamesInOperationOrder().map((name) => `currencies.${name}`), + ) + }) + + it("exports one tool factory for each operation", () => { + const factories = Object.keys(mcp).filter((name) => name.endsWith("Tool")) + + expect(factories).toHaveLength(5) + }) + + describe("sends each tool's request to its own operation's method and path", () => { + const { requests, fetch } = stubFetch({}) + const client = clientWith(fetch) + + it.each(tools({ client }).map((tool) => [tool.name, tool] as const))( + "%s", + async (_name, tool) => { + requests.length = 0 + const { method, path } = operationOf(tool) + const params = [...path.matchAll(/\{([^}]+)\}/g)].map( + (match) => match[1]!, + ) + const args: Record = {} + if (params.length > 0) { + args.path = Object.fromEntries(params.map((p) => [p, `p-${p}`])) + } + if ("body" in tool.config.inputSchema.shape) args.body = {} + + await tool.handler(args, extraWith()) + + expect(requests).toHaveLength(1) + expect(requests[0]!.method).toBe(method) + expect(new URL(requests[0]!.url).pathname).toBe( + path.replace(/\{([^}]+)\}/g, (_match, p) => `p-${p}`), + ) + }, + ) + }) +}) + +describe("the client a tool calls through", () => { + const response = { data: [] } + let original: ReturnType + let viaDefault: ReturnType + + beforeEach(() => { + original = defaultClient.getConfig() + viaDefault = stubFetch(response) + defaultClient.setConfig({ fetch: viaDefault.fetch }) + }) + + afterEach(() => { + defaultClient.setConfig({ + ...original, + auth: original.auth, + fetch: original.fetch, + }) + }) + + it("calls through the package's default client when no client is given", async () => { + const result = await getAllCurrenciesTool().handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(1) + expect(viaDefault.requests[0]!.url).toBe( + `${original.baseUrl}/v2/currencies`, + ) + expect(result.structuredContent).toEqual(response) + }) + + it("sends the credentials of a default client configured from a currencies client", async () => { + defaultClient.setConfig(clientWith(viaDefault.fetch).getConfig()) + + await getAllCurrenciesTool().handler({}, extraWith()) + + expect(viaDefault.requests[0]!.headers.get("Authorization")).toBe( + "Bearer pre-issued", + ) + }) + + it("uses a given client instead of the default", async () => { + const viaGiven = stubFetch(response) + + await getAllCurrenciesTool({ client: clientWith(viaGiven.fetch) }).handler( + {}, + extraWith(), + ) + + expect(viaDefault.requests).toHaveLength(0) + expect(viaGiven.requests).toHaveLength(1) + const url = new URL(viaGiven.requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/currencies`) + }) + + it("sends headers configured on the client with every tool call", async () => { + const { requests, fetch } = stubFetch(response) + const client = clientWith(fetch, { + headers: { "EP-Store-Id": "store-1", "EP-Org-Id": "org-1" }, + }) + + await getAllCurrenciesTool({ client }).handler({}, extraWith()) + + expect(requests[0]!.headers.get("EP-Store-Id")).toBe("store-1") + expect(requests[0]!.headers.get("EP-Org-Id")).toBe("org-1") + }) +}) + +describe("a tool's handler", () => { + it("aborts the request when the MCP request is cancelled", async () => { + const { requests, fetch } = stubFetch({}) + const controller = new AbortController() + + await getAllCurrenciesTool({ client: clientWith(fetch) }).handler( + {}, + extraWith(controller.signal), + ) + expect(requests[0]!.signal.aborted).toBe(false) + controller.abort() + + expect(requests[0]!.signal.aborted).toBe(true) + }) + + it("returns an API error as an isError result with the HTTP status", async () => { + const errors = { errors: [{ status: 404, title: "Not Found" }] } + const { fetch } = stubFetch(errors, 404) + + const result = await getAllCurrenciesTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result).toEqual({ + isError: true, + content: [{ type: "text", text: `HTTP 404: ${JSON.stringify(errors)}` }], + }) + }) + + it("returns a network failure as an isError result with its message", async () => { + const fetch = (async () => { + throw new TypeError("fetch failed") + }) as typeof globalThis.fetch + + const result = await getAllCurrenciesTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result.isError).toBe(true) + expect(result.content).toEqual([ + { type: "text", text: expect.stringContaining("fetch failed") }, + ]) + }) +}) + +describe("a tool's description", () => { + it("is the description written for it in the spec overrides, for every tool", () => { + expect( + tools() + .map((tool) => tool.config.description) + .sort(), + ).toEqual(writtenDescriptions().sort()) + }) +}) + +describe("the currencies tools on an MCP server", () => { + let listed: ListedTool[] + + beforeAll(async () => { + const mcpClient = await connect( + tools({ client: clientWith(stubFetch({}).fetch) }), + ) + listed = (await mcpClient.listTools()).tools + }) + + it("describes every tool in at most 600 characters", () => { + for (const tool of listed) { + expect(tool.description!.length, tool.name).toBeLessThanOrEqual(600) + } + }) + + it("lists all 5, each passing the MCP SDK's ToolSchema", () => { + expect(listed).toHaveLength(5) + for (const tool of listed) { + expect(ToolSchema.safeParse(tool).success, tool.name).toBe(true) + } + }) + + it("asks no tool for an Authorization header", () => { + for (const tool of listed) { + const headers = (tool.inputSchema.properties as Record) + ?.headers + const names = Object.keys(headers?.properties ?? {}) + + expect(names.map((name) => name.toLowerCase())).not.toContain( + "authorization", + ) + } + }) + + it("rejects an unknown query key without sending the request", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + getAllCurrenciesTool({ client: clientWith(fetch) }), + ]) + + const result = await mcpClient.callTool({ + name: "currencies_get_all_currencies", + arguments: { query: { colour: "red" } }, + }) + + expect(result.isError).toBe(true) + expect(requests).toHaveLength(0) + }) + + it("keeps a body attribute the spec does not list when the tool is called through an MCP server", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + createACurrencyTool({ client: clientWith(fetch) }), + ]) + const args = { body: { unlisted_attribute: { nested: true } } } + + const result = await mcpClient.callTool({ + name: "currencies_create_a_currency", + arguments: args, + }) + + expect(result.isError).toBeFalsy() + expect(await requests[0]!.json()).toMatchObject(args.body) + }) + + it("sends a call through the given client and returns the data", async () => { + const response = { data: [] } + const { requests, fetch } = stubFetch(response) + const mcpClient = await connect(tools({ client: clientWith(fetch) })) + + const result = await mcpClient.callTool({ + name: "currencies_get_all_currencies", + arguments: {}, + }) + + expect(requests).toHaveLength(1) + const url = new URL(requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/currencies`) + expect(requests[0]!.headers.get("Authorization")).toBe("Bearer pre-issued") + expect(result.structuredContent).toEqual(response) + }) +}) + +describe("the main entry", () => { + it("exports no MCP code", () => { + expect(main).not.toHaveProperty("tools") + expect(main).not.toHaveProperty("getAllCurrenciesTool") + }) +}) diff --git a/packages/sdks/currencies/src/mcp.ts b/packages/sdks/currencies/src/mcp.ts new file mode 100644 index 000000000..fda10e5a5 --- /dev/null +++ b/packages/sdks/currencies/src/mcp.ts @@ -0,0 +1,2 @@ +export * from "./client/mcp.gen" +export type { OperationMeta, Tool, ToolConfig } from "./client/mcp-support.gen" diff --git a/packages/sdks/currencies/test-cjs-minimal.cjs b/packages/sdks/currencies/test-cjs-minimal.cjs index 0d2ae39a2..32597c3dd 100644 --- a/packages/sdks/currencies/test-cjs-minimal.cjs +++ b/packages/sdks/currencies/test-cjs-minimal.cjs @@ -1,5 +1,7 @@ // This file is used to test that CommonJS requires work correctly const Currencies = require("./dist/index.cjs") +const mcp = require("./dist/mcp.cjs") console.log("Currencies:", Object.keys(Currencies)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/currencies/test-esm-minimal.mjs b/packages/sdks/currencies/test-esm-minimal.mjs index 3738e65e1..6ad005304 100644 --- a/packages/sdks/currencies/test-esm-minimal.mjs +++ b/packages/sdks/currencies/test-esm-minimal.mjs @@ -1,5 +1,7 @@ // This file is used to test that ESM imports work correctly import * as Currencies from "./dist/index.mjs" +import * as mcp from "./dist/mcp.mjs" console.log("Currencies:", Object.keys(Currencies)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/currencies/test/built-output.test.ts b/packages/sdks/currencies/test/built-output.test.ts new file mode 100644 index 000000000..70bbe4f0f --- /dev/null +++ b/packages/sdks/currencies/test/built-output.test.ts @@ -0,0 +1,99 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { build } from "tsup" +import type { Options } from "tsup" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import tsupConfig from "../tsup.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const outDir = path.join(here, ".generated-dist") + +const SPECIFIER = + /(?:\bfrom\s*|\bimport\s*\(\s*|\brequire\s*\(\s*|^\s*import\s+)["']([^"']+)["']/gm + +function specifiersIn(file: string) { + const source = fs.readFileSync(file, "utf8") + return [...source.matchAll(SPECIFIER)].map((match) => match[1]!) +} + +function importGraph(entry: string) { + const files = new Set() + const packages = new Set() + const pending = [path.join(outDir, entry)] + while (pending.length > 0) { + const file = pending.pop()! + if (files.has(file)) continue + files.add(file) + for (const specifier of specifiersIn(file)) { + if (specifier.startsWith(".")) { + pending.push(path.resolve(path.dirname(file), specifier)) + } else { + packages.add(specifier) + } + } + } + return { + files: [...files].map((file) => path.relative(outDir, file)), + packages: [...packages], + } +} + +function builtFiles(directory = outDir): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(directory, entry.name) + if (entry.isDirectory()) return builtFiles(full) + return /\.(mjs|cjs)$/.test(entry.name) ? [full] : [] + }) +} + +beforeAll(async () => { + await build({ + ...(tsupConfig as Options), + config: false, + dts: false, + outDir, + silent: true, + sourcemap: false, + }) +}, 120_000) + +afterAll(() => { + fs.rmSync(outDir, { force: true, recursive: true }) +}) + +describe("the built package", () => { + it.each(["index.mjs", "index.cjs"])( + "reaches no MCP code from the main entry, %s", + (entry) => { + const graph = importGraph(entry) + + expect(graph.files).toContain( + path.join("client", `sdk.gen.${entry.split(".")[1]}`), + ) + expect(graph.files.filter((file) => file.includes("mcp"))).toEqual([]) + expect(graph.packages.filter((name) => name.includes("mcp"))).toEqual([]) + }, + ) + + it.each(["mcp.mjs", "mcp.cjs"])( + "reaches the generated tools from %s", + (entry) => { + const graph = importGraph(entry) + const extension = entry.split(".")[1] + + expect(graph.files).toContain(path.join("client", `mcp.gen.${extension}`)) + }, + ) + + it("imports the MCP SDK nowhere, because it is a type-only peer", () => { + for (const file of builtFiles()) { + expect( + specifiersIn(file).filter((name) => + name.includes("modelcontextprotocol"), + ), + file, + ).toEqual([]) + } + }) +}) diff --git a/packages/sdks/currencies/test/mcp-generation.test.ts b/packages/sdks/currencies/test/mcp-generation.test.ts new file mode 100644 index 000000000..74b10b059 --- /dev/null +++ b/packages/sdks/currencies/test/mcp-generation.test.ts @@ -0,0 +1,74 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { createClient } from "@hey-api/openapi-ts" +import { execFileSync } from "node:child_process" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import config from "../openapi-ts.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const packageRoot = path.join(here, "..") +const committed = path.join(packageRoot, "src/client") +const firstRun = path.join(here, ".generated-mcp-first") +const secondRun = path.join(here, ".generated-mcp-second") +const workspaceBin = path.join(packageRoot, "../../../node_modules/.bin") +const mainEntryFiles = ["index.ts", "sdk.gen.ts", "types.gen.ts", "zod.gen.ts"] +const mcpFiles = ["mcp.gen.ts", "mcp-support.gen.ts"] + +const read = (directory: string, file: string) => + fs.readFileSync(path.join(directory, file), "utf8") + +async function generateInto(directory: string) { + const userConfig = await config + await createClient({ + ...userConfig, + input: path.join(packageRoot, "../specs/bundled/currencies_standalone.yaml"), + output: { ...(userConfig.output as object), path: directory }, + }) +} + +beforeAll(async () => { + process.env.PATH = [workspaceBin, process.env.PATH].join(path.delimiter) + execFileSync( + path.join(packageRoot, "node_modules/.bin/redocly"), + [ + "bundle", + "currencies-standalone@v1", + "--config", + "../specs/config/redocly.yaml", + ], + { cwd: packageRoot, stdio: "pipe" }, + ) + await generateInto(firstRun) + await generateInto(secondRun) +}, 120_000) + +afterAll(() => { + for (const directory of [firstRun, secondRun]) { + fs.rmSync(directory, { force: true, recursive: true }) + } +}) + +describe("generating the ./mcp export", () => { + it("writes the same MCP files byte for byte each time", () => { + for (const file of mcpFiles) { + expect(read(secondRun, file), file).toBe(read(firstRun, file)) + } + }) + + it("matches the committed MCP files", () => { + for (const file of mcpFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("leaves the main entry's generated files as committed", () => { + for (const file of mainEntryFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("keeps the MCP files out of the generated entry", () => { + expect(read(firstRun, "index.ts")).not.toContain("mcp") + }) +}) diff --git a/packages/sdks/currencies/tsconfig.test.json b/packages/sdks/currencies/tsconfig.test.json new file mode 100644 index 000000000..fc8520e73 --- /dev/null +++ b/packages/sdks/currencies/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/sdks/currencies/tsup.config.ts b/packages/sdks/currencies/tsup.config.ts index dc6b20685..44169c968 100644 --- a/packages/sdks/currencies/tsup.config.ts +++ b/packages/sdks/currencies/tsup.config.ts @@ -6,7 +6,7 @@ import { } from "esbuild-fix-imports-plugin" export default defineConfig({ - entry: ["src/**/*.ts"], + entry: ["src/**/*.ts", "!src/**/*.test.ts", "!src/**/*.test-d.ts"], format: ["esm", "cjs"], dts: true, splitting: false, diff --git a/packages/sdks/currencies/vitest.config.ts b/packages/sdks/currencies/vitest.config.ts new file mode 100644 index 000000000..4b27a5bb8 --- /dev/null +++ b/packages/sdks/currencies/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config" + +export default defineConfig({ + test: { + include: ["**/*.{test,spec}.{js,ts}"], + typecheck: { + enabled: true, + include: ["src/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, + }, +}) diff --git a/packages/sdks/merchant-realm-mapping/README.md b/packages/sdks/merchant-realm-mapping/README.md index 735094621..3bfeae2e2 100644 --- a/packages/sdks/merchant-realm-mapping/README.md +++ b/packages/sdks/merchant-realm-mapping/README.md @@ -2,7 +2,6 @@ Below you'll find instructions on how to install, set up, and use the client, along with a list of available operations. - ## Features - type-safe response data and errors @@ -13,7 +12,6 @@ Below you'll find instructions on how to install, set up, and use the client, al --- - ## Installation ```bash @@ -28,7 +26,6 @@ yarn add @epcc-sdk/sdks-merchant-realm-mapping ## Client Usage - Clients are responsible for sending the actual HTTP requests. The Fetch client is built as a thin wrapper on top of Fetch API, extending its functionality. If you're already familiar with Fetch, configuring your client will feel like working directly with Fetch API. @@ -40,23 +37,22 @@ You can configure the client in two ways: **When using the operation function to make requests, by default the global client will be used unless another is provided.** - ### 1. Configure the internal `client` instance directly This is the simpler approach. You can call the setConfig() method at the beginning of your application or anytime you need to update the client configuration. You can pass any Fetch API configuration option to setConfig(), and even your own Fetch implementation. ```ts -import { client } from "@epcc-sdk/sdks-merchant-realm-mapping"; +import { client } from "@epcc-sdk/sdks-merchant-realm-mapping" client.setConfig({ -// set default base url for requests -baseUrl: 'https://euwest.api.elasticpath.com', + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", -// set default headers for requests -headers: { -Authorization: 'Bearer YOUR_AUTH_TOKEN', -}, -}); + // set default headers for requests + headers: { + Authorization: "Bearer YOUR_AUTH_TOKEN", + }, +}) ``` The disadvantage of this approach is that your code may call the client instance before it's configured for the first time. Depending on your use case, you might need to use the second approach. @@ -66,27 +62,27 @@ The disadvantage of this approach is that your code may call the client instance This is useful when you want to use a different instance of the client for different parts of your application or when you want to use different configurations for different parts of your application. ```ts -import { createClient } from "@epcc-sdk/sdks-merchant-realm-mapping"; +import { createClient } from "@epcc-sdk/sdks-merchant-realm-mapping" // Create the client with your API base URL. const client = createClient({ - // set default base url for requests - baseUrl: "https://euwest.api.elasticpath.com", - /** - * Set default headers only for requests made by this client. - */ - headers: { - "Custom-Header": 'My Value', - }, -}); + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", + /** + * Set default headers only for requests made by this client. + */ + headers: { + "Custom-Header": "My Value", + }, +}) ``` You can also pass this instance to any SDK function through the client option. This will override the default instance from `import { client } from "@epcc-sdk/sdks-merchant-realm-mapping>". ```ts const response = await getMerchantRealmMapping({ - client: myClient, -}); + client: myClient, +}) ``` ### Direct configuration @@ -95,8 +91,8 @@ Alternatively, you can pass the client configuration options to each SDK functio ```ts const response = await getMerchantRealmMapping({ - baseUrl: 'https://example.com', // <-- override default configuration -}); + baseUrl: "https://example.com", // <-- override default configuration +}) ``` ## Interceptors (Middleware) @@ -104,35 +100,34 @@ const response = await getMerchantRealmMapping({ Interceptors (middleware) can be used to modify requests before they're sent or responses before they're returned to your application. They can be added with use and removed with eject. Below is an example request interceptor ```ts -import { client } from "@epcc-sdk/sdks-merchant-realm-mapping"; +import { client } from "@epcc-sdk/sdks-merchant-realm-mapping" // Supports async functions client.interceptors.request.use(async (request) => { - // do something - return request; -}); + // do something + return request +}) client.interceptors.request.eject((request) => { - // do something - return request; -}); - + // do something + return request +}) ``` and an example response interceptor ```ts -import { client } from "@epcc-sdk/sdks-merchant-realm-mapping"; +import { client } from "@epcc-sdk/sdks-merchant-realm-mapping" client.interceptors.response.use((response) => { - // do something - return response; -}); + // do something + return response +}) client.interceptors.response.eject((response) => { - // do something - return response; -}); + // do something + return response +}) ``` > **_Tip:_** To eject, you must provide a reference to the function that was passed to use(). @@ -146,15 +141,15 @@ source, sets the `auth` hook, refreshes and replays once on a 401, and backs off import { createMerchantRealmMappingClient, getMerchantRealmMappings, -} from "@epcc-sdk/sdks-merchant-realm-mapping"; +} from "@epcc-sdk/sdks-merchant-realm-mapping" const client = createMerchantRealmMappingClient({ baseUrl: "https://euwest.api.elasticpath.com", clientId: process.env.EPCC_CLIENT_ID!, clientSecret: process.env.EPCC_CLIENT_SECRET!, -}); +}) -const { data } = await getMerchantRealmMappings({ client }); +const { data } = await getMerchantRealmMappings({ client }) ``` Credentials come from `source`, `provider`, `token`, `clientId` plus `clientSecret`, or @@ -176,11 +171,93 @@ Zod schemas for every request body, path and response are published under the `/ subpath. `zod` is an optional peer dependency (4.x), so the root entry never imports it. ```ts -import { zMerchantRealmMappingResponse } from "@epcc-sdk/sdks-merchant-realm-mapping/zod"; +import { zMerchantRealmMappingResponse } from "@epcc-sdk/sdks-merchant-realm-mapping/zod" -const mapping = zMerchantRealmMappingResponse.parse(data?.data); +const mapping = zMerchantRealmMappingResponse.parse(data?.data) ``` +## MCP endpoint tools + +The `/mcp` subpath turns each of the 3 merchant realm mapping operations into a Model Context Protocol (MCP) tool. +The main entry imports none of it. `zod` 4 and `@modelcontextprotocol/sdk` are needed only for this +subpath. + +Each operation has one tool factory, named after its function with `Tool` added, such as +`getMerchantRealmMappingsTool`. A factory returns `{ name, config, handler }`, the three arguments that +`McpServer.registerTool` takes. `tools()` returns all 3 in operation order. A handler returns an API +error as an `isError` result and does not throw. + +Register one tool: + +```ts +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { getMerchantRealmMappingsTool } from "@epcc-sdk/sdks-merchant-realm-mapping/mcp" + +const server = new McpServer({ + name: "merchant-realm-mapping", + version: "1.0.0", +}) +const tool = getMerchantRealmMappingsTool() +server.registerTool(tool.name, tool.config, tool.handler) +``` + +A tool built without a client calls through the package's module level `client`, like an operation +does. That client has no credentials until you configure it. Configure it once: + +```ts +import { + client, + createMerchantRealmMappingClient, +} from "@epcc-sdk/sdks-merchant-realm-mapping" + +client.setConfig( + createMerchantRealmMappingClient({ + baseUrl, + clientId, + clientSecret, + }).getConfig(), +) +``` + +Register every tool, with a client that sends the same headers on every call: + +```ts +import * as merchantRealmMapping from "@epcc-sdk/sdks-merchant-realm-mapping/mcp" + +const client = createMerchantRealmMappingClient({ + baseUrl, + clientId, + clientSecret, + config: { headers: { "EP-Store-Id": storeId, "EP-Org-Id": orgId } }, +}) +merchantRealmMapping + .tools({ client }) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Register the read-only tools only: + +```ts +merchantRealmMapping + .tools({ client }) + .filter((t) => t.config._meta["com.elasticpath/operation"].risk === "read") + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Each tool is named `merchant_realm_mapping_`, and its arguments are grouped under `path`, +`query`, `headers` and `body`. The `path`, `query` and `headers` groups reject keys the spec does not +list. The `body` keeps them, so an attribute the spec does not list still reaches the API. The client +supplies the `Authorization` header, so no tool asks for it. Cancelling the MCP request cancels the +HTTP request. + +Each tool's description is written for a model choosing between tools: what the tool does, when to +use it rather than a similar tool, and any caveat that changes when to call it, in at most 600 +characters. The full spec description stays in the doc comment of the operation's function and its +tool factory. + +`config._meta["com.elasticpath/operation"]` holds the operation's `id`, `method`, `path` and `risk`. +The risk is `read`, `create`, `update` or `delete`, and the annotations follow from it. + ## Build URL If you need to access the compiled URL, you can use the buildUrl() method. It's loosely typed by default to accept almost any value; in practice, you will want to pass a type hint. @@ -188,34 +265,30 @@ If you need to access the compiled URL, you can use the buildUrl() method. It's ```ts type FooData = { path: { - fooId: number; - }; + fooId: number + } query?: { - bar?: string; - }; - url: '/foo/{fooId}'; -}; + bar?: string + } + url: "/foo/{fooId}" +} const url = client.buildUrl({ path: { fooId: 1, }, query: { - bar: 'baz', + bar: "baz", }, - url: '/foo/{fooId}', -}); -console.log(url); // prints '/foo/1?bar=baz' + url: "/foo/{fooId}", +}) +console.log(url) // prints '/foo/1?bar=baz' ``` - --- - - - - ## Operation Usage + The following examples demonstrate how to use the operation function to make requests. ```ts @@ -234,19 +307,12 @@ const product = await getMerchantRealmMapping({ --- - - ## Available Operations - - - **`getMerchantRealmMappings`** (`GET /v2/merchant-realm-mappings`) - **`getMerchantRealmMapping`** (`GET /v2/merchant-realm-mappings/{mapping_id}`) - **`updateMerchantRealmMapping`** (`PUT /v2/merchant-realm-mappings/{mapping_id}`) - - - ---- \ No newline at end of file +--- diff --git a/packages/sdks/merchant-realm-mapping/openapi-ts.config.ts b/packages/sdks/merchant-realm-mapping/openapi-ts.config.ts index b1c7461f8..77c487617 100644 --- a/packages/sdks/merchant-realm-mapping/openapi-ts.config.ts +++ b/packages/sdks/merchant-realm-mapping/openapi-ts.config.ts @@ -1,8 +1,9 @@ -import { defineConfig } from "@hey-api/openapi-ts" +import { $, defineConfig } from "@hey-api/openapi-ts" import { int64AsNumber } from "../specs/heyapi/int64-as-number" +import { mcpTools } from "../specs/heyapi/mcp-tools" export default defineConfig({ - input: "../specs/merchant-realm-mapping.yaml", + input: "../specs/bundled/merchant-realm-mapping_standalone.yaml", output: { path: "src/client", postProcess: ["prettier"] }, plugins: [ { @@ -16,5 +17,6 @@ export default defineConfig({ metadata: true, name: "zod", }, + mcpTools($, { api: "merchant_realm_mapping" }), ], }) diff --git a/packages/sdks/merchant-realm-mapping/package.json b/packages/sdks/merchant-realm-mapping/package.json index c7266f79a..40825ca66 100644 --- a/packages/sdks/merchant-realm-mapping/package.json +++ b/packages/sdks/merchant-realm-mapping/package.json @@ -7,8 +7,9 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "pnpm openapi-ts && pnpm build:tsup", + "build": "pnpm oas:build && pnpm openapi-ts && pnpm build:tsup", "build:tsup": "tsup", + "oas:build": "redocly bundle merchant-realm-mapping-standalone@v1 --config ../specs/config/redocly.yaml", "openapi-ts": "openapi-ts", "test": "vitest run", "test:watch": "vitest" @@ -34,12 +35,25 @@ "default": "./dist/zod.cjs" } }, + "./mcp": { + "import": { + "types": "./dist/mcp.d.ts", + "default": "./dist/mcp.mjs" + }, + "require": { + "types": "./dist/mcp.d.cts", + "default": "./dist/mcp.cjs" + } + }, "./package.json": "./package.json" }, "typesVersions": { "*": { "zod": [ "./dist/zod.d.ts" + ], + "mcp": [ + "./dist/mcp.d.ts" ] } }, @@ -55,6 +69,9 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.99.0", + "@modelcontextprotocol/sdk": "1.31.0", + "@redocly/cli": "^1.21.0", + "@redocly/openapi-core": "^1.21.0", "@types/ejs": "^3.1.5", "ejs": "^3.1.10", "esbuild-fix-imports-plugin": "^1.0.19", @@ -65,9 +82,13 @@ "zod": "4.6.5" }, "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.31.0", "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, "zod": { "optional": true } diff --git a/packages/sdks/merchant-realm-mapping/pnpm-lock.yaml b/packages/sdks/merchant-realm-mapping/pnpm-lock.yaml index 0cb6732b4..6648e9398 100644 --- a/packages/sdks/merchant-realm-mapping/pnpm-lock.yaml +++ b/packages/sdks/merchant-realm-mapping/pnpm-lock.yaml @@ -15,6 +15,15 @@ importers: '@hey-api/openapi-ts': specifier: 0.99.0 version: 0.99.0(typescript@5.8.2) + '@modelcontextprotocol/sdk': + specifier: 1.31.0 + version: 1.31.0(zod@4.6.5) + '@redocly/cli': + specifier: ^1.21.0 + version: 1.34.21(ajv@8.20.0) + '@redocly/openapi-core': + specifier: ^1.21.0 + version: 1.34.21 '@types/ejs': specifier: ^3.1.5 version: 3.1.5 @@ -42,6 +51,24 @@ importers: packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} @@ -348,6 +375,13 @@ packages: cpu: [x64] os: [win32] + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@hey-api/codegen-core@0.9.1': resolution: {integrity: sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==} engines: {node: '>=22.18.0'} @@ -373,10 +407,24 @@ packages: '@hey-api/types@0.1.4': resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -401,20 +449,146 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsep-plugin/assignment@1.4.0': + resolution: {integrity: sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.1.0': + resolution: {integrity: sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/cli@1.34.21': + resolution: {integrity: sha512-cWZMh6z6AqJ5Q2nQz2K5XhOnwVWcidtnk4NMjMvdHHpGtjnsPSWKg4fdyWhY46ze5SXu6GxFLTLbMoXGz2JJHA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.21': + resolution: {integrity: sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.21': + resolution: {integrity: sha512-4qTfsJJg51mHqOqcgkw9QLy4wHckt+tqWcBeqhl9/w+4tiOmku06Sx4DqW2a3732jHXIPd0/T1xsehNt4lOhXw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.40.0': resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] @@ -640,6 +814,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -658,6 +835,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@vitest/expect@3.2.7': resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} @@ -687,6 +867,29 @@ packages: '@vitest/utils@3.2.7': resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -703,6 +906,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -710,6 +917,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -720,15 +930,31 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.1: resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} @@ -739,6 +965,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.3.4: resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: @@ -751,6 +981,17 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -771,6 +1012,16 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -782,6 +1033,16 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -793,6 +1054,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -803,10 +1068,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -825,6 +1120,9 @@ packages: supports-color: optional: true + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -844,16 +1142,42 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -865,9 +1189,32 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} @@ -885,16 +1232,68 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -915,15 +1314,55 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -935,10 +1374,69 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -957,6 +1455,12 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -972,14 +1476,36 @@ packages: engines: {node: '>=10'} hasBin: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -987,6 +1513,36 @@ packages: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsep@1.6.0: + resolution: {integrity: sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==} + engines: {node: '>= 20.16.0'} + + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1001,15 +1557,58 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1017,14 +1616,50 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1036,20 +1671,98 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.12: resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openapi-sampler@1.7.0: + resolution: {integrity: sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==} + + openapi-sampler@1.7.6: + resolution: {integrity: sha512-MvWOm3vdgX7CZ6CNfu2wOFMGhC/pq03BxYTL/DKCkyPWfR6XIwUJnOV32mQGgCcUm1tY/y1jj7F2yqx1DieIWw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1058,6 +1771,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1068,6 +1784,9 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1083,9 +1802,21 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.3.3: resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1112,13 +1843,70 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@3.1.0: resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} + peerDependencies: + react: ^19.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1127,6 +1915,27 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} + redoc@2.5.3: + resolution: {integrity: sha512-bBbat+Sx6xKWdyoCGTtA0BWeTEW9Vs4VnEja7q7ZLOk4IM7cHQLrf+kDxWF6dKeKxT8kOBnoy/OsNXCeLttpyQ==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1144,15 +1953,47 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1161,6 +2002,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1168,10 +2043,21 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1179,9 +2065,16 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1190,6 +2083,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1201,6 +2097,28 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1210,6 +2128,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1243,6 +2165,13 @@ packages: resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -1272,11 +2201,49 @@ packages: typescript: optional: true + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici@6.29.0: + resolution: {integrity: sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1350,9 +2317,15 @@ packages: jsdom: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -1366,6 +2339,9 @@ packages: engines: {node: '>=8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1374,15 +2350,74 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.10': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.25.2': optional: true @@ -1536,6 +2571,10 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@hey-api/codegen-core@0.9.1': dependencies: '@hey-api/types': 0.1.4 @@ -1586,6 +2625,12 @@ snapshots: '@hey-api/types@0.1.4': {} + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@humanwhocodes/momoa@2.0.4': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1595,6 +2640,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1616,14 +2665,216 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsep-plugin/assignment@1.4.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + + '@jsep-plugin/regex@1.1.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + '@lukeed/ms@2.0.2': {} + '@modelcontextprotocol/sdk@1.31.0(zod@4.6.5)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) + transitivePeerDependencies: + - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@nodable/entities@3.1.0': {} + + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/cli@1.34.21(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.21 + '@redocly/respect-core': 1.34.21(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 4.0.3 + colorette: 1.4.0 + core-js: 3.32.1 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.0.1 + glob: 7.2.3 + handlebars: 4.7.10 + js-yaml: 4.3.2 + mobx: 6.12.3 + pluralize: 8.0.0 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + redoc: 2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)) + semver: 7.7.4 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.21': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.21(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.21 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.3.2 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.0 + openapi-sampler: 1.7.0 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.29.0 + transitivePeerDependencies: + - ajv + - supports-color + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -1759,6 +3010,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.63.5': optional: true + '@sinclair/typebox@0.27.12': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -1774,6 +3027,9 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/trusted-types@2.0.7': + optional: true + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -1816,6 +3072,28 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1826,18 +3104,47 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} + anynum@1.0.1: {} + argparse@2.0.1: {} assertion-error@2.0.1: {} async@3.2.6: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1847,6 +3154,8 @@ snapshots: dependencies: balanced-match: 1.0.2 + buffer-from@1.1.2: {} + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -1856,6 +3165,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + c12@3.3.4: dependencies: chokidar: 5.0.0 @@ -1873,6 +3184,18 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -1896,6 +3219,16 @@ snapshots: dependencies: readdirp: 5.1.1 + classnames@2.5.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1904,24 +3237,58 @@ snapshots: color-support@1.1.3: {} + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@15.0.0: {} commander@4.1.1: {} concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} consola@3.4.2: {} + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-js@3.32.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -1930,6 +3297,8 @@ snapshots: dependencies: ms: 2.1.3 + decko@1.2.0: {} + deep-eql@5.0.2: {} default-browser-id@5.0.1: {} @@ -1943,12 +3312,32 @@ snapshots: defu@6.1.7: {} + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + diff-sequences@29.6.3: {} + + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.4.7: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -1957,8 +3346,27 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-promise@3.3.1: {} + esbuild-fix-imports-plugin@1.0.19: {} esbuild-plugin-file-path-extensions@1.0.0: {} @@ -2020,35 +3428,163 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} + + escape-html@1.0.3: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 - expect-type@1.4.0: {} + etag@1.8.1: {} - exsolve@1.1.1: {} + event-target-shim@5.0.1: {} - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + eventemitter3@5.0.4: {} - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 + eventsource-parser@3.1.1: {} - filelist@1.0.4: + eventsource@3.0.7: dependencies: - minimatch: 5.1.6 + eventsource-parser: 3.1.1 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + expect-type@1.4.0: {} - fsevents@2.3.3: - optional: true + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3 + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color - get-tsconfig@4.14.0: + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.8: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + foreach@2.0.6: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2063,8 +3599,72 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-client@1.3.5: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -2075,6 +3675,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-promise@4.0.0: {} + + is-unsafe@2.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -2094,16 +3698,62 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jiti@2.7.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.2.0: dependencies: argparse: 2.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsep@1.6.0: {} + + json-pointer@0.6.2: + dependencies: + foreach: 2.0.6 + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.4.0(jsep@1.6.0) + '@jsep-plugin/regex': 1.1.0(jsep@1.6.0) + jsep: 1.6.0 + + jsonpointer@5.0.1: {} + + leven@3.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2112,14 +3762,42 @@ snapshots: lodash.sortby@4.7.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} + lunr@2.3.9: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + mark.js@8.11.1: {} + + marked@4.3.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2128,12 +3806,36 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mobx-react-lite@4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx-react@9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + mobx-react-lite: 4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react: 19.3.1 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx@6.12.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -2144,10 +3846,76 @@ snapshots: nanoid@3.3.19: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + neo-async@2.6.2: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.12: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.1 + open@11.0.0: dependencies: default-browser: 5.5.1 @@ -2157,8 +3925,30 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openapi-sampler@1.7.0: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + openapi-sampler@1.7.6: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + outdent@0.8.0: {} + package-json-from-dist@1.0.1: {} + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -2166,12 +3956,16 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} perfect-debounce@2.1.0: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@4.0.2: {} @@ -2180,12 +3974,20 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-types@2.3.3: dependencies: confbox: 0.3.1 exsolve: 1.1.1 pathe: 2.0.3 + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.10 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28): dependencies: lilconfig: 3.1.3 @@ -2201,17 +4003,118 @@ snapshots: powershell-utils@0.1.0: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + rc9@3.1.0: dependencies: defu: 6.1.7 destr: 2.0.5 + react-dom@19.3.1(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.28.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-tabs@6.1.1(react@19.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.3.1 + + react@19.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.1.1: {} + redoc@2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)): + dependencies: + '@redocly/openapi-core': 1.34.21 + classnames: 2.5.1 + core-js: 3.32.1 + decko: 1.2.0 + dompurify: 3.4.17 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.12.3 + mobx-react: 9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + openapi-sampler: 1.7.6 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + react-tabs: 6.1.1(react@19.3.1) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + + reftools@1.1.9: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -2274,30 +4177,151 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.63.5 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-applescript@7.1.0: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.28.0: {} + + semver@7.7.4: {} + semver@7.8.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} + simple-websocket@9.1.0: + dependencies: + debug: 4.4.3 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + slugify@1.4.7: {} + source-map-js@1.2.1: {} + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@3.10.0: {} + stickyfill@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2310,6 +4334,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2322,6 +4350,21 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.3.1 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -2336,6 +4379,22 @@ snapshots: dependencies: has-flag: 4.0.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2364,6 +4423,10 @@ snapshots: tinyspy@4.0.6: {} + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -2399,8 +4462,35 @@ snapshots: - tsx - yaml + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + typescript@5.8.2: {} + uglify-js@3.19.3: + optional: true + + undici@6.29.0: {} + + unpipe@1.0.0: {} + + uri-js-replace@1.0.1: {} + + url-template@2.0.8: {} + + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + vite-node@3.2.4(jiti@2.7.0): dependencies: cac: 6.7.14 @@ -2473,8 +4563,15 @@ snapshots: - tsx - yaml + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -2490,6 +4587,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2502,9 +4601,37 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-naming@0.3.0: {} + + y18n@5.0.8: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + zod-to-json-schema@3.25.2(zod@4.6.5): + dependencies: + zod: 4.6.5 + zod@4.6.5: {} diff --git a/packages/sdks/merchant-realm-mapping/src/client/mcp-support.gen.ts b/packages/sdks/merchant-realm-mapping/src/client/mcp-support.gen.ts new file mode 100644 index 000000000..5aedf66aa --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/src/client/mcp-support.gen.ts @@ -0,0 +1,260 @@ +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js" +import type { + CallToolResult, + ToolAnnotations, +} from "@modelcontextprotocol/sdk/types.js" +import * as z from "zod" + +export type OperationMeta = { + id: string + method: string + path: string + risk: "read" | "create" | "update" | "delete" +} + +export type ToolConfig = { + title?: string + description?: string + inputSchema: z.ZodObject>> + outputSchema?: AnySchema + annotations?: ToolAnnotations + _meta: { + "com.elasticpath/operation": OperationMeta + } +} + +export type Tool = { + readonly name: string + readonly config: ToolConfig + readonly handler: ToolCallback +} + +const messageOf = (error: unknown) => + error instanceof Error ? error.message : JSON.stringify(error) + +export const toToolResult = async ( + request: Promise<{ + data?: unknown + error?: unknown + response?: Response + }>, +): Promise => { + let text: string + try { + const result = await request + if (result.error === undefined) { + const structuredContent = + typeof result.data === "object" && + result.data !== null && + !Array.isArray(result.data) + ? (result.data as Record) + : { data: result.data ?? null } + return { + structuredContent, + content: [{ type: "text", text: JSON.stringify(structuredContent) }], + } + } + text = result.response + ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}` + : messageOf(result.error) + } catch (error) { + text = messageOf(error) + } + return { isError: true, content: [{ type: "text", text }] } +} + +export const loose = (schema: T): T => { + const def: any = schema._zod.def + const copy = (changes: object): T => + schema.clone({ ...def, ...changes }, { parent: true }) + if (def.type === "object") { + return copy({ + catchall: z.unknown(), + shape: Object.fromEntries( + Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]), + ), + }) + } + if (def.type === "array") { + return copy({ element: loose(def.element) }) + } + if (def.type === "record") { + return copy({ valueType: loose(def.valueType) }) + } + if (def.type === "lazy") { + return copy({ getter: () => loose(def.getter()) }) + } + if ( + [ + "optional", + "nullable", + "default", + "readonly", + "nonoptional", + "catch", + "prefault", + ].includes(def.type) + ) { + return copy({ innerType: loose(def.innerType) }) + } + if (def.type === "union") { + return copy({ options: def.options.map(loose) }) + } + if (def.type === "intersection") { + return copy({ left: loose(def.left), right: loose(def.right) }) + } + return schema +} + +type FileNameFields = { + [P in `${K}_name`]: z.ZodOptional +} + +export const dataUriFields = < + S extends z.ZodRawShape, + C extends z.core.$ZodObjectConfig, + K extends string, +>( + schema: z.ZodObject, + fields: ReadonlyArray, + maxBytes: number, +): z.ZodObject>, C> => + schema.extend( + Object.fromEntries( + fields.flatMap((field) => { + const current = schema.shape[field] as unknown as z.ZodType + const uri = z.string().meta({ + format: "uri", + "x-mcp-file": { maxSize: maxBytes }, + description: [ + current.description, + `Send the file as a data: URI, such as data:text/csv;base64,, at most ${maxBytes} bytes once decoded.`, + ] + .filter(Boolean) + .join(" "), + }) + const name = z + .string() + .meta({ + description: `The name of the file sent in ${field}, such as products.csv.`, + }) + .optional() + return [ + [field, current.isOptional() ? uri.optional() : uri], + [`${field}_name`, name], + ] + }), + ), + ) as unknown as z.ZodObject>, C> + +type DataUrisDecoded = T extends object + ? Omit & { + [P in K & keyof T]: undefined extends T[P] ? File | undefined : File + } + : T + +const DATA_URI = /^data:([^,]*),(.*)$/is +const PERCENT_ENCODED = /^[0-9a-f]{2}$/i + +const notADataUriError = (field: string) => + new Error( + `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`, + ) + +const fileTooBigError = (field: string, bytes: number, maxBytes: number) => + new Error( + `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`, + ) + +function percentDecoded(field: string, text: string) { + const bytes: number[] = [] + const encoder = new TextEncoder() + for (let index = 0; index < text.length; index++) { + if (text[index] === "%") { + const hex = text.slice(index + 1, index + 3) + if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field) + bytes.push(parseInt(hex, 16)) + index += 2 + } else { + const codePoint = text.codePointAt(index)! + const character = String.fromCodePoint(codePoint) + bytes.push(...encoder.encode(character)) + index += character.length - 1 + } + } + return new Uint8Array(bytes) +} + +function base64Decoded(field: string, text: string, maxBytes: number) { + const data = text.replace(/\s/g, "") + const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0 + const bytes = Math.floor((data.length * 3) / 4) - padding + if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes) + let binary: string + try { + binary = atob(data) + } catch { + throw new Error(`${field} is not valid base64`) + } + return Uint8Array.from(binary, (character) => character.charCodeAt(0)) +} + +function fileFromDataUri( + field: string, + uri: unknown, + maxBytes: number, + givenName: unknown, +) { + const match = typeof uri === "string" ? DATA_URI.exec(uri) : null + if (!match) throw notADataUriError(field) + const parameters = match[1]!.split(";") + const isBase64 = parameters.at(-1)!.toLowerCase() === "base64" + if (isBase64) parameters.pop() + const mediaType = parameters.shift()!.trim() + const nameParameter = parameters.find((parameter) => + parameter.trim().toLowerCase().startsWith("name="), + ) + let name = field + if (typeof givenName === "string" && givenName.trim()) { + name = givenName.trim() + } else if (nameParameter) { + try { + name = decodeURIComponent(nameParameter.trim().slice("name=".length)) + } catch { + throw notADataUriError(field) + } + } + const bytes = isBase64 + ? base64Decoded(field, match[2]!, maxBytes) + : percentDecoded(field, match[2]!) + if (bytes.length > maxBytes) + throw fileTooBigError(field, bytes.length, maxBytes) + return new File([bytes], name, { + type: mediaType.includes("/") ? mediaType : "text/plain", + }) +} + +export const decodeDataUris = async ( + body: T, + fields: ReadonlyArray, + maxBytes: number, +): Promise> => { + if (typeof body !== "object" || body === null) { + return body as DataUrisDecoded + } + const decoded = { ...body } as Record + for (const field of fields) { + const givenName = decoded[`${field}_name`] + delete decoded[`${field}_name`] + if (decoded[field] !== undefined) { + decoded[field] = fileFromDataUri( + field, + decoded[field], + maxBytes, + givenName, + ) + } + } + return decoded as DataUrisDecoded +} diff --git a/packages/sdks/merchant-realm-mapping/src/client/mcp.gen.ts b/packages/sdks/merchant-realm-mapping/src/client/mcp.gen.ts new file mode 100644 index 000000000..dffd673bf --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/src/client/mcp.gen.ts @@ -0,0 +1,171 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import * as z from "zod" + +import type { Client } from "./client" +import { loose, type Tool, toToolResult } from "./mcp-support.gen" +import { + getMerchantRealmMapping, + getMerchantRealmMappings, + updateMerchantRealmMapping, +} from "./sdk.gen" +import { + zGetMerchantRealmMappingPath, + zUpdateMerchantRealmMappingBody, + zUpdateMerchantRealmMappingPath, +} from "./zod.gen" + +type ToolOptions = { + client?: Client +} + +const getMerchantRealmMappingsInput = z.object({}).strict() + +/** + * Get the Merchant Realm Mapping for the current store + * + * This API is used to obtain an [Authentication Realm](/docs/authentication/single-sign-on/authentication-realm-api/authentication-realm-api-overview) if there is none yet for the current store. + * + */ +export const getMerchantRealmMappingsTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getMerchantRealmMappings({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "merchant_realm_mapping_get_merchant_realm_mappings" as const, + config: { + title: "Get the Merchant Realm Mapping for the current store", + description: + "Gets the merchant realm mapping for the current store, which links the store to the authentication realm administrators use to sign in with single sign-on. The mapping holds its ID, the store prefix, which can be null, the realm ID and the store ID.", + inputSchema: getMerchantRealmMappingsInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "merchant_realm_mapping.getMerchantRealmMappings", + method: "GET", + path: "/v2/merchant-realm-mappings", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const getMerchantRealmMappingInput = z + .object({ + path: zGetMerchantRealmMappingPath.strict(), + }) + .strict() + +/** + * Get a Merchant Realm Mapping + */ +export const getMerchantRealmMappingTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getMerchantRealmMapping({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "merchant_realm_mapping_get_merchant_realm_mapping" as const, + config: { + title: "Get a Merchant Realm Mapping", + description: + "Gets a merchant realm mapping by its ID, with its store prefix, realm ID and store ID. The prefix is used during sign-in to pick the authentication realm, and it can be null if none has been assigned.", + inputSchema: getMerchantRealmMappingInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "merchant_realm_mapping.getMerchantRealmMapping", + method: "GET", + path: "/v2/merchant-realm-mappings/{mapping_id}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const updateMerchantRealmMappingInput = z + .object({ + path: zUpdateMerchantRealmMappingPath.strict(), + body: loose(zUpdateMerchantRealmMappingBody), + }) + .strict() + +/** + * Update a Merchant Realm Mapping + */ +export const updateMerchantRealmMappingTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + updateMerchantRealmMapping({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "merchant_realm_mapping_update_merchant_realm_mapping" as const, + config: { + title: "Update a Merchant Realm Mapping", + description: + "Sets the store prefix on a merchant realm mapping, which administrators use during single sign-on to find the store's authentication realm. The prefix is required, and the request fails with a conflict if another mapping already uses it.", + inputSchema: updateMerchantRealmMappingInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "merchant_realm_mapping.updateMerchantRealmMapping", + method: "PUT", + path: "/v2/merchant-realm-mappings/{mapping_id}", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +export const tools = (options?: ToolOptions): Array => [ + getMerchantRealmMappingsTool(options), + getMerchantRealmMappingTool(options), + updateMerchantRealmMappingTool(options), +] diff --git a/packages/sdks/merchant-realm-mapping/src/mcp.test-d.ts b/packages/sdks/merchant-realm-mapping/src/mcp.test-d.ts new file mode 100644 index 000000000..b0cb78322 --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/src/mcp.test-d.ts @@ -0,0 +1,86 @@ +import { describe, expectTypeOf, it } from "vitest" +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { z } from "zod" +import type { GetMerchantRealmMappingData } from "./client/types.gen" +import { getMerchantRealmMappingTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +declare const server: McpServer + +describe("registering the generated tools", () => { + it("registers one tool with its name, config and handler", () => { + const tool = getMerchantRealmMappingTool() + + server.registerTool(tool.name, tool.config, tool.handler) + }) + + it("registers every tool from tools()", () => { + tools().forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("registers only the read-only tools", () => { + tools() + .filter( + (t) => t.config._meta["com.elasticpath/operation"].risk === "read", + ) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("rejects a tool without _meta or with an unknown risk", () => { + const register = (t: Tool) => + server.registerTool(t.name, t.config, t.handler) + const tool = getMerchantRealmMappingTool() + const { _meta, ...configWithoutMeta } = tool.config + const withoutMeta = { ...tool, config: configWithoutMeta } + const unknownRisk = { + ...tool, + config: { + ...tool.config, + _meta: { + "com.elasticpath/operation": { + ..._meta["com.elasticpath/operation"], + risk: "erase" as const, + }, + }, + }, + } + + register(tool) + // @ts-expect-error + register(withoutMeta) + // @ts-expect-error + register(unknownRisk) + }) + + it("keeps typed arguments in a wrapped handler", () => { + const tool = getMerchantRealmMappingTool() + + server.registerTool(tool.name, tool.config, (args, extra) => { + expectTypeOf(args.path).toEqualTypeOf< + GetMerchantRealmMappingData["path"] + >() + // @ts-expect-error + tool.handler({ colour: "red" }, extra) + return tool.handler(args, extra) + }) + }) + + it("registers every tool with an extended input that sets a header", () => { + tools().forEach((t) => + server.registerTool( + t.name, + { + ...t.config, + inputSchema: t.config.inputSchema.extend({ + store_id: z.string().describe("The Elastic Path store to act on."), + }), + }, + ({ store_id, ...args }, extra) => + t.handler( + { ...args, headers: { ...args.headers, "EP-Store-Id": store_id } }, + extra, + ), + ), + ) + }) +}) diff --git a/packages/sdks/merchant-realm-mapping/src/mcp.test.ts b/packages/sdks/merchant-realm-mapping/src/mcp.test.ts new file mode 100644 index 000000000..4eb1b93cc --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/src/mcp.test.ts @@ -0,0 +1,317 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { ToolSchema } from "@modelcontextprotocol/sdk/types.js" +import type { Tool as ListedTool } from "@modelcontextprotocol/sdk/types.js" +import fs from "node:fs" +import * as main from "./index" +import { client as defaultClient } from "./client/client.gen" +import * as mcp from "./mcp" +import { getMerchantRealmMappingsTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +const baseUrl = "https://useast.api.elasticpath.com" +const OPERATION = "com.elasticpath/operation" + +function stubFetch(body: unknown, status = 200) { + const requests: Request[] = [] + const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push( + input instanceof Request && init === undefined + ? input + : new Request(input, init), + ) + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json" }, + }) + }) as typeof globalThis.fetch + return { requests, fetch } +} + +const clientWith = ( + fetch: typeof globalThis.fetch, + config?: { headers: Record }, +) => + main.createMerchantRealmMappingClient({ + baseUrl, + token: "pre-issued", + fetch, + retry: false, + config, + }) + +const extraWith = (signal = new AbortController().signal) => + ({ signal }) as Parameters[1] + +async function connect(registered: Tool[]) { + const server = new McpServer({ + name: "merchant-realm-mapping", + version: "1.0.0", + }) + registered.forEach((t) => server.registerTool(t.name, t.config, t.handler)) + const mcpClient = new Client({ name: "test-client", version: "1.0.0" }) + const [clientSide, serverSide] = InMemoryTransport.createLinkedPair() + await Promise.all([server.connect(serverSide), mcpClient.connect(clientSide)]) + return mcpClient +} + +const functionNamesInOperationOrder = () => + [ + ...fs + .readFileSync(new URL("./client/sdk.gen.ts", import.meta.url), "utf8") + .matchAll(/^export const (\w+) =/gm), + ].map((match) => match[1]!) + +const operationOf = (tool: Tool) => tool.config._meta[OPERATION] + +const overrides = new URL( + "../../specs/overrides/mcp/merchant-realm-mapping/", + import.meta.url, +) + +const writtenDescriptions = () => + fs.readdirSync(overrides).map((file) => + fs + .readFileSync(new URL(file, overrides), "utf8") + .split("x-mcp-description: >-")[1]! + .split(/\n(?=\S)/)[0]! + .trim() + .split(/\s*\n\s*/) + .join(" "), + ) + +describe("tools", () => { + it("holds 3 tools with valid, unique names, in operation order", () => { + const names = tools().map((tool) => tool.name) + + expect(names).toHaveLength(3) + for (const name of names) expect(name).toMatch(/^[a-zA-Z0-9_-]{1,64}$/) + expect(new Set(names).size).toBe(3) + expect(tools().map((tool) => operationOf(tool).id)).toEqual( + functionNamesInOperationOrder().map( + (name) => `merchant_realm_mapping.${name}`, + ), + ) + }) + + it("exports one tool factory for each operation", () => { + const factories = Object.keys(mcp).filter((name) => name.endsWith("Tool")) + + expect(factories).toHaveLength(3) + }) + + describe("sends each tool's request to its own operation's method and path", () => { + const { requests, fetch } = stubFetch({}) + const client = clientWith(fetch) + + it.each(tools({ client }).map((tool) => [tool.name, tool] as const))( + "%s", + async (_name, tool) => { + requests.length = 0 + const { method, path } = operationOf(tool) + const params = [...path.matchAll(/\{([^}]+)\}/g)].map( + (match) => match[1]!, + ) + const args: Record = {} + if (params.length > 0) { + args.path = Object.fromEntries(params.map((p) => [p, `p-${p}`])) + } + if ("body" in tool.config.inputSchema.shape) args.body = {} + + await tool.handler(args, extraWith()) + + expect(requests).toHaveLength(1) + expect(requests[0]!.method).toBe(method) + expect(new URL(requests[0]!.url).pathname).toBe( + path.replace(/\{([^}]+)\}/g, (_match, p) => `p-${p}`), + ) + }, + ) + }) +}) + +describe("the client a tool calls through", () => { + const response = { data: [] } + let original: ReturnType + let viaDefault: ReturnType + + beforeEach(() => { + original = defaultClient.getConfig() + viaDefault = stubFetch(response) + defaultClient.setConfig({ fetch: viaDefault.fetch }) + }) + + afterEach(() => { + defaultClient.setConfig({ + ...original, + auth: original.auth, + fetch: original.fetch, + }) + }) + + it("calls through the package's default client when no client is given", async () => { + const result = await getMerchantRealmMappingsTool().handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(1) + expect(viaDefault.requests[0]!.url).toBe( + `${original.baseUrl}/v2/merchant-realm-mappings`, + ) + expect(result.structuredContent).toEqual(response) + }) + + it("sends the credentials of a default client configured from a merchant realm mapping client", async () => { + defaultClient.setConfig(clientWith(viaDefault.fetch).getConfig()) + + await getMerchantRealmMappingsTool().handler({}, extraWith()) + + expect(viaDefault.requests[0]!.headers.get("Authorization")).toBe( + "Bearer pre-issued", + ) + }) + + it("uses a given client instead of the default", async () => { + const viaGiven = stubFetch(response) + + await getMerchantRealmMappingsTool({ + client: clientWith(viaGiven.fetch), + }).handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(0) + expect(viaGiven.requests).toHaveLength(1) + const url = new URL(viaGiven.requests[0]!.url) + expect(url.origin + url.pathname).toBe( + `${baseUrl}/v2/merchant-realm-mappings`, + ) + }) + + it("sends headers configured on the client with every tool call", async () => { + const { requests, fetch } = stubFetch(response) + const client = clientWith(fetch, { + headers: { "EP-Store-Id": "store-1", "EP-Org-Id": "org-1" }, + }) + + await getMerchantRealmMappingsTool({ client }).handler({}, extraWith()) + + expect(requests[0]!.headers.get("EP-Store-Id")).toBe("store-1") + expect(requests[0]!.headers.get("EP-Org-Id")).toBe("org-1") + }) +}) + +describe("a tool's handler", () => { + it("aborts the request when the MCP request is cancelled", async () => { + const { requests, fetch } = stubFetch({}) + const controller = new AbortController() + + await getMerchantRealmMappingsTool({ client: clientWith(fetch) }).handler( + {}, + extraWith(controller.signal), + ) + expect(requests[0]!.signal.aborted).toBe(false) + controller.abort() + + expect(requests[0]!.signal.aborted).toBe(true) + }) + + it("returns an API error as an isError result with the HTTP status", async () => { + const errors = { errors: [{ status: 404, title: "Not Found" }] } + const { fetch } = stubFetch(errors, 404) + + const result = await getMerchantRealmMappingsTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result).toEqual({ + isError: true, + content: [{ type: "text", text: `HTTP 404: ${JSON.stringify(errors)}` }], + }) + }) + + it("returns a network failure as an isError result with its message", async () => { + const fetch = (async () => { + throw new TypeError("fetch failed") + }) as typeof globalThis.fetch + + const result = await getMerchantRealmMappingsTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result.isError).toBe(true) + expect(result.content).toEqual([ + { type: "text", text: expect.stringContaining("fetch failed") }, + ]) + }) +}) + +describe("a tool's description", () => { + it("is the description written for it in the spec overrides, for every tool", () => { + expect( + tools() + .map((tool) => tool.config.description) + .sort(), + ).toEqual(writtenDescriptions().sort()) + }) +}) + +describe("the merchant realm mapping tools on an MCP server", () => { + let listed: ListedTool[] + + beforeAll(async () => { + const mcpClient = await connect( + tools({ client: clientWith(stubFetch({}).fetch) }), + ) + listed = (await mcpClient.listTools()).tools + }) + + it("describes every tool in at most 600 characters", () => { + for (const tool of listed) { + expect(tool.description!.length, tool.name).toBeLessThanOrEqual(600) + } + }) + + it("lists all 3, each passing the MCP SDK's ToolSchema", () => { + expect(listed).toHaveLength(3) + for (const tool of listed) { + expect(ToolSchema.safeParse(tool).success, tool.name).toBe(true) + } + }) + + it("asks no tool for an Authorization header", () => { + for (const tool of listed) { + const headers = (tool.inputSchema.properties as Record) + ?.headers + const names = Object.keys(headers?.properties ?? {}) + + expect(names.map((name) => name.toLowerCase())).not.toContain( + "authorization", + ) + } + }) + + it("sends a call through the given client and returns the data", async () => { + const response = { data: [] } + const { requests, fetch } = stubFetch(response) + const mcpClient = await connect(tools({ client: clientWith(fetch) })) + + const result = await mcpClient.callTool({ + name: "merchant_realm_mapping_get_merchant_realm_mappings", + arguments: {}, + }) + + expect(requests).toHaveLength(1) + const url = new URL(requests[0]!.url) + expect(url.origin + url.pathname).toBe( + `${baseUrl}/v2/merchant-realm-mappings`, + ) + expect(requests[0]!.headers.get("Authorization")).toBe("Bearer pre-issued") + expect(result.structuredContent).toEqual(response) + }) +}) + +describe("the main entry", () => { + it("exports no MCP code", () => { + expect(main).not.toHaveProperty("tools") + expect(main).not.toHaveProperty("getMerchantRealmMappingsTool") + }) +}) diff --git a/packages/sdks/merchant-realm-mapping/src/mcp.ts b/packages/sdks/merchant-realm-mapping/src/mcp.ts new file mode 100644 index 000000000..fda10e5a5 --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/src/mcp.ts @@ -0,0 +1,2 @@ +export * from "./client/mcp.gen" +export type { OperationMeta, Tool, ToolConfig } from "./client/mcp-support.gen" diff --git a/packages/sdks/merchant-realm-mapping/test-cjs-minimal.cjs b/packages/sdks/merchant-realm-mapping/test-cjs-minimal.cjs index 8af8a1db8..4a86c2849 100644 --- a/packages/sdks/merchant-realm-mapping/test-cjs-minimal.cjs +++ b/packages/sdks/merchant-realm-mapping/test-cjs-minimal.cjs @@ -1,5 +1,7 @@ // This file is used to test that CommonJS requires work correctly const MerchantRealmMapping = require("./dist/index.cjs") +const mcp = require("./dist/mcp.cjs") console.log("MerchantRealmMapping:", Object.keys(MerchantRealmMapping)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/merchant-realm-mapping/test-esm-minimal.mjs b/packages/sdks/merchant-realm-mapping/test-esm-minimal.mjs index 39f218aeb..d1a751763 100644 --- a/packages/sdks/merchant-realm-mapping/test-esm-minimal.mjs +++ b/packages/sdks/merchant-realm-mapping/test-esm-minimal.mjs @@ -1,5 +1,7 @@ // This file is used to test that ESM imports work correctly import * as MerchantRealmMapping from "./dist/index.mjs" +import * as mcp from "./dist/mcp.mjs" console.log("MerchantRealmMapping:", Object.keys(MerchantRealmMapping)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/merchant-realm-mapping/test/built-output.test.ts b/packages/sdks/merchant-realm-mapping/test/built-output.test.ts new file mode 100644 index 000000000..70bbe4f0f --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/test/built-output.test.ts @@ -0,0 +1,99 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { build } from "tsup" +import type { Options } from "tsup" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import tsupConfig from "../tsup.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const outDir = path.join(here, ".generated-dist") + +const SPECIFIER = + /(?:\bfrom\s*|\bimport\s*\(\s*|\brequire\s*\(\s*|^\s*import\s+)["']([^"']+)["']/gm + +function specifiersIn(file: string) { + const source = fs.readFileSync(file, "utf8") + return [...source.matchAll(SPECIFIER)].map((match) => match[1]!) +} + +function importGraph(entry: string) { + const files = new Set() + const packages = new Set() + const pending = [path.join(outDir, entry)] + while (pending.length > 0) { + const file = pending.pop()! + if (files.has(file)) continue + files.add(file) + for (const specifier of specifiersIn(file)) { + if (specifier.startsWith(".")) { + pending.push(path.resolve(path.dirname(file), specifier)) + } else { + packages.add(specifier) + } + } + } + return { + files: [...files].map((file) => path.relative(outDir, file)), + packages: [...packages], + } +} + +function builtFiles(directory = outDir): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(directory, entry.name) + if (entry.isDirectory()) return builtFiles(full) + return /\.(mjs|cjs)$/.test(entry.name) ? [full] : [] + }) +} + +beforeAll(async () => { + await build({ + ...(tsupConfig as Options), + config: false, + dts: false, + outDir, + silent: true, + sourcemap: false, + }) +}, 120_000) + +afterAll(() => { + fs.rmSync(outDir, { force: true, recursive: true }) +}) + +describe("the built package", () => { + it.each(["index.mjs", "index.cjs"])( + "reaches no MCP code from the main entry, %s", + (entry) => { + const graph = importGraph(entry) + + expect(graph.files).toContain( + path.join("client", `sdk.gen.${entry.split(".")[1]}`), + ) + expect(graph.files.filter((file) => file.includes("mcp"))).toEqual([]) + expect(graph.packages.filter((name) => name.includes("mcp"))).toEqual([]) + }, + ) + + it.each(["mcp.mjs", "mcp.cjs"])( + "reaches the generated tools from %s", + (entry) => { + const graph = importGraph(entry) + const extension = entry.split(".")[1] + + expect(graph.files).toContain(path.join("client", `mcp.gen.${extension}`)) + }, + ) + + it("imports the MCP SDK nowhere, because it is a type-only peer", () => { + for (const file of builtFiles()) { + expect( + specifiersIn(file).filter((name) => + name.includes("modelcontextprotocol"), + ), + file, + ).toEqual([]) + } + }) +}) diff --git a/packages/sdks/merchant-realm-mapping/test/mcp-generation.test.ts b/packages/sdks/merchant-realm-mapping/test/mcp-generation.test.ts new file mode 100644 index 000000000..b58af2d4e --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/test/mcp-generation.test.ts @@ -0,0 +1,74 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { createClient } from "@hey-api/openapi-ts" +import { execFileSync } from "node:child_process" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import config from "../openapi-ts.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const packageRoot = path.join(here, "..") +const committed = path.join(packageRoot, "src/client") +const firstRun = path.join(here, ".generated-mcp-first") +const secondRun = path.join(here, ".generated-mcp-second") +const workspaceBin = path.join(packageRoot, "../../../node_modules/.bin") +const mainEntryFiles = ["index.ts", "sdk.gen.ts", "types.gen.ts", "zod.gen.ts"] +const mcpFiles = ["mcp.gen.ts", "mcp-support.gen.ts"] + +const read = (directory: string, file: string) => + fs.readFileSync(path.join(directory, file), "utf8") + +async function generateInto(directory: string) { + const userConfig = await config + await createClient({ + ...userConfig, + input: path.join(packageRoot, "../specs/bundled/merchant-realm-mapping_standalone.yaml"), + output: { ...(userConfig.output as object), path: directory }, + }) +} + +beforeAll(async () => { + process.env.PATH = [workspaceBin, process.env.PATH].join(path.delimiter) + execFileSync( + path.join(packageRoot, "node_modules/.bin/redocly"), + [ + "bundle", + "merchant-realm-mapping-standalone@v1", + "--config", + "../specs/config/redocly.yaml", + ], + { cwd: packageRoot, stdio: "pipe" }, + ) + await generateInto(firstRun) + await generateInto(secondRun) +}, 120_000) + +afterAll(() => { + for (const directory of [firstRun, secondRun]) { + fs.rmSync(directory, { force: true, recursive: true }) + } +}) + +describe("generating the ./mcp export", () => { + it("writes the same MCP files byte for byte each time", () => { + for (const file of mcpFiles) { + expect(read(secondRun, file), file).toBe(read(firstRun, file)) + } + }) + + it("matches the committed MCP files", () => { + for (const file of mcpFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("leaves the main entry's generated files as committed", () => { + for (const file of mainEntryFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("keeps the MCP files out of the generated entry", () => { + expect(read(firstRun, "index.ts")).not.toContain("mcp") + }) +}) diff --git a/packages/sdks/merchant-realm-mapping/tsconfig.test.json b/packages/sdks/merchant-realm-mapping/tsconfig.test.json new file mode 100644 index 000000000..fc8520e73 --- /dev/null +++ b/packages/sdks/merchant-realm-mapping/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/sdks/merchant-realm-mapping/tsup.config.ts b/packages/sdks/merchant-realm-mapping/tsup.config.ts index 91c898b67..44169c968 100644 --- a/packages/sdks/merchant-realm-mapping/tsup.config.ts +++ b/packages/sdks/merchant-realm-mapping/tsup.config.ts @@ -6,7 +6,7 @@ import { } from "esbuild-fix-imports-plugin" export default defineConfig({ - entry: ["src/**/*.ts", "!src/**/*.test.ts"], + entry: ["src/**/*.ts", "!src/**/*.test.ts", "!src/**/*.test-d.ts"], format: ["esm", "cjs"], dts: true, splitting: false, diff --git a/packages/sdks/merchant-realm-mapping/vitest.config.ts b/packages/sdks/merchant-realm-mapping/vitest.config.ts index b7b707f74..4b27a5bb8 100644 --- a/packages/sdks/merchant-realm-mapping/vitest.config.ts +++ b/packages/sdks/merchant-realm-mapping/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from "vitest/config" export default defineConfig({ test: { include: ["**/*.{test,spec}.{js,ts}"], + typecheck: { + enabled: true, + include: ["src/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, }, }) diff --git a/packages/sdks/permissions/README.md b/packages/sdks/permissions/README.md index 8e6e11faf..da73dfa92 100644 --- a/packages/sdks/permissions/README.md +++ b/packages/sdks/permissions/README.md @@ -2,7 +2,6 @@ Below you'll find instructions on how to install, set up, and use the client, along with a list of available operations. - ## Features - type-safe response data and errors @@ -13,7 +12,6 @@ Below you'll find instructions on how to install, set up, and use the client, al --- - ## Installation ```bash @@ -28,7 +26,6 @@ yarn add @epcc-sdk/permissions ## Client Usage - Clients are responsible for sending the actual HTTP requests. The Fetch client is built as a thin wrapper on top of Fetch API, extending its functionality. If you're already familiar with Fetch, configuring your client will feel like working directly with Fetch API. @@ -40,23 +37,22 @@ You can configure the client in two ways: **When using the operation function to make requests, by default the global client will be used unless another is provided.** - ### 1. Configure the internal `client` instance directly This is the simpler approach. You can call the setConfig() method at the beginning of your application or anytime you need to update the client configuration. You can pass any Fetch API configuration option to setConfig(), and even your own Fetch implementation. ```ts -import { client } from "@epcc-sdk/permissions"; +import { client } from "@epcc-sdk/permissions" client.setConfig({ -// set default base url for requests -baseUrl: 'https://euwest.api.elasticpath.com', + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", -// set default headers for requests -headers: { -Authorization: 'Bearer YOUR_AUTH_TOKEN', -}, -}); + // set default headers for requests + headers: { + Authorization: "Bearer YOUR_AUTH_TOKEN", + }, +}) ``` The disadvantage of this approach is that your code may call the client instance before it's configured for the first time. Depending on your use case, you might need to use the second approach. @@ -66,27 +62,27 @@ The disadvantage of this approach is that your code may call the client instance This is useful when you want to use a different instance of the client for different parts of your application or when you want to use different configurations for different parts of your application. ```ts -import { createClient } from "@epcc-sdk/permissions"; +import { createClient } from "@epcc-sdk/permissions" // Create the client with your API base URL. const client = createClient({ - // set default base url for requests - baseUrl: "https://euwest.api.elasticpath.com", - /** - * Set default headers only for requests made by this client. - */ - headers: { - "Custom-Header": 'My Value', - }, -}); + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", + /** + * Set default headers only for requests made by this client. + */ + headers: { + "Custom-Header": "My Value", + }, +}) ``` You can also pass this instance to any SDK function through the client option. This will override the default instance from `import { client } from "@epcc-sdk/permissions>". ```ts const response = await getABuiltInRole({ - client: myClient, -}); + client: myClient, +}) ``` ### Direct configuration @@ -95,8 +91,8 @@ Alternatively, you can pass the client configuration options to each SDK functio ```ts const response = await getABuiltInRole({ - baseUrl: 'https://example.com', // <-- override default configuration -}); + baseUrl: "https://example.com", // <-- override default configuration +}) ``` ## Interceptors (Middleware) @@ -104,35 +100,34 @@ const response = await getABuiltInRole({ Interceptors (middleware) can be used to modify requests before they're sent or responses before they're returned to your application. They can be added with use and removed with eject. Below is an example request interceptor ```ts -import { client } from "@epcc-sdk/permissions"; +import { client } from "@epcc-sdk/permissions" // Supports async functions client.interceptors.request.use(async (request) => { - // do something - return request; -}); + // do something + return request +}) client.interceptors.request.eject((request) => { - // do something - return request; -}); - + // do something + return request +}) ``` and an example response interceptor ```ts -import { client } from "@epcc-sdk/permissions"; +import { client } from "@epcc-sdk/permissions" client.interceptors.response.use((response) => { - // do something - return response; -}); + // do something + return response +}) client.interceptors.response.eject((response) => { - // do something - return response; -}); + // do something + return response +}) ``` > **_Tip:_** To eject, you must provide a reference to the function that was passed to use(). @@ -146,15 +141,15 @@ source, sets the `auth` hook, refreshes and replays once on a 401, and backs off import { createPermissionsClient, listStandardUserRoles, -} from "@epcc-sdk/permissions"; +} from "@epcc-sdk/permissions" const client = createPermissionsClient({ baseUrl: "https://euwest.api.elasticpath.com", clientId: process.env.EPCC_CLIENT_ID!, clientSecret: process.env.EPCC_CLIENT_SECRET!, -}); +}) -const { data } = await listStandardUserRoles({ client }); +const { data } = await listStandardUserRoles({ client }) ``` Credentials come from `source`, `provider`, `token`, `clientId` plus `clientSecret`, or @@ -176,11 +171,83 @@ Zod schemas for every request body, path and response are published under the `/ subpath. `zod` is an optional peer dependency (4.x), so the root entry never imports it. ```ts -import { zStandardUserRole } from "@epcc-sdk/permissions/zod"; +import { zStandardUserRole } from "@epcc-sdk/permissions/zod" -const role = zStandardUserRole.parse(data?.data?.[0]); +const role = zStandardUserRole.parse(data?.data?.[0]) ``` +## MCP endpoint tools + +The `/mcp` subpath turns each of the 9 permissions operations into a Model Context Protocol (MCP) tool. +The main entry imports none of it. `zod` 4 and `@modelcontextprotocol/sdk` are needed only for this +subpath. + +Each operation has one tool factory, named after its function with `Tool` added, such as +`listStandardUserRolesTool`. A factory returns `{ name, config, handler }`, the three arguments that +`McpServer.registerTool` takes. `tools()` returns all 9 in operation order. A handler returns an API +error as an `isError` result and does not throw. + +Register one tool: + +```ts +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { listStandardUserRolesTool } from "@epcc-sdk/permissions/mcp" + +const server = new McpServer({ name: "permissions", version: "1.0.0" }) +const tool = listStandardUserRolesTool() +server.registerTool(tool.name, tool.config, tool.handler) +``` + +A tool built without a client calls through the package's module level `client`, like an operation +does. That client has no credentials until you configure it. Configure it once: + +```ts +import { client, createPermissionsClient } from "@epcc-sdk/permissions" + +client.setConfig( + createPermissionsClient({ baseUrl, clientId, clientSecret }).getConfig(), +) +``` + +Register every tool, with a client that sends the same headers on every call: + +```ts +import * as permissions from "@epcc-sdk/permissions/mcp" + +const client = createPermissionsClient({ + baseUrl, + clientId, + clientSecret, + config: { headers: { "EP-Store-Id": storeId, "EP-Org-Id": orgId } }, +}) +permissions + .tools({ client }) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Register the read-only tools only: + +```ts +permissions + .tools({ client }) + .filter((t) => t.config._meta["com.elasticpath/operation"].risk === "read") + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Each tool is named `permissions_`, and its arguments are grouped under `path`, +`query`, `headers` and `body`. The `path`, `query` and `headers` groups reject keys the spec does not +list. The `body` keeps them, so an attribute the spec does not list still reaches the API. The client +supplies the `Authorization` header, so no tool asks for it. Cancelling the MCP request cancels the +HTTP request. + +Each tool's description is written for a model choosing between tools: what the tool does, when to +use it rather than a similar tool, and any caveat that changes when to call it, in at most 600 +characters. The full spec description stays in the doc comment of the operation's function and its +tool factory. + +`config._meta["com.elasticpath/operation"]` holds the operation's `id`, `method`, `path` and `risk`. +The risk is `read`, `create`, `update` or `delete`, and the annotations follow from it. + ## Build URL If you need to access the compiled URL, you can use the buildUrl() method. It's loosely typed by default to accept almost any value; in practice, you will want to pass a type hint. @@ -188,34 +255,30 @@ If you need to access the compiled URL, you can use the buildUrl() method. It's ```ts type FooData = { path: { - fooId: number; - }; + fooId: number + } query?: { - bar?: string; - }; - url: '/foo/{fooId}'; -}; + bar?: string + } + url: "/foo/{fooId}" +} const url = client.buildUrl({ path: { fooId: 1, }, query: { - bar: 'baz', + bar: "baz", }, - url: '/foo/{fooId}', -}); -console.log(url); // prints '/foo/1?bar=baz' + url: "/foo/{fooId}", +}) +console.log(url) // prints '/foo/1?bar=baz' ``` - --- - - - - ## Operation Usage + The following examples demonstrate how to use the operation function to make requests. ```ts @@ -234,12 +297,8 @@ const product = await getABuiltInRole({ --- - - ## Available Operations - - - **`listBuiltInRoles`** (`GET /v2/permissions/built-in-roles`) - **`getABuiltInRole`** (`GET /v2/permissions/built-in-roles/{built_in_role_id}`) @@ -254,7 +313,4 @@ const product = await getABuiltInRole({ - **`updateACustomApiRolePolicy`** (`PUT /v2/permissions/custom-api-role-policies/{custom_api_role_policy_id}`) - - - ---- \ No newline at end of file +--- diff --git a/packages/sdks/permissions/openapi-ts.config.ts b/packages/sdks/permissions/openapi-ts.config.ts index 5b86e150d..9bb99f397 100644 --- a/packages/sdks/permissions/openapi-ts.config.ts +++ b/packages/sdks/permissions/openapi-ts.config.ts @@ -1,8 +1,9 @@ -import { defineConfig } from "@hey-api/openapi-ts" +import { $, defineConfig } from "@hey-api/openapi-ts" import { int64AsNumber } from "../specs/heyapi/int64-as-number" +import { mcpTools } from "../specs/heyapi/mcp-tools" export default defineConfig({ - input: "../specs/permissions.yaml", + input: "../specs/bundled/permissions_standalone.yaml", output: { path: "src/client", postProcess: ["prettier"] }, plugins: [ { @@ -16,5 +17,6 @@ export default defineConfig({ metadata: true, name: "zod", }, + mcpTools($, { api: "permissions" }), ], }) diff --git a/packages/sdks/permissions/package.json b/packages/sdks/permissions/package.json index a07216f7a..d02e50a27 100644 --- a/packages/sdks/permissions/package.json +++ b/packages/sdks/permissions/package.json @@ -7,8 +7,9 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "pnpm openapi-ts && pnpm build:tsup", + "build": "pnpm oas:build && pnpm openapi-ts && pnpm build:tsup", "build:tsup": "tsup", + "oas:build": "redocly bundle permissions-standalone@v1 --config ../specs/config/redocly.yaml", "openapi-ts": "openapi-ts", "test": "vitest run", "test:watch": "vitest" @@ -34,12 +35,25 @@ "default": "./dist/zod.cjs" } }, + "./mcp": { + "import": { + "types": "./dist/mcp.d.ts", + "default": "./dist/mcp.mjs" + }, + "require": { + "types": "./dist/mcp.d.cts", + "default": "./dist/mcp.cjs" + } + }, "./package.json": "./package.json" }, "typesVersions": { "*": { "zod": [ "./dist/zod.d.ts" + ], + "mcp": [ + "./dist/mcp.d.ts" ] } }, @@ -55,6 +69,9 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.99.0", + "@modelcontextprotocol/sdk": "1.31.0", + "@redocly/cli": "^1.21.0", + "@redocly/openapi-core": "^1.21.0", "@types/ejs": "^3.1.5", "ejs": "^3.1.10", "esbuild-fix-imports-plugin": "^1.0.19", @@ -65,9 +82,13 @@ "zod": "4.6.5" }, "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.31.0", "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, "zod": { "optional": true } diff --git a/packages/sdks/permissions/pnpm-lock.yaml b/packages/sdks/permissions/pnpm-lock.yaml index 0cb6732b4..6648e9398 100644 --- a/packages/sdks/permissions/pnpm-lock.yaml +++ b/packages/sdks/permissions/pnpm-lock.yaml @@ -15,6 +15,15 @@ importers: '@hey-api/openapi-ts': specifier: 0.99.0 version: 0.99.0(typescript@5.8.2) + '@modelcontextprotocol/sdk': + specifier: 1.31.0 + version: 1.31.0(zod@4.6.5) + '@redocly/cli': + specifier: ^1.21.0 + version: 1.34.21(ajv@8.20.0) + '@redocly/openapi-core': + specifier: ^1.21.0 + version: 1.34.21 '@types/ejs': specifier: ^3.1.5 version: 3.1.5 @@ -42,6 +51,24 @@ importers: packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} @@ -348,6 +375,13 @@ packages: cpu: [x64] os: [win32] + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@hey-api/codegen-core@0.9.1': resolution: {integrity: sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==} engines: {node: '>=22.18.0'} @@ -373,10 +407,24 @@ packages: '@hey-api/types@0.1.4': resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -401,20 +449,146 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsep-plugin/assignment@1.4.0': + resolution: {integrity: sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.1.0': + resolution: {integrity: sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/cli@1.34.21': + resolution: {integrity: sha512-cWZMh6z6AqJ5Q2nQz2K5XhOnwVWcidtnk4NMjMvdHHpGtjnsPSWKg4fdyWhY46ze5SXu6GxFLTLbMoXGz2JJHA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.21': + resolution: {integrity: sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.21': + resolution: {integrity: sha512-4qTfsJJg51mHqOqcgkw9QLy4wHckt+tqWcBeqhl9/w+4tiOmku06Sx4DqW2a3732jHXIPd0/T1xsehNt4lOhXw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.40.0': resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] @@ -640,6 +814,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -658,6 +835,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@vitest/expect@3.2.7': resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} @@ -687,6 +867,29 @@ packages: '@vitest/utils@3.2.7': resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -703,6 +906,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -710,6 +917,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -720,15 +930,31 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.1: resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} @@ -739,6 +965,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.3.4: resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: @@ -751,6 +981,17 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -771,6 +1012,16 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -782,6 +1033,16 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -793,6 +1054,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -803,10 +1068,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -825,6 +1120,9 @@ packages: supports-color: optional: true + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -844,16 +1142,42 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -865,9 +1189,32 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} @@ -885,16 +1232,68 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -915,15 +1314,55 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -935,10 +1374,69 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -957,6 +1455,12 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -972,14 +1476,36 @@ packages: engines: {node: '>=10'} hasBin: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -987,6 +1513,36 @@ packages: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsep@1.6.0: + resolution: {integrity: sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==} + engines: {node: '>= 20.16.0'} + + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1001,15 +1557,58 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1017,14 +1616,50 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1036,20 +1671,98 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.12: resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openapi-sampler@1.7.0: + resolution: {integrity: sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==} + + openapi-sampler@1.7.6: + resolution: {integrity: sha512-MvWOm3vdgX7CZ6CNfu2wOFMGhC/pq03BxYTL/DKCkyPWfR6XIwUJnOV32mQGgCcUm1tY/y1jj7F2yqx1DieIWw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1058,6 +1771,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1068,6 +1784,9 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1083,9 +1802,21 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.3.3: resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1112,13 +1843,70 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@3.1.0: resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} + peerDependencies: + react: ^19.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1127,6 +1915,27 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} + redoc@2.5.3: + resolution: {integrity: sha512-bBbat+Sx6xKWdyoCGTtA0BWeTEW9Vs4VnEja7q7ZLOk4IM7cHQLrf+kDxWF6dKeKxT8kOBnoy/OsNXCeLttpyQ==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1144,15 +1953,47 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1161,6 +2002,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1168,10 +2043,21 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1179,9 +2065,16 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1190,6 +2083,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1201,6 +2097,28 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1210,6 +2128,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1243,6 +2165,13 @@ packages: resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -1272,11 +2201,49 @@ packages: typescript: optional: true + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici@6.29.0: + resolution: {integrity: sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1350,9 +2317,15 @@ packages: jsdom: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -1366,6 +2339,9 @@ packages: engines: {node: '>=8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1374,15 +2350,74 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.10': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.25.2': optional: true @@ -1536,6 +2571,10 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@hey-api/codegen-core@0.9.1': dependencies: '@hey-api/types': 0.1.4 @@ -1586,6 +2625,12 @@ snapshots: '@hey-api/types@0.1.4': {} + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@humanwhocodes/momoa@2.0.4': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1595,6 +2640,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1616,14 +2665,216 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsep-plugin/assignment@1.4.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + + '@jsep-plugin/regex@1.1.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + '@lukeed/ms@2.0.2': {} + '@modelcontextprotocol/sdk@1.31.0(zod@4.6.5)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) + transitivePeerDependencies: + - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@nodable/entities@3.1.0': {} + + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/cli@1.34.21(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.21 + '@redocly/respect-core': 1.34.21(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 4.0.3 + colorette: 1.4.0 + core-js: 3.32.1 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.0.1 + glob: 7.2.3 + handlebars: 4.7.10 + js-yaml: 4.3.2 + mobx: 6.12.3 + pluralize: 8.0.0 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + redoc: 2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)) + semver: 7.7.4 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.21': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.21(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.21 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.3.2 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.0 + openapi-sampler: 1.7.0 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.29.0 + transitivePeerDependencies: + - ajv + - supports-color + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -1759,6 +3010,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.63.5': optional: true + '@sinclair/typebox@0.27.12': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -1774,6 +3027,9 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/trusted-types@2.0.7': + optional: true + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -1816,6 +3072,28 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1826,18 +3104,47 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} + anynum@1.0.1: {} + argparse@2.0.1: {} assertion-error@2.0.1: {} async@3.2.6: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1847,6 +3154,8 @@ snapshots: dependencies: balanced-match: 1.0.2 + buffer-from@1.1.2: {} + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -1856,6 +3165,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + c12@3.3.4: dependencies: chokidar: 5.0.0 @@ -1873,6 +3184,18 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -1896,6 +3219,16 @@ snapshots: dependencies: readdirp: 5.1.1 + classnames@2.5.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1904,24 +3237,58 @@ snapshots: color-support@1.1.3: {} + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@15.0.0: {} commander@4.1.1: {} concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} consola@3.4.2: {} + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-js@3.32.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -1930,6 +3297,8 @@ snapshots: dependencies: ms: 2.1.3 + decko@1.2.0: {} + deep-eql@5.0.2: {} default-browser-id@5.0.1: {} @@ -1943,12 +3312,32 @@ snapshots: defu@6.1.7: {} + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + diff-sequences@29.6.3: {} + + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.4.7: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -1957,8 +3346,27 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-promise@3.3.1: {} + esbuild-fix-imports-plugin@1.0.19: {} esbuild-plugin-file-path-extensions@1.0.0: {} @@ -2020,35 +3428,163 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} + + escape-html@1.0.3: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 - expect-type@1.4.0: {} + etag@1.8.1: {} - exsolve@1.1.1: {} + event-target-shim@5.0.1: {} - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + eventemitter3@5.0.4: {} - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 + eventsource-parser@3.1.1: {} - filelist@1.0.4: + eventsource@3.0.7: dependencies: - minimatch: 5.1.6 + eventsource-parser: 3.1.1 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + expect-type@1.4.0: {} - fsevents@2.3.3: - optional: true + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3 + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color - get-tsconfig@4.14.0: + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.8: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + foreach@2.0.6: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2063,8 +3599,72 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-client@1.3.5: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -2075,6 +3675,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-promise@4.0.0: {} + + is-unsafe@2.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -2094,16 +3698,62 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jiti@2.7.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.2.0: dependencies: argparse: 2.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsep@1.6.0: {} + + json-pointer@0.6.2: + dependencies: + foreach: 2.0.6 + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.4.0(jsep@1.6.0) + '@jsep-plugin/regex': 1.1.0(jsep@1.6.0) + jsep: 1.6.0 + + jsonpointer@5.0.1: {} + + leven@3.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2112,14 +3762,42 @@ snapshots: lodash.sortby@4.7.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} + lunr@2.3.9: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + mark.js@8.11.1: {} + + marked@4.3.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2128,12 +3806,36 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mobx-react-lite@4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx-react@9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + mobx-react-lite: 4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react: 19.3.1 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx@6.12.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -2144,10 +3846,76 @@ snapshots: nanoid@3.3.19: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + neo-async@2.6.2: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.12: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.1 + open@11.0.0: dependencies: default-browser: 5.5.1 @@ -2157,8 +3925,30 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openapi-sampler@1.7.0: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + openapi-sampler@1.7.6: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + outdent@0.8.0: {} + package-json-from-dist@1.0.1: {} + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -2166,12 +3956,16 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} perfect-debounce@2.1.0: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@4.0.2: {} @@ -2180,12 +3974,20 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-types@2.3.3: dependencies: confbox: 0.3.1 exsolve: 1.1.1 pathe: 2.0.3 + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.10 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28): dependencies: lilconfig: 3.1.3 @@ -2201,17 +4003,118 @@ snapshots: powershell-utils@0.1.0: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + rc9@3.1.0: dependencies: defu: 6.1.7 destr: 2.0.5 + react-dom@19.3.1(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.28.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-tabs@6.1.1(react@19.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.3.1 + + react@19.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.1.1: {} + redoc@2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)): + dependencies: + '@redocly/openapi-core': 1.34.21 + classnames: 2.5.1 + core-js: 3.32.1 + decko: 1.2.0 + dompurify: 3.4.17 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.12.3 + mobx-react: 9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + openapi-sampler: 1.7.6 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + react-tabs: 6.1.1(react@19.3.1) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + + reftools@1.1.9: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -2274,30 +4177,151 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.63.5 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-applescript@7.1.0: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.28.0: {} + + semver@7.7.4: {} + semver@7.8.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} + simple-websocket@9.1.0: + dependencies: + debug: 4.4.3 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + slugify@1.4.7: {} + source-map-js@1.2.1: {} + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@3.10.0: {} + stickyfill@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2310,6 +4334,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2322,6 +4350,21 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.3.1 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -2336,6 +4379,22 @@ snapshots: dependencies: has-flag: 4.0.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2364,6 +4423,10 @@ snapshots: tinyspy@4.0.6: {} + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -2399,8 +4462,35 @@ snapshots: - tsx - yaml + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + typescript@5.8.2: {} + uglify-js@3.19.3: + optional: true + + undici@6.29.0: {} + + unpipe@1.0.0: {} + + uri-js-replace@1.0.1: {} + + url-template@2.0.8: {} + + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + vite-node@3.2.4(jiti@2.7.0): dependencies: cac: 6.7.14 @@ -2473,8 +4563,15 @@ snapshots: - tsx - yaml + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -2490,6 +4587,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2502,9 +4601,37 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-naming@0.3.0: {} + + y18n@5.0.8: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + zod-to-json-schema@3.25.2(zod@4.6.5): + dependencies: + zod: 4.6.5 + zod@4.6.5: {} diff --git a/packages/sdks/permissions/src/client/mcp-support.gen.ts b/packages/sdks/permissions/src/client/mcp-support.gen.ts new file mode 100644 index 000000000..5aedf66aa --- /dev/null +++ b/packages/sdks/permissions/src/client/mcp-support.gen.ts @@ -0,0 +1,260 @@ +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js" +import type { + CallToolResult, + ToolAnnotations, +} from "@modelcontextprotocol/sdk/types.js" +import * as z from "zod" + +export type OperationMeta = { + id: string + method: string + path: string + risk: "read" | "create" | "update" | "delete" +} + +export type ToolConfig = { + title?: string + description?: string + inputSchema: z.ZodObject>> + outputSchema?: AnySchema + annotations?: ToolAnnotations + _meta: { + "com.elasticpath/operation": OperationMeta + } +} + +export type Tool = { + readonly name: string + readonly config: ToolConfig + readonly handler: ToolCallback +} + +const messageOf = (error: unknown) => + error instanceof Error ? error.message : JSON.stringify(error) + +export const toToolResult = async ( + request: Promise<{ + data?: unknown + error?: unknown + response?: Response + }>, +): Promise => { + let text: string + try { + const result = await request + if (result.error === undefined) { + const structuredContent = + typeof result.data === "object" && + result.data !== null && + !Array.isArray(result.data) + ? (result.data as Record) + : { data: result.data ?? null } + return { + structuredContent, + content: [{ type: "text", text: JSON.stringify(structuredContent) }], + } + } + text = result.response + ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}` + : messageOf(result.error) + } catch (error) { + text = messageOf(error) + } + return { isError: true, content: [{ type: "text", text }] } +} + +export const loose = (schema: T): T => { + const def: any = schema._zod.def + const copy = (changes: object): T => + schema.clone({ ...def, ...changes }, { parent: true }) + if (def.type === "object") { + return copy({ + catchall: z.unknown(), + shape: Object.fromEntries( + Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]), + ), + }) + } + if (def.type === "array") { + return copy({ element: loose(def.element) }) + } + if (def.type === "record") { + return copy({ valueType: loose(def.valueType) }) + } + if (def.type === "lazy") { + return copy({ getter: () => loose(def.getter()) }) + } + if ( + [ + "optional", + "nullable", + "default", + "readonly", + "nonoptional", + "catch", + "prefault", + ].includes(def.type) + ) { + return copy({ innerType: loose(def.innerType) }) + } + if (def.type === "union") { + return copy({ options: def.options.map(loose) }) + } + if (def.type === "intersection") { + return copy({ left: loose(def.left), right: loose(def.right) }) + } + return schema +} + +type FileNameFields = { + [P in `${K}_name`]: z.ZodOptional +} + +export const dataUriFields = < + S extends z.ZodRawShape, + C extends z.core.$ZodObjectConfig, + K extends string, +>( + schema: z.ZodObject, + fields: ReadonlyArray, + maxBytes: number, +): z.ZodObject>, C> => + schema.extend( + Object.fromEntries( + fields.flatMap((field) => { + const current = schema.shape[field] as unknown as z.ZodType + const uri = z.string().meta({ + format: "uri", + "x-mcp-file": { maxSize: maxBytes }, + description: [ + current.description, + `Send the file as a data: URI, such as data:text/csv;base64,, at most ${maxBytes} bytes once decoded.`, + ] + .filter(Boolean) + .join(" "), + }) + const name = z + .string() + .meta({ + description: `The name of the file sent in ${field}, such as products.csv.`, + }) + .optional() + return [ + [field, current.isOptional() ? uri.optional() : uri], + [`${field}_name`, name], + ] + }), + ), + ) as unknown as z.ZodObject>, C> + +type DataUrisDecoded = T extends object + ? Omit & { + [P in K & keyof T]: undefined extends T[P] ? File | undefined : File + } + : T + +const DATA_URI = /^data:([^,]*),(.*)$/is +const PERCENT_ENCODED = /^[0-9a-f]{2}$/i + +const notADataUriError = (field: string) => + new Error( + `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`, + ) + +const fileTooBigError = (field: string, bytes: number, maxBytes: number) => + new Error( + `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`, + ) + +function percentDecoded(field: string, text: string) { + const bytes: number[] = [] + const encoder = new TextEncoder() + for (let index = 0; index < text.length; index++) { + if (text[index] === "%") { + const hex = text.slice(index + 1, index + 3) + if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field) + bytes.push(parseInt(hex, 16)) + index += 2 + } else { + const codePoint = text.codePointAt(index)! + const character = String.fromCodePoint(codePoint) + bytes.push(...encoder.encode(character)) + index += character.length - 1 + } + } + return new Uint8Array(bytes) +} + +function base64Decoded(field: string, text: string, maxBytes: number) { + const data = text.replace(/\s/g, "") + const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0 + const bytes = Math.floor((data.length * 3) / 4) - padding + if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes) + let binary: string + try { + binary = atob(data) + } catch { + throw new Error(`${field} is not valid base64`) + } + return Uint8Array.from(binary, (character) => character.charCodeAt(0)) +} + +function fileFromDataUri( + field: string, + uri: unknown, + maxBytes: number, + givenName: unknown, +) { + const match = typeof uri === "string" ? DATA_URI.exec(uri) : null + if (!match) throw notADataUriError(field) + const parameters = match[1]!.split(";") + const isBase64 = parameters.at(-1)!.toLowerCase() === "base64" + if (isBase64) parameters.pop() + const mediaType = parameters.shift()!.trim() + const nameParameter = parameters.find((parameter) => + parameter.trim().toLowerCase().startsWith("name="), + ) + let name = field + if (typeof givenName === "string" && givenName.trim()) { + name = givenName.trim() + } else if (nameParameter) { + try { + name = decodeURIComponent(nameParameter.trim().slice("name=".length)) + } catch { + throw notADataUriError(field) + } + } + const bytes = isBase64 + ? base64Decoded(field, match[2]!, maxBytes) + : percentDecoded(field, match[2]!) + if (bytes.length > maxBytes) + throw fileTooBigError(field, bytes.length, maxBytes) + return new File([bytes], name, { + type: mediaType.includes("/") ? mediaType : "text/plain", + }) +} + +export const decodeDataUris = async ( + body: T, + fields: ReadonlyArray, + maxBytes: number, +): Promise> => { + if (typeof body !== "object" || body === null) { + return body as DataUrisDecoded + } + const decoded = { ...body } as Record + for (const field of fields) { + const givenName = decoded[`${field}_name`] + delete decoded[`${field}_name`] + if (decoded[field] !== undefined) { + decoded[field] = fileFromDataUri( + field, + decoded[field], + maxBytes, + givenName, + ) + } + } + return decoded as DataUrisDecoded +} diff --git a/packages/sdks/permissions/src/client/mcp.gen.ts b/packages/sdks/permissions/src/client/mcp.gen.ts new file mode 100644 index 000000000..c14a61973 --- /dev/null +++ b/packages/sdks/permissions/src/client/mcp.gen.ts @@ -0,0 +1,507 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import * as z from "zod" + +import type { Client } from "./client" +import { loose, type Tool, toToolResult } from "./mcp-support.gen" +import { + createACustomApiRolePolicy, + deleteACustomApiRolePolicy, + getACustomApiRolePolicy, + getAStandardShopperRole, + getAStandardUserRole, + listCustomApiRolePolicies, + listStandardShopperRoles, + listStandardUserRoles, + updateACustomApiRolePolicy, +} from "./sdk.gen" +import { + zCreateACustomApiRolePolicyBody, + zDeleteACustomApiRolePolicyPath, + zGetACustomApiRolePolicyPath, + zGetAStandardShopperRolePath, + zGetAStandardUserRolePath, + zListCustomApiRolePoliciesQuery, + zUpdateACustomApiRolePolicyBody, + zUpdateACustomApiRolePolicyPath, +} from "./zod.gen" + +type ToolOptions = { + client?: Client +} + +const listStandardUserRolesInput = z.object({}).strict() + +/** + * List Standard User Roles + * + * Retrieves a list of Standard User Roles + * + */ +export const listStandardUserRolesTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + listStandardUserRoles({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_list_standard_user_roles" as const, + config: { + title: "List Standard User Roles", + description: + "Lists the standard user roles that can be assigned to Commerce Manager users, each with its access level (none, view or manage) for areas such as products, orders, promotions and settings. Use it to find a role ID for a custom API role policy.", + inputSchema: listStandardUserRolesInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.listStandardUserRoles", + method: "GET", + path: "/v2/permissions/standard-user-roles", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const getAStandardUserRoleInput = z + .object({ + path: zGetAStandardUserRolePath.strict(), + }) + .strict() + +/** + * Get a Standard User Role + * + * Get a Standard User Role + */ +export const getAStandardUserRoleTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getAStandardUserRole({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_get_a_standard_user_role" as const, + config: { + title: "Get a Standard User Role", + description: + "Gets one standard user role by its ID, with its access level (none, view or manage) for each permission group, such as catalogs, orders, promotions and application keys.", + inputSchema: getAStandardUserRoleInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.getAStandardUserRole", + method: "GET", + path: "/v2/permissions/standard-user-roles/{standard-user-role-id}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const listStandardShopperRolesInput = z.object({}).strict() + +/** + * List Standard Shopper Roles + * + * Retrieves a list of Standard Shopper Roles + * + */ +export const listStandardShopperRolesTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + listStandardShopperRoles({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_list_standard_shopper_roles" as const, + config: { + title: "List Standard Shopper Roles", + description: + "Lists the standard shopper roles, which represent customers. Each role has an ID and a name. Use it to find a shopper role ID for a custom API role policy.", + inputSchema: listStandardShopperRolesInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.listStandardShopperRoles", + method: "GET", + path: "/v2/permissions/standard-shopper-roles", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const getAStandardShopperRoleInput = z + .object({ + path: zGetAStandardShopperRolePath.strict(), + }) + .strict() + +/** + * Get a Standard Shopper Role + * + * Get a Standard Shopper Role + */ +export const getAStandardShopperRoleTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getAStandardShopperRole({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_get_a_standard_shopper_role" as const, + config: { + title: "Get a Standard Shopper Role", + description: + "Gets one standard shopper role by its ID, returning its ID and name. Use it to confirm a shopper role ID before referencing it in a custom API role policy.", + inputSchema: getAStandardShopperRoleInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.getAStandardShopperRole", + method: "GET", + path: "/v2/permissions/standard-shopper-roles/{standard-shopper-role-id}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const listCustomApiRolePoliciesInput = z + .object({ + query: zListCustomApiRolePoliciesQuery.strict().optional(), + }) + .strict() + +/** + * List Custom API Role Policies + * + * Retrieves a list of Custom API Role Policies + * + * ## Filtering + * The following operators and attributes are available for [filtering](/guides/Getting-Started/filtering) Custom API Role Policies: + * + * | Attribute | Operators | Example | + * |------------------|-------------------------------|----------------------------------------------------------| + * | `id` | `lt`,`le`,`eq`,`gt`,`ge`,`in` | `eq(id,3fa85f64-5717-4562-b3fc-2c963f66afa6)` | + * | `created_at` | `lt`,`le`,`eq`,`gt`,`ge` | `ge(created_at,2024-04-29T00:00:00.000Z)` | + * | `updated_at` | `lt`,`le`,`eq`,`gt`,`ge` | `le(updated_at,2024-04-29T00:00:00.000Z)` | + * | `custom_api_id` | `eq` | `eq(custom_api_id,fded1d2a-8bb8-48b6-86a5-9eb05cc8626a)` | + * | `role_id` | `eq` | `eq(role_id,it-developer)` | + * + * ## Sorting + * The following attributes are available for sorting. When specified, the results are sorted in ascending order based on the value of the field. To sort in descending order, prefix the attribute with `-`, for example, `-updated_at`. The default sort order is `created_at` in descending order. + * - `id` + * - `created_at` + * - `updated_at` + * + */ +export const listCustomApiRolePoliciesTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + listCustomApiRolePolicies({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_list_custom_api_role_policies" as const, + config: { + title: "List Custom API Role Policies", + description: + "Lists custom API role policies, which set what each role can do with the entries of a custom API. Filter by ID, timestamps, custom API ID or role ID, and sort by ID or timestamps; the default is newest first. Supports offset and limit pagination.", + inputSchema: listCustomApiRolePoliciesInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.listCustomApiRolePolicies", + method: "GET", + path: "/v2/permissions/custom-api-role-policies", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const createACustomApiRolePolicyInput = z + .object({ + body: loose(zCreateACustomApiRolePolicyBody).optional(), + }) + .strict() + +/** + * Create A Custom API Role Policy + * + * Create A Custom API Role Policy + */ +export const createACustomApiRolePolicyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + createACustomApiRolePolicy({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_create_a_custom_api_role_policy" as const, + config: { + title: "Create a Custom API Role Policy", + description: + "Creates a policy that sets which actions (create, list, read, update, delete) a role can take on the entries of one custom API, named with the custom API and role relationships. All five flags are required. Store Admin and Org Admin roles already have full access, so only other roles need a policy.", + inputSchema: createACustomApiRolePolicyInput, + annotations: { + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.createACustomApiRolePolicy", + method: "POST", + path: "/v2/permissions/custom-api-role-policies", + risk: "create" as const, + }, + }, + }, + handler, + } +} + +const deleteACustomApiRolePolicyInput = z + .object({ + path: zDeleteACustomApiRolePolicyPath.strict(), + }) + .strict() + +/** + * Delete a Custom API Role Policy + * + * Delete A Custom API Role Policy + */ +export const deleteACustomApiRolePolicyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + deleteACustomApiRolePolicy({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_delete_a_custom_api_role_policy" as const, + config: { + title: "Delete a Custom API Role Policy", + description: + "Deletes a custom API role policy by its ID. The role loses the access to the custom API's entries that the policy granted, unless it is an administrative role such as Store Admin or Org Admin, which has full access by default.", + inputSchema: deleteACustomApiRolePolicyInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.deleteACustomApiRolePolicy", + method: "DELETE", + path: "/v2/permissions/custom-api-role-policies/{custom-api-role-policy-id}", + risk: "delete" as const, + }, + }, + }, + handler, + } +} + +const getACustomApiRolePolicyInput = z + .object({ + path: zGetACustomApiRolePolicyPath.strict(), + }) + .strict() + +/** + * Get a Custom API Role Policy + * + * Get A Custom API Role Policy + */ +export const getACustomApiRolePolicyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getACustomApiRolePolicy({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_get_a_custom_api_role_policy" as const, + config: { + title: "Get a Custom API Role Policy", + description: + "Gets one custom API role policy by its ID, showing whether its role can create, list, read, update and delete entries of the custom API, and which custom API and role it applies to.", + inputSchema: getACustomApiRolePolicyInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.getACustomApiRolePolicy", + method: "GET", + path: "/v2/permissions/custom-api-role-policies/{custom-api-role-policy-id}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const updateACustomApiRolePolicyInput = z + .object({ + path: zUpdateACustomApiRolePolicyPath.strict(), + body: loose(zUpdateACustomApiRolePolicyBody).optional(), + }) + .strict() + +/** + * Update a Custom API Role Policy + * + * Update A Custom API Role Policy + */ +export const updateACustomApiRolePolicyTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + updateACustomApiRolePolicy({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "permissions_update_a_custom_api_role_policy" as const, + config: { + title: "Update a Custom API Role Policy", + description: + "Changes which actions (create, list, read, update, delete) a role can take on a custom API's entries, by policy ID. Send only the flags to change. It cannot change which custom API or role the policy covers; create a new policy for that.", + inputSchema: updateACustomApiRolePolicyInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "permissions.updateACustomApiRolePolicy", + method: "PUT", + path: "/v2/permissions/custom-api-role-policies/{custom-api-role-policy-id}", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +export const tools = (options?: ToolOptions): Array => [ + listStandardUserRolesTool(options), + getAStandardUserRoleTool(options), + listStandardShopperRolesTool(options), + getAStandardShopperRoleTool(options), + listCustomApiRolePoliciesTool(options), + createACustomApiRolePolicyTool(options), + deleteACustomApiRolePolicyTool(options), + getACustomApiRolePolicyTool(options), + updateACustomApiRolePolicyTool(options), +] diff --git a/packages/sdks/permissions/src/mcp.test-d.ts b/packages/sdks/permissions/src/mcp.test-d.ts new file mode 100644 index 000000000..a61a799bf --- /dev/null +++ b/packages/sdks/permissions/src/mcp.test-d.ts @@ -0,0 +1,86 @@ +import { describe, expectTypeOf, it } from "vitest" +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { z } from "zod" +import type { ListCustomApiRolePoliciesData } from "./client/types.gen" +import { listCustomApiRolePoliciesTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +declare const server: McpServer + +describe("registering the generated tools", () => { + it("registers one tool with its name, config and handler", () => { + const tool = listCustomApiRolePoliciesTool() + + server.registerTool(tool.name, tool.config, tool.handler) + }) + + it("registers every tool from tools()", () => { + tools().forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("registers only the read-only tools", () => { + tools() + .filter( + (t) => t.config._meta["com.elasticpath/operation"].risk === "read", + ) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("rejects a tool without _meta or with an unknown risk", () => { + const register = (t: Tool) => + server.registerTool(t.name, t.config, t.handler) + const tool = listCustomApiRolePoliciesTool() + const { _meta, ...configWithoutMeta } = tool.config + const withoutMeta = { ...tool, config: configWithoutMeta } + const unknownRisk = { + ...tool, + config: { + ...tool.config, + _meta: { + "com.elasticpath/operation": { + ..._meta["com.elasticpath/operation"], + risk: "erase" as const, + }, + }, + }, + } + + register(tool) + // @ts-expect-error + register(withoutMeta) + // @ts-expect-error + register(unknownRisk) + }) + + it("keeps typed arguments in a wrapped handler", () => { + const tool = listCustomApiRolePoliciesTool() + + server.registerTool(tool.name, tool.config, (args, extra) => { + expectTypeOf(args.query).toEqualTypeOf< + ListCustomApiRolePoliciesData["query"] + >() + // @ts-expect-error + tool.handler({ colour: "red" }, extra) + return tool.handler(args, extra) + }) + }) + + it("registers every tool with an extended input that sets a header", () => { + tools().forEach((t) => + server.registerTool( + t.name, + { + ...t.config, + inputSchema: t.config.inputSchema.extend({ + store_id: z.string().describe("The Elastic Path store to act on."), + }), + }, + ({ store_id, ...args }, extra) => + t.handler( + { ...args, headers: { ...args.headers, "EP-Store-Id": store_id } }, + extra, + ), + ), + ) + }) +}) diff --git a/packages/sdks/permissions/src/mcp.test.ts b/packages/sdks/permissions/src/mcp.test.ts new file mode 100644 index 000000000..d830c8125 --- /dev/null +++ b/packages/sdks/permissions/src/mcp.test.ts @@ -0,0 +1,385 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { ToolSchema } from "@modelcontextprotocol/sdk/types.js" +import type { Tool as ListedTool } from "@modelcontextprotocol/sdk/types.js" +import fs from "node:fs" +import * as main from "./index" +import { client as defaultClient } from "./client/client.gen" +import * as mcp from "./mcp" +import { + createACustomApiRolePolicyTool, + listCustomApiRolePoliciesTool, + listStandardUserRolesTool, + tools, +} from "./mcp" +import type { Tool } from "./mcp" + +const baseUrl = "https://useast.api.elasticpath.com" +const OPERATION = "com.elasticpath/operation" + +function stubFetch(body: unknown, status = 200) { + const requests: Request[] = [] + const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push( + input instanceof Request && init === undefined + ? input + : new Request(input, init), + ) + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json" }, + }) + }) as typeof globalThis.fetch + return { requests, fetch } +} + +const clientWith = ( + fetch: typeof globalThis.fetch, + config?: { headers: Record }, +) => + main.createPermissionsClient({ + baseUrl, + token: "pre-issued", + fetch, + retry: false, + config, + }) + +const extraWith = (signal = new AbortController().signal) => + ({ signal }) as Parameters[1] + +async function connect(registered: Tool[]) { + const server = new McpServer({ name: "permissions", version: "1.0.0" }) + registered.forEach((t) => server.registerTool(t.name, t.config, t.handler)) + const mcpClient = new Client({ name: "test-client", version: "1.0.0" }) + const [clientSide, serverSide] = InMemoryTransport.createLinkedPair() + await Promise.all([server.connect(serverSide), mcpClient.connect(clientSide)]) + return mcpClient +} + +const functionNamesInOperationOrder = () => + [ + ...fs + .readFileSync(new URL("./client/sdk.gen.ts", import.meta.url), "utf8") + .matchAll(/^export const (\w+) =/gm), + ].map((match) => match[1]!) + +const operationOf = (tool: Tool) => tool.config._meta[OPERATION] + +const docCommentOf = (functionName: string) => { + const source = fs.readFileSync( + new URL("./client/sdk.gen.ts", import.meta.url), + "utf8", + ) + const comment = source + .split(`\nexport const ${functionName} =`)[0]! + .split("/**") + .at(-1)! + .split("*/")[0]! + return comment + .split("\n") + .map((line) => line.replace(/^\s*\* ?/, "").trim()) + .join("\n") + .trim() +} + +const overrides = new URL( + "../../specs/overrides/mcp/permissions/", + import.meta.url, +) + +const writtenDescriptions = () => + fs.readdirSync(overrides).map((file) => + fs + .readFileSync(new URL(file, overrides), "utf8") + .split("x-mcp-description: >-")[1]! + .split(/\n(?=\S)/)[0]! + .trim() + .split(/\s*\n\s*/) + .join(" "), + ) + +describe("tools", () => { + it("holds 9 tools with valid, unique names, in operation order", () => { + const names = tools().map((tool) => tool.name) + + expect(names).toHaveLength(9) + for (const name of names) expect(name).toMatch(/^[a-zA-Z0-9_-]{1,64}$/) + expect(new Set(names).size).toBe(9) + expect(tools().map((tool) => operationOf(tool).id)).toEqual( + functionNamesInOperationOrder().map((name) => `permissions.${name}`), + ) + }) + + it("exports one tool factory for each operation", () => { + const factories = Object.keys(mcp).filter((name) => name.endsWith("Tool")) + + expect(factories).toHaveLength(9) + }) + + describe("sends each tool's request to its own operation's method and path", () => { + const { requests, fetch } = stubFetch({}) + const client = clientWith(fetch) + + it.each(tools({ client }).map((tool) => [tool.name, tool] as const))( + "%s", + async (_name, tool) => { + requests.length = 0 + const { method, path } = operationOf(tool) + const params = [...path.matchAll(/\{([^}]+)\}/g)].map( + (match) => match[1]!, + ) + const args: Record = {} + if (params.length > 0) { + args.path = Object.fromEntries(params.map((p) => [p, `p-${p}`])) + } + if ("body" in tool.config.inputSchema.shape) args.body = {} + + await tool.handler(args, extraWith()) + + expect(requests).toHaveLength(1) + expect(requests[0]!.method).toBe(method) + expect(new URL(requests[0]!.url).pathname).toBe( + path.replace(/\{([^}]+)\}/g, (_match, p) => `p-${p}`), + ) + }, + ) + }) +}) + +describe("the client a tool calls through", () => { + const response = { data: [] } + let original: ReturnType + let viaDefault: ReturnType + + beforeEach(() => { + original = defaultClient.getConfig() + viaDefault = stubFetch(response) + defaultClient.setConfig({ fetch: viaDefault.fetch }) + }) + + afterEach(() => { + defaultClient.setConfig({ + ...original, + auth: original.auth, + fetch: original.fetch, + }) + }) + + it("calls through the package's default client when no client is given", async () => { + const result = await listStandardUserRolesTool().handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(1) + expect(viaDefault.requests[0]!.url).toBe( + `${original.baseUrl}/v2/permissions/standard-user-roles`, + ) + expect(result.structuredContent).toEqual(response) + }) + + it("sends the credentials of a default client configured from a permissions client", async () => { + defaultClient.setConfig(clientWith(viaDefault.fetch).getConfig()) + + await listStandardUserRolesTool().handler({}, extraWith()) + + expect(viaDefault.requests[0]!.headers.get("Authorization")).toBe( + "Bearer pre-issued", + ) + }) + + it("uses a given client instead of the default", async () => { + const viaGiven = stubFetch(response) + + await listStandardUserRolesTool({ + client: clientWith(viaGiven.fetch), + }).handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(0) + expect(viaGiven.requests).toHaveLength(1) + const url = new URL(viaGiven.requests[0]!.url) + expect(url.origin + url.pathname).toBe( + `${baseUrl}/v2/permissions/standard-user-roles`, + ) + }) + + it("sends headers configured on the client with every tool call", async () => { + const { requests, fetch } = stubFetch(response) + const client = clientWith(fetch, { + headers: { "EP-Store-Id": "store-1", "EP-Org-Id": "org-1" }, + }) + + await listStandardUserRolesTool({ client }).handler({}, extraWith()) + + expect(requests[0]!.headers.get("EP-Store-Id")).toBe("store-1") + expect(requests[0]!.headers.get("EP-Org-Id")).toBe("org-1") + }) +}) + +describe("a tool's handler", () => { + it("aborts the request when the MCP request is cancelled", async () => { + const { requests, fetch } = stubFetch({}) + const controller = new AbortController() + + await listStandardUserRolesTool({ client: clientWith(fetch) }).handler( + {}, + extraWith(controller.signal), + ) + expect(requests[0]!.signal.aborted).toBe(false) + controller.abort() + + expect(requests[0]!.signal.aborted).toBe(true) + }) + + it("returns an API error as an isError result with the HTTP status", async () => { + const errors = { errors: [{ status: 404, title: "Not Found" }] } + const { fetch } = stubFetch(errors, 404) + + const result = await listStandardUserRolesTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result).toEqual({ + isError: true, + content: [{ type: "text", text: `HTTP 404: ${JSON.stringify(errors)}` }], + }) + }) + + it("returns a network failure as an isError result with its message", async () => { + const fetch = (async () => { + throw new TypeError("fetch failed") + }) as typeof globalThis.fetch + + const result = await listStandardUserRolesTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result.isError).toBe(true) + expect(result.content).toEqual([ + { type: "text", text: expect.stringContaining("fetch failed") }, + ]) + }) +}) + +describe("a tool's description", () => { + it("is the description written for it in the spec overrides, for every tool", () => { + expect( + tools() + .map((tool) => tool.config.description) + .sort(), + ).toEqual(writtenDescriptions().sort()) + }) + + it("leaves the full spec text to the SDK function's doc comment", () => { + expect(docCommentOf("listCustomApiRolePolicies").length).toBeGreaterThan( + 600, + ) + }) +}) + +describe("the permissions tools on an MCP server", () => { + let listed: ListedTool[] + + beforeAll(async () => { + const mcpClient = await connect( + tools({ client: clientWith(stubFetch({}).fetch) }), + ) + listed = (await mcpClient.listTools()).tools + }) + + it("describes every tool in at most 600 characters", () => { + for (const tool of listed) { + expect(tool.description!.length, tool.name).toBeLessThanOrEqual(600) + } + }) + + it("lists all 9, each passing the MCP SDK's ToolSchema", () => { + expect(listed).toHaveLength(9) + for (const tool of listed) { + expect(ToolSchema.safeParse(tool).success, tool.name).toBe(true) + } + }) + + it("asks no tool for an Authorization header", () => { + for (const tool of listed) { + const headers = (tool.inputSchema.properties as Record) + ?.headers + const names = Object.keys(headers?.properties ?? {}) + + expect(names.map((name) => name.toLowerCase())).not.toContain( + "authorization", + ) + } + }) + + it("rejects an unknown query key without sending the request", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + listCustomApiRolePoliciesTool({ client: clientWith(fetch) }), + ]) + + const result = await mcpClient.callTool({ + name: "permissions_list_custom_api_role_policies", + arguments: { query: { colour: "red" } }, + }) + + expect(result.isError).toBe(true) + expect(requests).toHaveLength(0) + }) + + it("keeps a body attribute the spec does not list when the tool is called through an MCP server", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + createACustomApiRolePolicyTool({ client: clientWith(fetch) }), + ]) + const args = { + body: { + data: { + type: "custom_api_role_policy", + create: false, + list: false, + read: false, + update: false, + delete: false, + relationships: {}, + unlisted_attribute: { nested: true }, + }, + unlisted_attribute: { nested: true }, + }, + } + + const result = await mcpClient.callTool({ + name: "permissions_create_a_custom_api_role_policy", + arguments: args, + }) + + expect(result.isError).toBeFalsy() + expect(await requests[0]!.json()).toMatchObject(args.body) + }) + + it("sends a call through the given client and returns the data", async () => { + const response = { data: [] } + const { requests, fetch } = stubFetch(response) + const mcpClient = await connect(tools({ client: clientWith(fetch) })) + + const result = await mcpClient.callTool({ + name: "permissions_list_standard_user_roles", + arguments: {}, + }) + + expect(requests).toHaveLength(1) + const url = new URL(requests[0]!.url) + expect(url.origin + url.pathname).toBe( + `${baseUrl}/v2/permissions/standard-user-roles`, + ) + expect(requests[0]!.headers.get("Authorization")).toBe("Bearer pre-issued") + expect(result.structuredContent).toEqual(response) + }) +}) + +describe("the main entry", () => { + it("exports no MCP code", () => { + expect(main).not.toHaveProperty("tools") + expect(main).not.toHaveProperty("listStandardUserRolesTool") + }) +}) diff --git a/packages/sdks/permissions/src/mcp.ts b/packages/sdks/permissions/src/mcp.ts new file mode 100644 index 000000000..fda10e5a5 --- /dev/null +++ b/packages/sdks/permissions/src/mcp.ts @@ -0,0 +1,2 @@ +export * from "./client/mcp.gen" +export type { OperationMeta, Tool, ToolConfig } from "./client/mcp-support.gen" diff --git a/packages/sdks/permissions/test-cjs-minimal.cjs b/packages/sdks/permissions/test-cjs-minimal.cjs index cecef0aca..1ab664fc3 100644 --- a/packages/sdks/permissions/test-cjs-minimal.cjs +++ b/packages/sdks/permissions/test-cjs-minimal.cjs @@ -1,5 +1,7 @@ // This file is used to test that CommonJS requires work correctly const Permissions = require("./dist/index.cjs") +const mcp = require("./dist/mcp.cjs") console.log("Permissions:", Object.keys(Permissions)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/permissions/test-esm-minimal.mjs b/packages/sdks/permissions/test-esm-minimal.mjs index 580790873..ad52be47a 100644 --- a/packages/sdks/permissions/test-esm-minimal.mjs +++ b/packages/sdks/permissions/test-esm-minimal.mjs @@ -1,5 +1,7 @@ // This file is used to test that ESM imports work correctly import * as Permissions from "./dist/index.mjs" +import * as mcp from "./dist/mcp.mjs" console.log("Permissions:", Object.keys(Permissions)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/permissions/test/built-output.test.ts b/packages/sdks/permissions/test/built-output.test.ts new file mode 100644 index 000000000..70bbe4f0f --- /dev/null +++ b/packages/sdks/permissions/test/built-output.test.ts @@ -0,0 +1,99 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { build } from "tsup" +import type { Options } from "tsup" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import tsupConfig from "../tsup.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const outDir = path.join(here, ".generated-dist") + +const SPECIFIER = + /(?:\bfrom\s*|\bimport\s*\(\s*|\brequire\s*\(\s*|^\s*import\s+)["']([^"']+)["']/gm + +function specifiersIn(file: string) { + const source = fs.readFileSync(file, "utf8") + return [...source.matchAll(SPECIFIER)].map((match) => match[1]!) +} + +function importGraph(entry: string) { + const files = new Set() + const packages = new Set() + const pending = [path.join(outDir, entry)] + while (pending.length > 0) { + const file = pending.pop()! + if (files.has(file)) continue + files.add(file) + for (const specifier of specifiersIn(file)) { + if (specifier.startsWith(".")) { + pending.push(path.resolve(path.dirname(file), specifier)) + } else { + packages.add(specifier) + } + } + } + return { + files: [...files].map((file) => path.relative(outDir, file)), + packages: [...packages], + } +} + +function builtFiles(directory = outDir): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(directory, entry.name) + if (entry.isDirectory()) return builtFiles(full) + return /\.(mjs|cjs)$/.test(entry.name) ? [full] : [] + }) +} + +beforeAll(async () => { + await build({ + ...(tsupConfig as Options), + config: false, + dts: false, + outDir, + silent: true, + sourcemap: false, + }) +}, 120_000) + +afterAll(() => { + fs.rmSync(outDir, { force: true, recursive: true }) +}) + +describe("the built package", () => { + it.each(["index.mjs", "index.cjs"])( + "reaches no MCP code from the main entry, %s", + (entry) => { + const graph = importGraph(entry) + + expect(graph.files).toContain( + path.join("client", `sdk.gen.${entry.split(".")[1]}`), + ) + expect(graph.files.filter((file) => file.includes("mcp"))).toEqual([]) + expect(graph.packages.filter((name) => name.includes("mcp"))).toEqual([]) + }, + ) + + it.each(["mcp.mjs", "mcp.cjs"])( + "reaches the generated tools from %s", + (entry) => { + const graph = importGraph(entry) + const extension = entry.split(".")[1] + + expect(graph.files).toContain(path.join("client", `mcp.gen.${extension}`)) + }, + ) + + it("imports the MCP SDK nowhere, because it is a type-only peer", () => { + for (const file of builtFiles()) { + expect( + specifiersIn(file).filter((name) => + name.includes("modelcontextprotocol"), + ), + file, + ).toEqual([]) + } + }) +}) diff --git a/packages/sdks/permissions/test/mcp-generation.test.ts b/packages/sdks/permissions/test/mcp-generation.test.ts new file mode 100644 index 000000000..6207837dc --- /dev/null +++ b/packages/sdks/permissions/test/mcp-generation.test.ts @@ -0,0 +1,74 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { createClient } from "@hey-api/openapi-ts" +import { execFileSync } from "node:child_process" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import config from "../openapi-ts.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const packageRoot = path.join(here, "..") +const committed = path.join(packageRoot, "src/client") +const firstRun = path.join(here, ".generated-mcp-first") +const secondRun = path.join(here, ".generated-mcp-second") +const workspaceBin = path.join(packageRoot, "../../../node_modules/.bin") +const mainEntryFiles = ["index.ts", "sdk.gen.ts", "types.gen.ts", "zod.gen.ts"] +const mcpFiles = ["mcp.gen.ts", "mcp-support.gen.ts"] + +const read = (directory: string, file: string) => + fs.readFileSync(path.join(directory, file), "utf8") + +async function generateInto(directory: string) { + const userConfig = await config + await createClient({ + ...userConfig, + input: path.join(packageRoot, "../specs/bundled/permissions_standalone.yaml"), + output: { ...(userConfig.output as object), path: directory }, + }) +} + +beforeAll(async () => { + process.env.PATH = [workspaceBin, process.env.PATH].join(path.delimiter) + execFileSync( + path.join(packageRoot, "node_modules/.bin/redocly"), + [ + "bundle", + "permissions-standalone@v1", + "--config", + "../specs/config/redocly.yaml", + ], + { cwd: packageRoot, stdio: "pipe" }, + ) + await generateInto(firstRun) + await generateInto(secondRun) +}, 120_000) + +afterAll(() => { + for (const directory of [firstRun, secondRun]) { + fs.rmSync(directory, { force: true, recursive: true }) + } +}) + +describe("generating the ./mcp export", () => { + it("writes the same MCP files byte for byte each time", () => { + for (const file of mcpFiles) { + expect(read(secondRun, file), file).toBe(read(firstRun, file)) + } + }) + + it("matches the committed MCP files", () => { + for (const file of mcpFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("leaves the main entry's generated files as committed", () => { + for (const file of mainEntryFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("keeps the MCP files out of the generated entry", () => { + expect(read(firstRun, "index.ts")).not.toContain("mcp") + }) +}) diff --git a/packages/sdks/permissions/tsconfig.test.json b/packages/sdks/permissions/tsconfig.test.json new file mode 100644 index 000000000..fc8520e73 --- /dev/null +++ b/packages/sdks/permissions/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/sdks/permissions/tsup.config.ts b/packages/sdks/permissions/tsup.config.ts index 91c898b67..44169c968 100644 --- a/packages/sdks/permissions/tsup.config.ts +++ b/packages/sdks/permissions/tsup.config.ts @@ -6,7 +6,7 @@ import { } from "esbuild-fix-imports-plugin" export default defineConfig({ - entry: ["src/**/*.ts", "!src/**/*.test.ts"], + entry: ["src/**/*.ts", "!src/**/*.test.ts", "!src/**/*.test-d.ts"], format: ["esm", "cjs"], dts: true, splitting: false, diff --git a/packages/sdks/permissions/vitest.config.ts b/packages/sdks/permissions/vitest.config.ts index b7b707f74..4b27a5bb8 100644 --- a/packages/sdks/permissions/vitest.config.ts +++ b/packages/sdks/permissions/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from "vitest/config" export default defineConfig({ test: { include: ["**/*.{test,spec}.{js,ts}"], + typecheck: { + enabled: true, + include: ["src/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, }, }) diff --git a/packages/sdks/personal-data/README.md b/packages/sdks/personal-data/README.md index 5ca1fe407..00d88877c 100644 --- a/packages/sdks/personal-data/README.md +++ b/packages/sdks/personal-data/README.md @@ -2,7 +2,6 @@ Below you'll find instructions on how to install, set up, and use the client, along with a list of available operations. - ## Features - type-safe response data and errors @@ -13,7 +12,6 @@ Below you'll find instructions on how to install, set up, and use the client, al --- - ## Installation ```bash @@ -28,7 +26,6 @@ yarn add @epcc-sdk/personal-data ## Client Usage - Clients are responsible for sending the actual HTTP requests. The Fetch client is built as a thin wrapper on top of Fetch API, extending its functionality. If you're already familiar with Fetch, configuring your client will feel like working directly with Fetch API. @@ -40,23 +37,22 @@ You can configure the client in two ways: **When using the operation function to make requests, by default the global client will be used unless another is provided.** - ### 1. Configure the internal `client` instance directly This is the simpler approach. You can call the setConfig() method at the beginning of your application or anytime you need to update the client configuration. You can pass any Fetch API configuration option to setConfig(), and even your own Fetch implementation. ```ts -import { client } from "@epcc-sdk/personal-data"; +import { client } from "@epcc-sdk/personal-data" client.setConfig({ -// set default base url for requests -baseUrl: 'https://euwest.api.elasticpath.com', + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", -// set default headers for requests -headers: { -Authorization: 'Bearer YOUR_AUTH_TOKEN', -}, -}); + // set default headers for requests + headers: { + Authorization: "Bearer YOUR_AUTH_TOKEN", + }, +}) ``` The disadvantage of this approach is that your code may call the client instance before it's configured for the first time. Depending on your use case, you might need to use the second approach. @@ -66,27 +62,27 @@ The disadvantage of this approach is that your code may call the client instance This is useful when you want to use a different instance of the client for different parts of your application or when you want to use different configurations for different parts of your application. ```ts -import { createClient } from "@epcc-sdk/personal-data"; +import { createClient } from "@epcc-sdk/personal-data" // Create the client with your API base URL. const client = createClient({ - // set default base url for requests - baseUrl: "https://euwest.api.elasticpath.com", - /** - * Set default headers only for requests made by this client. - */ - headers: { - "Custom-Header": 'My Value', - }, -}); + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", + /** + * Set default headers only for requests made by this client. + */ + headers: { + "Custom-Header": "My Value", + }, +}) ``` You can also pass this instance to any SDK function through the client option. This will override the default instance from `import { client } from "@epcc-sdk/personal-data>". ```ts const response = await getPersonalDataLogs({ - client: myClient, -}); + client: myClient, +}) ``` ### Direct configuration @@ -95,8 +91,8 @@ Alternatively, you can pass the client configuration options to each SDK functio ```ts const response = await getPersonalDataLogs({ - baseUrl: 'https://example.com', // <-- override default configuration -}); + baseUrl: "https://example.com", // <-- override default configuration +}) ``` ## Interceptors (Middleware) @@ -104,35 +100,34 @@ const response = await getPersonalDataLogs({ Interceptors (middleware) can be used to modify requests before they're sent or responses before they're returned to your application. They can be added with use and removed with eject. Below is an example request interceptor ```ts -import { client } from "@epcc-sdk/personal-data"; +import { client } from "@epcc-sdk/personal-data" // Supports async functions client.interceptors.request.use(async (request) => { - // do something - return request; -}); + // do something + return request +}) client.interceptors.request.eject((request) => { - // do something - return request; -}); - + // do something + return request +}) ``` and an example response interceptor ```ts -import { client } from "@epcc-sdk/personal-data"; +import { client } from "@epcc-sdk/personal-data" client.interceptors.response.use((response) => { - // do something - return response; -}); + // do something + return response +}) client.interceptors.response.eject((response) => { - // do something - return response; -}); + // do something + return response +}) ``` > **_Tip:_** To eject, you must provide a reference to the function that was passed to use(). @@ -146,15 +141,15 @@ source, sets the `auth` hook, refreshes and replays once on a 401, and backs off import { createPersonalDataClient, getErasureRequests, -} from "@epcc-sdk/personal-data"; +} from "@epcc-sdk/personal-data" const client = createPersonalDataClient({ baseUrl: "https://euwest.api.elasticpath.com", clientId: process.env.EPCC_CLIENT_ID!, clientSecret: process.env.EPCC_CLIENT_SECRET!, -}); +}) -const { data } = await getErasureRequests({ client }); +const { data } = await getErasureRequests({ client }) ``` Credentials come from `source`, `provider`, `token`, `clientId` plus `clientSecret`, or @@ -176,11 +171,84 @@ Zod schemas for every request body, path and response are published under the `/ subpath. `zod` is an optional peer dependency (4.x), so the root entry never imports it. ```ts -import { zErasureRequestResponse } from "@epcc-sdk/personal-data/zod"; +import { zErasureRequestResponse } from "@epcc-sdk/personal-data/zod" -const erasureRequest = zErasureRequestResponse.parse(data?.data?.[0]); +const erasureRequest = zErasureRequestResponse.parse(data?.data?.[0]) ``` +## MCP endpoint tools + +The `/mcp` subpath turns each of the 7 personal data operations into a Model Context Protocol (MCP) tool. +The main entry imports none of it. `zod` 4 and `@modelcontextprotocol/sdk` are needed only for this +subpath. + +Each operation has one tool factory, named after its function with `Tool` added, such as +`getPersonalDataLogsTool`. A factory returns `{ name, config, handler }`, the three arguments that +`McpServer.registerTool` takes. `tools()` returns all 7 in operation order. A handler returns an API +error as an `isError` result and does not throw. + +Register one tool: + +```ts +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { getPersonalDataLogsTool } from "@epcc-sdk/personal-data/mcp" + +const server = new McpServer({ name: "personal-data", version: "1.0.0" }) +const tool = getPersonalDataLogsTool() +server.registerTool(tool.name, tool.config, tool.handler) +``` + +A tool built without a client calls through the package's module level `client`, like an operation +does. That client has no credentials until you configure it. Configure it once: + +```ts +import { client, createPersonalDataClient } from "@epcc-sdk/personal-data" + +client.setConfig( + createPersonalDataClient({ baseUrl, clientId, clientSecret }).getConfig(), +) +``` + +Register every tool, with a client that sends the same headers on every call: + +```ts +import * as personalData from "@epcc-sdk/personal-data/mcp" + +const client = createPersonalDataClient({ + baseUrl, + clientId, + clientSecret, + config: { headers: { "EP-Store-Id": storeId, "EP-Org-Id": orgId } }, +}) +personalData + .tools({ client }) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Register the read-only tools only: + +```ts +personalData + .tools({ client }) + .filter((t) => t.config._meta["com.elasticpath/operation"].risk === "read") + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Each tool is named `personal_data_`, and its arguments are grouped under `path`, +`query`, `headers` and `body`. The `path`, `query` and `headers` groups reject keys the spec does not +list. The `body` keeps them, so an attribute the spec does not list still reaches the API. The client +supplies the `Authorization` header, so no tool asks for it. Cancelling the MCP request cancels the +HTTP request. + +Each tool's description is written for a model choosing between tools: what the tool does, when to +use it rather than a similar tool, and any caveat that changes when to call it, in at most 600 +characters. The full spec description stays in the doc comment of the operation's function and its +tool factory. + +`config._meta["com.elasticpath/operation"]` holds the operation's `id`, `method`, `path` and `risk`. +The risk is `read`, `create`, `update` or `delete`, and the annotations follow from it. +`postErasureRequest` is a `POST` that permanently erases a personal data record, its data set and their logs, so a spec override gives it the `update` risk, which marks it destructive. + ## Build URL If you need to access the compiled URL, you can use the buildUrl() method. It's loosely typed by default to accept almost any value; in practice, you will want to pass a type hint. @@ -188,34 +256,30 @@ If you need to access the compiled URL, you can use the buildUrl() method. It's ```ts type FooData = { path: { - fooId: number; - }; + fooId: number + } query?: { - bar?: string; - }; - url: '/foo/{fooId}'; -}; + bar?: string + } + url: "/foo/{fooId}" +} const url = client.buildUrl({ path: { fooId: 1, }, query: { - bar: 'baz', + bar: "baz", }, - url: '/foo/{fooId}', -}); -console.log(url); // prints '/foo/1?bar=baz' + url: "/foo/{fooId}", +}) +console.log(url) // prints '/foo/1?bar=baz' ``` - --- - - - - ## Operation Usage + The following examples demonstrate how to use the operation function to make requests. ```ts @@ -234,12 +298,8 @@ const product = await getPersonalDataLogs({ --- - - ## Available Operations - - - **`getPersonalDataLogs`** (`GET /v2/personal-data/logs`) - **`getRelatedDataEntries`** (`GET /v2/personal-data/related-data-entries`) @@ -254,7 +314,4 @@ const product = await getPersonalDataLogs({ - **`putLogsTtl`** (`PUT /v2/settings/logs-ttl`) - - - ---- \ No newline at end of file +--- diff --git a/packages/sdks/personal-data/openapi-ts.config.ts b/packages/sdks/personal-data/openapi-ts.config.ts index d9a55e9e7..e6634ac60 100644 --- a/packages/sdks/personal-data/openapi-ts.config.ts +++ b/packages/sdks/personal-data/openapi-ts.config.ts @@ -1,8 +1,9 @@ -import { defineConfig } from "@hey-api/openapi-ts" +import { $, defineConfig } from "@hey-api/openapi-ts" import { int64AsNumber } from "../specs/heyapi/int64-as-number" +import { mcpTools } from "../specs/heyapi/mcp-tools" export default defineConfig({ - input: "../specs/personal-data.yaml", + input: "../specs/bundled/personal-data_standalone.yaml", output: { path: "src/client", postProcess: ["prettier"] }, plugins: [ { @@ -16,5 +17,6 @@ export default defineConfig({ metadata: true, name: "zod", }, + mcpTools($, { api: "personal_data" }), ], }) diff --git a/packages/sdks/personal-data/package.json b/packages/sdks/personal-data/package.json index 6618c4dc7..228069470 100644 --- a/packages/sdks/personal-data/package.json +++ b/packages/sdks/personal-data/package.json @@ -7,8 +7,9 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "pnpm openapi-ts && pnpm build:tsup", + "build": "pnpm oas:build && pnpm openapi-ts && pnpm build:tsup", "build:tsup": "tsup", + "oas:build": "redocly bundle personal-data-standalone@v1 --config ../specs/config/redocly.yaml", "openapi-ts": "openapi-ts", "test": "vitest run", "test:watch": "vitest" @@ -34,12 +35,25 @@ "default": "./dist/zod.cjs" } }, + "./mcp": { + "import": { + "types": "./dist/mcp.d.ts", + "default": "./dist/mcp.mjs" + }, + "require": { + "types": "./dist/mcp.d.cts", + "default": "./dist/mcp.cjs" + } + }, "./package.json": "./package.json" }, "typesVersions": { "*": { "zod": [ "./dist/zod.d.ts" + ], + "mcp": [ + "./dist/mcp.d.ts" ] } }, @@ -55,6 +69,9 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.99.0", + "@modelcontextprotocol/sdk": "1.31.0", + "@redocly/cli": "^1.21.0", + "@redocly/openapi-core": "^1.21.0", "@types/ejs": "^3.1.5", "ejs": "^3.1.10", "esbuild-fix-imports-plugin": "^1.0.19", @@ -65,9 +82,13 @@ "zod": "4.6.5" }, "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.31.0", "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, "zod": { "optional": true } diff --git a/packages/sdks/personal-data/pnpm-lock.yaml b/packages/sdks/personal-data/pnpm-lock.yaml index 0cb6732b4..6648e9398 100644 --- a/packages/sdks/personal-data/pnpm-lock.yaml +++ b/packages/sdks/personal-data/pnpm-lock.yaml @@ -15,6 +15,15 @@ importers: '@hey-api/openapi-ts': specifier: 0.99.0 version: 0.99.0(typescript@5.8.2) + '@modelcontextprotocol/sdk': + specifier: 1.31.0 + version: 1.31.0(zod@4.6.5) + '@redocly/cli': + specifier: ^1.21.0 + version: 1.34.21(ajv@8.20.0) + '@redocly/openapi-core': + specifier: ^1.21.0 + version: 1.34.21 '@types/ejs': specifier: ^3.1.5 version: 3.1.5 @@ -42,6 +51,24 @@ importers: packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} @@ -348,6 +375,13 @@ packages: cpu: [x64] os: [win32] + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@hey-api/codegen-core@0.9.1': resolution: {integrity: sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==} engines: {node: '>=22.18.0'} @@ -373,10 +407,24 @@ packages: '@hey-api/types@0.1.4': resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -401,20 +449,146 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsep-plugin/assignment@1.4.0': + resolution: {integrity: sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.1.0': + resolution: {integrity: sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/cli@1.34.21': + resolution: {integrity: sha512-cWZMh6z6AqJ5Q2nQz2K5XhOnwVWcidtnk4NMjMvdHHpGtjnsPSWKg4fdyWhY46ze5SXu6GxFLTLbMoXGz2JJHA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.21': + resolution: {integrity: sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.21': + resolution: {integrity: sha512-4qTfsJJg51mHqOqcgkw9QLy4wHckt+tqWcBeqhl9/w+4tiOmku06Sx4DqW2a3732jHXIPd0/T1xsehNt4lOhXw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.40.0': resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] @@ -640,6 +814,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -658,6 +835,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@vitest/expect@3.2.7': resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} @@ -687,6 +867,29 @@ packages: '@vitest/utils@3.2.7': resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -703,6 +906,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -710,6 +917,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -720,15 +930,31 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.1: resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} @@ -739,6 +965,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.3.4: resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: @@ -751,6 +981,17 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -771,6 +1012,16 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -782,6 +1033,16 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -793,6 +1054,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -803,10 +1068,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -825,6 +1120,9 @@ packages: supports-color: optional: true + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -844,16 +1142,42 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -865,9 +1189,32 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} @@ -885,16 +1232,68 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -915,15 +1314,55 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -935,10 +1374,69 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -957,6 +1455,12 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -972,14 +1476,36 @@ packages: engines: {node: '>=10'} hasBin: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -987,6 +1513,36 @@ packages: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsep@1.6.0: + resolution: {integrity: sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==} + engines: {node: '>= 20.16.0'} + + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1001,15 +1557,58 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1017,14 +1616,50 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1036,20 +1671,98 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.12: resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openapi-sampler@1.7.0: + resolution: {integrity: sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==} + + openapi-sampler@1.7.6: + resolution: {integrity: sha512-MvWOm3vdgX7CZ6CNfu2wOFMGhC/pq03BxYTL/DKCkyPWfR6XIwUJnOV32mQGgCcUm1tY/y1jj7F2yqx1DieIWw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1058,6 +1771,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1068,6 +1784,9 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1083,9 +1802,21 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.3.3: resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1112,13 +1843,70 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@3.1.0: resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} + peerDependencies: + react: ^19.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1127,6 +1915,27 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} + redoc@2.5.3: + resolution: {integrity: sha512-bBbat+Sx6xKWdyoCGTtA0BWeTEW9Vs4VnEja7q7ZLOk4IM7cHQLrf+kDxWF6dKeKxT8kOBnoy/OsNXCeLttpyQ==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1144,15 +1953,47 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1161,6 +2002,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1168,10 +2043,21 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1179,9 +2065,16 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1190,6 +2083,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1201,6 +2097,28 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1210,6 +2128,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1243,6 +2165,13 @@ packages: resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -1272,11 +2201,49 @@ packages: typescript: optional: true + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici@6.29.0: + resolution: {integrity: sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1350,9 +2317,15 @@ packages: jsdom: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -1366,6 +2339,9 @@ packages: engines: {node: '>=8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1374,15 +2350,74 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.10': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.25.2': optional: true @@ -1536,6 +2571,10 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@hey-api/codegen-core@0.9.1': dependencies: '@hey-api/types': 0.1.4 @@ -1586,6 +2625,12 @@ snapshots: '@hey-api/types@0.1.4': {} + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@humanwhocodes/momoa@2.0.4': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1595,6 +2640,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1616,14 +2665,216 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsep-plugin/assignment@1.4.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + + '@jsep-plugin/regex@1.1.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + '@lukeed/ms@2.0.2': {} + '@modelcontextprotocol/sdk@1.31.0(zod@4.6.5)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) + transitivePeerDependencies: + - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@nodable/entities@3.1.0': {} + + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/cli@1.34.21(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.21 + '@redocly/respect-core': 1.34.21(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 4.0.3 + colorette: 1.4.0 + core-js: 3.32.1 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.0.1 + glob: 7.2.3 + handlebars: 4.7.10 + js-yaml: 4.3.2 + mobx: 6.12.3 + pluralize: 8.0.0 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + redoc: 2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)) + semver: 7.7.4 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.21': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.21(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.21 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.3.2 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.0 + openapi-sampler: 1.7.0 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.29.0 + transitivePeerDependencies: + - ajv + - supports-color + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -1759,6 +3010,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.63.5': optional: true + '@sinclair/typebox@0.27.12': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -1774,6 +3027,9 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/trusted-types@2.0.7': + optional: true + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -1816,6 +3072,28 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1826,18 +3104,47 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} + anynum@1.0.1: {} + argparse@2.0.1: {} assertion-error@2.0.1: {} async@3.2.6: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1847,6 +3154,8 @@ snapshots: dependencies: balanced-match: 1.0.2 + buffer-from@1.1.2: {} + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -1856,6 +3165,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + c12@3.3.4: dependencies: chokidar: 5.0.0 @@ -1873,6 +3184,18 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -1896,6 +3219,16 @@ snapshots: dependencies: readdirp: 5.1.1 + classnames@2.5.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1904,24 +3237,58 @@ snapshots: color-support@1.1.3: {} + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@15.0.0: {} commander@4.1.1: {} concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} consola@3.4.2: {} + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-js@3.32.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -1930,6 +3297,8 @@ snapshots: dependencies: ms: 2.1.3 + decko@1.2.0: {} + deep-eql@5.0.2: {} default-browser-id@5.0.1: {} @@ -1943,12 +3312,32 @@ snapshots: defu@6.1.7: {} + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + diff-sequences@29.6.3: {} + + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.4.7: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -1957,8 +3346,27 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-promise@3.3.1: {} + esbuild-fix-imports-plugin@1.0.19: {} esbuild-plugin-file-path-extensions@1.0.0: {} @@ -2020,35 +3428,163 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} + + escape-html@1.0.3: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 - expect-type@1.4.0: {} + etag@1.8.1: {} - exsolve@1.1.1: {} + event-target-shim@5.0.1: {} - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + eventemitter3@5.0.4: {} - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 + eventsource-parser@3.1.1: {} - filelist@1.0.4: + eventsource@3.0.7: dependencies: - minimatch: 5.1.6 + eventsource-parser: 3.1.1 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + expect-type@1.4.0: {} - fsevents@2.3.3: - optional: true + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3 + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color - get-tsconfig@4.14.0: + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.8: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + foreach@2.0.6: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2063,8 +3599,72 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-client@1.3.5: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -2075,6 +3675,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-promise@4.0.0: {} + + is-unsafe@2.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -2094,16 +3698,62 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jiti@2.7.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.2.0: dependencies: argparse: 2.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsep@1.6.0: {} + + json-pointer@0.6.2: + dependencies: + foreach: 2.0.6 + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.4.0(jsep@1.6.0) + '@jsep-plugin/regex': 1.1.0(jsep@1.6.0) + jsep: 1.6.0 + + jsonpointer@5.0.1: {} + + leven@3.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2112,14 +3762,42 @@ snapshots: lodash.sortby@4.7.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} + lunr@2.3.9: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + mark.js@8.11.1: {} + + marked@4.3.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2128,12 +3806,36 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mobx-react-lite@4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx-react@9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + mobx-react-lite: 4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react: 19.3.1 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx@6.12.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -2144,10 +3846,76 @@ snapshots: nanoid@3.3.19: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + neo-async@2.6.2: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.12: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.1 + open@11.0.0: dependencies: default-browser: 5.5.1 @@ -2157,8 +3925,30 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openapi-sampler@1.7.0: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + openapi-sampler@1.7.6: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + outdent@0.8.0: {} + package-json-from-dist@1.0.1: {} + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -2166,12 +3956,16 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} perfect-debounce@2.1.0: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@4.0.2: {} @@ -2180,12 +3974,20 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-types@2.3.3: dependencies: confbox: 0.3.1 exsolve: 1.1.1 pathe: 2.0.3 + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.10 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28): dependencies: lilconfig: 3.1.3 @@ -2201,17 +4003,118 @@ snapshots: powershell-utils@0.1.0: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + rc9@3.1.0: dependencies: defu: 6.1.7 destr: 2.0.5 + react-dom@19.3.1(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.28.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-tabs@6.1.1(react@19.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.3.1 + + react@19.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.1.1: {} + redoc@2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)): + dependencies: + '@redocly/openapi-core': 1.34.21 + classnames: 2.5.1 + core-js: 3.32.1 + decko: 1.2.0 + dompurify: 3.4.17 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.12.3 + mobx-react: 9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + openapi-sampler: 1.7.6 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + react-tabs: 6.1.1(react@19.3.1) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + + reftools@1.1.9: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -2274,30 +4177,151 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.63.5 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-applescript@7.1.0: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.28.0: {} + + semver@7.7.4: {} + semver@7.8.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} + simple-websocket@9.1.0: + dependencies: + debug: 4.4.3 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + slugify@1.4.7: {} + source-map-js@1.2.1: {} + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@3.10.0: {} + stickyfill@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2310,6 +4334,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2322,6 +4350,21 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.3.1 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -2336,6 +4379,22 @@ snapshots: dependencies: has-flag: 4.0.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2364,6 +4423,10 @@ snapshots: tinyspy@4.0.6: {} + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -2399,8 +4462,35 @@ snapshots: - tsx - yaml + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + typescript@5.8.2: {} + uglify-js@3.19.3: + optional: true + + undici@6.29.0: {} + + unpipe@1.0.0: {} + + uri-js-replace@1.0.1: {} + + url-template@2.0.8: {} + + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + vite-node@3.2.4(jiti@2.7.0): dependencies: cac: 6.7.14 @@ -2473,8 +4563,15 @@ snapshots: - tsx - yaml + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -2490,6 +4587,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2502,9 +4601,37 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-naming@0.3.0: {} + + y18n@5.0.8: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + zod-to-json-schema@3.25.2(zod@4.6.5): + dependencies: + zod: 4.6.5 + zod@4.6.5: {} diff --git a/packages/sdks/personal-data/src/client/mcp-support.gen.ts b/packages/sdks/personal-data/src/client/mcp-support.gen.ts new file mode 100644 index 000000000..5aedf66aa --- /dev/null +++ b/packages/sdks/personal-data/src/client/mcp-support.gen.ts @@ -0,0 +1,260 @@ +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js" +import type { + CallToolResult, + ToolAnnotations, +} from "@modelcontextprotocol/sdk/types.js" +import * as z from "zod" + +export type OperationMeta = { + id: string + method: string + path: string + risk: "read" | "create" | "update" | "delete" +} + +export type ToolConfig = { + title?: string + description?: string + inputSchema: z.ZodObject>> + outputSchema?: AnySchema + annotations?: ToolAnnotations + _meta: { + "com.elasticpath/operation": OperationMeta + } +} + +export type Tool = { + readonly name: string + readonly config: ToolConfig + readonly handler: ToolCallback +} + +const messageOf = (error: unknown) => + error instanceof Error ? error.message : JSON.stringify(error) + +export const toToolResult = async ( + request: Promise<{ + data?: unknown + error?: unknown + response?: Response + }>, +): Promise => { + let text: string + try { + const result = await request + if (result.error === undefined) { + const structuredContent = + typeof result.data === "object" && + result.data !== null && + !Array.isArray(result.data) + ? (result.data as Record) + : { data: result.data ?? null } + return { + structuredContent, + content: [{ type: "text", text: JSON.stringify(structuredContent) }], + } + } + text = result.response + ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}` + : messageOf(result.error) + } catch (error) { + text = messageOf(error) + } + return { isError: true, content: [{ type: "text", text }] } +} + +export const loose = (schema: T): T => { + const def: any = schema._zod.def + const copy = (changes: object): T => + schema.clone({ ...def, ...changes }, { parent: true }) + if (def.type === "object") { + return copy({ + catchall: z.unknown(), + shape: Object.fromEntries( + Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]), + ), + }) + } + if (def.type === "array") { + return copy({ element: loose(def.element) }) + } + if (def.type === "record") { + return copy({ valueType: loose(def.valueType) }) + } + if (def.type === "lazy") { + return copy({ getter: () => loose(def.getter()) }) + } + if ( + [ + "optional", + "nullable", + "default", + "readonly", + "nonoptional", + "catch", + "prefault", + ].includes(def.type) + ) { + return copy({ innerType: loose(def.innerType) }) + } + if (def.type === "union") { + return copy({ options: def.options.map(loose) }) + } + if (def.type === "intersection") { + return copy({ left: loose(def.left), right: loose(def.right) }) + } + return schema +} + +type FileNameFields = { + [P in `${K}_name`]: z.ZodOptional +} + +export const dataUriFields = < + S extends z.ZodRawShape, + C extends z.core.$ZodObjectConfig, + K extends string, +>( + schema: z.ZodObject, + fields: ReadonlyArray, + maxBytes: number, +): z.ZodObject>, C> => + schema.extend( + Object.fromEntries( + fields.flatMap((field) => { + const current = schema.shape[field] as unknown as z.ZodType + const uri = z.string().meta({ + format: "uri", + "x-mcp-file": { maxSize: maxBytes }, + description: [ + current.description, + `Send the file as a data: URI, such as data:text/csv;base64,, at most ${maxBytes} bytes once decoded.`, + ] + .filter(Boolean) + .join(" "), + }) + const name = z + .string() + .meta({ + description: `The name of the file sent in ${field}, such as products.csv.`, + }) + .optional() + return [ + [field, current.isOptional() ? uri.optional() : uri], + [`${field}_name`, name], + ] + }), + ), + ) as unknown as z.ZodObject>, C> + +type DataUrisDecoded = T extends object + ? Omit & { + [P in K & keyof T]: undefined extends T[P] ? File | undefined : File + } + : T + +const DATA_URI = /^data:([^,]*),(.*)$/is +const PERCENT_ENCODED = /^[0-9a-f]{2}$/i + +const notADataUriError = (field: string) => + new Error( + `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`, + ) + +const fileTooBigError = (field: string, bytes: number, maxBytes: number) => + new Error( + `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`, + ) + +function percentDecoded(field: string, text: string) { + const bytes: number[] = [] + const encoder = new TextEncoder() + for (let index = 0; index < text.length; index++) { + if (text[index] === "%") { + const hex = text.slice(index + 1, index + 3) + if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field) + bytes.push(parseInt(hex, 16)) + index += 2 + } else { + const codePoint = text.codePointAt(index)! + const character = String.fromCodePoint(codePoint) + bytes.push(...encoder.encode(character)) + index += character.length - 1 + } + } + return new Uint8Array(bytes) +} + +function base64Decoded(field: string, text: string, maxBytes: number) { + const data = text.replace(/\s/g, "") + const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0 + const bytes = Math.floor((data.length * 3) / 4) - padding + if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes) + let binary: string + try { + binary = atob(data) + } catch { + throw new Error(`${field} is not valid base64`) + } + return Uint8Array.from(binary, (character) => character.charCodeAt(0)) +} + +function fileFromDataUri( + field: string, + uri: unknown, + maxBytes: number, + givenName: unknown, +) { + const match = typeof uri === "string" ? DATA_URI.exec(uri) : null + if (!match) throw notADataUriError(field) + const parameters = match[1]!.split(";") + const isBase64 = parameters.at(-1)!.toLowerCase() === "base64" + if (isBase64) parameters.pop() + const mediaType = parameters.shift()!.trim() + const nameParameter = parameters.find((parameter) => + parameter.trim().toLowerCase().startsWith("name="), + ) + let name = field + if (typeof givenName === "string" && givenName.trim()) { + name = givenName.trim() + } else if (nameParameter) { + try { + name = decodeURIComponent(nameParameter.trim().slice("name=".length)) + } catch { + throw notADataUriError(field) + } + } + const bytes = isBase64 + ? base64Decoded(field, match[2]!, maxBytes) + : percentDecoded(field, match[2]!) + if (bytes.length > maxBytes) + throw fileTooBigError(field, bytes.length, maxBytes) + return new File([bytes], name, { + type: mediaType.includes("/") ? mediaType : "text/plain", + }) +} + +export const decodeDataUris = async ( + body: T, + fields: ReadonlyArray, + maxBytes: number, +): Promise> => { + if (typeof body !== "object" || body === null) { + return body as DataUrisDecoded + } + const decoded = { ...body } as Record + for (const field of fields) { + const givenName = decoded[`${field}_name`] + delete decoded[`${field}_name`] + if (decoded[field] !== undefined) { + decoded[field] = fileFromDataUri( + field, + decoded[field], + maxBytes, + givenName, + ) + } + } + return decoded as DataUrisDecoded +} diff --git a/packages/sdks/personal-data/src/client/mcp.gen.ts b/packages/sdks/personal-data/src/client/mcp.gen.ts new file mode 100644 index 000000000..d7de7da2f --- /dev/null +++ b/packages/sdks/personal-data/src/client/mcp.gen.ts @@ -0,0 +1,430 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import * as z from "zod" + +import type { Client } from "./client" +import { loose, type Tool, toToolResult } from "./mcp-support.gen" +import { + getErasureRequest, + getErasureRequests, + getLogsTtl, + getPersonalDataLogs, + getRelatedDataEntries, + postErasureRequest, + putLogsTtl, +} from "./sdk.gen" +import { + zGetErasureRequestPath, + zGetErasureRequestsQuery, + zGetPersonalDataLogsQuery, + zGetRelatedDataEntriesQuery, + zPostErasureRequestBody, + zPutLogsTtlBody, +} from "./zod.gen" + +type ToolOptions = { + client?: Client +} + +const getPersonalDataLogsInput = z + .object({ + query: zGetPersonalDataLogsQuery.strict().optional(), + }) + .strict() + +/** + * Get Personal Data Logs + * + * Gets a list of logs for a specific resource id and resource type. + * + * You can use pagination with this resource. For more information, see [pagination](/guides/Getting-Started/pagination). + * + * :::note + * * This request is only accessible to `client_credentials` token users with `Seller Admin`, `Support` and `IT` roles. + * * Non `client_credentials` token users cannot access this endpoint. See [Permissions](/docs/authentication/tokens/permissions). + * * This request requires a filter for `resource_type` and `resource_id`. + * ::: + * + * ## Filtering + * + * The following operator and attributes are **required** for [filtering](/guides/Getting-Started/filtering) erasure requests. + * + * | Operator | Description | + * |:---------|:-----------------------------------------------------------------------------------------------------| + * | `eq` | Checks whether the values of two operands are equal. If the values are equal, the condition is true. | + * + * | Attribute | Type | Operator | Example | + * | :---------------- | :--- | :--- | :-------------------------------------------------------- | + * | `resource_type` | `string` | `eq` | `eq(resource_type,customer)` | + * | `resource_id` | `string` | `eq` | `eq(resource_id,0f850c15-d643-480a-a2b4-9e3c26067178)` | + * + */ +export const getPersonalDataLogsTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getPersonalDataLogs({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_get_personal_data_logs" as const, + config: { + title: "Get Personal Data Logs", + description: + "Lists the change logs for one personal data record, such as a customer, account, address or order. A filter on both resource type and resource ID is required. Each entry gives the event type, time, who made the change and the changed fields, which can include personal data such as names and email addresses. Supports pagination.", + inputSchema: getPersonalDataLogsInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.getPersonalDataLogs", + method: "GET", + path: "/v2/personal-data/logs", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const getRelatedDataEntriesInput = z + .object({ + query: zGetRelatedDataEntriesQuery.strict().optional(), + }) + .strict() + +/** + * Get Personal Data Related Data Entries + * + * Gets a list of related data entries filtered by specific resource id and resource type. + * + * You can use pagination with this resource. For more information, see [pagination](/guides/Getting-Started/pagination). + * + * :::note + * + * * This request is only accessible to `client_credentials` token users with `Seller Admin`, `Support` and `IT` roles. + * * Non `client_credentials` token users cannot access this endpoint. See [Permissions](/docs/authentication/tokens/permissions). + * * This request requires a filter for `resource_type` and `resource_id`. + * + * ::: + * + * ## Filtering + * + * The following operator and attributes are **required** for [filtering](/guides/Getting-Started/filtering) erasure requests. + * + * | Operator | Description | + * |:---------|:-----------------------------------------------------------------------------------------------------| + * | `eq` | Checks whether the values of two operands are equal. If the values are equal, the condition is true. | + * + * | Attribute | Type | Operator | Example | + * | :---------------- | :--- | :--- | :-------------------------------------------------------- | + * | `resource_type` | `string` | `eq` | `eq(resource_type,customer)` | + * | `resource_id` | `string` | `eq` | `eq(resource_id,0f850c15-d643-480a-a2b4-9e3c26067178)` | + * + */ +export const getRelatedDataEntriesTool = (options?: ToolOptions) => { + const handler: ToolCallback = ( + args, + extra, + ) => + toToolResult( + getRelatedDataEntries({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_get_related_data_entries" as const, + config: { + title: "Get Personal Data Related Data Entries", + description: + "Lists the records that belong to the same personal data set as a given record, such as the addresses and authentication info related to a customer. A filter on both resource type and resource ID is required. Use it to see what an erasure request for that record would remove. Supports pagination.", + inputSchema: getRelatedDataEntriesInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.getRelatedDataEntries", + method: "GET", + path: "/v2/personal-data/related-data-entries", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const getErasureRequestsInput = z + .object({ + query: zGetErasureRequestsQuery.strict().optional(), + }) + .strict() + +/** + * Get all Personal Data Erasure Request + * + * Gets a list of erasure requests for a specific resource id and resource type. + * + * You can use pagination with this resource. For more information, see [pagination](/guides/Getting-Started/pagination). + * + * ## Filtering + * + * The following operator and attributes are **required** for [filtering](/guides/Getting-Started/filtering) + * erasure requests. + * + * | Operator | Description | + * |:---------|:-----------------------------------------------------------------------------------------------------| + * | `eq` | Checks whether the values of two operands are equal. If the values are equal, the condition is true. | + * + * | Attribute | Type | Operator | Example | + * |:----------------| :--- | :--- |:--------------------------------------------------------| + * | `resource_type` | `string` | `eq` | `eq(resource_type,customer)` | + * | `resource_id` | `string` | `eq` | `eq(resource_id,0f850c15-d643-480a-a2b4-9e3c26067178\)` | + * + */ +export const getErasureRequestsTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + getErasureRequests({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_get_erasure_requests" as const, + config: { + title: "List Personal Data Erasure Requests", + description: + "Lists the erasure requests for one personal data record, with each request's status, status description and time. A filter on both resource type and resource ID is required. Use it to check whether an earlier erasure request succeeded or failed. Supports pagination.", + inputSchema: getErasureRequestsInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.getErasureRequests", + method: "GET", + path: "/v2/personal-data/erasure-requests", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const postErasureRequestInput = z + .object({ + body: loose(zPostErasureRequestBody).optional(), + }) + .strict() + +/** + * Create Personal Data Erasure Request + * + * This request serves to create a new erasure request for a given resource ID and Type. All resources that belong to the same personal data set will be erased. + * + */ +export const postErasureRequestTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + postErasureRequest({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_post_erasure_request" as const, + config: { + title: "Create Personal Data Erasure Request", + description: + "Starts an erasure request that permanently erases a personal data record and every record in the same personal data set, along with their personal data logs. Treat it as irreversible, and review the related data entries first. Processing is asynchronous, so poll the request until its status is SUCCESS, and create a new request if it fails. It does not cover flows or data outside Commerce.", + inputSchema: postErasureRequestInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: false, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.postErasureRequest", + method: "POST", + path: "/v2/personal-data/erasure-requests", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +const getErasureRequestInput = z + .object({ + path: zGetErasureRequestPath.strict(), + }) + .strict() + +/** + * Get Personal Data Erasure Request + * + * This request serves to get an existing erasure request by its ID. + * + */ +export const getErasureRequestTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + getErasureRequest({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_get_erasure_request" as const, + config: { + title: "Get Personal Data Erasure Request", + description: + "Gets one erasure request by its ID, with the resource it targets, who started it, and its status and status description. Use it to poll an asynchronous erasure until the status is SUCCESS.", + inputSchema: getErasureRequestInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.getErasureRequest", + method: "GET", + path: "/v2/personal-data/erasure-requests/{erasure_request_id}", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const getLogsTtlInput = z.object({}).strict() + +/** + * Get Logs Time-to-Live (TTL) Settings + */ +export const getLogsTtlTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + getLogsTtl({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_get_logs_ttl" as const, + config: { + title: "Get Logs Time-to-Live (TTL) Settings", + description: + "Gets the logs time-to-live setting, which is how many days personal data logs are kept. The default is 365 days for production stores and 7 days for other store types.", + inputSchema: getLogsTtlInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.getLogsTtl", + method: "GET", + path: "/v2/settings/logs-ttl", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const putLogsTtlInput = z + .object({ + body: loose(zPutLogsTtlBody).optional(), + }) + .strict() + +/** + * Update Logs Time-to-Live (TTL) Settings + */ +export const putLogsTtlTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + putLogsTtl({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "personal_data_put_logs_ttl" as const, + config: { + title: "Update Logs Time-to-Live (TTL) Settings", + description: + "Sets how many days personal data logs are kept, from 1 to 365. Use it to change the retention period that applies to the personal data change logs.", + inputSchema: putLogsTtlInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "personal_data.putLogsTtl", + method: "PUT", + path: "/v2/settings/logs-ttl", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +export const tools = (options?: ToolOptions): Array => [ + getPersonalDataLogsTool(options), + getRelatedDataEntriesTool(options), + getErasureRequestsTool(options), + postErasureRequestTool(options), + getErasureRequestTool(options), + getLogsTtlTool(options), + putLogsTtlTool(options), +] diff --git a/packages/sdks/personal-data/src/mcp.test-d.ts b/packages/sdks/personal-data/src/mcp.test-d.ts new file mode 100644 index 000000000..6164d30d0 --- /dev/null +++ b/packages/sdks/personal-data/src/mcp.test-d.ts @@ -0,0 +1,84 @@ +import { describe, expectTypeOf, it } from "vitest" +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { z } from "zod" +import type { GetPersonalDataLogsData } from "./client/types.gen" +import { getPersonalDataLogsTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +declare const server: McpServer + +describe("registering the generated tools", () => { + it("registers one tool with its name, config and handler", () => { + const tool = getPersonalDataLogsTool() + + server.registerTool(tool.name, tool.config, tool.handler) + }) + + it("registers every tool from tools()", () => { + tools().forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("registers only the read-only tools", () => { + tools() + .filter( + (t) => t.config._meta["com.elasticpath/operation"].risk === "read", + ) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("rejects a tool without _meta or with an unknown risk", () => { + const register = (t: Tool) => + server.registerTool(t.name, t.config, t.handler) + const tool = getPersonalDataLogsTool() + const { _meta, ...configWithoutMeta } = tool.config + const withoutMeta = { ...tool, config: configWithoutMeta } + const unknownRisk = { + ...tool, + config: { + ...tool.config, + _meta: { + "com.elasticpath/operation": { + ..._meta["com.elasticpath/operation"], + risk: "erase" as const, + }, + }, + }, + } + + register(tool) + // @ts-expect-error + register(withoutMeta) + // @ts-expect-error + register(unknownRisk) + }) + + it("keeps typed arguments in a wrapped handler", () => { + const tool = getPersonalDataLogsTool() + + server.registerTool(tool.name, tool.config, (args, extra) => { + expectTypeOf(args.query).toEqualTypeOf() + // @ts-expect-error + tool.handler({ colour: "red" }, extra) + return tool.handler(args, extra) + }) + }) + + it("registers every tool with an extended input that sets a header", () => { + tools().forEach((t) => + server.registerTool( + t.name, + { + ...t.config, + inputSchema: t.config.inputSchema.extend({ + store_id: z.string().describe("The Elastic Path store to act on."), + }), + }, + ({ store_id, ...args }, extra) => + t.handler( + { ...args, headers: { ...args.headers, "EP-Store-Id": store_id } }, + extra, + ), + ), + ) + }) +}) diff --git a/packages/sdks/personal-data/src/mcp.test.ts b/packages/sdks/personal-data/src/mcp.test.ts new file mode 100644 index 000000000..c16eb7ce2 --- /dev/null +++ b/packages/sdks/personal-data/src/mcp.test.ts @@ -0,0 +1,356 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { ToolSchema } from "@modelcontextprotocol/sdk/types.js" +import type { Tool as ListedTool } from "@modelcontextprotocol/sdk/types.js" +import fs from "node:fs" +import * as main from "./index" +import { client as defaultClient } from "./client/client.gen" +import * as mcp from "./mcp" +import { getPersonalDataLogsTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +const baseUrl = "https://useast.api.elasticpath.com" +const OPERATION = "com.elasticpath/operation" + +function stubFetch(body: unknown, status = 200) { + const requests: Request[] = [] + const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push( + input instanceof Request && init === undefined + ? input + : new Request(input, init), + ) + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json" }, + }) + }) as typeof globalThis.fetch + return { requests, fetch } +} + +const clientWith = ( + fetch: typeof globalThis.fetch, + config?: { headers: Record }, +) => + main.createPersonalDataClient({ + baseUrl, + token: "pre-issued", + fetch, + retry: false, + config, + }) + +const extraWith = (signal = new AbortController().signal) => + ({ signal }) as Parameters[1] + +async function connect(registered: Tool[]) { + const server = new McpServer({ name: "personal-data", version: "1.0.0" }) + registered.forEach((t) => server.registerTool(t.name, t.config, t.handler)) + const mcpClient = new Client({ name: "test-client", version: "1.0.0" }) + const [clientSide, serverSide] = InMemoryTransport.createLinkedPair() + await Promise.all([server.connect(serverSide), mcpClient.connect(clientSide)]) + return mcpClient +} + +const functionNamesInOperationOrder = () => + [ + ...fs + .readFileSync(new URL("./client/sdk.gen.ts", import.meta.url), "utf8") + .matchAll(/^export const (\w+) =/gm), + ].map((match) => match[1]!) + +const operationOf = (tool: Tool) => tool.config._meta[OPERATION] + +const docCommentOf = (functionName: string) => { + const source = fs.readFileSync( + new URL("./client/sdk.gen.ts", import.meta.url), + "utf8", + ) + const comment = source + .split(`\nexport const ${functionName} =`)[0]! + .split("/**") + .at(-1)! + .split("*/")[0]! + return comment + .split("\n") + .map((line) => line.replace(/^\s*\* ?/, "").trim()) + .join("\n") + .trim() +} + +const overrides = new URL( + "../../specs/overrides/mcp/personal-data/", + import.meta.url, +) + +const writtenDescriptions = () => + fs.readdirSync(overrides).map((file) => + fs + .readFileSync(new URL(file, overrides), "utf8") + .split("x-mcp-description: >-")[1]! + .split(/\n(?=\S)/)[0]! + .trim() + .split(/\s*\n\s*/) + .join(" "), + ) + +describe("tools", () => { + it("holds 7 tools with valid, unique names, in operation order", () => { + const names = tools().map((tool) => tool.name) + + expect(names).toHaveLength(7) + for (const name of names) expect(name).toMatch(/^[a-zA-Z0-9_-]{1,64}$/) + expect(new Set(names).size).toBe(7) + expect(tools().map((tool) => operationOf(tool).id)).toEqual( + functionNamesInOperationOrder().map((name) => `personal_data.${name}`), + ) + }) + + it("exports one tool factory for each operation", () => { + const factories = Object.keys(mcp).filter((name) => name.endsWith("Tool")) + + expect(factories).toHaveLength(7) + }) + + describe("sends each tool's request to its own operation's method and path", () => { + const { requests, fetch } = stubFetch({}) + const client = clientWith(fetch) + + it.each(tools({ client }).map((tool) => [tool.name, tool] as const))( + "%s", + async (_name, tool) => { + requests.length = 0 + const { method, path } = operationOf(tool) + const params = [...path.matchAll(/\{([^}]+)\}/g)].map( + (match) => match[1]!, + ) + const args: Record = {} + if (params.length > 0) { + args.path = Object.fromEntries(params.map((p) => [p, `p-${p}`])) + } + if ("body" in tool.config.inputSchema.shape) args.body = {} + + await tool.handler(args, extraWith()) + + expect(requests).toHaveLength(1) + expect(requests[0]!.method).toBe(method) + expect(new URL(requests[0]!.url).pathname).toBe( + path.replace(/\{([^}]+)\}/g, (_match, p) => `p-${p}`), + ) + }, + ) + }) +}) + +describe("the client a tool calls through", () => { + const response = { data: [] } + let original: ReturnType + let viaDefault: ReturnType + + beforeEach(() => { + original = defaultClient.getConfig() + viaDefault = stubFetch(response) + defaultClient.setConfig({ fetch: viaDefault.fetch }) + }) + + afterEach(() => { + defaultClient.setConfig({ + ...original, + auth: original.auth, + fetch: original.fetch, + }) + }) + + it("calls through the package's default client when no client is given", async () => { + const result = await getPersonalDataLogsTool().handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(1) + expect(viaDefault.requests[0]!.url).toBe( + `${original.baseUrl}/v2/personal-data/logs`, + ) + expect(result.structuredContent).toEqual(response) + }) + + it("sends the credentials of a default client configured from a personal data client", async () => { + defaultClient.setConfig(clientWith(viaDefault.fetch).getConfig()) + + await getPersonalDataLogsTool().handler({}, extraWith()) + + expect(viaDefault.requests[0]!.headers.get("Authorization")).toBe( + "Bearer pre-issued", + ) + }) + + it("uses a given client instead of the default", async () => { + const viaGiven = stubFetch(response) + + await getPersonalDataLogsTool({ + client: clientWith(viaGiven.fetch), + }).handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(0) + expect(viaGiven.requests).toHaveLength(1) + const url = new URL(viaGiven.requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/personal-data/logs`) + }) + + it("sends headers configured on the client with every tool call", async () => { + const { requests, fetch } = stubFetch(response) + const client = clientWith(fetch, { + headers: { "EP-Store-Id": "store-1", "EP-Org-Id": "org-1" }, + }) + + await getPersonalDataLogsTool({ client }).handler({}, extraWith()) + + expect(requests[0]!.headers.get("EP-Store-Id")).toBe("store-1") + expect(requests[0]!.headers.get("EP-Org-Id")).toBe("org-1") + }) +}) + +describe("a tool's handler", () => { + it("aborts the request when the MCP request is cancelled", async () => { + const { requests, fetch } = stubFetch({}) + const controller = new AbortController() + + await getPersonalDataLogsTool({ client: clientWith(fetch) }).handler( + {}, + extraWith(controller.signal), + ) + expect(requests[0]!.signal.aborted).toBe(false) + controller.abort() + + expect(requests[0]!.signal.aborted).toBe(true) + }) + + it("returns an API error as an isError result with the HTTP status", async () => { + const errors = { errors: [{ status: 404, title: "Not Found" }] } + const { fetch } = stubFetch(errors, 404) + + const result = await getPersonalDataLogsTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result).toEqual({ + isError: true, + content: [{ type: "text", text: `HTTP 404: ${JSON.stringify(errors)}` }], + }) + }) + + it("returns a network failure as an isError result with its message", async () => { + const fetch = (async () => { + throw new TypeError("fetch failed") + }) as typeof globalThis.fetch + + const result = await getPersonalDataLogsTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result.isError).toBe(true) + expect(result.content).toEqual([ + { type: "text", text: expect.stringContaining("fetch failed") }, + ]) + }) +}) + +describe("a tool's description", () => { + it("is the description written for it in the spec overrides, for every tool", () => { + expect( + tools() + .map((tool) => tool.config.description) + .sort(), + ).toEqual(writtenDescriptions().sort()) + }) + + it("leaves the full spec text to the SDK function's doc comment", () => { + expect(docCommentOf("getRelatedDataEntries").length).toBeGreaterThan(600) + }) +}) + +describe("the personal data tools on an MCP server", () => { + let listed: ListedTool[] + + beforeAll(async () => { + const mcpClient = await connect( + tools({ client: clientWith(stubFetch({}).fetch) }), + ) + listed = (await mcpClient.listTools()).tools + }) + + it("describes every tool in at most 600 characters", () => { + for (const tool of listed) { + expect(tool.description!.length, tool.name).toBeLessThanOrEqual(600) + } + }) + + it("lists all 7, each passing the MCP SDK's ToolSchema", () => { + expect(listed).toHaveLength(7) + for (const tool of listed) { + expect(ToolSchema.safeParse(tool).success, tool.name).toBe(true) + } + }) + + it("marks postErasureRequest as a destructive write, from the x-mcp-risk override in the spec", () => { + const tool = listed.find( + ({ name }) => name === "personal_data_post_erasure_request", + )! + + expect(tool.annotations).toMatchObject({ + readOnlyHint: false, + destructiveHint: true, + idempotentHint: false, + }) + }) + + it("asks no tool for an Authorization header", () => { + for (const tool of listed) { + const headers = (tool.inputSchema.properties as Record) + ?.headers + const names = Object.keys(headers?.properties ?? {}) + + expect(names.map((name) => name.toLowerCase())).not.toContain( + "authorization", + ) + } + }) + + it("rejects an unknown query key without sending the request", async () => { + const { requests, fetch } = stubFetch({}) + const mcpClient = await connect([ + getPersonalDataLogsTool({ client: clientWith(fetch) }), + ]) + + const result = await mcpClient.callTool({ + name: "personal_data_get_personal_data_logs", + arguments: { query: { colour: "red" } }, + }) + + expect(result.isError).toBe(true) + expect(requests).toHaveLength(0) + }) + + it("sends a call through the given client and returns the data", async () => { + const response = { data: [] } + const { requests, fetch } = stubFetch(response) + const mcpClient = await connect(tools({ client: clientWith(fetch) })) + + const result = await mcpClient.callTool({ + name: "personal_data_get_personal_data_logs", + arguments: {}, + }) + + expect(requests).toHaveLength(1) + const url = new URL(requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/personal-data/logs`) + expect(requests[0]!.headers.get("Authorization")).toBe("Bearer pre-issued") + expect(result.structuredContent).toEqual(response) + }) +}) + +describe("the main entry", () => { + it("exports no MCP code", () => { + expect(main).not.toHaveProperty("tools") + expect(main).not.toHaveProperty("getPersonalDataLogsTool") + }) +}) diff --git a/packages/sdks/personal-data/src/mcp.ts b/packages/sdks/personal-data/src/mcp.ts new file mode 100644 index 000000000..fda10e5a5 --- /dev/null +++ b/packages/sdks/personal-data/src/mcp.ts @@ -0,0 +1,2 @@ +export * from "./client/mcp.gen" +export type { OperationMeta, Tool, ToolConfig } from "./client/mcp-support.gen" diff --git a/packages/sdks/personal-data/test-cjs-minimal.cjs b/packages/sdks/personal-data/test-cjs-minimal.cjs index 8b924a38b..2095e9dba 100644 --- a/packages/sdks/personal-data/test-cjs-minimal.cjs +++ b/packages/sdks/personal-data/test-cjs-minimal.cjs @@ -1,5 +1,7 @@ // This file is used to test that CommonJS requires work correctly const PersonalData = require("./dist/index.cjs") +const mcp = require("./dist/mcp.cjs") console.log("PersonalData:", Object.keys(PersonalData)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/personal-data/test-esm-minimal.mjs b/packages/sdks/personal-data/test-esm-minimal.mjs index 71ed332fd..a5d5d31cc 100644 --- a/packages/sdks/personal-data/test-esm-minimal.mjs +++ b/packages/sdks/personal-data/test-esm-minimal.mjs @@ -1,5 +1,7 @@ // This file is used to test that ESM imports work correctly import * as PersonalData from "./dist/index.mjs" +import * as mcp from "./dist/mcp.mjs" console.log("PersonalData:", Object.keys(PersonalData)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/personal-data/test/built-output.test.ts b/packages/sdks/personal-data/test/built-output.test.ts new file mode 100644 index 000000000..70bbe4f0f --- /dev/null +++ b/packages/sdks/personal-data/test/built-output.test.ts @@ -0,0 +1,99 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { build } from "tsup" +import type { Options } from "tsup" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import tsupConfig from "../tsup.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const outDir = path.join(here, ".generated-dist") + +const SPECIFIER = + /(?:\bfrom\s*|\bimport\s*\(\s*|\brequire\s*\(\s*|^\s*import\s+)["']([^"']+)["']/gm + +function specifiersIn(file: string) { + const source = fs.readFileSync(file, "utf8") + return [...source.matchAll(SPECIFIER)].map((match) => match[1]!) +} + +function importGraph(entry: string) { + const files = new Set() + const packages = new Set() + const pending = [path.join(outDir, entry)] + while (pending.length > 0) { + const file = pending.pop()! + if (files.has(file)) continue + files.add(file) + for (const specifier of specifiersIn(file)) { + if (specifier.startsWith(".")) { + pending.push(path.resolve(path.dirname(file), specifier)) + } else { + packages.add(specifier) + } + } + } + return { + files: [...files].map((file) => path.relative(outDir, file)), + packages: [...packages], + } +} + +function builtFiles(directory = outDir): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(directory, entry.name) + if (entry.isDirectory()) return builtFiles(full) + return /\.(mjs|cjs)$/.test(entry.name) ? [full] : [] + }) +} + +beforeAll(async () => { + await build({ + ...(tsupConfig as Options), + config: false, + dts: false, + outDir, + silent: true, + sourcemap: false, + }) +}, 120_000) + +afterAll(() => { + fs.rmSync(outDir, { force: true, recursive: true }) +}) + +describe("the built package", () => { + it.each(["index.mjs", "index.cjs"])( + "reaches no MCP code from the main entry, %s", + (entry) => { + const graph = importGraph(entry) + + expect(graph.files).toContain( + path.join("client", `sdk.gen.${entry.split(".")[1]}`), + ) + expect(graph.files.filter((file) => file.includes("mcp"))).toEqual([]) + expect(graph.packages.filter((name) => name.includes("mcp"))).toEqual([]) + }, + ) + + it.each(["mcp.mjs", "mcp.cjs"])( + "reaches the generated tools from %s", + (entry) => { + const graph = importGraph(entry) + const extension = entry.split(".")[1] + + expect(graph.files).toContain(path.join("client", `mcp.gen.${extension}`)) + }, + ) + + it("imports the MCP SDK nowhere, because it is a type-only peer", () => { + for (const file of builtFiles()) { + expect( + specifiersIn(file).filter((name) => + name.includes("modelcontextprotocol"), + ), + file, + ).toEqual([]) + } + }) +}) diff --git a/packages/sdks/personal-data/test/mcp-generation.test.ts b/packages/sdks/personal-data/test/mcp-generation.test.ts new file mode 100644 index 000000000..b4aa09993 --- /dev/null +++ b/packages/sdks/personal-data/test/mcp-generation.test.ts @@ -0,0 +1,74 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { createClient } from "@hey-api/openapi-ts" +import { execFileSync } from "node:child_process" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import config from "../openapi-ts.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const packageRoot = path.join(here, "..") +const committed = path.join(packageRoot, "src/client") +const firstRun = path.join(here, ".generated-mcp-first") +const secondRun = path.join(here, ".generated-mcp-second") +const workspaceBin = path.join(packageRoot, "../../../node_modules/.bin") +const mainEntryFiles = ["index.ts", "sdk.gen.ts", "types.gen.ts", "zod.gen.ts"] +const mcpFiles = ["mcp.gen.ts", "mcp-support.gen.ts"] + +const read = (directory: string, file: string) => + fs.readFileSync(path.join(directory, file), "utf8") + +async function generateInto(directory: string) { + const userConfig = await config + await createClient({ + ...userConfig, + input: path.join(packageRoot, "../specs/bundled/personal-data_standalone.yaml"), + output: { ...(userConfig.output as object), path: directory }, + }) +} + +beforeAll(async () => { + process.env.PATH = [workspaceBin, process.env.PATH].join(path.delimiter) + execFileSync( + path.join(packageRoot, "node_modules/.bin/redocly"), + [ + "bundle", + "personal-data-standalone@v1", + "--config", + "../specs/config/redocly.yaml", + ], + { cwd: packageRoot, stdio: "pipe" }, + ) + await generateInto(firstRun) + await generateInto(secondRun) +}, 120_000) + +afterAll(() => { + for (const directory of [firstRun, secondRun]) { + fs.rmSync(directory, { force: true, recursive: true }) + } +}) + +describe("generating the ./mcp export", () => { + it("writes the same MCP files byte for byte each time", () => { + for (const file of mcpFiles) { + expect(read(secondRun, file), file).toBe(read(firstRun, file)) + } + }) + + it("matches the committed MCP files", () => { + for (const file of mcpFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("leaves the main entry's generated files as committed", () => { + for (const file of mainEntryFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("keeps the MCP files out of the generated entry", () => { + expect(read(firstRun, "index.ts")).not.toContain("mcp") + }) +}) diff --git a/packages/sdks/personal-data/tsconfig.test.json b/packages/sdks/personal-data/tsconfig.test.json new file mode 100644 index 000000000..fc8520e73 --- /dev/null +++ b/packages/sdks/personal-data/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/sdks/personal-data/tsup.config.ts b/packages/sdks/personal-data/tsup.config.ts index 91c898b67..44169c968 100644 --- a/packages/sdks/personal-data/tsup.config.ts +++ b/packages/sdks/personal-data/tsup.config.ts @@ -6,7 +6,7 @@ import { } from "esbuild-fix-imports-plugin" export default defineConfig({ - entry: ["src/**/*.ts", "!src/**/*.test.ts"], + entry: ["src/**/*.ts", "!src/**/*.test.ts", "!src/**/*.test-d.ts"], format: ["esm", "cjs"], dts: true, splitting: false, diff --git a/packages/sdks/personal-data/vitest.config.ts b/packages/sdks/personal-data/vitest.config.ts index b7b707f74..4b27a5bb8 100644 --- a/packages/sdks/personal-data/vitest.config.ts +++ b/packages/sdks/personal-data/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from "vitest/config" export default defineConfig({ test: { include: ["**/*.{test,spec}.{js,ts}"], + typecheck: { + enabled: true, + include: ["src/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, }, }) diff --git a/packages/sdks/settings/README.md b/packages/sdks/settings/README.md index f76383509..90e6bf966 100644 --- a/packages/sdks/settings/README.md +++ b/packages/sdks/settings/README.md @@ -2,7 +2,6 @@ Below you'll find instructions on how to install, set up, and use the client, along with a list of available operations. - ## Features - type-safe response data and errors @@ -13,7 +12,6 @@ Below you'll find instructions on how to install, set up, and use the client, al --- - ## Installation ```bash @@ -28,7 +26,6 @@ yarn add @epcc-sdk/settings ## Client Usage - Clients are responsible for sending the actual HTTP requests. The Fetch client is built as a thin wrapper on top of Fetch API, extending its functionality. If you're already familiar with Fetch, configuring your client will feel like working directly with Fetch API. @@ -40,23 +37,22 @@ You can configure the client in two ways: **When using the operation function to make requests, by default the global client will be used unless another is provided.** - ### 1. Configure the internal `client` instance directly This is the simpler approach. You can call the setConfig() method at the beginning of your application or anytime you need to update the client configuration. You can pass any Fetch API configuration option to setConfig(), and even your own Fetch implementation. ```ts -import { client } from "@epcc-sdk/settings"; +import { client } from "@epcc-sdk/settings" client.setConfig({ -// set default base url for requests -baseUrl: 'https://euwest.api.elasticpath.com', + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", -// set default headers for requests -headers: { -Authorization: 'Bearer YOUR_AUTH_TOKEN', -}, -}); + // set default headers for requests + headers: { + Authorization: "Bearer YOUR_AUTH_TOKEN", + }, +}) ``` The disadvantage of this approach is that your code may call the client instance before it's configured for the first time. Depending on your use case, you might need to use the second approach. @@ -66,27 +62,27 @@ The disadvantage of this approach is that your code may call the client instance This is useful when you want to use a different instance of the client for different parts of your application or when you want to use different configurations for different parts of your application. ```ts -import { createClient } from "@epcc-sdk/settings"; +import { createClient } from "@epcc-sdk/settings" // Create the client with your API base URL. const client = createClient({ - // set default base url for requests - baseUrl: "https://euwest.api.elasticpath.com", - /** - * Set default headers only for requests made by this client. - */ - headers: { - "Custom-Header": 'My Value', - }, -}); + // set default base url for requests + baseUrl: "https://euwest.api.elasticpath.com", + /** + * Set default headers only for requests made by this client. + */ + headers: { + "Custom-Header": "My Value", + }, +}) ``` You can also pass this instance to any SDK function through the client option. This will override the default instance from `import { client } from "@epcc-sdk/settings>". ```ts const response = await getV2Settings({ - client: myClient, -}); + client: myClient, +}) ``` ### Direct configuration @@ -95,8 +91,8 @@ Alternatively, you can pass the client configuration options to each SDK functio ```ts const response = await getV2Settings({ - baseUrl: 'https://example.com', // <-- override default configuration -}); + baseUrl: "https://example.com", // <-- override default configuration +}) ``` ## Interceptors (Middleware) @@ -104,35 +100,34 @@ const response = await getV2Settings({ Interceptors (middleware) can be used to modify requests before they're sent or responses before they're returned to your application. They can be added with use and removed with eject. Below is an example request interceptor ```ts -import { client } from "@epcc-sdk/settings"; +import { client } from "@epcc-sdk/settings" // Supports async functions client.interceptors.request.use(async (request) => { - // do something - return request; -}); + // do something + return request +}) client.interceptors.request.eject((request) => { - // do something - return request; -}); - + // do something + return request +}) ``` and an example response interceptor ```ts -import { client } from "@epcc-sdk/settings"; +import { client } from "@epcc-sdk/settings" client.interceptors.response.use((response) => { - // do something - return response; -}); + // do something + return response +}) client.interceptors.response.eject((response) => { - // do something - return response; -}); + // do something + return response +}) ``` > **_Tip:_** To eject, you must provide a reference to the function that was passed to use(). @@ -143,18 +138,15 @@ client.interceptors.response.eject((response) => { source, sets the `auth` hook, refreshes and replays once on a 401, and backs off on a 429. ```ts -import { - createSettingsClient, - getV2Settings, -} from "@epcc-sdk/settings"; +import { createSettingsClient, getV2Settings } from "@epcc-sdk/settings" const client = createSettingsClient({ baseUrl: "https://euwest.api.elasticpath.com", clientId: process.env.EPCC_CLIENT_ID!, clientSecret: process.env.EPCC_CLIENT_SECRET!, -}); +}) -const { data } = await getV2Settings({ client }); +const { data } = await getV2Settings({ client }) ``` Credentials come from `source`, `provider`, `token`, `clientId` plus `clientSecret`, or @@ -176,11 +168,83 @@ Zod schemas for every request body, path and response are published under the `/ subpath. `zod` is an optional peer dependency (4.x), so the root entry never imports it. ```ts -import { zSettingsResponse } from "@epcc-sdk/settings/zod"; +import { zSettingsResponse } from "@epcc-sdk/settings/zod" -const settings = zSettingsResponse.parse(data); +const settings = zSettingsResponse.parse(data) ``` +## MCP endpoint tools + +The `/mcp` subpath turns each of the 3 settings operations into a Model Context Protocol (MCP) tool. +The main entry imports none of it. `zod` 4 and `@modelcontextprotocol/sdk` are needed only for this +subpath. + +Each operation has one tool factory, named after its function with `Tool` added, such as +`getV2SettingsTool`. A factory returns `{ name, config, handler }`, the three arguments that +`McpServer.registerTool` takes. `tools()` returns all 3 in operation order. A handler returns an API +error as an `isError` result and does not throw. + +Register one tool: + +```ts +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { getV2SettingsTool } from "@epcc-sdk/settings/mcp" + +const server = new McpServer({ name: "settings", version: "1.0.0" }) +const tool = getV2SettingsTool() +server.registerTool(tool.name, tool.config, tool.handler) +``` + +A tool built without a client calls through the package's module level `client`, like an operation +does. That client has no credentials until you configure it. Configure it once: + +```ts +import { client, createSettingsClient } from "@epcc-sdk/settings" + +client.setConfig( + createSettingsClient({ baseUrl, clientId, clientSecret }).getConfig(), +) +``` + +Register every tool, with a client that sends the same headers on every call: + +```ts +import * as settings from "@epcc-sdk/settings/mcp" + +const client = createSettingsClient({ + baseUrl, + clientId, + clientSecret, + config: { headers: { "EP-Store-Id": storeId, "EP-Org-Id": orgId } }, +}) +settings + .tools({ client }) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Register the read-only tools only: + +```ts +settings + .tools({ client }) + .filter((t) => t.config._meta["com.elasticpath/operation"].risk === "read") + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) +``` + +Each tool is named `settings_`, and its arguments are grouped under `path`, +`query`, `headers` and `body`. The `path`, `query` and `headers` groups reject keys the spec does not +list. The `body` keeps them, so an attribute the spec does not list still reaches the API. The client +supplies the `Authorization` header, so no tool asks for it. Cancelling the MCP request cancels the +HTTP request. + +Each tool's description is written for a model choosing between tools: what the tool does, when to +use it rather than a similar tool, and any caveat that changes when to call it, in at most 600 +characters. The full spec description stays in the doc comment of the operation's function and its +tool factory. + +`config._meta["com.elasticpath/operation"]` holds the operation's `id`, `method`, `path` and `risk`. +The risk is `read`, `create`, `update` or `delete`, and the annotations follow from it. + ## Build URL If you need to access the compiled URL, you can use the buildUrl() method. It's loosely typed by default to accept almost any value; in practice, you will want to pass a type hint. @@ -188,34 +252,30 @@ If you need to access the compiled URL, you can use the buildUrl() method. It's ```ts type FooData = { path: { - fooId: number; - }; + fooId: number + } query?: { - bar?: string; - }; - url: '/foo/{fooId}'; -}; + bar?: string + } + url: "/foo/{fooId}" +} const url = client.buildUrl({ path: { fooId: 1, }, query: { - bar: 'baz', + bar: "baz", }, - url: '/foo/{fooId}', -}); -console.log(url); // prints '/foo/1?bar=baz' + url: "/foo/{fooId}", +}) +console.log(url) // prints '/foo/1?bar=baz' ``` - --- - - - - ## Operation Usage + The following examples demonstrate how to use the operation function to make requests. ```ts @@ -234,12 +294,8 @@ const product = await getV2Settings({ --- - - ## Available Operations - - - **`deleteV2Settings`** (`DELETE /v2/settings`) - **`getV2Settings`** (`GET /v2/settings`) @@ -250,7 +306,4 @@ const product = await getV2Settings({ - **`putV2SettingsCart`** (`PUT /v2/settings/cart`) - - - ---- \ No newline at end of file +--- diff --git a/packages/sdks/settings/openapi-ts.config.ts b/packages/sdks/settings/openapi-ts.config.ts index bb9eb2d2d..f393043a9 100644 --- a/packages/sdks/settings/openapi-ts.config.ts +++ b/packages/sdks/settings/openapi-ts.config.ts @@ -1,8 +1,9 @@ -import { defineConfig } from "@hey-api/openapi-ts" +import { $, defineConfig } from "@hey-api/openapi-ts" import { int64AsNumber } from "../specs/heyapi/int64-as-number" +import { mcpTools } from "../specs/heyapi/mcp-tools" export default defineConfig({ - input: "../specs/settings.yaml", + input: "../specs/bundled/settings_standalone.yaml", output: { path: "src/client", postProcess: ["prettier"] }, plugins: [ { @@ -16,5 +17,6 @@ export default defineConfig({ metadata: true, name: "zod", }, + mcpTools($, { api: "settings" }), ], }) diff --git a/packages/sdks/settings/package.json b/packages/sdks/settings/package.json index 061c152f6..78da663ec 100644 --- a/packages/sdks/settings/package.json +++ b/packages/sdks/settings/package.json @@ -7,8 +7,9 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "pnpm openapi-ts && pnpm build:tsup", + "build": "pnpm oas:build && pnpm openapi-ts && pnpm build:tsup", "build:tsup": "tsup", + "oas:build": "redocly bundle settings-standalone@v1 --config ../specs/config/redocly.yaml", "openapi-ts": "openapi-ts", "test": "vitest run", "test:watch": "vitest" @@ -34,12 +35,25 @@ "default": "./dist/zod.cjs" } }, + "./mcp": { + "import": { + "types": "./dist/mcp.d.ts", + "default": "./dist/mcp.mjs" + }, + "require": { + "types": "./dist/mcp.d.cts", + "default": "./dist/mcp.cjs" + } + }, "./package.json": "./package.json" }, "typesVersions": { "*": { "zod": [ "./dist/zod.d.ts" + ], + "mcp": [ + "./dist/mcp.d.ts" ] } }, @@ -55,6 +69,9 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.99.0", + "@modelcontextprotocol/sdk": "1.31.0", + "@redocly/cli": "^1.21.0", + "@redocly/openapi-core": "^1.21.0", "@types/ejs": "^3.1.5", "ejs": "^3.1.10", "esbuild-fix-imports-plugin": "^1.0.19", @@ -65,9 +82,13 @@ "zod": "4.6.5" }, "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.31.0", "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, "zod": { "optional": true } diff --git a/packages/sdks/settings/pnpm-lock.yaml b/packages/sdks/settings/pnpm-lock.yaml index 0cb6732b4..6648e9398 100644 --- a/packages/sdks/settings/pnpm-lock.yaml +++ b/packages/sdks/settings/pnpm-lock.yaml @@ -15,6 +15,15 @@ importers: '@hey-api/openapi-ts': specifier: 0.99.0 version: 0.99.0(typescript@5.8.2) + '@modelcontextprotocol/sdk': + specifier: 1.31.0 + version: 1.31.0(zod@4.6.5) + '@redocly/cli': + specifier: ^1.21.0 + version: 1.34.21(ajv@8.20.0) + '@redocly/openapi-core': + specifier: ^1.21.0 + version: 1.34.21 '@types/ejs': specifier: ^3.1.5 version: 3.1.5 @@ -42,6 +51,24 @@ importers: packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} @@ -348,6 +375,13 @@ packages: cpu: [x64] os: [win32] + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@hey-api/codegen-core@0.9.1': resolution: {integrity: sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==} engines: {node: '>=22.18.0'} @@ -373,10 +407,24 @@ packages: '@hey-api/types@0.1.4': resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -401,20 +449,146 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsep-plugin/assignment@1.4.0': + resolution: {integrity: sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.1.0': + resolution: {integrity: sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/cli@1.34.21': + resolution: {integrity: sha512-cWZMh6z6AqJ5Q2nQz2K5XhOnwVWcidtnk4NMjMvdHHpGtjnsPSWKg4fdyWhY46ze5SXu6GxFLTLbMoXGz2JJHA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.21': + resolution: {integrity: sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.21': + resolution: {integrity: sha512-4qTfsJJg51mHqOqcgkw9QLy4wHckt+tqWcBeqhl9/w+4tiOmku06Sx4DqW2a3732jHXIPd0/T1xsehNt4lOhXw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.40.0': resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] @@ -640,6 +814,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -658,6 +835,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@vitest/expect@3.2.7': resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} @@ -687,6 +867,29 @@ packages: '@vitest/utils@3.2.7': resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -703,6 +906,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -710,6 +917,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -720,15 +930,31 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.1: resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} @@ -739,6 +965,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.3.4: resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: @@ -751,6 +981,17 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -771,6 +1012,16 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -782,6 +1033,16 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -793,6 +1054,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -803,10 +1068,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -825,6 +1120,9 @@ packages: supports-color: optional: true + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -844,16 +1142,42 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -865,9 +1189,32 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} @@ -885,16 +1232,68 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -915,15 +1314,55 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -935,10 +1374,69 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -957,6 +1455,12 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -972,14 +1476,36 @@ packages: engines: {node: '>=10'} hasBin: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -987,6 +1513,36 @@ packages: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsep@1.6.0: + resolution: {integrity: sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==} + engines: {node: '>= 20.16.0'} + + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1001,15 +1557,58 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1017,14 +1616,50 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1036,20 +1671,98 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.12: resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openapi-sampler@1.7.0: + resolution: {integrity: sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==} + + openapi-sampler@1.7.6: + resolution: {integrity: sha512-MvWOm3vdgX7CZ6CNfu2wOFMGhC/pq03BxYTL/DKCkyPWfR6XIwUJnOV32mQGgCcUm1tY/y1jj7F2yqx1DieIWw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1058,6 +1771,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1068,6 +1784,9 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1083,9 +1802,21 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.3.3: resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1112,13 +1843,70 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@3.1.0: resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} + peerDependencies: + react: ^19.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1127,6 +1915,27 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} + redoc@2.5.3: + resolution: {integrity: sha512-bBbat+Sx6xKWdyoCGTtA0BWeTEW9Vs4VnEja7q7ZLOk4IM7cHQLrf+kDxWF6dKeKxT8kOBnoy/OsNXCeLttpyQ==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1144,15 +1953,47 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1161,6 +2002,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1168,10 +2043,21 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1179,9 +2065,16 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1190,6 +2083,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1201,6 +2097,28 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1210,6 +2128,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1243,6 +2165,13 @@ packages: resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -1272,11 +2201,49 @@ packages: typescript: optional: true + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici@6.29.0: + resolution: {integrity: sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1350,9 +2317,15 @@ packages: jsdom: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -1366,6 +2339,9 @@ packages: engines: {node: '>=8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1374,15 +2350,74 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.10': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.25.2': optional: true @@ -1536,6 +2571,10 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@hey-api/codegen-core@0.9.1': dependencies: '@hey-api/types': 0.1.4 @@ -1586,6 +2625,12 @@ snapshots: '@hey-api/types@0.1.4': {} + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@humanwhocodes/momoa@2.0.4': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1595,6 +2640,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1616,14 +2665,216 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsep-plugin/assignment@1.4.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + + '@jsep-plugin/regex@1.1.0(jsep@1.6.0)': + dependencies: + jsep: 1.6.0 + '@lukeed/ms@2.0.2': {} + '@modelcontextprotocol/sdk@1.31.0(zod@4.6.5)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) + transitivePeerDependencies: + - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@nodable/entities@3.1.0': {} + + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/cli@1.34.21(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.21 + '@redocly/respect-core': 1.34.21(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 4.0.3 + colorette: 1.4.0 + core-js: 3.32.1 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.0.1 + glob: 7.2.3 + handlebars: 4.7.10 + js-yaml: 4.3.2 + mobx: 6.12.3 + pluralize: 8.0.0 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + redoc: 2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)) + semver: 7.7.4 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.21': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.21(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.21 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.3.2 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.0 + openapi-sampler: 1.7.0 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.29.0 + transitivePeerDependencies: + - ajv + - supports-color + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -1759,6 +3010,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.63.5': optional: true + '@sinclair/typebox@0.27.12': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -1774,6 +3027,9 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/trusted-types@2.0.7': + optional: true + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -1816,6 +3072,28 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1826,18 +3104,47 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} + anynum@1.0.1: {} + argparse@2.0.1: {} assertion-error@2.0.1: {} async@3.2.6: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1847,6 +3154,8 @@ snapshots: dependencies: balanced-match: 1.0.2 + buffer-from@1.1.2: {} + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -1856,6 +3165,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + c12@3.3.4: dependencies: chokidar: 5.0.0 @@ -1873,6 +3184,18 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -1896,6 +3219,16 @@ snapshots: dependencies: readdirp: 5.1.1 + classnames@2.5.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1904,24 +3237,58 @@ snapshots: color-support@1.1.3: {} + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@15.0.0: {} commander@4.1.1: {} concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} consola@3.4.2: {} + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-js@3.32.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -1930,6 +3297,8 @@ snapshots: dependencies: ms: 2.1.3 + decko@1.2.0: {} + deep-eql@5.0.2: {} default-browser-id@5.0.1: {} @@ -1943,12 +3312,32 @@ snapshots: defu@6.1.7: {} + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + diff-sequences@29.6.3: {} + + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.4.7: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -1957,8 +3346,27 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-promise@3.3.1: {} + esbuild-fix-imports-plugin@1.0.19: {} esbuild-plugin-file-path-extensions@1.0.0: {} @@ -2020,35 +3428,163 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} + + escape-html@1.0.3: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 - expect-type@1.4.0: {} + etag@1.8.1: {} - exsolve@1.1.1: {} + event-target-shim@5.0.1: {} - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + eventemitter3@5.0.4: {} - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 + eventsource-parser@3.1.1: {} - filelist@1.0.4: + eventsource@3.0.7: dependencies: - minimatch: 5.1.6 + eventsource-parser: 3.1.1 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + expect-type@1.4.0: {} - fsevents@2.3.3: - optional: true + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3 + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color - get-tsconfig@4.14.0: + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.8: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + foreach@2.0.6: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2063,8 +3599,72 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-client@1.3.5: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -2075,6 +3675,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-promise@4.0.0: {} + + is-unsafe@2.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -2094,16 +3698,62 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jiti@2.7.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.2.0: dependencies: argparse: 2.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsep@1.6.0: {} + + json-pointer@0.6.2: + dependencies: + foreach: 2.0.6 + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.4.0(jsep@1.6.0) + '@jsep-plugin/regex': 1.1.0(jsep@1.6.0) + jsep: 1.6.0 + + jsonpointer@5.0.1: {} + + leven@3.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2112,14 +3762,42 @@ snapshots: lodash.sortby@4.7.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} + lunr@2.3.9: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + mark.js@8.11.1: {} + + marked@4.3.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2128,12 +3806,36 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mobx-react-lite@4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx-react@9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + mobx: 6.12.3 + mobx-react-lite: 4.1.1(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react: 19.3.1 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + mobx@6.12.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -2144,10 +3846,76 @@ snapshots: nanoid@3.3.19: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + neo-async@2.6.2: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.12: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.1 + open@11.0.0: dependencies: default-browser: 5.5.1 @@ -2157,8 +3925,30 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openapi-sampler@1.7.0: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + openapi-sampler@1.7.6: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.2 + json-pointer: 0.6.2 + + outdent@0.8.0: {} + package-json-from-dist@1.0.1: {} + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -2166,12 +3956,16 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} perfect-debounce@2.1.0: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@4.0.2: {} @@ -2180,12 +3974,20 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-types@2.3.3: dependencies: confbox: 0.3.1 exsolve: 1.1.1 pathe: 2.0.3 + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.10 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28): dependencies: lilconfig: 3.1.3 @@ -2201,17 +4003,118 @@ snapshots: powershell-utils@0.1.0: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + rc9@3.1.0: dependencies: defu: 6.1.7 destr: 2.0.5 + react-dom@19.3.1(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.28.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-tabs@6.1.1(react@19.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.3.1 + + react@19.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.1.1: {} + redoc@2.5.3(core-js@3.32.1)(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1)): + dependencies: + '@redocly/openapi-core': 1.34.21 + classnames: 2.5.1 + core-js: 3.32.1 + decko: 1.2.0 + dompurify: 3.4.17 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.12.3 + mobx-react: 9.2.0(mobx@6.12.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + openapi-sampler: 1.7.6 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + react-tabs: 6.1.1(react@19.3.1) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + + reftools@1.1.9: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -2274,30 +4177,151 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.63.5 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-applescript@7.1.0: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.28.0: {} + + semver@7.7.4: {} + semver@7.8.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} + simple-websocket@9.1.0: + dependencies: + debug: 4.4.3 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + slugify@1.4.7: {} + source-map-js@1.2.1: {} + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@3.10.0: {} + stickyfill@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2310,6 +4334,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2322,6 +4350,21 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.3.1 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.3.1(react@19.3.1) + + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -2336,6 +4379,22 @@ snapshots: dependencies: has-flag: 4.0.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2364,6 +4423,10 @@ snapshots: tinyspy@4.0.6: {} + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -2399,8 +4462,35 @@ snapshots: - tsx - yaml + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + typescript@5.8.2: {} + uglify-js@3.19.3: + optional: true + + undici@6.29.0: {} + + unpipe@1.0.0: {} + + uri-js-replace@1.0.1: {} + + url-template@2.0.8: {} + + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + vite-node@3.2.4(jiti@2.7.0): dependencies: cac: 6.7.14 @@ -2473,8 +4563,15 @@ snapshots: - tsx - yaml + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -2490,6 +4587,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2502,9 +4601,37 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-naming@0.3.0: {} + + y18n@5.0.8: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + zod-to-json-schema@3.25.2(zod@4.6.5): + dependencies: + zod: 4.6.5 + zod@4.6.5: {} diff --git a/packages/sdks/settings/src/client/mcp-support.gen.ts b/packages/sdks/settings/src/client/mcp-support.gen.ts new file mode 100644 index 000000000..5aedf66aa --- /dev/null +++ b/packages/sdks/settings/src/client/mcp-support.gen.ts @@ -0,0 +1,260 @@ +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js" +import type { + CallToolResult, + ToolAnnotations, +} from "@modelcontextprotocol/sdk/types.js" +import * as z from "zod" + +export type OperationMeta = { + id: string + method: string + path: string + risk: "read" | "create" | "update" | "delete" +} + +export type ToolConfig = { + title?: string + description?: string + inputSchema: z.ZodObject>> + outputSchema?: AnySchema + annotations?: ToolAnnotations + _meta: { + "com.elasticpath/operation": OperationMeta + } +} + +export type Tool = { + readonly name: string + readonly config: ToolConfig + readonly handler: ToolCallback +} + +const messageOf = (error: unknown) => + error instanceof Error ? error.message : JSON.stringify(error) + +export const toToolResult = async ( + request: Promise<{ + data?: unknown + error?: unknown + response?: Response + }>, +): Promise => { + let text: string + try { + const result = await request + if (result.error === undefined) { + const structuredContent = + typeof result.data === "object" && + result.data !== null && + !Array.isArray(result.data) + ? (result.data as Record) + : { data: result.data ?? null } + return { + structuredContent, + content: [{ type: "text", text: JSON.stringify(structuredContent) }], + } + } + text = result.response + ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}` + : messageOf(result.error) + } catch (error) { + text = messageOf(error) + } + return { isError: true, content: [{ type: "text", text }] } +} + +export const loose = (schema: T): T => { + const def: any = schema._zod.def + const copy = (changes: object): T => + schema.clone({ ...def, ...changes }, { parent: true }) + if (def.type === "object") { + return copy({ + catchall: z.unknown(), + shape: Object.fromEntries( + Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]), + ), + }) + } + if (def.type === "array") { + return copy({ element: loose(def.element) }) + } + if (def.type === "record") { + return copy({ valueType: loose(def.valueType) }) + } + if (def.type === "lazy") { + return copy({ getter: () => loose(def.getter()) }) + } + if ( + [ + "optional", + "nullable", + "default", + "readonly", + "nonoptional", + "catch", + "prefault", + ].includes(def.type) + ) { + return copy({ innerType: loose(def.innerType) }) + } + if (def.type === "union") { + return copy({ options: def.options.map(loose) }) + } + if (def.type === "intersection") { + return copy({ left: loose(def.left), right: loose(def.right) }) + } + return schema +} + +type FileNameFields = { + [P in `${K}_name`]: z.ZodOptional +} + +export const dataUriFields = < + S extends z.ZodRawShape, + C extends z.core.$ZodObjectConfig, + K extends string, +>( + schema: z.ZodObject, + fields: ReadonlyArray, + maxBytes: number, +): z.ZodObject>, C> => + schema.extend( + Object.fromEntries( + fields.flatMap((field) => { + const current = schema.shape[field] as unknown as z.ZodType + const uri = z.string().meta({ + format: "uri", + "x-mcp-file": { maxSize: maxBytes }, + description: [ + current.description, + `Send the file as a data: URI, such as data:text/csv;base64,, at most ${maxBytes} bytes once decoded.`, + ] + .filter(Boolean) + .join(" "), + }) + const name = z + .string() + .meta({ + description: `The name of the file sent in ${field}, such as products.csv.`, + }) + .optional() + return [ + [field, current.isOptional() ? uri.optional() : uri], + [`${field}_name`, name], + ] + }), + ), + ) as unknown as z.ZodObject>, C> + +type DataUrisDecoded = T extends object + ? Omit & { + [P in K & keyof T]: undefined extends T[P] ? File | undefined : File + } + : T + +const DATA_URI = /^data:([^,]*),(.*)$/is +const PERCENT_ENCODED = /^[0-9a-f]{2}$/i + +const notADataUriError = (field: string) => + new Error( + `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`, + ) + +const fileTooBigError = (field: string, bytes: number, maxBytes: number) => + new Error( + `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`, + ) + +function percentDecoded(field: string, text: string) { + const bytes: number[] = [] + const encoder = new TextEncoder() + for (let index = 0; index < text.length; index++) { + if (text[index] === "%") { + const hex = text.slice(index + 1, index + 3) + if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field) + bytes.push(parseInt(hex, 16)) + index += 2 + } else { + const codePoint = text.codePointAt(index)! + const character = String.fromCodePoint(codePoint) + bytes.push(...encoder.encode(character)) + index += character.length - 1 + } + } + return new Uint8Array(bytes) +} + +function base64Decoded(field: string, text: string, maxBytes: number) { + const data = text.replace(/\s/g, "") + const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0 + const bytes = Math.floor((data.length * 3) / 4) - padding + if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes) + let binary: string + try { + binary = atob(data) + } catch { + throw new Error(`${field} is not valid base64`) + } + return Uint8Array.from(binary, (character) => character.charCodeAt(0)) +} + +function fileFromDataUri( + field: string, + uri: unknown, + maxBytes: number, + givenName: unknown, +) { + const match = typeof uri === "string" ? DATA_URI.exec(uri) : null + if (!match) throw notADataUriError(field) + const parameters = match[1]!.split(";") + const isBase64 = parameters.at(-1)!.toLowerCase() === "base64" + if (isBase64) parameters.pop() + const mediaType = parameters.shift()!.trim() + const nameParameter = parameters.find((parameter) => + parameter.trim().toLowerCase().startsWith("name="), + ) + let name = field + if (typeof givenName === "string" && givenName.trim()) { + name = givenName.trim() + } else if (nameParameter) { + try { + name = decodeURIComponent(nameParameter.trim().slice("name=".length)) + } catch { + throw notADataUriError(field) + } + } + const bytes = isBase64 + ? base64Decoded(field, match[2]!, maxBytes) + : percentDecoded(field, match[2]!) + if (bytes.length > maxBytes) + throw fileTooBigError(field, bytes.length, maxBytes) + return new File([bytes], name, { + type: mediaType.includes("/") ? mediaType : "text/plain", + }) +} + +export const decodeDataUris = async ( + body: T, + fields: ReadonlyArray, + maxBytes: number, +): Promise> => { + if (typeof body !== "object" || body === null) { + return body as DataUrisDecoded + } + const decoded = { ...body } as Record + for (const field of fields) { + const givenName = decoded[`${field}_name`] + delete decoded[`${field}_name`] + if (decoded[field] !== undefined) { + decoded[field] = fileFromDataUri( + field, + decoded[field], + maxBytes, + givenName, + ) + } + } + return decoded as DataUrisDecoded +} diff --git a/packages/sdks/settings/src/client/mcp.gen.ts b/packages/sdks/settings/src/client/mcp.gen.ts new file mode 100644 index 000000000..79c923e5c --- /dev/null +++ b/packages/sdks/settings/src/client/mcp.gen.ts @@ -0,0 +1,158 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" +import * as z from "zod" + +import type { Client } from "./client" +import { loose, type Tool, toToolResult } from "./mcp-support.gen" +import { deleteV2Settings, getV2Settings, putV2Settings } from "./sdk.gen" +import { zPutV2SettingsBody } from "./zod.gen" + +type ToolOptions = { + client?: Client +} + +const deleteV2SettingsInput = z.object({}).strict() + +/** + * Delete Project Settings + * + * Deletes a store setting. Organization settings cannot be deleted. + */ +export const deleteV2SettingsTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + deleteV2Settings({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "settings_delete_v2_settings" as const, + config: { + title: "Delete Project Settings", + description: + "Deletes the store's project settings. Organization settings cannot be deleted. Get the current settings first, so you can restore them if needed.", + inputSchema: deleteV2SettingsInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "settings.deleteV2Settings", + method: "DELETE", + path: "/v2/settings", + risk: "delete" as const, + }, + }, + }, + handler, + } +} + +const getV2SettingsInput = z.object({}).strict() + +/** + * Get Project Settings + * + * You can get all of the project settings via one API call using a `client_credential` token. The response is in object format as shown in the following example. + * + * :::note + * + * The default `calculation_method` is `line`. + * + * ::: + */ +export const getV2SettingsTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + getV2Settings({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "settings_get_v2_settings" as const, + config: { + title: "Get Project Settings", + description: + "Gets the store's global settings in one call: page length, calculation method for cart and order totals, mandatory address fields, shopper address limit, additional languages, and the read-only limits such as currency, promotion and page offset limits.", + inputSchema: getV2SettingsInput, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "settings.getV2Settings", + method: "GET", + path: "/v2/settings", + risk: "read" as const, + }, + }, + }, + handler, + } +} + +const putV2SettingsInput = z + .object({ + body: loose(zPutV2SettingsBody).optional(), + }) + .strict() + +/** + * Update Project Settings + * + * You can use the Settings endpoint to update your project settings at any time. These global settings take immediate effect. + */ +export const putV2SettingsTool = (options?: ToolOptions) => { + const handler: ToolCallback = (args, extra) => + toToolResult( + putV2Settings({ + ...args, + client: options?.client, + signal: extra.signal, + throwOnError: false, + }), + ) + return { + name: "settings_put_v2_settings" as const, + config: { + title: "Update Project Settings", + description: + "Updates the store's global settings, such as page length, calculation method, mandatory address fields, additional languages and shopper address limit. The new settings take effect immediately. Read-only settings cannot be changed.", + inputSchema: putV2SettingsInput, + annotations: { + readOnlyHint: false, + destructiveHint: true, + idempotentHint: true, + openWorldHint: true, + }, + _meta: { + "com.elasticpath/operation": { + id: "settings.putV2Settings", + method: "PUT", + path: "/v2/settings", + risk: "update" as const, + }, + }, + }, + handler, + } +} + +export const tools = (options?: ToolOptions): Array => [ + deleteV2SettingsTool(options), + getV2SettingsTool(options), + putV2SettingsTool(options), +] diff --git a/packages/sdks/settings/src/mcp.test-d.ts b/packages/sdks/settings/src/mcp.test-d.ts new file mode 100644 index 000000000..5bb1275e4 --- /dev/null +++ b/packages/sdks/settings/src/mcp.test-d.ts @@ -0,0 +1,84 @@ +import { describe, expectTypeOf, it } from "vitest" +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { z } from "zod" +import type { PutV2SettingsData } from "./client/types.gen" +import { putV2SettingsTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +declare const server: McpServer + +describe("registering the generated tools", () => { + it("registers one tool with its name, config and handler", () => { + const tool = putV2SettingsTool() + + server.registerTool(tool.name, tool.config, tool.handler) + }) + + it("registers every tool from tools()", () => { + tools().forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("registers only the read-only tools", () => { + tools() + .filter( + (t) => t.config._meta["com.elasticpath/operation"].risk === "read", + ) + .forEach((t) => server.registerTool(t.name, t.config, t.handler)) + }) + + it("rejects a tool without _meta or with an unknown risk", () => { + const register = (t: Tool) => + server.registerTool(t.name, t.config, t.handler) + const tool = putV2SettingsTool() + const { _meta, ...configWithoutMeta } = tool.config + const withoutMeta = { ...tool, config: configWithoutMeta } + const unknownRisk = { + ...tool, + config: { + ...tool.config, + _meta: { + "com.elasticpath/operation": { + ..._meta["com.elasticpath/operation"], + risk: "erase" as const, + }, + }, + }, + } + + register(tool) + // @ts-expect-error + register(withoutMeta) + // @ts-expect-error + register(unknownRisk) + }) + + it("keeps typed arguments in a wrapped handler", () => { + const tool = putV2SettingsTool() + + server.registerTool(tool.name, tool.config, (args, extra) => { + expectTypeOf(args.body).toEqualTypeOf() + // @ts-expect-error + tool.handler({ colour: "red" }, extra) + return tool.handler(args, extra) + }) + }) + + it("registers every tool with an extended input that sets a header", () => { + tools().forEach((t) => + server.registerTool( + t.name, + { + ...t.config, + inputSchema: t.config.inputSchema.extend({ + store_id: z.string().describe("The Elastic Path store to act on."), + }), + }, + ({ store_id, ...args }, extra) => + t.handler( + { ...args, headers: { ...args.headers, "EP-Store-Id": store_id } }, + extra, + ), + ), + ) + }) +}) diff --git a/packages/sdks/settings/src/mcp.test.ts b/packages/sdks/settings/src/mcp.test.ts new file mode 100644 index 000000000..9b715a5d9 --- /dev/null +++ b/packages/sdks/settings/src/mcp.test.ts @@ -0,0 +1,307 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { ToolSchema } from "@modelcontextprotocol/sdk/types.js" +import type { Tool as ListedTool } from "@modelcontextprotocol/sdk/types.js" +import fs from "node:fs" +import * as main from "./index" +import { client as defaultClient } from "./client/client.gen" +import * as mcp from "./mcp" +import { getV2SettingsTool, tools } from "./mcp" +import type { Tool } from "./mcp" + +const baseUrl = "https://useast.api.elasticpath.com" +const OPERATION = "com.elasticpath/operation" + +function stubFetch(body: unknown, status = 200) { + const requests: Request[] = [] + const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push( + input instanceof Request && init === undefined + ? input + : new Request(input, init), + ) + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json" }, + }) + }) as typeof globalThis.fetch + return { requests, fetch } +} + +const clientWith = ( + fetch: typeof globalThis.fetch, + config?: { headers: Record }, +) => + main.createSettingsClient({ + baseUrl, + token: "pre-issued", + fetch, + retry: false, + config, + }) + +const extraWith = (signal = new AbortController().signal) => + ({ signal }) as Parameters[1] + +async function connect(registered: Tool[]) { + const server = new McpServer({ name: "settings", version: "1.0.0" }) + registered.forEach((t) => server.registerTool(t.name, t.config, t.handler)) + const mcpClient = new Client({ name: "test-client", version: "1.0.0" }) + const [clientSide, serverSide] = InMemoryTransport.createLinkedPair() + await Promise.all([server.connect(serverSide), mcpClient.connect(clientSide)]) + return mcpClient +} + +const functionNamesInOperationOrder = () => + [ + ...fs + .readFileSync(new URL("./client/sdk.gen.ts", import.meta.url), "utf8") + .matchAll(/^export const (\w+) =/gm), + ].map((match) => match[1]!) + +const operationOf = (tool: Tool) => tool.config._meta[OPERATION] + +const overrides = new URL( + "../../specs/overrides/mcp/settings/", + import.meta.url, +) + +const writtenDescriptions = () => + fs.readdirSync(overrides).map((file) => + fs + .readFileSync(new URL(file, overrides), "utf8") + .split("x-mcp-description: >-")[1]! + .split(/\n(?=\S)/)[0]! + .trim() + .split(/\s*\n\s*/) + .join(" "), + ) + +describe("tools", () => { + it("holds 3 tools with valid, unique names, in operation order", () => { + const names = tools().map((tool) => tool.name) + + expect(names).toHaveLength(3) + for (const name of names) expect(name).toMatch(/^[a-zA-Z0-9_-]{1,64}$/) + expect(new Set(names).size).toBe(3) + expect(tools().map((tool) => operationOf(tool).id)).toEqual( + functionNamesInOperationOrder().map((name) => `settings.${name}`), + ) + }) + + it("exports one tool factory for each operation", () => { + const factories = Object.keys(mcp).filter((name) => name.endsWith("Tool")) + + expect(factories).toHaveLength(3) + }) + + describe("sends each tool's request to its own operation's method and path", () => { + const { requests, fetch } = stubFetch({}) + const client = clientWith(fetch) + + it.each(tools({ client }).map((tool) => [tool.name, tool] as const))( + "%s", + async (_name, tool) => { + requests.length = 0 + const { method, path } = operationOf(tool) + const params = [...path.matchAll(/\{([^}]+)\}/g)].map( + (match) => match[1]!, + ) + const args: Record = {} + if (params.length > 0) { + args.path = Object.fromEntries(params.map((p) => [p, `p-${p}`])) + } + if ("body" in tool.config.inputSchema.shape) args.body = {} + + await tool.handler(args, extraWith()) + + expect(requests).toHaveLength(1) + expect(requests[0]!.method).toBe(method) + expect(new URL(requests[0]!.url).pathname).toBe( + path.replace(/\{([^}]+)\}/g, (_match, p) => `p-${p}`), + ) + }, + ) + }) +}) + +describe("the client a tool calls through", () => { + const response = { data: [] } + let original: ReturnType + let viaDefault: ReturnType + + beforeEach(() => { + original = defaultClient.getConfig() + viaDefault = stubFetch(response) + defaultClient.setConfig({ fetch: viaDefault.fetch }) + }) + + afterEach(() => { + defaultClient.setConfig({ + ...original, + auth: original.auth, + fetch: original.fetch, + }) + }) + + it("calls through the package's default client when no client is given", async () => { + const result = await getV2SettingsTool().handler({}, extraWith()) + + expect(viaDefault.requests).toHaveLength(1) + expect(viaDefault.requests[0]!.url).toBe(`${original.baseUrl}/v2/settings`) + expect(result.structuredContent).toEqual(response) + }) + + it("sends the credentials of a default client configured from a settings client", async () => { + defaultClient.setConfig(clientWith(viaDefault.fetch).getConfig()) + + await getV2SettingsTool().handler({}, extraWith()) + + expect(viaDefault.requests[0]!.headers.get("Authorization")).toBe( + "Bearer pre-issued", + ) + }) + + it("uses a given client instead of the default", async () => { + const viaGiven = stubFetch(response) + + await getV2SettingsTool({ client: clientWith(viaGiven.fetch) }).handler( + {}, + extraWith(), + ) + + expect(viaDefault.requests).toHaveLength(0) + expect(viaGiven.requests).toHaveLength(1) + const url = new URL(viaGiven.requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/settings`) + }) + + it("sends headers configured on the client with every tool call", async () => { + const { requests, fetch } = stubFetch(response) + const client = clientWith(fetch, { + headers: { "EP-Store-Id": "store-1", "EP-Org-Id": "org-1" }, + }) + + await getV2SettingsTool({ client }).handler({}, extraWith()) + + expect(requests[0]!.headers.get("EP-Store-Id")).toBe("store-1") + expect(requests[0]!.headers.get("EP-Org-Id")).toBe("org-1") + }) +}) + +describe("a tool's handler", () => { + it("aborts the request when the MCP request is cancelled", async () => { + const { requests, fetch } = stubFetch({}) + const controller = new AbortController() + + await getV2SettingsTool({ client: clientWith(fetch) }).handler( + {}, + extraWith(controller.signal), + ) + expect(requests[0]!.signal.aborted).toBe(false) + controller.abort() + + expect(requests[0]!.signal.aborted).toBe(true) + }) + + it("returns an API error as an isError result with the HTTP status", async () => { + const errors = { errors: [{ status: 404, title: "Not Found" }] } + const { fetch } = stubFetch(errors, 404) + + const result = await getV2SettingsTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result).toEqual({ + isError: true, + content: [{ type: "text", text: `HTTP 404: ${JSON.stringify(errors)}` }], + }) + }) + + it("returns a network failure as an isError result with its message", async () => { + const fetch = (async () => { + throw new TypeError("fetch failed") + }) as typeof globalThis.fetch + + const result = await getV2SettingsTool({ + client: clientWith(fetch), + }).handler({}, extraWith()) + + expect(result.isError).toBe(true) + expect(result.content).toEqual([ + { type: "text", text: expect.stringContaining("fetch failed") }, + ]) + }) +}) + +describe("a tool's description", () => { + it("is the description written for it in the spec overrides, for every tool", () => { + expect( + tools() + .map((tool) => tool.config.description) + .sort(), + ).toEqual(writtenDescriptions().sort()) + }) +}) + +describe("the settings tools on an MCP server", () => { + let listed: ListedTool[] + + beforeAll(async () => { + const mcpClient = await connect( + tools({ client: clientWith(stubFetch({}).fetch) }), + ) + listed = (await mcpClient.listTools()).tools + }) + + it("describes every tool in at most 600 characters", () => { + for (const tool of listed) { + expect(tool.description!.length, tool.name).toBeLessThanOrEqual(600) + } + }) + + it("lists all 3, each passing the MCP SDK's ToolSchema", () => { + expect(listed).toHaveLength(3) + for (const tool of listed) { + expect(ToolSchema.safeParse(tool).success, tool.name).toBe(true) + } + }) + + it("asks no tool for an Authorization header", () => { + for (const tool of listed) { + const headers = (tool.inputSchema.properties as Record) + ?.headers + const names = Object.keys(headers?.properties ?? {}) + + expect(names.map((name) => name.toLowerCase())).not.toContain( + "authorization", + ) + } + }) + + it("sends a call through the given client and returns the data", async () => { + const response = { data: [] } + const { requests, fetch } = stubFetch(response) + const mcpClient = await connect(tools({ client: clientWith(fetch) })) + + const result = await mcpClient.callTool({ + name: "settings_get_v2_settings", + arguments: {}, + }) + + expect(requests).toHaveLength(1) + const url = new URL(requests[0]!.url) + expect(url.origin + url.pathname).toBe(`${baseUrl}/v2/settings`) + expect(requests[0]!.headers.get("Authorization")).toBe("Bearer pre-issued") + expect(result.structuredContent).toEqual(response) + }) +}) + +describe("the main entry", () => { + it("exports no MCP code", () => { + expect(main).not.toHaveProperty("tools") + expect(main).not.toHaveProperty("getV2SettingsTool") + }) +}) diff --git a/packages/sdks/settings/src/mcp.ts b/packages/sdks/settings/src/mcp.ts new file mode 100644 index 000000000..fda10e5a5 --- /dev/null +++ b/packages/sdks/settings/src/mcp.ts @@ -0,0 +1,2 @@ +export * from "./client/mcp.gen" +export type { OperationMeta, Tool, ToolConfig } from "./client/mcp-support.gen" diff --git a/packages/sdks/settings/test-cjs-minimal.cjs b/packages/sdks/settings/test-cjs-minimal.cjs index f036219c5..00dae0bd2 100644 --- a/packages/sdks/settings/test-cjs-minimal.cjs +++ b/packages/sdks/settings/test-cjs-minimal.cjs @@ -1,5 +1,7 @@ // This file is used to test that CommonJS requires work correctly const Settings = require("./dist/index.cjs") +const mcp = require("./dist/mcp.cjs") console.log("Settings:", Object.keys(Settings)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/settings/test-esm-minimal.mjs b/packages/sdks/settings/test-esm-minimal.mjs index 95d649f9e..fe81bc682 100644 --- a/packages/sdks/settings/test-esm-minimal.mjs +++ b/packages/sdks/settings/test-esm-minimal.mjs @@ -1,5 +1,7 @@ // This file is used to test that ESM imports work correctly import * as Settings from "./dist/index.mjs" +import * as mcp from "./dist/mcp.mjs" console.log("Settings:", Object.keys(Settings)) +console.log("mcp:", Object.keys(mcp)) console.log("Test successful!") diff --git a/packages/sdks/settings/test/built-output.test.ts b/packages/sdks/settings/test/built-output.test.ts new file mode 100644 index 000000000..70bbe4f0f --- /dev/null +++ b/packages/sdks/settings/test/built-output.test.ts @@ -0,0 +1,99 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { build } from "tsup" +import type { Options } from "tsup" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import tsupConfig from "../tsup.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const outDir = path.join(here, ".generated-dist") + +const SPECIFIER = + /(?:\bfrom\s*|\bimport\s*\(\s*|\brequire\s*\(\s*|^\s*import\s+)["']([^"']+)["']/gm + +function specifiersIn(file: string) { + const source = fs.readFileSync(file, "utf8") + return [...source.matchAll(SPECIFIER)].map((match) => match[1]!) +} + +function importGraph(entry: string) { + const files = new Set() + const packages = new Set() + const pending = [path.join(outDir, entry)] + while (pending.length > 0) { + const file = pending.pop()! + if (files.has(file)) continue + files.add(file) + for (const specifier of specifiersIn(file)) { + if (specifier.startsWith(".")) { + pending.push(path.resolve(path.dirname(file), specifier)) + } else { + packages.add(specifier) + } + } + } + return { + files: [...files].map((file) => path.relative(outDir, file)), + packages: [...packages], + } +} + +function builtFiles(directory = outDir): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(directory, entry.name) + if (entry.isDirectory()) return builtFiles(full) + return /\.(mjs|cjs)$/.test(entry.name) ? [full] : [] + }) +} + +beforeAll(async () => { + await build({ + ...(tsupConfig as Options), + config: false, + dts: false, + outDir, + silent: true, + sourcemap: false, + }) +}, 120_000) + +afterAll(() => { + fs.rmSync(outDir, { force: true, recursive: true }) +}) + +describe("the built package", () => { + it.each(["index.mjs", "index.cjs"])( + "reaches no MCP code from the main entry, %s", + (entry) => { + const graph = importGraph(entry) + + expect(graph.files).toContain( + path.join("client", `sdk.gen.${entry.split(".")[1]}`), + ) + expect(graph.files.filter((file) => file.includes("mcp"))).toEqual([]) + expect(graph.packages.filter((name) => name.includes("mcp"))).toEqual([]) + }, + ) + + it.each(["mcp.mjs", "mcp.cjs"])( + "reaches the generated tools from %s", + (entry) => { + const graph = importGraph(entry) + const extension = entry.split(".")[1] + + expect(graph.files).toContain(path.join("client", `mcp.gen.${extension}`)) + }, + ) + + it("imports the MCP SDK nowhere, because it is a type-only peer", () => { + for (const file of builtFiles()) { + expect( + specifiersIn(file).filter((name) => + name.includes("modelcontextprotocol"), + ), + file, + ).toEqual([]) + } + }) +}) diff --git a/packages/sdks/settings/test/mcp-generation.test.ts b/packages/sdks/settings/test/mcp-generation.test.ts new file mode 100644 index 000000000..7d376e9c9 --- /dev/null +++ b/packages/sdks/settings/test/mcp-generation.test.ts @@ -0,0 +1,74 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { createClient } from "@hey-api/openapi-ts" +import { execFileSync } from "node:child_process" +import { fileURLToPath } from "node:url" +import fs from "node:fs" +import path from "node:path" +import config from "../openapi-ts.config" + +const here = path.dirname(fileURLToPath(import.meta.url)) +const packageRoot = path.join(here, "..") +const committed = path.join(packageRoot, "src/client") +const firstRun = path.join(here, ".generated-mcp-first") +const secondRun = path.join(here, ".generated-mcp-second") +const workspaceBin = path.join(packageRoot, "../../../node_modules/.bin") +const mainEntryFiles = ["index.ts", "sdk.gen.ts", "types.gen.ts", "zod.gen.ts"] +const mcpFiles = ["mcp.gen.ts", "mcp-support.gen.ts"] + +const read = (directory: string, file: string) => + fs.readFileSync(path.join(directory, file), "utf8") + +async function generateInto(directory: string) { + const userConfig = await config + await createClient({ + ...userConfig, + input: path.join(packageRoot, "../specs/bundled/settings_standalone.yaml"), + output: { ...(userConfig.output as object), path: directory }, + }) +} + +beforeAll(async () => { + process.env.PATH = [workspaceBin, process.env.PATH].join(path.delimiter) + execFileSync( + path.join(packageRoot, "node_modules/.bin/redocly"), + [ + "bundle", + "settings-standalone@v1", + "--config", + "../specs/config/redocly.yaml", + ], + { cwd: packageRoot, stdio: "pipe" }, + ) + await generateInto(firstRun) + await generateInto(secondRun) +}, 120_000) + +afterAll(() => { + for (const directory of [firstRun, secondRun]) { + fs.rmSync(directory, { force: true, recursive: true }) + } +}) + +describe("generating the ./mcp export", () => { + it("writes the same MCP files byte for byte each time", () => { + for (const file of mcpFiles) { + expect(read(secondRun, file), file).toBe(read(firstRun, file)) + } + }) + + it("matches the committed MCP files", () => { + for (const file of mcpFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("leaves the main entry's generated files as committed", () => { + for (const file of mainEntryFiles) { + expect(read(firstRun, file), file).toBe(read(committed, file)) + } + }) + + it("keeps the MCP files out of the generated entry", () => { + expect(read(firstRun, "index.ts")).not.toContain("mcp") + }) +}) diff --git a/packages/sdks/settings/tsconfig.test.json b/packages/sdks/settings/tsconfig.test.json new file mode 100644 index 000000000..fc8520e73 --- /dev/null +++ b/packages/sdks/settings/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/sdks/settings/tsup.config.ts b/packages/sdks/settings/tsup.config.ts index 91c898b67..44169c968 100644 --- a/packages/sdks/settings/tsup.config.ts +++ b/packages/sdks/settings/tsup.config.ts @@ -6,7 +6,7 @@ import { } from "esbuild-fix-imports-plugin" export default defineConfig({ - entry: ["src/**/*.ts", "!src/**/*.test.ts"], + entry: ["src/**/*.ts", "!src/**/*.test.ts", "!src/**/*.test-d.ts"], format: ["esm", "cjs"], dts: true, splitting: false, diff --git a/packages/sdks/settings/vitest.config.ts b/packages/sdks/settings/vitest.config.ts index b7b707f74..4b27a5bb8 100644 --- a/packages/sdks/settings/vitest.config.ts +++ b/packages/sdks/settings/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from "vitest/config" export default defineConfig({ test: { include: ["**/*.{test,spec}.{js,ts}"], + typecheck: { + enabled: true, + include: ["src/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, }, }) diff --git a/packages/sdks/specs/config/redocly.yaml b/packages/sdks/specs/config/redocly.yaml index 49e364ac5..f88a41a01 100644 --- a/packages/sdks/specs/config/redocly.yaml +++ b/packages/sdks/specs/config/redocly.yaml @@ -560,6 +560,75 @@ apis: deleteAFile: ../overrides/mcp/files/deleteAFile.yaml getAFile: ../overrides/mcp/files/getAFile.yaml getAllFiles: ../overrides/mcp/files/getAllFiles.yaml + application-keys-standalone@v1: + output: ../bundled/application-keys_standalone.yaml + root: ../application-keys.yaml + decorators: + override/operation-property-override: + operationIds: + CreateAnApplicationKey: ../overrides/mcp/application-keys/CreateAnApplicationKey.yaml + DeleteAnApplicationKey: ../overrides/mcp/application-keys/DeleteAnApplicationKey.yaml + GetAnApplicationKey: ../overrides/mcp/application-keys/GetAnApplicationKey.yaml + ListApplicationKeys: ../overrides/mcp/application-keys/ListApplicationKeys.yaml + UpdateAnApplicationKey: ../overrides/mcp/application-keys/UpdateAnApplicationKey.yaml + currencies-standalone@v1: + output: ../bundled/currencies_standalone.yaml + root: ../currencies.yaml + decorators: + override/operation-property-override: + operationIds: + createACurrency: ../overrides/mcp/currencies/createACurrency.yaml + deleteACurrency: ../overrides/mcp/currencies/deleteACurrency.yaml + getACurrency: ../overrides/mcp/currencies/getACurrency.yaml + getAllCurrencies: ../overrides/mcp/currencies/getAllCurrencies.yaml + updateACurrency: ../overrides/mcp/currencies/updateACurrency.yaml + settings-standalone@v1: + output: ../bundled/settings_standalone.yaml + root: ../settings.yaml + decorators: + override/component-merge: off + override/operation-property-override: + operationIds: + delete-v2-settings: ../overrides/mcp/settings/delete-v2-settings.yaml + get-v2-settings: ../overrides/mcp/settings/get-v2-settings.yaml + put-v2-settings: ../overrides/mcp/settings/put-v2-settings.yaml + merchant-realm-mapping-standalone@v1: + output: ../bundled/merchant-realm-mapping_standalone.yaml + root: ../merchant-realm-mapping.yaml + decorators: + override/operation-property-override: + operationIds: + getMerchantRealmMapping: ../overrides/mcp/merchant-realm-mapping/getMerchantRealmMapping.yaml + getMerchantRealmMappings: ../overrides/mcp/merchant-realm-mapping/getMerchantRealmMappings.yaml + updateMerchantRealmMapping: ../overrides/mcp/merchant-realm-mapping/updateMerchantRealmMapping.yaml + permissions-standalone@v1: + output: ../bundled/permissions_standalone.yaml + root: ../permissions.yaml + decorators: + override/operation-property-override: + operationIds: + CreateACustomAPIRolePolicy: ../overrides/mcp/permissions/CreateACustomAPIRolePolicy.yaml + DeleteACustomAPIRolePolicy: ../overrides/mcp/permissions/DeleteACustomAPIRolePolicy.yaml + GetACustomAPIRolePolicy: ../overrides/mcp/permissions/GetACustomAPIRolePolicy.yaml + GetAStandardShopperRole: ../overrides/mcp/permissions/GetAStandardShopperRole.yaml + GetAStandardUserRole: ../overrides/mcp/permissions/GetAStandardUserRole.yaml + ListCustomAPIRolePolicies: ../overrides/mcp/permissions/ListCustomAPIRolePolicies.yaml + ListStandardShopperRoles: ../overrides/mcp/permissions/ListStandardShopperRoles.yaml + ListStandardUserRoles: ../overrides/mcp/permissions/ListStandardUserRoles.yaml + UpdateACustomAPIRolePolicy: ../overrides/mcp/permissions/UpdateACustomAPIRolePolicy.yaml + personal-data-standalone@v1: + output: ../bundled/personal-data_standalone.yaml + root: ../personal-data.yaml + decorators: + override/operation-property-override: + operationIds: + get-erasure-request: ../overrides/mcp/personal-data/get-erasure-request.yaml + get-erasure-requests: ../overrides/mcp/personal-data/get-erasure-requests.yaml + get-logs-ttl: ../overrides/mcp/personal-data/get-logs-ttl.yaml + get-personal-data-logs: ../overrides/mcp/personal-data/get-personal-data-logs.yaml + get-related-data-entries: ../overrides/mcp/personal-data/get-related-data-entries.yaml + post-erasure-request: ../overrides/mcp/personal-data/post-erasure-request.yaml + put-logs-ttl: ../overrides/mcp/personal-data/put-logs-ttl.yaml plugins: - ../plugins/override.js - ../plugins/ops-extra.js diff --git a/packages/sdks/specs/overrides/mcp/application-keys/CreateAnApplicationKey.yaml b/packages/sdks/specs/overrides/mcp/application-keys/CreateAnApplicationKey.yaml new file mode 100644 index 000000000..c26e25d1c --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/application-keys/CreateAnApplicationKey.yaml @@ -0,0 +1,7 @@ +x-mcp-description: >- + Creates an application key, identified by name and not tied to a user, that + can be used to generate client_credentials and implicit tokens. The response + includes the key's client ID and its client secret, which is a credential, so + keep it out of logs and code. The optional reserved rate limit is rejected if + the total reserved across all keys would exceed the store or organization + limit. diff --git a/packages/sdks/specs/overrides/mcp/application-keys/DeleteAnApplicationKey.yaml b/packages/sdks/specs/overrides/mcp/application-keys/DeleteAnApplicationKey.yaml new file mode 100644 index 000000000..12771fa69 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/application-keys/DeleteAnApplicationKey.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Permanently deletes an application key by its ID. Check the key's last used + time first, so you do not delete a key that an application still uses. diff --git a/packages/sdks/specs/overrides/mcp/application-keys/GetAnApplicationKey.yaml b/packages/sdks/specs/overrides/mcp/application-keys/GetAnApplicationKey.yaml new file mode 100644 index 000000000..8d604e964 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/application-keys/GetAnApplicationKey.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Gets one application key by its ID, with its name, client ID, reserved rate + limit and last used time. It does not return the client secret. diff --git a/packages/sdks/specs/overrides/mcp/application-keys/ListApplicationKeys.yaml b/packages/sdks/specs/overrides/mcp/application-keys/ListApplicationKeys.yaml new file mode 100644 index 000000000..b148b5b70 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/application-keys/ListApplicationKeys.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Lists the application keys in the store or organization, with each key's name, + client ID, reserved rate limit and last used time. The response metadata gives + the total rate limit reserved across all keys. It does not return client + secrets. Supports offset and limit pagination. diff --git a/packages/sdks/specs/overrides/mcp/application-keys/UpdateAnApplicationKey.yaml b/packages/sdks/specs/overrides/mcp/application-keys/UpdateAnApplicationKey.yaml new file mode 100644 index 000000000..d328a7b23 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/application-keys/UpdateAnApplicationKey.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Changes an application key's name or reserved rate limit. The request fails + if the new reserved limit would take the total reserved across all keys above + the store or organization limit. Changes to the reserved rate limit can take + up to one hour to take effect. It does not return the client secret. diff --git a/packages/sdks/specs/overrides/mcp/currencies/createACurrency.yaml b/packages/sdks/specs/overrides/mcp/currencies/createACurrency.yaml new file mode 100644 index 000000000..33f116f49 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/currencies/createACurrency.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Adds a currency to the store, with its three-letter code, exchange rate from + the default currency, display format, separators, decimal places, and whether + it is the default and enabled. It fails if the code already exists or the + store already has 10 currencies. diff --git a/packages/sdks/specs/overrides/mcp/currencies/deleteACurrency.yaml b/packages/sdks/specs/overrides/mcp/currencies/deleteACurrency.yaml new file mode 100644 index 000000000..28b34a2f5 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/currencies/deleteACurrency.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Deletes a currency by its ID. The default currency cannot be deleted, so make + another currency the default first. diff --git a/packages/sdks/specs/overrides/mcp/currencies/getACurrency.yaml b/packages/sdks/specs/overrides/mcp/currencies/getACurrency.yaml new file mode 100644 index 000000000..fa7268281 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/currencies/getACurrency.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Gets one currency by its ID, with its code, exchange rate, display format, + separators, decimal places, and whether it is the default and enabled. To find + a currency's ID, list the currencies. diff --git a/packages/sdks/specs/overrides/mcp/currencies/getAllCurrencies.yaml b/packages/sdks/specs/overrides/mcp/currencies/getAllCurrencies.yaml new file mode 100644 index 000000000..0e1d1c69d --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/currencies/getAllCurrencies.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Lists the currencies configured for the store, including each currency's code, + exchange rate, display format, and whether it is the default and enabled. + Supports offset and limit pagination. A store can have at most 10 currencies. diff --git a/packages/sdks/specs/overrides/mcp/currencies/updateACurrency.yaml b/packages/sdks/specs/overrides/mcp/currencies/updateACurrency.yaml new file mode 100644 index 000000000..fba82df47 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/currencies/updateACurrency.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Updates a currency by its ID. The request body accepts only the default flag, + so use it to make a currency the store's default; it cannot change the + currency's code, exchange rate or format. diff --git a/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/getMerchantRealmMapping.yaml b/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/getMerchantRealmMapping.yaml new file mode 100644 index 000000000..b84b71bc2 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/getMerchantRealmMapping.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Gets a merchant realm mapping by its ID, with its store prefix, realm ID and + store ID. The prefix is used during sign-in to pick the authentication realm, + and it can be null if none has been assigned. diff --git a/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/getMerchantRealmMappings.yaml b/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/getMerchantRealmMappings.yaml new file mode 100644 index 000000000..96aa33821 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/getMerchantRealmMappings.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Gets the merchant realm mapping for the current store, which links the store + to the authentication realm administrators use to sign in with single sign-on. + The mapping holds its ID, the store prefix, which can be null, the realm ID + and the store ID. diff --git a/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/updateMerchantRealmMapping.yaml b/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/updateMerchantRealmMapping.yaml new file mode 100644 index 000000000..7132d1aac --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/merchant-realm-mapping/updateMerchantRealmMapping.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Sets the store prefix on a merchant realm mapping, which administrators use + during single sign-on to find the store's authentication realm. The prefix is + required, and the request fails with a conflict if another mapping already + uses it. diff --git a/packages/sdks/specs/overrides/mcp/permissions/CreateACustomAPIRolePolicy.yaml b/packages/sdks/specs/overrides/mcp/permissions/CreateACustomAPIRolePolicy.yaml new file mode 100644 index 000000000..96d37ae7e --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/CreateACustomAPIRolePolicy.yaml @@ -0,0 +1,6 @@ +x-mcp-title: Create a Custom API Role Policy +x-mcp-description: >- + Creates a policy that sets which actions (create, list, read, update, delete) + a role can take on the entries of one custom API, named with the custom API + and role relationships. All five flags are required. Store Admin and Org Admin + roles already have full access, so only other roles need a policy. diff --git a/packages/sdks/specs/overrides/mcp/permissions/DeleteACustomAPIRolePolicy.yaml b/packages/sdks/specs/overrides/mcp/permissions/DeleteACustomAPIRolePolicy.yaml new file mode 100644 index 000000000..46d32bccc --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/DeleteACustomAPIRolePolicy.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Deletes a custom API role policy by its ID. The role loses the access to the + custom API's entries that the policy granted, unless it is an administrative + role such as Store Admin or Org Admin, which has full access by default. diff --git a/packages/sdks/specs/overrides/mcp/permissions/GetACustomAPIRolePolicy.yaml b/packages/sdks/specs/overrides/mcp/permissions/GetACustomAPIRolePolicy.yaml new file mode 100644 index 000000000..663824020 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/GetACustomAPIRolePolicy.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Gets one custom API role policy by its ID, showing whether its role can + create, list, read, update and delete entries of the custom API, and which + custom API and role it applies to. diff --git a/packages/sdks/specs/overrides/mcp/permissions/GetAStandardShopperRole.yaml b/packages/sdks/specs/overrides/mcp/permissions/GetAStandardShopperRole.yaml new file mode 100644 index 000000000..d0e9f7981 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/GetAStandardShopperRole.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Gets one standard shopper role by its ID, returning its ID and name. Use it to + confirm a shopper role ID before referencing it in a custom API role policy. diff --git a/packages/sdks/specs/overrides/mcp/permissions/GetAStandardUserRole.yaml b/packages/sdks/specs/overrides/mcp/permissions/GetAStandardUserRole.yaml new file mode 100644 index 000000000..17f29d86c --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/GetAStandardUserRole.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Gets one standard user role by its ID, with its access level (none, view or + manage) for each permission group, such as catalogs, orders, promotions and + application keys. diff --git a/packages/sdks/specs/overrides/mcp/permissions/ListCustomAPIRolePolicies.yaml b/packages/sdks/specs/overrides/mcp/permissions/ListCustomAPIRolePolicies.yaml new file mode 100644 index 000000000..ed33b6676 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/ListCustomAPIRolePolicies.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Lists custom API role policies, which set what each role can do with the + entries of a custom API. Filter by ID, timestamps, custom API ID or role ID, + and sort by ID or timestamps; the default is newest first. Supports offset and + limit pagination. diff --git a/packages/sdks/specs/overrides/mcp/permissions/ListStandardShopperRoles.yaml b/packages/sdks/specs/overrides/mcp/permissions/ListStandardShopperRoles.yaml new file mode 100644 index 000000000..97a23512f --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/ListStandardShopperRoles.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Lists the standard shopper roles, which represent customers. Each role has an + ID and a name. Use it to find a shopper role ID for a custom API role policy. diff --git a/packages/sdks/specs/overrides/mcp/permissions/ListStandardUserRoles.yaml b/packages/sdks/specs/overrides/mcp/permissions/ListStandardUserRoles.yaml new file mode 100644 index 000000000..028e7a8ef --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/ListStandardUserRoles.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Lists the standard user roles that can be assigned to Commerce Manager users, + each with its access level (none, view or manage) for areas such as products, + orders, promotions and settings. Use it to find a role ID for a custom API + role policy. diff --git a/packages/sdks/specs/overrides/mcp/permissions/UpdateACustomAPIRolePolicy.yaml b/packages/sdks/specs/overrides/mcp/permissions/UpdateACustomAPIRolePolicy.yaml new file mode 100644 index 000000000..2c5f518c5 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/permissions/UpdateACustomAPIRolePolicy.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Changes which actions (create, list, read, update, delete) a role can take on + a custom API's entries, by policy ID. Send only the flags to change. It cannot + change which custom API or role the policy covers; create a new policy for + that. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/get-erasure-request.yaml b/packages/sdks/specs/overrides/mcp/personal-data/get-erasure-request.yaml new file mode 100644 index 000000000..f132d61b6 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/get-erasure-request.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Gets one erasure request by its ID, with the resource it targets, who started + it, and its status and status description. Use it to poll an asynchronous + erasure until the status is SUCCESS. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/get-erasure-requests.yaml b/packages/sdks/specs/overrides/mcp/personal-data/get-erasure-requests.yaml new file mode 100644 index 000000000..1bf20e8bf --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/get-erasure-requests.yaml @@ -0,0 +1,6 @@ +x-mcp-title: List Personal Data Erasure Requests +x-mcp-description: >- + Lists the erasure requests for one personal data record, with each request's + status, status description and time. A filter on both resource type and + resource ID is required. Use it to check whether an earlier erasure request + succeeded or failed. Supports pagination. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/get-logs-ttl.yaml b/packages/sdks/specs/overrides/mcp/personal-data/get-logs-ttl.yaml new file mode 100644 index 000000000..51c084e38 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/get-logs-ttl.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Gets the logs time-to-live setting, which is how many days personal data logs + are kept. The default is 365 days for production stores and 7 days for other + store types. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/get-personal-data-logs.yaml b/packages/sdks/specs/overrides/mcp/personal-data/get-personal-data-logs.yaml new file mode 100644 index 000000000..959abf1c6 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/get-personal-data-logs.yaml @@ -0,0 +1,6 @@ +x-mcp-description: >- + Lists the change logs for one personal data record, such as a customer, + account, address or order. A filter on both resource type and resource ID is + required. Each entry gives the event type, time, who made the change and the + changed fields, which can include personal data such as names and email + addresses. Supports pagination. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/get-related-data-entries.yaml b/packages/sdks/specs/overrides/mcp/personal-data/get-related-data-entries.yaml new file mode 100644 index 000000000..79b761bee --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/get-related-data-entries.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Lists the records that belong to the same personal data set as a given + record, such as the addresses and authentication info related to a customer. + A filter on both resource type and resource ID is required. Use it to see what + an erasure request for that record would remove. Supports pagination. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/post-erasure-request.yaml b/packages/sdks/specs/overrides/mcp/personal-data/post-erasure-request.yaml new file mode 100644 index 000000000..1e83d5d97 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/post-erasure-request.yaml @@ -0,0 +1,8 @@ +x-mcp-risk: update +x-mcp-description: >- + Starts an erasure request that permanently erases a personal data record and + every record in the same personal data set, along with their personal data + logs. Treat it as irreversible, and review the related data entries first. + Processing is asynchronous, so poll the request until its status is SUCCESS, + and create a new request if it fails. It does not cover flows or data outside + Commerce. diff --git a/packages/sdks/specs/overrides/mcp/personal-data/put-logs-ttl.yaml b/packages/sdks/specs/overrides/mcp/personal-data/put-logs-ttl.yaml new file mode 100644 index 000000000..2465decf0 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/personal-data/put-logs-ttl.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Sets how many days personal data logs are kept, from 1 to 365. Use it to + change the retention period that applies to the personal data change logs. diff --git a/packages/sdks/specs/overrides/mcp/settings/delete-v2-settings.yaml b/packages/sdks/specs/overrides/mcp/settings/delete-v2-settings.yaml new file mode 100644 index 000000000..0196f4937 --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/settings/delete-v2-settings.yaml @@ -0,0 +1,3 @@ +x-mcp-description: >- + Deletes the store's project settings. Organization settings cannot be deleted. + Get the current settings first, so you can restore them if needed. diff --git a/packages/sdks/specs/overrides/mcp/settings/get-v2-settings.yaml b/packages/sdks/specs/overrides/mcp/settings/get-v2-settings.yaml new file mode 100644 index 000000000..5df657b0e --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/settings/get-v2-settings.yaml @@ -0,0 +1,5 @@ +x-mcp-description: >- + Gets the store's global settings in one call: page length, calculation method + for cart and order totals, mandatory address fields, shopper address limit, + additional languages, and the read-only limits such as currency, promotion and + page offset limits. diff --git a/packages/sdks/specs/overrides/mcp/settings/put-v2-settings.yaml b/packages/sdks/specs/overrides/mcp/settings/put-v2-settings.yaml new file mode 100644 index 000000000..ba7e4e4be --- /dev/null +++ b/packages/sdks/specs/overrides/mcp/settings/put-v2-settings.yaml @@ -0,0 +1,4 @@ +x-mcp-description: >- + Updates the store's global settings, such as page length, calculation method, + mandatory address fields, additional languages and shopper address limit. The + new settings take effect immediately. Read-only settings cannot be changed.