From 5c50ea942ae1f39818c5bb81b0cd9c97fcba3330 Mon Sep 17 00:00:00 2001 From: Fred Porter Date: Wed, 19 Aug 2026 20:58:51 +0800 Subject: [PATCH] feat(mcp): establish canonical read-only gateway --- backend/app/mcp/mcp_bridge/index.ts | 456 -------------- backend/app/mcp/mcp_bridge/package.json | 16 - .../mcp/{mcp_bridge => udos_mcp}/.gitignore | 0 backend/app/mcp/udos_mcp/index.ts | 125 ++++ backend/app/mcp/udos_mcp/package-lock.json | 219 +++++++ backend/app/mcp/udos_mcp/package.json | 19 + .../app/mcp/udos_mcp/test/protocol.test.mjs | 77 +++ .../{mcp_bridge => udos_mcp}/tsconfig.json | 0 backend/mcp/README.md | 17 +- backend/mcp/mcp_diagnostics.py | 57 -- docs/MCP_ARCHITECTURE_AUDIT_2026-08-19.md | 16 +- docs/MCP_SETUP.md | 23 +- frontend-vue/package.json | 1 - package.json | 8 +- pnpm-lock.yaml | 590 +----------------- 15 files changed, 476 insertions(+), 1148 deletions(-) delete mode 100644 backend/app/mcp/mcp_bridge/index.ts delete mode 100644 backend/app/mcp/mcp_bridge/package.json rename backend/app/mcp/{mcp_bridge => udos_mcp}/.gitignore (100%) create mode 100644 backend/app/mcp/udos_mcp/index.ts create mode 100644 backend/app/mcp/udos_mcp/package-lock.json create mode 100644 backend/app/mcp/udos_mcp/package.json create mode 100644 backend/app/mcp/udos_mcp/test/protocol.test.mjs rename backend/app/mcp/{mcp_bridge => udos_mcp}/tsconfig.json (100%) delete mode 100644 backend/mcp/mcp_diagnostics.py diff --git a/backend/app/mcp/mcp_bridge/index.ts b/backend/app/mcp/mcp_bridge/index.ts deleted file mode 100644 index 5ed33e0d..00000000 --- a/backend/app/mcp/mcp_bridge/index.ts +++ /dev/null @@ -1,456 +0,0 @@ -#!/usr/bin/env node -import { Server } from "@modelcontextprotocol/sdk/server/index.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { - CallToolRequestSchema, - ListToolsRequestSchema, -} from "@modelcontextprotocol/sdk/types.js"; - -declare const process: { - env: Record; - on(event: string, handler: () => void | Promise): void; - exit(code?: number): never; -}; - -const UCORE_BASE = process.env.UCORE_URL || "http://localhost:8484"; - -async function apiGet(path: string): Promise { - const res = await fetch(`${UCORE_BASE}${path}`, { - signal: AbortSignal.timeout(15000), - }); - if (!res.ok) throw new Error(`uCore ${path} -> ${res.status}`); - return res.json(); -} - -async function apiPost( - path: string, - body: Record, -): Promise { - const res = await fetch(`${UCORE_BASE}${path}`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), - signal: AbortSignal.timeout(30000), - }); - if (!res.ok) { - const text = await res.text(); - throw new Error( - `uCore POST ${path} -> ${res.status}: ${text.slice(0, 200)}`, - ); - } - return res.json(); -} - -// ─── Tool definitions ───────────────────────────────────────────── - -const TOOLS = [ - { - name: "ucore_list_skills", - description: - "List governed internal uCore capabilities. Returns id, name, description, category, and parameters.", - inputSchema: { - type: "object", - properties: { - search: { - type: "string", - description: - "Optional search term to filter skills by name or description", - }, - }, - }, - }, - { - name: "ucore_run_skill", - description: - "Execute a governed internal uCore capability by its ID.", - inputSchema: { - type: "object", - properties: { - skill_id: { - type: "string", - description: "The capability ID returned by ucore_list_skills", - }, - params: { - type: "object", - description: "Optional parameters to pass to the skill", - }, - }, - required: ["skill_id"], - }, - }, - { - name: "ucore_ollama_status", - description: - "Check Ollama LLM server status — online status, model count, and available models.", - inputSchema: { - type: "object", - properties: {}, - required: [], - }, - }, - { - name: "ucore_list_agents", - description: - "List all configured AI agents with their specializations, models, and capabilities.", - inputSchema: { - type: "object", - properties: {}, - required: [], - }, - }, - { - name: "ucore_chat", - description: - "Send a message through the uCore LLM chat pipeline. Routes through the provider router based on complexity.", - inputSchema: { - type: "object", - properties: { - message: { - type: "string", - description: "The message to send", - }, - model: { - type: "string", - description: "Optional model override", - }, - }, - required: ["message"], - }, - }, - { - name: "ucore_search_knowledge", - description: - "Search the uCore vault knowledge base for documents matching a query.", - inputSchema: { - type: "object", - properties: { - query: { - type: "string", - description: "Search query", - }, - workspace_id: { - type: "string", - description: "Optional workspace ID to scope the search", - }, - }, - required: ["query"], - }, - }, - { - name: "ucore_list_secrets", - description: - "List all stored secrets in the uCore secret store (names only, values are never exposed).", - inputSchema: { - type: "object", - properties: {}, - required: [], - }, - }, - { - name: "ucore_workflow_status", - description: - "Get current user workflow status — active tasks, missions, binder state.", - inputSchema: { - type: "object", - properties: {}, - required: [], - }, - }, - { - name: "ucore_config", - description: - "Get the current uCore configuration — server settings, budget limits, enabled features.", - inputSchema: { - type: "object", - properties: {}, - required: [], - }, - }, - { - name: "ucore_list_repos", - description: - "List developer repositories tracked by the Developer surface — Groovebox, SonicScrewdriver, uConnect, etc.", - inputSchema: { - type: "object", - properties: {}, - required: [], - }, - }, - { - name: "ucore_capability_preflight", - description: - "Run strict readiness check for one capability key (for example: wordpress_gateway, google_ai_bridge, dreamscape_orchestration).", - inputSchema: { - type: "object", - properties: { - capability: { - type: "string", - description: "Capability key to evaluate", - }, - }, - required: ["capability"], - }, - }, - { - name: "ucore_capabilities_readiness", - description: - "Run batch readiness for capability keys. Defaults to WordPress, Google, and Dreamscape when omitted.", - inputSchema: { - type: "object", - properties: { - capabilities: { - type: "array", - description: "Optional list of capability keys", - items: { type: "string" }, - }, - }, - required: [], - }, - }, -]; - -// ─── Server ──────────────────────────────────────────────────────── - -const server = new Server( - { - name: "ucore-bridge", - version: "1.0.0", - }, - { - capabilities: { - tools: {}, - }, - }, -); - -server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: TOOLS, -})); - -server.setRequestHandler(CallToolRequestSchema, async (request) => { - const { name, arguments: args } = request.params; - - try { - switch (name) { - case "ucore_list_skills": { - const search = args?.search as string | undefined; - let data = await apiGet("/api/skills"); - if (search && data.skills) { - const q = search.toLowerCase(); - data.skills = data.skills.filter( - (s: any) => - s.id?.toLowerCase().includes(q) || - s.name?.toLowerCase().includes(q) || - s.description?.toLowerCase().includes(q), - ); - data.count = data.skills.length; - } - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_run_skill": { - const skillId = args?.skill_id as string; - const params = (args?.params as Record) || {}; - const data = await apiPost(`/api/skills/${skillId}/run`, params); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_ollama_status": { - const data = await apiGet("/api/ollama/status"); - const models = await apiGet("/api/ollama/models/available"); - return { - content: [ - { - type: "text", - text: JSON.stringify({ ...data, models }, null, 2), - }, - ], - }; - } - - case "ucore_list_agents": { - const data = await apiGet("/api/agents"); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_chat": { - const message = args?.message as string; - const model = args?.model as string | undefined; - const body: Record = { message }; - if (model) body.model = model; - const data = await apiPost("/api/chat", body); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_search_knowledge": { - const query = args?.query as string; - const workspaceId = args?.workspace_id as string | undefined; - const params = new URLSearchParams({ q: query }); - if (workspaceId) params.set("workspace_id", workspaceId); - const data = await apiGet(`/api/knowledge/search?${params.toString()}`); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_list_secrets": { - const data = await apiGet("/api/secrets"); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_workflow_status": { - const data = await apiGet("/api/user/workflow/status"); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_config": { - const data = await apiGet("/api/config"); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_list_repos": { - const data = await apiGet("/api/developer/repos"); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_capability_preflight": { - const capability = String(args?.capability || "").trim(); - if (!capability) { - throw new Error("capability is required"); - } - const data = await apiGet( - `/api/capabilities/${encodeURIComponent(capability)}/preflight`, - ); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - case "ucore_capabilities_readiness": { - const defaults = [ - "wordpress_gateway", - "google_ai_bridge", - "dreamscape_orchestration", - ]; - const list = Array.isArray(args?.capabilities) - ? (args?.capabilities as unknown[]) - .map((c) => String(c)) - .filter(Boolean) - : defaults; - const csv = encodeURIComponent(list.join(",")); - const data = await apiGet( - `/api/capabilities/readiness?capabilities=${csv}`, - ); - return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], - }; - } - - default: - return { - content: [ - { - type: "text", - text: `Unknown tool: ${name}`, - }, - ], - isError: true, - }; - } - } catch (error: any) { - return { - content: [ - { - type: "text", - text: `uCore bridge error: ${error.message || String(error)}`, - }, - ], - isError: true, - }; - } -}); - -server.onerror = (error) => console.error("[ucore-bridge MCP Error]", error); -process.on("SIGINT", async () => { - await server.close(); - process.exit(0); -}); - -async function main() { - const transport = new StdioServerTransport(); - await server.connect(transport); - console.error("ucore-bridge MCP server running on stdio"); -} - -main().catch(console.error); diff --git a/backend/app/mcp/mcp_bridge/package.json b/backend/app/mcp/mcp_bridge/package.json deleted file mode 100644 index 417f383d..00000000 --- a/backend/app/mcp/mcp_bridge/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "ucore-bridge", - "version": "1.0.0", - "description": "MCP stdio bridge wrapping uCore HTTP API (port 8484)", - "type": "module", - "scripts": { - "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"" - }, - "dependencies": { - "@modelcontextprotocol/sdk": "^1.0.0" - }, - "devDependencies": { - "typescript": "^5.0.0", - "@types/node": "^20.0.0" - } -} \ No newline at end of file diff --git a/backend/app/mcp/mcp_bridge/.gitignore b/backend/app/mcp/udos_mcp/.gitignore similarity index 100% rename from backend/app/mcp/mcp_bridge/.gitignore rename to backend/app/mcp/udos_mcp/.gitignore diff --git a/backend/app/mcp/udos_mcp/index.ts b/backend/app/mcp/udos_mcp/index.ts new file mode 100644 index 00000000..809a9a97 --- /dev/null +++ b/backend/app/mcp/udos_mcp/index.ts @@ -0,0 +1,125 @@ +#!/usr/bin/env node +import { McpServer } from "@modelcontextprotocol/server"; +import { serveStdio } from "@modelcontextprotocol/server/stdio"; +import * as z from "zod/v4"; + +const UCORE_BASE = process.env.UCORE_URL || "http://localhost:8484"; + +async function apiGet(path: string): Promise { + const response = await fetch(`${UCORE_BASE}${path}`, { + signal: AbortSignal.timeout(15_000), + }); + if (!response.ok) { + const detail = (await response.text()).slice(0, 200); + throw new Error(`uCore GET ${path} -> ${response.status}: ${detail}`); + } + return response.json(); +} + +function result(data: unknown) { + return { content: [{ type: "text" as const, text: JSON.stringify(data, null, 2) }] }; +} + +function failure(error: unknown) { + const message = error instanceof Error ? error.message : String(error); + return { + content: [{ type: "text" as const, text: `uDOS MCP error: ${message}` }], + isError: true, + }; +} + +async function read(path: string) { + try { + return result(await apiGet(path)); + } catch (error) { + return failure(error); + } +} + +export function createServer(): McpServer { + const server = new McpServer({ name: "udos-mcp", version: "2.0.0" }); + + server.registerTool( + "system.health.get", + { description: "Read the current uCore system health report.", inputSchema: z.object({}) }, + async () => read("/api/health/full"), + ); + + server.registerTool( + "developer.repositories.list", + { + description: "List repositories visible to the uCore Developer surface.", + inputSchema: z.object({ + scope: z.enum(["code", "ecosystem"]).optional(), + excludeSystem: z.boolean().optional(), + }), + }, + async ({ scope, excludeSystem }) => { + const query = new URLSearchParams(); + if (scope) query.set("scope", scope); + if (excludeSystem !== undefined) query.set("exclude_system", String(excludeSystem)); + return read(`/api/developer/repos${query.size ? `?${query}` : ""}`); + }, + ); + + server.registerTool( + "developer.repository.status", + { + description: "Read staged and unstaged status for one named repository.", + inputSchema: z.object({ repository: z.string().min(1).max(100) }), + }, + async ({ repository }) => read(`/api/developer/repos/${encodeURIComponent(repository)}/status`), + ); + + server.registerTool( + "flow.tasks.list", + { + description: "List workflow tasks using the canonical uFlow-backed task store.", + inputSchema: z.object({ + scope: z.enum(["user", "all"]).optional(), + board: z.string().max(100).optional(), + tag: z.string().max(100).optional(), + }), + }, + async ({ scope, board, tag }) => { + const query = new URLSearchParams(); + if (scope) query.set("scope", scope); + if (board) query.set("board", board); + if (tag) query.set("tag", tag); + return read(`/api/workflow/tasks${query.size ? `?${query}` : ""}`); + }, + ); + + server.registerTool( + "knowledge.search", + { + description: "Search indexed Markdown through the canonical uKnowledge route.", + inputSchema: z.object({ + query: z.string().min(1).max(500), + workspaceId: z.string().max(100).optional(), + limit: z.number().int().min(1).max(50).optional(), + }), + }, + async ({ query: term, workspaceId, limit }) => { + const query = new URLSearchParams({ q: term }); + if (workspaceId) query.set("workspace_id", workspaceId); + if (limit !== undefined) query.set("limit", String(limit)); + return read(`/api/knowledge/search?${query}`); + }, + ); + + server.registerTool( + "code.grid.tools.list", + { description: "List the read-only GridSmith tool catalogue exposed by uCode.", inputSchema: z.object({}) }, + async () => read("/api/gridsmith/tools"), + ); + + return server; +} + +const handle = serveStdio(createServer); +console.error("udos-mcp server running on stdio"); + +for (const signal of ["SIGINT", "SIGTERM"] as const) { + process.on(signal, () => void handle.close()); +} diff --git a/backend/app/mcp/udos_mcp/package-lock.json b/backend/app/mcp/udos_mcp/package-lock.json new file mode 100644 index 00000000..47363626 --- /dev/null +++ b/backend/app/mcp/udos_mcp/package-lock.json @@ -0,0 +1,219 @@ +{ + "name": "udos-mcp", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "udos-mcp", + "version": "2.0.0", + "dependencies": { + "@modelcontextprotocol/server": "^2.0.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@modelcontextprotocol/client": "^2.0.0", + "@types/node": "^20.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@modelcontextprotocol/client": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/client/-/client-2.0.0.tgz", + "integrity": "sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/core": "2.0.0", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "jose": "^6.1.3", + "pkce-challenge": "^5.0.0", + "zod": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@modelcontextprotocol/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.0.0.tgz", + "integrity": "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==", + "license": "MIT", + "dependencies": { + "zod": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@modelcontextprotocol/server": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.0.0.tgz", + "integrity": "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/core": "2.0.0", + "zod": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jose": { + "version": "6.2.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.9.tgz", + "integrity": "sha512-XrchZOFZUl/T3vTwRe8XK+cJrGtMF4th1ARnDfwbBXFKThGhlsxEE4Zu03AD/bjJSt/9jT/mxrOCkJWOg77aPA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/backend/app/mcp/udos_mcp/package.json b/backend/app/mcp/udos_mcp/package.json new file mode 100644 index 00000000..62b40172 --- /dev/null +++ b/backend/app/mcp/udos_mcp/package.json @@ -0,0 +1,19 @@ +{ + "name": "udos-mcp", + "version": "2.0.0", + "description": "Canonical read-only uDOS MCP gateway over local stdio", + "type": "module", + "scripts": { + "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", + "test": "npm run build && node --test test/*.test.mjs" + }, + "dependencies": { + "@modelcontextprotocol/server": "^2.0.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@modelcontextprotocol/client": "^2.0.0", + "@types/node": "^20.0.0", + "typescript": "^5.0.0" + } +} diff --git a/backend/app/mcp/udos_mcp/test/protocol.test.mjs b/backend/app/mcp/udos_mcp/test/protocol.test.mjs new file mode 100644 index 00000000..d54009d7 --- /dev/null +++ b/backend/app/mcp/udos_mcp/test/protocol.test.mjs @@ -0,0 +1,77 @@ +import assert from "node:assert/strict"; +import { after, before, test } from "node:test"; +import http from "node:http"; +import { Client } from "@modelcontextprotocol/client"; +import { StdioClientTransport } from "@modelcontextprotocol/client/stdio"; + +const requests = []; +const fixtures = { + "/api/health/full": { status: "ok" }, + "/api/developer/repos": { repos: ["uCore"], count: 1 }, + "/api/developer/repos/uCore/status": { repo: "uCore", clean: true }, + "/api/workflow/tasks?scope=all": { tasks: [], count: 0, scope: "all" }, + "/api/knowledge/search?q=mcp&limit=5": { results: [], count: 0 }, + "/api/gridsmith/tools": { tools: ["grid.create"] }, +}; + +let api; +let client; + +before(async () => { + api = http.createServer((request, response) => { + requests.push(request.url); + const body = fixtures[request.url]; + response.writeHead(body ? 200 : 404, { "content-type": "application/json" }); + response.end(JSON.stringify(body ?? { error: "not found" })); + }); + await new Promise((resolve) => api.listen(0, "127.0.0.1", resolve)); + const address = api.address(); + client = new Client({ name: "udos-mcp-test", version: "1.0.0" }); + await client.connect(new StdioClientTransport({ + command: process.execPath, + args: ["build/index.js"], + env: { ...process.env, UCORE_URL: `http://127.0.0.1:${address.port}` }, + stderr: "inherit", + })); +}); + +after(async () => { + await client?.close(); + await new Promise((resolve) => api?.close(resolve)); +}); + +test("advertises only the approved read-only surface", async () => { + const { tools } = await client.listTools(); + assert.deepEqual(tools.map(({ name }) => name).sort(), [ + "code.grid.tools.list", + "developer.repositories.list", + "developer.repository.status", + "flow.tasks.list", + "knowledge.search", + "system.health.get", + ]); +}); + +test("calls each backing API with bounded encoded arguments", async () => { + const calls = [ + ["system.health.get", {}], + ["developer.repositories.list", {}], + ["developer.repository.status", { repository: "uCore" }], + ["flow.tasks.list", { scope: "all" }], + ["knowledge.search", { query: "mcp", limit: 5 }], + ["code.grid.tools.list", {}], + ]; + for (const [name, args] of calls) { + const response = await client.callTool({ name, arguments: args }); + assert.notEqual(response.isError, true, name); + } + assert.deepEqual(requests, Object.keys(fixtures)); +}); + +test("schema validation rejects unsafe repository names", async () => { + const response = await client.callTool({ + name: "developer.repository.status", + arguments: { repository: "" }, + }); + assert.equal(response.isError, true); +}); diff --git a/backend/app/mcp/mcp_bridge/tsconfig.json b/backend/app/mcp/udos_mcp/tsconfig.json similarity index 100% rename from backend/app/mcp/mcp_bridge/tsconfig.json rename to backend/app/mcp/udos_mcp/tsconfig.json diff --git a/backend/mcp/README.md b/backend/mcp/README.md index a07103e0..3a9500e0 100644 --- a/backend/mcp/README.md +++ b/backend/mcp/README.md @@ -1,10 +1,10 @@ # uCore MCP -Canonical implementation uses one self-hosted MCP JSON-RPC stdio bridge: +Canonical implementation uses one self-hosted MCP stdio gateway: -- Server id: `ucore-bridge` -- Source: `backend/app/mcp/mcp_bridge/` -- Command: `node backend/app/mcp/mcp_bridge/build/index.js` +- Server id: `udos-mcp` +- Source: `backend/app/mcp/udos_mcp/` +- Command: `node backend/app/mcp/udos_mcp/build/index.js` - Backend target: `UCORE_URL=http://127.0.0.1:8484` Client-specific MCP configuration is external. uCore does not depend on an @@ -13,10 +13,9 @@ editor-owned configuration directory. The old multi-manifest layout is retired. ## Diagnostics ```bash -cd backend && python3 -m mcp.mcp_diagnostics +cd backend/app/mcp/udos_mcp && npm test ``` -This validates: - -- bridge source and package metadata exist -- the local bridge build exists +This compiles the gateway and exercises it through the official MCP client. +The remaining scripts in this directory are legacy migration targets and are +not MCP servers in the canonical architecture. diff --git a/backend/mcp/mcp_diagnostics.py b/backend/mcp/mcp_diagnostics.py deleted file mode 100644 index 80d38eaa..00000000 --- a/backend/mcp/mcp_diagnostics.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Diagnostics for uCore's self-hosted MCP bridge. - -Client-specific configuration belongs to the external client. uCore owns the -bridge source, its package metadata, and the backend tool registry. -""" - -from __future__ import annotations - -import json -from pathlib import Path - - -def _repo_root() -> Path: - return Path(__file__).resolve().parents[2] - - -def _bridge_root() -> Path: - return _repo_root() / "backend" / "app" / "mcp" / "mcp_bridge" - - -def list_tools() -> list[str]: - """Static tool names exposed by the self-hosted bridge.""" - return [ - "ucore_ecosystem_audit", - "ucore_list_skills", - "ucore_run_skill", - "ucore_surface_registry", - "ucore_ollama_status", - "ucore_list_agents", - "ucore_chat", - "ucore_search_knowledge", - "ucore_autonomy_state", - "ucore_list_secrets", - "ucore_workflow_status", - "ucore_config", - "ucore_list_repos", - ] - - -def health() -> dict[str, object]: - bridge_root = _bridge_root() - checks = { - "bridge_source_exists": (bridge_root / "index.ts").exists(), - "bridge_package_exists": (bridge_root / "package.json").exists(), - "bridge_build_exists": (bridge_root / "build" / "index.js").exists(), - } - return { - "health": "ok" if all(checks.values()) else "degraded", - "checks": checks, - "bridge_root": str(bridge_root), - "tool_count": len(list_tools()), - "client_configuration": "external", - } - - -if __name__ == "__main__": - print(json.dumps(health(), indent=2)) diff --git a/docs/MCP_ARCHITECTURE_AUDIT_2026-08-19.md b/docs/MCP_ARCHITECTURE_AUDIT_2026-08-19.md index f5c4945d..a2bede3d 100644 --- a/docs/MCP_ARCHITECTURE_AUDIT_2026-08-19.md +++ b/docs/MCP_ARCHITECTURE_AUDIT_2026-08-19.md @@ -20,7 +20,7 @@ not proxy, mesh, re-export, self-heal, or supervise third-party MCP servers. ### Working candidate -`backend/app/mcp/mcp_bridge` uses the official TypeScript MCP SDK. A direct +`backend/app/mcp/udos_mcp` uses the official TypeScript MCP SDK. A direct protocol probe successfully completed: - `initialize` with protocol revision `2025-06-18`; @@ -101,17 +101,19 @@ The transport and lifecycle rules follow the official MCP specification: ## Initial supported surface -The first release should expose only a small, proven read-only set: +The first implementation exposes only the six entries below that already have +canonical owned GET routes: - `system.health.get` - `developer.repositories.list` - `developer.repository.status` - `flow.tasks.list` -- `flow.task.get` - `knowledge.search` -- `knowledge.document.get` - `code.grid.tools.list` +`flow.task.get` and `knowledge.document.get` remain candidates, not advertised +contracts, until uFlow and uKnowledge provide implemented canonical reads. + Names are stable external contracts. Internal filenames, Skill IDs, providers, models, local paths, and service topology are not exposed as tool contracts. @@ -154,8 +156,10 @@ Vendor intake rules are tightened for this work: 1. Upgrade the existing TypeScript bridge to the official stable v2 server package, add an Inspector-backed protocol smoke test, and rename the package/server to `udos-mcp`. -2. Replace the bridge's ad-hoc endpoint list with the eight read-only owned - adapters above, including input/output schemas and timeouts. +2. Replace the bridge's ad-hoc endpoint list with the six read-only owned + adapters that have implemented canonical routes, including input schemas + and timeouts. Defer single-task and single-document reads until their + owning repositories provide real GET contracts. 3. Remove Python `api/mcp.py`, `mcp_handlers`, MCP guardrails/self-heal, the custom peer mesh, duplicate Snackbar routes, stale diagnostics, launchers, manifests, and UI claims that enumerate non-MCP services. diff --git a/docs/MCP_SETUP.md b/docs/MCP_SETUP.md index 93aa173a..75932050 100644 --- a/docs/MCP_SETUP.md +++ b/docs/MCP_SETUP.md @@ -2,32 +2,37 @@ # uCore MCP Setup -uCore exposes one self-hosted MCP JSON-RPC stdio server. External developer +uCore exposes one self-hosted MCP stdio server. External developer clients may connect to it, but their configuration is not part of uCore. ## Canonical MCP Server -- Server id: ucore-bridge -- Source: backend/app/mcp/mcp_bridge -- Command: node backend/app/mcp/mcp_bridge/build/index.js +- Server id: udos-mcp +- Source: backend/app/mcp/udos_mcp +- Command: node backend/app/mcp/udos_mcp/build/index.js - Env: UCORE_URL=http://127.0.0.1:8484 +The gateway advertises six bounded read-only tools: system health, repository +list/status, workflow task list, knowledge search, and GridSmith tool list. + ## Start Sequence ```bash cd /Users/fredbook/Code/uCore pnpm run dev:backend -cd /Users/fredbook/Code/uCore/backend/app/mcp/mcp_bridge && npm run build +cd /Users/fredbook/Code/uCore/backend/app/mcp/udos_mcp && npm ci ``` ## Diagnostics ```bash -cd /Users/fredbook/Code/uCore/backend -python3 -m mcp.mcp_diagnostics +cd /Users/fredbook/Code/uCore/backend/app/mcp/udos_mcp +npm test ``` Expected checks: -- bridge source and package metadata exist -- the local bridge build exists +- the official MCP client initializes the compiled stdio server +- the exact read-only tool catalogue is advertised +- calls reach the expected owned API routes +- invalid input is rejected by the SDK schema diff --git a/frontend-vue/package.json b/frontend-vue/package.json index 2db75e79..01193b99 100644 --- a/frontend-vue/package.json +++ b/frontend-vue/package.json @@ -63,7 +63,6 @@ }, "devDependencies": { "@iconify/vue": "^4.3.0", - "@modelcontextprotocol/sdk": "^1.29.0", "@playwright/test": "^1.49.0", "@storybook/vue3": "^8.6.0", "@storybook/vue3-vite": "^8.6.0", diff --git a/package.json b/package.json index 58fb3228..7226661a 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,9 @@ "build": "pnpm --filter @udos/ui-hub-vue run build", "test": "./.venv/bin/python -m pytest -q backend/tests", "lint": "cd backend && ruff check .", - "mcp:diagnostics": "cd backend && python3 -m mcp.mcp_diagnostics", - "mcp:start": "cd backend && python3 -m app.main" - }, - "devDependencies": { - "@modelcontextprotocol/sdk": "^1.29.0" + "mcp:build": "npm --prefix backend/app/mcp/udos_mcp run build", + "mcp:test": "npm --prefix backend/app/mcp/udos_mcp test", + "mcp:start": "node backend/app/mcp/udos_mcp/build/index.js" }, "engines": { "node": ">=22.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5b34fe9..0e8e034a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,11 +6,7 @@ settings: importers: - .: - devDependencies: - '@modelcontextprotocol/sdk': - specifier: ^1.29.0 - version: 1.29.0(zod@4.4.3) + .: {} frontend-vue: dependencies: @@ -138,9 +134,6 @@ importers: '@iconify/vue': specifier: ^4.3.0 version: 4.3.0(vue@3.5.39(typescript@5.9.3)) - '@modelcontextprotocol/sdk': - specifier: ^1.29.0 - version: 1.29.0(zod@4.4.3) '@playwright/test': specifier: ^1.49.0 version: 1.62.1 @@ -521,12 +514,6 @@ packages: '@fontsource/vt323@5.3.0': resolution: {integrity: sha512-3w33Rg/0+R1587HQfz4t7Q7e0GGeCqr3wmzIwqdGInUnrGEwMA5eX39GP4Z9wpTQnwfhVOhYuxuRwRUeIcicbw==} - '@hono/node-server@1.19.14': - resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -604,16 +591,6 @@ packages: resolution: {integrity: sha512-MflN1movsh8PXJbM9otjJOtlcB0vSrvw5PgXs2PDguVYVzKQmGpiy9QHHKq0rryrgaSp376TdJWBP7mXHHAG8w==} engines: {node: '>=18'} - '@modelcontextprotocol/sdk@1.29.0': - resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1026,10 +1003,6 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -1044,17 +1017,6 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - alien-signals@1.0.13: resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} @@ -1122,10 +1084,6 @@ packages: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} - brace-expansion@2.1.1: resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} @@ -1136,10 +1094,6 @@ packages: browser-assert@1.2.1: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1214,30 +1168,6 @@ packages: constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} - engines: {node: '>=18'} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -1299,10 +1229,6 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1329,19 +1255,12 @@ packages: engines: {node: '>=14'} hasBin: true - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1382,9 +1301,6 @@ packages: engines: {node: '>=18'} hasBin: true - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -1414,18 +1330,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eventsource-parser@3.1.0: - resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} @@ -1434,26 +1338,10 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -1473,10 +1361,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - find-package-json@1.2.0: resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} @@ -1495,14 +1379,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1582,10 +1458,6 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} - hono@4.12.27: - resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} - engines: {node: '>=16.9.0'} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -1597,10 +1469,6 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -1613,10 +1481,6 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1631,14 +1495,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - irregular-plurals@3.5.0: resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} engines: {node: '>=8'} @@ -1696,9 +1552,6 @@ packages: is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1741,9 +1594,6 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} - js-beautify@1.15.4: resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} engines: {node: '>=14'} @@ -1781,12 +1631,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - jstransformer@1.0.0: resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} @@ -1866,18 +1710,10 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - meow@9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1889,14 +1725,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -1931,10 +1759,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - nopt@7.2.1: resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1954,17 +1778,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -1998,10 +1811,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -2020,9 +1829,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2059,10 +1865,6 @@ packages: typescript: optional: true - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - playwright-core@1.62.1: resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} engines: {node: '>=20'} @@ -2157,10 +1959,6 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - pug-attrs@3.0.0: resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} @@ -2205,10 +2003,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} - engines: {node: '>=0.6'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2216,14 +2010,6 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} - range-parser@1.3.0: - resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -2243,10 +2029,6 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - resolve@1.22.12: resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} @@ -2264,10 +2046,6 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -2294,21 +2072,10 @@ packages: engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2317,22 +2084,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2379,10 +2130,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} @@ -2472,10 +2219,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - token-stream@1.0.0: resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} @@ -2530,10 +2273,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -2545,10 +2284,6 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - unplugin@1.16.1: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} @@ -2562,10 +2297,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2759,9 +2490,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -2793,14 +2521,6 @@ packages: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} - snapshots: '@asamuzakjp/css-color@3.2.0': @@ -3141,10 +2861,6 @@ snapshots: '@fontsource/vt323@5.3.0': {} - '@hono/node-server@1.19.14(hono@4.12.27)': - dependencies: - hono: 4.12.27 - '@iconify/types@2.0.0': {} '@iconify/vue@4.3.0(vue@3.5.39(typescript@5.9.3))': @@ -3258,28 +2974,6 @@ snapshots: postcss: 8.5.15 postcss-nesting: 13.0.2(postcss@8.5.15) - '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': - dependencies: - '@hono/node-server': 1.19.14(hono@4.12.27) - ajv: 8.20.0 - ajv-formats: 3.0.1(ajv@8.20.0) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.0 - express: 5.2.1 - express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.27 - jose: 6.2.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) - transitivePeerDependencies: - - supports-color - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3692,28 +3386,12 @@ snapshots: abbrev@2.0.0: {} - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - acorn@7.4.1: {} acorn@8.17.0: {} agent-base@7.1.4: {} - ajv-formats@3.0.1(ajv@8.20.0): - optionalDependencies: - ajv: 8.20.0 - - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - alien-signals@1.0.13: {} ansi-escapes@4.3.2: @@ -3762,20 +3440,6 @@ snapshots: dependencies: open: 8.4.2 - body-parser@2.3.0: - dependencies: - bytes: 3.1.2 - content-type: 2.0.0 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.15.3 - raw-body: 3.0.2 - type-is: 2.1.0 - transitivePeerDependencies: - - supports-color - brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 @@ -3786,8 +3450,6 @@ snapshots: browser-assert@1.2.1: {} - bytes@3.1.2: {} - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -3870,21 +3532,6 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - - content-type@2.0.0: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - crelt@1.0.6: {} cross-spawn@7.0.6: @@ -3934,8 +3581,6 @@ snapshots: define-lazy-prop@2.0.0: {} - depd@2.0.0: {} - diff-sequences@29.6.3: {} dir-glob@3.0.1: @@ -3963,14 +3608,10 @@ snapshots: minimatch: 9.0.9 semver: 7.8.5 - ee-first@1.1.1: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - encodeurl@2.0.0: {} - entities@4.5.0: {} entities@6.0.1: {} @@ -4027,8 +3668,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - escape-html@1.0.3: {} - escape-string-regexp@2.0.0: {} eslint-formatter-pretty@4.1.0: @@ -4056,14 +3695,6 @@ snapshots: dependencies: '@types/estree': 1.0.9 - etag@1.8.1: {} - - eventsource-parser@3.1.0: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.1.0 - expect-type@1.4.0: {} expect@29.7.0: @@ -4074,46 +3705,6 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express-rate-limit@8.5.2(express@5.2.1): - dependencies: - express: 5.2.1 - ip-address: 10.2.0 - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.3.0 - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.3 - range-parser: 1.3.0 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.1.0 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4122,8 +3713,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-uri@3.1.2: {} - fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -4138,17 +3727,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - find-package-json@1.2.0: {} find-up@4.1.0: @@ -4167,10 +3745,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forwarded@0.2.0: {} - - fresh@2.0.0: {} - fsevents@2.3.2: optional: true @@ -4249,8 +3823,6 @@ snapshots: highlight.js@11.11.1: {} - hono@4.12.27: {} - hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -4261,14 +3833,6 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -4287,10 +3851,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.2: {} indent-string@4.0.0: {} @@ -4299,10 +3859,6 @@ snapshots: ini@1.3.8: {} - ip-address@10.2.0: {} - - ipaddr.js@1.9.1: {} - irregular-plurals@3.5.0: {} is-arguments@1.2.0: @@ -4349,8 +3905,6 @@ snapshots: is-promise@2.2.2: {} - is-promise@4.0.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -4413,8 +3967,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.2 - jose@6.2.3: {} - js-beautify@1.15.4: dependencies: config-chain: 1.1.13 @@ -4466,10 +4018,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@1.0.0: {} - - json-schema-typed@8.0.2: {} - jstransformer@1.0.0: dependencies: is-promise: 2.2.2 @@ -4542,8 +4090,6 @@ snapshots: mdurl@2.0.0: {} - media-typer@1.1.0: {} - meow@9.0.0: dependencies: '@types/minimist': 1.2.5 @@ -4559,8 +4105,6 @@ snapshots: type-fest: 0.18.1 yargs-parser: 20.2.9 - merge-descriptors@2.0.0: {} - merge2@1.4.1: {} mhchemparser@4.2.1: {} @@ -4570,12 +4114,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 - mime-db@1.54.0: {} - - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - min-indent@1.0.1: {} minimatch@9.0.9: @@ -4600,8 +4138,6 @@ snapshots: nanoid@3.3.15: {} - negotiator@1.0.0: {} - nopt@7.2.1: dependencies: abbrev: 2.0.0 @@ -4624,16 +4160,6 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.4: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -4667,8 +4193,6 @@ snapshots: dependencies: entities: 6.0.1 - parseurl@1.3.3: {} - path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -4682,8 +4206,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.3 - path-to-regexp@8.4.2: {} - path-type@4.0.0: {} pathe@2.0.3: {} @@ -4710,8 +4232,6 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' - pkce-challenge@5.0.1: {} - playwright-core@1.62.1: {} playwright@1.62.1: @@ -4845,11 +4365,6 @@ snapshots: proto-list@1.2.4: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - pug-attrs@3.0.0: dependencies: constantinople: 4.0.1 @@ -4921,24 +4436,10 @@ snapshots: punycode@2.3.1: {} - qs@6.15.3: - dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 - queue-microtask@1.2.3: {} quick-lru@4.0.1: {} - range-parser@1.3.0: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - react-is@18.3.1: {} read-pkg-up@7.0.1: @@ -4967,8 +4468,6 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - require-from-string@2.0.2: {} - resolve@1.22.12: dependencies: es-errors: 1.3.0 @@ -5011,16 +4510,6 @@ snapshots: rope-sequence@1.3.4: {} - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color - rrweb-cssom@0.8.0: {} run-parallel@1.2.0: @@ -5043,31 +4532,6 @@ snapshots: semver@7.8.5: {} - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.3.0 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -5077,42 +4541,12 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 - setprototypeof@1.2.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -5155,8 +4589,6 @@ snapshots: stackback@0.0.2: {} - statuses@2.0.2: {} - std-env@3.10.0: {} storybook@8.6.18: @@ -5237,8 +4669,6 @@ snapshots: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - token-stream@1.0.0: {} totalist@3.0.1: {} @@ -5278,20 +4708,12 @@ snapshots: type-fest@2.19.0: {} - type-is@2.1.0: - dependencies: - content-type: 2.0.0 - media-typer: 1.1.0 - mime-types: 3.0.2 - typescript@5.9.3: {} uc.micro@2.1.0: {} undici-types@7.24.6: {} - unpipe@1.0.0: {} - unplugin@1.16.1: dependencies: acorn: 8.17.0 @@ -5312,8 +4734,6 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vary@1.1.2: {} - vite-node@3.2.4(@types/node@25.9.4): dependencies: cac: 6.7.14 @@ -5516,8 +4936,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 - wrappy@1.0.2: {} - ws@8.21.0: {} xml-name-validator@5.0.0: {} @@ -5532,9 +4950,3 @@ snapshots: yallist@4.0.0: {} yargs-parser@20.2.9: {} - - zod-to-json-schema@3.25.2(zod@4.4.3): - dependencies: - zod: 4.4.3 - - zod@4.4.3: {}