Implement Model Context Protocol server poc (#552)

<!--

Make sure you've read the CONTRIBUTING.md guidelines:
https://github.com/stack-auth/stack-auth/blob/dev/CONTRIBUTING.md

-->

<!-- ELLIPSIS_HIDDEN -->


----

> [!IMPORTANT]
> Introduces a new Model Context Protocol server with OpenAPI
integration, updates build configurations, and adds necessary files for
initial release.
> 
>   - **New MCP Server**:
> - Implements MCP server in `src/index.ts` using
`@modelcontextprotocol/sdk`.
> - Handles tool requests with `ListToolsRequestSchema` and
`CallToolRequestSchema`.
>     - Supports 40 endpoints, defined in `operationIDs`.
>   - **OpenAPI Integration**:
> - Generates OpenAPI schema in `generate-openapi.ts` and writes to
`mcp-server/openapi`.
> - Converts OpenAPI parameters to JSON schema in
`openapi-to-jsonschema.ts`.
>   - **Configuration and Build**:
> - Adds `package.json` for MCP server with dependencies and scripts.
>     - Configures ESLint in `.eslintrc.cjs`.
> - Updates `Dockerfile` and `turbo.json` to include MCP server in build
process.
>   - **Miscellaneous**:
>     - Adds `.gitignore` for OpenAPI JSON files.
>     - Initial release noted in `CHANGELOG.md`.
> 
> <sup>This description was created by </sup>[<img alt="Ellipsis"
src="https://img.shields.io/badge/Ellipsis-blue?color=175173">](https://www.ellipsis.dev?ref=stack-auth%2Fstack-auth&utm_source=github&utm_medium=referral)<sup>
for d0970c4059. It will automatically
update as commits are pushed.</sup>


<!-- ELLIPSIS_HIDDEN -->

---------

Co-authored-by: Konsti Wohlwend <n2d4xc@gmail.com>
This commit is contained in:
Moritz Schneider 2025-03-19 11:49:39 -07:00 committed by GitHub
parent 130c8e648e
commit ab81ad14e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 885 additions and 31 deletions

View File

@ -15,7 +15,8 @@ async function main() {
const filePathPrefix = path.resolve(process.platform === "win32" ? "apps/src/app/api/latest" : "src/app/api/latest");
const importPathPrefix = "@/app/api/latest";
const filePaths = [...await glob(filePathPrefix + "/**/route.{js,jsx,ts,tsx}")];
const openAPISchema = yaml.stringify(parseOpenAPI({
const openApiSchemaObject = parseOpenAPI({
endpoints: new Map(await Promise.all(filePaths.map(async (filePath) => {
if (!filePath.startsWith(filePathPrefix)) {
throw new Error(`Invalid file path: ${filePath}`);
@ -32,7 +33,9 @@ async function main() {
return [urlPath, handlersByMethod] as const;
}))),
audience,
}));
});
const openAPISchema = yaml.stringify(openApiSchemaObject);
writeFileSyncIfChanged(`../mcp-server/openapi/${audience}.json`, JSON.stringify(openApiSchemaObject, null, 2));
writeFileSyncIfChanged(`../../docs/fern/openapi/${audience}.yaml`, openAPISchema);
const webhookOpenAPISchema = yaml.stringify(parseWebhookOpenAPI({

View File

@ -0,0 +1,7 @@
module.exports = {
"extends": [
"../../eslint-configs/defaults.js",
"../../eslint-configs/next.js",
],
"ignorePatterns": ['/*', '!/src']
};

View File

@ -0,0 +1,5 @@
# @stackframe/mcp-server
## 2.7.27
initial release

1
apps/mcp-server/openapi/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.json

View File

@ -0,0 +1,29 @@
{
"name": "@stackframe/mcp-server",
"version": "2.7.27",
"private": true,
"type": "module",
"bin": {
"mcp-server": "./build/index.js"
},
"scripts": {
"start": "tsx src/index.ts",
"dev-mcp-server": "tsx watch --clear-screen=false src/index.ts",
"typecheck": "tsc --noEmit",
"lint": "eslint .",
"clean": "rimraf build && rimraf node_modules && rimraf openapi/*.json",
"build": "tsc"
},
"files": [
"build"
],
"dependencies": {
"@modelcontextprotocol/sdk": "^1.7.0",
"@stackframe/js": "workspace:*",
"openapi-types": "^12.1.3"
},
"devDependencies": {
"@types/node": "^22.13.10",
"typescript": "^5.8.2"
}
}

View File

@ -0,0 +1,227 @@
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
ListToolsResult
} from "@modelcontextprotocol/sdk/types.js";
import { StackServerApp, stackAppInternalsSymbol } from "@stackframe/js";
import { readFileSync } from "fs";
import type { OpenAPIV3_1 } from 'openapi-types';
import { convertParameterArrayToJsonSchema } from "./utils/openapi-to-jsonschema";
const STACK_AUTH_URL = process.env.STACK_AUTH_URL ?? "https://api.stack-auth.com/";
const STACK_SECRET_SERVER_KEY = process.env.STACK_SECRET_SERVER_KEY;
const STACK_PROJECT_ID = process.env.STACK_PROJECT_ID;
const STACK_PUBLISHABLE_CLIENT_KEY = process.env.STACK_PUBLISHABLE_CLIENT_KEY;
if (!STACK_SECRET_SERVER_KEY || !STACK_PROJECT_ID || !STACK_PUBLISHABLE_CLIENT_KEY) {
throw new Error("STACK_SECRET_SERVER_KEY, STACK_PROJECT_ID, and STACK_PUBLISHABLE_CLIENT_KEY must be set");
}
export const stackServerApp = new StackServerApp({
baseUrl: STACK_AUTH_URL,
projectId: STACK_PROJECT_ID,
publishableClientKey: STACK_PUBLISHABLE_CLIENT_KEY,
secretServerKey: STACK_SECRET_SERVER_KEY,
tokenStore: "memory",
});
// Cursor only supports 40 endpoints, so we only expose the most useful tools
const operationIDs = {
"getUserById": ["/users/{user_id}", "get"],
"updateUser": ["/users/{user_id}", "patch"],
"deleteUser": ["/users/{user_id}", "delete"],
"listUsers": ["/users", "get"],
"createUser": ["/users", "post"],
"listTeams": ["/teams", "get"],
"createTeam": ["/teams", "post"],
"listTeamMemberProfiles": ["/team-member-profiles", "get"],
"getTeamById": ["/teams/{team_id}", "get"],
"updateTeam": ["/teams/{team_id}", "patch"],
"deleteTeam": ["/teams/{team_id}", "delete"],
"addUserToTeam": ["/team-memberships/{team_id}/{user_id}", "post"],
"removeUserFromTeam": ["/team-memberships/{team_id}/{user_id}", "delete"],
"getTeamMemberProfile": ["/team-member-profiles/{team_id}/{user_id}", "get"],
"updateTeamMemberProfile": ["/team-member-profiles/{team_id}/{user_id}", "patch"],
"sendTeamInvitationCode": ["/team-invitations/send-code", "post"],
"grantPermissionToUser": ["/team-permissions/{team_id}/{user_id}/{permission_id}", "post"],
"revokePermissionFromUser": ["/team-permissions/{team_id}/{user_id}/{permission_id}", "delete"],
"listTeamPermissions": ["/team-permissions", "get"],
"getContactChannel": ["/contact-channels/{user_id}/{contact_channel_id}", "get"],
"updateContactChannel": ["/contact-channels/{user_id}/{contact_channel_id}", "patch"],
"deleteContactChannel": ["/contact-channels/{user_id}/{contact_channel_id}", "delete"],
"listContactChannels": ["/contact-channels", "get"]
};
function getOpenAPISchema(): OpenAPIV3_1.Document {
return JSON.parse(readFileSync("./openapi/server.json", "utf8"));
}
function isOperationObject(obj: any): obj is OpenAPIV3_1.OperationObject {
return obj !== null && typeof obj === 'object' && 'parameters' in obj;
}
function getOperationObject(openAPISchema: OpenAPIV3_1.Document, path: string, method: string): OpenAPIV3_1.OperationObject {
const pathItem = openAPISchema.paths?.[path];
if (!pathItem) {
throw new Error(`Could not find path item ${path} in openAPI schema`);
}
const operation = pathItem[method as keyof typeof pathItem];
if (!operation) {
throw new Error(`Could not find method ${method} in path item ${path} in openAPI schema`);
}
if (!isOperationObject(operation)) {
throw new Error(`Method ${method} in path ${path} is not an operation object`);
}
return operation;
}
type ToolType = {
path: string,
method: string,
name: string,
description: string | undefined,
inputSchema: {
[x: string]: unknown,
type: "object",
properties?: {
[x: string]: unknown,
} | undefined,
},
}
function getToolsFromOpenAPI(openAPISchema: OpenAPIV3_1.Document): ToolType[] {
const tools: ToolType[] = Object.entries(operationIDs).map(([operationID, [path, method]]) => {
const operation = getOperationObject(openAPISchema, path, method);
const inputSchema = !operation.parameters ? {
type: "object" as const,
properties: {},
required: [],
} : convertParameterArrayToJsonSchema(operation.parameters, operation.requestBody);
return {
name: operationID,
description: operation.description,
inputSchema,
path,
method,
};
});
return tools;
}
async function main() {
const openAPISchema = getOpenAPISchema();
const tools = getToolsFromOpenAPI(openAPISchema);
const transport = new StdioServerTransport();
const version = (await import("../package.json", { assert: { type: "json" } })).default.version;
// Create server instance
const server = new Server({
name: "stackauth",
version,
}, {
capabilities: {
tools: {}
}
});
server.setRequestHandler(ListToolsRequestSchema,
(): ListToolsResult => ({
tools
})
);
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const name = request.params.name;
const args = request.params.arguments ?? {};
const tool = tools.find(tool => tool.name === name);
if (!tool) {
return {
isError: true,
content: [{ type: "text", text: `Tool ${name} not found` }],
};
}
const path = tool.path;
const method = tool.method.toUpperCase();
// Split args into path and query parameters
const queryParams = new URLSearchParams();
const pathParams: Record<string, string> = {};
for (const [key, value] of Object.entries(args)) {
if (key.endsWith("###query")) {
const paramName = key.replace("###query", "");
queryParams.append(paramName, String(value));
} else if (key.endsWith("###path")) {
const paramName = key.replace("###path", "");
pathParams[paramName] = String(value);
}
}
// Replace path parameters
let finalPath = path;
for (const [key, value] of Object.entries(pathParams)) {
finalPath = finalPath.replace(`{${key}}`, value);
}
// Add query string if we have query parameters
const queryString = queryParams.toString();
if (queryString) {
finalPath += `?${queryString}`;
}
let body: string | undefined;
let headers: Record<string, string> | undefined;
// LIMITATION: we only support JSON body for now
if (args["###body###"] && typeof args["###body###"] === "string") {
body = args["###body###"];
headers = {
"Content-Type": "application/json",
};
}
const result = await (stackServerApp as any)[stackAppInternalsSymbol].sendRequest(finalPath, {
method,
headers: {
// Hack to make api call as a server and not client, should probably create a new (internal) function for this
"x-stack-secret-server-key": STACK_SECRET_SERVER_KEY,
...headers,
},
body,
}, "server");
if (!result.ok) {
return {
isError: true,
content: [{ type: "text", text: `Error: ${result.status} ${await result.text()}` }],
};
}
return {
content: [{ type: "text", text: JSON.stringify(await result.json(), null, 2) }],
};
});
await server.connect(transport);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});

View File

@ -0,0 +1,155 @@
/**
* Type definitions for OpenAPI Parameter Object
*/
import type { OpenAPIV3_1 } from 'openapi-types';
/**
* Type definition for JSON Schema
*/
type JSONSchema = {
type: 'object',
properties: Record<string, any>,
required?: string[],
}
/**
* Type guard to check if an object is a ReferenceObject
* @param obj - Object to check
* @returns True if object is a ReferenceObject, false otherwise
*/
function isReferenceObject(obj: any): obj is OpenAPIV3_1.ReferenceObject {
return obj !== null && typeof obj === 'object' && '$ref' in obj;
}
/**
* Converts an OpenAPI Parameter Object Array to a JSON Schema
* @param parameterObjectArray - Array of OpenAPI Parameter Objects
* @returns JSON Schema representation of the parameters
*/
function convertParameterArrayToJsonSchema(parameterObjectArray: (OpenAPIV3_1.ParameterObject | OpenAPIV3_1.ReferenceObject)[], requestBody?: OpenAPIV3_1.RequestBodyObject | OpenAPIV3_1.ReferenceObject): {
type: "object",
properties: Record<string, any>,
required: string[],
} {
if (!Array.isArray(parameterObjectArray)) {
throw new Error('Input must be an array of parameter objects');
}
const properties = new Map<string, any>();
const requiredParams: string[] = [];
parameterObjectArray.forEach(param => {
if (isReferenceObject(param)) {
throw new Error('Reference objects are not supported');
}
if (!param.name) {
throw new Error('Parameter object must have a name');
}
const newParamName = param.name + "###" + param.in;
// Extract the schema from the parameter
let schema: Record<string, any> = param.schema ?
(typeof param.schema === 'object' ? { ...param.schema } : {}) :
{};
// If the parameter has its own type/format, use those instead
if ('type' in param && param.type) {
schema.type = param.type;
}
if ('format' in param && param.format) {
schema.format = param.format;
}
// Copy description if available
if (param.description) {
schema.description = param.description;
}
// Copy example if available
if ('example' in param && param.example !== undefined) {
schema.example = param.example;
}
// Handle enum values
if ('enum' in param && param.enum) {
schema.enum = param.enum;
}
// Add default value if specified
if ('default' in param && param.default !== undefined) {
schema.default = param.default;
}
// Add parameter to properties
properties.set(newParamName, schema);
// Add to required array if necessary
if (param.required === true) {
requiredParams.push(newParamName);
}
});
if (requestBody) {
const body = handleRequestBody(requestBody);
if (body) {
properties.set("###body###", body.properties);
requiredParams.push("###body###");
}
}
// Convert Map back to Record for return type
const propertiesRecord: Record<string, any> = {};
properties.forEach((value, key) => {
propertiesRecord[key] = value;
});
const jsonSchema = {
type: 'object' as const,
properties: propertiesRecord,
required: requiredParams
};
return jsonSchema;
}
export { convertParameterArrayToJsonSchema };
export type { JSONSchema };
function handleRequestBody(requestBody: OpenAPIV3_1.RequestBodyObject | OpenAPIV3_1.ReferenceObject) {
if (isReferenceObject(requestBody)) {
throw new Error('Reference objects are not supported');
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!requestBody.content["application/json"]) {
throw new Error('Request body must be of type application/json');
}
const body_schema = requestBody.content["application/json"].schema;
if (!body_schema || isReferenceObject(body_schema)) {
throw new Error('Reference objects are not supported');
}
if (!body_schema.properties) {
return;
}
// We simplify the body into one property, called "body"
return {
type: "string",
properties: {
body: JSON.stringify(body_schema)
},
required: ["body"]
};
}

View File

@ -0,0 +1,37 @@
{
"compilerOptions": {
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"strict": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"noErrorTruncation": true,
"outDir": "./build",
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": [
"./src/*"
]
},
"skipLibCheck": true
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}

View File

@ -26,7 +26,7 @@ COPY . .
RUN tsx ./scripts/generate-sdks.ts
# https://turbo.build/repo/docs/guides/tools/docker
RUN turbo prune --scope=@stackframe/stack-backend --scope=@stackframe/stack-dashboard --docker
RUN turbo prune --scope=@stackframe/stack-backend --scope=@stackframe/stack-dashboard --scope=@stackframe/mcp-server --docker
# Build stage

View File

@ -255,7 +255,7 @@ importers:
version: 5.0.7
tsup:
specifier: ^8.3.0
version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.15.5)(typescript@5.7.3)(yaml@2.4.5)
version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.15.5)(typescript@5.8.2)(yaml@2.4.5)
tsx:
specifier: ^4.7.2
version: 4.15.5
@ -438,6 +438,25 @@ importers:
specifier: ^1.2.1
version: 1.2.1
apps/mcp-server:
dependencies:
'@modelcontextprotocol/sdk':
specifier: ^1.7.0
version: 1.7.0
'@stackframe/js':
specifier: workspace:*
version: link:../../packages/js
openapi-types:
specifier: ^12.1.3
version: 12.1.3
devDependencies:
'@types/node':
specifier: ^22.13.10
version: 22.13.10
typescript:
specifier: ^5.8.2
version: 5.8.2
apps/mock-oauth-server:
dependencies:
'@types/express':
@ -670,7 +689,7 @@ importers:
version: 5.7.3
vite:
specifier: ^6.1.0
version: 6.1.0(@types/node@22.13.5)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0)
version: 6.1.0(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0)
examples/middleware:
dependencies:
@ -766,7 +785,7 @@ importers:
version: 18.3.1
'@vitejs/plugin-react':
specifier: ^4.3.4
version: 4.3.4(vite@6.1.0(@types/node@22.13.5)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0))
version: 4.3.4(vite@6.1.0(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0))
eslint:
specifier: ^9.19.0
version: 9.21.0(jiti@2.4.2)
@ -787,7 +806,7 @@ importers:
version: 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
vite:
specifier: ^6.1.0
version: 6.1.0(@types/node@22.13.5)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0)
version: 6.1.0(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0)
examples/supabase:
dependencies:
@ -946,7 +965,7 @@ importers:
version: 3.4.14
tsup:
specifier: ^8.0.2
version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.7.3)(yaml@2.6.0)
version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.8.2)(yaml@2.6.0)
packages/react:
dependencies:
@ -1064,7 +1083,7 @@ importers:
version: 3.4.14
tsup:
specifier: ^8.0.2
version: 8.4.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.6.0)
version: 8.4.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.19.2)(typescript@5.8.2)(yaml@2.6.0)
packages/stack:
dependencies:
@ -1188,7 +1207,7 @@ importers:
version: 3.4.14
tsup:
specifier: ^8.0.2
version: 8.1.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(postcss@8.4.47)(typescript@5.7.3)
version: 8.1.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(postcss@8.4.47)(typescript@5.8.2)
packages/stack-emails:
dependencies:
@ -1604,7 +1623,7 @@ importers:
version: 3.4.14
tsup:
specifier: ^8.0.2
version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.7.3)(yaml@2.6.0)
version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.8.2)(yaml@2.6.0)
packages:
@ -3445,6 +3464,10 @@ packages:
'@types/react': ^18.2.0
react: '>=16'
'@modelcontextprotocol/sdk@1.7.0':
resolution: {integrity: sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==}
engines: {node: '>=18'}
'@monaco-editor/loader@1.4.0':
resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==}
peerDependencies:
@ -6319,6 +6342,9 @@ packages:
'@types/node@20.17.6':
resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==}
'@types/node@22.13.10':
resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==}
'@types/node@22.13.5':
resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==}
@ -6664,6 +6690,10 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
accepts@2.0.0:
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
engines: {node: '>= 0.6'}
accessor-fn@1.5.1:
resolution: {integrity: sha512-zZpFYBqIL1Aqg+f2qmYHJ8+yIZF7/tP6PUGx2/QM0uGPSO5UegpinmkNwDohxWtOj586BpMPVRUjce2HI6xB3A==}
engines: {node: '>=12'}
@ -6987,6 +7017,10 @@ packages:
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
body-parser@2.1.0:
resolution: {integrity: sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==}
engines: {node: '>=18'}
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@ -7434,6 +7468,10 @@ packages:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
content-disposition@1.0.0:
resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
engines: {node: '>= 0.6'}
content-type@1.0.5:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
@ -7447,6 +7485,10 @@ packages:
cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
cookie-signature@1.2.2:
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'}
cookie@0.4.2:
resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
engines: {node: '>= 0.6'}
@ -7644,6 +7686,15 @@ packages:
supports-color:
optional: true
debug@4.3.6:
resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
debug@4.3.7:
resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
@ -8308,6 +8359,14 @@ packages:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
eventsource-parser@3.0.0:
resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==}
engines: {node: '>=18.0.0'}
eventsource@3.0.5:
resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==}
engines: {node: '>=18.0.0'}
execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@ -8324,10 +8383,20 @@ packages:
resolution: {integrity: sha512-6CX17Cu+rC2Fi2CyZ4CkgVG3hLl6BFsdAxfXiZkmDFIDY4mRx2y2spdeH6dqPHI9rP+AsHEfGeKz84Uuw7+Pmg==}
engines: {node: ^v12.20.0 || >=v14.13.0}
express-rate-limit@7.5.0:
resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==}
engines: {node: '>= 16'}
peerDependencies:
express: ^4.11 || 5 || ^5.0.0-beta.1
express@4.21.2:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'}
express@5.0.1:
resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==}
engines: {node: '>= 18'}
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@ -8403,6 +8472,10 @@ packages:
resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
engines: {node: '>= 0.8'}
finalhandler@2.1.0:
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
engines: {node: '>= 0.8'}
find-root@1.1.0:
resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
@ -8495,6 +8568,10 @@ packages:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
fresh@2.0.0:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
engines: {node: '>= 0.8'}
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
@ -8885,6 +8962,10 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
iconv-lite@0.5.2:
resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==}
engines: {node: '>=0.10.0'}
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
@ -9134,6 +9215,9 @@ packages:
is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
is-promise@4.0.0:
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@ -9660,6 +9744,10 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
media-typer@1.1.0:
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
engines: {node: '>= 0.8'}
memfs-browser@3.5.10302:
resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==}
@ -9674,6 +9762,10 @@ packages:
merge-descriptors@1.0.3:
resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
merge-descriptors@2.0.0:
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
engines: {node: '>=18'}
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@ -9809,6 +9901,10 @@ packages:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
mime-db@1.53.0:
resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==}
engines: {node: '>= 0.6'}
mime-types@2.1.18:
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
engines: {node: '>= 0.6'}
@ -9817,6 +9913,10 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
mime-types@3.0.0:
resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==}
engines: {node: '>= 0.6'}
mime@1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
@ -9972,6 +10072,10 @@ packages:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
negotiator@1.0.0:
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
engines: {node: '>= 0.6'}
neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
@ -10218,6 +10322,10 @@ packages:
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
engines: {node: '>= 0.4'}
object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
@ -10283,6 +10391,9 @@ packages:
resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
engines: {node: '>=18'}
openapi-types@12.1.3:
resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==}
opener@1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
@ -10431,6 +10542,10 @@ packages:
path-to-regexp@6.2.2:
resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==}
path-to-regexp@8.2.0:
resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
engines: {node: '>=16'}
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@ -10487,6 +10602,10 @@ packages:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'}
pkce-challenge@4.1.0:
resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==}
engines: {node: '>=16.20.0'}
pkg-types@1.2.1:
resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
@ -10719,6 +10838,10 @@ packages:
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
qs@6.14.0:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
@ -10761,6 +10884,10 @@ packages:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
raw-body@3.0.0:
resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
engines: {node: '>= 0.8'}
rc@1.2.8:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true
@ -11145,6 +11272,10 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
router@2.1.0:
resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==}
engines: {node: '>= 18'}
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
@ -11226,6 +11357,10 @@ packages:
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
send@1.1.0:
resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==}
engines: {node: '>= 18'}
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
@ -11236,6 +11371,10 @@ packages:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
serve-static@2.1.0:
resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==}
engines: {node: '>= 18'}
serve@14.2.4:
resolution: {integrity: sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==}
engines: {node: '>= 14'}
@ -11300,10 +11439,26 @@ packages:
shimmer@1.2.1:
resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==}
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
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.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
side-channel@1.1.0:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@ -12013,6 +12168,10 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
type-is@2.0.0:
resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==}
engines: {node: '>= 0.6'}
typed-array-buffer@1.0.2:
resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
engines: {node: '>= 0.4'}
@ -12051,6 +12210,11 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
typescript@5.8.2:
resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==}
engines: {node: '>=14.17'}
hasBin: true
ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
@ -12618,6 +12782,11 @@ packages:
yup@1.4.0:
resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==}
zod-to-json-schema@3.24.4:
resolution: {integrity: sha512-0uNlcvgabyrni9Ag8Vghj21drk7+7tp7VTwwR7KxxXXc/3pbXz2PHlDgj3cICahgF1kHm4dExBFj7BXrZJXzig==}
peerDependencies:
zod: ^3.24.1
zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
@ -14273,6 +14442,20 @@ snapshots:
'@types/react': 18.3.12
react: 18.3.1
'@modelcontextprotocol/sdk@1.7.0':
dependencies:
content-type: 1.0.5
cors: 2.8.5
eventsource: 3.0.5
express: 5.0.1
express-rate-limit: 7.5.0(express@5.0.1)
pkce-challenge: 4.1.0
raw-body: 3.0.0
zod: 3.23.8
zod-to-json-schema: 3.24.4(zod@3.23.8)
transitivePeerDependencies:
- supports-color
'@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)':
dependencies:
monaco-editor: 0.52.2
@ -17335,6 +17518,10 @@ snapshots:
dependencies:
undici-types: 6.19.8
'@types/node@22.13.10':
dependencies:
undici-types: 6.20.0
'@types/node@22.13.5':
dependencies:
undici-types: 6.20.0
@ -17647,14 +17834,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@22.13.5)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0))':
'@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0))':
dependencies:
'@babel/core': 7.26.9
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 6.1.0(@types/node@22.13.5)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0)
vite: 6.1.0(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0)
transitivePeerDependencies:
- supports-color
@ -17778,6 +17965,11 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
accepts@2.0.0:
dependencies:
mime-types: 3.0.0
negotiator: 1.0.0
accessor-fn@1.5.1: {}
acorn-import-attributes@1.9.5(acorn@8.14.0):
@ -18179,6 +18371,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
body-parser@2.1.0:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
debug: 4.4.0
http-errors: 2.0.0
iconv-lite: 0.5.2
on-finished: 2.4.1
qs: 6.14.0
raw-body: 3.0.0
type-is: 2.0.0
transitivePeerDependencies:
- supports-color
boolbase@1.0.0: {}
boxen@7.0.0:
@ -18657,6 +18863,10 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
content-disposition@1.0.0:
dependencies:
safe-buffer: 5.2.1
content-type@1.0.5: {}
convert-source-map@1.9.0: {}
@ -18665,6 +18875,8 @@ snapshots:
cookie-signature@1.0.6: {}
cookie-signature@1.2.2: {}
cookie@0.4.2: {}
cookie@0.6.0: {}
@ -18859,6 +19071,10 @@ snapshots:
dependencies:
ms: 2.1.2
debug@4.3.6:
dependencies:
ms: 2.1.2
debug@4.3.7:
dependencies:
ms: 2.1.3
@ -19435,8 +19651,8 @@ snapshots:
'@typescript-eslint/parser': 6.21.0(eslint@8.30.0)(typescript@5.3.3)
eslint: 8.30.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.30.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.30.0)
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0))(eslint@8.30.0)
eslint-plugin-jsx-a11y: 6.10.2(eslint@8.30.0)
eslint-plugin-react: 7.37.2(eslint@8.30.0)
eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.30.0)
@ -19517,13 +19733,13 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.30.0):
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 8.30.0
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.30.0)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0))(eslint@8.30.0)
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
@ -19547,14 +19763,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.30.0):
eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0))(eslint@8.30.0):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 6.21.0(eslint@8.30.0)(typescript@5.3.3)
eslint: 8.30.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.30.0)
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0)
transitivePeerDependencies:
- supports-color
@ -19603,7 +19819,7 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.30.0):
eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0))(eslint@8.30.0):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@ -19614,7 +19830,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.30.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.30.0)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.30.0)(typescript@5.3.3))(eslint@8.30.0))(eslint@8.30.0))(eslint@8.30.0)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@ -19940,6 +20156,12 @@ snapshots:
events@3.3.0: {}
eventsource-parser@3.0.0: {}
eventsource@3.0.5:
dependencies:
eventsource-parser: 3.0.0
execa@5.1.1:
dependencies:
cross-spawn: 7.0.5
@ -19968,6 +20190,10 @@ snapshots:
export-to-csv@1.4.0: {}
express-rate-limit@7.5.0(express@5.0.1):
dependencies:
express: 5.0.1
express@4.21.2:
dependencies:
accepts: 1.3.8
@ -20004,6 +20230,43 @@ snapshots:
transitivePeerDependencies:
- supports-color
express@5.0.1:
dependencies:
accepts: 2.0.0
body-parser: 2.1.0
content-disposition: 1.0.0
content-type: 1.0.5
cookie: 0.7.1
cookie-signature: 1.2.2
debug: 4.3.6
depd: 2.0.0
encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
finalhandler: 2.1.0
fresh: 2.0.0
http-errors: 2.0.0
merge-descriptors: 2.0.0
methods: 1.1.2
mime-types: 3.0.0
on-finished: 2.4.1
once: 1.4.0
parseurl: 1.3.3
proxy-addr: 2.0.7
qs: 6.13.0
range-parser: 1.2.1
router: 2.1.0
safe-buffer: 5.2.1
send: 1.1.0
serve-static: 2.1.0
setprototypeof: 1.2.0
statuses: 2.0.1
type-is: 2.0.0
utils-merge: 1.0.1
vary: 1.1.2
transitivePeerDependencies:
- supports-color
extend@3.0.2: {}
extendable-error@0.1.7: {}
@ -20074,6 +20337,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
finalhandler@2.1.0:
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.1
transitivePeerDependencies:
- supports-color
find-root@1.1.0: {}
find-up@3.0.0:
@ -20153,6 +20427,8 @@ snapshots:
fresh@0.5.2: {}
fresh@2.0.0: {}
fs-constants@1.0.0: {}
fs-extra@11.2.0:
@ -20726,6 +21002,10 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
iconv-lite@0.5.2:
dependencies:
safer-buffer: 2.1.2
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
@ -20943,6 +21223,8 @@ snapshots:
is-potential-custom-element-name@1.0.1: {}
is-promise@4.0.0: {}
is-reference@1.2.1:
dependencies:
'@types/estree': 1.0.6
@ -21576,6 +21858,8 @@ snapshots:
media-typer@0.3.0: {}
media-typer@1.1.0: {}
memfs-browser@3.5.10302:
dependencies:
memfs: 3.5.3
@ -21602,6 +21886,8 @@ snapshots:
merge-descriptors@1.0.3: {}
merge-descriptors@2.0.0: {}
merge-stream@2.0.0: {}
merge2@1.4.1: {}
@ -21896,6 +22182,8 @@ snapshots:
mime-db@1.52.0: {}
mime-db@1.53.0: {}
mime-types@2.1.18:
dependencies:
mime-db: 1.33.0
@ -21904,6 +22192,10 @@ snapshots:
dependencies:
mime-db: 1.52.0
mime-types@3.0.0:
dependencies:
mime-db: 1.53.0
mime@1.6.0: {}
mimic-fn@2.1.0: {}
@ -22018,6 +22310,8 @@ snapshots:
negotiator@0.6.3: {}
negotiator@1.0.0: {}
neo-async@2.6.2: {}
next-intl@3.19.1(next@14.2.5(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react@18.3.1):
@ -22508,6 +22802,8 @@ snapshots:
object-inspect@1.13.2: {}
object-inspect@1.13.4: {}
object-keys@1.1.1: {}
object.assign@4.1.5:
@ -22600,6 +22896,8 @@ snapshots:
is-inside-container: 1.0.0
is-wsl: 3.1.0
openapi-types@12.1.3: {}
opener@1.5.2: {}
openid-client@5.6.4(patch_hash=2gg7ly76yaettle5dlvkpcfpny):
@ -22755,6 +23053,8 @@ snapshots:
path-to-regexp@6.2.2: {}
path-to-regexp@8.2.0: {}
path-type@4.0.0: {}
path@0.12.7:
@ -22800,6 +23100,8 @@ snapshots:
pirates@4.0.6: {}
pkce-challenge@4.1.0: {}
pkg-types@1.2.1:
dependencies:
confbox: 0.1.8
@ -23107,6 +23409,10 @@ snapshots:
dependencies:
side-channel: 1.0.6
qs@6.14.0:
dependencies:
side-channel: 1.1.0
querystringify@2.2.0: {}
queue-microtask@1.2.3: {}
@ -23142,6 +23448,13 @@ snapshots:
iconv-lite: 0.4.24
unpipe: 1.0.0
raw-body@3.0.0:
dependencies:
bytes: 3.1.2
http-errors: 2.0.0
iconv-lite: 0.6.3
unpipe: 1.0.0
rc@1.2.8:
dependencies:
deep-extend: 0.6.0
@ -23734,6 +24047,12 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.34.8
fsevents: 2.3.3
router@2.1.0:
dependencies:
is-promise: 4.0.0
parseurl: 1.3.3
path-to-regexp: 8.2.0
rrweb-cssom@0.7.1: {}
rsvp@3.2.1: {}
@ -23819,6 +24138,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
send@1.1.0:
dependencies:
debug: 4.4.0
destroy: 1.2.0
encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
fresh: 0.5.2
http-errors: 2.0.0
mime-types: 2.1.35
ms: 2.1.3
on-finished: 2.4.1
range-parser: 1.2.1
statuses: 2.0.1
transitivePeerDependencies:
- supports-color
serialize-javascript@6.0.2:
dependencies:
randombytes: 2.1.0
@ -23842,6 +24178,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
serve-static@2.1.0:
dependencies:
encodeurl: 2.0.0
escape-html: 1.0.3
parseurl: 1.3.3
send: 1.1.0
transitivePeerDependencies:
- supports-color
serve@14.2.4:
dependencies:
'@zeit/schemas': 2.36.0
@ -23969,6 +24314,26 @@ snapshots:
shimmer@1.2.1: {}
side-channel-list@1.0.0:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
side-channel-map@1.0.1:
dependencies:
call-bound: 1.0.3
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.3
es-errors: 1.3.0
get-intrinsic: 1.3.0
object-inspect: 1.13.4
side-channel-map: 1.0.1
side-channel@1.0.6:
dependencies:
call-bind: 1.0.7
@ -23976,6 +24341,14 @@ snapshots:
get-intrinsic: 1.2.4
object-inspect: 1.13.2
side-channel@1.1.0:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
side-channel-list: 1.0.0
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
siginfo@2.0.0: {}
signal-exit@3.0.7: {}
@ -24713,7 +25086,7 @@ snapshots:
tsscmp@1.0.6: {}
tsup@8.1.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(postcss@8.4.47)(typescript@5.7.3):
tsup@8.1.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(postcss@8.4.47)(typescript@5.8.2):
dependencies:
bundle-require: 4.2.1(esbuild@0.21.5)
cac: 6.7.14
@ -24732,12 +25105,12 @@ snapshots:
optionalDependencies:
'@swc/core': 1.3.101(@swc/helpers@0.5.15)
postcss: 8.4.47
typescript: 5.7.3
typescript: 5.8.2
transitivePeerDependencies:
- supports-color
- ts-node
tsup@8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.7.3)(yaml@2.6.0):
tsup@8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.8.2)(yaml@2.6.0):
dependencies:
bundle-require: 5.0.0(esbuild@0.24.0)
cac: 6.7.14
@ -24758,14 +25131,14 @@ snapshots:
optionalDependencies:
'@swc/core': 1.3.101(@swc/helpers@0.5.15)
postcss: 8.4.47
typescript: 5.7.3
typescript: 5.8.2
transitivePeerDependencies:
- jiti
- supports-color
- tsx
- yaml
tsup@8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.15.5)(typescript@5.7.3)(yaml@2.4.5):
tsup@8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.15.5)(typescript@5.8.2)(yaml@2.4.5):
dependencies:
bundle-require: 5.0.0(esbuild@0.24.0)
cac: 6.7.14
@ -24786,7 +25159,7 @@ snapshots:
optionalDependencies:
'@swc/core': 1.3.101(@swc/helpers@0.5.15)
postcss: 8.5.2
typescript: 5.7.3
typescript: 5.8.2
transitivePeerDependencies:
- jiti
- supports-color
@ -24821,7 +25194,7 @@ snapshots:
- tsx
- yaml
tsup@8.4.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.6.0):
tsup@8.4.0(@swc/core@1.3.101(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.2)(tsx@4.19.2)(typescript@5.8.2)(yaml@2.6.0):
dependencies:
bundle-require: 5.1.0(esbuild@0.25.0)
cac: 6.7.14
@ -24842,7 +25215,7 @@ snapshots:
optionalDependencies:
'@swc/core': 1.3.101(@swc/helpers@0.5.15)
postcss: 8.5.2
typescript: 5.7.3
typescript: 5.8.2
transitivePeerDependencies:
- jiti
- supports-color
@ -24963,6 +25336,12 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
type-is@2.0.0:
dependencies:
content-type: 1.0.5
media-typer: 1.1.0
mime-types: 3.0.0
typed-array-buffer@1.0.2:
dependencies:
call-bind: 1.0.7
@ -25011,6 +25390,8 @@ snapshots:
typescript@5.7.3: {}
typescript@5.8.2: {}
ufo@1.5.4: {}
uglify-js@3.18.0:
@ -25314,13 +25695,13 @@ snapshots:
tsx: 4.19.3
yaml: 2.6.0
vite@6.1.0(@types/node@22.13.5)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0):
vite@6.1.0(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.31.1)(tsx@4.19.3)(yaml@2.6.0):
dependencies:
esbuild: 0.24.2
postcss: 8.5.2
rollup: 4.34.8
optionalDependencies:
'@types/node': 22.13.5
'@types/node': 22.13.10
fsevents: 2.3.3
jiti: 2.4.2
lightningcss: 1.29.1
@ -25674,6 +26055,10 @@ snapshots:
toposort: 2.0.2
type-fest: 2.19.0
zod-to-json-schema@3.24.4(zod@3.23.8):
dependencies:
zod: 3.23.8
zod@3.23.8: {}
zustand@4.5.2(@types/react@18.3.12)(immer@9.0.21)(react@18.2.0):

View File

@ -64,6 +64,11 @@
"@stackframe/stack-backend#build"
]
},
"@stackframe/mcp-server#build": {
"dependsOn": [
"@stackframe/stack-backend#build"
]
},
"@stackframe/stack-backend#build": {
"dependsOn": [
"codegen"