diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 12ad511db..c7d29fc00 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -94,6 +94,7 @@ RUN if ["$name" = "objectstorage" ]; then \ COPY --from=builder /app/$path/public ./$path/public COPY --from=builder --chown=nextjs:nodejs /app/$path/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/$path/.next/static ./$path/.next/static + EXPOSE 3000 ENV PORT=3000 diff --git a/frontend/package.json b/frontend/package.json index e8a238eaf..9f60c8a4a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,7 +18,7 @@ "gen:theme-typings": "pnpm chakra-cli tokens packages/ui/src/theme/theme.ts --out node_modules/.pnpm/node_modules/@chakra-ui/styled-system/dist/theming.types.d.ts", "postinstall": "pnpm run gen:theme-typings && pnpm run build-packages", "prepare": "cd .. && husky frontend/.husky", - "build-packages": "pnpm -r --filter ./packages/client-sdk run build" + "build-packages": "pnpm -r --filter './packages/*' run build" }, "workspaces": [ "./packages/*", diff --git a/frontend/packages/driver/package.json b/frontend/packages/driver/package.json index 5f2933fa4..1976e46b7 100644 --- a/frontend/packages/driver/package.json +++ b/frontend/packages/driver/package.json @@ -7,7 +7,7 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "next dev", - "build": "echo \"build driver\"" + "build": "exit 0" }, "keywords": [ "driver", diff --git a/frontend/packages/mcp-sdk/.gitignore b/frontend/packages/mcp-sdk/.gitignore new file mode 100644 index 000000000..f06235c46 --- /dev/null +++ b/frontend/packages/mcp-sdk/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/frontend/packages/mcp-sdk/package.json b/frontend/packages/mcp-sdk/package.json new file mode 100644 index 000000000..39c17f35c --- /dev/null +++ b/frontend/packages/mcp-sdk/package.json @@ -0,0 +1,54 @@ +{ + "name": "sealos-mcp-sdk", + "version": "0.1.1", + "description": "sealos mcp sdk for OpenAPI integration with MCP", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "rollup -c", + "dev": "rollup -c -w" + }, + "exports": { + ".": { + "import": "./dist/index.esm.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "typesVersions": { + "*": { + "*": [ + "./dist/index.d.ts" + ] + } + }, + "keywords": [ + "sealos", + "mcp", + "sdk", + "openapi", + "vercel" + ], + "author": "lizhenq2009@gmail.com", + "license": "ISC", + "devDependencies": { + "@rollup/plugin-typescript": "^11.1.4", + "@types/node": "^20.7.1", + "rollup": "2.79.1", + "rollup-plugin-copy": "^3.5.0", + "rollup-plugin-dts": "^4.2.3", + "tslib": "^2.6.2", + "typescript": "^5.0.0" + }, + "dependencies": { + "@vercel/mcp-adapter": "^0.9.1", + "axios": "^1.5.1", + "https": "^1.0.0", + "openapi-types": "^12.1.3", + "next": "^13.5.3", + "zod": "^3.22.0" + }, + "peerDependencies": { + "@kubernetes/client-node": "^0.18.1" + } +} diff --git a/frontend/packages/mcp-sdk/rollup.config.js b/frontend/packages/mcp-sdk/rollup.config.js new file mode 100644 index 000000000..5214078a0 --- /dev/null +++ b/frontend/packages/mcp-sdk/rollup.config.js @@ -0,0 +1,70 @@ +import typescript from '@rollup/plugin-typescript'; +import dts from 'rollup-plugin-dts'; +import copy from 'rollup-plugin-copy'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; + +const external = [ + 'axios', + 'https', + 'zod', + 'path', + 'fs', + '@vercel/mcp-adapter', + 'async_hooks', + 'openapi-types' +]; + +const createConfig = (input, output, plugins = []) => ({ + input, + output, + external, + plugins: [ + nodeResolve(), + commonjs(), + typescript({ + tsconfig: './tsconfig.json', + compilerOptions: { + declaration: false, + declarationMap: false, + noImplicitAny: false + }, + noEmitOnError: false + }), + ...plugins + ] +}); + +const createDtsConfig = (input, output, plugins = []) => ({ + input, + output, + external, + plugins: [dts(), ...plugins] +}); + +export default [ + createConfig('src/index.ts', [ + { + file: 'dist/index.js', + format: 'cjs', + sourcemap: true + }, + { + file: 'dist/index.esm.js', + format: 'es', + sourcemap: true + } + ]), + + createDtsConfig('src/index.ts', { + file: 'dist/index.d.ts', + format: 'es' + }, [ + copy({ + targets: [ + { src: 'package.json', dest: 'dist' }, + { src: 'README.md', dest: 'dist', failOnError: false } + ] + }) + ]) +]; diff --git a/frontend/packages/mcp-sdk/src/httprequest.ts b/frontend/packages/mcp-sdk/src/httprequest.ts new file mode 100644 index 000000000..52a4beb85 --- /dev/null +++ b/frontend/packages/mcp-sdk/src/httprequest.ts @@ -0,0 +1,111 @@ +import axios from 'axios'; +import https from 'https'; +import { z } from 'zod'; + +export async function executeHttpRequest( + toolId: string, + toolName: string, + params: any, + apiBaseUrl: string, + headers: Record = {} +): Promise<{ content: Array<{ type: string; text: string }> }> { + console.error(`Executing tool: ${toolId} (${toolName})`); + + // Only keep authentication-related headers + const cleanedHeaders: Record = {}; + + // Preserve authorization-related headers + if (headers.authorization) { + cleanedHeaders.Authorization = headers.authorization; + } + if (headers.Authorization) { + cleanedHeaders.Authorization = headers.Authorization; + } + // Output cleaned headers + console.log(`Transformed headers: ${JSON.stringify(cleanedHeaders, null, 2)}`); + try { + const [method, ...pathParts] = toolId.split('-'); + const path = '/' + pathParts.join('/').replace(/-/g, '/'); + const baseUrl = apiBaseUrl.endsWith('/') ? apiBaseUrl : `${apiBaseUrl}/`; + const cleanPath = path.startsWith('/') ? path.slice(1) : path; + const url = new URL(cleanPath, baseUrl).toString(); + const config: any = { + method: method.toLowerCase(), + url: url, + headers: cleanedHeaders + }; + if (method.toLowerCase() === 'get') { + if (params && typeof params === 'object') { + const queryParams: Record = {}; + for (const [key, value] of Object.entries(params)) { + if (Array.isArray(value)) { + queryParams[key] = value.join(','); + } else if (value !== undefined && value !== null) { + queryParams[key] = String(value); + } + } + config.params = queryParams; + } + } else { + config.data = params; + } + console.error(`Processed parameters:`, config.params || config.data); + console.error('Final request config:', config); + const response = await axios(config); + console.error('Response status:', response.status); + console.error('Response headers:', response.headers); + console.error('Response data:', response.data); + return { + content: [ + { + type: 'text', + text: JSON.stringify(response.data, null, 2) + } + ] + }; + } catch (error) { + if (axios.isAxiosError(error)) { + console.error('Request failed:', { + status: error.response?.status, + statusText: error.response?.statusText, + data: error.response?.data, + headers: error.response?.headers + }); + throw new Error( + `API request failed: ${error.message} - ${JSON.stringify(error.response?.data)}` + ); + } + throw error; + } +} + +export function convertToZodProperties(schema: { + type: string; + properties: Record; + required?: string[]; +}): z.ZodRawShape { + const zodProperties: z.ZodRawShape = {}; + for (const [key, prop] of Object.entries(schema.properties)) { + switch (prop.type) { + case 'string': + zodProperties[key] = z.string(); + break; + case 'number': + zodProperties[key] = z.number(); + break; + case 'boolean': + zodProperties[key] = z.boolean(); + break; + case 'integer': + zodProperties[key] = z.number().int(); + default: + zodProperties[key] = z.any(); + } + + if (!schema.required?.includes(key)) { + zodProperties[key] = zodProperties[key].optional(); + } + } + + return zodProperties; +} diff --git a/frontend/packages/mcp-sdk/src/index.ts b/frontend/packages/mcp-sdk/src/index.ts new file mode 100644 index 000000000..48dbd3cec --- /dev/null +++ b/frontend/packages/mcp-sdk/src/index.ts @@ -0,0 +1 @@ +export { McpHandler, createMcpApiHandler } from './sdk'; diff --git a/frontend/packages/mcp-sdk/src/openapi.ts b/frontend/packages/mcp-sdk/src/openapi.ts new file mode 100644 index 000000000..f4bb81662 --- /dev/null +++ b/frontend/packages/mcp-sdk/src/openapi.ts @@ -0,0 +1,111 @@ +// openapi-tools.ts + +import { OpenAPIV3 } from 'openapi-types'; +import path from 'path'; +import * as fs from 'fs'; + +export interface Tool { + name: string; + description: string; + inputSchema: { + type: string; + properties: Record; + required?: string[]; + }; +} + +function getOpenApiSpecPath(specPath: any) { + if (typeof specPath !== 'string') { + throw new Error('Invalid OpenAPI spec path'); + } + const normalizedPath = path.normalize(specPath).replace(/^(\.\.(\/|\\|$))+/, ''); + const fullPath = path.resolve(process.cwd(), normalizedPath); + const baseDir = process.cwd(); + if (!fullPath.startsWith(baseDir)) { + throw new Error('Access to paths outside the base directory is not allowed'); + } + if (!fs.existsSync(fullPath)) { + throw new Error(`OpenAPI spec file not found: ${normalizedPath}`); + } + return fullPath; +} + +export class OpenAPIToolsParser { + public static loadAndParseOpenAPISpec(config: { + openApiSpec: string | OpenAPIV3.Document; + }): Map { + const tools = new Map(); + let spec: OpenAPIV3.Document; + try { + const resolvedPath = getOpenApiSpecPath(config.openApiSpec); + const content = fs.readFileSync(resolvedPath, 'utf-8'); + spec = JSON.parse(content); + } catch (error) { + // @ts-ignore + throw new Error(`Failed to parse OpenAPI spec: ${error.message}`); + } + // @ts-ignore + for (const [path, pathItem] of Object.entries(spec.paths)) { + if (!pathItem) continue; + for (const [method, operation] of Object.entries(pathItem)) { + if (method === 'parameters' || !operation) continue; + + const op = operation as OpenAPIV3.OperationObject; + const cleanPath = path.replace(/^\//, ''); + const toolId = `${method.toUpperCase()}-${cleanPath}`.replace(/[^a-zA-Z0-9-]/g, '-'); + + const tool: Tool = { + // @ts-ignore + name: op.summary, + description: op.description || 'No description available', + inputSchema: { + type: 'object', + properties: {}, + required: undefined + } + }; + if (op.parameters) { + for (const param of op.parameters) { + if ('name' in param && 'in' in param) { + const paramSchema = param.schema as OpenAPIV3.SchemaObject; + tool.inputSchema.properties[param.name] = { + type: paramSchema?.type || 'string', + description: param.description || `${param.name} parameter` + }; + + if (param.required) { + tool.inputSchema.required = tool.inputSchema.required || []; + tool.inputSchema.required.push(param.name); + } + } + } + } + if (op.requestBody) { + const requestBody = op.requestBody as OpenAPIV3.RequestBodyObject; + if (requestBody.content) { + const jsonContent = requestBody.content['application/json']; + if (jsonContent && jsonContent.schema) { + const schema = jsonContent.schema as OpenAPIV3.SchemaObject; + if (schema.properties) { + for (const [propName, propSchema] of Object.entries(schema.properties)) { + const propSchemaObj = propSchema as OpenAPIV3.SchemaObject; + tool.inputSchema.properties[propName] = { + type: propSchemaObj.type || 'string', + description: propSchemaObj.description || `${propName} property` + }; + } + } + if (schema.required) { + tool.inputSchema.required = tool.inputSchema.required || []; + tool.inputSchema.required = [...tool.inputSchema.required, ...schema.required]; + } + } + } + } + tools.set(toolId, tool); + } + } + return tools; + } +} +export type { OpenAPIV3 }; diff --git a/frontend/packages/mcp-sdk/src/sdk.ts b/frontend/packages/mcp-sdk/src/sdk.ts new file mode 100644 index 000000000..02b9b97b5 --- /dev/null +++ b/frontend/packages/mcp-sdk/src/sdk.ts @@ -0,0 +1,111 @@ +import { createMcpHandler } from '@vercel/mcp-adapter'; +import { OpenAPIToolsParser } from './openapi'; +import { executeHttpRequest, convertToZodProperties } from './httprequest'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { AsyncLocalStorage } from 'async_hooks'; + +export function McpHandler(path: string, url: string) { + const requestContextStorage = new AsyncLocalStorage(); + const tools = OpenAPIToolsParser.loadAndParseOpenAPISpec({ + openApiSpec: path + }); + const baseHandler = createMcpHandler( + (server) => { + tools.forEach((tool, id) => { + const zodProperties = convertToZodProperties(tool.inputSchema); + server.tool(tool.name, tool.description, zodProperties, async (params: any) => { + const context = requestContextStorage.getStore(); + // @ts-ignore + const headers = context ? context.headers : {}; + const createUserResult = await executeHttpRequest(id, tool.name, params, url, headers); + return { + content: [ + { + type: 'text', + text: JSON.stringify(createUserResult) + } + ] + }; + }); + }); + }, + { + capabilities: { + tools: { + echo: { + description: 'Echo a message' + } + } + } + }, + { + redisUrl: process.env.REDIS_URL, + basePath: '/api', + verboseLogs: true, + maxDuration: 60 + } + ); + + return async function (request: Request): Promise { + // Extract request headers + const headersObj: Record = {}; + request.headers.forEach((value, key) => { + headersObj[key] = value; + }); + + // Create request context + const requestContext = { + headers: headersObj + }; + + // Run request handler with async local storage + return await requestContextStorage.run(requestContext, async () => { + try { + return await baseHandler(request); + } catch (error) { + console.error('Error processing request:', error); + return new Response(JSON.stringify({ error: 'Internal Server Error' }), { + status: 500, + headers: { 'Content-Type': 'application/json' } + }); + } + }); + }; +} + +export function createMcpApiHandler(path: string, baseUrl: string) { + return async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + const protocol = req.headers['x-forwarded-proto'] || 'http'; + const host = req.headers.host; + const url = new URL(req.url || '', `${protocol}://${host}`); + const request = new Request(url.toString(), { + method: req.method || 'GET', + headers: new Headers(req.headers as Record), + body: + req.method === 'POST' || req.method === 'PUT' || req.method === 'PATCH' + ? JSON.stringify(req.body) + : undefined + }); + const handler = McpHandler(path, baseUrl); + const response = await handler(request); + response.headers.forEach((value, key) => { + res.setHeader(key, value); + }); + res.status(response.status); + if (response.body) { + const responseData = await response.text(); + // nosemgrep: javascript.express.security.audit.xss.direct-response-write.direct-response-write + return res.send(responseData); + } else { + return res.end(); + } + } catch (error: any) { + console.error('MCP Handler Error:', error); + return res.status(500).json({ + message: 'Internal server error', + error: process.env.NODE_ENV === 'development' ? error?.message : undefined + }); + } + }; +} diff --git a/frontend/packages/mcp-sdk/tsconfig.json b/frontend/packages/mcp-sdk/tsconfig.json new file mode 100644 index 000000000..b864f0d3b --- /dev/null +++ b/frontend/packages/mcp-sdk/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.deps.json", + "compilerOptions": { + "lib": ["es2017", "DOM"], + "noImplicitAny": true, + "declaration": true, + "moduleResolution": "node", + "esModuleInterop": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "dist/**/*.d.ts", "dist/**/*.ts"] +} diff --git a/frontend/packages/ui/package.json b/frontend/packages/ui/package.json index 1facdeb7e..8129e506c 100644 --- a/frontend/packages/ui/package.json +++ b/frontend/packages/ui/package.json @@ -7,7 +7,7 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "next dev", - "build": "echo \"build @sealos/ui\"" + "build": "exit 0" }, "keywords": [], "author": "", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index b29945aee..8f97d0180 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) '@chakra-ui/next-js': specifier: ^2.1.5 - version: 2.2.0(@chakra-ui/react@2.8.2)(@emotion/react@11.11.1)(next@14.2.5)(react@18.2.0) + version: 2.2.0(@chakra-ui/react@2.8.2)(@emotion/react@11.11.1)(next@13.5.9)(react@18.2.0) '@chakra-ui/react': specifier: ^2.8.1 version: 2.8.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.37)(framer-motion@10.16.5)(react-dom@18.2.0)(react@18.2.0) @@ -37,7 +37,7 @@ importers: version: 23.12.1 next-i18next: specifier: ^15.3.0 - version: 15.3.0(i18next@23.12.1)(next@14.2.5)(react-i18next@14.1.2)(react@18.2.0) + version: 15.3.0(i18next@23.12.1)(next@13.5.9)(react-i18next@14.1.2)(react@18.2.0) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.12.1)(react-dom@18.2.0)(react@18.2.0) @@ -379,6 +379,52 @@ importers: specifier: 18.0.11 version: 18.0.11 + packages/mcp-sdk: + dependencies: + '@kubernetes/client-node': + specifier: ^0.18.1 + version: 0.18.1 + '@vercel/mcp-adapter': + specifier: ^0.9.1 + version: 0.9.1(@modelcontextprotocol/sdk@1.12.1)(next@13.5.9) + axios: + specifier: ^1.5.1 + version: 1.7.7 + https: + specifier: ^1.0.0 + version: 1.0.0 + next: + specifier: ^13.5.3 + version: 13.5.9(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 + zod: + specifier: ^3.22.0 + version: 3.23.8 + devDependencies: + '@rollup/plugin-typescript': + specifier: ^11.1.4 + version: 11.1.5(rollup@2.79.1)(tslib@2.6.2)(typescript@5.2.2) + '@types/node': + specifier: ^20.7.1 + version: 20.17.32 + rollup: + specifier: 2.79.1 + version: 2.79.1 + rollup-plugin-copy: + specifier: ^3.5.0 + version: 3.5.0 + rollup-plugin-dts: + specifier: ^4.2.3 + version: 4.2.3(rollup@2.79.1)(typescript@5.2.2) + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ^5.0.0 + version: 5.2.2 + packages/ui: dependencies: react: @@ -1628,6 +1674,9 @@ importers: sealos-desktop-sdk: specifier: workspace:* version: link:../../packages/client-sdk + sealos-mcp-sdk: + specifier: workspace:^ + version: link:../../packages/mcp-sdk zod: specifier: ^3.23.8 version: 3.23.8 @@ -3835,13 +3884,13 @@ packages: - reflect-metadata dev: false - /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + /@apideck/better-ajv-errors@0.3.6(ajv@8.17.1): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} peerDependencies: ajv: '>=8' dependencies: - ajv: 8.12.0 + ajv: 8.17.1 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -6160,21 +6209,6 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/next-js@2.2.0(@chakra-ui/react@2.8.2)(@emotion/react@11.11.1)(next@14.2.5)(react@18.2.0): - resolution: {integrity: sha512-brCz0UEOlImX4Np2jDIaljZJkW6kiDSuXG5erxvYjZlklLhmti1zj0o1sSjt5yff1xndfgHoOJb+BYG5wx+vDg==} - peerDependencies: - '@chakra-ui/react': '>=2.4.0' - '@emotion/react': '>=11' - next: '>=13' - react: '>=18' - dependencies: - '@chakra-ui/react': 2.8.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.37)(framer-motion@10.16.5)(react-dom@18.2.0)(react@18.2.0) - '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.37)(react@18.2.0) - next: 14.2.5(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) - react: 18.2.0 - dev: false - /@chakra-ui/number-input@2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0): resolution: {integrity: sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==} peerDependencies: @@ -7787,7 +7821,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -7808,14 +7842,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.0) + jest-config: 29.7.0(@types/node@20.17.32) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7843,7 +7877,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 jest-mock: 29.7.0 dev: true @@ -7870,7 +7904,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.10.0 + '@types/node': 20.17.32 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7903,7 +7937,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 20.10.0 + '@types/node': 20.17.32 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -7991,7 +8025,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -8106,7 +8140,7 @@ packages: resolution: {integrity: sha512-WTOjGuFQ8yeW3+qD6JrAYhpwpoQbe9R8cA/61WCyFrNawSTUgLstHu7EsZRYEs39er3jDn3wCEaczz+VOFlc2Q==} dependencies: '@types/js-yaml': 4.0.9 - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/request': 2.48.12 '@types/ws': 8.5.10 byline: 5.0.0 @@ -8130,7 +8164,7 @@ packages: resolution: {integrity: sha512-yYRbgMeyQbvZDHt/ZqsW3m4lRefzhbbJEuj8sVXM+bufKrgmzriA2oq7lWPH/k/LQIicAME9ixPUadTrxIF6dQ==} dependencies: '@types/js-yaml': 4.0.9 - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/request': 2.48.12 '@types/ws': 8.5.10 byline: 5.0.0 @@ -8359,6 +8393,25 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@modelcontextprotocol/sdk@1.12.1: + resolution: {integrity: sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==} + engines: {node: '>=18'} + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + express: 5.1.0 + express-rate-limit: 7.5.0(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.5(zod@3.23.8) + transitivePeerDependencies: + - supports-color + dev: false + /@monaco-editor/loader@1.4.0(monaco-editor@0.44.0): resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} peerDependencies: @@ -9666,6 +9719,55 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@redis/bloom@1.2.0(@redis/client@1.6.1): + resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.6.1 + dev: false + + /@redis/client@1.6.1: + resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} + engines: {node: '>=14'} + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + dev: false + + /@redis/graph@1.1.1(@redis/client@1.6.1): + resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.6.1 + dev: false + + /@redis/json@1.0.7(@redis/client@1.6.1): + resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.6.1 + dev: false + + /@redis/search@1.2.0(@redis/client@1.6.1): + resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.6.1 + dev: false + + /@redis/time-series@1.1.0(@redis/client@1.6.1): + resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.6.1 + dev: false + /@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.6): resolution: {integrity: sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==} peerDependencies: @@ -11115,14 +11217,14 @@ packages: /@types/base64-stream@1.0.5: resolution: {integrity: sha512-gXuo/a7pQ1EXlR5ksM2MccBLl6UUgAgnzR01r/QoHnkaSNinmzSdaGcCq5NAxn72dZ5A1zNYQIl+J9hPsBgBrA==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: true /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.10.0 + '@types/node': 20.17.32 /@types/btoa-lite@1.0.2: resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==} @@ -11131,7 +11233,7 @@ packages: /@types/byline@4.2.36: resolution: {integrity: sha512-dO55KDSaOSE+3T8TwP66mzn0u/PM/aSedVMr1tby7WBNjfLIuS6IbYXi1mlau49sVSVB+gXKJscWE0JO3tlXDw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: true /@types/caseless@0.12.5: @@ -11140,7 +11242,7 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 /@types/d3-timer@2.0.3: resolution: {integrity: sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==} @@ -11180,7 +11282,7 @@ packages: /@types/express-serve-static-core@4.17.41: resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/qs': 6.9.10 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -11196,13 +11298,13 @@ packages: /@types/formidable@3.4.5: resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: true /@types/fs-extra@8.1.5: resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: true /@types/geojson@7946.0.14: @@ -11213,12 +11315,12 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.10.0 + '@types/node': 20.17.32 /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: true /@types/hast@2.3.8: @@ -11284,7 +11386,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -11362,7 +11464,7 @@ packages: /@types/node-fetch@2.6.12: resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 form-data: 4.0.0 dev: false @@ -11398,7 +11500,6 @@ packages: resolution: {integrity: sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==} dependencies: undici-types: 6.19.8 - dev: false /@types/node@20.3.1: resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} @@ -11423,7 +11524,7 @@ packages: /@types/papaparse@5.3.15: resolution: {integrity: sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: true /@types/parse-json@4.0.2: @@ -11479,14 +11580,14 @@ packages: resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} dependencies: '@types/caseless': 0.12.5 - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: false /@types/resolve@1.20.2: @@ -11500,14 +11601,14 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.10.0 + '@types/node': 20.17.32 /@types/serve-static@1.15.5: resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.10.0 + '@types/node': 20.17.32 /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -11516,7 +11617,7 @@ packages: /@types/stream-buffers@3.0.7: resolution: {integrity: sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: false /@types/supercluster@7.1.3: @@ -11528,7 +11629,7 @@ packages: /@types/tar@6.1.13: resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 minipass: 4.2.8 dev: false @@ -11566,25 +11667,25 @@ packages: /@types/whatwg-url@8.2.2: resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 '@types/webidl-conversions': 7.0.3 dev: false /@types/ws@6.0.4: resolution: {integrity: sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: false /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 /@types/xml2js@0.4.14: resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 dev: false /@types/yargs-parser@21.0.3: @@ -11874,7 +11975,7 @@ packages: dependencies: '@typescript-eslint/types': 8.12.2 '@typescript-eslint/visitor-keys': 8.12.2 - debug: 4.3.6 + debug: 4.4.1 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -11964,6 +12065,20 @@ packages: vue: 3.5.13(typescript@5.2.2) dev: false + /@vercel/mcp-adapter@0.9.1(@modelcontextprotocol/sdk@1.12.1)(next@13.5.9): + resolution: {integrity: sha512-qvlO8b+wwxwe81MY7iHV0FowO2pFk4SIeq9oUPQQ4uXqKe54rrnqvXcLT5IJ2XpF+aiVMpgOFYofa2XJbwYKcg==} + hasBin: true + peerDependencies: + '@modelcontextprotocol/sdk': ^1.12.0 + next: '>=13.0.0' + dependencies: + '@modelcontextprotocol/sdk': 1.12.1 + chalk: 5.4.1 + commander: 11.1.0 + next: 13.5.9(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) + redis: 4.7.1 + dev: false + /@vue/compiler-core@3.5.13: resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} dependencies: @@ -12313,6 +12428,14 @@ packages: negotiator: 0.4.7 dev: false + /accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + dev: false + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: @@ -12414,15 +12537,6 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - /ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} dependencies: @@ -12806,7 +12920,7 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 @@ -12819,7 +12933,7 @@ packages: define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 @@ -13247,6 +13361,23 @@ packages: type-is: 1.3.2 dev: false + /body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -13378,6 +13509,11 @@ packages: resolution: {integrity: sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==} dev: false + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + /bytewise-core@1.2.3: resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} dependencies: @@ -13391,6 +13527,13 @@ packages: typewise: 1.0.3 dev: false + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -13402,12 +13545,19 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + /callsite@1.0.0: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} dev: false @@ -13682,6 +13832,11 @@ packages: engines: {node: '>=6'} dev: false + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -13787,6 +13942,11 @@ packages: engines: {node: '>= 0.4.x'} dev: false + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: false + /commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -13871,6 +14031,13 @@ packages: - supports-color dev: false + /content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -13895,10 +14062,20 @@ packages: resolution: {integrity: sha512-k+lrG38ZC/S7zN6l1/HcF6xF4jMwkIUjnr5afDU7tzFxIfDmKzdqJdXo8HNYaXOuBJ3tPKxSiwCOTA0b3qQfaA==} dev: false + /cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + dev: false + /cookie@0.1.2: resolution: {integrity: sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==} dev: false + /cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + dev: false + /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: @@ -14054,6 +14231,14 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + /cryptiles@0.1.3: resolution: {integrity: sha512-YI0PphzKlfxoNvaUPpkf8x+TUssMJimL1pPIEgj+8WSx0PQtfesYms/dua8Rn+KZWqoCL4AxcxHZJS9nd/oLPw==} engines: {node: 0.8.x} @@ -14412,6 +14597,17 @@ packages: dependencies: ms: 2.1.2 + /debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -14476,7 +14672,7 @@ packages: object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 + side-channel: 1.1.0 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.13 @@ -14508,17 +14704,17 @@ packages: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} @@ -14568,6 +14764,11 @@ packages: engines: {node: '>= 0.8.0'} dev: false + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: false @@ -14755,6 +14956,14 @@ packages: engines: {node: '>=4'} dev: false + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: @@ -14806,6 +15015,10 @@ packages: resolution: {integrity: sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==} dev: false + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} @@ -14842,6 +15055,11 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} + /encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + dev: false + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -14985,19 +15203,19 @@ packages: data-view-buffer: 1.0.1 data-view-byte-length: 1.0.1 data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 get-symbol-description: 1.0.2 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.0.3 - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 @@ -15009,7 +15227,7 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.3 @@ -15029,7 +15247,11 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + + /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==} @@ -15039,8 +15261,8 @@ packages: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 is-arguments: 1.1.1 is-map: 2.0.2 is-set: 2.0.2 @@ -15097,6 +15319,12 @@ packages: dependencies: es-errors: 1.3.0 + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + /es-set-tostringtag@2.0.2: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} @@ -15109,7 +15337,7 @@ packages: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -15164,6 +15392,10 @@ packages: resolution: {integrity: sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==} dev: false + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -16876,6 +17108,11 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false @@ -16888,11 +17125,23 @@ packages: engines: {node: '>=0.8.x'} dev: false + /eventsource-parser@3.0.2: + resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} + engines: {node: '>=18.0.0'} + dev: false + /eventsource@2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} dev: false + /eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + dependencies: + eventsource-parser: 3.0.2 + dev: false + /exceljs@4.4.0: resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} engines: {node: '>=8.3.0'} @@ -16927,7 +17176,7 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -16974,6 +17223,15 @@ packages: jest-util: 29.7.0 dev: true + /express-rate-limit@7.5.0(express@5.1.0): + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + engines: {node: '>= 16'} + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + dependencies: + express: 5.1.0 + dev: false + /express@4.6.1: resolution: {integrity: sha512-nG9Y8xfzgrW/9XCr5sv+KDbtY8mZPN9HO3GziltaubpvleI+1RyHxAKvYjmFih3HkQIaPXW9ozxMHBDNf3UXng==} engines: {node: '>= 0.10.0'} @@ -17004,6 +17262,41 @@ packages: - supports-color dev: false + /express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + 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 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -17220,6 +17513,20 @@ packages: - supports-color dev: false + /finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + dependencies: + debug: 4.4.1 + 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 + dev: false + /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -17331,7 +17638,7 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 /forever-agent@0.2.0: @@ -17412,6 +17719,11 @@ packages: tslib: 2.6.2 dev: false + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true @@ -17444,6 +17756,11 @@ packages: resolution: {integrity: sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==} dev: false + /fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + dev: false + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -17523,6 +17840,11 @@ packages: engines: {node: '>=10'} dev: false + /generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + dev: false + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -17559,6 +17881,21 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -17578,6 +17915,13 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -17592,7 +17936,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} @@ -17600,7 +17944,7 @@ packages: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 /get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} @@ -17738,7 +18082,7 @@ packages: dir-glob: 3.0.1 fast-glob: 3.3.2 glob: 7.2.3 - ignore: 5.3.0 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -17768,7 +18112,11 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -17869,17 +18217,21 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 /has@1.0.4: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} @@ -18257,6 +18609,17 @@ packages: resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} dev: false + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -18285,10 +18648,14 @@ packages: transitivePeerDependencies: - supports-color + /https@1.0.0: + resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} + dev: false + /httpx@2.3.1: resolution: {integrity: sha512-l5rcAoKP8A9XOIlcIA87Wt9A7AX2fgOslHOF4WB5Q24y/1+aeH8b7c7NKfm+Bcf+h0u4FHNtLCriC4mAFmCYgg==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -18353,7 +18720,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true /idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} @@ -18466,7 +18832,7 @@ packages: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -18513,6 +18879,11 @@ packages: engines: {node: '>= 0.2.5'} dev: false + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + /ipaddr.js@2.1.0: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} @@ -18548,7 +18919,7 @@ packages: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.12 /is-array-buffer@3.0.4: @@ -18556,7 +18927,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -18619,7 +18990,6 @@ packages: engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 - dev: true /is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} @@ -18777,6 +19147,10 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: false + /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: @@ -18833,7 +19207,7 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} @@ -18862,7 +19236,7 @@ packages: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -18953,7 +19327,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.6 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -18982,7 +19356,7 @@ packages: engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 set-function-name: 2.0.2 @@ -19024,7 +19398,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -19181,6 +19555,46 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@20.17.32): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.5 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.17.32 + babel-jest: 29.7.0(@babel/core@7.23.5) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19239,7 +19653,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -19255,7 +19669,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.10.0 + '@types/node': 20.17.32 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -19306,7 +19720,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 jest-util: 29.7.0 dev: true @@ -19361,7 +19775,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -19392,7 +19806,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -19444,7 +19858,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -19469,7 +19883,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.17.32 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -19481,7 +19895,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -19489,7 +19903,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -19498,7 +19912,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.17.32 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20359,6 +20773,10 @@ packages: resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} dev: false + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: @@ -20648,6 +21066,11 @@ packages: engines: {node: '>= 0.6'} dev: false + /media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + dev: false + /memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} requiresBuild: true @@ -20658,6 +21081,11 @@ packages: resolution: {integrity: sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==} dev: false + /merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -21123,7 +21551,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.6 + debug: 4.4.1 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -21147,7 +21575,7 @@ packages: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.6 + debug: 4.4.1 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -21185,6 +21613,11 @@ packages: 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'} + dev: false + /mime-types@1.0.2: resolution: {integrity: sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==} engines: {node: '>= 0.8.0'} @@ -21196,6 +21629,13 @@ packages: dependencies: mime-db: 1.52.0 + /mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.54.0 + dev: false + /mime@1.2.11: resolution: {integrity: sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==} dev: false @@ -21365,7 +21805,7 @@ packages: dependencies: define-data-property: 1.1.4 functions-have-names: 1.2.3 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 hasown: 2.0.2 isarray: 2.0.5 @@ -21562,6 +22002,11 @@ packages: engines: {node: '>= 0.6'} dev: false + /negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + dev: false + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false @@ -21706,26 +22151,6 @@ packages: react-i18next: 14.1.2(i18next@23.12.1)(react-dom@18.2.0)(react@18.2.0) dev: false - /next-i18next@15.3.0(i18next@23.12.1)(next@14.2.5)(react-i18next@14.1.2)(react@18.2.0): - resolution: {integrity: sha512-bq7Cc9XJFcmGOCLnyEtHaeJ3+JJNsI/8Pkj9BaHAnhm4sZ9vNNC4ZsaqYnlRZ7VH5ypSo73fEqLK935jLsmCvQ==} - engines: {node: '>=14'} - peerDependencies: - i18next: '>= 23.7.13' - next: '>= 12.0.0' - react: '>= 17.0.2' - react-i18next: '>= 13.5.0' - dependencies: - '@babel/runtime': 7.24.0 - '@types/hoist-non-react-statics': 3.3.5 - core-js: 3.33.3 - hoist-non-react-statics: 3.3.2 - i18next: 23.12.1 - i18next-fs-backend: 2.3.1 - next: 14.2.5(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) - react: 18.2.0 - react-i18next: 14.1.2(i18next@23.12.1)(react-dom@18.2.0)(react@18.2.0) - dev: false - /next-intl@3.17.2(next@14.2.5)(react@18.2.0): resolution: {integrity: sha512-X2ly23e1lC5vdWHaJFBDZi/0iornEdFQQtqJmmPOb7WD+LDssm9vAnx+hJshYGjddaP3rUmyWaPgePCQqaxm1g==} peerDependencies: @@ -22232,6 +22657,10 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} @@ -22258,7 +22687,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - has-symbols: 1.0.3 + has-symbols: 1.1.0 object-keys: 1.1.1 /object.entries@1.1.7: @@ -22358,6 +22787,13 @@ packages: requiresBuild: true optional: true + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -22383,6 +22819,10 @@ packages: mimic-function: 5.0.1 dev: true + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -22533,6 +22973,11 @@ packages: resolution: {integrity: sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==} dev: false + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -22568,6 +23013,11 @@ packages: resolution: {integrity: sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==} dev: false + /path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + dev: false + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -22629,6 +23079,11 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + /pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + dev: false + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -22921,6 +23376,14 @@ packages: ipaddr.js: 0.1.2 dev: false + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false @@ -22963,6 +23426,13 @@ packages: resolution: {integrity: sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==} dev: false + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: false + /qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -23029,6 +23499,11 @@ packages: resolution: {integrity: sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==} dev: false + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + /raw-body@1.3.0: resolution: {integrity: sha512-iuI1bOSi9tEmVCrXq02ZysXatTrhAu+fSo7XOQHhMo4g87dSy9YB2W/9Udwhz0bPpFk4UcoLhjrHgpPbRD3ktA==} engines: {node: '>= 0.8.0'} @@ -23037,6 +23512,16 @@ packages: iconv-lite: 0.4.4 dev: false + /raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + dev: false + /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} peerDependencies: @@ -24061,6 +24546,17 @@ packages: strip-indent: 3.0.0 dev: true + /redis@4.7.1: + resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} + dependencies: + '@redis/bloom': 1.2.0(@redis/client@1.6.1) + '@redis/client': 1.6.1 + '@redis/graph': 1.1.1(@redis/client@1.6.1) + '@redis/json': 1.0.7(@redis/client@1.6.1) + '@redis/search': 1.2.0(@redis/client@1.6.1) + '@redis/time-series': 1.1.0(@redis/client@1.6.1) + dev: false + /reflect-metadata@0.1.14: resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} dev: false @@ -24076,7 +24572,7 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 which-builtin-type: 1.1.3 @@ -24413,7 +24909,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -24576,6 +25072,19 @@ packages: optionalDependencies: fsevents: 2.3.3 + /router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: @@ -24619,7 +25128,7 @@ packages: engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 has-symbols: 1.0.3 isarray: 2.0.5 @@ -24634,7 +25143,7 @@ packages: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-regex: 1.1.4 /safe-regex-test@1.0.3: @@ -24740,6 +25249,25 @@ packages: - supports-color dev: false + /send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: @@ -24762,13 +25290,25 @@ packages: - supports-color dev: false + /serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 /set-function-length@1.2.2: @@ -24778,8 +25318,8 @@ packages: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 /set-function-name@2.0.1: @@ -24818,6 +25358,10 @@ packages: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + /shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} dev: false @@ -24862,6 +25406,32 @@ packages: rechoir: 0.6.2 dev: false + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + 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: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + 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.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -24875,8 +25445,18 @@ packages: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + 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 /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -25237,6 +25817,16 @@ packages: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} dev: false + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + dev: false + /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} @@ -25367,7 +25957,7 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 /string.prototype.trimend@1.0.8: resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} @@ -25389,7 +25979,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -25908,6 +26498,11 @@ packages: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /tomahawk-plugin-kv-memory-store@0.0.3: resolution: {integrity: sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==} dev: false @@ -26128,12 +26723,21 @@ packages: mime-types: 2.1.35 dev: false + /type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + dev: false + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.12 /typed-array-buffer@1.0.2: @@ -26159,7 +26763,7 @@ packages: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-proto: 1.0.3 is-typed-array: 1.1.13 @@ -26180,7 +26784,7 @@ packages: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-proto: 1.0.3 is-typed-array: 1.1.13 @@ -26197,7 +26801,7 @@ packages: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 @@ -26262,7 +26866,7 @@ packages: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 - has-symbols: 1.0.3 + has-symbols: 1.1.0 which-boxed-primitive: 1.0.2 /underscore@1.13.6: @@ -26273,7 +26877,6 @@ packages: /undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - dev: false /undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -26450,6 +27053,11 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + /unzipper@0.10.14: resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} dependencies: @@ -26990,7 +27598,7 @@ packages: available-typed-arrays: 1.0.5 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.0 /which-typed-array@1.1.15: @@ -27000,7 +27608,7 @@ packages: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 /which@1.3.1: @@ -27062,7 +27670,7 @@ packages: resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} engines: {node: '>=10.0.0'} dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) '@babel/core': 7.23.5 '@babel/preset-env': 7.23.3(@babel/core@7.23.5) '@babel/runtime': 7.24.0 @@ -27070,7 +27678,7 @@ packages: '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.12.0 + ajv: 8.17.1 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 @@ -27430,6 +28038,14 @@ packages: zod: 3.23.8 dev: false + /zod-to-json-schema@3.24.5(zod@3.23.8): + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + dependencies: + zod: 3.23.8 + dev: false + /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false diff --git a/frontend/providers/devbox/app/api/mcp/route.ts b/frontend/providers/devbox/app/api/mcp/route.ts new file mode 100644 index 000000000..2d6f1241d --- /dev/null +++ b/frontend/providers/devbox/app/api/mcp/route.ts @@ -0,0 +1,11 @@ +import { McpHandler } from 'sealos-mcp-sdk'; +import path from 'path'; + +export const dynamic = 'force-dynamic'; + +const handler = McpHandler( + path.join(process.cwd(), 'public', 'devbox.json'), + 'http://devbox-frontend.devbox-frontend.svc.cluster.local:3000' +); + +export { handler as GET, handler as POST, handler as DELETE }; diff --git a/frontend/providers/devbox/package.json b/frontend/providers/devbox/package.json index abf32a6d9..15415c076 100644 --- a/frontend/providers/devbox/package.json +++ b/frontend/providers/devbox/package.json @@ -31,13 +31,13 @@ "fast-json-patch": "^3.1.1", "framer-motion": "^10.16.4", "immer": "^10.1.1", - "lucide-react": "^0.476.0", "ini": "^4.1.3", "js-cookie": "^3.0.5", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.2", "jszip": "^3.10.1", "lodash": "^4.17.21", + "lucide-react": "^0.476.0", "nanoid": "^4.0.2", "next": "14.2.5", "next-intl": "^3.17.2", @@ -51,6 +51,7 @@ "react-syntax-highlighter": "^15.5.0", "sass": "^1.68.0", "sealos-desktop-sdk": "workspace:*", + "sealos-mcp-sdk": "workspace:^", "zod": "^3.23.8", "zod-openapi": "^4.2.4", "zustand": "^4.5.4" diff --git a/frontend/providers/devbox/public/devbox.json b/frontend/providers/devbox/public/devbox.json new file mode 100644 index 000000000..3042e4134 --- /dev/null +++ b/frontend/providers/devbox/public/devbox.json @@ -0,0 +1,418 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Devbox API", + "version": "1.0.0", + "description": "" + }, + "paths": { + "/api/v1/DevBox/create": { + "post": { + "summary": "createDevbox", + "description": "使用模版,创建一个新的DevBox", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "DevBox名称" + }, + "runtimeName": { + "type": "string", + "enum": [ + "Debian", + "C++", + "Rust", + "Java", + "Go", + "Python", + "Node.js", + ".Net", + "C", + "PHP" + ], + "description": "DevBox 创建所使用的模版的名称,有以下可选项:Debian,C++,Rust,Java,Go,Python,Node.js,.Net,C,PHP" + }, + "cpu": { + "type": "number", + "minimum": 0, + "default": 2000, + "description": "CPU核心数, 使用1000,2000的格式,代表1Core, 2Core" + }, + "memory": { + "type": "number", + "minimum": 0, + "default": 4096, + "description": "内存数, 使用2048, 4096,代表2G, 4G" + } + }, + "required": [ + "name", + "runtimeName" + ] + } + } + } + }, + "responses": { + "200": { + "description": "Devbox created successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Devbox name" + }, + "sshPort": { + "type": "number", + "description": "SSH port" + }, + "base64PrivateKey": { + "type": "string", + "description": "Base64 encoded private key" + }, + "userName": { + "type": "string", + "description": "User name" + }, + "workingDir": { + "type": "string", + "description": "Working directory" + }, + "domain": { + "type": "string", + "description": "Domain" + } + }, + "required": [ + "name", + "sshPort", + "base64PrivateKey", + "userName", + "workingDir", + "domain" + ] + } + }, + "required": [ + "data" + ] + } + } + } + }, + "400": { + "description": "Invalid request body", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + } + } + }, + "404": { + "description": "Template not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + } + } + }, + "409": { + "description": "Devbox already exists", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + } + } + } + } + } + }, + "/api/v1/DevBox/release": { + "post": { + "summary": "releaseDevbox", + "description": "DevBox发版,release,为现有的DevBox发布一个新的版本", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "devboxName": { + "type": "string", + "minLength": 1, + "description": "DevBox名称" + }, + "tag": { + "type": "string", + "minLength": 1, + "description": "DevBox新的Tag" + }, + "releaseDes": { + "type": "string", + "default": "", + "description": "新版本的介绍" + } + }, + "required": [ + "devboxName", + "tag" + ] + } + } + } + } + } + }, + "/api/v1/DevBox/releases": { + "get": { + "summary": "getDevboxreleases", + "description": "获取单个Devbox的所有历史版本", + "parameters": [ + { + "in": "query", + "name": "devboxName", + "description": "Devbox名称", + "schema": { + "type": "string", + "minLength": 1, + "description": "Devbox名称" + }, + "required": true + } + ] + } + }, + "/api/v1/DevBox/lifecycle": { + "post": { + "summary": "manageDevbox", + "description": "操作Devbox,Devbox生命周期管理,主要包含开机,关机,重启,冷关机,这些操作都通过这个工具完成", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "devboxName": { + "type": "string", + "minLength": 1, + "description": "Devbox名称" + }, + "action": { + "type": "string", + "enum": [ + "start", + "stop", + "restart", + "shutdown" + ], + "description": "操作方式:start为开机,stop为关机,restart为重启,shutdown为冷关机" + } + }, + "required": [ + "devboxName", + "action" + ] + } + } + } + }, + "/api/v1/getDevboxListEasyResponse": { + "get": { + "tags": [ + "Query" + ], + "summary": "获取所有Devbox", + "description": "获取所有Devbox,得到Devbox的列表,可以知道当前有哪些Devbox" + } + } + } + }, + "/api/v1/DevBox/ports/create": { + "post": { + "summary": "createPort", + "description": "创建Devbox端口,为现有的Devbox创建一个新的端口", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "devboxName": { + "type": "string", + "minLength": 1, + "description": "Devbox名称" + }, + "port": { + "type": "number", + "minimum": 1, + "maximum": 65535, + "description": "新创建端口的端口号" + }, + "protocol": { + "type": "string", + "enum": [ + "HTTP", + "GRPC", + "WS" + ], + "default": "HTTP", + "description": "这个端口的通信方式,有三种通信方式可选:HTTP,GRPC,WS" + } + }, + "required": [ + "devboxName", + "port" + ] + } + } + } + } + } + }, + "/api/deployDevbox": { + "post": { + "summary": "deployDevbox", + "description": "部署 Devbox", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "devboxName": { + "type": "string", + "minLength": 1, + "description": "Devbox名称" + }, + "port": { + "type": "number", + "minimum": 1, + "default": 65535, + "description": "端口号" + }, + "tag": { + "type": "string", + "minLength": 1, + "description": "Devbox版本号,即Devbox发布版本时所使用的版本号" + }, + "cpu": { + "type": "number", + "minimum": 0, + "default": 2000, + "description": "CPU核心数,使用1000、2000,分别代表1核、2核" + }, + "memory": { + "type": "number", + "minimum": 0, + "default": 4096, + "description": "内存大小,使用2048、4096,分别代表2G、4G" + } + }, + "required": [ + "devboxName", + "tag" + ] + } + } + } + } + } + }, + "/api/v1/DevBox/list": { + "get": { + "tags": [ + "Query" + ], + "summary": "getDevboxList", + "description": "获取DevBox列表,获得每个DevBox的详细信息" + } + } + } +} \ No newline at end of file diff --git a/frontend/providers/devbox/tsconfig.json b/frontend/providers/devbox/tsconfig.json index 4b46609d1..4bf1171ef 100644 --- a/frontend/providers/devbox/tsconfig.json +++ b/frontend/providers/devbox/tsconfig.json @@ -1,12 +1,21 @@ { + "extends": "../../tsconfig.web.json", "compilerOptions": { "baseUrl": ".", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "target": "ES2020", "forceConsistentCasingInFileNames": false, "paths": { - "@/*": ["./*"], - "prisma/*": ["prisma/*"] + "@/*": [ + "./*" + ], + "prisma/*": [ + "prisma/*" + ], }, "plugins": [ { @@ -14,6 +23,10 @@ } ] }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "extends": "../../tsconfig.web.json" -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ] +} \ No newline at end of file