From 6397ec1511bf4fdbe6e1103c1e54c8c9590475de Mon Sep 17 00:00:00 2001 From: martinalong Date: Sun, 14 Dec 2025 18:01:24 -0800 Subject: [PATCH 001/389] Add way to pass fonts --- .../src/mcp-app.css | 4 + .../src/mcp-app.ts | 9 +- specification/draft/apps.mdx | 51 ++++++++- src/app.ts | 1 + src/generated/schema.json | 55 +++++++++ src/generated/schema.test.ts | 6 + src/generated/schema.ts | 15 +++ src/react/index.tsx | 1 + src/react/useHostStyles.ts | 108 +++++++++++++++++- src/spec.types.ts | 10 ++ src/styles.ts | 65 +++++++++++ src/types.ts | 2 + 12 files changed, 323 insertions(+), 4 deletions(-) diff --git a/examples/customer-segmentation-server/src/mcp-app.css b/examples/customer-segmentation-server/src/mcp-app.css index 6bb5df4..aacaef4 100644 --- a/examples/customer-segmentation-server/src/mcp-app.css +++ b/examples/customer-segmentation-server/src/mcp-app.css @@ -2,6 +2,9 @@ :root { color-scheme: light dark; + /* Font families */ + --font-sans: system-ui, -apple-system, sans-serif; + /* Background colors */ --color-background-primary: light-dark(#ffffff, #111827); --color-background-secondary: light-dark(#f9fafb, #1f2937); @@ -33,6 +36,7 @@ html, body { margin: 0; padding: 0; + font-family: var(--font-sans); color: var(--color-text-primary); overflow: hidden; } diff --git a/examples/customer-segmentation-server/src/mcp-app.ts b/examples/customer-segmentation-server/src/mcp-app.ts index 77e348d..2feaa2b 100644 --- a/examples/customer-segmentation-server/src/mcp-app.ts +++ b/examples/customer-segmentation-server/src/mcp-app.ts @@ -5,6 +5,7 @@ import { App, PostMessageTransport, applyHostStyleVariables, + applyHostFonts, applyDocumentTheme, } from "@modelcontextprotocol/ext-apps"; import { Chart, registerables } from "chart.js"; @@ -448,7 +449,7 @@ applyDocumentTheme(systemDark ? "dark" : "light"); // Register handlers and connect app.onerror = log.error; -// Handle host context changes (theme and styles from host) +// Handle host context changes (theme, styles, and fonts from host) app.onhostcontextchanged = (params) => { if (params.theme) { applyDocumentTheme(params.theme); @@ -456,6 +457,9 @@ app.onhostcontextchanged = (params) => { if (params.styles?.variables) { applyHostStyleVariables(params.styles.variables); } + if (params.styles?.css?.fonts) { + applyHostFonts(params.styles.css.fonts); + } // Recreate chart to pick up new colors if (state.chart && (params.theme || params.styles?.variables)) { state.chart.destroy(); @@ -472,6 +476,9 @@ app.connect(new PostMessageTransport(window.parent)).then(() => { if (ctx?.styles?.variables) { applyHostStyleVariables(ctx.styles.variables); } + if (ctx?.styles?.css?.fonts) { + applyHostFonts(ctx.styles.css.fonts); + } }); // Fetch data after connection diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index 2619964..9b82043 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -409,6 +409,11 @@ interface HostContext { styles?: { /** CSS variables for theming */ variables?: Record; + /** CSS blocks that apps can inject */ + css?: { + /** CSS for font loading (@font-face rules or @import statements) */ + fonts?: string; + }; }; /** How the UI is currently displayed */ displayMode?: "inline" | "fullscreen" | "pip"; @@ -461,8 +466,11 @@ Example: "variables": { "--color-background-primary": "light-dark(#ffffff, #171717)", "--color-text-primary": "light-dark(#171717, #fafafa)", - "--font-family-sans": "system-ui, sans-serif", + "--font-sans": "Anthropic Sans, sans-serif", ... + }, + "css": { + "fonts": "@font-face { font-family: \"Custom Font Name\"; src: url(\"https://...\"); }" } }, "displayMode": "inline", @@ -596,7 +604,46 @@ Example usage of standardized CSS variables: .container { background: var(--color-background-primary); color: var(--color-text-primary); - font: var(--font-style-body); + font-family: var(--font-sans); +} +``` + +#### Custom Fonts + +Hosts can provide custom fonts via `styles.css.fonts`, which can contain `@font-face` rules for self-hosted fonts, `@import` statements for font services like Google Fonts, or both: + +```typescript +hostContext.styles.variables["--font-sans"] = '"Font Name", sans-serif'; + +// Self-hosted fonts +hostContext.styles.css.fonts = ` + @font-face { + font-family: "Font Name"; + src: url("https://url-where-font-is-hosted.com/.../Regular.otf") format("opentype"); + font-weight: 400; + font-style: normal; + font-display: swap; + } + @font-face { + font-family: "Font Name"; + src: url("https://url-where-font-is-hosted.com/.../Medium.otf") format("opentype"); + font-weight: 500; + font-style: medium; + font-display: swap; + } +`; + +// Google Fonts +hostContext.styles.css.fonts = ` + @import url('https://fonts.googleapis.com/css2?family=Font+Name&display=swap'); +`; +``` + +Apps can use the `applyHostFonts` utility to inject the font CSS into the document: + +```typescript +if (hostContext.styles?.css?.fonts) { + applyHostFonts(hostContext.styles.css.fonts); } ``` diff --git a/src/app.ts b/src/app.ts index b8a9238..429137e 100644 --- a/src/app.ts +++ b/src/app.ts @@ -51,6 +51,7 @@ export { PostMessageTransport } from "./message-transport"; export * from "./types"; export { applyHostStyleVariables, + applyHostFonts, getDocumentTheme, applyDocumentTheme, } from "./styles"; diff --git a/src/generated/schema.json b/src/generated/schema.json index 5867796..a23be2a 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -585,6 +585,17 @@ {} ] } + }, + "css": { + "description": "CSS blocks that apps can inject.", + "type": "object", + "properties": { + "fonts": { + "description": "CSS for font loading (@font-face rules or", + "type": "string" + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -1196,6 +1207,17 @@ {} ] } + }, + "css": { + "description": "CSS blocks that apps can inject.", + "type": "object", + "properties": { + "fonts": { + "description": "CSS for font loading (@font-face rules or", + "type": "string" + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -1319,6 +1341,17 @@ }, "additionalProperties": {} }, + "McpUiHostCss": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "fonts": { + "description": "CSS for font loading (@font-face rules or", + "type": "string" + } + }, + "additionalProperties": false + }, "McpUiHostStyles": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", @@ -1640,6 +1673,17 @@ {} ] } + }, + "css": { + "description": "CSS blocks that apps can inject.", + "type": "object", + "properties": { + "fonts": { + "description": "CSS for font loading (@font-face rules or", + "type": "string" + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -2314,6 +2358,17 @@ {} ] } + }, + "css": { + "description": "CSS blocks that apps can inject.", + "type": "object", + "properties": { + "fonts": { + "description": "CSS for font loading (@font-face rules or", + "type": "string" + } + }, + "additionalProperties": false } }, "additionalProperties": false diff --git a/src/generated/schema.test.ts b/src/generated/schema.test.ts index 702d441..e87a8ec 100644 --- a/src/generated/schema.test.ts +++ b/src/generated/schema.test.ts @@ -63,6 +63,10 @@ export type McpUiToolCancelledNotificationSchemaInferredType = z.infer< typeof generated.McpUiToolCancelledNotificationSchema >; +export type McpUiHostCssSchemaInferredType = z.infer< + typeof generated.McpUiHostCssSchema +>; + export type McpUiHostStylesSchemaInferredType = z.infer< typeof generated.McpUiHostStylesSchema >; @@ -189,6 +193,8 @@ expectType( expectType( {} as spec.McpUiToolCancelledNotification, ); +expectType({} as McpUiHostCssSchemaInferredType); +expectType({} as spec.McpUiHostCss); expectType({} as McpUiHostStylesSchemaInferredType); expectType({} as spec.McpUiHostStyles); expectType( diff --git a/src/generated/schema.ts b/src/generated/schema.ts index e5e04d6..d0fcac6 100644 --- a/src/generated/schema.ts +++ b/src/generated/schema.ts @@ -285,6 +285,17 @@ export const McpUiToolCancelledNotificationSchema = z.object({ }), }); +/** + * @description CSS blocks that can be injected by apps. + */ +export const McpUiHostCssSchema = z.object({ + /** @description CSS for font loading (@font-face rules or @import statements). Apps must apply using applyHostFonts(). */ + fonts: z + .string() + .optional() + .describe("CSS for font loading (@font-face rules or"), +}); + /** * @description Style configuration for theming MCP apps. */ @@ -293,6 +304,10 @@ export const McpUiHostStylesSchema = z.object({ variables: McpUiStylesSchema.optional().describe( "CSS variables for theming the app.", ), + /** @description CSS blocks that apps can inject. */ + css: McpUiHostCssSchema.optional().describe( + "CSS blocks that apps can inject.", + ), }); /** diff --git a/src/react/index.tsx b/src/react/index.tsx index 7759493..4307dc5 100644 --- a/src/react/index.tsx +++ b/src/react/index.tsx @@ -10,6 +10,7 @@ * * - {@link useApp} - React hook to create and connect an MCP App * - {@link useHostStyleVariables} - React hook to apply host style variables and theme + * - {@link useHostFonts} - React hook to apply host fonts * - {@link useDocumentTheme} - React hook for reactive document theme * - {@link useAutoResize} - React hook for manual auto-resize control (rarely needed) * diff --git a/src/react/useHostStyles.ts b/src/react/useHostStyles.ts index 90c246a..0e7fbf3 100644 --- a/src/react/useHostStyles.ts +++ b/src/react/useHostStyles.ts @@ -1,6 +1,10 @@ import { useEffect, useRef } from "react"; import { App } from "../app"; -import { applyDocumentTheme, applyHostStyleVariables } from "../styles"; +import { + applyDocumentTheme, + applyHostFonts, + applyHostStyleVariables, +} from "../styles"; import { McpUiHostContext } from "../types"; /** @@ -54,6 +58,7 @@ import { McpUiHostContext } from "../types"; * * @see {@link applyHostStyleVariables} for the underlying styles function * @see {@link applyDocumentTheme} for the underlying theme function + * @see {@link useHostFonts} for applying host fonts * @see {@link McpUiStyles} for available CSS variables */ export function useHostStyleVariables( @@ -94,3 +99,104 @@ export function useHostStyleVariables( }; }, [app]); } + +/** + * React hook that applies host fonts from CSS. + * + * This hook listens to host context changes and automatically applies: + * - `styles.css.fonts` as a ` diff --git a/examples/basic-server-svelte/src/global.css b/examples/basic-server-svelte/src/global.css new file mode 100644 index 0000000..97cda44 --- /dev/null +++ b/examples/basic-server-svelte/src/global.css @@ -0,0 +1,12 @@ +* { + box-sizing: border-box; +} + +html, body { + font-family: system-ui, -apple-system, sans-serif; + font-size: 1rem; +} + +code { + font-size: 1em; +} diff --git a/examples/basic-server-svelte/src/mcp-app.ts b/examples/basic-server-svelte/src/mcp-app.ts new file mode 100644 index 0000000..e57b774 --- /dev/null +++ b/examples/basic-server-svelte/src/mcp-app.ts @@ -0,0 +1,5 @@ +import { mount } from "svelte"; +import App from "./App.svelte"; +import "./global.css"; + +mount(App, { target: document.getElementById("app")! }); diff --git a/examples/basic-server-svelte/src/server-utils.ts b/examples/basic-server-svelte/src/server-utils.ts new file mode 100644 index 0000000..4052423 --- /dev/null +++ b/examples/basic-server-svelte/src/server-utils.ts @@ -0,0 +1,110 @@ +/** + * Shared utilities for running MCP servers with various transports. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +/** + * Starts an MCP server using the appropriate transport based on command-line arguments. + * + * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startServer( + createServer: () => McpServer, +): Promise { + try { + if (process.argv.includes("--stdio")) { + await startStdioServer(createServer); + } else { + await startStreamableHttpServer(createServer); + } + } catch (e) { + console.error(e); + process.exit(1); + } +} + +/** + * Starts an MCP server with stdio transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startStdioServer( + createServer: () => McpServer, +): Promise { + await createServer().connect(new StdioServerTransport()); +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * Each request creates a fresh server and transport instance, which are + * closed when the response ends (no session tracking). + * + * The server listens on the port specified by the PORT environment variable, + * defaulting to 3001 if not set. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + */ +export async function startStreamableHttpServer( + createServer: () => McpServer, +): Promise { + const port = parseInt(process.env.PORT ?? "3001", 10); + + // Express app - bind to all interfaces for development/testing + const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); + expressApp.use(cors()); + + expressApp.all("/mcp", async (req: Request, res: Response) => { + // Create fresh server and transport for each request (stateless mode) + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + // Clean up when response ends + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const { promise, resolve, reject } = Promise.withResolvers(); + + const httpServer = expressApp.listen(port, (err?: Error) => { + if (err) return reject(err); + console.log(`Server listening on http://localhost:${port}/mcp`); + resolve(); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); + + return promise; +} diff --git a/examples/basic-server-svelte/svelte.config.js b/examples/basic-server-svelte/svelte.config.js new file mode 100644 index 0000000..d0e6448 --- /dev/null +++ b/examples/basic-server-svelte/svelte.config.js @@ -0,0 +1,5 @@ +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +export default { + preprocess: vitePreprocess(), +}; diff --git a/examples/basic-server-svelte/tsconfig.json b/examples/basic-server-svelte/tsconfig.json new file mode 100644 index 0000000..5edb66a --- /dev/null +++ b/examples/basic-server-svelte/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts", "*.d.ts"] +} diff --git a/examples/basic-server-svelte/vite.config.ts b/examples/basic-server-svelte/vite.config.ts new file mode 100644 index 0000000..84fcdbd --- /dev/null +++ b/examples/basic-server-svelte/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from "vite"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [svelte(), viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/examples/basic-server-vue/README.md b/examples/basic-server-vue/README.md new file mode 100644 index 0000000..1f96fba --- /dev/null +++ b/examples/basic-server-vue/README.md @@ -0,0 +1,30 @@ +# Example: Basic Server (Vue) + +An MCP App example with a Vue 3 UI using the Composition API. + +> [!TIP] +> Looking for a vanilla JavaScript example? See [`basic-server-vanillajs`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/basic-server-vanillajs)! + +## Overview + +- Tool registration with a linked UI resource +- Vue 3 UI using the [`App`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html) class +- App communication APIs: [`callServerTool`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#callservertool), [`sendMessage`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#sendmessage), [`sendLog`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#sendlog), [`openLink`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#openlink) + +## Key Files + +- [`server.ts`](server.ts) - MCP server with tool and resource registration +- [`mcp-app.html`](mcp-app.html) / [`src/App.vue`](src/App.vue) - Vue 3 UI using `App` class + +## Getting Started + +```bash +npm install +npm run dev +``` + +## How It Works + +1. The server registers a `get-time` tool with metadata linking it to a UI HTML resource (`ui://get-time/mcp-app.html`). +2. When the tool is invoked, the Host renders the UI from the resource. +3. The UI uses the MCP App SDK API to communicate with the host and call server tools. diff --git a/examples/basic-server-vue/env.d.ts b/examples/basic-server-vue/env.d.ts new file mode 100644 index 0000000..cd39087 --- /dev/null +++ b/examples/basic-server-vue/env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent; + export default component; +} diff --git a/examples/basic-server-vue/mcp-app.html b/examples/basic-server-vue/mcp-app.html new file mode 100644 index 0000000..6bac3c9 --- /dev/null +++ b/examples/basic-server-vue/mcp-app.html @@ -0,0 +1,14 @@ + + + + + + + Get Time App + + + +
+ + + diff --git a/examples/basic-server-vue/package.json b/examples/basic-server-vue/package.json new file mode 100644 index 0000000..d1719fc --- /dev/null +++ b/examples/basic-server-vue/package.json @@ -0,0 +1,32 @@ +{ + "name": "basic-server-vue", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", + "watch": "cross-env INPUT=mcp-app.html vite build --watch", + "serve": "bun server.ts", + "start": "cross-env NODE_ENV=development npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + }, + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "vue": "^3.5.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "@vitejs/plugin-vue": "^5.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } +} diff --git a/examples/basic-server-vue/server.ts b/examples/basic-server-vue/server.ts new file mode 100644 index 0000000..6f00912 --- /dev/null +++ b/examples/basic-server-vue/server.ts @@ -0,0 +1,58 @@ +import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { startServer } from "./src/server-utils.js"; + +const DIST_DIR = path.join(import.meta.dirname, "dist"); + +/** + * Creates a new MCP server instance with tools and resources registered. + */ +function createServer(): McpServer { + const server = new McpServer({ + name: "Basic MCP App Server (Vue)", + version: "1.0.0", + }); + + // Two-part registration: tool + resource, tied together by the resource URI. + const resourceUri = "ui://get-time/mcp-app.html"; + + // Register a tool with UI metadata. When the host calls this tool, it reads + // `_meta.ui.resourceUri` to know which resource to fetch and render as an + // interactive UI. + registerAppTool(server, + "get-time", + { + title: "Get Time", + description: "Returns the current server time as an ISO 8601 string.", + inputSchema: {}, + _meta: { ui: { resourceUri } }, + }, + async (): Promise => { + const time = new Date().toISOString(); + return { content: [{ type: "text", text: time }] }; + }, + ); + + // Register the resource, which returns the bundled HTML/JavaScript for the UI. + registerAppResource(server, + resourceUri, + resourceUri, + { mimeType: RESOURCE_MIME_TYPE }, + async (): Promise => { + const html = await fs.readFile(path.join(DIST_DIR, "mcp-app.html"), "utf-8"); + + return { + contents: [ + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, + ], + }; + }, + ); + + return server; +} + +startServer(createServer); diff --git a/examples/basic-server-vue/src/App.vue b/examples/basic-server-vue/src/App.vue new file mode 100644 index 0000000..3962bb4 --- /dev/null +++ b/examples/basic-server-vue/src/App.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/examples/basic-server-vue/src/global.css b/examples/basic-server-vue/src/global.css new file mode 100644 index 0000000..97cda44 --- /dev/null +++ b/examples/basic-server-vue/src/global.css @@ -0,0 +1,12 @@ +* { + box-sizing: border-box; +} + +html, body { + font-family: system-ui, -apple-system, sans-serif; + font-size: 1rem; +} + +code { + font-size: 1em; +} diff --git a/examples/basic-server-vue/src/mcp-app.ts b/examples/basic-server-vue/src/mcp-app.ts new file mode 100644 index 0000000..92a6bd5 --- /dev/null +++ b/examples/basic-server-vue/src/mcp-app.ts @@ -0,0 +1,5 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +import "./global.css"; + +createApp(App).mount("#app"); diff --git a/examples/basic-server-vue/src/server-utils.ts b/examples/basic-server-vue/src/server-utils.ts new file mode 100644 index 0000000..4052423 --- /dev/null +++ b/examples/basic-server-vue/src/server-utils.ts @@ -0,0 +1,110 @@ +/** + * Shared utilities for running MCP servers with various transports. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +/** + * Starts an MCP server using the appropriate transport based on command-line arguments. + * + * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startServer( + createServer: () => McpServer, +): Promise { + try { + if (process.argv.includes("--stdio")) { + await startStdioServer(createServer); + } else { + await startStreamableHttpServer(createServer); + } + } catch (e) { + console.error(e); + process.exit(1); + } +} + +/** + * Starts an MCP server with stdio transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startStdioServer( + createServer: () => McpServer, +): Promise { + await createServer().connect(new StdioServerTransport()); +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * Each request creates a fresh server and transport instance, which are + * closed when the response ends (no session tracking). + * + * The server listens on the port specified by the PORT environment variable, + * defaulting to 3001 if not set. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + */ +export async function startStreamableHttpServer( + createServer: () => McpServer, +): Promise { + const port = parseInt(process.env.PORT ?? "3001", 10); + + // Express app - bind to all interfaces for development/testing + const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); + expressApp.use(cors()); + + expressApp.all("/mcp", async (req: Request, res: Response) => { + // Create fresh server and transport for each request (stateless mode) + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + // Clean up when response ends + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const { promise, resolve, reject } = Promise.withResolvers(); + + const httpServer = expressApp.listen(port, (err?: Error) => { + if (err) return reject(err); + console.log(`Server listening on http://localhost:${port}/mcp`); + resolve(); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); + + return promise; +} diff --git a/examples/basic-server-vue/tsconfig.json b/examples/basic-server-vue/tsconfig.json new file mode 100644 index 0000000..5edb66a --- /dev/null +++ b/examples/basic-server-vue/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts", "*.d.ts"] +} diff --git a/examples/basic-server-vue/vite.config.ts b/examples/basic-server-vue/vite.config.ts new file mode 100644 index 0000000..8baddce --- /dev/null +++ b/examples/basic-server-vue/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [vue(), viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/package-lock.json b/package-lock.json index 6cbf63c..467deeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,8 +95,6 @@ }, "examples/basic-host/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -104,6 +102,62 @@ } }, "examples/basic-host/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "examples/basic-server-preact": { + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "preact": "^10.0.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@preact/preset-vite": "^2.0.0", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/basic-server-preact/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/basic-server-preact/node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "examples/basic-server-preact/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==", @@ -136,8 +190,6 @@ }, "examples/basic-server-react/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -145,6 +197,100 @@ } }, "examples/basic-server-react/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "examples/basic-server-solid": { + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "solid-js": "^1.9.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0", + "vite-plugin-solid": "^2.0.0" + } + }, + "examples/basic-server-solid/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/basic-server-solid/node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "examples/basic-server-solid/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" + }, + "examples/basic-server-svelte": { + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "svelte": "^5.0.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/basic-server-svelte/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/basic-server-svelte/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==", @@ -172,8 +318,6 @@ }, "examples/basic-server-vanillajs/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -181,6 +325,62 @@ } }, "examples/basic-server-vanillajs/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "examples/basic-server-vue": { + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "vue": "^3.5.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "@vitejs/plugin-vue": "^5.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/basic-server-vue/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/basic-server-vue/node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "examples/basic-server-vue/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==", @@ -209,8 +409,6 @@ }, "examples/budget-allocator-server/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -219,8 +417,6 @@ }, "examples/budget-allocator-server/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" }, @@ -250,8 +446,6 @@ }, "examples/cohort-heatmap-server/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -260,8 +454,6 @@ }, "examples/cohort-heatmap-server/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" }, @@ -287,8 +479,6 @@ }, "examples/customer-segmentation-server/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -297,8 +487,6 @@ }, "examples/customer-segmentation-server/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" }, @@ -328,8 +516,6 @@ }, "examples/integration-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -338,8 +524,6 @@ }, "examples/integration-server/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" }, @@ -370,8 +554,6 @@ }, "examples/scenario-modeler-server/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -380,8 +562,6 @@ }, "examples/scenario-modeler-server/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" }, @@ -465,8 +645,6 @@ }, "examples/system-monitor-server/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -475,8 +653,6 @@ }, "examples/system-monitor-server/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" }, @@ -508,8 +684,6 @@ }, "examples/threejs-server/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -518,8 +692,6 @@ }, "examples/threejs-server/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" }, @@ -610,15 +782,11 @@ }, "examples/wiki-explorer-server/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/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -632,8 +800,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -642,8 +808,6 @@ }, "node_modules/@babel/core": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "peer": true, @@ -674,8 +838,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -684,8 +846,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -699,10 +859,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -718,8 +889,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -728,8 +897,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { @@ -738,8 +905,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -752,8 +917,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { @@ -770,8 +933,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -780,9 +941,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -790,9 +948,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -800,8 +955,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -810,8 +963,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -824,9 +975,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -838,10 +986,60 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -856,8 +1054,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -872,8 +1068,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -887,8 +1081,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -906,9 +1098,6 @@ }, "node_modules/@babel/types": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -920,8 +1109,6 @@ }, "node_modules/@clack/core": { "version": "1.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.0-alpha.4.tgz", - "integrity": "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg==", "dev": true, "license": "MIT", "dependencies": { @@ -931,8 +1118,6 @@ }, "node_modules/@clack/prompts": { "version": "1.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.0-alpha.4.tgz", - "integrity": "sha512-KnmtDF2xQGoI5AlBme9akHtvCRV0RKAARUXHBQO2tMwnY8B08/4zPWigT7uLK25UPrMCEqnyQPkKRjNdhPbf8g==", "dev": true, "license": "MIT", "dependencies": { @@ -943,15 +1128,11 @@ }, "node_modules/@dimforge/rapier3d-compat": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", - "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", "dev": true, "license": "Apache-2.0" }, "node_modules/@epic-web/invariant": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, @@ -1229,8 +1410,6 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -1399,8 +1578,6 @@ }, "node_modules/@gerrit0/mini-shiki": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.19.0.tgz", - "integrity": "sha512-ZSlWfLvr8Nl0T4iA3FF/8VH8HivYF82xQts2DY0tJxZd4wtXJ8AA0nmdW9lmO4hlrh3f9xNwEPtOgqETPqKwDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1413,9 +1590,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1424,9 +1598,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1435,9 +1606,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1445,16 +1613,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1463,8 +1625,6 @@ }, "node_modules/@kurkle/color": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, "node_modules/@modelcontextprotocol/ext-apps": { @@ -1477,8 +1637,6 @@ }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.24.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.3.tgz", - "integrity": "sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw==", "license": "MIT", "dependencies": { "ajv": "^8.17.1", @@ -1514,8 +1672,6 @@ }, "node_modules/@oclif/core": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.8.0.tgz", - "integrity": "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1544,8 +1700,6 @@ }, "node_modules/@oclif/core/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1554,8 +1708,6 @@ }, "node_modules/@oclif/core/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -1635,8 +1787,6 @@ }, "node_modules/@oven/bun-linux-x64": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.3.5.tgz", - "integrity": "sha512-n7zhKTSDZS0yOYg5Rq8easZu5Y/o47sv0c7yGr2ciFdcie9uYV55fZ7QMqhWMGK33ezCSikh5EDkUMCIvfWpjA==", "cpu": [ "x64" ], @@ -1648,8 +1798,6 @@ }, "node_modules/@oven/bun-linux-x64-baseline": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.3.5.tgz", - "integrity": "sha512-FeCQyBU62DMuB0nn01vPnf3McXrKOsrK9p7sHaBFYycw0mmoU8kCq/WkBkGMnLuvQljJSyen8QBTx+fXdNupWg==", "cpu": [ "x64" ], @@ -1661,8 +1809,6 @@ }, "node_modules/@oven/bun-linux-x64-musl": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.3.5.tgz", - "integrity": "sha512-XkCCHkByYn8BIDvoxnny898znju4xnW2kvFE8FT5+0Y62cWdcBGMZ9RdsEUTeRz16k8hHtJpaSfLcEmNTFIwRQ==", "cpu": [ "x64" ], @@ -1674,8 +1820,6 @@ }, "node_modules/@oven/bun-linux-x64-musl-baseline": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.3.5.tgz", - "integrity": "sha512-TJiYC7KCr0XxFTsxgwQOeE7dncrEL/RSyL0EzSL3xRkrxJMWBCvCSjQn7LV1i6T7hFst0+3KoN3VWvD5BinqHA==", "cpu": [ "x64" ], @@ -1713,8 +1857,6 @@ }, "node_modules/@playwright/test": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", - "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1727,10 +1869,92 @@ "node": ">=18" } }, + "node_modules/@preact/preset-vite": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.2.tgz", + "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", + "@rollup/pluginutils": "^4.1.1", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.3.4", + "picocolors": "^1.1.1", + "vite-prerender-plugin": "^0.5.3" + }, + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x" + } + }, + "node_modules/@prefresh/babel-plugin": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.2.tgz", + "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@prefresh/core": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.9.tgz", + "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "preact": "^10.0.0 || ^11.0.0-0" + } + }, + "node_modules/@prefresh/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@prefresh/vite": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.11.tgz", + "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.2", + "@prefresh/core": "^1.5.0", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" + }, + "peerDependencies": { + "preact": "^10.4.0 || ^11.0.0-0", + "vite": ">=2.0.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, @@ -1763,9 +1987,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", + "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", "cpu": [ "arm64" ], @@ -1776,9 +2000,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", + "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", "cpu": [ "x64" ], @@ -1845,9 +2069,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", + "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", "cpu": [ "arm64" ], @@ -1943,8 +2167,6 @@ }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", "cpu": [ "x64" ], @@ -2025,9 +2247,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", + "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", "cpu": [ "x64" ], @@ -2039,8 +2261,6 @@ }, "node_modules/@shikijs/engine-oniguruma": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.19.0.tgz", - "integrity": "sha512-1hRxtYIJfJSZeM5ivbUXv9hcJP3PWRo5prG/V2sWwiubUKTa+7P62d2qxCW8jiVFX4pgRHhnHNp+qeR7Xl+6kg==", "dev": true, "license": "MIT", "dependencies": { @@ -2050,8 +2270,6 @@ }, "node_modules/@shikijs/langs": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.19.0.tgz", - "integrity": "sha512-dBMFzzg1QiXqCVQ5ONc0z2ebyoi5BKz+MtfByLm0o5/nbUu3Iz8uaTCa5uzGiscQKm7lVShfZHU1+OG3t5hgwg==", "dev": true, "license": "MIT", "dependencies": { @@ -2060,8 +2278,6 @@ }, "node_modules/@shikijs/themes": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.19.0.tgz", - "integrity": "sha512-H36qw+oh91Y0s6OlFfdSuQ0Ld+5CgB/VE6gNPK+Hk4VRbVG/XQgkjnt4KzfnnoO6tZPtKJKHPjwebOCfjd6F8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2070,8 +2286,6 @@ }, "node_modules/@shikijs/types": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.19.0.tgz", - "integrity": "sha512-Z2hdeEQlzuntf/BZpFG8a+Fsw9UVXdML7w0o3TgSXV3yNESGon+bs9ITkQb3Ki7zxoXOOu5oJWqZ2uto06V9iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2081,22 +2295,66 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2109,8 +2367,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2119,8 +2375,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2130,8 +2384,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2140,8 +2392,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2151,8 +2401,6 @@ }, "node_modules/@types/bun": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.3.tgz", - "integrity": "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2161,8 +2409,6 @@ }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -2172,8 +2418,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -2182,8 +2426,6 @@ }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -2192,22 +2434,15 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -2218,8 +2453,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dev": true, "license": "MIT", "dependencies": { @@ -2231,8 +2464,6 @@ }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2241,15 +2472,11 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", "peer": true, @@ -2259,22 +2486,16 @@ }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", "peer": true, @@ -2284,8 +2505,6 @@ }, "node_modules/@types/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2294,8 +2513,6 @@ }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2304,8 +2521,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2315,15 +2530,11 @@ }, "node_modules/@types/stats.js": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", "dev": true, "license": "MIT" }, "node_modules/@types/three": { "version": "0.181.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz", - "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==", "dev": true, "license": "MIT", "dependencies": { @@ -2338,22 +2549,16 @@ }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/webxr": { "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", "dev": true, "license": "MIT" }, "node_modules/@typescript/vfs": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz", - "integrity": "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==", "dev": true, "license": "MIT", "dependencies": { @@ -2365,8 +2570,6 @@ }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { @@ -2384,10 +2587,22 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, "node_modules/@vitest/expect": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { @@ -2403,8 +2618,6 @@ }, "node_modules/@vitest/mocker": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2430,8 +2643,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -2443,8 +2654,6 @@ }, "node_modules/@vitest/runner": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2458,8 +2667,6 @@ }, "node_modules/@vitest/snapshot": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2473,8 +2680,6 @@ }, "node_modules/@vitest/spy": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -2486,8 +2691,6 @@ }, "node_modules/@vitest/utils": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { @@ -2499,10 +2702,132 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vue/compiler-core": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz", + "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.26", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", + "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz", + "integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.26", + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz", + "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.26", + "@vue/compiler-dom": "3.5.26", + "@vue/compiler-ssr": "3.5.26", + "@vue/shared": "3.5.26", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz", + "integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.26", + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz", + "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz", + "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.26", + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz", + "integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.26", + "@vue/runtime-core": "3.5.26", + "@vue/shared": "3.5.26", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz", + "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.26", + "@vue/shared": "3.5.26" + }, + "peerDependencies": { + "vue": "3.5.26" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz", + "integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==", + "license": "MIT" + }, "node_modules/@webgpu/types": { "version": "0.1.67", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.67.tgz", - "integrity": "sha512-uk53+2ECGUkWoDFez/hymwpRfdgdIn6y1ref70fEecGMe5607f4sozNFgBk0oxlr7j2CRGWBEc3IBYMmFdGGTQ==", "dev": true, "license": "BSD-3-Clause" }, @@ -2518,8 +2843,6 @@ }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -2531,18 +2854,27 @@ }, "node_modules/accessor-fn": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", - "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", "dev": true, "license": "MIT", "engines": { "node": ">=12" } }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2557,8 +2889,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -2574,8 +2904,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2590,8 +2918,6 @@ }, "node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -2603,8 +2929,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -2619,8 +2943,6 @@ }, "node_modules/ansis": { "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", "dev": true, "license": "ISC", "engines": { @@ -2629,8 +2951,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -2643,15 +2963,20 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -2660,40 +2985,116 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-jsx-dom-expressions": { + "version": "0.40.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.3.tgz", + "integrity": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7", + "html-entities": "2.3.3", + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.20.12" + } + }, + "node_modules/babel-plugin-jsx-dom-expressions/node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-transform-hook-names": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.12.10" + } + }, + "node_modules/babel-preset-solid": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", + "integrity": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jsx-dom-expressions": "^0.40.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "solid-js": "^1.9.10" + }, + "peerDependenciesMeta": { + "solid-js": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/baseline-browser-mapping": { "version": "2.9.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", - "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/basic-server-preact": { + "resolved": "examples/basic-server-preact", + "link": true + }, "node_modules/basic-server-react": { "resolved": "examples/basic-server-react", "link": true }, + "node_modules/basic-server-solid": { + "resolved": "examples/basic-server-solid", + "link": true + }, + "node_modules/basic-server-svelte": { + "resolved": "examples/basic-server-svelte", + "link": true + }, "node_modules/basic-server-vanillajs": { "resolved": "examples/basic-server-vanillajs", "link": true }, + "node_modules/basic-server-vue": { + "resolved": "examples/basic-server-vue", + "link": true + }, "node_modules/bezier-js": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "dev": true, "license": "MIT", "funding": { @@ -2703,8 +3104,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -2716,8 +3115,6 @@ }, "node_modules/body-parser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -2740,14 +3137,10 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2757,8 +3150,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -2770,8 +3161,6 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -2809,8 +3198,6 @@ }, "node_modules/bun-types": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.3.tgz", - "integrity": "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2819,8 +3206,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -2828,8 +3213,6 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -2838,8 +3221,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2851,8 +3232,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2867,8 +3246,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", "dev": true, "funding": [ { @@ -2888,8 +3265,6 @@ }, "node_modules/canvas-color-tracker": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", - "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -2901,8 +3276,6 @@ }, "node_modules/chai": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -2918,8 +3291,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -2935,8 +3306,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -2948,8 +3317,6 @@ }, "node_modules/chart.js": { "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -2960,8 +3327,6 @@ }, "node_modules/check-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", "engines": { @@ -2970,8 +3335,6 @@ }, "node_modules/cheerio": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -2995,8 +3358,6 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -3012,8 +3373,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3037,8 +3396,6 @@ }, "node_modules/clean-stack": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3053,8 +3410,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -3069,8 +3424,6 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -3082,8 +3435,6 @@ }, "node_modules/cli-truncate": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { @@ -3099,8 +3450,6 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3116,8 +3465,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3131,8 +3478,6 @@ }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -3141,8 +3486,6 @@ }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3152,14 +3495,21 @@ "node": ">=8" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cohort-heatmap-server": { "resolved": "examples/cohort-heatmap-server", "link": true }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3171,29 +3521,21 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/concurrently": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -3217,8 +3559,6 @@ }, "node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -3230,8 +3570,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3239,15 +3577,11 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3255,8 +3589,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -3264,8 +3596,6 @@ }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -3277,8 +3607,6 @@ }, "node_modules/cross-env": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -3295,8 +3623,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3309,8 +3635,6 @@ }, "node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -3325,8 +3649,6 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -3337,9 +3659,6 @@ }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/customer-segmentation-server": { @@ -3348,8 +3667,6 @@ }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, "license": "ISC", "dependencies": { @@ -3361,15 +3678,11 @@ }, "node_modules/d3-binarytree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", "dev": true, "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, "license": "ISC", "engines": { @@ -3378,8 +3691,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, "license": "ISC", "engines": { @@ -3388,8 +3699,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, "license": "ISC", "dependencies": { @@ -3402,8 +3711,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3412,8 +3719,6 @@ }, "node_modules/d3-force-3d": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", - "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", "dev": true, "license": "MIT", "dependencies": { @@ -3429,8 +3734,6 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, "license": "ISC", "engines": { @@ -3439,8 +3742,6 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, "license": "ISC", "dependencies": { @@ -3452,15 +3753,11 @@ }, "node_modules/d3-octree": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", "dev": true, "license": "MIT" }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, "license": "ISC", "engines": { @@ -3469,8 +3766,6 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3486,8 +3781,6 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3500,8 +3793,6 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", "peer": true, @@ -3511,8 +3802,6 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -3524,8 +3813,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, "license": "ISC", "dependencies": { @@ -3537,8 +3824,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, "license": "ISC", "engines": { @@ -3547,8 +3832,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3567,8 +3850,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, "license": "ISC", "dependencies": { @@ -3584,8 +3865,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3601,27 +3880,37 @@ }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "license": "MIT" + }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -3634,8 +3923,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -3646,8 +3933,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -3661,8 +3946,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -3675,8 +3958,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -3689,14 +3970,10 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3711,22 +3988,16 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.266", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", - "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3734,8 +4005,6 @@ }, "node_modules/encoding-sniffer": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -3747,8 +4016,6 @@ }, "node_modules/encoding-sniffer/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -3759,8 +4026,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -3771,8 +4036,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -3784,8 +4047,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3793,8 +4054,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3802,15 +4061,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3821,8 +4076,6 @@ }, "node_modules/esbuild": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3863,8 +4116,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -3873,14 +4124,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -3890,10 +4137,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", + "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3902,8 +4162,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3911,15 +4169,11 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -3930,8 +4184,6 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -3939,8 +4191,6 @@ }, "node_modules/expect-type": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3949,8 +4199,6 @@ }, "node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "peer": true, "dependencies": { @@ -3993,8 +4241,6 @@ }, "node_modules/express-rate-limit": { "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { "node": ">= 16" @@ -4008,14 +4254,10 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -4030,15 +4272,11 @@ }, "node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, "license": "MIT" }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4047,8 +4285,6 @@ }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4057,8 +4293,6 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -4070,8 +4304,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4083,8 +4315,6 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -4104,8 +4334,6 @@ }, "node_modules/float-tooltip": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", - "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", "dev": true, "license": "MIT", "dependencies": { @@ -4119,8 +4347,6 @@ }, "node_modules/force-graph": { "version": "1.51.0", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz", - "integrity": "sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==", "dev": true, "license": "MIT", "dependencies": { @@ -4146,8 +4372,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4155,8 +4379,6 @@ }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4179,8 +4401,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4188,8 +4408,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -4198,8 +4416,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -4208,8 +4424,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -4221,8 +4435,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4245,8 +4457,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -4255,8 +4465,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -4268,8 +4476,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4281,8 +4487,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4294,8 +4498,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4306,8 +4508,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -4316,8 +4516,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4328,8 +4526,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4338,10 +4534,25 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true, + "license": "MIT" + }, "node_modules/htmlparser2": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4359,8 +4570,6 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -4371,8 +4580,6 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -4391,8 +4598,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -4407,8 +4612,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4423,15 +4626,11 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true, "license": "ISC" }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -4440,8 +4639,6 @@ }, "node_modules/index-array-by": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "dev": true, "license": "MIT", "engines": { @@ -4450,8 +4647,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/integration-server": { @@ -4460,8 +4655,6 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, "license": "ISC", "engines": { @@ -4470,8 +4663,6 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -4479,8 +4670,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -4492,8 +4681,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -4508,8 +4695,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -4518,8 +4703,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4534,8 +4717,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -4547,8 +4728,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -4557,14 +4736,32 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -4576,14 +4773,10 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/jake": { "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4600,8 +4793,6 @@ }, "node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -4609,15 +4800,11 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -4629,14 +4816,10 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -4648,8 +4831,6 @@ }, "node_modules/kapsule": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", - "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", "dev": true, "license": "MIT", "dependencies": { @@ -4659,10 +4840,25 @@ "node": ">=12" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -4674,8 +4870,6 @@ }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4684,8 +4878,6 @@ }, "node_modules/listr2": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { @@ -4702,8 +4894,6 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4715,15 +4905,11 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4740,8 +4926,6 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -4756,17 +4940,19 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "dev": true, "license": "MIT" }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -4785,8 +4971,6 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -4801,8 +4985,6 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4814,15 +4996,11 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4839,8 +5017,6 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -4857,15 +5033,11 @@ }, "node_modules/loupe": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -4874,16 +5046,11 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -4891,8 +5058,6 @@ }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { @@ -4909,8 +5074,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4918,24 +5081,34 @@ }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/merge-anything": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", + "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -4946,15 +5119,11 @@ }, "node_modules/meshoptimizer": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", - "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "dev": true, "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -4967,8 +5136,6 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4976,8 +5143,6 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -4992,8 +5157,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -5005,8 +5168,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -5018,15 +5179,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -5043,24 +5199,29 @@ }, "node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, "node_modules/node-releases": { "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5088,8 +5249,6 @@ }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -5098,8 +5257,6 @@ }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -5111,8 +5268,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -5121,8 +5276,6 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -5133,8 +5286,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5142,8 +5293,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5154,8 +5303,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -5166,8 +5313,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -5175,8 +5320,6 @@ }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5191,8 +5334,6 @@ }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -5203,8 +5344,6 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -5216,8 +5355,6 @@ }, "node_modules/parse5-parser-stream": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", "dependencies": { "parse5": "^7.0.0" @@ -5228,8 +5365,6 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -5240,8 +5375,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5249,8 +5382,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -5258,8 +5389,6 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -5268,15 +5397,11 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -5285,15 +5410,10 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -5305,8 +5425,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -5314,8 +5432,6 @@ }, "node_modules/playwright": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", - "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5333,8 +5449,6 @@ }, "node_modules/playwright-core": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5361,9 +5475,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5390,10 +5501,8 @@ }, "node_modules/preact": { "version": "10.28.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.0.tgz", - "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==", - "dev": true, "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -5417,8 +5526,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -5430,15 +5537,11 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true, "license": "MIT" }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { @@ -5447,8 +5550,6 @@ }, "node_modules/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -5462,8 +5563,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5471,8 +5570,6 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -5486,8 +5583,6 @@ }, "node_modules/react": { "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", - "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", "license": "MIT", "peer": true, "engines": { @@ -5496,8 +5591,6 @@ }, "node_modules/react-dom": { "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz", - "integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -5508,8 +5601,6 @@ }, "node_modules/react-refresh": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -5518,8 +5609,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -5531,8 +5620,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -5541,8 +5628,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5550,8 +5635,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -5560,8 +5643,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -5577,18 +5658,13 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -5625,10 +5701,64 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -5643,8 +5773,6 @@ }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5653,8 +5781,6 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/scenario-modeler-server": { @@ -5663,14 +5789,10 @@ }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -5682,8 +5804,6 @@ }, "node_modules/send": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -5702,10 +5822,30 @@ "node": ">= 18" } }, + "node_modules/seroval": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", + "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/seroval-plugins": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.3.tgz", + "integrity": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "seroval": "^1.0" + } + }, "node_modules/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -5719,14 +5859,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "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==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -5737,8 +5873,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -5750,8 +5884,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -5763,8 +5895,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5782,8 +5912,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5798,8 +5926,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -5816,8 +5942,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -5835,15 +5959,11 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -5853,10 +5973,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-code-frame": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/simple-code-frame/-/simple-code-frame-1.3.0.tgz", + "integrity": "sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "kolorist": "^1.6.0" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { @@ -5868,15 +5996,11 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { @@ -5888,8 +6012,6 @@ }, "node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -5905,8 +6027,6 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -5916,27 +6036,67 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/solid-js": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", + "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.1.0", + "seroval": "~1.3.0", + "seroval-plugins": "~1.3.0" + } + }, + "node_modules/solid-refresh": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", + "integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.23.6", + "@babel/helper-module-imports": "^7.22.15", + "@babel/types": "^7.23.6" + }, + "peerDependencies": { + "solid-js": "^1.3" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5944,15 +6104,11 @@ }, "node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -5966,8 +6122,6 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -5976,8 +6130,6 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -5986,8 +6138,6 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -5999,8 +6149,6 @@ }, "node_modules/strip-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6015,8 +6163,6 @@ }, "node_modules/strip-literal": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "license": "MIT", "dependencies": { @@ -6028,15 +6174,11 @@ }, "node_modules/strip-literal/node_modules/js-tokens": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6049,14 +6191,39 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/svelte": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.0.tgz", + "integrity": "sha512-ZhLtvroYxUxr+HQJfMZEDRsGsmU46x12RvAv/zi9584f5KOX7bUrEbhPJ7cKFmUvZTJXi/CFZUYwDC6M1FigPw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.5.0", + "esm-env": "^1.2.1", + "esrap": "^2.2.1", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/system-monitor-server": { "resolved": "examples/system-monitor-server", "link": true }, "node_modules/systeminformation": { "version": "5.27.11", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.27.11.tgz", - "integrity": "sha512-K3Lto/2m3K2twmKHdgx5B+0in9qhXK4YnoT9rIlgwN/4v7OV5c8IjbeAUkuky/6VzCQC7iKCAqi8rZathCdjHg==", "license": "MIT", "os": [ "darwin", @@ -6081,8 +6248,6 @@ }, "node_modules/text-camel-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-camel-case/-/text-camel-case-1.2.9.tgz", - "integrity": "sha512-wKYs9SgRxYizJE1mneR7BbLNlGw2IYzJAS8XwkWIry0CTbO1gvvPkFsx5Z1/hr+VqUaBqx9q3yKd30HpZLdMsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6091,8 +6256,6 @@ }, "node_modules/text-capital-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-capital-case/-/text-capital-case-1.2.9.tgz", - "integrity": "sha512-X5zV8U8pxtq2xS2t46lgAWqZdDbgWMKq03MQSNwY2CJdQCsdTNh144E2Q/q9wBxWzSBUXn+jRc9kF+Gs8/pGhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6102,8 +6265,6 @@ }, "node_modules/text-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-case/-/text-case-1.2.9.tgz", - "integrity": "sha512-zZVdA8rMcjx9zhekdUuOPZShc25UTV7W8/ddKbgbPtfCEvIiToPtWiSd2lXLSuiGMovNhJ4+Tw49xll9o9ts+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6131,8 +6292,6 @@ }, "node_modules/text-constant-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-constant-case/-/text-constant-case-1.2.9.tgz", - "integrity": "sha512-Vosm6nC7Gag+JFakJHwqS9AXRNgl07j5KZ7srU9cYuKRzYwrxzeJ4RpEogRBNHw7CfmOm0j5FGEznblWtu7pIw==", "dev": true, "license": "MIT", "dependencies": { @@ -6142,8 +6301,6 @@ }, "node_modules/text-dot-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-dot-case/-/text-dot-case-1.2.9.tgz", - "integrity": "sha512-N83hsnvGdSO9q9AfNSB9Cy1LFDNN2MCx53LcxtaPoDWPUTk47fv0JlvIY1tgY0wyzCiThF03kVj3jworvAOScA==", "dev": true, "license": "MIT", "dependencies": { @@ -6152,8 +6309,6 @@ }, "node_modules/text-header-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-header-case/-/text-header-case-1.2.9.tgz", - "integrity": "sha512-TqryEKcYisQAfWLbtT3xPnZlMZ/mySO1uS+LUg+B0eNuqgETrSzVpXIUj5E6Zf/EyJHgpZf4VndbAXtOMJuT4w==", "dev": true, "license": "MIT", "dependencies": { @@ -6162,22 +6317,16 @@ }, "node_modules/text-is-lower-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-is-lower-case/-/text-is-lower-case-1.2.9.tgz", - "integrity": "sha512-cEurrWSnYVYqL8FSwl5cK4mdfqF7qNDCcKJgXI3NnfTesiB8umxAhdlQoErrRYI1xEvYr2WN0MI333EehUhQjg==", "dev": true, "license": "MIT" }, "node_modules/text-is-upper-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-is-upper-case/-/text-is-upper-case-1.2.9.tgz", - "integrity": "sha512-HxsWr3VCsXXiLlhD0c+Ey+mS2lOTCiSJbkepjaXNHl2bp33KiscQaiG0qLwQmmpZQm4SJCg2s9FkndxS0RNDLQ==", "dev": true, "license": "MIT" }, "node_modules/text-kebab-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-kebab-case/-/text-kebab-case-1.2.9.tgz", - "integrity": "sha512-nOUyNR5Ej2B9D/wyyXfwUEv26+pQuOb1pEX+ojE37mCIWo8QeOxw5y6nxuqDmG7NrEPzbO6265UMV+EICH13Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -6186,22 +6335,16 @@ }, "node_modules/text-lower-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-lower-case/-/text-lower-case-1.2.9.tgz", - "integrity": "sha512-53AOnDrhPpiAUQkgY1SHleKUXp/u7GsqRX13NcCREZscmtjLLJ099uxMRjkK7q2KwHkFYVPl9ytkQlTkTQLS0w==", "dev": true, "license": "MIT" }, "node_modules/text-lower-case-first": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-lower-case-first/-/text-lower-case-first-1.2.9.tgz", - "integrity": "sha512-iiphHTV7PVH0MljrEQUA9iBE7jfDpXoi4RQju3WzZU3BRVbS6540cNZgxR19hWa0z6z/7cJTH0Ls9LPBaiUfKg==", "dev": true, "license": "MIT" }, "node_modules/text-no-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-no-case/-/text-no-case-1.2.9.tgz", - "integrity": "sha512-IcCt328KaapimSrytP4ThfC8URmHZb2DgOqCL9BYvGjpxY2lDiqCkIQk9sClZtwcELs2gTnq83a7jNc573FTLA==", "dev": true, "license": "MIT", "dependencies": { @@ -6210,8 +6353,6 @@ }, "node_modules/text-param-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-param-case/-/text-param-case-1.2.9.tgz", - "integrity": "sha512-nR/Ju9amY3aQS1en2CUCgqN/ZiZIVdDyjlJ3xX5J92ChBevGuA4o9K10fh3JGMkbzK97Vcb+bWQJ4Q+Svz+GyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6220,8 +6361,6 @@ }, "node_modules/text-pascal-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-pascal-case/-/text-pascal-case-1.2.9.tgz", - "integrity": "sha512-o6ZxMGjWDTUW54pcghpXes+C2PqbYRMdU5mHrIhueb6z6nq1NueiIOeCUdrSjN/3wXfhCmnFjK7/d9aRGZNqSg==", "dev": true, "license": "MIT", "dependencies": { @@ -6230,8 +6369,6 @@ }, "node_modules/text-path-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-path-case/-/text-path-case-1.2.9.tgz", - "integrity": "sha512-s8cJ6r5TkJp5ticXMgtxd7f12odEN4d1CfX5u4aoz6jcUtBR2lDqzIhVimkqWFMJ4UKPSrmilUha8Xc2BPi+ow==", "dev": true, "license": "MIT", "dependencies": { @@ -6240,8 +6377,6 @@ }, "node_modules/text-sentence-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-sentence-case/-/text-sentence-case-1.2.9.tgz", - "integrity": "sha512-/G/Yi5kZfUa1edFRV4O3lGZAkbDZTFvlwW8CYfH7szkEGe2k2MYEYbOyAkGRVQEGV6V6JiuUAaP3VS9c1tB6nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6251,8 +6386,6 @@ }, "node_modules/text-snake-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-snake-case/-/text-snake-case-1.2.9.tgz", - "integrity": "sha512-+ZrqK19ynF/TLQZ7ynqVrL2Dy04uu9syYZwsm8PhzUdsY3XrwPy6QiRqhIEFqhyWbShPcfyfmheer5UEQqFxlw==", "dev": true, "license": "MIT", "dependencies": { @@ -6261,15 +6394,11 @@ }, "node_modules/text-swap-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-swap-case/-/text-swap-case-1.2.9.tgz", - "integrity": "sha512-g5fp12ldktYKK9wdHRMvvtSCQrZYNv/D+ZGLumDsvAY4q9T5bCMO2IWMkIP1F5gVQrysdHH6Xv877P/pjUq1iw==", "dev": true, "license": "MIT" }, "node_modules/text-title-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-title-case/-/text-title-case-1.2.9.tgz", - "integrity": "sha512-RAtC9cdmPp41ns5/HXZBsaQg71BsHT7uZpj2ojTtuFa8o2dNuRYYOrSmy5YdLRIAJQ6WK5hQVpV3jHuq7a+4Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -6279,22 +6408,16 @@ }, "node_modules/text-upper-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-upper-case/-/text-upper-case-1.2.9.tgz", - "integrity": "sha512-K/0DNT7a4z8eah2spARtoJllTZyrNTo6Uc0ujhN/96Ir9uJ/slpahfs13y46H9osL3daaLl3O7iXOkW4xtX6bg==", "dev": true, "license": "MIT" }, "node_modules/text-upper-case-first": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-upper-case-first/-/text-upper-case-first-1.2.9.tgz", - "integrity": "sha512-wEDD1B6XqJmEV+xEnBJd+2sBCHZ+7fvA/8Rv/o8+dAsp05YWjYP/kjB8sPH6zqzW0s6jtehIg4IlcKjcYxk2CQ==", "dev": true, "license": "MIT" }, "node_modules/three": { "version": "0.181.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.181.2.tgz", - "integrity": "sha512-k/CjiZ80bYss6Qs7/ex1TBlPD11whT9oKfT8oTGiHa34W4JRd1NiH/Tr1DbHWQ2/vMUypxksLnF2CfmlmM5XFQ==", "license": "MIT" }, "node_modules/threejs-server": { @@ -6303,29 +6426,21 @@ }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6341,8 +6456,6 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -6359,8 +6472,6 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "peer": true, @@ -6373,8 +6484,6 @@ }, "node_modules/tinypool": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -6383,8 +6492,6 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -6393,8 +6500,6 @@ }, "node_modules/tinyspy": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -6403,8 +6508,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6416,8 +6519,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -6425,8 +6526,6 @@ }, "node_modules/touch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, "license": "ISC", "bin": { @@ -6435,8 +6534,6 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -6445,8 +6542,6 @@ }, "node_modules/ts-to-zod": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ts-to-zod/-/ts-to-zod-5.1.0.tgz", - "integrity": "sha512-giqqlvRHunlJqG9tBL/KAO3wWIVZGF//mZiWLKm/fdQnKnz4EN2mtiK5cugN9slytBkdMEXQIaLvMzIScbhhFw==", "dev": true, "license": "MIT", "dependencies": { @@ -6468,8 +6563,6 @@ }, "node_modules/ts-to-zod/node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { @@ -6484,8 +6577,6 @@ }, "node_modules/ts-to-zod/node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -6498,15 +6589,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -6521,15 +6608,11 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { @@ -6820,8 +6903,6 @@ }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", - "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", "cpu": [ "x64" ], @@ -6990,8 +7071,6 @@ }, "node_modules/tsx/node_modules/esbuild": { "version": "0.27.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", - "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7032,8 +7111,6 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7045,8 +7122,6 @@ }, "node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -7059,8 +7134,6 @@ }, "node_modules/typedoc": { "version": "0.28.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.15.tgz", - "integrity": "sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7083,8 +7156,6 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7093,8 +7164,6 @@ }, "node_modules/typedoc/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -7109,9 +7178,7 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "peer": true, "bin": { @@ -7124,22 +7191,16 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undefsafe": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true, "license": "MIT" }, "node_modules/undici": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -7147,15 +7208,11 @@ }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -7163,8 +7220,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "dev": true, "funding": [ { @@ -7194,8 +7249,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -7207,8 +7260,6 @@ }, "node_modules/vite": { "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", "peer": true, @@ -7283,8 +7334,6 @@ }, "node_modules/vite-node": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -7306,8 +7355,6 @@ }, "node_modules/vite-plugin-singlefile": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.0.tgz", - "integrity": "sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==", "dev": true, "license": "MIT", "dependencies": { @@ -7321,10 +7368,51 @@ "vite": "^5.4.11 || ^6.0.0 || ^7.0.0" } }, + "node_modules/vite-plugin-solid": { + "version": "2.11.10", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.10.tgz", + "integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@types/babel__core": "^7.20.4", + "babel-preset-solid": "^1.8.4", + "merge-anything": "^5.1.7", + "solid-refresh": "^0.6.3", + "vitefu": "^1.0.4" + }, + "peerDependencies": { + "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", + "solid-js": "^1.7.2", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "@testing-library/jest-dom": { + "optional": true + } + } + }, + "node_modules/vite-prerender-plugin": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/vite-prerender-plugin/-/vite-prerender-plugin-0.5.12.tgz", + "integrity": "sha512-EiwhbMn+flg14EysbLTmZSzq8NGTxhytgK3bf4aGRF1evWLGwZiHiUJ1KZDvbxgKbMf2pG6fJWGEa3UZXOnR1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "kolorist": "^1.8.0", + "magic-string": "0.x >= 0.26.0", + "node-html-parser": "^6.1.12", + "simple-code-frame": "^1.3.0", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" + }, + "peerDependencies": { + "vite": "5.x || 6.x || 7.x" + } + }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -7341,8 +7429,6 @@ }, "node_modules/vite/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "peer": true, @@ -7353,10 +7439,28 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, "node_modules/vitest": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { @@ -7428,8 +7532,6 @@ }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -7439,10 +7541,30 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vue": { + "version": "3.5.26", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", + "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.26", + "@vue/compiler-sfc": "3.5.26", + "@vue/runtime-dom": "3.5.26", + "@vue/server-renderer": "3.5.26", + "@vue/shared": "3.5.26" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -7453,8 +7575,6 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -7465,8 +7585,6 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "engines": { "node": ">=18" @@ -7474,8 +7592,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -7489,8 +7605,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -7506,8 +7620,6 @@ }, "node_modules/widest-line": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "license": "MIT", "dependencies": { @@ -7523,15 +7635,11 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7548,8 +7656,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -7558,8 +7664,6 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -7571,14 +7675,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -7587,15 +7687,11 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", "peer": true, @@ -7611,8 +7707,6 @@ }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -7630,18 +7724,20 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" + }, "node_modules/zod": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", - "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", "license": "MIT", "peer": true, "funding": { @@ -7650,8 +7746,6 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.0", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", - "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" diff --git a/tests/e2e/servers.spec.ts b/tests/e2e/servers.spec.ts index e4b1bb5..56d845a 100644 --- a/tests/e2e/servers.spec.ts +++ b/tests/e2e/servers.spec.ts @@ -5,8 +5,12 @@ import { test, expect, type Page, type ConsoleMessage } from "@playwright/test"; // with partial matches (e.g., [class*="heatmapWrapper"]) for those components const DYNAMIC_MASKS: Record = { integration: ["#server-time"], // Server time display + "basic-preact": ["#server-time"], // Server time display "basic-react": ["#server-time"], // Server time display + "basic-solid": ["#server-time"], // Server time display + "basic-svelte": ["#server-time"], // Server time display "basic-vanillajs": ["#server-time"], // Server time display + "basic-vue": ["#server-time"], // Server time display "cohort-heatmap": ['[class*="heatmapWrapper"]'], // Heatmap grid (random data) "customer-segmentation": [".chart-container"], // Scatter plot (random data) "system-monitor": [ @@ -24,8 +28,12 @@ const DYNAMIC_MASKS: Record = { // Server configurations (key is used for screenshot filenames, name is the MCP server name) const SERVERS = [ { key: "integration", name: "Integration Test Server" }, + { key: "basic-preact", name: "Basic MCP App Server (Preact)" }, { key: "basic-react", name: "Basic MCP App Server (React)" }, + { key: "basic-solid", name: "Basic MCP App Server (Solid)" }, + { key: "basic-svelte", name: "Basic MCP App Server (Svelte)" }, { key: "basic-vanillajs", name: "Basic MCP App Server (Vanilla JS)" }, + { key: "basic-vue", name: "Basic MCP App Server (Vue)" }, { key: "budget-allocator", name: "Budget Allocator Server" }, { key: "cohort-heatmap", name: "Cohort Heatmap Server" }, { key: "customer-segmentation", name: "Customer Segmentation Server" }, diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-preact.png b/tests/e2e/servers.spec.ts-snapshots/basic-preact.png new file mode 100644 index 0000000000000000000000000000000000000000..a63dd8bfcd87b6de4831bdc1717c561294442080 GIT binary patch literal 48110 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%0D0)}~U{^JjR6)DH2t(`C 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 literal 0 HcmV?d00001 diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-svelte.png b/tests/e2e/servers.spec.ts-snapshots/basic-svelte.png new file mode 100644 index 0000000000000000000000000000000000000000..179665b3ce4ee3fb7aebd0a5ff0dbce415d5eeba GIT binary patch literal 48075 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≧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 L9{qwH&Zqwazw=1h literal 0 HcmV?d00001 From e205e26e4e50c02bd184b2581ace10b0d4eab406 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Mon, 15 Dec 2025 11:15:04 -0600 Subject: [PATCH 032/389] Update quickstart guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reorganize prerequisites to emphasize MCP concepts first - Add tip linking to official MCP quickstart for newcomers - Update install command to use published npm package - Remove zod dependency and `structuredContent` usage - Use `RESOURCE_MIME_TYPE` constant for consistency - Add clearer comments explaining tool/resource registration - Simplify UI to extract time from text content ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- docs/quickstart.md | 60 ++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 8569bfd..9481df3 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -15,8 +15,12 @@ A simple app that fetches the current server time and displays it in a clickable ## Prerequisites -- Node.js 18+ +- Familiarity with MCP concepts, especially [Tools](https://modelcontextprotocol.io/docs/learn/server-concepts#tools) and [Resources](https://modelcontextprotocol.io/docs/learn/server-concepts#resources) - Familiarity with the [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) +- Node.js 18+ + +> [!TIP] +> New to building MCP servers? Start with the [official MCP quickstart guide](https://modelcontextprotocol.io/docs/develop/build-server) to learn the core concepts first. ## 1. Project Setup @@ -30,7 +34,7 @@ npm init -y Install dependencies: ```bash -npm install github:modelcontextprotocol/ext-apps @modelcontextprotocol/sdk zod +npm install @modelcontextprotocol/ext-apps @modelcontextprotocol/sdk npm install -D typescript vite vite-plugin-singlefile express cors @types/express @types/cors tsx ``` @@ -98,45 +102,49 @@ Create `server.ts`: import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { + registerAppTool, + registerAppResource, RESOURCE_MIME_TYPE, - type McpUiToolMeta, -} from "@modelcontextprotocol/ext-apps"; +} from "@modelcontextprotocol/ext-apps/server"; import cors from "cors"; import express from "express"; import fs from "node:fs/promises"; import path from "node:path"; -import * as z from "zod"; const server = new McpServer({ name: "My MCP App Server", version: "1.0.0", }); -// Two-part registration: tool + resource +// Two-part registration: tool + resource, tied together by the resource URI. const resourceUri = "ui://get-time/mcp-app.html"; -server.registerTool( +// Register a tool with UI metadata. When the host calls this tool, it reads +// `_meta.ui.resourceUri` to know which resource to fetch and render as an +// interactive UI. +registerAppTool( + server, "get-time", { title: "Get Time", description: "Returns the current server time.", inputSchema: {}, - outputSchema: { time: z.string() }, - _meta: { ui: { resourceUri } as McpUiToolMeta }, // Links tool to UI + _meta: { ui: { resourceUri } }, }, async () => { const time = new Date().toISOString(); return { content: [{ type: "text", text: time }], - structuredContent: { time }, }; }, ); -server.registerResource( +// Register the resource, which returns the bundled HTML/JavaScript for the UI. +registerAppResource( + server, resourceUri, resourceUri, - { mimeType: "text/html;profile=mcp-app" }, + { mimeType: RESOURCE_MIME_TYPE }, async () => { const html = await fs.readFile( path.join(import.meta.dirname, "dist", "mcp-app.html"), @@ -144,18 +152,18 @@ server.registerResource( ); return { contents: [ - { uri: resourceUri, mimeType: "text/html;profile=mcp-app", text: html }, + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, ], }; }, ); -// Express server for MCP endpoint -const app = express(); -app.use(cors()); -app.use(express.json()); +// Start an Express server that exposes the MCP endpoint. +const expressApp = express(); +expressApp.use(cors()); +expressApp.use(express.json()); -app.post("/mcp", async (req, res) => { +expressApp.post("/mcp", async (req, res) => { const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true, @@ -165,7 +173,7 @@ app.post("/mcp", async (req, res) => { await transport.handleRequest(req, res, req.body); }); -app.listen(3001, (err) => { +expressApp.listen(3001, (err) => { if (err) { console.error("Error starting server:", err); process.exit(1); @@ -209,7 +217,7 @@ Create `mcp-app.html`: Create `src/mcp-app.ts`: ```typescript -import { App, PostMessageTransport } from "@modelcontextprotocol/ext-apps"; +import { App } from "@modelcontextprotocol/ext-apps"; // Get element references const serverTimeEl = document.getElementById("server-time")!; @@ -220,30 +228,30 @@ const app = new App({ name: "Get Time App", version: "1.0.0" }); // Register handlers BEFORE connecting app.ontoolresult = (result) => { - const { time } = (result.structuredContent as { time?: string }) ?? {}; + const time = result.content?.find((c) => c.type === "text")?.text; serverTimeEl.textContent = time ?? "[ERROR]"; }; // Wire up button click getTimeBtn.addEventListener("click", async () => { const result = await app.callServerTool({ name: "get-time", arguments: {} }); - const { time } = (result.structuredContent as { time?: string }) ?? {}; + const time = result.content?.find((c) => c.type === "text")?.text; serverTimeEl.textContent = time ?? "[ERROR]"; }); // Connect to host -app.connect(new PostMessageTransport(window.parent)); +app.connect(); ``` +> [!NOTE] +> **Full files:** [`mcp-app.html`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/mcp-app.html), [`src/mcp-app.ts`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/src/mcp-app.ts) + Build the UI: ```bash npm run build ``` -> [!NOTE] -> **Full files:** [`mcp-app.html`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/mcp-app.html), [`src/mcp-app.ts`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/src/mcp-app.ts) - This produces `dist/mcp-app.html` which contains your bundled app: ```console From 2a3c2ce0348ac156b864b638e43e337b27a06791 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Wed, 7 Jan 2026 10:48:40 -0600 Subject: [PATCH 033/389] Add "How It Works" section to README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provides a concise 4-step overview of the MCP Apps architecture: tool call โ†’ `ui://` resource โ†’ sandboxed iframe โ†’ bidirectional communication via notifications. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index eb95e8b..3010859 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,17 @@ This repo contains the SDK and [specification](https://github.com/modelcontextpr MCP Apps are a proposed standard inspired by [MCP-UI](https://mcpui.dev/) and [OpenAI's Apps SDK](https://developers.openai.com/apps-sdk/) to allow MCP Servers to display interactive UI elements in conversational MCP clients / chatbots. +## How It Works + +MCP Apps extend the Model Context Protocol to let servers deliver **interactive UIs** to MCP hosts. Here's how it works: + +1. **Tool call** โ€” The LLM calls a tool on your server +2. **UI Resource** โ€” The tool's definition links to a predeclared `ui://` resource containing its HTML interface +3. **Host renders** โ€” The host fetches the resource and displays it in a sandboxed iframe +4. **Bidirectional communication** โ€” The host passes tool data to the UI via notifications, and the UI can call other tools through the host + +This enables dashboards, forms, visualizations, and other rich experiences inside chat interfaces. + ## Overview This SDK serves two audiences: From c25d464d18637d77197e53514f7916b31937e8b2 Mon Sep 17 00:00:00 2001 From: Jerome Date: Thu, 8 Jan 2026 20:08:50 +0000 Subject: [PATCH 034/389] feat: publish example servers to npm (#184) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: publish example servers to npm Make example MCP App servers publishable to npm under the @modelcontextprotocol scope: - server-basic-react - server-basic-vanillajs - server-budget-allocator - server-cohort-heatmap - server-customer-segmentation - server-scenario-modeler - server-system-monitor - server-threejs - server-wiki-explorer Changes: - Remove `private: true` from example package.json files - Add proper npm metadata (description, repository, license, files) - Update ext-apps dependency from relative to ^0.2.2 - Copy server-utils.ts into each package for standalone use - Add publish-examples job to npm-publish.yml workflow The examples will be published automatically when a GitHub release is created, after the main SDK package is published. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * feat: publish examples with pkg-pr-new for PR testing * feat: export createServer from example servers * style: format integration-server/server.ts ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * fix: update e2e snapshots for basic-server examples Update golden screenshots for basic-react and basic-vanillajs after the tool output was simplified from JSON to plain text in #182. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * merge * refactor: update sheet-music-server and video-resource-server to new publishing pattern - Move server-utils.ts from src/ to root level - Add npm publishing metadata (scoped name, repository, license, files) - Change ext-apps dependency from local to versioned ^0.2.2 - Update server.ts to handle stdio mode inline * update package-lock * fix: update package-lock.json for renamed server packages * feat: add NASA public domain video to video-resource-server Added 'nasa-earth' option - NASA ISS Earth observations (6.4MB). Source: archive.org/details/NASA-Ultra-High-Definition (public domain) * fix: add default videoId for video-resource-server * fix: use existing bunny-1mb as default video, remove nasa-earth * refactor: update new framework examples to publishing pattern Add publishing metadata for: - @modelcontextprotocol/server-basic-preact - @modelcontextprotocol/server-basic-solid - @modelcontextprotocol/server-basic-svelte - @modelcontextprotocol/server-basic-vue Changes: - Move server-utils.ts from src/ to root - Add npm publishing metadata - Update ext-apps dep to versioned ^0.2.2 - Add stdio mode support in main() * fix: add missing @rollup/rollup-win32-arm64-msvc to optionalDependencies This fixes the Windows ARM64 CI build failure caused by npm's optional dependency bug. The package.json was missing this platform-specific rollup binding. --------- Co-authored-by: Claude Co-authored-by: Olivier Chafik --- .github/workflows/npm-publish.yml | 44 + .github/workflows/publish.yml | 14 +- examples/basic-server-preact/package.json | 25 +- examples/basic-server-preact/server-utils.ts | 68 + examples/basic-server-preact/server.ts | 19 +- .../basic-server-preact/src/server-utils.ts | 110 - examples/basic-server-react/package.json | 24 +- examples/basic-server-react/server-utils.ts | 68 + examples/basic-server-react/server.ts | 34 +- .../basic-server-react/src/server-utils.ts | 110 - examples/basic-server-solid/package.json | 25 +- examples/basic-server-solid/server-utils.ts | 68 + examples/basic-server-solid/server.ts | 19 +- .../basic-server-solid/src/server-utils.ts | 110 - examples/basic-server-svelte/package.json | 24 +- examples/basic-server-svelte/server-utils.ts | 68 + examples/basic-server-svelte/server.ts | 19 +- .../basic-server-svelte/src/server-utils.ts | 110 - examples/basic-server-vanillajs/package.json | 24 +- .../basic-server-vanillajs/server-utils.ts | 68 + examples/basic-server-vanillajs/server.ts | 45 +- .../src/server-utils.ts | 110 - examples/basic-server-vue/package.json | 25 +- examples/basic-server-vue/server-utils.ts | 68 + examples/basic-server-vue/server.ts | 19 +- examples/basic-server-vue/src/server-utils.ts | 110 - examples/budget-allocator-server/package.json | 24 +- .../budget-allocator-server/server-utils.ts | 68 + examples/budget-allocator-server/server.ts | 24 +- .../src/server-utils.ts | 110 - examples/cohort-heatmap-server/package.json | 24 +- .../cohort-heatmap-server/server-utils.ts | 68 + examples/cohort-heatmap-server/server.ts | 19 +- .../cohort-heatmap-server/src/server-utils.ts | 110 - .../customer-segmentation-server/package.json | 24 +- .../server-utils.ts | 68 + .../customer-segmentation-server/server.ts | 25 +- .../src/server-utils.ts | 110 - examples/integration-server/server-utils.ts | 68 + examples/integration-server/server.ts | 42 +- .../integration-server/src/server-utils.ts | 110 - examples/scenario-modeler-server/package.json | 24 +- .../scenario-modeler-server/server-utils.ts | 68 + examples/scenario-modeler-server/server.ts | 27 +- .../src/server-utils.ts | 110 - examples/sheet-music-server/package.json | 32 +- examples/sheet-music-server/server-utils.ts | 68 + examples/sheet-music-server/server.ts | 17 +- .../sheet-music-server/src/server-utils.ts | 110 - examples/system-monitor-server/package.json | 24 +- .../system-monitor-server/server-utils.ts | 68 + examples/system-monitor-server/server.ts | 19 +- .../system-monitor-server/src/server-utils.ts | 110 - examples/threejs-server/package.json | 24 +- examples/threejs-server/server-utils.ts | 68 + examples/threejs-server/server.ts | 20 +- examples/threejs-server/src/server-utils.ts | 110 - examples/video-resource-server/package.json | 25 +- .../video-resource-server/server-utils.ts | 68 + examples/video-resource-server/server.ts | 11 +- .../video-resource-server/src/server-utils.ts | 110 - examples/wiki-explorer-server/package.json | 24 +- examples/wiki-explorer-server/server-utils.ts | 68 + examples/wiki-explorer-server/server.ts | 19 +- .../wiki-explorer-server/src/server-utils.ts | 110 - package-lock.json | 2000 +++++++++++------ package.json | 1 + src/generated/schema.json | 654 +++++- .../servers.spec.ts-snapshots/basic-react.png | Bin 51482 -> 46545 bytes .../basic-vanillajs.png | Bin 50405 -> 47385 bytes 70 files changed, 3581 insertions(+), 2730 deletions(-) create mode 100644 examples/basic-server-preact/server-utils.ts delete mode 100644 examples/basic-server-preact/src/server-utils.ts create mode 100644 examples/basic-server-react/server-utils.ts delete mode 100644 examples/basic-server-react/src/server-utils.ts create mode 100644 examples/basic-server-solid/server-utils.ts delete mode 100644 examples/basic-server-solid/src/server-utils.ts create mode 100644 examples/basic-server-svelte/server-utils.ts delete mode 100644 examples/basic-server-svelte/src/server-utils.ts create mode 100644 examples/basic-server-vanillajs/server-utils.ts delete mode 100644 examples/basic-server-vanillajs/src/server-utils.ts create mode 100644 examples/basic-server-vue/server-utils.ts delete mode 100644 examples/basic-server-vue/src/server-utils.ts create mode 100644 examples/budget-allocator-server/server-utils.ts delete mode 100644 examples/budget-allocator-server/src/server-utils.ts create mode 100644 examples/cohort-heatmap-server/server-utils.ts delete mode 100644 examples/cohort-heatmap-server/src/server-utils.ts create mode 100644 examples/customer-segmentation-server/server-utils.ts delete mode 100644 examples/customer-segmentation-server/src/server-utils.ts create mode 100644 examples/integration-server/server-utils.ts delete mode 100644 examples/integration-server/src/server-utils.ts create mode 100644 examples/scenario-modeler-server/server-utils.ts delete mode 100644 examples/scenario-modeler-server/src/server-utils.ts create mode 100644 examples/sheet-music-server/server-utils.ts delete mode 100644 examples/sheet-music-server/src/server-utils.ts create mode 100644 examples/system-monitor-server/server-utils.ts delete mode 100644 examples/system-monitor-server/src/server-utils.ts create mode 100644 examples/threejs-server/server-utils.ts delete mode 100644 examples/threejs-server/src/server-utils.ts create mode 100644 examples/video-resource-server/server-utils.ts delete mode 100644 examples/video-resource-server/src/server-utils.ts create mode 100644 examples/wiki-explorer-server/server-utils.ts delete mode 100644 examples/wiki-explorer-server/src/server-utils.ts diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index c30a965..325a838 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -83,3 +83,47 @@ jobs: - run: npm publish --provenance --access public ${{ steps.npm-tag.outputs.tag }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_SECRET }} + + publish-examples: + runs-on: ubuntu-latest + if: github.event_name == 'release' + environment: Release + needs: [publish] + + permissions: + contents: read + id-token: write + + strategy: + fail-fast: false + matrix: + example: + - basic-server-react + - basic-server-vanillajs + - budget-allocator-server + - cohort-heatmap-server + - customer-segmentation-server + - scenario-modeler-server + - system-monitor-server + - threejs-server + - wiki-explorer-server + + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + - uses: actions/setup-node@v4 + with: + node-version: "22" + cache: npm + registry-url: "https://registry.npmjs.org" + - run: npm ci + + - name: Build example + run: npm run build --workspace examples/${{ matrix.example }} + + - name: Publish example + run: npm publish --workspace examples/${{ matrix.example }} --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_SECRET }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d1614b1..4174e6f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,4 +20,16 @@ jobs: cache: npm - run: npm ci - run: npm run build - - run: npx pkg-pr-new publish + - run: npm run examples:build + - run: | + npx pkg-pr-new publish \ + . \ + ./examples/basic-server-react \ + ./examples/basic-server-vanillajs \ + ./examples/budget-allocator-server \ + ./examples/cohort-heatmap-server \ + ./examples/customer-segmentation-server \ + ./examples/scenario-modeler-server \ + ./examples/system-monitor-server \ + ./examples/threejs-server \ + ./examples/wiki-explorer-server diff --git a/examples/basic-server-preact/package.json b/examples/basic-server-preact/package.json index a7f5dd0..47fdc03 100644 --- a/examples/basic-server-preact/package.json +++ b/examples/basic-server-preact/package.json @@ -1,17 +1,30 @@ { - "name": "basic-server-preact", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-basic-preact", + "version": "0.1.0", "type": "module", + "description": "Basic MCP App Server example using Preact", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/basic-server-preact" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "preact": "^10.0.0", "zod": "^4.1.13" @@ -23,7 +36,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/basic-server-preact/server-utils.ts b/examples/basic-server-preact/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/basic-server-preact/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/basic-server-preact/server.ts b/examples/basic-server-preact/server.ts index ce0d71b..2f4af3d 100644 --- a/examples/basic-server-preact/server.ts +++ b/examples/basic-server-preact/server.ts @@ -1,9 +1,10 @@ -import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { startServer } from "./src/server-utils.js"; +import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -55,4 +56,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Basic MCP App Server (Preact)" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/basic-server-preact/src/server-utils.ts b/examples/basic-server-preact/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/basic-server-preact/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/basic-server-react/package.json b/examples/basic-server-react/package.json index 5927040..0918555 100644 --- a/examples/basic-server-react/package.json +++ b/examples/basic-server-react/package.json @@ -1,17 +1,30 @@ { - "name": "basic-server-react", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-basic-react", + "version": "0.1.0", "type": "module", + "description": "Basic MCP App Server example using React", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/basic-server-react" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -26,6 +39,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/basic-server-react/server-utils.ts b/examples/basic-server-react/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/basic-server-react/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/basic-server-react/server.ts b/examples/basic-server-react/server.ts index 6d048da..21be751 100644 --- a/examples/basic-server-react/server.ts +++ b/examples/basic-server-react/server.ts @@ -1,53 +1,45 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); /** * Creates a new MCP server instance with tools and resources registered. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Basic MCP App Server (React)", version: "1.0.0", }); - // Two-part registration: tool + resource, tied together by the resource URI. const resourceUri = "ui://get-time/mcp-app.html"; - // Register a tool with UI metadata. When the host calls this tool, it reads - // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render - // as an interactive UI. registerAppTool(server, "get-time", { title: "Get Time", - description: "Returns the current server time as an ISO 8601 string.", + description: "Returns the current server time.", inputSchema: {}, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { - const time = new Date().toISOString(); - return { content: [{ type: "text", text: time }] }; + return { content: [{ type: "text", text: new Date().toISOString() }] }; }, ); - // Register the resource, which returns the bundled HTML/JavaScript for the UI. registerAppResource(server, resourceUri, resourceUri, { mimeType: RESOURCE_MIME_TYPE }, async (): Promise => { const html = await fs.readFile(path.join(DIST_DIR, "mcp-app.html"), "utf-8"); - return { - contents: [ - { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, - ], + contents: [{ uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }], }; }, ); @@ -55,4 +47,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Basic MCP App Server (React)" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/basic-server-react/src/server-utils.ts b/examples/basic-server-react/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/basic-server-react/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/basic-server-solid/package.json b/examples/basic-server-solid/package.json index da875b8..f943ee1 100644 --- a/examples/basic-server-solid/package.json +++ b/examples/basic-server-solid/package.json @@ -1,17 +1,30 @@ { - "name": "basic-server-solid", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-basic-solid", + "version": "0.1.0", "type": "module", + "description": "Basic MCP App Server example using Solid", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/basic-server-solid" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "solid-js": "^1.9.0", "zod": "^4.1.13" @@ -22,7 +35,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/basic-server-solid/server-utils.ts b/examples/basic-server-solid/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/basic-server-solid/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/basic-server-solid/server.ts b/examples/basic-server-solid/server.ts index b7ede98..902649c 100644 --- a/examples/basic-server-solid/server.ts +++ b/examples/basic-server-solid/server.ts @@ -1,9 +1,10 @@ -import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { startServer } from "./src/server-utils.js"; +import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -55,4 +56,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Basic MCP App Server (Solid)" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/basic-server-solid/src/server-utils.ts b/examples/basic-server-solid/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/basic-server-solid/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/basic-server-svelte/package.json b/examples/basic-server-svelte/package.json index 88f695a..c1b165e 100644 --- a/examples/basic-server-svelte/package.json +++ b/examples/basic-server-svelte/package.json @@ -1,17 +1,30 @@ { - "name": "basic-server-svelte", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-basic-svelte", + "version": "0.1.0", "type": "module", + "description": "Basic MCP App Server example using Svelte", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/basic-server-svelte" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "svelte": "^5.0.0", "zod": "^4.1.13" @@ -23,6 +36,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/basic-server-svelte/server-utils.ts b/examples/basic-server-svelte/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/basic-server-svelte/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/basic-server-svelte/server.ts b/examples/basic-server-svelte/server.ts index 45f8641..a9c2f4a 100644 --- a/examples/basic-server-svelte/server.ts +++ b/examples/basic-server-svelte/server.ts @@ -1,9 +1,10 @@ -import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { startServer } from "./src/server-utils.js"; +import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -55,4 +56,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Basic MCP App Server (Svelte)" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/basic-server-svelte/src/server-utils.ts b/examples/basic-server-svelte/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/basic-server-svelte/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/basic-server-vanillajs/package.json b/examples/basic-server-vanillajs/package.json index 5bc5a71..aba360f 100644 --- a/examples/basic-server-vanillajs/package.json +++ b/examples/basic-server-vanillajs/package.json @@ -1,17 +1,30 @@ { - "name": "basic-server-vanillajs", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-basic-vanillajs", + "version": "0.1.0", "type": "module", + "description": "Basic MCP App Server example using vanilla JavaScript", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/basic-server-vanillajs" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -21,6 +34,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/basic-server-vanillajs/server-utils.ts b/examples/basic-server-vanillajs/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/basic-server-vanillajs/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index a756b29..2717fc3 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -1,52 +1,55 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); +const RESOURCE_URI = "ui://get-time/mcp-app.html"; /** * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Basic MCP App Server (Vanilla JS)", version: "1.0.0", }); - // Two-part registration: tool + resource, tied together by the resource URI. - const resourceUri = "ui://get-time/mcp-app.html"; - - // Register a tool with UI metadata. When the host calls this tool, it reads - // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render - // as an interactive UI. + // MCP Apps require two-part registration: a tool (what the LLM calls) and a + // resource (the UI it renders). The `_meta` field on the tool links to the + // resource URI, telling hosts which UI to display when the tool executes. registerAppTool(server, "get-time", { title: "Get Time", description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async (): Promise => { const time = new Date().toISOString(); - return { content: [{ type: "text", text: time }] }; + return { + content: [{ type: "text", text: JSON.stringify({ time }) }], + }; }, ); - // Register the resource, which returns the bundled HTML/JavaScript for the UI. registerAppResource(server, - resourceUri, - resourceUri, + RESOURCE_URI, + RESOURCE_URI, { mimeType: RESOURCE_MIME_TYPE }, async (): Promise => { const html = await fs.readFile(path.join(DIST_DIR, "mcp-app.html"), "utf-8"); return { contents: [ - { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, + // Per the MCP App specification, "text/html;profile=mcp-app" signals + // to the Host that this resource is indeed for an MCP App UI. + { uri: RESOURCE_URI, mimeType: RESOURCE_MIME_TYPE, text: html }, ], }; }, @@ -55,4 +58,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3102", 10); + await startServer(createServer, { port, name: "Basic MCP App Server (Vanilla JS)" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/basic-server-vanillajs/src/server-utils.ts b/examples/basic-server-vanillajs/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/basic-server-vanillajs/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/basic-server-vue/package.json b/examples/basic-server-vue/package.json index d1719fc..6e8ae8c 100644 --- a/examples/basic-server-vue/package.json +++ b/examples/basic-server-vue/package.json @@ -1,17 +1,30 @@ { - "name": "basic-server-vue", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-basic-vue", + "version": "0.1.0", "type": "module", + "description": "Basic MCP App Server example using Vue", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/basic-server-vue" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "vue": "^3.5.0", "zod": "^4.1.13" @@ -23,7 +36,7 @@ "@vitejs/plugin-vue": "^5.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/basic-server-vue/server-utils.ts b/examples/basic-server-vue/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/basic-server-vue/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/basic-server-vue/server.ts b/examples/basic-server-vue/server.ts index 6f00912..dcb0831 100644 --- a/examples/basic-server-vue/server.ts +++ b/examples/basic-server-vue/server.ts @@ -1,9 +1,10 @@ -import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { startServer } from "./src/server-utils.js"; +import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -55,4 +56,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Basic MCP App Server (Vue)" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/basic-server-vue/src/server-utils.ts b/examples/basic-server-vue/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/basic-server-vue/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/budget-allocator-server/package.json b/examples/budget-allocator-server/package.json index 86a9510..b353042 100644 --- a/examples/budget-allocator-server/package.json +++ b/examples/budget-allocator-server/package.json @@ -1,8 +1,20 @@ { - "name": "budget-allocator-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-budget-allocator", + "version": "0.1.0", "type": "module", + "description": "Budget allocator MCP App Server with interactive visualization", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/budget-allocator-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -25,6 +38,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/budget-allocator-server/server-utils.ts b/examples/budget-allocator-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/budget-allocator-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/budget-allocator-server/server.ts b/examples/budget-allocator-server/server.ts index 2796fa7..3b780d1 100755 --- a/examples/budget-allocator-server/server.ts +++ b/examples/budget-allocator-server/server.ts @@ -5,6 +5,7 @@ * and industry benchmarks by company stage. */ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, @@ -18,7 +19,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -231,8 +232,9 @@ const resourceUri = "ui://budget-allocator/mcp-app.html"; /** * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Budget Allocator Server", version: "1.0.0", @@ -305,4 +307,20 @@ function createServer(): McpServer { return server; } -startServer(createServer); +// --------------------------------------------------------------------------- +// Server Startup +// --------------------------------------------------------------------------- + +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3103", 10); + await startServer(createServer, { port, name: "Budget Allocator Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/budget-allocator-server/src/server-utils.ts b/examples/budget-allocator-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/budget-allocator-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/cohort-heatmap-server/package.json b/examples/cohort-heatmap-server/package.json index aff8000..ebe5dfd 100644 --- a/examples/cohort-heatmap-server/package.json +++ b/examples/cohort-heatmap-server/package.json @@ -1,8 +1,20 @@ { - "name": "cohort-heatmap-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-cohort-heatmap", + "version": "0.1.0", "type": "module", + "description": "Cohort heatmap MCP App Server for retention analysis", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/cohort-heatmap-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -29,6 +42,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/cohort-heatmap-server/server-utils.ts b/examples/cohort-heatmap-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/cohort-heatmap-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/cohort-heatmap-server/server.ts b/examples/cohort-heatmap-server/server.ts index 4c26243..ccbe408 100644 --- a/examples/cohort-heatmap-server/server.ts +++ b/examples/cohort-heatmap-server/server.ts @@ -1,4 +1,5 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; @@ -9,7 +10,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -151,7 +152,7 @@ function generateCohortData( }; } -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Cohort Heatmap Server", version: "1.0.0", @@ -210,4 +211,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3104", 10); + await startServer(createServer, { port, name: "Cohort Heatmap Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/cohort-heatmap-server/src/server-utils.ts b/examples/cohort-heatmap-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/cohort-heatmap-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/customer-segmentation-server/package.json b/examples/customer-segmentation-server/package.json index b8b7f19..ec9551b 100644 --- a/examples/customer-segmentation-server/package.json +++ b/examples/customer-segmentation-server/package.json @@ -1,8 +1,20 @@ { - "name": "customer-segmentation-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-customer-segmentation", + "version": "0.1.0", "type": "module", + "description": "Customer segmentation MCP App Server with filtering", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/customer-segmentation-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -25,6 +38,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/customer-segmentation-server/server-utils.ts b/examples/customer-segmentation-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/customer-segmentation-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/customer-segmentation-server/server.ts b/examples/customer-segmentation-server/server.ts index b91ccc6..4736f61 100644 --- a/examples/customer-segmentation-server/server.ts +++ b/examples/customer-segmentation-server/server.ts @@ -1,4 +1,5 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, @@ -12,7 +13,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; import { generateCustomers, generateSegmentSummaries, @@ -29,7 +30,7 @@ const GetCustomerDataInputSchema = z.object({ .describe("Filter by segment (default: All)"), }); -// Cache generated data for consistency across requests +// Cache generated data for session consistency let cachedCustomers: Customer[] | null = null; let cachedSegments: SegmentSummary[] | null = null; @@ -57,8 +58,9 @@ function getCustomerData(segmentFilter?: string): { /** * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Customer Segmentation Server", version: "1.0.0", @@ -117,4 +119,19 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3105", 10); + await startServer(createServer, { + port, + name: "Customer Segmentation Server", + }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/customer-segmentation-server/src/server-utils.ts b/examples/customer-segmentation-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/customer-segmentation-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/integration-server/server-utils.ts b/examples/integration-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/integration-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/integration-server/server.ts b/examples/integration-server/server.ts index b9ebd3b..d2edd23 100644 --- a/examples/integration-server/server.ts +++ b/examples/integration-server/server.ts @@ -1,17 +1,18 @@ -import { - registerAppResource, - registerAppTool, - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, -} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { startServer } from "./src/server-utils.js"; +import { + registerAppTool, + registerAppResource, + RESOURCE_MIME_TYPE, + RESOURCE_URI_META_KEY, +} from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); const RESOURCE_URI = "ui://get-time/mcp-app.html"; @@ -19,7 +20,7 @@ const RESOURCE_URI = "ui://get-time/mcp-app.html"; /** * Creates a new MCP server instance with tools and resources registered. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Integration Test Server", version: "1.0.0", @@ -30,14 +31,18 @@ function createServer(): McpServer { "get-time", { title: "Get Time", - description: "Returns the current server time as an ISO 8601 string.", + description: "Returns the current server time.", inputSchema: {}, _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async (): Promise => { - const time = new Date().toISOString(); return { - content: [{ type: "text", text: JSON.stringify({ time }) }], + content: [ + { + type: "text", + text: JSON.stringify({ time: new Date().toISOString() }), + }, + ], }; }, ); @@ -52,7 +57,6 @@ function createServer(): McpServer { path.join(DIST_DIR, "mcp-app.html"), "utf-8", ); - return { contents: [ { uri: RESOURCE_URI, mimeType: RESOURCE_MIME_TYPE, text: html }, @@ -64,4 +68,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Integration Test Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/integration-server/src/server-utils.ts b/examples/integration-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/integration-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/scenario-modeler-server/package.json b/examples/scenario-modeler-server/package.json index 95c13fc..d13875c 100644 --- a/examples/scenario-modeler-server/package.json +++ b/examples/scenario-modeler-server/package.json @@ -1,8 +1,20 @@ { - "name": "scenario-modeler-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-scenario-modeler", + "version": "0.1.0", "type": "module", + "description": "Financial scenario modeling MCP App Server", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/scenario-modeler-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "react": "^19.2.0", @@ -30,6 +43,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/scenario-modeler-server/server-utils.ts b/examples/scenario-modeler-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/scenario-modeler-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/scenario-modeler-server/server.ts b/examples/scenario-modeler-server/server.ts index fc8b7f5..3ce2066 100644 --- a/examples/scenario-modeler-server/server.ts +++ b/examples/scenario-modeler-server/server.ts @@ -1,4 +1,5 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, @@ -12,7 +13,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -248,8 +249,9 @@ const DEFAULT_INPUTS: ScenarioInputs = { /** * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "SaaS Scenario Modeler", version: "1.0.0", @@ -318,4 +320,23 @@ function createServer(): McpServer { return server; } -startServer(createServer); +// ============================================================================ +// Server Startup +// ============================================================================ + +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3106", 10); + await startServer(createServer, { + port, + name: "SaaS Scenario Modeler Server", + }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/scenario-modeler-server/src/server-utils.ts b/examples/scenario-modeler-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/scenario-modeler-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/sheet-music-server/package.json b/examples/sheet-music-server/package.json index a2cd1ca..81008c5 100644 --- a/examples/sheet-music-server/package.json +++ b/examples/sheet-music-server/package.json @@ -1,20 +1,30 @@ { - "name": "sheet-music-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-sheet-music", + "version": "0.1.0", "type": "module", + "description": "MCP App Server for rendering and playing sheet music from ABC notation", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/sheet-music-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", - "serve:http": "bun server.ts", - "serve:stdio": "bun server.ts --stdio", - "start": "npm run start:http", - "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", - "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "serve": "bun server.ts", + "start": "cross-env NODE_ENV=development npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "abcjs": "^6.4.4", "zod": "^4.1.13" @@ -25,7 +35,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/sheet-music-server/server-utils.ts b/examples/sheet-music-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/sheet-music-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/sheet-music-server/server.ts b/examples/sheet-music-server/server.ts index d6da53f..88337d3 100644 --- a/examples/sheet-music-server/server.ts +++ b/examples/sheet-music-server/server.ts @@ -13,7 +13,8 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -116,4 +117,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Sheet Music Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/sheet-music-server/src/server-utils.ts b/examples/sheet-music-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/sheet-music-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/system-monitor-server/package.json b/examples/system-monitor-server/package.json index 6adfbb9..d8198d1 100644 --- a/examples/system-monitor-server/package.json +++ b/examples/system-monitor-server/package.json @@ -1,8 +1,20 @@ { - "name": "system-monitor-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-system-monitor", + "version": "0.1.0", "type": "module", + "description": "System monitor MCP App Server with real-time stats", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/system-monitor-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "systeminformation": "^5.27.11", @@ -26,6 +39,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/system-monitor-server/server-utils.ts b/examples/system-monitor-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/system-monitor-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 7530050..4cf5888 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -1,4 +1,5 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, @@ -14,7 +15,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; // Schemas - types are derived from these using z.infer const CpuCoreSchema = z.object({ @@ -106,7 +107,7 @@ async function getMemoryStats(): Promise { }; } -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "System Monitor Server", version: "1.0.0", @@ -180,4 +181,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3107", 10); + await startServer(createServer, { port, name: "System Monitor Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/system-monitor-server/src/server-utils.ts b/examples/system-monitor-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/system-monitor-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/threejs-server/package.json b/examples/threejs-server/package.json index bdc00f5..8145b8e 100644 --- a/examples/threejs-server/package.json +++ b/examples/threejs-server/package.json @@ -1,8 +1,20 @@ { - "name": "threejs-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-threejs", + "version": "0.1.0", "type": "module", + "description": "Three.js 3D visualization MCP App Server", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/threejs-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -31,6 +44,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/threejs-server/server-utils.ts b/examples/threejs-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/threejs-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/threejs-server/server.ts b/examples/threejs-server/server.ts index 8732a5f..e2f28c7 100644 --- a/examples/threejs-server/server.ts +++ b/examples/threejs-server/server.ts @@ -4,6 +4,7 @@ * Provides tools for rendering interactive 3D scenes using Three.js. */ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; @@ -14,7 +15,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -137,8 +138,9 @@ const resourceUri = "ui://threejs/mcp-app.html"; /** * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. */ -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Three.js Server", version: "1.0.0", @@ -221,4 +223,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3108", 10); + await startServer(createServer, { port, name: "Three.js Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/threejs-server/src/server-utils.ts b/examples/threejs-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/threejs-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/video-resource-server/package.json b/examples/video-resource-server/package.json index b5efd1c..1de4cac 100644 --- a/examples/video-resource-server/package.json +++ b/examples/video-resource-server/package.json @@ -1,17 +1,30 @@ { - "name": "video-resource-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-video-resource", + "version": "0.1.0", "type": "module", + "description": "MCP App Server demonstrating video resources served as base64 blobs", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/video-resource-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -21,7 +34,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", diff --git a/examples/video-resource-server/server-utils.ts b/examples/video-resource-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/video-resource-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/video-resource-server/server.ts b/examples/video-resource-server/server.ts index 2ee36bf..70effca 100644 --- a/examples/video-resource-server/server.ts +++ b/examples/video-resource-server/server.ts @@ -21,7 +21,8 @@ import { RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); const RESOURCE_URI = "ui://video-player/mcp-app.html"; @@ -123,6 +124,7 @@ ${Object.entries(VIDEO_LIBRARY) inputSchema: { videoId: z .enum(Object.keys(VIDEO_LIBRARY) as [string, ...string[]]) + .default("bunny-1mb") .describe( `Video ID to play. Available: ${Object.keys(VIDEO_LIBRARY).join(", ")}`, ), @@ -168,7 +170,12 @@ ${Object.entries(VIDEO_LIBRARY) } async function main() { - await startServer(createServer); + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "Video Resource Server" }); + } } main().catch((e) => { diff --git a/examples/video-resource-server/src/server-utils.ts b/examples/video-resource-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/video-resource-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/examples/wiki-explorer-server/package.json b/examples/wiki-explorer-server/package.json index 5c389c3..47fba40 100644 --- a/examples/wiki-explorer-server/package.json +++ b/examples/wiki-explorer-server/package.json @@ -1,8 +1,20 @@ { - "name": "wiki-explorer-server", - "version": "1.0.0", - "private": true, + "name": "@modelcontextprotocol/server-wiki-explorer", + "version": "0.1.0", "type": "module", + "description": "Wikipedia link explorer MCP App Server with graph visualization", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/wiki-explorer-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], "scripts": { "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", @@ -11,10 +23,11 @@ "start": "npm run start:http", "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", - "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "cheerio": "^1.0.0", "zod": "^4.1.13" @@ -25,6 +38,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "force-graph": "^1.49.0", "typescript": "^5.9.3", diff --git a/examples/wiki-explorer-server/server-utils.ts b/examples/wiki-explorer-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/wiki-explorer-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/wiki-explorer-server/server.ts b/examples/wiki-explorer-server/server.ts index 99670c6..063cacf 100644 --- a/examples/wiki-explorer-server/server.ts +++ b/examples/wiki-explorer-server/server.ts @@ -1,4 +1,5 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, @@ -13,7 +14,7 @@ import { registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; -import { startServer } from "./src/server-utils.js"; +import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -71,7 +72,7 @@ function extractWikiLinks(pageUrl: URL, html: string): PageInfo[] { })); } -function createServer(): McpServer { +export function createServer(): McpServer { const server = new McpServer({ name: "Wiki Explorer", version: "1.0.0", @@ -151,4 +152,16 @@ function createServer(): McpServer { return server; } -startServer(createServer); +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3109", 10); + await startServer(createServer, { port, name: "Wiki Explorer" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/wiki-explorer-server/src/server-utils.ts b/examples/wiki-explorer-server/src/server-utils.ts deleted file mode 100644 index 4052423..0000000 --- a/examples/wiki-explorer-server/src/server-utils.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Shared utilities for running MCP servers with various transports. - */ - -import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; -import cors from "cors"; -import type { Request, Response } from "express"; - -/** - * Starts an MCP server using the appropriate transport based on command-line arguments. - * - * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startServer( - createServer: () => McpServer, -): Promise { - try { - if (process.argv.includes("--stdio")) { - await startStdioServer(createServer); - } else { - await startStreamableHttpServer(createServer); - } - } catch (e) { - console.error(e); - process.exit(1); - } -} - -/** - * Starts an MCP server with stdio transport. - * - * @param createServer - Factory function that creates a new McpServer instance. - */ -export async function startStdioServer( - createServer: () => McpServer, -): Promise { - await createServer().connect(new StdioServerTransport()); -} - -/** - * Starts an MCP server with Streamable HTTP transport in stateless mode. - * - * Each request creates a fresh server and transport instance, which are - * closed when the response ends (no session tracking). - * - * The server listens on the port specified by the PORT environment variable, - * defaulting to 3001 if not set. - * - * @param createServer - Factory function that creates a new McpServer instance per request. - */ -export async function startStreamableHttpServer( - createServer: () => McpServer, -): Promise { - const port = parseInt(process.env.PORT ?? "3001", 10); - - // Express app - bind to all interfaces for development/testing - const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); - expressApp.use(cors()); - - expressApp.all("/mcp", async (req: Request, res: Response) => { - // Create fresh server and transport for each request (stateless mode) - const server = createServer(); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: undefined, - }); - - // Clean up when response ends - res.on("close", () => { - transport.close().catch(() => {}); - server.close().catch(() => {}); - }); - - try { - await server.connect(transport); - await transport.handleRequest(req, res, req.body); - } catch (error) { - console.error("MCP error:", error); - if (!res.headersSent) { - res.status(500).json({ - jsonrpc: "2.0", - error: { code: -32603, message: "Internal server error" }, - id: null, - }); - } - } - }); - - const { promise, resolve, reject } = Promise.withResolvers(); - - const httpServer = expressApp.listen(port, (err?: Error) => { - if (err) return reject(err); - console.log(`Server listening on http://localhost:${port}/mcp`); - resolve(); - }); - - const shutdown = () => { - console.log("\nShutting down..."); - httpServer.close(() => process.exit(0)); - }; - - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - - return promise; -} diff --git a/package-lock.json b/package-lock.json index 467deeb..ad85c00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "@rollup/rollup-darwin-x64": "^4.53.3", "@rollup/rollup-linux-arm64-gnu": "^4.53.3", "@rollup/rollup-linux-x64-gnu": "^4.53.3", + "@rollup/rollup-win32-arm64-msvc": "^4.53.3", "@rollup/rollup-win32-x64-msvc": "^4.53.3" }, "peerDependencies": { @@ -94,7 +95,9 @@ } }, "examples/basic-host/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -103,13 +106,17 @@ }, "examples/basic-host/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" }, "examples/basic-server-preact": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-basic-preact", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "preact": "^10.0.0", "zod": "^4.1.13" @@ -121,7 +128,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -138,25 +145,6 @@ "undici-types": "~6.21.0" } }, - "examples/basic-server-preact/node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "examples/basic-server-preact/node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -165,9 +153,11 @@ "license": "MIT" }, "examples/basic-server-react": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-basic-react", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -182,6 +172,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -189,7 +180,9 @@ } }, "examples/basic-server-react/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -198,13 +191,17 @@ }, "examples/basic-server-react/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" }, "examples/basic-server-solid": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-basic-solid", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "solid-js": "^1.9.0", "zod": "^4.1.13" @@ -215,7 +212,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -233,25 +230,6 @@ "undici-types": "~6.21.0" } }, - "examples/basic-server-solid/node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "examples/basic-server-solid/node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -260,9 +238,11 @@ "license": "MIT" }, "examples/basic-server-svelte": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-basic-svelte", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "svelte": "^5.0.0", "zod": "^4.1.13" @@ -274,6 +254,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -298,9 +279,11 @@ "license": "MIT" }, "examples/basic-server-vanillajs": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-basic-vanillajs", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -310,6 +293,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -317,7 +301,9 @@ } }, "examples/basic-server-vanillajs/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -326,13 +312,17 @@ }, "examples/basic-server-vanillajs/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" }, "examples/basic-server-vue": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-basic-vue", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "vue": "^3.5.0", "zod": "^4.1.13" @@ -344,7 +334,7 @@ "@vitejs/plugin-vue": "^5.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -361,25 +351,6 @@ "undici-types": "~6.21.0" } }, - "examples/basic-server-vue/node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "examples/basic-server-vue/node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -388,9 +359,11 @@ "license": "MIT" }, "examples/budget-allocator-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-budget-allocator", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -401,6 +374,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -408,7 +382,9 @@ } }, "examples/budget-allocator-server/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -417,13 +393,17 @@ }, "examples/budget-allocator-server/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" }, "examples/cohort-heatmap-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-cohort-heatmap", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -438,6 +418,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -445,7 +426,9 @@ } }, "examples/cohort-heatmap-server/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -454,13 +437,17 @@ }, "examples/cohort-heatmap-server/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" }, "examples/customer-segmentation-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-customer-segmentation", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -471,6 +458,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -478,7 +466,9 @@ } }, "examples/customer-segmentation-server/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -487,6 +477,8 @@ }, "examples/customer-segmentation-server/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" }, @@ -516,6 +508,8 @@ }, "examples/integration-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -524,13 +518,17 @@ }, "examples/integration-server/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" }, "examples/scenario-modeler-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-scenario-modeler", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "react": "^19.2.0", @@ -546,6 +544,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -553,7 +552,9 @@ } }, "examples/scenario-modeler-server/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -562,13 +563,17 @@ }, "examples/scenario-modeler-server/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" }, "examples/sheet-music-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-sheet-music", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "abcjs": "^6.4.4", "zod": "^4.1.13" @@ -579,7 +584,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -596,25 +601,6 @@ "undici-types": "~6.21.0" } }, - "examples/sheet-music-server/node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "examples/sheet-music-server/node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -623,9 +609,11 @@ "license": "MIT" }, "examples/system-monitor-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-system-monitor", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "systeminformation": "^5.27.11", @@ -637,6 +625,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -644,7 +633,9 @@ } }, "examples/system-monitor-server/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -653,13 +644,17 @@ }, "examples/system-monitor-server/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" }, "examples/threejs-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-threejs", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -676,6 +671,7 @@ "@vitejs/plugin-react": "^4.3.4", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -683,7 +679,9 @@ } }, "examples/threejs-server/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -692,13 +690,17 @@ }, "examples/threejs-server/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" }, "examples/video-resource-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-video-resource", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -708,7 +710,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "express": "^5.1.0", "typescript": "^5.9.3", "vite": "^6.0.0", @@ -725,25 +727,6 @@ "undici-types": "~6.21.0" } }, - "examples/video-resource-server/node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "examples/video-resource-server/node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -752,9 +735,11 @@ "license": "MIT" }, "examples/wiki-explorer-server": { - "version": "1.0.0", + "name": "@modelcontextprotocol/server-wiki-explorer", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/ext-apps": "^0.2.2", "@modelcontextprotocol/sdk": "^1.24.0", "cheerio": "^1.0.0", "zod": "^4.1.13" @@ -765,6 +750,7 @@ "@types/node": "^22.0.0", "concurrently": "^9.2.1", "cors": "^2.8.5", + "cross-env": "^10.1.0", "express": "^5.1.0", "force-graph": "^1.49.0", "typescript": "^5.9.3", @@ -773,7 +759,9 @@ } }, "examples/wiki-explorer-server/node_modules/@types/node": { - "version": "22.19.2", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -782,11 +770,15 @@ }, "examples/wiki-explorer-server/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/@babel/code-frame": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -800,6 +792,8 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -808,9 +802,10 @@ }, "node_modules/@babel/core": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -838,6 +833,8 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -846,6 +843,8 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -874,6 +873,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -889,6 +890,8 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -897,6 +900,8 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { @@ -905,6 +910,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -917,6 +924,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { @@ -933,6 +942,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -941,6 +952,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -948,6 +961,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -955,6 +970,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -963,6 +980,8 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -975,6 +994,8 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -1040,6 +1061,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -1054,6 +1077,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1068,6 +1093,8 @@ }, "node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -1081,6 +1108,8 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1098,6 +1127,8 @@ }, "node_modules/@babel/types": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1109,6 +1140,8 @@ }, "node_modules/@clack/core": { "version": "1.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.0-alpha.4.tgz", + "integrity": "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg==", "dev": true, "license": "MIT", "dependencies": { @@ -1118,6 +1151,8 @@ }, "node_modules/@clack/prompts": { "version": "1.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.0-alpha.4.tgz", + "integrity": "sha512-KnmtDF2xQGoI5AlBme9akHtvCRV0RKAARUXHBQO2tMwnY8B08/4zPWigT7uLK25UPrMCEqnyQPkKRjNdhPbf8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1128,11 +1163,15 @@ }, "node_modules/@dimforge/rapier3d-compat": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", "dev": true, "license": "Apache-2.0" }, "node_modules/@epic-web/invariant": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, @@ -1410,6 +1449,8 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -1577,19 +1618,35 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.19.0", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.21.0.tgz", + "integrity": "sha512-9PrsT5DjZA+w3lur/aOIx3FlDeHdyCEFlv9U+fmsVyjPZh61G5SYURQ/1ebe2U63KbDmI2V8IhIUegWb8hjOyg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.19.0", - "@shikijs/langs": "^3.19.0", - "@shikijs/themes": "^3.19.0", - "@shikijs/types": "^3.19.0", + "@shikijs/engine-oniguruma": "^3.21.0", + "@shikijs/langs": "^3.21.0", + "@shikijs/themes": "^3.21.0", + "@shikijs/types": "^3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, + "node_modules/@hono/node-server": { + "version": "1.19.7", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz", + "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1598,6 +1655,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1606,6 +1665,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1613,10 +1674,14 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1625,6 +1690,8 @@ }, "node_modules/@kurkle/color": { "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, "node_modules/@modelcontextprotocol/ext-apps": { @@ -1636,9 +1703,12 @@ "link": true }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.24.3", + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", + "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", "license": "MIT", "dependencies": { + "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -1649,6 +1719,7 @@ "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", @@ -1670,8 +1741,70 @@ } } }, + "node_modules/@modelcontextprotocol/server-basic-preact": { + "resolved": "examples/basic-server-preact", + "link": true + }, + "node_modules/@modelcontextprotocol/server-basic-react": { + "resolved": "examples/basic-server-react", + "link": true + }, + "node_modules/@modelcontextprotocol/server-basic-solid": { + "resolved": "examples/basic-server-solid", + "link": true + }, + "node_modules/@modelcontextprotocol/server-basic-svelte": { + "resolved": "examples/basic-server-svelte", + "link": true + }, + "node_modules/@modelcontextprotocol/server-basic-vanillajs": { + "resolved": "examples/basic-server-vanillajs", + "link": true + }, + "node_modules/@modelcontextprotocol/server-basic-vue": { + "resolved": "examples/basic-server-vue", + "link": true + }, + "node_modules/@modelcontextprotocol/server-budget-allocator": { + "resolved": "examples/budget-allocator-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-cohort-heatmap": { + "resolved": "examples/cohort-heatmap-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-customer-segmentation": { + "resolved": "examples/customer-segmentation-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-scenario-modeler": { + "resolved": "examples/scenario-modeler-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-sheet-music": { + "resolved": "examples/sheet-music-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-system-monitor": { + "resolved": "examples/system-monitor-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-threejs": { + "resolved": "examples/threejs-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-video-resource": { + "resolved": "examples/video-resource-server", + "link": true + }, + "node_modules/@modelcontextprotocol/server-wiki-explorer": { + "resolved": "examples/wiki-explorer-server", + "link": true + }, "node_modules/@oclif/core": { "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.8.0.tgz", + "integrity": "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1700,6 +1833,8 @@ }, "node_modules/@oclif/core/node_modules/brace-expansion": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1708,6 +1843,8 @@ }, "node_modules/@oclif/core/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -1787,6 +1924,8 @@ }, "node_modules/@oven/bun-linux-x64": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.3.5.tgz", + "integrity": "sha512-n7zhKTSDZS0yOYg5Rq8easZu5Y/o47sv0c7yGr2ciFdcie9uYV55fZ7QMqhWMGK33ezCSikh5EDkUMCIvfWpjA==", "cpu": [ "x64" ], @@ -1798,6 +1937,8 @@ }, "node_modules/@oven/bun-linux-x64-baseline": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.3.5.tgz", + "integrity": "sha512-FeCQyBU62DMuB0nn01vPnf3McXrKOsrK9p7sHaBFYycw0mmoU8kCq/WkBkGMnLuvQljJSyen8QBTx+fXdNupWg==", "cpu": [ "x64" ], @@ -1809,6 +1950,8 @@ }, "node_modules/@oven/bun-linux-x64-musl": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.3.5.tgz", + "integrity": "sha512-XkCCHkByYn8BIDvoxnny898znju4xnW2kvFE8FT5+0Y62cWdcBGMZ9RdsEUTeRz16k8hHtJpaSfLcEmNTFIwRQ==", "cpu": [ "x64" ], @@ -1820,6 +1963,8 @@ }, "node_modules/@oven/bun-linux-x64-musl-baseline": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.3.5.tgz", + "integrity": "sha512-TJiYC7KCr0XxFTsxgwQOeE7dncrEL/RSyL0EzSL3xRkrxJMWBCvCSjQn7LV1i6T7hFst0+3KoN3VWvD5BinqHA==", "cpu": [ "x64" ], @@ -1857,6 +2002,8 @@ }, "node_modules/@playwright/test": { "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1934,6 +2081,8 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, @@ -1958,38 +2107,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", - "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", "cpu": [ "arm64" ], @@ -2000,9 +2121,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", - "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", "cpu": [ "x64" ], @@ -2012,66 +2133,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", - "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", "cpu": [ "arm64" ], @@ -2081,92 +2146,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", "cpu": [ "x64" ], @@ -2176,70 +2159,13 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", "cpu": [ "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2247,9 +2173,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", - "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", "cpu": [ "x64" ], @@ -2260,32 +2186,40 @@ ] }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.19.0", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz", + "integrity": "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.19.0", + "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.19.0", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.21.0.tgz", + "integrity": "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.19.0" + "@shikijs/types": "3.21.0" } }, "node_modules/@shikijs/themes": { - "version": "3.19.0", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.21.0.tgz", + "integrity": "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.19.0" + "@shikijs/types": "3.21.0" } }, "node_modules/@shikijs/types": { - "version": "3.19.0", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.21.0.tgz", + "integrity": "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==", "dev": true, "license": "MIT", "dependencies": { @@ -2295,6 +2229,8 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, @@ -2313,7 +2249,6 @@ "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", @@ -2350,11 +2285,15 @@ }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2367,6 +2306,8 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2375,6 +2316,8 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2384,6 +2327,8 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2392,6 +2337,8 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2400,15 +2347,19 @@ } }, "node_modules/@types/bun": { - "version": "1.3.3", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.5.tgz", + "integrity": "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==", "dev": true, "license": "MIT", "dependencies": { - "bun-types": "1.3.3" + "bun-types": "1.3.5" } }, "node_modules/@types/chai": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -2418,6 +2369,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -2426,6 +2379,8 @@ }, "node_modules/@types/cors": { "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -2434,15 +2389,21 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -2453,6 +2414,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dev": true, "license": "MIT", "dependencies": { @@ -2464,6 +2427,8 @@ }, "node_modules/@types/hast": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2472,39 +2437,49 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.1", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@types/qs": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2513,6 +2488,8 @@ }, "node_modules/@types/send": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2521,6 +2498,8 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2530,11 +2509,15 @@ }, "node_modules/@types/stats.js": { "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", "dev": true, "license": "MIT" }, "node_modules/@types/three": { "version": "0.181.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz", + "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==", "dev": true, "license": "MIT", "dependencies": { @@ -2549,16 +2532,22 @@ }, "node_modules/@types/unist": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/webxr": { "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", "dev": true, "license": "MIT" }, "node_modules/@typescript/vfs": { "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz", + "integrity": "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==", "dev": true, "license": "MIT", "dependencies": { @@ -2570,6 +2559,8 @@ }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { @@ -2603,6 +2594,8 @@ }, "node_modules/@vitest/expect": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { @@ -2618,6 +2611,8 @@ }, "node_modules/@vitest/mocker": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2643,6 +2638,8 @@ }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -2654,6 +2651,8 @@ }, "node_modules/@vitest/runner": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2667,6 +2666,8 @@ }, "node_modules/@vitest/snapshot": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2680,6 +2681,8 @@ }, "node_modules/@vitest/spy": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -2691,6 +2694,8 @@ }, "node_modules/@vitest/utils": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { @@ -2827,14 +2832,16 @@ "license": "MIT" }, "node_modules/@webgpu/types": { - "version": "0.1.67", + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.68.tgz", + "integrity": "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/abcjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/abcjs/-/abcjs-6.5.2.tgz", - "integrity": "sha512-XLDZPy/4TZbOqPsLwuu0Umsl79NTAcObEkboPxdYZXI8/fU6PNh59SAnkZOnEPVbyT8EXfBUjgNoe/uKd3T0xQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/abcjs/-/abcjs-6.6.0.tgz", + "integrity": "sha512-lYS+qwOOxFcFY5ZjNmS1l4RT6BxGd2juBOzLD5/PfLZ+jd0zz29CMI/SwxCWb0+cdKjTBc/EHO43lUGB93FaAw==", "license": "MIT", "funding": { "type": "github", @@ -2843,6 +2850,8 @@ }, "node_modules/accepts": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -2854,6 +2863,8 @@ }, "node_modules/accessor-fn": { "version": "1.5.3", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", + "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", "dev": true, "license": "MIT", "engines": { @@ -2865,7 +2876,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2875,6 +2885,8 @@ }, "node_modules/ajv": { "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2889,6 +2901,8 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -2904,6 +2918,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2918,6 +2934,8 @@ }, "node_modules/ansi-regex": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -2929,6 +2947,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -2943,6 +2963,8 @@ }, "node_modules/ansis": { "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", "dev": true, "license": "ISC", "engines": { @@ -2951,6 +2973,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -2963,6 +2987,8 @@ }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, @@ -2977,6 +3003,8 @@ }, "node_modules/assertion-error": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -2985,6 +3013,8 @@ }, "node_modules/async": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, @@ -3058,43 +3088,25 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.4", + "version": "2.9.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.13.tgz", + "integrity": "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==", "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/basic-server-preact": { - "resolved": "examples/basic-server-preact", - "link": true - }, - "node_modules/basic-server-react": { - "resolved": "examples/basic-server-react", - "link": true - }, - "node_modules/basic-server-solid": { - "resolved": "examples/basic-server-solid", - "link": true - }, - "node_modules/basic-server-svelte": { - "resolved": "examples/basic-server-svelte", - "link": true - }, - "node_modules/basic-server-vanillajs": { - "resolved": "examples/basic-server-vanillajs", - "link": true - }, - "node_modules/basic-server-vue": { - "resolved": "examples/basic-server-vue", - "link": true - }, "node_modules/bezier-js": { "version": "6.1.4", + "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", + "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "dev": true, "license": "MIT", "funding": { @@ -3104,6 +3116,8 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -3114,7 +3128,9 @@ } }, "node_modules/body-parser": { - "version": "2.2.1", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -3123,7 +3139,7 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.0", + "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" }, @@ -3137,10 +3153,14 @@ }, "node_modules/boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3150,6 +3170,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -3161,6 +3183,8 @@ }, "node_modules/browserslist": { "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -3177,7 +3201,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3192,12 +3215,10 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/budget-allocator-server": { - "resolved": "examples/budget-allocator-server", - "link": true - }, "node_modules/bun-types": { - "version": "1.3.3", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.5.tgz", + "integrity": "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==", "dev": true, "license": "MIT", "dependencies": { @@ -3206,6 +3227,8 @@ }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3213,6 +3236,8 @@ }, "node_modules/cac": { "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -3221,6 +3246,8 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3232,6 +3259,8 @@ }, "node_modules/call-bound": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3245,7 +3274,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001759", + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", "dev": true, "funding": [ { @@ -3265,6 +3296,8 @@ }, "node_modules/canvas-color-tracker": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", + "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -3276,6 +3309,8 @@ }, "node_modules/chai": { "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3291,6 +3326,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -3306,6 +3343,8 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -3317,6 +3356,8 @@ }, "node_modules/chart.js": { "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -3326,7 +3367,9 @@ } }, "node_modules/check-error": { - "version": "2.1.1", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", "engines": { @@ -3335,6 +3378,8 @@ }, "node_modules/cheerio": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -3358,6 +3403,8 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -3373,6 +3420,8 @@ }, "node_modules/chokidar": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3396,6 +3445,8 @@ }, "node_modules/clean-stack": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3410,6 +3461,8 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -3424,6 +3477,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -3435,6 +3490,8 @@ }, "node_modules/cli-truncate": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { @@ -3450,6 +3507,8 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3465,6 +3524,8 @@ }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3478,6 +3539,8 @@ }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -3486,6 +3549,8 @@ }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3504,12 +3569,10 @@ "node": ">=6" } }, - "node_modules/cohort-heatmap-server": { - "resolved": "examples/cohort-heatmap-server", - "link": true - }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3521,21 +3584,29 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/concurrently": { "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -3559,6 +3630,8 @@ }, "node_modules/content-disposition": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -3570,6 +3643,8 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3577,11 +3652,15 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3589,6 +3668,8 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -3596,6 +3677,8 @@ }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -3607,6 +3690,8 @@ }, "node_modules/cross-env": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -3623,6 +3708,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3635,6 +3722,8 @@ }, "node_modules/css-select": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -3649,6 +3738,8 @@ }, "node_modules/css-what": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -3659,14 +3750,14 @@ }, "node_modules/csstype": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, - "node_modules/customer-segmentation-server": { - "resolved": "examples/customer-segmentation-server", - "link": true - }, "node_modules/d3-array": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, "license": "ISC", "dependencies": { @@ -3678,11 +3769,15 @@ }, "node_modules/d3-binarytree": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", "dev": true, "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, "license": "ISC", "engines": { @@ -3691,6 +3786,8 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, "license": "ISC", "engines": { @@ -3699,6 +3796,8 @@ }, "node_modules/d3-drag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, "license": "ISC", "dependencies": { @@ -3711,6 +3810,8 @@ }, "node_modules/d3-ease": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3719,6 +3820,8 @@ }, "node_modules/d3-force-3d": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", + "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", "dev": true, "license": "MIT", "dependencies": { @@ -3734,6 +3837,8 @@ }, "node_modules/d3-format": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, "license": "ISC", "engines": { @@ -3742,6 +3847,8 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, "license": "ISC", "dependencies": { @@ -3753,11 +3860,15 @@ }, "node_modules/d3-octree": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", "dev": true, "license": "MIT" }, "node_modules/d3-quadtree": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, "license": "ISC", "engines": { @@ -3766,6 +3877,8 @@ }, "node_modules/d3-scale": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3781,6 +3894,8 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3793,15 +3908,18 @@ }, "node_modules/d3-selection": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } }, "node_modules/d3-time": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -3813,6 +3931,8 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, "license": "ISC", "dependencies": { @@ -3824,6 +3944,8 @@ }, "node_modules/d3-timer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, "license": "ISC", "engines": { @@ -3832,6 +3954,8 @@ }, "node_modules/d3-transition": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3850,6 +3974,8 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, "license": "ISC", "dependencies": { @@ -3865,6 +3991,8 @@ }, "node_modules/debug": { "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3880,6 +4008,8 @@ }, "node_modules/deep-eql": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -3898,6 +4028,8 @@ }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3911,6 +4043,8 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -3923,6 +4057,8 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -3933,6 +4069,8 @@ }, "node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -3946,6 +4084,8 @@ }, "node_modules/domutils": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -3958,6 +4098,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -3970,10 +4112,14 @@ }, "node_modules/ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3987,17 +4133,23 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.266", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4005,6 +4157,8 @@ }, "node_modules/encoding-sniffer": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -4016,6 +4170,8 @@ }, "node_modules/encoding-sniffer/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4026,6 +4182,8 @@ }, "node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -4036,6 +4194,8 @@ }, "node_modules/environment": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -4047,6 +4207,8 @@ }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4054,6 +4216,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4061,11 +4225,15 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -4076,6 +4244,8 @@ }, "node_modules/esbuild": { "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4116,6 +4286,8 @@ }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -4124,10 +4296,14 @@ }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -4154,6 +4330,8 @@ }, "node_modules/estree-walker": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -4162,6 +4340,8 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4169,11 +4349,15 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -4184,13 +4368,17 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/expect-type": { - "version": "1.2.2", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4199,8 +4387,9 @@ }, "node_modules/express": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -4241,6 +4430,8 @@ }, "node_modules/express-rate-limit": { "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { "node": ">= 16" @@ -4254,10 +4445,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -4272,11 +4467,15 @@ }, "node_modules/fflate": { "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, "license": "MIT" }, "node_modules/filelist": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4285,6 +4484,8 @@ }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4293,6 +4494,8 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -4304,6 +4507,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4315,6 +4520,8 @@ }, "node_modules/finalhandler": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -4334,6 +4541,8 @@ }, "node_modules/float-tooltip": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", + "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", "dev": true, "license": "MIT", "dependencies": { @@ -4347,6 +4556,8 @@ }, "node_modules/force-graph": { "version": "1.51.0", + "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz", + "integrity": "sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==", "dev": true, "license": "MIT", "dependencies": { @@ -4372,6 +4583,8 @@ }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4379,6 +4592,8 @@ }, "node_modules/fresh": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4389,7 +4604,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -4401,6 +4615,8 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4408,6 +4624,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -4416,6 +4634,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -4424,6 +4644,8 @@ }, "node_modules/get-east-asian-width": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -4435,6 +4657,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4457,6 +4681,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -4465,6 +4691,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -4476,6 +4704,8 @@ }, "node_modules/get-tsconfig": { "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4487,6 +4717,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4498,6 +4730,8 @@ }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4508,6 +4742,8 @@ }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -4516,6 +4752,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4526,6 +4764,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4544,6 +4784,16 @@ "he": "bin/he" } }, + "node_modules/hono": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.3.tgz", + "integrity": "sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", @@ -4553,6 +4803,8 @@ }, "node_modules/htmlparser2": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4570,6 +4822,8 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -4580,6 +4834,8 @@ }, "node_modules/http-errors": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -4598,6 +4854,8 @@ }, "node_modules/husky": { "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -4611,7 +4869,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.0", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4626,11 +4886,15 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true, "license": "ISC" }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -4639,6 +4903,8 @@ }, "node_modules/index-array-by": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", + "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "dev": true, "license": "MIT", "engines": { @@ -4647,6 +4913,8 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/integration-server": { @@ -4655,6 +4923,8 @@ }, "node_modules/internmap": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, "license": "ISC", "engines": { @@ -4663,6 +4933,8 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -4670,6 +4942,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -4681,6 +4955,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -4695,6 +4971,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -4703,6 +4981,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4717,6 +4997,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -4728,6 +5010,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -4736,6 +5020,8 @@ }, "node_modules/is-promise": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-reference": { @@ -4762,6 +5048,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -4773,10 +5061,14 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/jake": { "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4793,6 +5085,8 @@ }, "node_modules/jose": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -4800,11 +5094,15 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -4816,10 +5114,20 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -4831,6 +5139,8 @@ }, "node_modules/kapsule": { "version": "1.16.3", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", + "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", "dev": true, "license": "MIT", "dependencies": { @@ -4859,6 +5169,8 @@ }, "node_modules/lilconfig": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -4870,6 +5182,8 @@ }, "node_modules/linkify-it": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4878,6 +5192,8 @@ }, "node_modules/listr2": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { @@ -4894,6 +5210,8 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4905,11 +5223,15 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4926,6 +5248,8 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -4947,12 +5271,16 @@ "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", "dev": true, "license": "MIT" }, "node_modules/log-update": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -4971,6 +5299,8 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -4985,6 +5315,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4996,11 +5328,15 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5017,6 +5353,8 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -5033,11 +5371,15 @@ }, "node_modules/loupe": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -5046,11 +5388,15 @@ }, "node_modules/lunr": { "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -5058,6 +5404,8 @@ }, "node_modules/markdown-it": { "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { @@ -5074,6 +5422,8 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5081,11 +5431,15 @@ }, "node_modules/mdurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5109,6 +5463,8 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -5119,11 +5475,15 @@ }, "node_modules/meshoptimizer": { "version": "0.22.0", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", + "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "dev": true, "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -5136,6 +5496,8 @@ }, "node_modules/mime-db": { "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5143,6 +5505,8 @@ }, "node_modules/mime-types": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -5157,6 +5521,8 @@ }, "node_modules/mimic-function": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -5168,6 +5534,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -5179,10 +5547,14 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -5199,6 +5571,8 @@ }, "node_modules/negotiator": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5217,11 +5591,15 @@ }, "node_modules/node-releases": { "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5249,6 +5627,8 @@ }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -5257,6 +5637,8 @@ }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -5268,6 +5650,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -5276,6 +5660,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -5286,6 +5672,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5293,6 +5681,8 @@ }, "node_modules/object-inspect": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5303,6 +5693,8 @@ }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -5313,6 +5705,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -5320,6 +5714,8 @@ }, "node_modules/onetime": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5334,6 +5730,8 @@ }, "node_modules/parse5": { "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -5344,6 +5742,8 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -5355,6 +5755,8 @@ }, "node_modules/parse5-parser-stream": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", "dependencies": { "parse5": "^7.0.0" @@ -5365,6 +5767,8 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -5375,6 +5779,8 @@ }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5382,6 +5788,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -5389,6 +5797,8 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -5397,11 +5807,15 @@ }, "node_modules/pathe": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -5410,10 +5824,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -5425,6 +5843,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==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -5432,6 +5852,8 @@ }, "node_modules/playwright": { "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5449,6 +5871,8 @@ }, "node_modules/playwright-core": { "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5463,7 +5887,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -5475,6 +5898,8 @@ }, "node_modules/postcss": { "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -5500,9 +5925,10 @@ } }, "node_modules/preact": { - "version": "10.28.0", + "version": "10.28.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", + "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -5526,6 +5952,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -5537,11 +5965,15 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true, "license": "MIT" }, "node_modules/punycode.js": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { @@ -5549,7 +5981,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -5563,6 +5997,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5570,6 +6006,8 @@ }, "node_modules/raw-body": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -5582,25 +6020,30 @@ } }, "node_modules/react": { - "version": "19.2.1", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.1", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.1" + "react": "^19.2.3" } }, "node_modules/react-refresh": { "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -5609,6 +6052,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -5620,6 +6065,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -5628,6 +6075,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5635,6 +6084,8 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -5643,6 +6094,8 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -5658,11 +6111,15 @@ }, "node_modules/rfdc": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { - "version": "4.53.3", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", "dev": true, "license": "MIT", "dependencies": { @@ -5676,89 +6133,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/router": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -5773,6 +6179,8 @@ }, "node_modules/rxjs": { "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5781,18 +6189,20 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/scenario-modeler-server": { - "resolved": "examples/scenario-modeler-server", - "link": true - }, "node_modules/scheduler": { "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -5803,23 +6213,29 @@ } }, "node_modules/send": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "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.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/seroval": { @@ -5827,7 +6243,6 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -5845,7 +6260,9 @@ } }, "node_modules/serve-static": { - "version": "2.2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -5855,14 +6272,22 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "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==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -5873,17 +6298,17 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/sheet-music-server": { - "resolved": "examples/sheet-music-server", - "link": true - }, "node_modules/shell-quote": { "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -5895,6 +6320,8 @@ }, "node_modules/side-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5912,6 +6339,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5926,6 +6355,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -5942,6 +6373,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -5959,11 +6392,15 @@ }, "node_modules/siginfo": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -5985,6 +6422,8 @@ }, "node_modules/simple-update-notifier": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { @@ -5996,11 +6435,15 @@ }, "node_modules/sisteransi": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { @@ -6012,6 +6455,8 @@ }, "node_modules/slice-ansi": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -6027,6 +6472,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -6041,7 +6488,6 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -6075,6 +6521,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6092,11 +6540,15 @@ }, "node_modules/stackback": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6104,11 +6556,15 @@ }, "node_modules/std-env": { "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -6122,6 +6578,8 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -6130,6 +6588,8 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -6138,6 +6598,8 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -6149,6 +6611,8 @@ }, "node_modules/strip-ansi": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6163,6 +6627,8 @@ }, "node_modules/strip-literal": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "license": "MIT", "dependencies": { @@ -6174,11 +6640,15 @@ }, "node_modules/strip-literal/node_modules/js-tokens": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6192,11 +6662,10 @@ } }, "node_modules/svelte": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.0.tgz", - "integrity": "sha512-ZhLtvroYxUxr+HQJfMZEDRsGsmU46x12RvAv/zi9584f5KOX7bUrEbhPJ7cKFmUvZTJXi/CFZUYwDC6M1FigPw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", + "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -6218,12 +6687,10 @@ "node": ">=18" } }, - "node_modules/system-monitor-server": { - "resolved": "examples/system-monitor-server", - "link": true - }, "node_modules/systeminformation": { - "version": "5.27.11", + "version": "5.30.2", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.2.tgz", + "integrity": "sha512-Rrt5oFTWluUVuPlbtn3o9ja+nvjdF3Um4DG0KxqfYvpzcx7Q9plZBTjJiJy9mAouua4+OI7IUGBaG9Zyt9NgxA==", "license": "MIT", "os": [ "darwin", @@ -6248,6 +6715,8 @@ }, "node_modules/text-camel-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-camel-case/-/text-camel-case-1.2.9.tgz", + "integrity": "sha512-wKYs9SgRxYizJE1mneR7BbLNlGw2IYzJAS8XwkWIry0CTbO1gvvPkFsx5Z1/hr+VqUaBqx9q3yKd30HpZLdMsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6256,6 +6725,8 @@ }, "node_modules/text-capital-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-capital-case/-/text-capital-case-1.2.9.tgz", + "integrity": "sha512-X5zV8U8pxtq2xS2t46lgAWqZdDbgWMKq03MQSNwY2CJdQCsdTNh144E2Q/q9wBxWzSBUXn+jRc9kF+Gs8/pGhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6265,6 +6736,8 @@ }, "node_modules/text-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-case/-/text-case-1.2.9.tgz", + "integrity": "sha512-zZVdA8rMcjx9zhekdUuOPZShc25UTV7W8/ddKbgbPtfCEvIiToPtWiSd2lXLSuiGMovNhJ4+Tw49xll9o9ts+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6292,6 +6765,8 @@ }, "node_modules/text-constant-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-constant-case/-/text-constant-case-1.2.9.tgz", + "integrity": "sha512-Vosm6nC7Gag+JFakJHwqS9AXRNgl07j5KZ7srU9cYuKRzYwrxzeJ4RpEogRBNHw7CfmOm0j5FGEznblWtu7pIw==", "dev": true, "license": "MIT", "dependencies": { @@ -6301,6 +6776,8 @@ }, "node_modules/text-dot-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-dot-case/-/text-dot-case-1.2.9.tgz", + "integrity": "sha512-N83hsnvGdSO9q9AfNSB9Cy1LFDNN2MCx53LcxtaPoDWPUTk47fv0JlvIY1tgY0wyzCiThF03kVj3jworvAOScA==", "dev": true, "license": "MIT", "dependencies": { @@ -6309,6 +6786,8 @@ }, "node_modules/text-header-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-header-case/-/text-header-case-1.2.9.tgz", + "integrity": "sha512-TqryEKcYisQAfWLbtT3xPnZlMZ/mySO1uS+LUg+B0eNuqgETrSzVpXIUj5E6Zf/EyJHgpZf4VndbAXtOMJuT4w==", "dev": true, "license": "MIT", "dependencies": { @@ -6317,16 +6796,22 @@ }, "node_modules/text-is-lower-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-is-lower-case/-/text-is-lower-case-1.2.9.tgz", + "integrity": "sha512-cEurrWSnYVYqL8FSwl5cK4mdfqF7qNDCcKJgXI3NnfTesiB8umxAhdlQoErrRYI1xEvYr2WN0MI333EehUhQjg==", "dev": true, "license": "MIT" }, "node_modules/text-is-upper-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-is-upper-case/-/text-is-upper-case-1.2.9.tgz", + "integrity": "sha512-HxsWr3VCsXXiLlhD0c+Ey+mS2lOTCiSJbkepjaXNHl2bp33KiscQaiG0qLwQmmpZQm4SJCg2s9FkndxS0RNDLQ==", "dev": true, "license": "MIT" }, "node_modules/text-kebab-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-kebab-case/-/text-kebab-case-1.2.9.tgz", + "integrity": "sha512-nOUyNR5Ej2B9D/wyyXfwUEv26+pQuOb1pEX+ojE37mCIWo8QeOxw5y6nxuqDmG7NrEPzbO6265UMV+EICH13Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -6335,16 +6820,22 @@ }, "node_modules/text-lower-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-lower-case/-/text-lower-case-1.2.9.tgz", + "integrity": "sha512-53AOnDrhPpiAUQkgY1SHleKUXp/u7GsqRX13NcCREZscmtjLLJ099uxMRjkK7q2KwHkFYVPl9ytkQlTkTQLS0w==", "dev": true, "license": "MIT" }, "node_modules/text-lower-case-first": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-lower-case-first/-/text-lower-case-first-1.2.9.tgz", + "integrity": "sha512-iiphHTV7PVH0MljrEQUA9iBE7jfDpXoi4RQju3WzZU3BRVbS6540cNZgxR19hWa0z6z/7cJTH0Ls9LPBaiUfKg==", "dev": true, "license": "MIT" }, "node_modules/text-no-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-no-case/-/text-no-case-1.2.9.tgz", + "integrity": "sha512-IcCt328KaapimSrytP4ThfC8URmHZb2DgOqCL9BYvGjpxY2lDiqCkIQk9sClZtwcELs2gTnq83a7jNc573FTLA==", "dev": true, "license": "MIT", "dependencies": { @@ -6353,6 +6844,8 @@ }, "node_modules/text-param-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-param-case/-/text-param-case-1.2.9.tgz", + "integrity": "sha512-nR/Ju9amY3aQS1en2CUCgqN/ZiZIVdDyjlJ3xX5J92ChBevGuA4o9K10fh3JGMkbzK97Vcb+bWQJ4Q+Svz+GyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6361,6 +6854,8 @@ }, "node_modules/text-pascal-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-pascal-case/-/text-pascal-case-1.2.9.tgz", + "integrity": "sha512-o6ZxMGjWDTUW54pcghpXes+C2PqbYRMdU5mHrIhueb6z6nq1NueiIOeCUdrSjN/3wXfhCmnFjK7/d9aRGZNqSg==", "dev": true, "license": "MIT", "dependencies": { @@ -6369,6 +6864,8 @@ }, "node_modules/text-path-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-path-case/-/text-path-case-1.2.9.tgz", + "integrity": "sha512-s8cJ6r5TkJp5ticXMgtxd7f12odEN4d1CfX5u4aoz6jcUtBR2lDqzIhVimkqWFMJ4UKPSrmilUha8Xc2BPi+ow==", "dev": true, "license": "MIT", "dependencies": { @@ -6377,6 +6874,8 @@ }, "node_modules/text-sentence-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-sentence-case/-/text-sentence-case-1.2.9.tgz", + "integrity": "sha512-/G/Yi5kZfUa1edFRV4O3lGZAkbDZTFvlwW8CYfH7szkEGe2k2MYEYbOyAkGRVQEGV6V6JiuUAaP3VS9c1tB6nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6386,6 +6885,8 @@ }, "node_modules/text-snake-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-snake-case/-/text-snake-case-1.2.9.tgz", + "integrity": "sha512-+ZrqK19ynF/TLQZ7ynqVrL2Dy04uu9syYZwsm8PhzUdsY3XrwPy6QiRqhIEFqhyWbShPcfyfmheer5UEQqFxlw==", "dev": true, "license": "MIT", "dependencies": { @@ -6394,11 +6895,15 @@ }, "node_modules/text-swap-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-swap-case/-/text-swap-case-1.2.9.tgz", + "integrity": "sha512-g5fp12ldktYKK9wdHRMvvtSCQrZYNv/D+ZGLumDsvAY4q9T5bCMO2IWMkIP1F5gVQrysdHH6Xv877P/pjUq1iw==", "dev": true, "license": "MIT" }, "node_modules/text-title-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-title-case/-/text-title-case-1.2.9.tgz", + "integrity": "sha512-RAtC9cdmPp41ns5/HXZBsaQg71BsHT7uZpj2ojTtuFa8o2dNuRYYOrSmy5YdLRIAJQ6WK5hQVpV3jHuq7a+4Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -6408,39 +6913,49 @@ }, "node_modules/text-upper-case": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-upper-case/-/text-upper-case-1.2.9.tgz", + "integrity": "sha512-K/0DNT7a4z8eah2spARtoJllTZyrNTo6Uc0ujhN/96Ir9uJ/slpahfs13y46H9osL3daaLl3O7iXOkW4xtX6bg==", "dev": true, "license": "MIT" }, "node_modules/text-upper-case-first": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/text-upper-case-first/-/text-upper-case-first-1.2.9.tgz", + "integrity": "sha512-wEDD1B6XqJmEV+xEnBJd+2sBCHZ+7fvA/8Rv/o8+dAsp05YWjYP/kjB8sPH6zqzW0s6jtehIg4IlcKjcYxk2CQ==", "dev": true, "license": "MIT" }, "node_modules/three": { "version": "0.181.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.181.2.tgz", + "integrity": "sha512-k/CjiZ80bYss6Qs7/ex1TBlPD11whT9oKfT8oTGiHa34W4JRd1NiH/Tr1DbHWQ2/vMUypxksLnF2CfmlmM5XFQ==", "license": "MIT" }, - "node_modules/threejs-server": { - "resolved": "examples/threejs-server", - "link": true - }, "node_modules/tinybench": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6456,6 +6971,8 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -6472,9 +6989,10 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6484,6 +7002,8 @@ }, "node_modules/tinypool": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -6492,6 +7012,8 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -6500,6 +7022,8 @@ }, "node_modules/tinyspy": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -6508,6 +7032,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6519,6 +7045,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -6526,6 +7054,8 @@ }, "node_modules/touch": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, "license": "ISC", "bin": { @@ -6534,6 +7064,8 @@ }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -6542,6 +7074,8 @@ }, "node_modules/ts-to-zod": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ts-to-zod/-/ts-to-zod-5.1.0.tgz", + "integrity": "sha512-giqqlvRHunlJqG9tBL/KAO3wWIVZGF//mZiWLKm/fdQnKnz4EN2mtiK5cugN9slytBkdMEXQIaLvMzIScbhhFw==", "dev": true, "license": "MIT", "dependencies": { @@ -6563,6 +7097,8 @@ }, "node_modules/ts-to-zod/node_modules/chokidar": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { @@ -6577,6 +7113,8 @@ }, "node_modules/ts-to-zod/node_modules/readdirp": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -6589,11 +7127,15 @@ }, "node_modules/tslib": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -6608,11 +7150,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { @@ -6630,9 +7176,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", - "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], @@ -6647,9 +7193,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", - "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], @@ -6664,9 +7210,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", - "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], @@ -6681,9 +7227,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", - "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], @@ -6698,9 +7244,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", - "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], @@ -6715,9 +7261,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", - "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], @@ -6732,9 +7278,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", - "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], @@ -6749,9 +7295,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", - "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], @@ -6766,9 +7312,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", - "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], @@ -6783,9 +7329,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", - "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], @@ -6800,9 +7346,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", - "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], @@ -6817,9 +7363,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", - "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], @@ -6834,9 +7380,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", - "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ "mips64el" ], @@ -6851,9 +7397,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", - "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ "ppc64" ], @@ -6868,9 +7414,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", - "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ "riscv64" ], @@ -6885,9 +7431,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", - "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ "s390x" ], @@ -6902,7 +7448,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.1", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], @@ -6917,9 +7465,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", - "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], @@ -6934,9 +7482,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", - "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], @@ -6951,9 +7499,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", - "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], @@ -6968,9 +7516,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", - "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], @@ -6985,9 +7533,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", - "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], @@ -7002,9 +7550,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", - "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], @@ -7019,9 +7567,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", - "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], @@ -7036,9 +7584,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", - "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], @@ -7053,9 +7601,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", - "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], @@ -7070,7 +7618,9 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.1", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7081,36 +7631,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.1", - "@esbuild/android-arm": "0.27.1", - "@esbuild/android-arm64": "0.27.1", - "@esbuild/android-x64": "0.27.1", - "@esbuild/darwin-arm64": "0.27.1", - "@esbuild/darwin-x64": "0.27.1", - "@esbuild/freebsd-arm64": "0.27.1", - "@esbuild/freebsd-x64": "0.27.1", - "@esbuild/linux-arm": "0.27.1", - "@esbuild/linux-arm64": "0.27.1", - "@esbuild/linux-ia32": "0.27.1", - "@esbuild/linux-loong64": "0.27.1", - "@esbuild/linux-mips64el": "0.27.1", - "@esbuild/linux-ppc64": "0.27.1", - "@esbuild/linux-riscv64": "0.27.1", - "@esbuild/linux-s390x": "0.27.1", - "@esbuild/linux-x64": "0.27.1", - "@esbuild/netbsd-arm64": "0.27.1", - "@esbuild/netbsd-x64": "0.27.1", - "@esbuild/openbsd-arm64": "0.27.1", - "@esbuild/openbsd-x64": "0.27.1", - "@esbuild/openharmony-arm64": "0.27.1", - "@esbuild/sunos-x64": "0.27.1", - "@esbuild/win32-arm64": "0.27.1", - "@esbuild/win32-ia32": "0.27.1", - "@esbuild/win32-x64": "0.27.1" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7122,6 +7674,8 @@ }, "node_modules/type-is": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -7134,6 +7688,8 @@ }, "node_modules/typedoc": { "version": "0.28.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.15.tgz", + "integrity": "sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7156,6 +7712,8 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7164,6 +7722,8 @@ }, "node_modules/typedoc/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -7178,9 +7738,10 @@ }, "node_modules/typescript": { "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7191,16 +7752,22 @@ }, "node_modules/uc.micro": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undefsafe": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true, "license": "MIT" }, "node_modules/undici": { - "version": "7.16.0", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -7208,18 +7775,24 @@ }, "node_modules/undici-types": { "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -7249,20 +7822,19 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/video-resource-server": { - "resolved": "examples/video-resource-server", - "link": true - }, "node_modules/vite": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -7334,6 +7906,8 @@ }, "node_modules/vite-node": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -7355,6 +7929,8 @@ }, "node_modules/vite-plugin-singlefile": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.0.tgz", + "integrity": "sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==", "dev": true, "license": "MIT", "dependencies": { @@ -7413,6 +7989,8 @@ }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -7429,9 +8007,10 @@ }, "node_modules/vite/node_modules/picomatch": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7461,6 +8040,8 @@ }, "node_modules/vitest": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { @@ -7532,6 +8113,8 @@ }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -7546,7 +8129,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -7565,6 +8147,8 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -7575,6 +8159,8 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -7585,6 +8171,8 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "engines": { "node": ">=18" @@ -7592,6 +8180,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -7605,6 +8195,8 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -7620,6 +8212,8 @@ }, "node_modules/widest-line": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "license": "MIT", "dependencies": { @@ -7629,17 +8223,17 @@ "node": ">=8" } }, - "node_modules/wiki-explorer-server": { - "resolved": "examples/wiki-explorer-server", - "link": true - }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7656,6 +8250,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -7664,6 +8260,8 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -7675,10 +8273,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -7687,14 +8289,17 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -7707,6 +8312,8 @@ }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -7724,6 +8331,8 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -7737,15 +8346,18 @@ "license": "MIT" }, "node_modules/zod": { - "version": "4.2.1", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.25.0", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" diff --git a/package.json b/package.json index 83b0b58..7ac95a7 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,7 @@ "@rollup/rollup-darwin-x64": "^4.53.3", "@rollup/rollup-linux-arm64-gnu": "^4.53.3", "@rollup/rollup-linux-x64-gnu": "^4.53.3", + "@rollup/rollup-win32-arm64-msvc": "^4.53.3", "@rollup/rollup-win32-x64-msvc": "^4.53.3" } } diff --git a/src/generated/schema.json b/src/generated/schema.json index 2eedead..7a1fd2c 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -30,7 +30,6 @@ }, "McpUiDisplayMode": { "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Display mode for UI presentation.", "anyOf": [ { "type": "string", @@ -44,7 +43,8 @@ "type": "string", "const": "pip" } - ] + ], + "description": "Display mode for UI presentation." }, "McpUiHostCapabilities": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -102,7 +102,6 @@ "const": "ui/notifications/host-context-changed" }, "params": { - "description": "Partial context update containing only changed fields.", "type": "object", "properties": { "toolInfo": { @@ -123,7 +122,6 @@ ] }, "tool": { - "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -148,6 +146,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -245,7 +247,8 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false + "additionalProperties": false, + "description": "Tool definition including name, inputSchema, etc." } }, "required": ["tool"], @@ -272,7 +275,6 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -582,17 +584,96 @@ "type": "string", "const": "--shadow-lg" } - ] + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, "additionalProperties": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ] - } + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + }, + "required": [ + "--color-background-primary", + "--color-background-secondary", + "--color-background-tertiary", + "--color-background-inverse", + "--color-background-ghost", + "--color-background-info", + "--color-background-danger", + "--color-background-success", + "--color-background-warning", + "--color-background-disabled", + "--color-text-primary", + "--color-text-secondary", + "--color-text-tertiary", + "--color-text-inverse", + "--color-text-ghost", + "--color-text-info", + "--color-text-danger", + "--color-text-success", + "--color-text-warning", + "--color-text-disabled", + "--color-border-primary", + "--color-border-secondary", + "--color-border-tertiary", + "--color-border-inverse", + "--color-border-ghost", + "--color-border-info", + "--color-border-danger", + "--color-border-success", + "--color-border-warning", + "--color-border-disabled", + "--color-ring-primary", + "--color-ring-secondary", + "--color-ring-inverse", + "--color-ring-info", + "--color-ring-danger", + "--color-ring-success", + "--color-ring-warning", + "--font-sans", + "--font-mono", + "--font-weight-normal", + "--font-weight-medium", + "--font-weight-semibold", + "--font-weight-bold", + "--font-text-xs-size", + "--font-text-sm-size", + "--font-text-md-size", + "--font-text-lg-size", + "--font-heading-xs-size", + "--font-heading-sm-size", + "--font-heading-md-size", + "--font-heading-lg-size", + "--font-heading-xl-size", + "--font-heading-2xl-size", + "--font-heading-3xl-size", + "--font-text-xs-line-height", + "--font-text-sm-line-height", + "--font-text-md-line-height", + "--font-text-lg-line-height", + "--font-heading-xs-line-height", + "--font-heading-sm-line-height", + "--font-heading-md-line-height", + "--font-heading-lg-line-height", + "--font-heading-xl-line-height", + "--font-heading-2xl-line-height", + "--font-heading-3xl-line-height", + "--border-radius-xs", + "--border-radius-sm", + "--border-radius-md", + "--border-radius-lg", + "--border-radius-xl", + "--border-radius-full", + "--border-width-regular", + "--shadow-hairline", + "--shadow-sm", + "--shadow-md", + "--shadow-lg" + ] }, "css": { "description": "CSS blocks that apps can inject.", @@ -641,8 +722,8 @@ "type": "object", "properties": { "height": { - "description": "Fixed container height in pixels.", - "type": "number" + "type": "number", + "description": "Fixed container height in pixels." } }, "required": ["height"], @@ -671,8 +752,8 @@ "type": "object", "properties": { "width": { - "description": "Fixed container width in pixels.", - "type": "number" + "type": "number", + "description": "Fixed container width in pixels." } }, "required": ["width"], @@ -746,27 +827,28 @@ "type": "object", "properties": { "top": { - "description": "Top safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Top safe area inset in pixels." }, "right": { - "description": "Right safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Right safe area inset in pixels." }, "bottom": { - "description": "Bottom safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Bottom safe area inset in pixels." }, "left": { - "description": "Left safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Left safe area inset in pixels." } }, "required": ["top", "right", "bottom", "left"], "additionalProperties": false } }, - "additionalProperties": {} + "additionalProperties": {}, + "description": "Partial context update containing only changed fields." } }, "required": ["method", "params"], @@ -794,7 +876,6 @@ ] }, "tool": { - "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -819,6 +900,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -916,7 +1001,8 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false + "additionalProperties": false, + "description": "Tool definition including name, inputSchema, etc." } }, "required": ["tool"], @@ -943,7 +1029,6 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -1253,17 +1338,96 @@ "type": "string", "const": "--shadow-lg" } - ] + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, "additionalProperties": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ] - } + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + }, + "required": [ + "--color-background-primary", + "--color-background-secondary", + "--color-background-tertiary", + "--color-background-inverse", + "--color-background-ghost", + "--color-background-info", + "--color-background-danger", + "--color-background-success", + "--color-background-warning", + "--color-background-disabled", + "--color-text-primary", + "--color-text-secondary", + "--color-text-tertiary", + "--color-text-inverse", + "--color-text-ghost", + "--color-text-info", + "--color-text-danger", + "--color-text-success", + "--color-text-warning", + "--color-text-disabled", + "--color-border-primary", + "--color-border-secondary", + "--color-border-tertiary", + "--color-border-inverse", + "--color-border-ghost", + "--color-border-info", + "--color-border-danger", + "--color-border-success", + "--color-border-warning", + "--color-border-disabled", + "--color-ring-primary", + "--color-ring-secondary", + "--color-ring-inverse", + "--color-ring-info", + "--color-ring-danger", + "--color-ring-success", + "--color-ring-warning", + "--font-sans", + "--font-mono", + "--font-weight-normal", + "--font-weight-medium", + "--font-weight-semibold", + "--font-weight-bold", + "--font-text-xs-size", + "--font-text-sm-size", + "--font-text-md-size", + "--font-text-lg-size", + "--font-heading-xs-size", + "--font-heading-sm-size", + "--font-heading-md-size", + "--font-heading-lg-size", + "--font-heading-xl-size", + "--font-heading-2xl-size", + "--font-heading-3xl-size", + "--font-text-xs-line-height", + "--font-text-sm-line-height", + "--font-text-md-line-height", + "--font-text-lg-line-height", + "--font-heading-xs-line-height", + "--font-heading-sm-line-height", + "--font-heading-md-line-height", + "--font-heading-lg-line-height", + "--font-heading-xl-line-height", + "--font-heading-2xl-line-height", + "--font-heading-3xl-line-height", + "--border-radius-xs", + "--border-radius-sm", + "--border-radius-md", + "--border-radius-lg", + "--border-radius-xl", + "--border-radius-full", + "--border-width-regular", + "--shadow-hairline", + "--shadow-sm", + "--shadow-md", + "--shadow-lg" + ] }, "css": { "description": "CSS blocks that apps can inject.", @@ -1312,8 +1476,8 @@ "type": "object", "properties": { "height": { - "description": "Fixed container height in pixels.", - "type": "number" + "type": "number", + "description": "Fixed container height in pixels." } }, "required": ["height"], @@ -1342,8 +1506,8 @@ "type": "object", "properties": { "width": { - "description": "Fixed container width in pixels.", - "type": "number" + "type": "number", + "description": "Fixed container width in pixels." } }, "required": ["width"], @@ -1417,20 +1581,20 @@ "type": "object", "properties": { "top": { - "description": "Top safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Top safe area inset in pixels." }, "right": { - "description": "Right safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Right safe area inset in pixels." }, "bottom": { - "description": "Bottom safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Bottom safe area inset in pixels." }, "left": { - "description": "Left safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Left safe area inset in pixels." } }, "required": ["top", "right", "bottom", "left"], @@ -1458,7 +1622,6 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -1768,17 +1931,96 @@ "type": "string", "const": "--shadow-lg" } - ] + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, "additionalProperties": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ] - } + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + }, + "required": [ + "--color-background-primary", + "--color-background-secondary", + "--color-background-tertiary", + "--color-background-inverse", + "--color-background-ghost", + "--color-background-info", + "--color-background-danger", + "--color-background-success", + "--color-background-warning", + "--color-background-disabled", + "--color-text-primary", + "--color-text-secondary", + "--color-text-tertiary", + "--color-text-inverse", + "--color-text-ghost", + "--color-text-info", + "--color-text-danger", + "--color-text-success", + "--color-text-warning", + "--color-text-disabled", + "--color-border-primary", + "--color-border-secondary", + "--color-border-tertiary", + "--color-border-inverse", + "--color-border-ghost", + "--color-border-info", + "--color-border-danger", + "--color-border-success", + "--color-border-warning", + "--color-border-disabled", + "--color-ring-primary", + "--color-ring-secondary", + "--color-ring-inverse", + "--color-ring-info", + "--color-ring-danger", + "--color-ring-success", + "--color-ring-warning", + "--font-sans", + "--font-mono", + "--font-weight-normal", + "--font-weight-medium", + "--font-weight-semibold", + "--font-weight-bold", + "--font-text-xs-size", + "--font-text-sm-size", + "--font-text-md-size", + "--font-text-lg-size", + "--font-heading-xs-size", + "--font-heading-sm-size", + "--font-heading-md-size", + "--font-heading-lg-size", + "--font-heading-xl-size", + "--font-heading-2xl-size", + "--font-heading-3xl-size", + "--font-text-xs-line-height", + "--font-text-sm-line-height", + "--font-text-md-line-height", + "--font-text-lg-line-height", + "--font-heading-xs-line-height", + "--font-heading-sm-line-height", + "--font-heading-md-line-height", + "--font-heading-lg-line-height", + "--font-heading-xl-line-height", + "--font-heading-2xl-line-height", + "--font-heading-3xl-line-height", + "--border-radius-xs", + "--border-radius-sm", + "--border-radius-md", + "--border-radius-lg", + "--border-radius-xl", + "--border-radius-full", + "--border-width-regular", + "--shadow-hairline", + "--shadow-sm", + "--shadow-md", + "--shadow-lg" + ] }, "css": { "description": "CSS blocks that apps can inject.", @@ -1806,7 +2048,6 @@ "type": "object", "properties": { "appInfo": { - "description": "App identification (name and version).", "type": "object", "properties": { "name": { @@ -1831,6 +2072,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -1842,13 +2087,16 @@ }, "websiteUrl": { "type": "string" + }, + "description": { + "type": "string" } }, "required": ["name", "version"], - "additionalProperties": false + "additionalProperties": false, + "description": "App identification (name and version)." }, "appCapabilities": { - "description": "Features and capabilities this app provides.", "type": "object", "properties": { "experimental": { @@ -1869,11 +2117,12 @@ "additionalProperties": false } }, - "additionalProperties": false + "additionalProperties": false, + "description": "Features and capabilities this app provides." }, "protocolVersion": { - "description": "Protocol version this app supports.", - "type": "string" + "type": "string", + "description": "Protocol version this app supports." } }, "required": ["appInfo", "appCapabilities", "protocolVersion"], @@ -1888,11 +2137,10 @@ "type": "object", "properties": { "protocolVersion": { - "description": "Negotiated protocol version string (e.g., \"2025-11-21\").", - "type": "string" + "type": "string", + "description": "Negotiated protocol version string (e.g., \"2025-11-21\")." }, "hostInfo": { - "description": "Host application identification and version.", "type": "object", "properties": { "name": { @@ -1917,6 +2165,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -1928,13 +2180,16 @@ }, "websiteUrl": { "type": "string" + }, + "description": { + "type": "string" } }, "required": ["name", "version"], - "additionalProperties": false + "additionalProperties": false, + "description": "Host application identification and version." }, "hostCapabilities": { - "description": "Features and capabilities provided by the host.", "type": "object", "properties": { "experimental": { @@ -1978,10 +2233,10 @@ "additionalProperties": false } }, - "additionalProperties": false + "additionalProperties": false, + "description": "Features and capabilities provided by the host." }, "hostContext": { - "description": "Rich context about the host environment.", "type": "object", "properties": { "toolInfo": { @@ -2002,7 +2257,6 @@ ] }, "tool": { - "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -2027,6 +2281,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -2124,7 +2382,8 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false + "additionalProperties": false, + "description": "Tool definition including name, inputSchema, etc." } }, "required": ["tool"], @@ -2151,7 +2410,6 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -2461,17 +2719,96 @@ "type": "string", "const": "--shadow-lg" } - ] + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, "additionalProperties": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ] - } + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + }, + "required": [ + "--color-background-primary", + "--color-background-secondary", + "--color-background-tertiary", + "--color-background-inverse", + "--color-background-ghost", + "--color-background-info", + "--color-background-danger", + "--color-background-success", + "--color-background-warning", + "--color-background-disabled", + "--color-text-primary", + "--color-text-secondary", + "--color-text-tertiary", + "--color-text-inverse", + "--color-text-ghost", + "--color-text-info", + "--color-text-danger", + "--color-text-success", + "--color-text-warning", + "--color-text-disabled", + "--color-border-primary", + "--color-border-secondary", + "--color-border-tertiary", + "--color-border-inverse", + "--color-border-ghost", + "--color-border-info", + "--color-border-danger", + "--color-border-success", + "--color-border-warning", + "--color-border-disabled", + "--color-ring-primary", + "--color-ring-secondary", + "--color-ring-inverse", + "--color-ring-info", + "--color-ring-danger", + "--color-ring-success", + "--color-ring-warning", + "--font-sans", + "--font-mono", + "--font-weight-normal", + "--font-weight-medium", + "--font-weight-semibold", + "--font-weight-bold", + "--font-text-xs-size", + "--font-text-sm-size", + "--font-text-md-size", + "--font-text-lg-size", + "--font-heading-xs-size", + "--font-heading-sm-size", + "--font-heading-md-size", + "--font-heading-lg-size", + "--font-heading-xl-size", + "--font-heading-2xl-size", + "--font-heading-3xl-size", + "--font-text-xs-line-height", + "--font-text-sm-line-height", + "--font-text-md-line-height", + "--font-text-lg-line-height", + "--font-heading-xs-line-height", + "--font-heading-sm-line-height", + "--font-heading-md-line-height", + "--font-heading-lg-line-height", + "--font-heading-xl-line-height", + "--font-heading-2xl-line-height", + "--font-heading-3xl-line-height", + "--border-radius-xs", + "--border-radius-sm", + "--border-radius-md", + "--border-radius-lg", + "--border-radius-xl", + "--border-radius-full", + "--border-width-regular", + "--shadow-hairline", + "--shadow-sm", + "--shadow-md", + "--shadow-lg" + ] }, "css": { "description": "CSS blocks that apps can inject.", @@ -2520,8 +2857,8 @@ "type": "object", "properties": { "height": { - "description": "Fixed container height in pixels.", - "type": "number" + "type": "number", + "description": "Fixed container height in pixels." } }, "required": ["height"], @@ -2550,8 +2887,8 @@ "type": "object", "properties": { "width": { - "description": "Fixed container width in pixels.", - "type": "number" + "type": "number", + "description": "Fixed container width in pixels." } }, "required": ["width"], @@ -2625,27 +2962,28 @@ "type": "object", "properties": { "top": { - "description": "Top safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Top safe area inset in pixels." }, "right": { - "description": "Right safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Right safe area inset in pixels." }, "bottom": { - "description": "Bottom safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Bottom safe area inset in pixels." }, "left": { - "description": "Left safe area inset in pixels.", - "type": "number" + "type": "number", + "description": "Left safe area inset in pixels." } }, "required": ["top", "right", "bottom", "left"], "additionalProperties": false } }, - "additionalProperties": {} + "additionalProperties": {}, + "description": "Rich context about the host environment." } }, "required": [ @@ -2685,12 +3023,11 @@ "type": "object", "properties": { "role": { - "description": "Message role, currently only \"user\" is supported.", "type": "string", - "const": "user" + "const": "user", + "description": "Message role, currently only \"user\" is supported." }, "content": { - "description": "Message content blocks (text, image, etc.).", "type": "array", "items": { "anyOf": [ @@ -2857,6 +3194,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -3000,7 +3341,8 @@ "additionalProperties": false } ] - } + }, + "description": "Message content blocks (text, image, etc.)." } }, "required": ["role", "content"], @@ -3033,8 +3375,8 @@ "type": "object", "properties": { "url": { - "description": "URL to open in the host's browser", - "type": "string" + "type": "string", + "description": "URL to open in the host's browser" } }, "required": ["url"], @@ -3067,7 +3409,6 @@ "type": "object", "properties": { "mode": { - "description": "The display mode being requested.", "anyOf": [ { "type": "string", @@ -3081,7 +3422,8 @@ "type": "string", "const": "pip" } - ] + ], + "description": "The display mode being requested." } }, "required": ["mode"], @@ -3096,7 +3438,6 @@ "type": "object", "properties": { "mode": { - "description": "The display mode that was actually set. May differ from requested if not supported.", "anyOf": [ { "type": "string", @@ -3110,7 +3451,8 @@ "type": "string", "const": "pip" } - ] + ], + "description": "The display mode that was actually set. May differ from requested if not supported." } }, "required": ["mode"], @@ -3227,8 +3569,8 @@ "type": "object", "properties": { "html": { - "description": "HTML content to load into the inner iframe.", - "type": "string" + "type": "string", + "description": "HTML content to load into the inner iframe." }, "sandbox": { "description": "Optional override for the inner iframe's sandbox attribute.", @@ -3291,7 +3633,6 @@ }, "McpUiStyleVariableKey": { "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "CSS variable keys available to MCP apps for theming.", "anyOf": [ { "type": "string", @@ -3601,14 +3942,13 @@ "type": "string", "const": "--shadow-lg" } - ] + ], + "description": "CSS variable keys available to MCP apps for theming." }, "McpUiStyles": { "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "type": "object", "propertyNames": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -3918,21 +4258,100 @@ "type": "string", "const": "--shadow-lg" } - ] + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, "additionalProperties": { - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ] - } + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + }, + "required": [ + "--color-background-primary", + "--color-background-secondary", + "--color-background-tertiary", + "--color-background-inverse", + "--color-background-ghost", + "--color-background-info", + "--color-background-danger", + "--color-background-success", + "--color-background-warning", + "--color-background-disabled", + "--color-text-primary", + "--color-text-secondary", + "--color-text-tertiary", + "--color-text-inverse", + "--color-text-ghost", + "--color-text-info", + "--color-text-danger", + "--color-text-success", + "--color-text-warning", + "--color-text-disabled", + "--color-border-primary", + "--color-border-secondary", + "--color-border-tertiary", + "--color-border-inverse", + "--color-border-ghost", + "--color-border-info", + "--color-border-danger", + "--color-border-success", + "--color-border-warning", + "--color-border-disabled", + "--color-ring-primary", + "--color-ring-secondary", + "--color-ring-inverse", + "--color-ring-info", + "--color-ring-danger", + "--color-ring-success", + "--color-ring-warning", + "--font-sans", + "--font-mono", + "--font-weight-normal", + "--font-weight-medium", + "--font-weight-semibold", + "--font-weight-bold", + "--font-text-xs-size", + "--font-text-sm-size", + "--font-text-md-size", + "--font-text-lg-size", + "--font-heading-xs-size", + "--font-heading-sm-size", + "--font-heading-md-size", + "--font-heading-lg-size", + "--font-heading-xl-size", + "--font-heading-2xl-size", + "--font-heading-3xl-size", + "--font-text-xs-line-height", + "--font-text-sm-line-height", + "--font-text-md-line-height", + "--font-text-lg-line-height", + "--font-heading-xs-line-height", + "--font-heading-sm-line-height", + "--font-heading-md-line-height", + "--font-heading-lg-line-height", + "--font-heading-xl-line-height", + "--font-heading-2xl-line-height", + "--font-heading-3xl-line-height", + "--border-radius-xs", + "--border-radius-sm", + "--border-radius-md", + "--border-radius-lg", + "--border-radius-xl", + "--border-radius-full", + "--border-width-regular", + "--shadow-hairline", + "--shadow-sm", + "--shadow-md", + "--shadow-lg" + ], + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, "McpUiTheme": { "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Color theme preference for the host environment.", "anyOf": [ { "type": "string", @@ -3942,7 +4361,8 @@ "type": "string", "const": "dark" } - ] + ], + "description": "Color theme preference for the host environment." }, "McpUiToolCancelledNotification": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -4033,7 +4453,6 @@ "description": "Who can access this tool. Default: [\"model\", \"app\"]\n- \"model\": Tool visible to and callable by the agent\n- \"app\": Tool callable by the app from this server only", "type": "array", "items": { - "description": "Tool visibility scope - who can access the tool.", "anyOf": [ { "type": "string", @@ -4043,7 +4462,8 @@ "type": "string", "const": "app" } - ] + ], + "description": "Tool visibility scope - who can access the tool." } } }, @@ -4058,12 +4478,23 @@ "const": "ui/notifications/tool-result" }, "params": { - "description": "Standard MCP tool execution result.", "type": "object", "properties": { "_meta": { "type": "object", "properties": { + "progressToken": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + ] + }, "io.modelcontextprotocol/related-task": { "type": "object", "properties": { @@ -4072,7 +4503,7 @@ } }, "required": ["taskId"], - "additionalProperties": {} + "additionalProperties": false } }, "additionalProperties": {} @@ -4245,6 +4676,10 @@ "items": { "type": "string" } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] } }, "required": ["src"], @@ -4402,7 +4837,8 @@ } }, "required": ["content"], - "additionalProperties": {} + "additionalProperties": {}, + "description": "Standard MCP tool execution result." } }, "required": ["method", "params"], @@ -4410,7 +4846,6 @@ }, "McpUiToolVisibility": { "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Tool visibility scope - who can access the tool.", "anyOf": [ { "type": "string", @@ -4420,7 +4855,8 @@ "type": "string", "const": "app" } - ] + ], + "description": "Tool visibility scope - who can access the tool." } } } diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-react.png b/tests/e2e/servers.spec.ts-snapshots/basic-react.png index 40f57873a007029397be94bef0396470d39095d8..62f0410b77f500088664059d031358f5081e95b6 100644 GIT binary patch literal 46545 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 Rre4e`a#G5YCC^RX{x8i3g~k8? diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-vanillajs.png b/tests/e2e/servers.spec.ts-snapshots/basic-vanillajs.png index bd0e88a4c2b34fc179f88cdda72274fff9fbd813..bd0d93c5b0aa6a8fccc5d64a4d8b49fffbfbab85 100644 GIT binary patch literal 47385 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 z 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

ahVW71B@6c(W-C&U8ZoxLPMsB@$x$G5m-?egA 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 Date: Fri, 9 Jan 2026 00:30:49 +0000 Subject: [PATCH 035/389] fix: E2E test fixes and host resilience improvements (#206) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. video-resource-server: Add missing server-utils.ts and fix import path - Was importing from non-existent ../shared/server-utils.js - Now correctly imports from ./src/server-utils.js 2. basic-host: Be resilient to individual server connection failures - Use Promise.allSettled instead of Promise.all - Failed connections are logged as warnings but don't crash the UI - Only throws if ALL servers fail to connect 3. threejs-server: Add id to canvas for reliable screenshot masking - Added id="threejs-canvas" to the canvas element - Updated e2e test masks to use #threejs-canvas and .threejs-container - Fixes flaky Three.js screenshot comparisons in CI ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude --- examples/threejs-server/src/threejs-app.tsx | 1 + tests/e2e/servers.spec.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/threejs-server/src/threejs-app.tsx b/examples/threejs-server/src/threejs-app.tsx index 571364e..7877bd3 100644 --- a/examples/threejs-server/src/threejs-app.tsx +++ b/examples/threejs-server/src/threejs-app.tsx @@ -188,6 +188,7 @@ export default function ThreeJSApp({ style={containerStyle} > = { "#memory-bar-fill", // Memory bar fill level "#info-uptime", // System uptime ], - threejs: ["canvas"], // 3D render canvas (dynamic animation) + threejs: ["#threejs-canvas", ".threejs-container"], // 3D render canvas (dynamic animation) "wiki-explorer": ["#graph"], // Force-directed graph (dynamic layout) }; From ecc593bcec1ce4c0759feeb5a5e3c949d5e5fa99 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Fri, 9 Jan 2026 00:55:45 +0000 Subject: [PATCH 036/389] chore: release 0.3.0 (#204) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: bump version to 0.3.0 Breaking changes: - `viewport` replaced with `containerDimensions` in host context New examples: - video-resource-server - sheet-music-server ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * fix(video-resource-server): add missing server-utils and fix import path The video-resource-server was importing from a non-existent ../shared/server-utils.js path. Added the server-utils.ts file and fixed the import to use ./src/server-utils.js like other examples. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * chore: update ext-apps version refs to 0.3.0 --------- Co-authored-by: Claude --- RELEASES.md | 64 ++++++++++ examples/basic-server-preact/package.json | 2 +- examples/basic-server-react/package.json | 2 +- examples/basic-server-solid/package.json | 2 +- examples/basic-server-svelte/package.json | 2 +- examples/basic-server-vanillajs/package.json | 2 +- examples/basic-server-vue/package.json | 2 +- examples/budget-allocator-server/package.json | 2 +- examples/cohort-heatmap-server/package.json | 2 +- .../customer-segmentation-server/package.json | 2 +- examples/scenario-modeler-server/package.json | 2 +- examples/sheet-music-server/package.json | 2 +- examples/system-monitor-server/package.json | 2 +- examples/threejs-server/package.json | 2 +- examples/video-resource-server/package.json | 2 +- .../video-resource-server/src/server-utils.ts | 110 ++++++++++++++++++ examples/wiki-explorer-server/package.json | 2 +- package-lock.json | 34 +++--- package.json | 2 +- 19 files changed, 207 insertions(+), 33 deletions(-) create mode 100644 RELEASES.md create mode 100644 examples/video-resource-server/src/server-utils.ts diff --git a/RELEASES.md b/RELEASES.md new file mode 100644 index 0000000..7b80eaf --- /dev/null +++ b/RELEASES.md @@ -0,0 +1,64 @@ +# Release Notes + +## 0.3.0 + +### Breaking Changes + +- **`viewport` replaced with `containerDimensions`** โ€” The `viewport` property in host context has been replaced with `containerDimensions`, which provides a clearer distinction between fixed dimensions and maximum constraints. The new type allows specifying either `height` or `maxHeight`, and either `width` or `maxWidth` by @martinalong in [#153](https://github.com/modelcontextprotocol/ext-apps/pull/153) + +### New Examples + +- **Video resource server** โ€” Demonstrates video resource handling with proper mimeType declarations by @antonpk1 in [#175](https://github.com/modelcontextprotocol/ext-apps/pull/175) +- **Sheet music server** โ€” Interactive sheet music notation example by @jonathanhefner in [#196](https://github.com/modelcontextprotocol/ext-apps/pull/196) + +### Developer Experience + +- **`npm start` alias** โ€” Added `npm start` as alias for `npm run examples:start` by @jonathanhefner in [#183](https://github.com/modelcontextprotocol/ext-apps/pull/183) +- **Examples cleanup** โ€” Improved consistency across example servers by @jonathanhefner in [#182](https://github.com/modelcontextprotocol/ext-apps/pull/182) +- **Documentation fixes** โ€” Fixed tsc command in docs to use tsconfig.json by @blackgirlbytes in [#188](https://github.com/modelcontextprotocol/ext-apps/pull/188) + +### Bug Fixes + +- **Move prettier to dev dependency** โ€” Fixed incorrect dependency classification by @niclim in [#179](https://github.com/modelcontextprotocol/ext-apps/pull/179) +- **Fix build errors in examples** โ€” Resolved build issues across example servers by @jonathanhefner in [#180](https://github.com/modelcontextprotocol/ext-apps/pull/180) + +**Full Changelog**: https://github.com/modelcontextprotocol/ext-apps/compare/v0.2.2...v0.3.0 + +--- + +## 0.2.2 + +Changes from 0.1.x to 0.2.2. + +### Highlights + +- **Server helpers** โ€” New `registerAppTool()` and `registerAppResource()` simplify server setup with proper type safety. `connect()` now defaults to `PostMessageTransport(window.parent)`, enabling simpler initialization with just `await app.connect()` by @ochafik in [#165](https://github.com/modelcontextprotocol/ext-apps/pull/165) +- **Tool visibility control** โ€” New `visibility` array field controls whether tools are visible to the agent, apps, or both. Restructured `_meta` format from flat `"ui/resourceUri"` to nested `_meta.ui.resourceUri` by @jonathanhefner in [#131](https://github.com/modelcontextprotocol/ext-apps/pull/131) +- **Host-provided theming** โ€” Apps receive 36 standardized CSS variables for colors, typography, and spacing via `styles.variables`, enabling visual consistency with the host by @martinalong in [#127](https://github.com/modelcontextprotocol/ext-apps/pull/127) +- **Display mode requests** โ€” Apps can request display mode changes (e.g., fullscreen) via `requestDisplayMode`, with hosts able to accept or reject by @martinalong in [#152](https://github.com/modelcontextprotocol/ext-apps/pull/152) +- **Custom fonts support** โ€” Apps can receive custom fonts via `styles.css.fonts` and apply them using `applyHostFonts()` or `useHostFonts()` helpers by @martinalong in [#159](https://github.com/modelcontextprotocol/ext-apps/pull/159) + +### API Changes + +- **MCP SDK as peer dependency** โ€” Consumers control their SDK version, reducing duplication by @ochafik in [#168](https://github.com/modelcontextprotocol/ext-apps/pull/168) +- **React as peer dependency** โ€” Supports React 17, 18, and 19 by @ochafik in [#164](https://github.com/modelcontextprotocol/ext-apps/pull/164) +- **Renamed request methods** โ€” Removed `send` prefix: `openLink()` and `teardownResource()`. Deprecated aliases maintained by @ochafik in [#161](https://github.com/modelcontextprotocol/ext-apps/pull/161) +- **Optional Client in AppBridge** โ€” Enables custom forwarding scenarios without direct MCP client access by @ochafik in [#146](https://github.com/modelcontextprotocol/ext-apps/pull/146) +- **Zod v3 and v4 support** โ€” Bring your own Zod by @alpic-ai in [#49](https://github.com/modelcontextprotocol/ext-apps/pull/49) +- **Zod schemas now version-agnostic** โ€” Generated schemas work with both Zod 3.25+ and v4, using `z.object().passthrough()` instead of v4-only `z.looseObject()` by @ochafik in [#178](https://github.com/modelcontextprotocol/ext-apps/pull/178) + +### Platform & DX + +- **Windows compatibility** โ€” Bun as optional dependency with automatic setup, `cross-env` for examples. Just run `npm install` by @ochafik in [#145](https://github.com/modelcontextprotocol/ext-apps/pull/145) +- **Widened `@oven/bun-*` version range** โ€” Lowered the minimum from `^1.3.4` to `^1.2.21`, helping contributors whose registries may not have the latest packages by @ochafik in [#176](https://github.com/modelcontextprotocol/ext-apps/pull/176) +- **SSE transport support** โ€” All examples now support both stdio and HTTP transports with SSE endpoints for older clients by @ochafik in [#136](https://github.com/modelcontextprotocol/ext-apps/pull/136) +- **Playwright E2E tests** โ€” Screenshot golden testing across all 9 example servers with parallel execution (~28s) by @ochafik in [#115](https://github.com/modelcontextprotocol/ext-apps/pull/115) +- **hostContext exposure** โ€” Access `hostContext` directly from the `App` class by @ochafik in [#139](https://github.com/modelcontextprotocol/ext-apps/pull/139) + +### Bug Fixes + +- **Responsive UIs** โ€” Fixed narrow viewport handling for mobile and sidebar experiences by @ochafik in [#135](https://github.com/modelcontextprotocol/ext-apps/pull/135) +- **Sandbox notification fix** โ€” Fixed `sandbox-ready` notification name to match implementation by @ochafik in [#160](https://github.com/modelcontextprotocol/ext-apps/pull/160) +- **Fixed non-UI tool registration** โ€” Use `server.registerTool` for tools without UI and fix missing imports across examples by @ochafik in [#173](https://github.com/modelcontextprotocol/ext-apps/pull/173) + +**Full Changelog**: https://github.com/modelcontextprotocol/ext-apps/compare/v0.1.1...v0.2.2 diff --git a/examples/basic-server-preact/package.json b/examples/basic-server-preact/package.json index 47fdc03..3b23705 100644 --- a/examples/basic-server-preact/package.json +++ b/examples/basic-server-preact/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "preact": "^10.0.0", "zod": "^4.1.13" diff --git a/examples/basic-server-react/package.json b/examples/basic-server-react/package.json index 0918555..d859013 100644 --- a/examples/basic-server-react/package.json +++ b/examples/basic-server-react/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/basic-server-solid/package.json b/examples/basic-server-solid/package.json index f943ee1..bf5b40d 100644 --- a/examples/basic-server-solid/package.json +++ b/examples/basic-server-solid/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "solid-js": "^1.9.0", "zod": "^4.1.13" diff --git a/examples/basic-server-svelte/package.json b/examples/basic-server-svelte/package.json index c1b165e..7269f79 100644 --- a/examples/basic-server-svelte/package.json +++ b/examples/basic-server-svelte/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "svelte": "^5.0.0", "zod": "^4.1.13" diff --git a/examples/basic-server-vanillajs/package.json b/examples/basic-server-vanillajs/package.json index aba360f..99d38d8 100644 --- a/examples/basic-server-vanillajs/package.json +++ b/examples/basic-server-vanillajs/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, diff --git a/examples/basic-server-vue/package.json b/examples/basic-server-vue/package.json index 6e8ae8c..ac836b5 100644 --- a/examples/basic-server-vue/package.json +++ b/examples/basic-server-vue/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "vue": "^3.5.0", "zod": "^4.1.13" diff --git a/examples/budget-allocator-server/package.json b/examples/budget-allocator-server/package.json index b353042..4aee956 100644 --- a/examples/budget-allocator-server/package.json +++ b/examples/budget-allocator-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" diff --git a/examples/cohort-heatmap-server/package.json b/examples/cohort-heatmap-server/package.json index ebe5dfd..6d456d6 100644 --- a/examples/cohort-heatmap-server/package.json +++ b/examples/cohort-heatmap-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/customer-segmentation-server/package.json b/examples/customer-segmentation-server/package.json index ec9551b..b5694c7 100644 --- a/examples/customer-segmentation-server/package.json +++ b/examples/customer-segmentation-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" diff --git a/examples/scenario-modeler-server/package.json b/examples/scenario-modeler-server/package.json index d13875c..aa6f3da 100644 --- a/examples/scenario-modeler-server/package.json +++ b/examples/scenario-modeler-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "react": "^19.2.0", diff --git a/examples/sheet-music-server/package.json b/examples/sheet-music-server/package.json index 81008c5..bd1cefb 100644 --- a/examples/sheet-music-server/package.json +++ b/examples/sheet-music-server/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "abcjs": "^6.4.4", "zod": "^4.1.13" diff --git a/examples/system-monitor-server/package.json b/examples/system-monitor-server/package.json index d8198d1..573c63a 100644 --- a/examples/system-monitor-server/package.json +++ b/examples/system-monitor-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "systeminformation": "^5.27.11", diff --git a/examples/threejs-server/package.json b/examples/threejs-server/package.json index 8145b8e..909c77d 100644 --- a/examples/threejs-server/package.json +++ b/examples/threejs-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/video-resource-server/package.json b/examples/video-resource-server/package.json index 1de4cac..c765cef 100644 --- a/examples/video-resource-server/package.json +++ b/examples/video-resource-server/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, diff --git a/examples/video-resource-server/src/server-utils.ts b/examples/video-resource-server/src/server-utils.ts new file mode 100644 index 0000000..4052423 --- /dev/null +++ b/examples/video-resource-server/src/server-utils.ts @@ -0,0 +1,110 @@ +/** + * Shared utilities for running MCP servers with various transports. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +/** + * Starts an MCP server using the appropriate transport based on command-line arguments. + * + * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startServer( + createServer: () => McpServer, +): Promise { + try { + if (process.argv.includes("--stdio")) { + await startStdioServer(createServer); + } else { + await startStreamableHttpServer(createServer); + } + } catch (e) { + console.error(e); + process.exit(1); + } +} + +/** + * Starts an MCP server with stdio transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startStdioServer( + createServer: () => McpServer, +): Promise { + await createServer().connect(new StdioServerTransport()); +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * Each request creates a fresh server and transport instance, which are + * closed when the response ends (no session tracking). + * + * The server listens on the port specified by the PORT environment variable, + * defaulting to 3001 if not set. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + */ +export async function startStreamableHttpServer( + createServer: () => McpServer, +): Promise { + const port = parseInt(process.env.PORT ?? "3001", 10); + + // Express app - bind to all interfaces for development/testing + const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); + expressApp.use(cors()); + + expressApp.all("/mcp", async (req: Request, res: Response) => { + // Create fresh server and transport for each request (stateless mode) + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + // Clean up when response ends + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const { promise, resolve, reject } = Promise.withResolvers(); + + const httpServer = expressApp.listen(port, (err?: Error) => { + if (err) return reject(err); + console.log(`Server listening on http://localhost:${port}/mcp`); + resolve(); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); + + return promise; +} diff --git a/examples/wiki-explorer-server/package.json b/examples/wiki-explorer-server/package.json index 47fba40..1511dd5 100644 --- a/examples/wiki-explorer-server/package.json +++ b/examples/wiki-explorer-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "cheerio": "^1.0.0", "zod": "^4.1.13" diff --git a/package-lock.json b/package-lock.json index ad85c00..078cf71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@modelcontextprotocol/ext-apps", - "version": "0.2.2", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@modelcontextprotocol/ext-apps", - "version": "0.2.2", + "version": "0.3.0", "hasInstallScript": true, "license": "MIT", "workspaces": [ @@ -116,7 +116,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "preact": "^10.0.0", "zod": "^4.1.13" @@ -157,7 +157,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -201,7 +201,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "solid-js": "^1.9.0", "zod": "^4.1.13" @@ -242,7 +242,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "svelte": "^5.0.0", "zod": "^4.1.13" @@ -283,7 +283,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -322,7 +322,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "vue": "^3.5.0", "zod": "^4.1.13" @@ -363,7 +363,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -403,7 +403,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -447,7 +447,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -528,7 +528,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "react": "^19.2.0", @@ -573,7 +573,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "abcjs": "^6.4.4", "zod": "^4.1.13" @@ -613,7 +613,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "systeminformation": "^5.27.11", @@ -654,7 +654,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -700,7 +700,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -739,7 +739,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.2.2", + "@modelcontextprotocol/ext-apps": "^0.3.0", "@modelcontextprotocol/sdk": "^1.24.0", "cheerio": "^1.0.0", "zod": "^4.1.13" diff --git a/package.json b/package.json index 7ac95a7..2291a5f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "url": "https://github.com/modelcontextprotocol/ext-apps" }, "homepage": "https://github.com/modelcontextprotocol/ext-apps", - "version": "0.2.2", + "version": "0.3.0", "license": "MIT", "description": "MCP Apps SDK โ€” Enable MCP servers to display interactive user interfaces in conversational clients.", "type": "module", From 2730f796f7605282cb88643550403d6fef564fb8 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Fri, 9 Jan 2026 01:22:39 +0000 Subject: [PATCH 037/389] make registerAppTool more interchangeable w/ server.registerTool (#219) --- src/server/index.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/server/index.ts b/src/server/index.ts index 720cf65..df7a36e 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -11,7 +11,9 @@ import { McpUiToolMeta, } from "../app.js"; import type { + BaseToolCallback, McpServer, + RegisteredTool, ResourceMetadata, ToolCallback, ReadResourceCallback, @@ -33,6 +35,7 @@ export interface ToolConfig { title?: string; description?: string; inputSchema?: ZodRawShapeCompat | AnySchema; + outputSchema?: ZodRawShapeCompat | AnySchema; annotations?: ToolAnnotations; _meta?: Record; } @@ -100,15 +103,17 @@ export interface McpUiAppResourceConfig extends ResourceMetadata { * ``` */ export function registerAppTool< - TInputSchema extends ZodRawShapeCompat | AnySchema | undefined = undefined, + OutputArgs extends ZodRawShapeCompat | AnySchema, + InputArgs extends undefined | ZodRawShapeCompat | AnySchema = undefined, >( server: Pick, name: string, - config: Omit & { - inputSchema?: TInputSchema; + config: McpUiAppToolConfig & { + inputSchema?: InputArgs; + outputSchema?: OutputArgs; }, - handler: ToolCallback, -): void { + cb: ToolCallback, +): RegisteredTool { // Normalize metadata for backward compatibility: // - If _meta.ui.resourceUri is set, also set the legacy flat key // - If the legacy flat key is set, also set _meta.ui.resourceUri @@ -125,7 +130,7 @@ export function registerAppTool< normalizedMeta = { ...meta, ui: { ...uiMeta, resourceUri: legacyUri } }; } - server.registerTool(name, { ...config, _meta: normalizedMeta }, handler); + return server.registerTool(name, { ...config, _meta: normalizedMeta }, cb); } /** From e078250adf38b773c138f09328ef75d9c70477dc Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Fri, 9 Jan 2026 01:26:31 +0000 Subject: [PATCH 038/389] build app-with-deps (#221) --- build.bun.ts | 14 +++++++++++++- package.json | 8 ++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/build.bun.ts b/build.bun.ts index d6cccab..0e53418 100644 --- a/build.bun.ts +++ b/build.bun.ts @@ -7,7 +7,10 @@ await $`tsc`; const isDevelopment = Bun.env.NODE_ENV === "development"; // Build all JavaScript/TypeScript files -function buildJs(entrypoint: string, opts: Record = {}) { +function buildJs( + entrypoint: string, + opts: Partial[0]> = {}, +) { return Bun.build({ entrypoints: [entrypoint], outdir: "dist", @@ -27,6 +30,10 @@ await Promise.all([ outdir: "dist/src", external: ["@modelcontextprotocol/sdk"], }), + buildJs("src/app.ts", { + outdir: "dist/src", + naming: { entry: "app-with-deps.js" }, + }), buildJs("src/app-bridge.ts", { outdir: "dist/src", external: ["@modelcontextprotocol/sdk"], @@ -35,6 +42,11 @@ await Promise.all([ outdir: "dist/src/react", external: ["react", "react-dom", "@modelcontextprotocol/sdk"], }), + buildJs("src/react/index.tsx", { + outdir: "dist/src/react", + external: ["react", "react-dom", "@modelcontextprotocol/sdk"], + naming: { entry: "react-with-deps.js" }, + }), buildJs("src/server/index.ts", { outdir: "dist/src/server", external: ["@modelcontextprotocol/sdk"], diff --git a/package.json b/package.json index 2291a5f..b8490ae 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,18 @@ "types": "./dist/src/app.d.ts", "default": "./dist/src/app.js" }, + "./app-with-deps": { + "types": "./dist/src/app.d.ts", + "default": "./dist/src/app-with-deps.js" + }, "./react": { "types": "./dist/src/react/index.d.ts", "default": "./dist/src/react/index.js" }, + "./react-with-deps": { + "types": "./dist/src/react/index.d.ts", + "default": "./dist/src/react/react-with-deps.js" + }, "./app-bridge": { "types": "./dist/src/app-bridge.d.ts", "default": "./dist/src/app-bridge.js" From f8e31eb97fba635df1472bde17d776762c2d2eb6 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Fri, 9 Jan 2026 01:36:42 +0000 Subject: [PATCH 039/389] fix: ensure lib is built before examples:build (#185) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: ensure lib is built before examples:build Add preexamples:build hook to automatically run `npm run build` before `examples:build`. This ensures examples always type-check against the latest library code, catching breaking changes during development. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * feat: add version consistency check for examples Add scripts/check-versions.mjs to verify that example package.json files reference the correct version of @modelcontextprotocol/ext-apps. - Allows "../.." (local dev) or "^{root-version}" as valid dependencies - Runs in CI before npm install to catch mismatches early - Available locally via `npm run check:versions` ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * chore: regenerate package-lock.json for cross-platform compatibility --------- Co-authored-by: Claude --- .github/workflows/ci.yml | 4 + package-lock.json | 374 ++++++++++++++++++++++++++++--------- package.json | 6 +- scripts/check-versions.mjs | 49 +++++ 4 files changed, 338 insertions(+), 95 deletions(-) create mode 100644 scripts/check-versions.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70ee933..e8bf7ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,6 +36,10 @@ jobs: shell: bash run: '! grep -E "\"resolved\": \"https?://" package-lock.json | grep -v registry.npmjs.org' + - name: Verify example dependency versions + shell: bash + run: node scripts/check-versions.mjs + - uses: actions/setup-node@v4 with: node-version: "20" diff --git a/package-lock.json b/package-lock.json index 078cf71..780bf79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,8 +96,6 @@ }, "examples/basic-host/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -106,8 +104,6 @@ }, "examples/basic-host/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" }, @@ -137,8 +133,6 @@ }, "examples/basic-server-preact/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -147,8 +141,6 @@ }, "examples/basic-server-preact/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" }, @@ -181,8 +173,6 @@ }, "examples/basic-server-react/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -191,8 +181,6 @@ }, "examples/basic-server-react/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" }, @@ -222,8 +210,6 @@ }, "examples/basic-server-solid/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -232,8 +218,6 @@ }, "examples/basic-server-solid/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" }, @@ -263,8 +247,6 @@ }, "examples/basic-server-svelte/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -273,8 +255,6 @@ }, "examples/basic-server-svelte/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" }, @@ -302,8 +282,6 @@ }, "examples/basic-server-vanillajs/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -312,8 +290,6 @@ }, "examples/basic-server-vanillajs/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" }, @@ -343,8 +319,6 @@ }, "examples/basic-server-vue/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -353,8 +327,6 @@ }, "examples/basic-server-vue/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" }, @@ -383,8 +355,6 @@ }, "examples/budget-allocator-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -393,8 +363,6 @@ }, "examples/budget-allocator-server/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" }, @@ -427,8 +395,6 @@ }, "examples/cohort-heatmap-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -437,8 +403,6 @@ }, "examples/cohort-heatmap-server/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" }, @@ -467,8 +431,6 @@ }, "examples/customer-segmentation-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -477,8 +439,6 @@ }, "examples/customer-segmentation-server/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" }, @@ -508,8 +468,6 @@ }, "examples/integration-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -518,8 +476,6 @@ }, "examples/integration-server/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" }, @@ -553,8 +509,6 @@ }, "examples/scenario-modeler-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -563,8 +517,6 @@ }, "examples/scenario-modeler-server/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" }, @@ -593,8 +545,6 @@ }, "examples/sheet-music-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -603,8 +553,6 @@ }, "examples/sheet-music-server/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" }, @@ -634,8 +582,6 @@ }, "examples/system-monitor-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -644,8 +590,6 @@ }, "examples/system-monitor-server/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" }, @@ -680,8 +624,6 @@ }, "examples/threejs-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -690,8 +632,6 @@ }, "examples/threejs-server/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" }, @@ -719,8 +659,6 @@ }, "examples/video-resource-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -729,8 +667,6 @@ }, "examples/video-resource-server/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" }, @@ -760,8 +696,6 @@ }, "examples/wiki-explorer-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -770,8 +704,6 @@ }, "examples/wiki-explorer-server/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" }, @@ -2100,12 +2032,33 @@ "node": ">= 8.0.0" } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.55.1", @@ -2133,6 +2086,62 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", @@ -2146,6 +2155,118 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", @@ -2159,6 +2280,48 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", @@ -2172,6 +2335,34 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", @@ -2636,6 +2827,16 @@ } } }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", @@ -2732,12 +2933,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, "node_modules/@vue/compiler-dom": { "version": "3.5.26", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz", @@ -2765,12 +2960,6 @@ "source-map-js": "^1.2.1" } }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, "node_modules/@vue/compiler-ssr": { "version": "3.5.26", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz", @@ -4329,14 +4518,10 @@ } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" }, "node_modules/etag": { "version": "1.8.1", @@ -4604,6 +4789,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -5887,6 +6073,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -8149,6 +8336,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" diff --git a/package.json b/package.json index b8490ae..cd1d12b 100644 --- a/package.json +++ b/package.json @@ -49,13 +49,14 @@ "generate:schemas": "tsx scripts/generate-schemas.ts && prettier --write \"src/generated/**/*\"", "build": "npm run generate:schemas && node scripts/run-bun.mjs build.bun.ts", "prepack": "npm run build", - "build:all": "npm run build && npm run examples:build", + "build:all": "npm run examples:build", "test": "bun test src", "test:e2e": "playwright test", "test:e2e:update": "playwright test --update-snapshots", "test:e2e:ui": "playwright test --ui", "test:e2e:docker": "docker run --rm -v $(pwd):/work -w /work -it mcr.microsoft.com/playwright:v1.57.0-noble sh -c 'npm i -g bun && npm ci && npx playwright test'", "test:e2e:docker:update": "docker run --rm -v $(pwd):/work -w /work -it mcr.microsoft.com/playwright:v1.57.0-noble sh -c 'npm i -g bun && npm ci && npx playwright test --update-snapshots'", + "preexamples:build": "npm run build", "examples:build": "bun examples/run-all.ts build", "examples:start": "NODE_ENV=development npm run build && bun examples/run-all.ts start", "examples:dev": "NODE_ENV=development bun examples/run-all.ts dev", @@ -64,7 +65,8 @@ "docs": "typedoc", "docs:watch": "typedoc --watch", "prettier": "prettier -u \"**/*.{js,jsx,ts,tsx,mjs,json,md,yml,yaml}\" --check", - "prettier:fix": "prettier -u \"**/*.{js,jsx,ts,tsx,mjs,json,md,yml,yaml}\" --write" + "prettier:fix": "prettier -u \"**/*.{js,jsx,ts,tsx,mjs,json,md,yml,yaml}\" --write", + "check:versions": "node scripts/check-versions.mjs" }, "author": "Olivier Chafik", "devDependencies": { diff --git a/scripts/check-versions.mjs b/scripts/check-versions.mjs new file mode 100644 index 0000000..c80ad52 --- /dev/null +++ b/scripts/check-versions.mjs @@ -0,0 +1,49 @@ +#!/usr/bin/env node +/** + * Checks that example package.json files reference the same version + * of @modelcontextprotocol/ext-apps as the root package.json. + * + * This ensures examples stay in sync with the library version. + */ + +import { readFileSync, readdirSync, statSync, existsSync } from "fs"; +import { join } from "path"; + +const rootPkg = JSON.parse(readFileSync("package.json", "utf-8")); +const rootVersion = rootPkg.version; +const pkgName = rootPkg.name; + +const expectedDep = `^${rootVersion}`; + +let hasError = false; + +const examplesDir = "examples"; +const examples = readdirSync(examplesDir).filter((d) => { + const pkgPath = join(examplesDir, d, "package.json"); + return statSync(join(examplesDir, d)).isDirectory() && existsSync(pkgPath); +}); + +for (const example of examples) { + const pkgPath = join(examplesDir, example, "package.json"); + const pkg = JSON.parse(readFileSync(pkgPath, "utf-8")); + + const dep = pkg.dependencies?.[pkgName]; + // Allow "../.." (local dev) or the correct versioned dependency + if (dep && dep !== expectedDep && dep !== "../..") { + console.error( + `โŒ ${pkgPath}: expected "${pkgName}": "${expectedDep}" (or "../.."), got "${dep}"`, + ); + hasError = true; + } +} + +if (hasError) { + console.error( + `\nRun the following to fix:\n npm pkg set dependencies.${pkgName}=${expectedDep} --workspaces`, + ); + process.exit(1); +} else { + console.log( + `โœ… All examples reference ${pkgName}@${expectedDep} (root version: ${rootVersion})`, + ); +} From 4c51eb0301aece4fe55ae6136bf6444f6a484569 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Fri, 9 Jan 2026 18:22:27 +0000 Subject: [PATCH 040/389] chore: release 0.3.1 (#224) * chore: release 0.3.1 --- .github/workflows/npm-publish.yml | 6 ++ examples/basic-server-preact/package.json | 2 +- examples/basic-server-react/package.json | 2 +- examples/basic-server-solid/package.json | 2 +- examples/basic-server-svelte/package.json | 2 +- examples/basic-server-vanillajs/package.json | 2 +- examples/basic-server-vue/package.json | 2 +- examples/budget-allocator-server/package.json | 2 +- examples/cohort-heatmap-server/package.json | 2 +- .../customer-segmentation-server/package.json | 2 +- examples/scenario-modeler-server/package.json | 2 +- examples/sheet-music-server/package.json | 2 +- examples/system-monitor-server/package.json | 2 +- examples/threejs-server/package.json | 2 +- examples/video-resource-server/package.json | 2 +- examples/wiki-explorer-server/package.json | 2 +- package-lock.json | 102 +++++++++++++++--- package.json | 2 +- 18 files changed, 107 insertions(+), 33 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 325a838..b86a4d1 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -98,14 +98,20 @@ jobs: fail-fast: false matrix: example: + - basic-server-preact - basic-server-react + - basic-server-solid + - basic-server-svelte - basic-server-vanillajs + - basic-server-vue - budget-allocator-server - cohort-heatmap-server - customer-segmentation-server - scenario-modeler-server + - sheet-music-server - system-monitor-server - threejs-server + - video-resource-server - wiki-explorer-server steps: diff --git a/examples/basic-server-preact/package.json b/examples/basic-server-preact/package.json index 3b23705..db3ce2b 100644 --- a/examples/basic-server-preact/package.json +++ b/examples/basic-server-preact/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "preact": "^10.0.0", "zod": "^4.1.13" diff --git a/examples/basic-server-react/package.json b/examples/basic-server-react/package.json index d859013..6af5c31 100644 --- a/examples/basic-server-react/package.json +++ b/examples/basic-server-react/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/basic-server-solid/package.json b/examples/basic-server-solid/package.json index bf5b40d..7fc004b 100644 --- a/examples/basic-server-solid/package.json +++ b/examples/basic-server-solid/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "solid-js": "^1.9.0", "zod": "^4.1.13" diff --git a/examples/basic-server-svelte/package.json b/examples/basic-server-svelte/package.json index 7269f79..5b68000 100644 --- a/examples/basic-server-svelte/package.json +++ b/examples/basic-server-svelte/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "svelte": "^5.0.0", "zod": "^4.1.13" diff --git a/examples/basic-server-vanillajs/package.json b/examples/basic-server-vanillajs/package.json index 99d38d8..623f48f 100644 --- a/examples/basic-server-vanillajs/package.json +++ b/examples/basic-server-vanillajs/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, diff --git a/examples/basic-server-vue/package.json b/examples/basic-server-vue/package.json index ac836b5..757365c 100644 --- a/examples/basic-server-vue/package.json +++ b/examples/basic-server-vue/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "vue": "^3.5.0", "zod": "^4.1.13" diff --git a/examples/budget-allocator-server/package.json b/examples/budget-allocator-server/package.json index 4aee956..b58c1d1 100644 --- a/examples/budget-allocator-server/package.json +++ b/examples/budget-allocator-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" diff --git a/examples/cohort-heatmap-server/package.json b/examples/cohort-heatmap-server/package.json index 6d456d6..a4253d5 100644 --- a/examples/cohort-heatmap-server/package.json +++ b/examples/cohort-heatmap-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/customer-segmentation-server/package.json b/examples/customer-segmentation-server/package.json index b5694c7..c6019de 100644 --- a/examples/customer-segmentation-server/package.json +++ b/examples/customer-segmentation-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" diff --git a/examples/scenario-modeler-server/package.json b/examples/scenario-modeler-server/package.json index aa6f3da..c581a4d 100644 --- a/examples/scenario-modeler-server/package.json +++ b/examples/scenario-modeler-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "react": "^19.2.0", diff --git a/examples/sheet-music-server/package.json b/examples/sheet-music-server/package.json index bd1cefb..11c7f9e 100644 --- a/examples/sheet-music-server/package.json +++ b/examples/sheet-music-server/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "abcjs": "^6.4.4", "zod": "^4.1.13" diff --git a/examples/system-monitor-server/package.json b/examples/system-monitor-server/package.json index 573c63a..b6d6c23 100644 --- a/examples/system-monitor-server/package.json +++ b/examples/system-monitor-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "systeminformation": "^5.27.11", diff --git a/examples/threejs-server/package.json b/examples/threejs-server/package.json index 909c77d..6334d6a 100644 --- a/examples/threejs-server/package.json +++ b/examples/threejs-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/video-resource-server/package.json b/examples/video-resource-server/package.json index c765cef..590fd91 100644 --- a/examples/video-resource-server/package.json +++ b/examples/video-resource-server/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, diff --git a/examples/wiki-explorer-server/package.json b/examples/wiki-explorer-server/package.json index 1511dd5..60a2d68 100644 --- a/examples/wiki-explorer-server/package.json +++ b/examples/wiki-explorer-server/package.json @@ -27,7 +27,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "cheerio": "^1.0.0", "zod": "^4.1.13" diff --git a/package-lock.json b/package-lock.json index 780bf79..115e415 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@modelcontextprotocol/ext-apps", - "version": "0.3.0", + "version": "0.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@modelcontextprotocol/ext-apps", - "version": "0.3.0", + "version": "0.3.1", "hasInstallScript": true, "license": "MIT", "workspaces": [ @@ -96,6 +96,8 @@ }, "examples/basic-host/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -104,6 +106,8 @@ }, "examples/basic-host/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" }, @@ -112,7 +116,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "preact": "^10.0.0", "zod": "^4.1.13" @@ -133,6 +137,8 @@ }, "examples/basic-server-preact/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -141,6 +147,8 @@ }, "examples/basic-server-preact/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" }, @@ -149,7 +157,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -173,6 +181,8 @@ }, "examples/basic-server-react/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -181,6 +191,8 @@ }, "examples/basic-server-react/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" }, @@ -189,7 +201,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "solid-js": "^1.9.0", "zod": "^4.1.13" @@ -210,6 +222,8 @@ }, "examples/basic-server-solid/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -218,6 +232,8 @@ }, "examples/basic-server-solid/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" }, @@ -226,7 +242,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "svelte": "^5.0.0", "zod": "^4.1.13" @@ -247,6 +263,8 @@ }, "examples/basic-server-svelte/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -255,6 +273,8 @@ }, "examples/basic-server-svelte/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" }, @@ -263,7 +283,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -282,6 +302,8 @@ }, "examples/basic-server-vanillajs/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -290,6 +312,8 @@ }, "examples/basic-server-vanillajs/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" }, @@ -298,7 +322,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "vue": "^3.5.0", "zod": "^4.1.13" @@ -319,6 +343,8 @@ }, "examples/basic-server-vue/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -327,6 +353,8 @@ }, "examples/basic-server-vue/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" }, @@ -335,7 +363,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -355,6 +383,8 @@ }, "examples/budget-allocator-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -363,6 +393,8 @@ }, "examples/budget-allocator-server/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" }, @@ -371,7 +403,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -395,6 +427,8 @@ }, "examples/cohort-heatmap-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -403,6 +437,8 @@ }, "examples/cohort-heatmap-server/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" }, @@ -411,7 +447,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "zod": "^4.1.13" @@ -431,6 +467,8 @@ }, "examples/customer-segmentation-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -439,6 +477,8 @@ }, "examples/customer-segmentation-server/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" }, @@ -468,6 +508,8 @@ }, "examples/integration-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -476,6 +518,8 @@ }, "examples/integration-server/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" }, @@ -484,7 +528,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "react": "^19.2.0", @@ -509,6 +553,8 @@ }, "examples/scenario-modeler-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -517,6 +563,8 @@ }, "examples/scenario-modeler-server/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" }, @@ -525,7 +573,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "abcjs": "^6.4.4", "zod": "^4.1.13" @@ -545,6 +593,8 @@ }, "examples/sheet-music-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -553,6 +603,8 @@ }, "examples/sheet-music-server/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" }, @@ -561,7 +613,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "chart.js": "^4.4.0", "systeminformation": "^5.27.11", @@ -582,6 +634,8 @@ }, "examples/system-monitor-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -590,6 +644,8 @@ }, "examples/system-monitor-server/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" }, @@ -598,7 +654,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -624,6 +680,8 @@ }, "examples/threejs-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -632,6 +690,8 @@ }, "examples/threejs-server/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" }, @@ -640,7 +700,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "zod": "^4.1.13" }, @@ -659,6 +719,8 @@ }, "examples/video-resource-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -667,6 +729,8 @@ }, "examples/video-resource-server/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" }, @@ -675,7 +739,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/ext-apps": "^0.3.0", + "@modelcontextprotocol/ext-apps": "^0.3.1", "@modelcontextprotocol/sdk": "^1.24.0", "cheerio": "^1.0.0", "zod": "^4.1.13" @@ -696,6 +760,8 @@ }, "examples/wiki-explorer-server/node_modules/@types/node": { "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -704,6 +770,8 @@ }, "examples/wiki-explorer-server/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" }, diff --git a/package.json b/package.json index cd1d12b..c90f05b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "url": "https://github.com/modelcontextprotocol/ext-apps" }, "homepage": "https://github.com/modelcontextprotocol/ext-apps", - "version": "0.3.0", + "version": "0.3.1", "license": "MIT", "description": "MCP Apps SDK โ€” Enable MCP servers to display interactive user interfaces in conversational clients.", "type": "module", From df49e88b2d625b620243bd3d2905e1ed3148103a Mon Sep 17 00:00:00 2001 From: Ido Salomon Date: Sun, 11 Jan 2026 14:54:18 +0200 Subject: [PATCH 041/389] fix: align CSP sample with resourceDomains spec (#233) --- specification/draft/apps.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index 8305003..2f95daa 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -1480,8 +1480,8 @@ const csp = resource._meta?.ui?.csp; const cspValue = ` default-src 'none'; - script-src 'self' 'unsafe-inline'; - style-src 'self' 'unsafe-inline'; + script-src 'self' 'unsafe-inline' ${csp?.resourceDomains?.join(' ') || ''}; + style-src 'self' 'unsafe-inline' ${csp?.resourceDomains?.join(' ') || ''}; connect-src 'self' ${csp?.connectDomains?.join(' ') || ''}; img-src 'self' data: ${csp?.resourceDomains?.join(' ') || ''}; font-src 'self' ${csp?.resourceDomains?.join(' ') || ''}; From 8b09f4278c08cbcae644965bf8a089a53bd3e32c Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Sun, 11 Jan 2026 14:32:48 +0000 Subject: [PATCH 042/389] fix: proper CSP handling in basic-host sandboxing (HTTP headers, worker-src, document.write) (#234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Move CSP to HTTP headers + add worker-src, frameDomains, baseUriDomains, permissions Security improvements: - CSP is now set via HTTP headers in serve.ts instead of meta tags (meta tag CSP can be tampered with by same-origin content) - CSP passed as query param to sandbox.html for header-based enforcement New CSP/permissions features (borrowed from PR #158): - frameDomains: control frame-src directive for nested iframes - baseUriDomains: control base-uri directive - permissions: camera, microphone, geolocation via iframe allow attribute WebGL fix: - Use document.write() instead of srcdoc for inner iframe content (srcdoc creates opaque origin that breaks WebGL canvas updates) - Add worker-src directive with blob: support (critical for WebGL apps like CesiumJS/Three.js that use workers for tile decoding, terrain processing, image processing) ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor: Remove permissions support (defer to PR #158) Keep this PR focused on CSP security fixes only. Permissions (camera, microphone, geolocation) will be handled in #158. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * cleanup McpUiResourceCsp type usage / duplicate defs * fix: guard against CSP injection in domain parameters Validate CSP domain entries to reject characters that could: - Break out of CSP directives (semicolons, newlines) - Inject CSP keywords like 'unsafe-eval' (quotes) - Inject multiple sources in one entry (spaces) This prevents injection attacks where malicious domains could override the security policy. --------- Co-authored-by: Claude Opus 4.5 --- examples/basic-host/sandbox.html | 4 +- examples/basic-host/serve.ts | 86 +++++- examples/basic-host/src/implementation.ts | 24 +- examples/basic-host/src/index.tsx | 25 +- examples/basic-host/src/sandbox.ts | 54 +--- examples/basic-host/src/tamper-detection.ts | 325 ++++++++++++++++++++ specification/draft/apps.mdx | 36 ++- src/generated/schema.json | 42 +++ src/generated/schema.test.ts | 28 +- src/generated/schema.ts | 92 +++--- src/spec.types.ts | 11 +- 11 files changed, 572 insertions(+), 155 deletions(-) create mode 100644 examples/basic-host/src/tamper-detection.ts diff --git a/examples/basic-host/sandbox.html b/examples/basic-host/sandbox.html index b868e58..e0790fb 100644 --- a/examples/basic-host/sandbox.html +++ b/examples/basic-host/sandbox.html @@ -3,8 +3,8 @@ - + MCP-UI Proxy + + +

+ +
Loading globe...
+ + + diff --git a/examples/map-server/package.json b/examples/map-server/package.json new file mode 100644 index 0000000..2385f50 --- /dev/null +++ b/examples/map-server/package.json @@ -0,0 +1,46 @@ +{ + "name": "@modelcontextprotocol/server-map", + "version": "0.1.0", + "type": "module", + "description": "MCP App Server example with CesiumJS 3D globe and geocoding", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/map-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], + "scripts": { + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", + "watch": "cross-env INPUT=mcp-app.html vite build --watch", + "serve:http": "bun server.ts", + "serve:stdio": "bun server.ts --stdio", + "start": "npm run start:http", + "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", + "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } +} diff --git a/examples/map-server/server-utils.ts b/examples/map-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/map-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/map-server/server.ts b/examples/map-server/server.ts new file mode 100644 index 0000000..b36db93 --- /dev/null +++ b/examples/map-server/server.ts @@ -0,0 +1,268 @@ +/** + * CesiumJS Map MCP Server + * + * Provides tools for: + * - geocode: Search for places using OpenStreetMap Nominatim + * - show-map: Display an interactive 3D globe at a given location + */ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import type { + CallToolResult, + ReadResourceResult, +} from "@modelcontextprotocol/sdk/types.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { z } from "zod"; +import { + registerAppTool, + registerAppResource, + RESOURCE_MIME_TYPE, + RESOURCE_URI_META_KEY, +} from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; + +const DIST_DIR = path.join(import.meta.dirname, "dist"); +const RESOURCE_URI = "ui://cesium-map/mcp-app.html"; + +// Nominatim API response type +interface NominatimResult { + place_id: number; + licence: string; + osm_type: string; + osm_id: number; + lat: string; + lon: string; + display_name: string; + boundingbox: [string, string, string, string]; // [south, north, west, east] + class: string; + type: string; + importance: number; +} + +// Rate limiting for Nominatim (1 request per second per their usage policy) +let lastNominatimRequest = 0; +const NOMINATIM_RATE_LIMIT_MS = 1100; // 1.1 seconds to be safe + +/** + * Query Nominatim geocoding API with rate limiting + */ +async function geocodeWithNominatim(query: string): Promise { + // Respect rate limit + const now = Date.now(); + const timeSinceLastRequest = now - lastNominatimRequest; + if (timeSinceLastRequest < NOMINATIM_RATE_LIMIT_MS) { + await new Promise((resolve) => + setTimeout(resolve, NOMINATIM_RATE_LIMIT_MS - timeSinceLastRequest), + ); + } + lastNominatimRequest = Date.now(); + + const params = new URLSearchParams({ + q: query, + format: "json", + limit: "5", + }); + + const response = await fetch( + `https://nominatim.openstreetmap.org/search?${params}`, + { + headers: { + "User-Agent": + "MCP-CesiumMap-Example/1.0 (https://github.com/modelcontextprotocol)", + }, + }, + ); + + if (!response.ok) { + throw new Error( + `Nominatim API error: ${response.status} ${response.statusText}`, + ); + } + + return response.json(); +} + +/** + * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. + */ +export function createServer(): McpServer { + const server = new McpServer({ + name: "CesiumJS Map Server", + version: "1.0.0", + }); + + // CSP configuration for external tile sources + const cspMeta = { + ui: { + csp: { + // Allow fetching tiles from OSM (tiles + geocoding) and Cesium assets + connectDomains: [ + "https://*.openstreetmap.org", // OSM tiles + Nominatim geocoding + "https://cesium.com", + "https://*.cesium.com", + ], + // Allow loading tile images, scripts, and Cesium CDN resources + resourceDomains: [ + "https://*.openstreetmap.org", // OSM map tiles (covers tile.openstreetmap.org) + "https://cesium.com", + "https://*.cesium.com", + ], + }, + }, + }; + + // Register the CesiumJS map resource with CSP for external tile sources + registerAppResource( + server, + RESOURCE_URI, + RESOURCE_URI, + { mimeType: RESOURCE_MIME_TYPE }, + async (): Promise => { + const html = await fs.readFile( + path.join(DIST_DIR, "mcp-app.html"), + "utf-8", + ); + return { + contents: [ + // _meta must be on the content item, not the resource metadata + { + uri: RESOURCE_URI, + mimeType: RESOURCE_MIME_TYPE, + text: html, + _meta: cspMeta, + }, + ], + }; + }, + ); + + // show-map tool - displays the CesiumJS globe + // Default bounding box: London area + registerAppTool( + server, + "show-map", + { + title: "Show Map", + description: + "Display an interactive world map zoomed to a specific bounding box. Use the GeoCode tool to find the bounding box of a location.", + inputSchema: { + west: z + .number() + .optional() + .default(-0.5) + .describe("Western longitude (-180 to 180)"), + south: z + .number() + .optional() + .default(51.3) + .describe("Southern latitude (-90 to 90)"), + east: z + .number() + .optional() + .default(0.3) + .describe("Eastern longitude (-180 to 180)"), + north: z + .number() + .optional() + .default(51.7) + .describe("Northern latitude (-90 to 90)"), + label: z + .string() + .optional() + .describe("Optional label to display on the map"), + }, + _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + }, + async ({ west, south, east, north, label }): Promise => ({ + content: [ + { + type: "text", + text: `Displaying globe at: W:${west.toFixed(4)}, S:${south.toFixed(4)}, E:${east.toFixed(4)}, N:${north.toFixed(4)}${label ? ` (${label})` : ""}`, + }, + ], + }), + ); + + // geocode tool - searches for places using Nominatim (no UI) + server.registerTool( + "geocode", + { + title: "Geocode", + description: + "Search for places using OpenStreetMap. Returns coordinates and bounding boxes for up to 5 matches.", + inputSchema: { + query: z + .string() + .describe( + "Place name or address to search for (e.g., 'Paris', 'Golden Gate Bridge', '1600 Pennsylvania Ave')", + ), + }, + }, + async ({ query }): Promise => { + try { + const results = await geocodeWithNominatim(query); + + if (results.length === 0) { + return { + content: [ + { type: "text", text: `No results found for "${query}"` }, + ], + }; + } + + const formattedResults = results.map((r) => ({ + displayName: r.display_name, + lat: parseFloat(r.lat), + lon: parseFloat(r.lon), + boundingBox: { + south: parseFloat(r.boundingbox[0]), + north: parseFloat(r.boundingbox[1]), + west: parseFloat(r.boundingbox[2]), + east: parseFloat(r.boundingbox[3]), + }, + type: r.type, + importance: r.importance, + })); + + const textContent = formattedResults + .map( + (r, i) => + `${i + 1}. ${r.displayName}\n Coordinates: ${r.lat.toFixed(6)}, ${r.lon.toFixed(6)}\n Bounding box: W:${r.boundingBox.west.toFixed(4)}, S:${r.boundingBox.south.toFixed(4)}, E:${r.boundingBox.east.toFixed(4)}, N:${r.boundingBox.north.toFixed(4)}`, + ) + .join("\n\n"); + + return { + content: [{ type: "text", text: textContent }], + }; + } catch (error) { + return { + content: [ + { + type: "text", + text: `Geocoding error: ${error instanceof Error ? error.message : String(error)}`, + }, + ], + isError: true, + }; + } + }, + ); + + return server; +} + +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "CesiumJS Map Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/map-server/src/mcp-app.ts b/examples/map-server/src/mcp-app.ts new file mode 100644 index 0000000..b78aee7 --- /dev/null +++ b/examples/map-server/src/mcp-app.ts @@ -0,0 +1,843 @@ +/** + * CesiumJS Globe MCP App + * + * Displays a 3D globe using CesiumJS with OpenStreetMap tiles. + * Receives initial bounding box from the show-map tool and exposes + * a navigate-to tool for the host to control navigation. + */ +import { App } from "@modelcontextprotocol/ext-apps"; +import { z } from "zod"; + +// TypeScript declaration for Cesium loaded from CDN +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare let Cesium: any; + +const CESIUM_VERSION = "1.123"; +const CESIUM_BASE_URL = `https://cesium.com/downloads/cesiumjs/releases/${CESIUM_VERSION}/Build/Cesium`; + +/** + * Dynamically load CesiumJS from CDN + * This is necessary because external + + + diff --git a/examples/map-server/tsconfig.json b/examples/map-server/tsconfig.json new file mode 100644 index 0000000..535267b --- /dev/null +++ b/examples/map-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts"] +} diff --git a/examples/map-server/vite.config.ts b/examples/map-server/vite.config.ts new file mode 100644 index 0000000..005ecaf --- /dev/null +++ b/examples/map-server/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/package-lock.json b/package-lock.json index 115e415..8b74a9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,8 +96,6 @@ }, "examples/basic-host/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -137,8 +135,6 @@ }, "examples/basic-server-preact/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -181,8 +177,6 @@ }, "examples/basic-server-react/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -222,8 +216,6 @@ }, "examples/basic-server-solid/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -263,8 +255,6 @@ }, "examples/basic-server-svelte/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -302,8 +292,6 @@ }, "examples/basic-server-vanillajs/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -343,8 +331,6 @@ }, "examples/basic-server-vue/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -383,8 +369,6 @@ }, "examples/budget-allocator-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -427,8 +411,6 @@ }, "examples/cohort-heatmap-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -467,8 +449,6 @@ }, "examples/customer-segmentation-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -508,8 +488,6 @@ }, "examples/integration-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -523,6 +501,43 @@ "dev": true, "license": "MIT" }, + "examples/map-server": { + "name": "@modelcontextprotocol/server-map", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/map-server/node_modules/@types/node": { + "version": "22.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/map-server/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" + }, "examples/scenario-modeler-server": { "name": "@modelcontextprotocol/server-scenario-modeler", "version": "0.1.0", @@ -553,8 +568,6 @@ }, "examples/scenario-modeler-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -593,8 +606,6 @@ }, "examples/sheet-music-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -634,8 +645,6 @@ }, "examples/system-monitor-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -680,8 +689,6 @@ }, "examples/threejs-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -719,8 +726,6 @@ }, "examples/video-resource-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -760,8 +765,6 @@ }, "examples/wiki-explorer-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -1777,6 +1780,10 @@ "resolved": "examples/customer-segmentation-server", "link": true }, + "node_modules/@modelcontextprotocol/server-map": { + "resolved": "examples/map-server", + "link": true + }, "node_modules/@modelcontextprotocol/server-scenario-modeler": { "resolved": "examples/scenario-modeler-server", "link": true diff --git a/tests/e2e/servers.spec.ts b/tests/e2e/servers.spec.ts index e554bc3..7c7099c 100644 --- a/tests/e2e/servers.spec.ts +++ b/tests/e2e/servers.spec.ts @@ -13,6 +13,7 @@ const DYNAMIC_MASKS: Record = { "basic-vue": ["#server-time"], // Server time display "cohort-heatmap": ['[class*="heatmapWrapper"]'], // Heatmap grid (random data) "customer-segmentation": [".chart-container"], // Scatter plot (random data) + // Note: map-server uses SLOW_SERVERS timeout instead of masking to wait for tiles "system-monitor": [ ".chart-container", // CPU chart (highly dynamic) "#status-text", // Current timestamp @@ -25,6 +26,12 @@ const DYNAMIC_MASKS: Record = { "wiki-explorer": ["#graph"], // Force-directed graph (dynamic layout) }; +// Servers that need extra stabilization time (e.g., for tile loading, WebGL init) +const SLOW_SERVERS: Record = { + "map-server": 5000, // CesiumJS needs time for tiles to load + threejs: 2000, // Three.js WebGL initialization +}; + // Server configurations (key is used for screenshot filenames, name is the MCP server name) const SERVERS = [ { key: "integration", name: "Integration Test Server" }, @@ -37,6 +44,7 @@ const SERVERS = [ { key: "budget-allocator", name: "Budget Allocator Server" }, { key: "cohort-heatmap", name: "Cohort Heatmap Server" }, { key: "customer-segmentation", name: "Customer Segmentation Server" }, + { key: "map-server", name: "CesiumJS Map Server" }, { key: "scenario-modeler", name: "SaaS Scenario Modeler" }, { key: "sheet-music", name: "Sheet Music Server" }, { key: "system-monitor", name: "System Monitor Server" }, @@ -121,7 +129,10 @@ SERVERS.forEach((server) => { test("screenshot matches golden", async ({ page }) => { await loadServer(page, server.name); - await page.waitForTimeout(500); // Brief stabilization + + // Some servers (WebGL, tile-based) need extra stabilization time + const stabilizationMs = SLOW_SERVERS[server.key] ?? 500; + await page.waitForTimeout(stabilizationMs); // Get mask locators for dynamic content (timestamps, charts, etc.) const mask = getMaskLocators(page, server.key); diff --git a/tests/e2e/servers.spec.ts-snapshots/map-server.png b/tests/e2e/servers.spec.ts-snapshots/map-server.png new file mode 100644 index 0000000000000000000000000000000000000000..d53de01e8477dcc6dba8a7263f558ce7233cc6e2 GIT binary patch literal 395717 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
2b}0?m)tJ$llAQm^A|s`ypNCQxz45y=Jk-Am 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

$ex|aNeUf*9Q;P5J_)v%2SaggRRcfmgQpkv6 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 bf&vita_grDcYES_Ij$I({EoU{`}BVSWD0bJ literal 0 HcmV?d00001 From 9f09932baf5397bd7cab58f1b6472d4fa186a2f8 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Mon, 12 Jan 2026 14:25:16 +0000 Subject: [PATCH 045/389] feat: use structuredContent with outputSchema in example servers (#220) * build app-with-deps * make registerAppTool more interchangeable w/ server.registerTool * feat: use structuredContent in all example servers All servers now return structuredContent alongside JSON text content. All mcp-apps now read structuredContent directly (no JSON.parse fallback). Updated servers: - basic-server-vanillajs - budget-allocator-server - cohort-heatmap-server - customer-segmentation-server - integration-server - scenario-modeler-server - system-monitor-server - threejs-server - video-resource-server - wiki-explorer-server * feat: add outputSchema to all example servers Define output schemas for structuredContent validation: - basic-server-vanillajs: { time: string } - budget-allocator-server: BudgetDataResponseSchema - cohort-heatmap-server: CohortDataSchema - customer-segmentation-server: customers/segments schema - integration-server: { time: string } - scenario-modeler-server: templates/defaultInputs schema - system-monitor-server: SystemStatsSchema - threejs-server: { code, height } - video-resource-server: { videoUri, description } - wiki-explorer-server: { page, links, error } * prettier:fix * make registerAppTool more interchangeable w/ server.registerTool * feat: use structuredContent in all example servers All servers now return structuredContent alongside JSON text content. All mcp-apps now read structuredContent directly (no JSON.parse fallback). Updated servers: - basic-server-vanillajs - budget-allocator-server - cohort-heatmap-server - customer-segmentation-server - integration-server - scenario-modeler-server - system-monitor-server - threejs-server - video-resource-server - wiki-explorer-server * feat: add outputSchema to all example servers Define output schemas for structuredContent validation: - basic-server-vanillajs: { time: string } - budget-allocator-server: BudgetDataResponseSchema - cohort-heatmap-server: CohortDataSchema - customer-segmentation-server: customers/segments schema - integration-server: { time: string } - scenario-modeler-server: templates/defaultInputs schema - system-monitor-server: SystemStatsSchema - threejs-server: { code, height } - video-resource-server: { videoUri, description } - wiki-explorer-server: { page, links, error } * prettier:fix * revert: remove unrelated workflow, version, and arch changes * chore: update package-lock.json * refactor(basic-server-vanillajs): address PR review comments - Simplify server.ts to return plain time string in text content (not JSON), matching the quickstart guide pattern - Add defensive coding in mcp-app.ts with optional chaining and fallback to handle potential type mismatches gracefully * refactor: restore rich text formatting for LLM-readable content Restore the human-readable text formatting functions that were removed, providing meaningful summaries in the text content while keeping structuredContent for programmatic UI consumption: - budget-allocator-server: formatBudgetSummary with config overview - cohort-heatmap-server: formatCohortSummary with retention stats - scenario-modeler-server: formatScenarioSummary with financial metrics --- examples/basic-server-vanillajs/server.ts | 7 +- .../basic-server-vanillajs/src/mcp-app.ts | 4 +- examples/budget-allocator-server/server.ts | 28 +++++++- .../budget-allocator-server/src/mcp-app.ts | 8 +-- examples/cohort-heatmap-server/server.ts | 15 +++- .../cohort-heatmap-server/src/mcp-app.tsx | 8 +-- .../customer-segmentation-server/server.ts | 25 +++++++ examples/integration-server/server.ts | 8 ++- examples/integration-server/src/mcp-app.tsx | 8 +-- examples/scenario-modeler-server/server.ts | 71 ++++++++++++++++--- .../scenario-modeler-server/src/mcp-app.tsx | 16 +---- examples/system-monitor-server/server.ts | 2 + examples/system-monitor-server/src/mcp-app.ts | 8 +-- examples/threejs-server/server.ts | 13 ++-- examples/video-resource-server/server.ts | 19 ++--- examples/video-resource-server/src/mcp-app.ts | 16 ++--- examples/wiki-explorer-server/server.ts | 23 +++++- examples/wiki-explorer-server/src/mcp-app.ts | 50 ++++++------- package-lock.json | 12 ++-- 19 files changed, 218 insertions(+), 123 deletions(-) diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index 2717fc3..ef661a8 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -3,6 +3,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; +import { z } from "zod"; import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; @@ -28,12 +29,16 @@ export function createServer(): McpServer { title: "Get Time", description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, + outputSchema: z.object({ + time: z.string(), + }), _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async (): Promise => { const time = new Date().toISOString(); return { - content: [{ type: "text", text: JSON.stringify({ time }) }], + content: [{ type: "text", text: time }], + structuredContent: { time }, }; }, ); diff --git a/examples/basic-server-vanillajs/src/mcp-app.ts b/examples/basic-server-vanillajs/src/mcp-app.ts index 59e7128..2a5500a 100644 --- a/examples/basic-server-vanillajs/src/mcp-app.ts +++ b/examples/basic-server-vanillajs/src/mcp-app.ts @@ -15,8 +15,8 @@ const log = { function extractTime(result: CallToolResult): string { - const { text } = result.content?.find((c) => c.type === "text")!; - return text; + const { time } = (result.structuredContent as { time?: string }) ?? {}; + return time ?? "[ERROR]"; } diff --git a/examples/budget-allocator-server/server.ts b/examples/budget-allocator-server/server.ts index 3b780d1..a902eea 100755 --- a/examples/budget-allocator-server/server.ts +++ b/examples/budget-allocator-server/server.ts @@ -224,6 +224,30 @@ function generateHistory( return months; } +// --------------------------------------------------------------------------- +// Response Formatting +// --------------------------------------------------------------------------- + +function formatBudgetSummary(data: BudgetDataResponse): string { + const lines: string[] = [ + "Budget Allocator Configuration", + "==============================", + "", + `Default Budget: ${data.config.currencySymbol}${data.config.defaultBudget.toLocaleString()}`, + `Available Presets: ${data.config.presetBudgets.map((b) => `${data.config.currencySymbol}${b.toLocaleString()}`).join(", ")}`, + "", + "Categories:", + ...data.config.categories.map( + (c) => ` - ${c.name}: ${c.defaultPercent}% default`, + ), + "", + `Historical Data: ${data.analytics.history.length} months`, + `Benchmark Stages: ${data.analytics.stages.join(", ")}`, + `Default Stage: ${data.analytics.defaultStage}`, + ]; + return lines.join("\n"); +} + // --------------------------------------------------------------------------- // MCP Server Setup // --------------------------------------------------------------------------- @@ -248,6 +272,7 @@ export function createServer(): McpServer { description: "Returns budget configuration with 24 months of historical allocations and industry benchmarks by company stage", inputSchema: {}, + outputSchema: BudgetDataResponseSchema, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { @@ -276,9 +301,10 @@ export function createServer(): McpServer { content: [ { type: "text", - text: JSON.stringify(response), + text: formatBudgetSummary(response), }, ], + structuredContent: response, }; }, ); diff --git a/examples/budget-allocator-server/src/mcp-app.ts b/examples/budget-allocator-server/src/mcp-app.ts index 4510a85..4e8c62d 100644 --- a/examples/budget-allocator-server/src/mcp-app.ts +++ b/examples/budget-allocator-server/src/mcp-app.ts @@ -607,13 +607,7 @@ const app = new App({ name: "Budget Allocator", version: "1.0.0" }); app.ontoolresult = (result) => { log.info("Received tool result:", result); - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const data = JSON.parse(text) as BudgetDataResponse; + const data = result.structuredContent as unknown as BudgetDataResponse; if (data?.config && data?.analytics) { initializeUI(data.config, data.analytics); } diff --git a/examples/cohort-heatmap-server/server.ts b/examples/cohort-heatmap-server/server.ts index ccbe408..6a902d6 100644 --- a/examples/cohort-heatmap-server/server.ts +++ b/examples/cohort-heatmap-server/server.ts @@ -152,6 +152,17 @@ function generateCohortData( }; } +function formatCohortSummary(data: CohortData): string { + const avgRetention = data.cohorts + .flatMap((c) => c.cells) + .filter((cell) => cell.periodIndex > 0) + .reduce((sum, cell, _, arr) => sum + cell.retention / arr.length, 0); + + return `Cohort Analysis: ${data.cohorts.length} cohorts, ${data.periods.length} periods +Average retention: ${(avgRetention * 100).toFixed(1)}% +Metric: ${data.metric}, Period: ${data.periodType}`; +} + export function createServer(): McpServer { const server = new McpServer({ name: "Cohort Heatmap Server", @@ -169,6 +180,7 @@ export function createServer(): McpServer { description: "Returns cohort retention heatmap data showing customer retention over time by signup month", inputSchema: GetCohortDataInputSchema.shape, + outputSchema: CohortDataSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ metric, periodType, cohortCount, maxPeriods }) => { @@ -180,7 +192,8 @@ export function createServer(): McpServer { ); return { - content: [{ type: "text", text: JSON.stringify(data) }], + content: [{ type: "text", text: formatCohortSummary(data) }], + structuredContent: data, }; }, ); diff --git a/examples/cohort-heatmap-server/src/mcp-app.tsx b/examples/cohort-heatmap-server/src/mcp-app.tsx index ce5c3e1..919b6d1 100644 --- a/examples/cohort-heatmap-server/src/mcp-app.tsx +++ b/examples/cohort-heatmap-server/src/mcp-app.tsx @@ -123,13 +123,7 @@ function CohortHeatmapInner({ maxPeriods: 12, }, }); - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - setData(JSON.parse(text) as CohortData); + setData(result.structuredContent as unknown as CohortData); } catch (e) { console.error("Failed to fetch cohort data:", e); } finally { diff --git a/examples/customer-segmentation-server/server.ts b/examples/customer-segmentation-server/server.ts index 4736f61..527855a 100644 --- a/examples/customer-segmentation-server/server.ts +++ b/examples/customer-segmentation-server/server.ts @@ -30,6 +30,29 @@ const GetCustomerDataInputSchema = z.object({ .describe("Filter by segment (default: All)"), }); +const CustomerSchema = z.object({ + id: z.string(), + name: z.string(), + segment: z.string(), + annualRevenue: z.number(), + employeeCount: z.number(), + accountAge: z.number(), + engagementScore: z.number(), + supportTickets: z.number(), + nps: z.number(), +}); + +const SegmentSummarySchema = z.object({ + name: z.string(), + count: z.number(), + color: z.string(), +}); + +const GetCustomerDataOutputSchema = z.object({ + customers: z.array(CustomerSchema), + segments: z.array(SegmentSummarySchema), +}); + // Cache generated data for session consistency let cachedCustomers: Customer[] | null = null; let cachedSegments: SegmentSummary[] | null = null; @@ -78,6 +101,7 @@ export function createServer(): McpServer { description: "Returns customer data with segment information for visualization. Optionally filter by segment.", inputSchema: GetCustomerDataInputSchema.shape, + outputSchema: GetCustomerDataOutputSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ segment }): Promise => { @@ -85,6 +109,7 @@ export function createServer(): McpServer { return { content: [{ type: "text", text: JSON.stringify(data) }], + structuredContent: data, }; }, ); diff --git a/examples/integration-server/server.ts b/examples/integration-server/server.ts index d2edd23..700f1eb 100644 --- a/examples/integration-server/server.ts +++ b/examples/integration-server/server.ts @@ -6,6 +6,7 @@ import type { } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; +import { z } from "zod"; import { registerAppTool, registerAppResource, @@ -33,16 +34,21 @@ export function createServer(): McpServer { title: "Get Time", description: "Returns the current server time.", inputSchema: {}, + outputSchema: z.object({ + time: z.string(), + }), _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async (): Promise => { + const time = new Date().toISOString(); return { content: [ { type: "text", - text: JSON.stringify({ time: new Date().toISOString() }), + text: JSON.stringify({ time }), }, ], + structuredContent: { time }, }; }, ); diff --git a/examples/integration-server/src/mcp-app.tsx b/examples/integration-server/src/mcp-app.tsx index fadffdb..7304ca9 100644 --- a/examples/integration-server/src/mcp-app.tsx +++ b/examples/integration-server/src/mcp-app.tsx @@ -17,13 +17,7 @@ const log = { }; function extractTime(callToolResult: CallToolResult): string { - const text = callToolResult - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const { time } = JSON.parse(text) as { time: string }; + const { time } = callToolResult.structuredContent as { time: string }; return time; } diff --git a/examples/scenario-modeler-server/server.ts b/examples/scenario-modeler-server/server.ts index 3ce2066..6abb352 100644 --- a/examples/scenario-modeler-server/server.ts +++ b/examples/scenario-modeler-server/server.ts @@ -64,6 +64,13 @@ const GetScenarioDataInputSchema = z.object({ ), }); +const GetScenarioDataOutputSchema = z.object({ + templates: z.array(ScenarioTemplateSchema), + defaultInputs: ScenarioInputsSchema, + customProjections: z.array(MonthlyProjectionSchema).optional(), + customSummary: ScenarioSummarySchema.optional(), +}); + // Types derived from schemas type ScenarioInputs = z.infer; type MonthlyProjection = z.infer; @@ -243,6 +250,37 @@ const DEFAULT_INPUTS: ScenarioInputs = { fixedCosts: 30000, }; +// ============================================================================ +// Formatters for text output +// ============================================================================ + +function formatCurrency(value: number): string { + const absValue = Math.abs(value); + const sign = value < 0 ? "-" : ""; + if (absValue >= 1_000_000) { + return `${sign}$${(absValue / 1_000_000).toFixed(2)}M`; + } + if (absValue >= 1_000) { + return `${sign}$${(absValue / 1_000).toFixed(1)}K`; + } + return `${sign}$${Math.round(absValue)}`; +} + +function formatScenarioSummary( + summary: ScenarioSummary, + label: string, +): string { + return [ + `${label}:`, + ` Ending MRR: ${formatCurrency(summary.endingMRR)}`, + ` ARR: ${formatCurrency(summary.arr)}`, + ` Total Revenue: ${formatCurrency(summary.totalRevenue)}`, + ` Total Profit: ${formatCurrency(summary.totalProfit)}`, + ` MRR Growth: ${summary.mrrGrowthPct.toFixed(1)}%`, + ` Break-even: ${summary.breakEvenMonth ? `Month ${summary.breakEvenMonth}` : "Not achieved"}`, + ].join("\n"); +} + // ============================================================================ // MCP Server // ============================================================================ @@ -269,6 +307,7 @@ export function createServer(): McpServer { description: "Returns SaaS scenario templates and optionally computes custom projections for given inputs", inputSchema: GetScenarioDataInputSchema.shape, + outputSchema: GetScenarioDataOutputSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (args: { @@ -278,18 +317,28 @@ export function createServer(): McpServer { ? calculateScenario(args.customInputs) : undefined; + const text = [ + "SaaS Scenario Modeler", + "=".repeat(40), + "", + "Available Templates:", + ...SCENARIO_TEMPLATES.map( + (t) => ` ${t.icon} ${t.name}: ${t.description}`, + ), + "", + customScenario + ? formatScenarioSummary(customScenario.summary, "Custom Scenario") + : "Use customInputs parameter to compute projections for a specific scenario.", + ].join("\n"); + return { - content: [ - { - type: "text", - text: JSON.stringify({ - templates: SCENARIO_TEMPLATES, - defaultInputs: DEFAULT_INPUTS, - customProjections: customScenario?.projections, - customSummary: customScenario?.summary, - }), - }, - ], + content: [{ type: "text", text }], + structuredContent: { + templates: SCENARIO_TEMPLATES, + defaultInputs: DEFAULT_INPUTS, + customProjections: customScenario?.projections, + customSummary: customScenario?.summary, + }, }; }, ); diff --git a/examples/scenario-modeler-server/src/mcp-app.tsx b/examples/scenario-modeler-server/src/mcp-app.tsx index e436e5a..886e815 100644 --- a/examples/scenario-modeler-server/src/mcp-app.tsx +++ b/examples/scenario-modeler-server/src/mcp-app.tsx @@ -1,6 +1,5 @@ import type { McpUiHostContext } from "@modelcontextprotocol/ext-apps"; import { useApp } from "@modelcontextprotocol/ext-apps/react"; -import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { StrictMode, useState, useMemo, useCallback, useEffect } from "react"; import { createRoot } from "react-dom/client"; import { SliderRow } from "./components/SliderRow.tsx"; @@ -25,18 +24,6 @@ interface CallToolResultData { defaultInputs?: ScenarioInputs; } -/** Extract templates and defaultInputs from tool result content */ -function extractResultData(result: CallToolResult): CallToolResultData { - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const { templates, defaultInputs } = JSON.parse(text) as CallToolResultData; - return { templates, defaultInputs }; -} - const APP_INFO = { name: "SaaS Scenario Modeler", version: "1.0.0" }; function getSafeAreaPaddingStyle(hostContext?: McpUiHostContext) { @@ -70,7 +57,8 @@ function ScenarioModeler() { capabilities: {}, onAppCreated: (app) => { app.ontoolresult = async (result) => { - const { templates, defaultInputs } = extractResultData(result); + const { templates, defaultInputs } = + result.structuredContent as unknown as CallToolResultData; if (templates) setTemplates(templates); if (defaultInputs) setDefaultInputs(defaultInputs); }; diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 4cf5888..477a9ae 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -124,6 +124,7 @@ export function createServer(): McpServer { description: "Returns current system statistics including per-core CPU usage, memory, and system info.", inputSchema: {}, + outputSchema: SystemStatsSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { @@ -151,6 +152,7 @@ export function createServer(): McpServer { return { content: [{ type: "text", text: JSON.stringify(stats) }], + structuredContent: stats, }; }, ); diff --git a/examples/system-monitor-server/src/mcp-app.ts b/examples/system-monitor-server/src/mcp-app.ts index 3973073..fceb73c 100644 --- a/examples/system-monitor-server/src/mcp-app.ts +++ b/examples/system-monitor-server/src/mcp-app.ts @@ -265,13 +265,7 @@ async function fetchStats(): Promise { arguments: {}, }); - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const stats = JSON.parse(text) as SystemStats; + const stats = result.structuredContent as unknown as SystemStats; // Initialize chart on first data if needed if (!state.chart && stats.cpu.count > 0) { diff --git a/examples/threejs-server/server.ts b/examples/threejs-server/server.ts index e2f28c7..8181bad 100644 --- a/examples/threejs-server/server.ts +++ b/examples/threejs-server/server.ts @@ -166,16 +166,17 @@ export function createServer(): McpServer { .default(400) .describe("Height in pixels"), }, + outputSchema: z.object({ + code: z.string(), + height: z.number(), + }), _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ code, height }) => { + const data = { code, height }; return { - content: [ - { - type: "text", - text: JSON.stringify({ code, height }), - }, - ], + content: [{ type: "text", text: JSON.stringify(data) }], + structuredContent: data, }; }, ); diff --git a/examples/video-resource-server/server.ts b/examples/video-resource-server/server.ts index 70effca..0d3a33c 100644 --- a/examples/video-resource-server/server.ts +++ b/examples/video-resource-server/server.ts @@ -129,20 +129,21 @@ ${Object.entries(VIDEO_LIBRARY) `Video ID to play. Available: ${Object.keys(VIDEO_LIBRARY).join(", ")}`, ), }, + outputSchema: z.object({ + videoUri: z.string(), + description: z.string(), + }), _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async ({ videoId }): Promise => { const video = VIDEO_LIBRARY[videoId]; + const data = { + videoUri: `videos://${videoId}`, + description: video.description, + }; return { - content: [ - { - type: "text", - text: JSON.stringify({ - videoUri: `videos://${videoId}`, - description: video.description, - }), - }, - ], + content: [{ type: "text", text: JSON.stringify(data) }], + structuredContent: data, }; }, ); diff --git a/examples/video-resource-server/src/mcp-app.ts b/examples/video-resource-server/src/mcp-app.ts index f530ce7..693fe42 100644 --- a/examples/video-resource-server/src/mcp-app.ts +++ b/examples/video-resource-server/src/mcp-app.ts @@ -28,18 +28,10 @@ const videoInfoEl = document.getElementById("video-info")!; function parseToolResult( result: CallToolResult, ): { videoUri: string; description: string } | null { - const text = result.content - ?.filter((c): c is { type: "text"; text: string } => c.type === "text") - .map((c) => c.text) - .join(""); - - if (!text) return null; - - try { - return JSON.parse(text) as { videoUri: string; description: string }; - } catch { - return null; - } + return result.structuredContent as { + videoUri: string; + description: string; + } | null; } // Show states diff --git a/examples/wiki-explorer-server/server.ts b/examples/wiki-explorer-server/server.ts index 063cacf..69002c1 100644 --- a/examples/wiki-explorer-server/server.ts +++ b/examples/wiki-explorer-server/server.ts @@ -95,6 +95,19 @@ export function createServer(): McpServer { .default("https://en.wikipedia.org/wiki/Model_Context_Protocol") .describe("Wikipedia page URL"), }), + outputSchema: z.object({ + page: z.object({ + url: z.string(), + title: z.string(), + }), + links: z.array( + z.object({ + url: z.string(), + title: z.string(), + }), + ), + error: z.string().nullable(), + }), _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ url }): Promise => { @@ -121,11 +134,17 @@ export function createServer(): McpServer { const links = extractWikiLinks(new URL(url), html); const result = { page: { url, title }, links, error: null }; - return { content: [{ type: "text", text: JSON.stringify(result) }] }; + return { + content: [{ type: "text", text: JSON.stringify(result) }], + structuredContent: result, + }; } catch (err) { const error = err instanceof Error ? err.message : String(err); const result = { page: { url, title }, links: [], error }; - return { content: [{ type: "text", text: JSON.stringify(result) }] }; + return { + content: [{ type: "text", text: JSON.stringify(result) }], + structuredContent: result, + }; } }, ); diff --git a/examples/wiki-explorer-server/src/mcp-app.ts b/examples/wiki-explorer-server/src/mcp-app.ts index 6bd5c26..06ab391 100644 --- a/examples/wiki-explorer-server/src/mcp-app.ts +++ b/examples/wiki-explorer-server/src/mcp-app.ts @@ -322,44 +322,36 @@ app.ontoolresult = (result) => { }; function handleToolResultData(result: CallToolResult): void { - if ( - result.isError || - !result.content?.[0] || - result.content[0].type !== "text" - ) { + if (result.isError) { console.error("Tool result error:", result); return; } - try { - const response: ToolResponse = JSON.parse(result.content[0].text); - const { page, links, error } = response; + const response = result.structuredContent as unknown as ToolResponse; + const { page, links, error } = response; - // Ensure the source node exists - addNode(page.url, page.title); - updateNodeTitle(page.url, page.title); + // Ensure the source node exists + addNode(page.url, page.title); + updateNodeTitle(page.url, page.title); - if (error) { - setNodeState(page.url, "error", error); - } else { - // Get source node position so new nodes appear nearby - const sourceNode = graphData.nodes.find((n) => n.url === page.url); - const sourcePos = sourceNode - ? { x: sourceNode.x ?? 0, y: sourceNode.y ?? 0 } - : undefined; + if (error) { + setNodeState(page.url, "error", error); + } else { + // Get source node position so new nodes appear nearby + const sourceNode = graphData.nodes.find((n) => n.url === page.url); + const sourcePos = sourceNode + ? { x: sourceNode.x ?? 0, y: sourceNode.y ?? 0 } + : undefined; - // Add all linked nodes and edges - for (const link of links) { - addNode(link.url, link.title, "default", sourcePos); - addEdge(page.url, link.url); - } - setNodeState(page.url, "expanded"); + // Add all linked nodes and edges + for (const link of links) { + addNode(link.url, link.title, "default", sourcePos); + addEdge(page.url, link.url); } - - updateGraph(); - } catch (e) { - console.error("Failed to parse tool result:", e); + setNodeState(page.url, "expanded"); } + + updateGraph(); } app.onerror = (err) => { diff --git a/package-lock.json b/package-lock.json index 8b74a9e..b63c292 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1635,9 +1635,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.7", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz", - "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==", + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", + "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==", "license": "MIT", "engines": { "node": ">=18.14.1" @@ -3358,9 +3358,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.13.tgz", - "integrity": "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==", + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", "dev": true, "license": "Apache-2.0", "bin": { From 9acc52cb96a5c00d86ad0c097607c6712be14545 Mon Sep 17 00:00:00 2001 From: Ido Salomon Date: Mon, 12 Jan 2026 17:10:27 +0200 Subject: [PATCH 046/389] feat: enhance sandbox capability negotiation (#158) * feat: enhance sandbox capability negotiation * Update specification/draft/apps.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add all csp and permissions to host capabilities + update SEP * feat: add clipboard-write permission support Adds clipboardWrite to McpUiResourcePermissions for clipboard access. Maps to Permission Policy 'clipboard-write' feature. * rm files added by mistake * refactor: change McpUiResourcePermissions properties to empty objects * chore: remove scratch files and redundant cross-env dependency --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Olivier Chafik --- examples/basic-host/src/implementation.ts | 16 +- examples/basic-host/src/sandbox.ts | 26 ++- specification/draft/apps.mdx | 136 +++++++++++- src/generated/schema.json | 239 ++++++++++++++++++++++ src/generated/schema.test.ts | 10 + src/generated/schema.ts | 56 +++++ src/spec.types.ts | 27 +++ src/types.ts | 2 + 8 files changed, 496 insertions(+), 16 deletions(-) diff --git a/examples/basic-host/src/implementation.ts b/examples/basic-host/src/implementation.ts index e40f5de..ace3143 100644 --- a/examples/basic-host/src/implementation.ts +++ b/examples/basic-host/src/implementation.ts @@ -1,4 +1,4 @@ -import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp } from "@modelcontextprotocol/ext-apps/app-bridge"; +import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp, type McpUiResourcePermissions } from "@modelcontextprotocol/ext-apps/app-bridge"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"; @@ -43,6 +43,7 @@ export async function connectToServer(serverUrl: URL): Promise { interface UiResourceData { html: string; csp?: McpUiResourceCsp; + permissions?: McpUiResourcePermissions; } export interface ToolCallInfo { @@ -105,15 +106,16 @@ async function getUiResource(serverInfo: ServerInfo, uri: string): Promise { if (event.source === window.parent) { // Validate that messages from parent come from the expected host origin. @@ -81,10 +99,16 @@ window.addEventListener("message", async (event) => { } if (event.data && event.data.method === RESOURCE_READY_NOTIFICATION) { - const { html, sandbox } = event.data.params; + const { html, sandbox, permissions } = event.data.params; if (typeof sandbox === "string") { inner.setAttribute("sandbox", sandbox); } + // Set Permission Policy allow attribute if permissions are requested + const allowAttribute = buildAllowAttribute(permissions); + if (allowAttribute) { + console.log("[Sandbox] Setting allow attribute:", allowAttribute); + inner.setAttribute("allow", allowAttribute); + } if (typeof html === "string") { // Use document.write instead of srcdoc for WebGL compatibility. // srcdoc creates an opaque origin which prevents WebGL canvas updates diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index d2cf0c2..e448bb9 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -132,11 +132,23 @@ interface McpUiResourceCsp { */ resourceDomains?: string[], /** - * Origins for nested iframes (frame-src directive). + * Origins for nested iframes + * + * - Empty or omitted = no nested iframes allowed (`frame-src 'none'`) + * - Maps to CSP `frame-src` directive + * + * @example + * ["https://www.youtube.com", "https://player.vimeo.com"] */ frameDomains?: string[], /** - * Allowed base URIs for the document (base-uri directive). + * Allowed base URIs for the document + * + * - Empty or omitted = only same origin allowed (`base-uri 'self'`) + * - Maps to CSP `base-uri` directive + * + * @example + * ["https://cdn.example.com"] */ baseUriDomains?: string[], } @@ -149,6 +161,39 @@ interface UIResourceMeta { * Hosts use this to enforce appropriate CSP headers. */ csp?: McpUiResourceCsp, + /** + * Sandbox permissions requested by the UI + * + * Servers declare which browser capabilities their UI needs. + * Hosts MAY honor these by setting appropriate iframe `allow` attributes. + * Apps SHOULD NOT assume permissions are granted; use JS feature detection as fallback. + */ + permissions?: { + /** + * Request camera access + * + * Maps to Permission Policy `camera` feature + */ + camera?: boolean, + /** + * Request microphone access + * + * Maps to Permission Policy `microphone` feature + */ + microphone?: boolean, + /** + * Request geolocation access + * + * Maps to Permission Policy `geolocation` feature + */ + geolocation?: boolean, + /** + * Request clipboard write access + * + * Maps to Permission Policy `clipboard-write` feature + */ + clipboardWrite?: boolean, + }, /** * Dedicated origin for widget * @@ -193,6 +238,12 @@ The resource content is returned via `resources/read`: frameDomains?: string[]; // Origins for nested iframes (frame-src directive). baseUriDomains?: string[]; // Allowed base URIs for the document (base-uri directive). }; + permissions?: { + camera?: boolean; // Request camera access + microphone?: boolean; // Request microphone access + geolocation?: boolean; // Request geolocation access + clipboardWrite?: boolean; // Request clipboard write access + }; domain?: string; prefersBorder?: boolean; }; @@ -416,9 +467,11 @@ If the Host is a web page, it MUST wrap the Guest UI and communicate with it thr 4. Once the Sandbox is ready, the Host MUST send the raw HTML resource to load in a `ui/notifications/sandbox-resource-ready` notification. 5. The Sandbox MUST load the raw HTML of the Guest UI with CSP settings that: - Enforce the domains declared in `ui.csp` metadata - - Prevent nested iframes (`frame-src 'none'`) - - Block dangerous features (`object-src 'none'`, `base-uri 'self'`) + - If `frameDomains` is provided, allow nested iframes from declared origins; otherwise use `frame-src 'none'` + - If `baseUriDomains` is provided, allow base URIs from declared origins; otherwise use `base-uri 'self'` + - Block dangerous features (`object-src 'none'`) - Apply restrictive defaults if no CSP metadata is provided + - If `permissions` is declared, the Sandbox MAY set the inner iframe's `allow` attribute accordingly 6. The Sandbox MUST forward messages sent by the Host to the Guest UI, and vice versa, for any method that doesnโ€™t start with `ui/notifications/sandbox-`. This includes lifecycle messages, e.g., `ui/initialize` request & `ui/notifications/initialized` notification both sent by the Guest UI. The Host MUST NOT send any request or notification to the Guest UI before it receives an `initialized` notification. 7. The Sandbox SHOULD NOT create/send any requests to the Host or to the Guest UI (this would require synthesizing new request ids). 8. The Host MAY forward any message from the Guest UI (coming via the Sandbox) to the MCP Apps server, for any method that doesnโ€™t start with `ui/`. While the Host SHOULD ensure the Guest UIโ€™s MCP connection is spec-compliant, it MAY decide to block some messages or subject them to further user approval. @@ -535,6 +588,53 @@ Example: } ``` +### Host Capabilities + +`HostCapabilities` are sent to the Guest UI as part of the response to `ui/initialize` (inside `McpUiInitializeResult`). +They describe the features and capabilities that the Host supports. + +```typescript +interface HostCapabilities { + /** Experimental features (structure TBD). */ + experimental?: {}; + /** Host supports opening external URLs. */ + openLinks?: {}; + /** Host can proxy tool calls to the MCP server. */ + serverTools?: { + /** Host supports tools/list_changed notifications. */ + listChanged?: boolean; + }; + /** Host can proxy resource reads to the MCP server. */ + serverResources?: { + /** Host supports resources/list_changed notifications. */ + listChanged?: boolean; + }; + /** Host accepts log messages. */ + logging?: {}; + /** Sandbox configuration applied by the host. */ + sandbox?: { + /** Permissions granted by the host (camera, microphone, geolocation, clipboard-write). */ + permissions?: { + camera?: boolean; + microphone?: boolean; + geolocation?: boolean; + clipboardWrite?: boolean; + }; + /** CSP domains approved by the host. */ + csp?: { + /** Approved origins for network requests (fetch/XHR/WebSocket). */ + connectDomains?: string[]; + /** Approved origins for static resources (scripts, images, styles, fonts). */ + resourceDomains?: string[]; + /** Approved origins for nested iframes (frame-src directive). */ + frameDomains?: string[]; + /** Approved base URIs for the document (base-uri directive). */ + baseUriDomains?: string[]; + }; + }; +} +``` + ### Container Dimensions The `HostContext` provides sizing information via `containerDimensions`: @@ -1028,12 +1128,24 @@ These messages are reserved for web-based hosts that implement the recommended d method: "ui/notifications/sandbox-resource-ready", params: { html: string, // HTML content to load - sandbox: string // Optional override for inner iframe `sandbox` attribute + sandbox?: string, // Optional override for inner iframe `sandbox` attribute + csp?: { // CSP configuration from resource metadata + connectDomains?: string[], + resourceDomains?: string[], + frameDomains?: string[], + baseUriDomains?: string[], + }, + permissions?: { // Sandbox permissions from resource metadata + camera?: boolean, + microphone?: boolean, + geolocation?: boolean, + clipboardWrite?: boolean, + } } } ``` -These messages facilitate the communication between the outer sandbox proxy iframe and the host, enabling secure loading of untrusted HTML content. +These messages facilitate the communication between the outer sandbox proxy iframe and the host, enabling secure loading of untrusted HTML content. The `permissions` field maps to the inner iframe's `allow` attribute for Permission Policy features. ### Lifecycle @@ -1489,6 +1601,7 @@ Hosts MUST enforce Content Security Policies based on resource metadata. ```typescript const csp = resource._meta?.ui?.csp; +const permissions = resource._meta?.ui?.permissions; const cspValue = ` default-src 'none'; @@ -1498,10 +1611,17 @@ const cspValue = ` img-src 'self' data: ${csp?.resourceDomains?.join(' ') || ''}; font-src 'self' ${csp?.resourceDomains?.join(' ') || ''}; media-src 'self' data: ${csp?.resourceDomains?.join(' ') || ''}; - frame-src 'none'; + frame-src ${csp?.frameDomains?.join(' ') || "'none'"}; object-src 'none'; - base-uri 'self'; + base-uri ${csp?.baseUriDomains?.join(' ') || "'self'"}; `; + +// Permission Policy for iframe allow attribute +const allowList: string[] = []; +if (permissions?.camera) allowList.push('camera'); +if (permissions?.microphone) allowList.push('microphone'); +if (permissions?.geolocation) allowList.push('geolocation'); +const allowAttribute = allowList.join(' '); ``` **Security Requirements:** diff --git a/src/generated/schema.json b/src/generated/schema.json index 281b058..61385e4 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -89,6 +89,79 @@ "type": "object", "properties": {}, "additionalProperties": false + }, + "sandbox": { + "description": "Sandbox configuration applied by the host.", + "type": "object", + "properties": { + "permissions": { + "description": "Permissions granted by the host (camera, microphone, geolocation).", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "csp": { + "description": "CSP domains approved by the host.", + "type": "object", + "properties": { + "connectDomains": { + "description": "Origins for network requests (fetch/XHR/WebSocket).", + "type": "array", + "items": { + "type": "string" + } + }, + "resourceDomains": { + "description": "Origins for static resources (scripts, images, styles, fonts).", + "type": "array", + "items": { + "type": "string" + } + }, + "frameDomains": { + "description": "Origins for nested iframes (frame-src directive).", + "type": "array", + "items": { + "type": "string" + } + }, + "baseUriDomains": { + "description": "Allowed base URIs for the document (base-uri directive).", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -2231,6 +2304,79 @@ "type": "object", "properties": {}, "additionalProperties": false + }, + "sandbox": { + "description": "Sandbox configuration applied by the host.", + "type": "object", + "properties": { + "permissions": { + "description": "Permissions granted by the host (camera, microphone, geolocation).", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "csp": { + "description": "CSP domains approved by the host.", + "type": "object", + "properties": { + "connectDomains": { + "description": "Origins for network requests (fetch/XHR/WebSocket).", + "type": "array", + "items": { + "type": "string" + } + }, + "resourceDomains": { + "description": "Origins for static resources (scripts, images, styles, fonts).", + "type": "array", + "items": { + "type": "string" + } + }, + "frameDomains": { + "description": "Origins for nested iframes (frame-src directive).", + "type": "array", + "items": { + "type": "string" + } + }, + "baseUriDomains": { + "description": "Allowed base URIs for the document (base-uri directive).", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false, @@ -3532,6 +3678,37 @@ }, "additionalProperties": false }, + "permissions": { + "description": "Sandbox permissions requested by the UI.", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "domain": { "description": "Dedicated origin for widget sandbox.", "type": "string" @@ -3543,6 +3720,37 @@ }, "additionalProperties": false }, + "McpUiResourcePermissions": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "McpUiResourceTeardownRequest": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", @@ -3638,6 +3846,37 @@ } }, "additionalProperties": false + }, + "permissions": { + "description": "Sandbox permissions from resource metadata.", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "required": ["html"], diff --git a/src/generated/schema.test.ts b/src/generated/schema.test.ts index caca83a..5bbcd5c 100644 --- a/src/generated/schema.test.ts +++ b/src/generated/schema.test.ts @@ -47,6 +47,10 @@ export type McpUiResourceCspSchemaInferredType = z.infer< typeof generated.McpUiResourceCspSchema >; +export type McpUiResourcePermissionsSchemaInferredType = z.infer< + typeof generated.McpUiResourcePermissionsSchema +>; + export type McpUiSizeChangedNotificationSchemaInferredType = z.infer< typeof generated.McpUiSizeChangedNotificationSchema >; @@ -173,6 +177,12 @@ expectType( ); expectType({} as McpUiResourceCspSchemaInferredType); expectType({} as spec.McpUiResourceCsp); +expectType( + {} as McpUiResourcePermissionsSchemaInferredType, +); +expectType( + {} as spec.McpUiResourcePermissions, +); expectType( {} as McpUiSizeChangedNotificationSchemaInferredType, ); diff --git a/src/generated/schema.ts b/src/generated/schema.ts index 35ef24f..8de9bb5 100644 --- a/src/generated/schema.ts +++ b/src/generated/schema.ts @@ -211,6 +211,40 @@ export const McpUiResourceCspSchema = z.object({ .describe("Allowed base URIs for the document (base-uri directive)."), }); +/** + * @description Sandbox permissions requested by the UI resource. + * Hosts MAY honor these by setting appropriate iframe `allow` attributes. + * Apps SHOULD NOT assume permissions are granted; use JS feature detection as fallback. + */ +export const McpUiResourcePermissionsSchema = z.object({ + /** @description Request camera access (Permission Policy `camera` feature). */ + camera: z + .object({}) + .optional() + .describe("Request camera access (Permission Policy `camera` feature)."), + /** @description Request microphone access (Permission Policy `microphone` feature). */ + microphone: z + .object({}) + .optional() + .describe( + "Request microphone access (Permission Policy `microphone` feature).", + ), + /** @description Request geolocation access (Permission Policy `geolocation` feature). */ + geolocation: z + .object({}) + .optional() + .describe( + "Request geolocation access (Permission Policy `geolocation` feature).", + ), + /** @description Request clipboard write access (Permission Policy `clipboard-write` feature). */ + clipboardWrite: z + .object({}) + .optional() + .describe( + "Request clipboard write access (Permission Policy `clipboard-write` feature).", + ), +}); + /** * @description Notification of UI size changes (bidirectional: Guest <-> Host). * @see {@link app.App.sendSizeChanged} for the method to send this from Guest UI @@ -363,6 +397,20 @@ export const McpUiHostCapabilitiesSchema = z.object({ .describe("Host can proxy resource reads to the MCP server."), /** @description Host accepts log messages. */ logging: z.object({}).optional().describe("Host accepts log messages."), + /** @description Sandbox configuration applied by the host. */ + sandbox: z + .object({ + /** @description Permissions granted by the host (camera, microphone, geolocation). */ + permissions: McpUiResourcePermissionsSchema.optional().describe( + "Permissions granted by the host (camera, microphone, geolocation).", + ), + /** @description CSP domains approved by the host. */ + csp: McpUiResourceCspSchema.optional().describe( + "CSP domains approved by the host.", + ), + }) + .optional() + .describe("Sandbox configuration applied by the host."), }); /** @@ -405,6 +453,10 @@ export const McpUiResourceMetaSchema = z.object({ csp: McpUiResourceCspSchema.optional().describe( "Content Security Policy configuration.", ), + /** @description Sandbox permissions requested by the UI. */ + permissions: McpUiResourcePermissionsSchema.optional().describe( + "Sandbox permissions requested by the UI.", + ), /** @description Dedicated origin for widget sandbox. */ domain: z .string() @@ -514,6 +566,10 @@ export const McpUiSandboxResourceReadyNotificationSchema = z.object({ csp: McpUiResourceCspSchema.optional().describe( "CSP configuration from resource metadata.", ), + /** @description Sandbox permissions from resource metadata. */ + permissions: McpUiResourcePermissionsSchema.optional().describe( + "Sandbox permissions from resource metadata.", + ), }), }); diff --git a/src/spec.types.ts b/src/spec.types.ts index 715e0cb..3e87209 100644 --- a/src/spec.types.ts +++ b/src/spec.types.ts @@ -220,6 +220,8 @@ export interface McpUiSandboxResourceReadyNotification { sandbox?: string; /** @description CSP configuration from resource metadata. */ csp?: McpUiResourceCsp; + /** @description Sandbox permissions from resource metadata. */ + permissions?: McpUiResourcePermissions; }; } @@ -423,6 +425,13 @@ export interface McpUiHostCapabilities { }; /** @description Host accepts log messages. */ logging?: {}; + /** @description Sandbox configuration applied by the host. */ + sandbox?: { + /** @description Permissions granted by the host (camera, microphone, geolocation). */ + permissions?: McpUiResourcePermissions; + /** @description CSP domains approved by the host. */ + csp?: McpUiResourceCsp; + }; } /** @@ -498,12 +507,30 @@ export interface McpUiResourceCsp { baseUriDomains?: string[]; } +/** + * @description Sandbox permissions requested by the UI resource. + * Hosts MAY honor these by setting appropriate iframe `allow` attributes. + * Apps SHOULD NOT assume permissions are granted; use JS feature detection as fallback. + */ +export interface McpUiResourcePermissions { + /** @description Request camera access (Permission Policy `camera` feature). */ + camera?: {}; + /** @description Request microphone access (Permission Policy `microphone` feature). */ + microphone?: {}; + /** @description Request geolocation access (Permission Policy `geolocation` feature). */ + geolocation?: {}; + /** @description Request clipboard write access (Permission Policy `clipboard-write` feature). */ + clipboardWrite?: {}; +} + /** * @description UI Resource metadata for security and rendering configuration. */ export interface McpUiResourceMeta { /** @description Content Security Policy configuration. */ csp?: McpUiResourceCsp; + /** @description Sandbox permissions requested by the UI. */ + permissions?: McpUiResourcePermissions; /** @description Dedicated origin for widget sandbox. */ domain?: string; /** @description Visual boundary preference - true if UI prefers a visible border. */ diff --git a/src/types.ts b/src/types.ts index da4a71f..006680c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,6 +53,7 @@ export { type McpUiInitializeResult, type McpUiInitializedNotification, type McpUiResourceCsp, + type McpUiResourcePermissions, type McpUiResourceMeta, type McpUiRequestDisplayModeRequest, type McpUiRequestDisplayModeResult, @@ -110,6 +111,7 @@ export { McpUiInitializeResultSchema, McpUiInitializedNotificationSchema, McpUiResourceCspSchema, + McpUiResourcePermissionsSchema, McpUiResourceMetaSchema, McpUiRequestDisplayModeRequestSchema, McpUiRequestDisplayModeResultSchema, From b273279849f989bc241848734bfbfe49c49e461d Mon Sep 17 00:00:00 2001 From: Ido Salomon Date: Mon, 12 Jan 2026 17:21:45 +0200 Subject: [PATCH 047/389] feat: add ui/update-model-context (#125) --------- Co-authored-by: Olivier Chafik --- specification/draft/apps.mdx | 52 +++- src/app-bridge.test.ts | 76 +++++ src/app-bridge.ts | 46 ++- src/app.ts | 48 +++ src/generated/schema.json | 560 +++++++++++++++++++++++++++++++++++ src/generated/schema.test.ts | 20 ++ src/generated/schema.ts | 72 +++++ src/spec.types.ts | 41 +++ src/types.ts | 6 + 9 files changed, 918 insertions(+), 3 deletions(-) diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index e448bb9..aed5611 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -979,6 +979,49 @@ Guest UI behavior: * Guest UI SHOULD check `availableDisplayModes` in host context before requesting a mode change. * Guest UI MUST handle the response mode differing from the requested mode. +`ui/update-model-context` - Update the model context + +```typescript +// Request +{ + jsonrpc: "2.0", + id: 3, + method: "ui/update-model-context", + params: { + content?: ContentBlock[], + structuredContent?: Record + } +} + +// Success Response +{ + jsonrpc: "2.0", + id: 3, + result: {} // Empty result on success +} + +// Error Response (if denied or failed) +{ + jsonrpc: "2.0", + id: 3, + error: { + code: -32000, // Implementation-defined error + message: "Context update denied" | "Invalid content format" + } +} +``` + +Guest UI MAY send this request to update the Host's model context. This context will be used in future turns. Each request overwrites the previous context sent by the Guest UI. +This event serves a different use case from `notifications/message` (logging) and `ui/message` (which also trigger follow-ups). + +Host behavior: +- SHOULD provide the context to the model in future turns +- MAY overwrite the previous model context with the new update +- MAY defer sending the context to the model until the next user message (including `ui/message`) +- MAY dedupe identical `ui/update-model-context` calls +- If multiple updates are received before the next user message, Host SHOULD only send the last update to the model +- MAY display context updates to the user + #### Notifications (Host โ†’ UI) `ui/notifications/tool-input` - Host MUST send this notification with the complete tool arguments after the Guest UI's initialize request completes. @@ -1222,10 +1265,15 @@ sequenceDiagram H-->>UI: ui/notifications/tool-result else Message UI ->> H: ui/message + H -->> UI: ui/message response H -->> H: Process message and follow up - else Notify + else Context update + UI ->> H: ui/update-model-context + H ->> H: Store model context (overwrite existing) + H -->> UI: ui/update-model-context response + else Log UI ->> H: notifications/message - H ->> H: Process notification and store in context + H ->> H: Record log for debugging/telemetry else Resource read UI ->> H: resources/read H ->> S: resources/read diff --git a/src/app-bridge.test.ts b/src/app-bridge.test.ts index 1e55f6b..66d5f83 100644 --- a/src/app-bridge.test.ts +++ b/src/app-bridge.test.ts @@ -442,6 +442,82 @@ describe("App <-> AppBridge integration", () => { logger: "TestApp", }); }); + + it("app.updateModelContext triggers bridge.onupdatemodelcontext and returns result", async () => { + const receivedContexts: unknown[] = []; + bridge.onupdatemodelcontext = async (params) => { + receivedContexts.push(params); + return {}; + }; + + await app.connect(appTransport); + const result = await app.updateModelContext({ + content: [{ type: "text", text: "User selected 3 items" }], + }); + + expect(receivedContexts).toHaveLength(1); + expect(receivedContexts[0]).toMatchObject({ + content: [{ type: "text", text: "User selected 3 items" }], + }); + expect(result).toEqual({}); + }); + + it("app.updateModelContext works with multiple content blocks", async () => { + const receivedContexts: unknown[] = []; + bridge.onupdatemodelcontext = async (params) => { + receivedContexts.push(params); + return {}; + }; + + await app.connect(appTransport); + const result = await app.updateModelContext({ + content: [ + { type: "text", text: "Filter applied" }, + { type: "text", text: "Category: electronics" }, + ], + }); + + expect(receivedContexts).toHaveLength(1); + expect(receivedContexts[0]).toMatchObject({ + content: [ + { type: "text", text: "Filter applied" }, + { type: "text", text: "Category: electronics" }, + ], + }); + expect(result).toEqual({}); + }); + + it("app.updateModelContext works with structuredContent", async () => { + const receivedContexts: unknown[] = []; + bridge.onupdatemodelcontext = async (params) => { + receivedContexts.push(params); + return {}; + }; + + await app.connect(appTransport); + const result = await app.updateModelContext({ + structuredContent: { selectedItems: 3, total: 150.0, currency: "USD" }, + }); + + expect(receivedContexts).toHaveLength(1); + expect(receivedContexts[0]).toMatchObject({ + structuredContent: { selectedItems: 3, total: 150.0, currency: "USD" }, + }); + expect(result).toEqual({}); + }); + + it("app.updateModelContext throws when handler throws", async () => { + bridge.onupdatemodelcontext = async () => { + throw new Error("Context update failed"); + }; + + await app.connect(appTransport); + await expect( + app.updateModelContext({ + content: [{ type: "text", text: "Test" }], + }), + ).rejects.toThrow("Context update failed"); + }); }); describe("App -> Host requests", () => { diff --git a/src/app-bridge.ts b/src/app-bridge.ts index f9ff699..69b8993 100644 --- a/src/app-bridge.ts +++ b/src/app-bridge.ts @@ -5,6 +5,7 @@ import { CallToolRequestSchema, CallToolResult, CallToolResultSchema, + EmptyResult, Implementation, ListPromptsRequest, ListPromptsRequestSchema, @@ -51,6 +52,8 @@ import { type McpUiToolResultNotification, LATEST_PROTOCOL_VERSION, McpUiAppCapabilities, + McpUiUpdateModelContextRequest, + McpUiUpdateModelContextRequestSchema, McpUiHostCapabilities, McpUiHostContext, McpUiHostContextChangedNotification, @@ -66,7 +69,6 @@ import { McpUiOpenLinkRequestSchema, McpUiOpenLinkResult, McpUiResourceTeardownRequest, - McpUiResourceTeardownResult, McpUiResourceTeardownResultSchema, McpUiSandboxProxyReadyNotification, McpUiSandboxProxyReadyNotificationSchema, @@ -633,6 +635,48 @@ export class AppBridge extends Protocol< ); } + /** + * Register a handler for model context updates from the Guest UI. + * + * The Guest UI sends `ui/update-model-context` requests to update the Host's + * model context. Each request overwrites the previous context stored by the Guest UI. + * Unlike logging messages, context updates are intended to be available to + * the model in future turns. Unlike messages, context updates do not trigger follow-ups. + * + * The host will typically defer sending the context to the model until the + * next user message (including `ui/message`), and will only send the last + * update received. + * + * @example + * ```typescript + * bridge.onupdatemodelcontext = async ({ content, structuredContent }, extra) => { + * // Update the model context with the new snapshot + * modelContext = { + * type: "app_context", + * content, + * structuredContent, + * timestamp: Date.now() + * }; + * return {}; + * }; + * ``` + * + * @see {@link McpUiUpdateModelContextRequest} for the request type + */ + set onupdatemodelcontext( + callback: ( + params: McpUiUpdateModelContextRequest["params"], + extra: RequestHandlerExtra, + ) => Promise, + ) { + this.setRequestHandler( + McpUiUpdateModelContextRequestSchema, + async (request, extra) => { + return callback(request.params, extra); + }, + ); + } + /** * Register a handler for tool call requests from the Guest UI. * diff --git a/src/app.ts b/src/app.ts index 129b580..2b43cd5 100644 --- a/src/app.ts +++ b/src/app.ts @@ -9,6 +9,7 @@ import { CallToolRequestSchema, CallToolResult, CallToolResultSchema, + EmptyResultSchema, Implementation, ListToolsRequest, ListToolsRequestSchema, @@ -20,6 +21,7 @@ import { PostMessageTransport } from "./message-transport"; import { LATEST_PROTOCOL_VERSION, McpUiAppCapabilities, + McpUiUpdateModelContextRequest, McpUiHostCapabilities, McpUiHostContext, McpUiHostContextChangedNotification, @@ -809,6 +811,52 @@ export class App extends Protocol { }); } + /** + * Update the host's model context with app state. + * + * Unlike `sendLog`, which is for debugging/telemetry, context updates + * are intended to be available to the model in future reasoning, + * without requiring a follow-up action (like `sendMessage`). + * + * The host will typically defer sending the context to the model until the + * next user message (including `ui/message`), and will only send the last + * update received. Each call overwrites any previous context update. + * + * @param params - Context content and/or structured content + * @param options - Request options (timeout, etc.) + * + * @throws {Error} If the host rejects the context update (e.g., unsupported content type) + * + * @example Update model context with current app state + * ```typescript + * await app.updateModelContext({ + * content: [{ type: "text", text: "User selected 3 items totaling $150.00" }] + * }); + * ``` + * + * @example Update with structured content + * ```typescript + * await app.updateModelContext({ + * structuredContent: { selectedItems: 3, total: 150.00, currency: "USD" } + * }); + * ``` + * + * @returns Promise that resolves when the context update is acknowledged + */ + updateModelContext( + params: McpUiUpdateModelContextRequest["params"], + options?: RequestOptions, + ) { + return this.request( + { + method: "ui/update-model-context", + params, + }, + EmptyResultSchema, + options, + ); + } + /** * Request the host to open an external URL in the default browser. * diff --git a/src/generated/schema.json b/src/generated/schema.json index 61385e4..1d87d9c 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -162,6 +162,92 @@ } }, "additionalProperties": false + }, + "updateModelContext": { + "description": "Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "message": { + "description": "Host supports receiving content messages (ui/message) from the Guest UI.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -2377,6 +2463,92 @@ } }, "additionalProperties": false + }, + "updateModelContext": { + "description": "Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "message": { + "description": "Host supports receiving content messages (ui/message) from the Guest UI.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false, @@ -4631,6 +4803,49 @@ ], "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, + "McpUiSupportedContentBlockModalities": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "McpUiTheme": { "$schema": "https://json-schema.org/draft/2020-12/schema", "anyOf": [ @@ -5138,6 +5353,351 @@ } ], "description": "Tool visibility scope - who can access the tool." + }, + "McpUiUpdateModelContextRequest": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "method": { + "type": "string", + "const": "ui/update-model-context" + }, + "params": { + "type": "object", + "properties": { + "content": { + "description": "Context content blocks (text, image, etc.).", + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "text" + }, + "text": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "text"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "image" + }, + "data": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "data", "mimeType"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "audio" + }, + "data": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "data", "mimeType"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "icons": { + "type": "array", + "items": { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "sizes": { + "type": "array", + "items": { + "type": "string" + } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] + } + }, + "required": ["src"], + "additionalProperties": false + } + }, + "uri": { + "type": "string" + }, + "description": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "properties": {}, + "additionalProperties": {} + }, + "type": { + "type": "string", + "const": "resource_link" + } + }, + "required": ["name", "uri", "type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "resource" + }, + "resource": { + "anyOf": [ + { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "text": { + "type": "string" + } + }, + "required": ["uri", "text"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "blob": { + "type": "string" + } + }, + "required": ["uri", "blob"], + "additionalProperties": false + } + ] + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "resource"], + "additionalProperties": false + } + ] + } + }, + "structuredContent": { + "description": "Structured content for machine-readable context data.", + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "description": "Structured content for machine-readable context data." + } + } + }, + "additionalProperties": false + } + }, + "required": ["method", "params"], + "additionalProperties": false } } } diff --git a/src/generated/schema.test.ts b/src/generated/schema.test.ts index 5bbcd5c..727c28d 100644 --- a/src/generated/schema.test.ts +++ b/src/generated/schema.test.ts @@ -83,6 +83,10 @@ export type McpUiResourceTeardownResultSchemaInferredType = z.infer< typeof generated.McpUiResourceTeardownResultSchema >; +export type McpUiSupportedContentBlockModalitiesSchemaInferredType = z.infer< + typeof generated.McpUiSupportedContentBlockModalitiesSchema +>; + export type McpUiHostCapabilitiesSchemaInferredType = z.infer< typeof generated.McpUiHostCapabilitiesSchema >; @@ -135,6 +139,10 @@ export type McpUiHostContextChangedNotificationSchemaInferredType = z.infer< typeof generated.McpUiHostContextChangedNotificationSchema >; +export type McpUiUpdateModelContextRequestSchemaInferredType = z.infer< + typeof generated.McpUiUpdateModelContextRequestSchema +>; + export type McpUiInitializeRequestSchemaInferredType = z.infer< typeof generated.McpUiInitializeRequestSchema >; @@ -223,6 +231,12 @@ expectType( expectType( {} as spec.McpUiResourceTeardownResult, ); +expectType( + {} as McpUiSupportedContentBlockModalitiesSchemaInferredType, +); +expectType( + {} as spec.McpUiSupportedContentBlockModalities, +); expectType( {} as McpUiHostCapabilitiesSchemaInferredType, ); @@ -289,6 +303,12 @@ expectType( expectType( {} as spec.McpUiHostContextChangedNotification, ); +expectType( + {} as McpUiUpdateModelContextRequestSchemaInferredType, +); +expectType( + {} as spec.McpUiUpdateModelContextRequest, +); expectType( {} as McpUiInitializeRequestSchemaInferredType, ); diff --git a/src/generated/schema.ts b/src/generated/schema.ts index 8de9bb5..69abe49 100644 --- a/src/generated/schema.ts +++ b/src/generated/schema.ts @@ -358,6 +358,36 @@ export const McpUiResourceTeardownResultSchema = z.record( z.unknown(), ); +export const McpUiSupportedContentBlockModalitiesSchema = z.object({ + /** @description Host supports text content blocks. */ + text: z.object({}).optional().describe("Host supports text content blocks."), + /** @description Host supports image content blocks. */ + image: z + .object({}) + .optional() + .describe("Host supports image content blocks."), + /** @description Host supports audio content blocks. */ + audio: z + .object({}) + .optional() + .describe("Host supports audio content blocks."), + /** @description Host supports resource content blocks. */ + resource: z + .object({}) + .optional() + .describe("Host supports resource content blocks."), + /** @description Host supports resource link content blocks. */ + resourceLink: z + .object({}) + .optional() + .describe("Host supports resource link content blocks."), + /** @description Host supports structured content. */ + structuredContent: z + .object({}) + .optional() + .describe("Host supports structured content."), +}); + /** * @description Capabilities supported by the host application. * @see {@link McpUiInitializeResult} for the initialization result that includes these capabilities @@ -411,6 +441,15 @@ export const McpUiHostCapabilitiesSchema = z.object({ }) .optional() .describe("Sandbox configuration applied by the host."), + /** @description Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns. */ + updateModelContext: + McpUiSupportedContentBlockModalitiesSchema.optional().describe( + "Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.", + ), + /** @description Host supports receiving content messages (ui/message) from the Guest UI. */ + message: McpUiSupportedContentBlockModalitiesSchema.optional().describe( + "Host supports receiving content messages (ui/message) from the Guest UI.", + ), }); /** @@ -714,6 +753,39 @@ export const McpUiHostContextChangedNotificationSchema = z.object({ ), }); +/** + * @description Request to update the agent's context without requiring a follow-up action (Guest UI -> Host). + * + * Unlike `notifications/message` which is for debugging/logging, this request is intended + * to update the Host's model context. Each request overwrites the previous context sent by the Guest UI. + * Unlike messages, context updates do not trigger follow-ups. + * + * The host will typically defer sending the context to the model until the next user message + * (including `ui/message`), and will only send the last update received. + * + * @see {@link app.App.updateModelContext} for the method that sends this request + */ +export const McpUiUpdateModelContextRequestSchema = z.object({ + method: z.literal("ui/update-model-context"), + params: z.object({ + /** @description Context content blocks (text, image, etc.). */ + content: z + .array(ContentBlockSchema) + .optional() + .describe("Context content blocks (text, image, etc.)."), + /** @description Structured content for machine-readable context data. */ + structuredContent: z + .record( + z.string(), + z + .unknown() + .describe("Structured content for machine-readable context data."), + ) + .optional() + .describe("Structured content for machine-readable context data."), + }), +}); + /** * @description Initialization request sent from Guest UI to Host. * @see {@link app.App.connect} for the method that sends this request diff --git a/src/spec.types.ts b/src/spec.types.ts index 3e87209..998e4d2 100644 --- a/src/spec.types.ts +++ b/src/spec.types.ts @@ -384,6 +384,28 @@ export interface McpUiHostContextChangedNotification { params: McpUiHostContext; } +/** + * @description Request to update the agent's context without requiring a follow-up action (Guest UI -> Host). + * + * Unlike `notifications/message` which is for debugging/logging, this request is intended + * to update the Host's model context. Each request overwrites the previous context sent by the Guest UI. + * Unlike messages, context updates do not trigger follow-ups. + * + * The host will typically defer sending the context to the model until the next user message + * (including `ui/message`), and will only send the last update received. + * + * @see {@link app.App.updateModelContext} for the method that sends this request + */ +export interface McpUiUpdateModelContextRequest { + method: "ui/update-model-context"; + params: { + /** @description Context content blocks (text, image, etc.). */ + content?: ContentBlock[]; + /** @description Structured content for machine-readable context data. */ + structuredContent?: Record; + }; +} + /** * @description Request for graceful shutdown of the Guest UI (Host -> Guest UI). * @see {@link app-bridge.AppBridge.teardownResource} for the host method that sends this @@ -404,6 +426,21 @@ export interface McpUiResourceTeardownResult { [key: string]: unknown; } +export interface McpUiSupportedContentBlockModalities { + /** @description Host supports text content blocks. */ + text?: {}; + /** @description Host supports image content blocks. */ + image?: {}; + /** @description Host supports audio content blocks. */ + audio?: {}; + /** @description Host supports resource content blocks. */ + resource?: {}; + /** @description Host supports resource link content blocks. */ + resourceLink?: {}; + /** @description Host supports structured content. */ + structuredContent?: {}; +} + /** * @description Capabilities supported by the host application. * @see {@link McpUiInitializeResult} for the initialization result that includes these capabilities @@ -432,6 +469,10 @@ export interface McpUiHostCapabilities { /** @description CSP domains approved by the host. */ csp?: McpUiResourceCsp; }; + /** @description Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns. */ + updateModelContext?: McpUiSupportedContentBlockModalities; + /** @description Host supports receiving content messages (ui/message) from the Guest UI. */ + message?: McpUiSupportedContentBlockModalities; } /** diff --git a/src/types.ts b/src/types.ts index 006680c..5cbc0b4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -36,6 +36,8 @@ export { type McpUiOpenLinkResult, type McpUiMessageRequest, type McpUiMessageResult, + type McpUiUpdateModelContextRequest, + type McpUiSupportedContentBlockModalities, type McpUiSandboxProxyReadyNotification, type McpUiSandboxResourceReadyNotification, type McpUiSizeChangedNotification, @@ -66,6 +68,7 @@ import type { McpUiInitializeRequest, McpUiOpenLinkRequest, McpUiMessageRequest, + McpUiUpdateModelContextRequest, McpUiResourceTeardownRequest, McpUiRequestDisplayModeRequest, McpUiHostContextChangedNotification, @@ -94,6 +97,8 @@ export { McpUiOpenLinkResultSchema, McpUiMessageRequestSchema, McpUiMessageResultSchema, + McpUiUpdateModelContextRequestSchema, + McpUiSupportedContentBlockModalitiesSchema, McpUiSandboxProxyReadyNotificationSchema, McpUiSandboxResourceReadyNotificationSchema, McpUiSizeChangedNotificationSchema, @@ -153,6 +158,7 @@ export type AppRequest = | McpUiInitializeRequest | McpUiOpenLinkRequest | McpUiMessageRequest + | McpUiUpdateModelContextRequest | McpUiResourceTeardownRequest | McpUiRequestDisplayModeRequest | CallToolRequest From 996f028e7fa11afd4e0ebda3970c179776c2074f Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Fri, 9 Jan 2026 15:41:04 -0600 Subject: [PATCH 048/389] Add missing `refresh-stats` tool to `system-monitor-server` The `mcp-app.ts` UI was calling a `refresh-stats` tool that didn't exist on the server, causing the example to fail. This was introduced in PR #131 when the squash merge included the client-side change but lost the server-side tool registration. Fixes #200 Co-Authored-By: Claude Opus 4.5 --- examples/system-monitor-server/server.ts | 63 ++++++++++++++++-------- package-lock.json | 21 ++++++++ 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 477a9ae..8ac7f7b 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -107,6 +107,30 @@ async function getMemoryStats(): Promise { }; } +async function getStats(): Promise { + const cpuSnapshots = getCpuSnapshots(); + const cpuInfo = os.cpus()[0]; + const memory = await getMemoryStats(); + const uptimeSeconds = os.uptime(); + + return { + cpu: { + cores: cpuSnapshots, + model: cpuInfo?.model ?? "Unknown", + count: os.cpus().length, + }, + memory, + system: { + hostname: os.hostname(), + platform: `${os.platform()} ${os.arch()}`, + arch: os.arch(), + uptime: uptimeSeconds, + uptimeFormatted: formatUptime(uptimeSeconds), + }, + timestamp: new Date().toISOString(), + }; +} + export function createServer(): McpServer { const server = new McpServer({ name: "System Monitor Server", @@ -128,28 +152,27 @@ export function createServer(): McpServer { _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { - const cpuSnapshots = getCpuSnapshots(); - const cpuInfo = os.cpus()[0]; - const memory = await getMemoryStats(); - const uptimeSeconds = os.uptime(); - - const stats: SystemStats = { - cpu: { - cores: cpuSnapshots, - model: cpuInfo?.model ?? "Unknown", - count: os.cpus().length, - }, - memory, - system: { - hostname: os.hostname(), - platform: `${os.platform()} ${os.arch()}`, - arch: os.arch(), - uptime: uptimeSeconds, - uptimeFormatted: formatUptime(uptimeSeconds), - }, - timestamp: new Date().toISOString(), + const stats = await getStats(); + return { + content: [{ type: "text", text: JSON.stringify(stats) }], + structuredContent: stats, }; + }, + ); + // App-only tool for polling - used by the UI for periodic refresh + registerAppTool( + server, + "refresh-stats", + { + title: "Refresh Stats", + description: "Refresh system statistics (app-only, for polling)", + inputSchema: {}, + outputSchema: SystemStatsSchema.shape, + _meta: { ui: { visibility: ["app"] } }, + }, + async (): Promise => { + const stats = await getStats(); return { content: [{ type: "text", text: JSON.stringify(stats) }], structuredContent: stats, diff --git a/package-lock.json b/package-lock.json index b63c292..50843b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -809,6 +809,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2515,6 +2516,7 @@ "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", @@ -2714,6 +2716,7 @@ "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2738,6 +2741,7 @@ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3140,6 +3144,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3465,6 +3470,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4176,6 +4182,7 @@ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -4650,6 +4657,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -6191,6 +6199,7 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -6286,6 +6295,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6384,6 +6394,7 @@ "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -6505,6 +6516,7 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -6750,6 +6762,7 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -6928,6 +6941,7 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -7255,6 +7269,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8004,6 +8019,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8097,6 +8113,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8273,6 +8290,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8391,6 +8409,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -8563,6 +8582,7 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -8613,6 +8633,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 8b8ecbea64329d7cb9562d6e7519634f1db6f971 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Fri, 9 Jan 2026 16:25:54 -0600 Subject: [PATCH 049/389] Restore educational comments in `basic-server-*` examples PR #184 accidentally removed/reverted educational comments from `basic-server-react` and `basic-server-vanillajs` that were established in PR #182. This restores consistency with the other basic-server examples (Vue, Svelte, Preact, Solid). Changes: - Add back the three-comment pattern explaining two-part registration - Restore full tool description ("as an ISO 8601 string") - Change vanillajs to return plain text instead of JSON (matching #182) - Use local `resourceUri` variable instead of top-level constant Co-Authored-By: Claude Opus 4.5 --- examples/basic-server-react/server.ts | 10 ++++++++-- examples/basic-server-vanillajs/server.ts | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/examples/basic-server-react/server.ts b/examples/basic-server-react/server.ts index 21be751..d63880c 100644 --- a/examples/basic-server-react/server.ts +++ b/examples/basic-server-react/server.ts @@ -17,21 +17,27 @@ export function createServer(): McpServer { version: "1.0.0", }); + // Two-part registration: tool + resource, tied together by the resource URI. const resourceUri = "ui://get-time/mcp-app.html"; + // Register a tool with UI metadata. When the host calls this tool, it reads + // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render + // as an interactive UI. registerAppTool(server, "get-time", { title: "Get Time", - description: "Returns the current server time.", + description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { - return { content: [{ type: "text", text: new Date().toISOString() }] }; + const time = new Date().toISOString(); + return { content: [{ type: "text", text: time }] }; }, ); + // Register the resource, which returns the bundled HTML/JavaScript for the UI. registerAppResource(server, resourceUri, resourceUri, diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index ef661a8..8d50d3e 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -8,11 +8,9 @@ import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_ import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); -const RESOURCE_URI = "ui://get-time/mcp-app.html"; /** * Creates a new MCP server instance with tools and resources registered. - * Each HTTP session needs its own server instance because McpServer only supports one transport. */ export function createServer(): McpServer { const server = new McpServer({ @@ -20,9 +18,12 @@ export function createServer(): McpServer { version: "1.0.0", }); - // MCP Apps require two-part registration: a tool (what the LLM calls) and a - // resource (the UI it renders). The `_meta` field on the tool links to the - // resource URI, telling hosts which UI to display when the tool executes. + // Two-part registration: tool + resource, tied together by the resource URI. + const resourceUri = "ui://get-time/mcp-app.html"; + + // Register a tool with UI metadata. When the host calls this tool, it reads + // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render + // as an interactive UI. registerAppTool(server, "get-time", { @@ -32,7 +33,7 @@ export function createServer(): McpServer { outputSchema: z.object({ time: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { const time = new Date().toISOString(); @@ -43,18 +44,17 @@ export function createServer(): McpServer { }, ); + // Register the resource, which returns the bundled HTML/JavaScript for the UI. registerAppResource(server, - RESOURCE_URI, - RESOURCE_URI, + resourceUri, + resourceUri, { mimeType: RESOURCE_MIME_TYPE }, async (): Promise => { const html = await fs.readFile(path.join(DIST_DIR, "mcp-app.html"), "utf-8"); return { contents: [ - // Per the MCP App specification, "text/html;profile=mcp-app" signals - // to the Host that this resource is indeed for an MCP App UI. - { uri: RESOURCE_URI, mimeType: RESOURCE_MIME_TYPE, text: html }, + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, ], }; }, From ec3409aa91139b3d2d99ec3c4618b5b9a23044b7 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Mon, 12 Jan 2026 12:26:02 -0600 Subject: [PATCH 050/389] Add `shadertoy-server` example for WebGL shader rendering (#226) Introduces a new MCP App example that renders ShaderToy-compatible GLSL fragment shaders in real-time using WebGL 2.0 and ShaderToyLite.js. Features: - Standard ShaderToy uniforms (`iTime`, `iResolution`, `iMouse`, etc.) - Multi-pass rendering with buffers A-D for feedback effects - Shader compilation error overlay Co-authored-by: Claude Opus 4.5 --- .prettierignore | 1 + examples/shadertoy-server/README.md | 132 ++ examples/shadertoy-server/mcp-app.html | 15 + examples/shadertoy-server/package.json | 43 + examples/shadertoy-server/server-utils.ts | 72 + examples/shadertoy-server/server.ts | 156 ++ examples/shadertoy-server/src/global.css | 12 + examples/shadertoy-server/src/mcp-app.css | 12 + examples/shadertoy-server/src/mcp-app.ts | 126 ++ .../src/vendor/ShaderToyLite.d.ts | 113 ++ .../src/vendor/ShaderToyLite.js | 437 +++++ examples/shadertoy-server/tsconfig.json | 19 + examples/shadertoy-server/vite.config.ts | 24 + package-lock.json | 1716 ++++------------- src/generated/schema.json | 658 ++----- tests/e2e/servers.spec.ts | 6 +- .../servers.spec.ts-snapshots/shadertoy.png | Bin 0 -> 24301 bytes 17 files changed, 1641 insertions(+), 1901 deletions(-) create mode 100644 examples/shadertoy-server/README.md create mode 100644 examples/shadertoy-server/mcp-app.html create mode 100644 examples/shadertoy-server/package.json create mode 100644 examples/shadertoy-server/server-utils.ts create mode 100644 examples/shadertoy-server/server.ts create mode 100644 examples/shadertoy-server/src/global.css create mode 100644 examples/shadertoy-server/src/mcp-app.css create mode 100644 examples/shadertoy-server/src/mcp-app.ts create mode 100644 examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts create mode 100644 examples/shadertoy-server/src/vendor/ShaderToyLite.js create mode 100644 examples/shadertoy-server/tsconfig.json create mode 100644 examples/shadertoy-server/vite.config.ts create mode 100644 tests/e2e/servers.spec.ts-snapshots/shadertoy.png diff --git a/.prettierignore b/.prettierignore index 9c9b32b..c18c51a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ examples/basic-host/**/*.ts examples/basic-host/**/*.tsx examples/basic-server-*/**/*.ts examples/basic-server-*/**/*.tsx +**/vendor/** diff --git a/examples/shadertoy-server/README.md b/examples/shadertoy-server/README.md new file mode 100644 index 0000000..0e85d47 --- /dev/null +++ b/examples/shadertoy-server/README.md @@ -0,0 +1,132 @@ +# Example: ShaderToy Server + +A demo MCP App that renders [ShaderToy](https://www.shadertoy.com/)-compatible GLSL fragment shaders in real-time using WebGL 2.0 and [ShaderToyLite.js](https://github.com/nickoala/ShaderToyLite). + + + + + + + +
GradientKaleidoscopeKaleidoscope
+ +## Features + +- **Real-time Rendering**: Renders GLSL shaders using WebGL 2.0 +- **ShaderToy Compatibility**: Uses the standard `mainImage(out vec4 fragColor, in vec2 fragCoord)` entry point +- **Multi-pass Rendering**: Supports buffers A-D for feedback effects, blur chains, and simulations +- **Standard Uniforms**: iResolution, iTime, iTimeDelta, iFrame, iMouse, iDate, iChannel0-3 + +## Running + +1. Install dependencies: + + ```bash + npm install + ``` + +2. Build and start the server: + + ```bash + npm run start:http # for Streamable HTTP transport + # OR + npm run start:stdio # for stdio transport + ``` + +3. View using the [`basic-host`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/basic-host) example or another MCP Apps-compatible host. + +### Tool Input Examples + +**Gradient with Time:** + +```glsl +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0); +} +``` + +_Tool input:_ + +```json +{ + "fragmentShader": "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 uv = fragCoord / iResolution.xy;\n fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0);\n}" +} +``` + +**Kaleidoscope**: + +```glsl +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y; + float segments = 6.0; + float zoom = 1.0 + 0.3 * sin(iTime * 0.2); + float angle = atan(uv.y, uv.x) + iTime * 0.3; + float r = length(uv) * zoom; + angle = mod(angle, 6.28 / segments); + angle = abs(angle - 3.14 / segments); + vec2 p = vec2(cos(angle), sin(angle)) * r; + p += iTime * 0.1; + float v = sin(p.x * 10.0) * sin(p.y * 10.0); + v += sin(length(p) * 15.0 - iTime * 2.0); + v += sin(p.x * 5.0 + p.y * 7.0 + iTime); + vec3 col = 0.5 + 0.5 * cos(v * 2.0 + vec3(0.0, 2.0, 4.0) + iTime); + fragColor = vec4(col, 1.0); +} +``` + +_Tool input:_ + +```json +{ + "fragmentShader": "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y;\n float segments = 6.0;\n float zoom = 1.0 + 0.3 * sin(iTime * 0.2);\n float angle = atan(uv.y, uv.x) + iTime * 0.3;\n float r = length(uv) * zoom;\n angle = mod(angle, 6.28 / segments);\n angle = abs(angle - 3.14 / segments);\n vec2 p = vec2(cos(angle), sin(angle)) * r;\n p += iTime * 0.1;\n float v = sin(p.x * 10.0) * sin(p.y * 10.0);\n v += sin(length(p) * 15.0 - iTime * 2.0);\n v += sin(p.x * 5.0 + p.y * 7.0 + iTime);\n vec3 col = 0.5 + 0.5 * cos(v * 2.0 + vec3(0.0, 2.0, 4.0) + iTime);\n fragColor = vec4(col, 1.0);\n}" +} +``` + +**Interactive Julia Set** (mouse controls the fractal's c parameter): + +```glsl +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y * 2.5; + vec2 mouse = (iMouse.xy / iResolution.xy - 0.5) * 2.0; + vec2 c = mouse; + vec2 z = uv; + float iter = 0.0; + for (int i = 0; i < 100; i++) { + z = vec2(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c; + if (dot(z, z) > 4.0) break; + iter++; + } + float t = iter / 100.0; + vec3 col = 0.5 + 0.5 * cos(3.0 + t * 6.28 * 2.0 + vec3(0.0, 0.6, 1.0)); + if (iter == 100.0) col = vec3(0.0); + fragColor = vec4(col, 1.0); +} +``` + +_Tool input:_ + +```json +{ + "fragmentShader": "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y * 2.5;\n vec2 mouse = (iMouse.xy / iResolution.xy - 0.5) * 2.0;\n vec2 c = mouse;\n vec2 z = uv;\n float iter = 0.0;\n for (int i = 0; i < 100; i++) {\n z = vec2(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c;\n if (dot(z, z) > 4.0) break;\n iter++;\n }\n float t = iter / 100.0;\n vec3 col = 0.5 + 0.5 * cos(3.0 + t * 6.28 * 2.0 + vec3(0.0, 0.6, 1.0));\n if (iter == 100.0) col = vec3(0.0);\n fragColor = vec4(col, 1.0);\n}" +} +``` + +## Architecture + +### Server (`server.ts`) + +Exposes a single `render-shadertoy` tool that accepts: + +- `fragmentShader`: Main Image shader code (required) +- `common`: Shared code across all shaders (optional) +- `bufferA`: Buffer A shader, accessible as iChannel0 (optional) +- `bufferB`: Buffer B shader, accessible as iChannel1 (optional) +- `bufferC`: Buffer C shader, accessible as iChannel2 (optional) +- `bufferD`: Buffer D shader, accessible as iChannel3 (optional) + +### App (`src/mcp-app.ts`) + +- Receives shader code via `ontoolinput` handler +- Uses ShaderToyLite.js for WebGL rendering +- Displays compilation errors in an overlay diff --git a/examples/shadertoy-server/mcp-app.html b/examples/shadertoy-server/mcp-app.html new file mode 100644 index 0000000..d59774e --- /dev/null +++ b/examples/shadertoy-server/mcp-app.html @@ -0,0 +1,15 @@ + + + + + + + ShaderToy Renderer + + +

+ +
+ + + diff --git a/examples/shadertoy-server/package.json b/examples/shadertoy-server/package.json new file mode 100644 index 0000000..bb847a1 --- /dev/null +++ b/examples/shadertoy-server/package.json @@ -0,0 +1,43 @@ +{ + "name": "@modelcontextprotocol/server-shadertoy", + "version": "0.1.0", + "type": "module", + "description": "MCP App Server example for rendering ShaderToy-compatible GLSL shaders", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/shadertoy-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], + "scripts": { + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", + "watch": "cross-env INPUT=mcp-app.html vite build --watch", + "serve": "bun server.ts", + "start": "cross-env NODE_ENV=development npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } +} diff --git a/examples/shadertoy-server/server-utils.ts b/examples/shadertoy-server/server-utils.ts new file mode 100644 index 0000000..9fe9745 --- /dev/null +++ b/examples/shadertoy-server/server-utils.ts @@ -0,0 +1,72 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, (err) => { + if (err) { + console.error("Failed to start server:", err); + process.exit(1); + } + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/shadertoy-server/server.ts b/examples/shadertoy-server/server.ts new file mode 100644 index 0000000..ff4d336 --- /dev/null +++ b/examples/shadertoy-server/server.ts @@ -0,0 +1,156 @@ +import { + registerAppResource, + registerAppTool, + RESOURCE_MIME_TYPE, +} from "@modelcontextprotocol/ext-apps/server"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import type { + CallToolResult, + ReadResourceResult, +} from "@modelcontextprotocol/sdk/types.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { z } from "zod"; +import { startServer } from "./server-utils.js"; + +const DIST_DIR = path.join(import.meta.dirname, "dist"); + +const TOOL_DESCRIPTION = `Renders a ShaderToy-compatible GLSL fragment shader in real-time using WebGL 2.0. + +SHADER FORMAT (ShaderToy conventions): +Use ShaderToy's mainImage entry point - do NOT use generic GLSL conventions. + + void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0); + } + +Do NOT use: void main(), gl_FragColor, gl_FragCoord - these will not work. + +AVAILABLE UNIFORMS: +- iResolution (vec3): viewport resolution in pixels +- iTime (float): elapsed time in seconds +- iTimeDelta (float): time since last frame +- iFrame (int): frame counter +- iMouse (vec4): mouse position (xy=current, zw=click) +- iDate (vec4): year, month, day, seconds +- iChannel0-3 (sampler2D): buffer inputs for multi-pass shaders + +MULTI-PASS RENDERING: +- Use bufferA-D parameters for feedback effects, blur chains, simulations +- BufferA output -> iChannel0, BufferB -> iChannel1, etc. +- Buffers can sample their own previous frame for feedback loops + +LIMITATIONS - Do NOT use: +- External textures (generate noise/patterns procedurally) +- Keyboard input (iKeyboard not available) +- Audio/microphone input +- VR features (mainVR not available) + +For procedural noise: + float hash(vec2 p) { return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453); }`; + +const DEFAULT_FRAGMENT_SHADER = `void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0); +}`; + +/** + * Creates a new MCP server instance with tools and resources registered. + */ +export function createServer(): McpServer { + const server = new McpServer({ + name: "ShaderToy Server", + version: "1.0.0", + }); + + const resourceUri = "ui://shadertoy/mcp-app.html"; + + // Register the render-shadertoy tool with UI metadata + registerAppTool( + server, + "render-shadertoy", + { + title: "ShaderToy Renderer", + description: TOOL_DESCRIPTION, + inputSchema: z.object({ + fragmentShader: z + .string() + .default(DEFAULT_FRAGMENT_SHADER) + .describe("Main Image shader - ShaderToy GLSL code"), + common: z + .string() + .optional() + .describe("Common code shared across all shaders (optional)"), + bufferA: z + .string() + .optional() + .describe( + "Buffer A shader code - accessible as iChannel0 (optional)", + ), + bufferB: z + .string() + .optional() + .describe( + "Buffer B shader code - accessible as iChannel1 (optional)", + ), + bufferC: z + .string() + .optional() + .describe( + "Buffer C shader code - accessible as iChannel2 (optional)", + ), + bufferD: z + .string() + .optional() + .describe( + "Buffer D shader code - accessible as iChannel3 (optional)", + ), + }), + _meta: { ui: { resourceUri } }, + }, + async (): Promise => { + // Tool execution returns success - actual rendering happens in the UI + return { + content: [{ type: "text", text: "Shader rendered successfully" }], + }; + }, + ); + + // Register the resource which returns the bundled HTML/JavaScript for the UI + registerAppResource( + server, + resourceUri, + resourceUri, + { mimeType: RESOURCE_MIME_TYPE }, + async (): Promise => { + const html = await fs.readFile( + path.join(DIST_DIR, "mcp-app.html"), + "utf-8", + ); + + return { + contents: [ + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, + ], + }; + }, + ); + + return server; +} + +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "ShaderToy Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/shadertoy-server/src/global.css b/examples/shadertoy-server/src/global.css new file mode 100644 index 0000000..97cda44 --- /dev/null +++ b/examples/shadertoy-server/src/global.css @@ -0,0 +1,12 @@ +* { + box-sizing: border-box; +} + +html, body { + font-family: system-ui, -apple-system, sans-serif; + font-size: 1rem; +} + +code { + font-size: 1em; +} diff --git a/examples/shadertoy-server/src/mcp-app.css b/examples/shadertoy-server/src/mcp-app.css new file mode 100644 index 0000000..d939d88 --- /dev/null +++ b/examples/shadertoy-server/src/mcp-app.css @@ -0,0 +1,12 @@ +html, body { + margin: 0; + width: 100%; + height: 100%; + overflow: hidden; +} + +#canvas { + width: 100%; + height: 100%; + display: block; +} diff --git a/examples/shadertoy-server/src/mcp-app.ts b/examples/shadertoy-server/src/mcp-app.ts new file mode 100644 index 0000000..4e2353b --- /dev/null +++ b/examples/shadertoy-server/src/mcp-app.ts @@ -0,0 +1,126 @@ +/** + * ShaderToy renderer MCP App using ShaderToyLite.js + */ +import { App, type McpUiHostContext } from "@modelcontextprotocol/ext-apps"; +import "./global.css"; +import "./mcp-app.css"; +import ShaderToyLite, { + type ShaderToyLiteInstance, +} from "./vendor/ShaderToyLite.js"; + +interface ShaderInput { + fragmentShader: string; + common?: string; + bufferA?: string; + bufferB?: string; + bufferC?: string; + bufferD?: string; +} + +function isShaderInput(value: unknown): value is ShaderInput { + return ( + typeof value === "object" && + value !== null && + typeof (value as Record).fragmentShader === "string" + ); +} + +const log = { + info: console.log.bind(console, "[APP]"), + warn: console.warn.bind(console, "[APP]"), + error: console.error.bind(console, "[APP]"), +}; + +// Get element references +const mainEl = document.querySelector(".main") as HTMLElement; +const canvas = document.getElementById("canvas") as HTMLCanvasElement; +// Resize canvas to fill viewport +function resizeCanvas() { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; +} +resizeCanvas(); +window.addEventListener("resize", resizeCanvas); + +// Handle host context changes (safe area insets) +function handleHostContextChanged(ctx: McpUiHostContext) { + if (ctx.safeAreaInsets) { + mainEl.style.paddingTop = `${ctx.safeAreaInsets.top}px`; + mainEl.style.paddingRight = `${ctx.safeAreaInsets.right}px`; + mainEl.style.paddingBottom = `${ctx.safeAreaInsets.bottom}px`; + mainEl.style.paddingLeft = `${ctx.safeAreaInsets.left}px`; + } +} + +// ShaderToyLite instance +let shaderToy: ShaderToyLiteInstance | null = null; + +// Create app instance +const app = new App({ name: "ShaderToy Renderer", version: "1.0.0" }); + +app.onteardown = async () => { + log.info("App is being torn down"); + if (shaderToy) { + shaderToy.pause(); + } + return {}; +}; + +app.ontoolinput = (params) => { + log.info("Received shader input"); + + if (!isShaderInput(params.arguments)) { + log.error("Invalid tool input"); + return; + } + + const { fragmentShader, common, bufferA, bufferB, bufferC, bufferD } = + params.arguments; + + // Initialize ShaderToyLite if needed + if (!shaderToy) { + shaderToy = new ShaderToyLite("canvas"); + } + + // Set common code (shared across all shaders) + shaderToy.setCommon(common || ""); + + // Set buffer shaders with self-feedback + if (bufferA) { + shaderToy.setBufferA({ source: bufferA, iChannel0: "A" }); + } + if (bufferB) { + shaderToy.setBufferB({ source: bufferB, iChannel1: "B" }); + } + if (bufferC) { + shaderToy.setBufferC({ source: bufferC, iChannel2: "C" }); + } + if (bufferD) { + shaderToy.setBufferD({ source: bufferD, iChannel3: "D" }); + } + + // Set main Image shader with buffer inputs + shaderToy.setImage({ + source: fragmentShader, + iChannel0: bufferA ? "A" : undefined, + iChannel1: bufferB ? "B" : undefined, + iChannel2: bufferC ? "C" : undefined, + iChannel3: bufferD ? "D" : undefined, + }); + + shaderToy.play(); + log.info("Setup complete"); +}; + +app.onerror = log.error; + +app.onhostcontextchanged = handleHostContextChanged; + +// Connect to host +app.connect().then(() => { + log.info("Connected to host"); + const ctx = app.getHostContext(); + if (ctx) { + handleHostContextChanged(ctx); + } +}); diff --git a/examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts b/examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts new file mode 100644 index 0000000..8527d1a --- /dev/null +++ b/examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts @@ -0,0 +1,113 @@ +/** + * Type declarations for ShaderToyLite.js + * https://github.com/chipweinberger/ShaderToyLite.js + */ + +/** Valid buffer keys for channel inputs */ +type BufferKey = "A" | "B" | "C" | "D"; + +/** Configuration for shader passes (buffers and image) */ +interface ShaderConfig { + /** GLSL fragment shader source code */ + source?: string; + /** Buffer to use as iChannel0 input */ + iChannel0?: BufferKey; + /** Buffer to use as iChannel1 input */ + iChannel1?: BufferKey; + /** Buffer to use as iChannel2 input */ + iChannel2?: BufferKey; + /** Buffer to use as iChannel3 input */ + iChannel3?: BufferKey; +} + +/** ShaderToyLite instance methods */ +interface ShaderToyLiteInstance { + /** + * Set common shader code shared across all passes. + * @param source - GLSL source code to prepend to all shaders + */ + setCommon(source?: string | null): void; + + /** + * Set Buffer A shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferA(config?: ShaderConfig | null): void; + + /** + * Set Buffer B shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferB(config?: ShaderConfig | null): void; + + /** + * Set Buffer C shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferC(config?: ShaderConfig | null): void; + + /** + * Set Buffer D shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferD(config?: ShaderConfig | null): void; + + /** + * Set the main Image shader pass (renders to screen). + * @param config - Shader configuration or falsy to clear + */ + setImage(config?: ShaderConfig | null): void; + + /** + * Set a callback to be called on each draw frame. + * @param callback - Function to call each frame + */ + setOnDraw(callback?: (() => void) | null): void; + + /** + * Add a custom texture that can be used as a channel input. + * @param texture - WebGL texture object + * @param key - Buffer key to reference this texture (only A/B/C/D are recognized by iChannel bindings) + */ + addTexture(texture: WebGLTexture, key: BufferKey): void; + + /** + * Get the current playback time in seconds. + * @returns Time elapsed since first draw + */ + time(): number; + + /** + * Check if the shader is currently playing. + * @returns True if playing, false if paused + */ + isPlaying(): boolean; + + /** + * Reset playback to the beginning (time = 0, frame = 0). + */ + reset(): void; + + /** + * Pause shader playback. + */ + pause(): void; + + /** + * Start or resume shader playback. + */ + play(): void; +} + +/** ShaderToyLite constructor interface */ +interface ShaderToyLiteConstructor { + /** + * Create a new ShaderToyLite instance. + * @param canvasId - ID of the canvas element to render to + */ + new (canvasId: string): ShaderToyLiteInstance; +} + +declare const ShaderToyLite: ShaderToyLiteConstructor; +export default ShaderToyLite; +export type { ShaderToyLiteInstance, ShaderConfig, BufferKey }; diff --git a/examples/shadertoy-server/src/vendor/ShaderToyLite.js b/examples/shadertoy-server/src/vendor/ShaderToyLite.js new file mode 100644 index 0000000..1b03e8b --- /dev/null +++ b/examples/shadertoy-server/src/vendor/ShaderToyLite.js @@ -0,0 +1,437 @@ +/** + * ShaderToyLite.js + * https://github.com/chipweinberger/ShaderToyLite.js + * + * Copyright (c) Chip Weinberger + * Licensed under the MIT License + * https://github.com/chipweinberger/ShaderToyLite.js/blob/master/LICENSE + */ + +function ShaderToyLite(canvasId) { + + var hdr = + `#version 300 es + #ifdef GL_ES + precision highp float; + precision highp int; + precision mediump sampler3D; + #endif + #define texture2D texture + uniform vec3 iResolution; // viewport resolution (in pixels) + uniform float iTime; // shader playback time (in seconds) + uniform float iTimeDelta; // render time (in seconds) + uniform float iFrameRate; // shader frame rate + uniform int iFrame; // shader playback frame + uniform float iChannelTime[4]; // channel playback time (in seconds) + uniform vec3 iChannelResolution[4]; // channel resolution (in pixels) + uniform vec4 iMouse; // mouse pixel coords. xy: current (if MLB down), zw: click + uniform sampler2D iChannel0; // input channel 0 + uniform sampler2D iChannel1; // input channel 1 + uniform sampler2D iChannel2; // input channel 2 + uniform sampler2D iChannel3; // input channel 3 + uniform vec4 iDate; // (year, month, day, unixtime in seconds) + uniform float iSampleRate; // sound sample rate (i.e., 44100) + out vec4 frag_out_color; + void mainImage( out vec4 c, in vec2 f ); + void main( void ) + { + vec4 color = vec4(0.0,0.0,0.0,0.0); + mainImage( color, gl_FragCoord.xy ); + frag_out_color = vec4(color); + } + `; + + var basicFragShader = + `void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + fragColor = texture2D(iChannel0, gl_FragCoord.xy / iResolution.xy); + } + `; + + const basicVertexShader = + `#version 300 es + #ifdef GL_ES + precision highp float; + precision highp int; + precision mediump sampler3D; + #endif + in vec2 vertexInPosition; + void main() { + gl_Position = vec4(vertexInPosition, 0.0, 1.0); + } + `; + + const quadVertices = new Float32Array([ + -1.0, -1.0, + 1.0, -1.0, + -1.0, 1.0, + 1.0, 1.0, + -1.0, 1.0, + 1.0, -1.0 + ]); + + + var opts = { alpha: false, + depth: false, + stencil: false, + premultipliedAlpha: false, + antialias: true, + preserveDrawingBuffer: false, + powerPreference: "high-performance" }; + + var gl = document.getElementById(canvasId).getContext('webgl2', opts); + + // timing + var isPlaying = false; + var firstDrawTime = 0; + var prevDrawTime = 0; + + // callback + var onDrawCallback; + + // uniforms + var iFrame = 0; + var iMouse = {x: 0, y: 0, clickX: 0, clickY: 0}; + + // shader common source + var common = ""; + + // render passes variables. valid keys: + // 'A', 'B', 'C', 'D', 'Image' + var sourcecode = {};// fragment shader code + var ichannels = {}; // texture inputs + var atexture = {}; // front texture (input/output) + var btexture = {}; // back texture (input/output) + var aframebuf = {}; // front buffer (output) + var bframebuf = {}; // back buffer (output) + var program = {}; // webgl program + var location = {}; // uniform location + var flip = {}; // a b flip + var quadBuffer; // two full screen triangles + + + var setup = () => { + gl.getExtension( 'OES_texture_float_linear'); + gl.getExtension( 'OES_texture_half_float_linear'); + gl.getExtension( 'EXT_color_buffer_float'); + gl.getExtension( 'WEBGL_debug_shaders'); + + ['A', 'B', 'C', 'D', 'Image'].forEach((key) => { + sourcecode[key] = ""; + ichannels[key] = {}; + program[key] = null; + location[key] = {}; + if (key != 'Image') { + atexture[key] = createTexture(); + btexture[key] = createTexture(); + aframebuf[key] = createFrameBuffer(atexture[key]); + bframebuf[key] = createFrameBuffer(btexture[key]); + flip[key] = false; + } + }); + + // bind the geometry + quadBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer); + gl.bufferData(gl.ARRAY_BUFFER, quadVertices, gl.STATIC_DRAW); + + // Set viewport size + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + + var canvas = document.getElementById(canvasId); + + window.addEventListener('resize', function() { + gl.canvas.width = canvas.width; + gl.canvas.height = canvas.height; + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + }); + + canvas.addEventListener("mousemove", (event) => { + iMouse.x = event.offsetX; + iMouse.y = canvas.height - event.offsetY; + }); + + canvas.addEventListener("mousedown", (event) => { + iMouse.clickX = event.offsetX; + iMouse.clickY = canvas.height - event.offsetY; + }); + + canvas.addEventListener("mouseup", () => { + iMouse.clickX = 0; + iMouse.clickY = 0; + }); + } + + var createTexture = () => { + var texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, gl.canvas.width, gl.canvas.height, 0, gl.RGBA, gl.FLOAT, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + return texture; + } + + var createFrameBuffer = (texture) => { + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + return framebuffer; + }; + + var compileProgram = (key) => { + var vert = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vert, basicVertexShader); + gl.compileShader(vert); + + if (!gl.getShaderParameter(vert, gl.COMPILE_STATUS)) { + console.error('Vertex Shader compilation failed: ' + gl.getShaderInfoLog(vert)); + gl.deleteShader(vert); + return null; + } + + var source = hdr + common + sourcecode[key]; + var frag = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(frag, source); + gl.compileShader(frag); + + if (!gl.getShaderParameter(frag, gl.COMPILE_STATUS)) { + console.error('Fragment Shader compilation failed: ' + gl.getShaderInfoLog(frag)); + console.error(source); + gl.deleteShader(frag); + return null; + } + + var program = gl.createProgram(); + gl.attachShader(program, vert); + gl.attachShader(program, frag); + gl.linkProgram(program); + + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + console.error('Program initialization failed: ' + gl.getProgramInfoLog(program)); + return null; + } + + // uniform locations + location[key]["iResolution"] = gl.getUniformLocation(program, "iResolution"); + location[key]["iTime"] = gl.getUniformLocation(program, "iTime"); + location[key]["iTimeDelta"] = gl.getUniformLocation(program, "iTimeDelta"); + location[key]["iFrameRate"] = gl.getUniformLocation(program, "iFrameRate"); + location[key]["iFrame"] = gl.getUniformLocation(program, "iFrame"); + location[key]["iChannelTime"] = gl.getUniformLocation(program, "iChannelTime[0]"); + location[key]["iChannelResolution"] = gl.getUniformLocation(program, "iChannelResolution[0]"); + location[key]["iChannel0"] = gl.getUniformLocation(program, "iChannel0"); + location[key]["iChannel1"] = gl.getUniformLocation(program, "iChannel1"); + location[key]["iChannel2"] = gl.getUniformLocation(program, "iChannel2"); + location[key]["iChannel3"] = gl.getUniformLocation(program, "iChannel3"); + location[key]["iMouse"] = gl.getUniformLocation(program, "iMouse"); + location[key]["iDate"] = gl.getUniformLocation(program, "iDate"); + location[key]["iSampleRate"] = gl.getUniformLocation(program, "iSampleRate"); + location[key]["vertexInPosition"] = gl.getAttribLocation(program, "vertexInPosition"); + + return program; + }; + + var repeat = (times, arr) => { + let result = []; + for (let i = 0; i < times; i++) { + result = [...result, ...arr]; + } + return result; + } + + var setShader = (config, key) => { + if (config) { + if (config.source) { + sourcecode[key] = config.source; + program[key] = compileProgram(key); + if (program[key] == null) { + console.error("Failed to compile " + key); + } + } + for (let i = 0; i < 4; i++) { + var s = config[`iChannel${i}`]; + if (s == "A" || s == "B" || s == "C" || s == "D") { + ichannels[key][i] = s; + } + } + } else { + sourcecode[key] = ""; + program[key] = null; + } + }; + + var draw = () => { + + // current time + var now = isPlaying ? Date.now() : prevDrawTime; + var date = new Date(now); + + // first draw? + if (firstDrawTime == 0) { + firstDrawTime = now; + } + + // call callback + if (onDrawCallback) { + onDrawCallback(); + } + + // time difference between frames in seconds + var iTimeDelta = (now - prevDrawTime) * 0.001; + + // time in seconds + var iTime = (now - firstDrawTime) * 0.001; + var iDate = [date.getFullYear(), date.getMonth(), date.getDate(), date.getTime() * 0.001]; + + // channel uniforms + var iChannelTimes = new Float32Array(repeat(4, [iTime])); + var iChannelResolutions = new Float32Array(repeat(4, [gl.canvas.width, gl.canvas.height, 0])); + + ['A', 'B', 'C', 'D', 'Image'].forEach((key) => { + + if (program[key]) { + + // framebuffer + if (key === "Image") { + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + } else { + var output = flip[key] ? bframebuf[key] : aframebuf[key]; + gl.bindFramebuffer(gl.FRAMEBUFFER, output); + } + + // textures + for (let i = 0; i < 4; i++) { + var chkey = ichannels[key][i]; + if (chkey) { + var input = flip[chkey] ? atexture[chkey] : btexture[chkey]; + gl.activeTexture(gl[`TEXTURE${i}`]); + gl.bindTexture(gl.TEXTURE_2D, input); + } + } + + // program + gl.useProgram(program[key]); + + // uniforms + gl.uniform3f( location[key]["iResolution"], gl.canvas.width, gl.canvas.height, 1.0); + gl.uniform1f( location[key]["iTime"], iTime); + gl.uniform1f( location[key]["iTimeDelta"], iTimeDelta); + gl.uniform1f( location[key]["iFrameRate"], 60); + gl.uniform1i( location[key]["iFrame"], iFrame); + gl.uniform1fv(location[key]["iChannelTime"], iChannelTimes); + gl.uniform3fv(location[key]["iChannelResolution"], iChannelResolutions); + gl.uniform1i( location[key]["iChannel0"], 0); + gl.uniform1i( location[key]["iChannel1"], 1); + gl.uniform1i( location[key]["iChannel2"], 2); + gl.uniform1i( location[key]["iChannel3"], 3); + gl.uniform4f( location[key]["iMouse"], iMouse.x, iMouse.y, iMouse.clickX, iMouse.clickY); + gl.uniform4f( location[key]["iDate"], iDate[0], iDate[1], iDate[2], iDate[3]); + gl.uniform1f( location[key]["iSampleRate"], 44100); + + // viewport + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + + // vertexs + gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer); + gl.vertexAttribPointer(location[key]["vertexInPosition"], 2, gl.FLOAT, false, 0, 0); + gl.enableVertexAttribArray(location[key]["vertexInPosition"]); + + // draw + gl.drawArrays(gl.TRIANGLES, 0, 6); + + flip[key] = !flip[key]; + } + }); + + // time of last draw + prevDrawTime = now; + + // frame counter + iFrame++; + }; + + // Animation loop + var animate = () => { + if (isPlaying) { + draw(); + requestAnimationFrame(animate); + } + }; + + this.setCommon = (source) => { + if (source === undefined) {source = "";} + if (source === null) {source = "";} + common = source; + ['A', 'B', 'C', 'D', 'Image'].forEach((key) => { + if (program[key]) { + program[key] = compileProgram(key); + } + }); + }; + + this.setBufferA = (config) => { + setShader(config, 'A'); + }; + + this.setBufferB = (config) => { + setShader(config, 'B'); + }; + + this.setBufferC = (config) => { + setShader(config, 'C'); + }; + + this.setBufferD = (config) => { + setShader(config, 'D'); + }; + + this.setImage = (config) => { + setShader(config, 'Image'); + }; + + this.setOnDraw = (callback) => { + onDrawCallback = callback; + } + + this.addTexture = (texture, key) => { + atexture[key] = texture; + btexture[key] = texture; + flip[key] = false; + } + + this.time = () => { + return (prevDrawTime - firstDrawTime) * 0.001; + } + + this.isPlaying = () => isPlaying; + + this.reset = () => { + var now = new Date(); + firstDrawTime = now; + prevDrawTime = now; + iFrame = 0; + draw(); + } + + this.pause = () => { + isPlaying = false; + } + + this.play = () => { + if (!isPlaying) { + isPlaying = true; + var now = Date.now(); + var elapsed = prevDrawTime - firstDrawTime; + firstDrawTime = now - elapsed; + prevDrawTime = now; + animate(); + } + } + + setup(); +} + +export default ShaderToyLite; diff --git a/examples/shadertoy-server/tsconfig.json b/examples/shadertoy-server/tsconfig.json new file mode 100644 index 0000000..535267b --- /dev/null +++ b/examples/shadertoy-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts"] +} diff --git a/examples/shadertoy-server/vite.config.ts b/examples/shadertoy-server/vite.config.ts new file mode 100644 index 0000000..6ff6d99 --- /dev/null +++ b/examples/shadertoy-server/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/package-lock.json b/package-lock.json index b63c292..a6cc8a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,8 +104,6 @@ }, "examples/basic-host/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" }, @@ -143,8 +141,6 @@ }, "examples/basic-server-preact/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" }, @@ -185,8 +181,6 @@ }, "examples/basic-server-react/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" }, @@ -224,8 +218,6 @@ }, "examples/basic-server-solid/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" }, @@ -263,8 +255,6 @@ }, "examples/basic-server-svelte/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" }, @@ -300,8 +290,6 @@ }, "examples/basic-server-vanillajs/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" }, @@ -339,8 +327,6 @@ }, "examples/basic-server-vue/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" }, @@ -377,8 +363,6 @@ }, "examples/budget-allocator-server/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" }, @@ -419,8 +403,6 @@ }, "examples/cohort-heatmap-server/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" }, @@ -457,8 +439,6 @@ }, "examples/customer-segmentation-server/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" }, @@ -496,8 +476,6 @@ }, "examples/integration-server/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" }, @@ -576,8 +554,41 @@ }, "examples/scenario-modeler-server/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" + }, + "examples/shadertoy-server": { + "name": "@modelcontextprotocol/server-shadertoy", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/shadertoy-server/node_modules/@types/node": { + "version": "22.19.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/shadertoy-server/node_modules/undici-types": { + "version": "6.21.0", "dev": true, "license": "MIT" }, @@ -614,8 +625,6 @@ }, "examples/sheet-music-server/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" }, @@ -653,8 +662,6 @@ }, "examples/system-monitor-server/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" }, @@ -697,8 +704,6 @@ }, "examples/threejs-server/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" }, @@ -734,8 +739,6 @@ }, "examples/video-resource-server/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" }, @@ -773,15 +776,11 @@ }, "examples/wiki-explorer-server/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/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -795,8 +794,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -805,10 +802,9 @@ }, "node_modules/@babel/core": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -836,8 +832,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -846,8 +840,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -863,8 +855,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { @@ -876,8 +866,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -893,8 +881,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -903,8 +889,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { @@ -913,8 +897,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -927,8 +909,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { @@ -945,8 +925,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -955,8 +933,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -964,8 +940,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -973,8 +947,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -983,8 +955,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -997,8 +967,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -1012,8 +980,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { @@ -1028,8 +994,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "dev": true, "license": "MIT", "dependencies": { @@ -1048,8 +1012,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1064,8 +1026,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -1080,8 +1040,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1096,8 +1054,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -1111,8 +1067,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1130,8 +1084,6 @@ }, "node_modules/@babel/types": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1143,8 +1095,6 @@ }, "node_modules/@clack/core": { "version": "1.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.0-alpha.4.tgz", - "integrity": "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg==", "dev": true, "license": "MIT", "dependencies": { @@ -1154,8 +1104,6 @@ }, "node_modules/@clack/prompts": { "version": "1.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.0-alpha.4.tgz", - "integrity": "sha512-KnmtDF2xQGoI5AlBme9akHtvCRV0RKAARUXHBQO2tMwnY8B08/4zPWigT7uLK25UPrMCEqnyQPkKRjNdhPbf8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1166,15 +1114,11 @@ }, "node_modules/@dimforge/rapier3d-compat": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", - "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", "dev": true, "license": "Apache-2.0" }, "node_modules/@epic-web/invariant": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, @@ -1452,8 +1396,6 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -1621,35 +1563,19 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.21.0.tgz", - "integrity": "sha512-9PrsT5DjZA+w3lur/aOIx3FlDeHdyCEFlv9U+fmsVyjPZh61G5SYURQ/1ebe2U63KbDmI2V8IhIUegWb8hjOyg==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.21.0", - "@shikijs/langs": "^3.21.0", - "@shikijs/themes": "^3.21.0", - "@shikijs/types": "^3.21.0", + "@shikijs/engine-oniguruma": "^3.19.0", + "@shikijs/langs": "^3.19.0", + "@shikijs/themes": "^3.19.0", + "@shikijs/types": "^3.19.0", "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/@hono/node-server": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", - "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1658,8 +1584,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1668,8 +1592,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1677,14 +1599,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1693,8 +1611,6 @@ }, "node_modules/@kurkle/color": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, "node_modules/@modelcontextprotocol/ext-apps": { @@ -1706,12 +1622,9 @@ "link": true }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", - "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", + "version": "1.24.3", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -1722,7 +1635,6 @@ "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", - "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", @@ -1788,6 +1700,10 @@ "resolved": "examples/scenario-modeler-server", "link": true }, + "node_modules/@modelcontextprotocol/server-shadertoy": { + "resolved": "examples/shadertoy-server", + "link": true + }, "node_modules/@modelcontextprotocol/server-sheet-music": { "resolved": "examples/sheet-music-server", "link": true @@ -1810,8 +1726,6 @@ }, "node_modules/@oclif/core": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.8.0.tgz", - "integrity": "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1840,8 +1754,6 @@ }, "node_modules/@oclif/core/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1850,8 +1762,6 @@ }, "node_modules/@oclif/core/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -1931,8 +1841,6 @@ }, "node_modules/@oven/bun-linux-x64": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.3.5.tgz", - "integrity": "sha512-n7zhKTSDZS0yOYg5Rq8easZu5Y/o47sv0c7yGr2ciFdcie9uYV55fZ7QMqhWMGK33ezCSikh5EDkUMCIvfWpjA==", "cpu": [ "x64" ], @@ -1944,8 +1852,6 @@ }, "node_modules/@oven/bun-linux-x64-baseline": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.3.5.tgz", - "integrity": "sha512-FeCQyBU62DMuB0nn01vPnf3McXrKOsrK9p7sHaBFYycw0mmoU8kCq/WkBkGMnLuvQljJSyen8QBTx+fXdNupWg==", "cpu": [ "x64" ], @@ -1957,8 +1863,6 @@ }, "node_modules/@oven/bun-linux-x64-musl": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.3.5.tgz", - "integrity": "sha512-XkCCHkByYn8BIDvoxnny898znju4xnW2kvFE8FT5+0Y62cWdcBGMZ9RdsEUTeRz16k8hHtJpaSfLcEmNTFIwRQ==", "cpu": [ "x64" ], @@ -1970,8 +1874,6 @@ }, "node_modules/@oven/bun-linux-x64-musl-baseline": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.3.5.tgz", - "integrity": "sha512-TJiYC7KCr0XxFTsxgwQOeE7dncrEL/RSyL0EzSL3xRkrxJMWBCvCSjQn7LV1i6T7hFst0+3KoN3VWvD5BinqHA==", "cpu": [ "x64" ], @@ -2009,8 +1911,6 @@ }, "node_modules/@playwright/test": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", - "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2025,8 +1925,6 @@ }, "node_modules/@preact/preset-vite": { "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.2.tgz", - "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", "dev": true, "license": "MIT", "dependencies": { @@ -2046,15 +1944,11 @@ }, "node_modules/@prefresh/babel-plugin": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.2.tgz", - "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==", "dev": true, "license": "MIT" }, "node_modules/@prefresh/core": { "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.9.tgz", - "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2063,15 +1957,11 @@ }, "node_modules/@prefresh/utils": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==", "dev": true, "license": "MIT" }, "node_modules/@prefresh/vite": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.11.tgz", - "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", "dev": true, "license": "MIT", "dependencies": { @@ -2088,15 +1978,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, "node_modules/@rollup/pluginutils": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2107,10 +1993,15 @@ "node": ">= 8.0.0" } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", "cpu": [ "arm" ], @@ -2122,9 +2013,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", "cpu": [ "arm64" ], @@ -2162,9 +2053,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", "cpu": [ "arm64" ], @@ -2176,9 +2067,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", "cpu": [ "x64" ], @@ -2190,9 +2081,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", "cpu": [ "arm" ], @@ -2204,9 +2095,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", "cpu": [ "arm" ], @@ -2231,9 +2122,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", "cpu": [ "arm64" ], @@ -2245,23 +2136,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", "cpu": [ "loong64" ], @@ -2273,23 +2150,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", "cpu": [ "ppc64" ], @@ -2301,9 +2164,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", "cpu": [ "riscv64" ], @@ -2315,9 +2178,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", "cpu": [ "riscv64" ], @@ -2329,9 +2192,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", "cpu": [ "s390x" ], @@ -2343,9 +2206,7 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.53.3", "cpu": [ "x64" ], @@ -2356,9 +2217,7 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.53.3", "cpu": [ "x64" ], @@ -2369,24 +2228,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", "cpu": [ "arm64" ], @@ -2411,9 +2256,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", "cpu": [ "ia32" ], @@ -2425,9 +2270,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", "cpu": [ "x64" ], @@ -2452,40 +2297,32 @@ ] }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz", - "integrity": "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.21.0", + "@shikijs/types": "3.19.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.21.0.tgz", - "integrity": "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.21.0" + "@shikijs/types": "3.19.0" } }, "node_modules/@shikijs/themes": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.21.0.tgz", - "integrity": "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.21.0" + "@shikijs/types": "3.19.0" } }, "node_modules/@shikijs/types": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.21.0.tgz", - "integrity": "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { @@ -2495,15 +2332,11 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, "node_modules/@sveltejs/acorn-typescript": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", - "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", "license": "MIT", "peerDependencies": { "acorn": "^8.9.0" @@ -2511,10 +2344,9 @@ }, "node_modules/@sveltejs/vite-plugin-svelte": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", - "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", @@ -2533,8 +2365,6 @@ }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", - "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", "dev": true, "license": "MIT", "dependencies": { @@ -2551,15 +2381,11 @@ }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2572,8 +2398,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2582,8 +2406,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2593,8 +2415,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2603,8 +2423,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2613,19 +2431,15 @@ } }, "node_modules/@types/bun": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.5.tgz", - "integrity": "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==", + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { - "bun-types": "1.3.5" + "bun-types": "1.3.3" } }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -2635,8 +2449,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -2645,8 +2457,6 @@ }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -2655,21 +2465,15 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -2680,8 +2484,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dev": true, "license": "MIT", "dependencies": { @@ -2693,8 +2495,6 @@ }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2703,49 +2503,39 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", - "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "version": "24.10.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2754,8 +2544,6 @@ }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2764,8 +2552,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2775,15 +2561,11 @@ }, "node_modules/@types/stats.js": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", "dev": true, "license": "MIT" }, "node_modules/@types/three": { "version": "0.181.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz", - "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==", "dev": true, "license": "MIT", "dependencies": { @@ -2798,22 +2580,16 @@ }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/webxr": { "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", "dev": true, "license": "MIT" }, "node_modules/@typescript/vfs": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz", - "integrity": "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==", "dev": true, "license": "MIT", "dependencies": { @@ -2825,8 +2601,6 @@ }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { @@ -2846,8 +2620,6 @@ }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", "engines": { @@ -2860,8 +2632,6 @@ }, "node_modules/@vitest/expect": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { @@ -2877,8 +2647,6 @@ }, "node_modules/@vitest/mocker": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2902,20 +2670,8 @@ } } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -2927,8 +2683,6 @@ }, "node_modules/@vitest/runner": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2942,8 +2696,6 @@ }, "node_modules/@vitest/snapshot": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2957,8 +2709,6 @@ }, "node_modules/@vitest/spy": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -2970,8 +2720,6 @@ }, "node_modules/@vitest/utils": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { @@ -2985,8 +2733,6 @@ }, "node_modules/@vue/compiler-core": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz", - "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -2998,8 +2744,6 @@ }, "node_modules/@vue/compiler-core/node_modules/entities": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", - "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -3008,10 +2752,12 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, "node_modules/@vue/compiler-dom": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz", - "integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==", "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.26", @@ -3020,8 +2766,6 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz", - "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -3035,10 +2779,12 @@ "source-map-js": "^1.2.1" } }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, "node_modules/@vue/compiler-ssr": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz", - "integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==", "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.26", @@ -3047,8 +2793,6 @@ }, "node_modules/@vue/reactivity": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz", - "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==", "license": "MIT", "dependencies": { "@vue/shared": "3.5.26" @@ -3056,8 +2800,6 @@ }, "node_modules/@vue/runtime-core": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz", - "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==", "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.26", @@ -3066,8 +2808,6 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz", - "integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==", "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.26", @@ -3078,8 +2818,6 @@ }, "node_modules/@vue/server-renderer": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz", - "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==", "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.5.26", @@ -3091,21 +2829,15 @@ }, "node_modules/@vue/shared": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz", - "integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==", "license": "MIT" }, "node_modules/@webgpu/types": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.68.tgz", - "integrity": "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==", + "version": "0.1.67", "dev": true, "license": "BSD-3-Clause" }, "node_modules/abcjs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/abcjs/-/abcjs-6.6.0.tgz", - "integrity": "sha512-lYS+qwOOxFcFY5ZjNmS1l4RT6BxGd2juBOzLD5/PfLZ+jd0zz29CMI/SwxCWb0+cdKjTBc/EHO43lUGB93FaAw==", + "version": "6.5.2", "license": "MIT", "funding": { "type": "github", @@ -3114,8 +2846,6 @@ }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -3127,8 +2857,6 @@ }, "node_modules/accessor-fn": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", - "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", "dev": true, "license": "MIT", "engines": { @@ -3137,9 +2865,8 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3149,8 +2876,6 @@ }, "node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3165,8 +2890,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3182,8 +2905,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3198,8 +2919,6 @@ }, "node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -3211,8 +2930,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -3227,8 +2944,6 @@ }, "node_modules/ansis": { "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", "dev": true, "license": "ISC", "engines": { @@ -3237,8 +2952,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -3251,15 +2964,11 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -3267,8 +2976,6 @@ }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -3277,15 +2984,11 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/axobject-query": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -3293,8 +2996,6 @@ }, "node_modules/babel-plugin-jsx-dom-expressions": { "version": "0.40.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.3.tgz", - "integrity": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==", "dev": true, "license": "MIT", "dependencies": { @@ -3310,8 +3011,6 @@ }, "node_modules/babel-plugin-jsx-dom-expressions/node_modules/@babel/helper-module-imports": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "license": "MIT", "dependencies": { @@ -3323,8 +3022,6 @@ }, "node_modules/babel-plugin-transform-hook-names": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", - "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3333,8 +3030,6 @@ }, "node_modules/babel-preset-solid": { "version": "1.9.10", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", - "integrity": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3352,8 +3047,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, @@ -3369,8 +3062,6 @@ }, "node_modules/bezier-js": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "dev": true, "license": "MIT", "funding": { @@ -3380,8 +3071,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -3392,9 +3081,7 @@ } }, "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.2.1", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -3403,7 +3090,7 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.1", + "qs": "^6.14.0", "raw-body": "^3.0.1", "type-is": "^2.0.1" }, @@ -3417,14 +3104,10 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3434,8 +3117,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -3447,8 +3128,6 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -3465,6 +3144,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3480,9 +3160,7 @@ } }, "node_modules/bun-types": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.5.tgz", - "integrity": "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==", + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -3491,8 +3169,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3500,8 +3176,6 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -3510,8 +3184,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3523,8 +3195,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3538,9 +3208,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001763", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", - "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", + "version": "1.0.30001759", "dev": true, "funding": [ { @@ -3560,8 +3228,6 @@ }, "node_modules/canvas-color-tracker": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", - "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -3573,8 +3239,6 @@ }, "node_modules/chai": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3590,8 +3254,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -3607,8 +3269,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -3620,8 +3280,6 @@ }, "node_modules/chart.js": { "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -3631,9 +3289,7 @@ } }, "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "version": "2.1.1", "dev": true, "license": "MIT", "engines": { @@ -3642,8 +3298,6 @@ }, "node_modules/cheerio": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -3667,8 +3321,6 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -3684,8 +3336,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3709,8 +3359,6 @@ }, "node_modules/clean-stack": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3725,8 +3373,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -3741,8 +3387,6 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -3754,8 +3398,6 @@ }, "node_modules/cli-truncate": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { @@ -3771,8 +3413,6 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3788,8 +3428,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3803,8 +3441,6 @@ }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -3813,8 +3449,6 @@ }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3826,8 +3460,6 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -3835,8 +3467,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3848,29 +3478,21 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/concurrently": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -3894,8 +3516,6 @@ }, "node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -3907,8 +3527,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3916,15 +3534,11 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3932,8 +3546,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -3941,8 +3553,6 @@ }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -3954,8 +3564,6 @@ }, "node_modules/cross-env": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -3972,8 +3580,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3986,8 +3592,6 @@ }, "node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -4002,8 +3606,6 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -4014,14 +3616,10 @@ }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, "license": "ISC", "dependencies": { @@ -4033,15 +3631,11 @@ }, "node_modules/d3-binarytree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", "dev": true, "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, "license": "ISC", "engines": { @@ -4050,8 +3644,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, "license": "ISC", "engines": { @@ -4060,8 +3652,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, "license": "ISC", "dependencies": { @@ -4074,8 +3664,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4084,8 +3672,6 @@ }, "node_modules/d3-force-3d": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", - "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", "dev": true, "license": "MIT", "dependencies": { @@ -4101,8 +3687,6 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, "license": "ISC", "engines": { @@ -4111,8 +3695,6 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, "license": "ISC", "dependencies": { @@ -4124,15 +3706,11 @@ }, "node_modules/d3-octree": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", "dev": true, "license": "MIT" }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, "license": "ISC", "engines": { @@ -4141,8 +3719,6 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4158,8 +3734,6 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4172,18 +3746,15 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -4195,8 +3766,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, "license": "ISC", "dependencies": { @@ -4208,8 +3777,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, "license": "ISC", "engines": { @@ -4218,8 +3785,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4238,8 +3803,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, "license": "ISC", "dependencies": { @@ -4255,8 +3818,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4272,8 +3833,6 @@ }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -4282,8 +3841,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -4292,8 +3849,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4301,14 +3856,10 @@ }, "node_modules/devalue": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", "license": "MIT" }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -4321,8 +3872,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -4333,8 +3882,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -4348,8 +3895,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -4362,8 +3907,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -4376,14 +3919,10 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4397,23 +3936,17 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.266", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4421,8 +3954,6 @@ }, "node_modules/encoding-sniffer": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -4434,8 +3965,6 @@ }, "node_modules/encoding-sniffer/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4446,8 +3975,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -4458,8 +3985,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -4471,8 +3996,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4480,8 +4003,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4489,15 +4010,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -4508,8 +4025,6 @@ }, "node_modules/esbuild": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4550,8 +4065,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -4560,14 +4073,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -4579,29 +4088,25 @@ }, "node_modules/esm-env": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", "license": "MIT" }, "node_modules/esrap": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", - "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4609,15 +4114,11 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -4628,17 +4129,13 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "version": "1.2.2", "dev": true, "license": "Apache-2.0", "engines": { @@ -4647,9 +4144,8 @@ }, "node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -4690,8 +4186,6 @@ }, "node_modules/express-rate-limit": { "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { "node": ">= 16" @@ -4705,14 +4199,10 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -4727,15 +4217,11 @@ }, "node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, "license": "MIT" }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4744,8 +4230,6 @@ }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4754,8 +4238,6 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -4767,8 +4249,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4780,8 +4260,6 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -4801,8 +4279,6 @@ }, "node_modules/float-tooltip": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", - "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", "dev": true, "license": "MIT", "dependencies": { @@ -4816,8 +4292,6 @@ }, "node_modules/force-graph": { "version": "1.51.0", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz", - "integrity": "sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==", "dev": true, "license": "MIT", "dependencies": { @@ -4843,8 +4317,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4852,8 +4324,6 @@ }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4876,8 +4346,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4885,8 +4353,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -4895,8 +4361,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -4905,8 +4369,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -4918,8 +4380,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4942,8 +4402,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -4952,8 +4410,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -4965,8 +4421,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4978,8 +4432,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4991,8 +4443,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5003,8 +4453,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5013,8 +4461,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5025,8 +4471,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5037,35 +4481,19 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { "he": "bin/he" } }, - "node_modules/hono": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.3.tgz", - "integrity": "sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=16.9.0" - } - }, "node_modules/html-entities": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true, "license": "MIT" }, "node_modules/htmlparser2": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5083,8 +4511,6 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -5095,8 +4521,6 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -5115,8 +4539,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -5130,9 +4552,7 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.0", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5147,15 +4567,11 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true, "license": "ISC" }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -5164,8 +4580,6 @@ }, "node_modules/index-array-by": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "dev": true, "license": "MIT", "engines": { @@ -5174,8 +4588,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/integration-server": { @@ -5184,8 +4596,6 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, "license": "ISC", "engines": { @@ -5194,8 +4604,6 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -5203,8 +4611,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -5216,8 +4622,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -5232,8 +4636,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -5242,8 +4644,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5258,8 +4658,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -5271,8 +4669,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -5281,14 +4677,10 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-reference": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" @@ -5296,8 +4688,6 @@ }, "node_modules/is-what": { "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, "license": "MIT", "engines": { @@ -5309,8 +4699,6 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -5322,14 +4710,10 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/jake": { "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5346,8 +4730,6 @@ }, "node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -5355,15 +4737,11 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -5375,20 +4753,10 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -5400,8 +4768,6 @@ }, "node_modules/kapsule": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", - "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", "dev": true, "license": "MIT", "dependencies": { @@ -5413,8 +4779,6 @@ }, "node_modules/kleur": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, "license": "MIT", "engines": { @@ -5423,15 +4787,11 @@ }, "node_modules/kolorist": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", "dev": true, "license": "MIT" }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -5443,8 +4803,6 @@ }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5453,8 +4811,6 @@ }, "node_modules/listr2": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { @@ -5471,8 +4827,6 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -5484,15 +4838,11 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5509,8 +4859,6 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -5527,21 +4875,15 @@ }, "node_modules/locate-character": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "version": "4.17.21", "dev": true, "license": "MIT" }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -5560,8 +4902,6 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -5576,8 +4916,6 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -5589,15 +4927,11 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5614,8 +4948,6 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -5632,15 +4964,11 @@ }, "node_modules/loupe": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -5649,15 +4977,11 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -5665,8 +4989,6 @@ }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { @@ -5683,8 +5005,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5692,15 +5012,11 @@ }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5708,8 +5024,6 @@ }, "node_modules/merge-anything": { "version": "5.1.7", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", - "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5724,8 +5038,6 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -5736,15 +5048,11 @@ }, "node_modules/meshoptimizer": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", - "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "dev": true, "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -5757,8 +5065,6 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5766,8 +5072,6 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -5782,8 +5086,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -5795,8 +5097,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -5808,14 +5108,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -5832,8 +5128,6 @@ }, "node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5841,8 +5135,6 @@ }, "node_modules/node-html-parser": { "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -5852,15 +5144,11 @@ }, "node_modules/node-releases": { "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5888,8 +5176,6 @@ }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -5898,8 +5184,6 @@ }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -5911,8 +5195,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -5921,8 +5203,6 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -5933,8 +5213,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5942,8 +5220,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5954,8 +5230,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -5966,8 +5240,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -5975,8 +5247,6 @@ }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5991,8 +5261,6 @@ }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -6003,8 +5271,6 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -6016,8 +5282,6 @@ }, "node_modules/parse5-parser-stream": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", "dependencies": { "parse5": "^7.0.0" @@ -6028,8 +5292,6 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -6040,8 +5302,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6049,8 +5309,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -6058,8 +5316,6 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -6068,15 +5324,11 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -6085,14 +5337,10 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -6104,8 +5352,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -6113,8 +5359,6 @@ }, "node_modules/playwright": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", - "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6132,8 +5376,6 @@ }, "node_modules/playwright-core": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6160,8 +5402,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -6187,10 +5427,9 @@ } }, "node_modules/preact": { - "version": "10.28.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", - "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", + "version": "10.28.0", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -6198,8 +5437,6 @@ }, "node_modules/prettier": { "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "bin": { @@ -6214,8 +5451,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -6227,15 +5462,11 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true, "license": "MIT" }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { @@ -6243,9 +5474,7 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.0", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -6259,8 +5488,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6268,8 +5495,6 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -6282,30 +5507,25 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.1", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.2.1", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.2.1" } }, "node_modules/react-refresh": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -6314,8 +5534,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -6327,8 +5545,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -6337,8 +5553,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6346,8 +5560,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -6356,8 +5568,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -6373,15 +5583,11 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.53.3", "dev": true, "license": "MIT", "dependencies": { @@ -6395,38 +5601,103 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -6441,8 +5712,6 @@ }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6451,20 +5720,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6475,44 +5738,35 @@ } }, "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "version": "1.2.0", "license": "MIT", "dependencies": { - "debug": "^4.4.3", + "debug": "^4.3.5", "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", + "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" + "statuses": "^2.0.1" }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/seroval": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", - "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.3.tgz", - "integrity": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==", "license": "MIT", "engines": { "node": ">=10" @@ -6522,9 +5776,7 @@ } }, "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "version": "2.2.0", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -6534,22 +5786,14 @@ }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "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==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -6560,8 +5804,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -6569,8 +5811,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -6582,8 +5822,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6601,8 +5839,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6617,8 +5853,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6635,8 +5869,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6654,15 +5886,11 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -6674,8 +5902,6 @@ }, "node_modules/simple-code-frame": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/simple-code-frame/-/simple-code-frame-1.3.0.tgz", - "integrity": "sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==", "dev": true, "license": "MIT", "dependencies": { @@ -6684,8 +5910,6 @@ }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { @@ -6697,15 +5921,11 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { @@ -6717,8 +5937,6 @@ }, "node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -6734,8 +5952,6 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -6747,9 +5963,8 @@ }, "node_modules/solid-js": { "version": "1.9.10", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", - "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -6758,8 +5973,6 @@ }, "node_modules/solid-refresh": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", - "integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==", "dev": true, "license": "MIT", "dependencies": { @@ -6773,8 +5986,6 @@ }, "node_modules/source-map": { "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6783,8 +5994,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6792,8 +6001,6 @@ }, "node_modules/stack-trace": { "version": "1.0.0-pre2", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", - "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", "dev": true, "license": "MIT", "engines": { @@ -6802,15 +6009,11 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6818,15 +6021,11 @@ }, "node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -6840,8 +6039,6 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -6850,8 +6047,6 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -6860,8 +6055,6 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -6873,8 +6066,6 @@ }, "node_modules/strip-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6889,8 +6080,6 @@ }, "node_modules/strip-literal": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "license": "MIT", "dependencies": { @@ -6902,15 +6091,11 @@ }, "node_modules/strip-literal/node_modules/js-tokens": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6924,10 +6109,9 @@ } }, "node_modules/svelte": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", - "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", + "version": "5.46.0", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -6950,9 +6134,7 @@ } }, "node_modules/systeminformation": { - "version": "5.30.2", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.2.tgz", - "integrity": "sha512-Rrt5oFTWluUVuPlbtn3o9ja+nvjdF3Um4DG0KxqfYvpzcx7Q9plZBTjJiJy9mAouua4+OI7IUGBaG9Zyt9NgxA==", + "version": "5.27.11", "license": "MIT", "os": [ "darwin", @@ -6977,8 +6159,6 @@ }, "node_modules/text-camel-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-camel-case/-/text-camel-case-1.2.9.tgz", - "integrity": "sha512-wKYs9SgRxYizJE1mneR7BbLNlGw2IYzJAS8XwkWIry0CTbO1gvvPkFsx5Z1/hr+VqUaBqx9q3yKd30HpZLdMsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6987,8 +6167,6 @@ }, "node_modules/text-capital-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-capital-case/-/text-capital-case-1.2.9.tgz", - "integrity": "sha512-X5zV8U8pxtq2xS2t46lgAWqZdDbgWMKq03MQSNwY2CJdQCsdTNh144E2Q/q9wBxWzSBUXn+jRc9kF+Gs8/pGhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6998,8 +6176,6 @@ }, "node_modules/text-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-case/-/text-case-1.2.9.tgz", - "integrity": "sha512-zZVdA8rMcjx9zhekdUuOPZShc25UTV7W8/ddKbgbPtfCEvIiToPtWiSd2lXLSuiGMovNhJ4+Tw49xll9o9ts+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7027,8 +6203,6 @@ }, "node_modules/text-constant-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-constant-case/-/text-constant-case-1.2.9.tgz", - "integrity": "sha512-Vosm6nC7Gag+JFakJHwqS9AXRNgl07j5KZ7srU9cYuKRzYwrxzeJ4RpEogRBNHw7CfmOm0j5FGEznblWtu7pIw==", "dev": true, "license": "MIT", "dependencies": { @@ -7038,8 +6212,6 @@ }, "node_modules/text-dot-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-dot-case/-/text-dot-case-1.2.9.tgz", - "integrity": "sha512-N83hsnvGdSO9q9AfNSB9Cy1LFDNN2MCx53LcxtaPoDWPUTk47fv0JlvIY1tgY0wyzCiThF03kVj3jworvAOScA==", "dev": true, "license": "MIT", "dependencies": { @@ -7048,8 +6220,6 @@ }, "node_modules/text-header-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-header-case/-/text-header-case-1.2.9.tgz", - "integrity": "sha512-TqryEKcYisQAfWLbtT3xPnZlMZ/mySO1uS+LUg+B0eNuqgETrSzVpXIUj5E6Zf/EyJHgpZf4VndbAXtOMJuT4w==", "dev": true, "license": "MIT", "dependencies": { @@ -7058,22 +6228,16 @@ }, "node_modules/text-is-lower-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-is-lower-case/-/text-is-lower-case-1.2.9.tgz", - "integrity": "sha512-cEurrWSnYVYqL8FSwl5cK4mdfqF7qNDCcKJgXI3NnfTesiB8umxAhdlQoErrRYI1xEvYr2WN0MI333EehUhQjg==", "dev": true, "license": "MIT" }, "node_modules/text-is-upper-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-is-upper-case/-/text-is-upper-case-1.2.9.tgz", - "integrity": "sha512-HxsWr3VCsXXiLlhD0c+Ey+mS2lOTCiSJbkepjaXNHl2bp33KiscQaiG0qLwQmmpZQm4SJCg2s9FkndxS0RNDLQ==", "dev": true, "license": "MIT" }, "node_modules/text-kebab-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-kebab-case/-/text-kebab-case-1.2.9.tgz", - "integrity": "sha512-nOUyNR5Ej2B9D/wyyXfwUEv26+pQuOb1pEX+ojE37mCIWo8QeOxw5y6nxuqDmG7NrEPzbO6265UMV+EICH13Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -7082,22 +6246,16 @@ }, "node_modules/text-lower-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-lower-case/-/text-lower-case-1.2.9.tgz", - "integrity": "sha512-53AOnDrhPpiAUQkgY1SHleKUXp/u7GsqRX13NcCREZscmtjLLJ099uxMRjkK7q2KwHkFYVPl9ytkQlTkTQLS0w==", "dev": true, "license": "MIT" }, "node_modules/text-lower-case-first": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-lower-case-first/-/text-lower-case-first-1.2.9.tgz", - "integrity": "sha512-iiphHTV7PVH0MljrEQUA9iBE7jfDpXoi4RQju3WzZU3BRVbS6540cNZgxR19hWa0z6z/7cJTH0Ls9LPBaiUfKg==", "dev": true, "license": "MIT" }, "node_modules/text-no-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-no-case/-/text-no-case-1.2.9.tgz", - "integrity": "sha512-IcCt328KaapimSrytP4ThfC8URmHZb2DgOqCL9BYvGjpxY2lDiqCkIQk9sClZtwcELs2gTnq83a7jNc573FTLA==", "dev": true, "license": "MIT", "dependencies": { @@ -7106,8 +6264,6 @@ }, "node_modules/text-param-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-param-case/-/text-param-case-1.2.9.tgz", - "integrity": "sha512-nR/Ju9amY3aQS1en2CUCgqN/ZiZIVdDyjlJ3xX5J92ChBevGuA4o9K10fh3JGMkbzK97Vcb+bWQJ4Q+Svz+GyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7116,8 +6272,6 @@ }, "node_modules/text-pascal-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-pascal-case/-/text-pascal-case-1.2.9.tgz", - "integrity": "sha512-o6ZxMGjWDTUW54pcghpXes+C2PqbYRMdU5mHrIhueb6z6nq1NueiIOeCUdrSjN/3wXfhCmnFjK7/d9aRGZNqSg==", "dev": true, "license": "MIT", "dependencies": { @@ -7126,8 +6280,6 @@ }, "node_modules/text-path-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-path-case/-/text-path-case-1.2.9.tgz", - "integrity": "sha512-s8cJ6r5TkJp5ticXMgtxd7f12odEN4d1CfX5u4aoz6jcUtBR2lDqzIhVimkqWFMJ4UKPSrmilUha8Xc2BPi+ow==", "dev": true, "license": "MIT", "dependencies": { @@ -7136,8 +6288,6 @@ }, "node_modules/text-sentence-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-sentence-case/-/text-sentence-case-1.2.9.tgz", - "integrity": "sha512-/G/Yi5kZfUa1edFRV4O3lGZAkbDZTFvlwW8CYfH7szkEGe2k2MYEYbOyAkGRVQEGV6V6JiuUAaP3VS9c1tB6nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7147,8 +6297,6 @@ }, "node_modules/text-snake-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-snake-case/-/text-snake-case-1.2.9.tgz", - "integrity": "sha512-+ZrqK19ynF/TLQZ7ynqVrL2Dy04uu9syYZwsm8PhzUdsY3XrwPy6QiRqhIEFqhyWbShPcfyfmheer5UEQqFxlw==", "dev": true, "license": "MIT", "dependencies": { @@ -7157,15 +6305,11 @@ }, "node_modules/text-swap-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-swap-case/-/text-swap-case-1.2.9.tgz", - "integrity": "sha512-g5fp12ldktYKK9wdHRMvvtSCQrZYNv/D+ZGLumDsvAY4q9T5bCMO2IWMkIP1F5gVQrysdHH6Xv877P/pjUq1iw==", "dev": true, "license": "MIT" }, "node_modules/text-title-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-title-case/-/text-title-case-1.2.9.tgz", - "integrity": "sha512-RAtC9cdmPp41ns5/HXZBsaQg71BsHT7uZpj2ojTtuFa8o2dNuRYYOrSmy5YdLRIAJQ6WK5hQVpV3jHuq7a+4Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -7175,49 +6319,35 @@ }, "node_modules/text-upper-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-upper-case/-/text-upper-case-1.2.9.tgz", - "integrity": "sha512-K/0DNT7a4z8eah2spARtoJllTZyrNTo6Uc0ujhN/96Ir9uJ/slpahfs13y46H9osL3daaLl3O7iXOkW4xtX6bg==", "dev": true, "license": "MIT" }, "node_modules/text-upper-case-first": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-upper-case-first/-/text-upper-case-first-1.2.9.tgz", - "integrity": "sha512-wEDD1B6XqJmEV+xEnBJd+2sBCHZ+7fvA/8Rv/o8+dAsp05YWjYP/kjB8sPH6zqzW0s6jtehIg4IlcKjcYxk2CQ==", "dev": true, "license": "MIT" }, "node_modules/three": { "version": "0.181.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.181.2.tgz", - "integrity": "sha512-k/CjiZ80bYss6Qs7/ex1TBlPD11whT9oKfT8oTGiHa34W4JRd1NiH/Tr1DbHWQ2/vMUypxksLnF2CfmlmM5XFQ==", "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7233,8 +6363,6 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -7251,10 +6379,9 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7264,8 +6391,6 @@ }, "node_modules/tinypool": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -7274,8 +6399,6 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -7284,8 +6407,6 @@ }, "node_modules/tinyspy": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -7294,8 +6415,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7307,8 +6426,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -7316,8 +6433,6 @@ }, "node_modules/touch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, "license": "ISC", "bin": { @@ -7326,8 +6441,6 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -7336,8 +6449,6 @@ }, "node_modules/ts-to-zod": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ts-to-zod/-/ts-to-zod-5.1.0.tgz", - "integrity": "sha512-giqqlvRHunlJqG9tBL/KAO3wWIVZGF//mZiWLKm/fdQnKnz4EN2mtiK5cugN9slytBkdMEXQIaLvMzIScbhhFw==", "dev": true, "license": "MIT", "dependencies": { @@ -7359,8 +6470,6 @@ }, "node_modules/ts-to-zod/node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { @@ -7375,8 +6484,6 @@ }, "node_modules/ts-to-zod/node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -7389,15 +6496,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -7412,15 +6515,11 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { @@ -7438,9 +6537,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", "cpu": [ "ppc64" ], @@ -7455,9 +6554,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", "cpu": [ "arm" ], @@ -7472,9 +6571,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", "cpu": [ "arm64" ], @@ -7489,9 +6588,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", "cpu": [ "x64" ], @@ -7506,9 +6605,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", "cpu": [ "arm64" ], @@ -7523,9 +6622,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", "cpu": [ "x64" ], @@ -7540,9 +6639,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", "cpu": [ "arm64" ], @@ -7557,9 +6656,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", "cpu": [ "x64" ], @@ -7574,9 +6673,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", "cpu": [ "arm" ], @@ -7591,9 +6690,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", "cpu": [ "arm64" ], @@ -7608,9 +6707,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", "cpu": [ "ia32" ], @@ -7625,9 +6724,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", "cpu": [ "loong64" ], @@ -7642,9 +6741,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", "cpu": [ "mips64el" ], @@ -7659,9 +6758,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", "cpu": [ "ppc64" ], @@ -7676,9 +6775,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", "cpu": [ "riscv64" ], @@ -7693,9 +6792,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", "cpu": [ "s390x" ], @@ -7710,9 +6809,7 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.1", "cpu": [ "x64" ], @@ -7727,9 +6824,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", "cpu": [ "arm64" ], @@ -7744,9 +6841,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", "cpu": [ "x64" ], @@ -7761,9 +6858,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", "cpu": [ "arm64" ], @@ -7778,9 +6875,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", "cpu": [ "x64" ], @@ -7795,9 +6892,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", "cpu": [ "arm64" ], @@ -7812,9 +6909,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", "cpu": [ "x64" ], @@ -7829,9 +6926,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", "cpu": [ "arm64" ], @@ -7846,9 +6943,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", "cpu": [ "ia32" ], @@ -7863,9 +6960,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", "cpu": [ "x64" ], @@ -7880,9 +6977,7 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.1", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7893,38 +6988,36 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7936,8 +7029,6 @@ }, "node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -7950,8 +7041,6 @@ }, "node_modules/typedoc": { "version": "0.28.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.15.tgz", - "integrity": "sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7974,8 +7063,6 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7984,8 +7071,6 @@ }, "node_modules/typedoc/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -8000,10 +7085,9 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8014,22 +7098,16 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undefsafe": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true, "license": "MIT" }, "node_modules/undici": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", - "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "version": "7.16.0", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -8037,24 +7115,18 @@ }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.2.2", "dev": true, "funding": [ { @@ -8084,8 +7156,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8093,10 +7163,9 @@ }, "node_modules/vite": { "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8168,8 +7237,6 @@ }, "node_modules/vite-node": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -8191,8 +7258,6 @@ }, "node_modules/vite-plugin-singlefile": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.0.tgz", - "integrity": "sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==", "dev": true, "license": "MIT", "dependencies": { @@ -8208,8 +7273,6 @@ }, "node_modules/vite-plugin-solid": { "version": "2.11.10", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.10.tgz", - "integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==", "dev": true, "license": "MIT", "dependencies": { @@ -8233,8 +7296,6 @@ }, "node_modules/vite-prerender-plugin": { "version": "0.5.12", - "resolved": "https://registry.npmjs.org/vite-prerender-plugin/-/vite-prerender-plugin-0.5.12.tgz", - "integrity": "sha512-EiwhbMn+flg14EysbLTmZSzq8NGTxhytgK3bf4aGRF1evWLGwZiHiUJ1KZDvbxgKbMf2pG6fJWGEa3UZXOnR1g==", "dev": true, "license": "MIT", "dependencies": { @@ -8251,8 +7312,6 @@ }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -8269,10 +7328,9 @@ }, "node_modules/vite/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8282,8 +7340,6 @@ }, "node_modules/vitefu": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -8302,8 +7358,6 @@ }, "node_modules/vitest": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { @@ -8375,8 +7429,6 @@ }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -8388,9 +7440,8 @@ }, "node_modules/vue": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", - "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -8409,9 +7460,6 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -8422,8 +7470,6 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8434,8 +7480,6 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "engines": { "node": ">=18" @@ -8443,8 +7487,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -8458,8 +7500,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -8475,8 +7515,6 @@ }, "node_modules/widest-line": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "license": "MIT", "dependencies": { @@ -8488,15 +7526,11 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8513,8 +7547,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -8523,8 +7555,6 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8536,14 +7566,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -8552,17 +7578,14 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -8575,8 +7598,6 @@ }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -8594,8 +7615,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -8604,23 +7623,18 @@ }, "node_modules/zimmerframe": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", "license": "MIT" }, "node_modules/zod": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", - "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "version": "4.2.1", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "version": "3.25.0", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" diff --git a/src/generated/schema.json b/src/generated/schema.json index 1d87d9c..a3e72eb 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -30,6 +30,7 @@ }, "McpUiDisplayMode": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Display mode for UI presentation.", "anyOf": [ { "type": "string", @@ -43,8 +44,7 @@ "type": "string", "const": "pip" } - ], - "description": "Display mode for UI presentation." + ] }, "McpUiHostCapabilities": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -261,6 +261,7 @@ "const": "ui/notifications/host-context-changed" }, "params": { + "description": "Partial context update containing only changed fields.", "type": "object", "properties": { "toolInfo": { @@ -281,6 +282,7 @@ ] }, "tool": { + "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -305,10 +307,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -406,8 +404,7 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false, - "description": "Tool definition including name, inputSchema, etc." + "additionalProperties": false } }, "required": ["tool"], @@ -434,6 +431,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -743,96 +741,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -881,8 +800,8 @@ "type": "object", "properties": { "height": { - "type": "number", - "description": "Fixed container height in pixels." + "description": "Fixed container height in pixels.", + "type": "number" } }, "required": ["height"], @@ -911,8 +830,8 @@ "type": "object", "properties": { "width": { - "type": "number", - "description": "Fixed container width in pixels." + "description": "Fixed container width in pixels.", + "type": "number" } }, "required": ["width"], @@ -986,28 +905,27 @@ "type": "object", "properties": { "top": { - "type": "number", - "description": "Top safe area inset in pixels." + "description": "Top safe area inset in pixels.", + "type": "number" }, "right": { - "type": "number", - "description": "Right safe area inset in pixels." + "description": "Right safe area inset in pixels.", + "type": "number" }, "bottom": { - "type": "number", - "description": "Bottom safe area inset in pixels." + "description": "Bottom safe area inset in pixels.", + "type": "number" }, "left": { - "type": "number", - "description": "Left safe area inset in pixels." + "description": "Left safe area inset in pixels.", + "type": "number" } }, "required": ["top", "right", "bottom", "left"], "additionalProperties": false } }, - "additionalProperties": {}, - "description": "Partial context update containing only changed fields." + "additionalProperties": {} } }, "required": ["method", "params"], @@ -1035,6 +953,7 @@ ] }, "tool": { + "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -1059,10 +978,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -1160,8 +1075,7 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false, - "description": "Tool definition including name, inputSchema, etc." + "additionalProperties": false } }, "required": ["tool"], @@ -1188,6 +1102,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -1497,96 +1412,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -1635,8 +1471,8 @@ "type": "object", "properties": { "height": { - "type": "number", - "description": "Fixed container height in pixels." + "description": "Fixed container height in pixels.", + "type": "number" } }, "required": ["height"], @@ -1665,8 +1501,8 @@ "type": "object", "properties": { "width": { - "type": "number", - "description": "Fixed container width in pixels." + "description": "Fixed container width in pixels.", + "type": "number" } }, "required": ["width"], @@ -1740,20 +1576,20 @@ "type": "object", "properties": { "top": { - "type": "number", - "description": "Top safe area inset in pixels." + "description": "Top safe area inset in pixels.", + "type": "number" }, "right": { - "type": "number", - "description": "Right safe area inset in pixels." + "description": "Right safe area inset in pixels.", + "type": "number" }, "bottom": { - "type": "number", - "description": "Bottom safe area inset in pixels." + "description": "Bottom safe area inset in pixels.", + "type": "number" }, "left": { - "type": "number", - "description": "Left safe area inset in pixels." + "description": "Left safe area inset in pixels.", + "type": "number" } }, "required": ["top", "right", "bottom", "left"], @@ -1781,6 +1617,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -2090,96 +1927,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -2207,6 +1965,7 @@ "type": "object", "properties": { "appInfo": { + "description": "App identification (name and version).", "type": "object", "properties": { "name": { @@ -2231,10 +1990,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -2246,16 +2001,13 @@ }, "websiteUrl": { "type": "string" - }, - "description": { - "type": "string" } }, "required": ["name", "version"], - "additionalProperties": false, - "description": "App identification (name and version)." + "additionalProperties": false }, "appCapabilities": { + "description": "Features and capabilities this app provides.", "type": "object", "properties": { "experimental": { @@ -2276,12 +2028,11 @@ "additionalProperties": false } }, - "additionalProperties": false, - "description": "Features and capabilities this app provides." + "additionalProperties": false }, "protocolVersion": { - "type": "string", - "description": "Protocol version this app supports." + "description": "Protocol version this app supports.", + "type": "string" } }, "required": ["appInfo", "appCapabilities", "protocolVersion"], @@ -2296,10 +2047,11 @@ "type": "object", "properties": { "protocolVersion": { - "type": "string", - "description": "Negotiated protocol version string (e.g., \"2025-11-21\")." + "description": "Negotiated protocol version string (e.g., \"2025-11-21\").", + "type": "string" }, "hostInfo": { + "description": "Host application identification and version.", "type": "object", "properties": { "name": { @@ -2324,10 +2076,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -2339,16 +2087,13 @@ }, "websiteUrl": { "type": "string" - }, - "description": { - "type": "string" } }, "required": ["name", "version"], - "additionalProperties": false, - "description": "Host application identification and version." + "additionalProperties": false }, "hostCapabilities": { + "description": "Features and capabilities provided by the host.", "type": "object", "properties": { "experimental": { @@ -2551,10 +2296,10 @@ "additionalProperties": false } }, - "additionalProperties": false, - "description": "Features and capabilities provided by the host." + "additionalProperties": false }, "hostContext": { + "description": "Rich context about the host environment.", "type": "object", "properties": { "toolInfo": { @@ -2575,6 +2320,7 @@ ] }, "tool": { + "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -2599,10 +2345,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -2700,8 +2442,7 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false, - "description": "Tool definition including name, inputSchema, etc." + "additionalProperties": false } }, "required": ["tool"], @@ -2728,6 +2469,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -3037,96 +2779,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -3175,8 +2838,8 @@ "type": "object", "properties": { "height": { - "type": "number", - "description": "Fixed container height in pixels." + "description": "Fixed container height in pixels.", + "type": "number" } }, "required": ["height"], @@ -3205,8 +2868,8 @@ "type": "object", "properties": { "width": { - "type": "number", - "description": "Fixed container width in pixels." + "description": "Fixed container width in pixels.", + "type": "number" } }, "required": ["width"], @@ -3280,28 +2943,27 @@ "type": "object", "properties": { "top": { - "type": "number", - "description": "Top safe area inset in pixels." + "description": "Top safe area inset in pixels.", + "type": "number" }, "right": { - "type": "number", - "description": "Right safe area inset in pixels." + "description": "Right safe area inset in pixels.", + "type": "number" }, "bottom": { - "type": "number", - "description": "Bottom safe area inset in pixels." + "description": "Bottom safe area inset in pixels.", + "type": "number" }, "left": { - "type": "number", - "description": "Left safe area inset in pixels." + "description": "Left safe area inset in pixels.", + "type": "number" } }, "required": ["top", "right", "bottom", "left"], "additionalProperties": false } }, - "additionalProperties": {}, - "description": "Rich context about the host environment." + "additionalProperties": {} } }, "required": [ @@ -3341,11 +3003,12 @@ "type": "object", "properties": { "role": { + "description": "Message role, currently only \"user\" is supported.", "type": "string", - "const": "user", - "description": "Message role, currently only \"user\" is supported." + "const": "user" }, "content": { + "description": "Message content blocks (text, image, etc.).", "type": "array", "items": { "anyOf": [ @@ -3512,10 +3175,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -3659,8 +3318,7 @@ "additionalProperties": false } ] - }, - "description": "Message content blocks (text, image, etc.)." + } } }, "required": ["role", "content"], @@ -3693,8 +3351,8 @@ "type": "object", "properties": { "url": { - "type": "string", - "description": "URL to open in the host's browser" + "description": "URL to open in the host's browser", + "type": "string" } }, "required": ["url"], @@ -3727,6 +3385,7 @@ "type": "object", "properties": { "mode": { + "description": "The display mode being requested.", "anyOf": [ { "type": "string", @@ -3740,8 +3399,7 @@ "type": "string", "const": "pip" } - ], - "description": "The display mode being requested." + ] } }, "required": ["mode"], @@ -3756,6 +3414,7 @@ "type": "object", "properties": { "mode": { + "description": "The display mode that was actually set. May differ from requested if not supported.", "anyOf": [ { "type": "string", @@ -3769,8 +3428,7 @@ "type": "string", "const": "pip" } - ], - "description": "The display mode that was actually set. May differ from requested if not supported." + ] } }, "required": ["mode"], @@ -3977,8 +3635,8 @@ "type": "object", "properties": { "html": { - "type": "string", - "description": "HTML content to load into the inner iframe." + "description": "HTML content to load into the inner iframe.", + "type": "string" }, "sandbox": { "description": "Optional override for the inner iframe's sandbox attribute.", @@ -4086,6 +3744,7 @@ }, "McpUiStyleVariableKey": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "CSS variable keys available to MCP apps for theming.", "anyOf": [ { "type": "string", @@ -4395,13 +4054,14 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "CSS variable keys available to MCP apps for theming." + ] }, "McpUiStyles": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -4711,97 +4371,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] + } }, "McpUiSupportedContentBlockModalities": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -4848,6 +4428,7 @@ }, "McpUiTheme": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Color theme preference for the host environment.", "anyOf": [ { "type": "string", @@ -4857,8 +4438,7 @@ "type": "string", "const": "dark" } - ], - "description": "Color theme preference for the host environment." + ] }, "McpUiToolCancelledNotification": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -4949,6 +4529,7 @@ "description": "Who can access this tool. Default: [\"model\", \"app\"]\n- \"model\": Tool visible to and callable by the agent\n- \"app\": Tool callable by the app from this server only", "type": "array", "items": { + "description": "Tool visibility scope - who can access the tool.", "anyOf": [ { "type": "string", @@ -4958,8 +4539,7 @@ "type": "string", "const": "app" } - ], - "description": "Tool visibility scope - who can access the tool." + ] } } }, @@ -4974,23 +4554,12 @@ "const": "ui/notifications/tool-result" }, "params": { + "description": "Standard MCP tool execution result.", "type": "object", "properties": { "_meta": { "type": "object", "properties": { - "progressToken": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer", - "minimum": -9007199254740991, - "maximum": 9007199254740991 - } - ] - }, "io.modelcontextprotocol/related-task": { "type": "object", "properties": { @@ -4999,7 +4568,7 @@ } }, "required": ["taskId"], - "additionalProperties": false + "additionalProperties": {} } }, "additionalProperties": {} @@ -5172,10 +4741,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -5333,8 +4898,7 @@ } }, "required": ["content"], - "additionalProperties": {}, - "description": "Standard MCP tool execution result." + "additionalProperties": {} } }, "required": ["method", "params"], @@ -5342,6 +4906,7 @@ }, "McpUiToolVisibility": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Tool visibility scope - who can access the tool.", "anyOf": [ { "type": "string", @@ -5351,8 +4916,7 @@ "type": "string", "const": "app" } - ], - "description": "Tool visibility scope - who can access the tool." + ] }, "McpUiUpdateModelContextRequest": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -5533,10 +5097,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], diff --git a/tests/e2e/servers.spec.ts b/tests/e2e/servers.spec.ts index 7c7099c..e0391c5 100644 --- a/tests/e2e/servers.spec.ts +++ b/tests/e2e/servers.spec.ts @@ -1,8 +1,11 @@ import { test, expect, type Page, type ConsoleMessage } from "@playwright/test"; // Dynamic element selectors to mask for screenshot comparison +// // Note: CSS modules generate unique class names, so we use attribute selectors // with partial matches (e.g., [class*="heatmapWrapper"]) for those components +// +// Note: map-server uses SLOW_SERVERS timeout instead of masking to wait for tiles const DYNAMIC_MASKS: Record = { integration: ["#server-time"], // Server time display "basic-preact": ["#server-time"], // Server time display @@ -13,7 +16,7 @@ const DYNAMIC_MASKS: Record = { "basic-vue": ["#server-time"], // Server time display "cohort-heatmap": ['[class*="heatmapWrapper"]'], // Heatmap grid (random data) "customer-segmentation": [".chart-container"], // Scatter plot (random data) - // Note: map-server uses SLOW_SERVERS timeout instead of masking to wait for tiles + shadertoy: ["#canvas"], // WebGL shader canvas (animated) "system-monitor": [ ".chart-container", // CPU chart (highly dynamic) "#status-text", // Current timestamp @@ -46,6 +49,7 @@ const SERVERS = [ { key: "customer-segmentation", name: "Customer Segmentation Server" }, { key: "map-server", name: "CesiumJS Map Server" }, { key: "scenario-modeler", name: "SaaS Scenario Modeler" }, + { key: "shadertoy", name: "ShaderToy Server" }, { key: "sheet-music", name: "Sheet Music Server" }, { key: "system-monitor", name: "System Monitor Server" }, { key: "threejs", name: "Three.js Server" }, diff --git a/tests/e2e/servers.spec.ts-snapshots/shadertoy.png b/tests/e2e/servers.spec.ts-snapshots/shadertoy.png new file mode 100644 index 0000000000000000000000000000000000000000..24763b264b29e5dcd8b6e9a89a201a346d4e416b GIT binary patch literal 24301 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 Date: Thu, 8 Jan 2026 07:07:37 -0600 Subject: [PATCH 051/389] Replace deprecated `RESOURCE_URI_META_KEY` with `_meta.ui.resourceUri` Update all example servers to use the new recommended metadata format for associating UI resources with tools. The old `RESOURCE_URI_META_KEY` constant is deprecated in favor of the nested `_meta.ui.resourceUri` structure. Co-Authored-By: Claude Opus 4.5 --- examples/basic-server-react/server.ts | 8 ++++---- examples/basic-server-vanillajs/server.ts | 8 ++++---- examples/budget-allocator-server/server.ts | 3 +-- examples/cohort-heatmap-server/server.ts | 3 +-- examples/customer-segmentation-server/server.ts | 3 +-- examples/integration-server/server.ts | 13 ++++++------- examples/scenario-modeler-server/server.ts | 13 ++++++------- examples/sheet-music-server/server.ts | 3 +-- examples/system-monitor-server/server.ts | 13 ++++++------- examples/threejs-server/server.ts | 13 ++++++------- examples/video-resource-server/server.ts | 17 ++++++++--------- examples/wiki-explorer-server/server.ts | 13 ++++++------- 12 files changed, 50 insertions(+), 60 deletions(-) diff --git a/examples/basic-server-react/server.ts b/examples/basic-server-react/server.ts index d63880c..76d332a 100644 --- a/examples/basic-server-react/server.ts +++ b/examples/basic-server-react/server.ts @@ -1,9 +1,9 @@ +import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -21,15 +21,15 @@ export function createServer(): McpServer { const resourceUri = "ui://get-time/mcp-app.html"; // Register a tool with UI metadata. When the host calls this tool, it reads - // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render - // as an interactive UI. + // `_meta.ui.resourceUri` to know which resource to fetch and render as an + // interactive UI. registerAppTool(server, "get-time", { title: "Get Time", description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const time = new Date().toISOString(); diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index 8d50d3e..c95b3ca 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -1,10 +1,10 @@ +import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -22,8 +22,8 @@ export function createServer(): McpServer { const resourceUri = "ui://get-time/mcp-app.html"; // Register a tool with UI metadata. When the host calls this tool, it reads - // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render - // as an interactive UI. + // `_meta.ui.resourceUri` to know which resource to fetch and render as an + // interactive UI. registerAppTool(server, "get-time", { @@ -33,7 +33,7 @@ export function createServer(): McpServer { outputSchema: z.object({ time: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const time = new Date().toISOString(); diff --git a/examples/budget-allocator-server/server.ts b/examples/budget-allocator-server/server.ts index a902eea..abc4a9b 100755 --- a/examples/budget-allocator-server/server.ts +++ b/examples/budget-allocator-server/server.ts @@ -15,7 +15,6 @@ import path from "node:path"; import { z } from "zod"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -273,7 +272,7 @@ export function createServer(): McpServer { "Returns budget configuration with 24 months of historical allocations and industry benchmarks by company stage", inputSchema: {}, outputSchema: BudgetDataResponseSchema, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const response: BudgetDataResponse = { diff --git a/examples/cohort-heatmap-server/server.ts b/examples/cohort-heatmap-server/server.ts index 6a902d6..7c79f91 100644 --- a/examples/cohort-heatmap-server/server.ts +++ b/examples/cohort-heatmap-server/server.ts @@ -6,7 +6,6 @@ import path from "node:path"; import { z } from "zod"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -181,7 +180,7 @@ export function createServer(): McpServer { "Returns cohort retention heatmap data showing customer retention over time by signup month", inputSchema: GetCohortDataInputSchema.shape, outputSchema: CohortDataSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ metric, periodType, cohortCount, maxPeriods }) => { const data = generateCohortData( diff --git a/examples/customer-segmentation-server/server.ts b/examples/customer-segmentation-server/server.ts index 527855a..28e43e7 100644 --- a/examples/customer-segmentation-server/server.ts +++ b/examples/customer-segmentation-server/server.ts @@ -9,7 +9,6 @@ import path from "node:path"; import { z } from "zod"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -102,7 +101,7 @@ export function createServer(): McpServer { "Returns customer data with segment information for visualization. Optionally filter by segment.", inputSchema: GetCustomerDataInputSchema.shape, outputSchema: GetCustomerDataOutputSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ segment }): Promise => { const data = getCustomerData(segment); diff --git a/examples/integration-server/server.ts b/examples/integration-server/server.ts index 700f1eb..f017e4d 100644 --- a/examples/integration-server/server.ts +++ b/examples/integration-server/server.ts @@ -1,3 +1,8 @@ +import { + registerAppResource, + registerAppTool, + RESOURCE_MIME_TYPE, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -7,12 +12,6 @@ import type { import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - registerAppTool, - registerAppResource, - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -37,7 +36,7 @@ export function createServer(): McpServer { outputSchema: z.object({ time: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + _meta: { ui: { resourceUri: RESOURCE_URI } }, }, async (): Promise => { const time = new Date().toISOString(); diff --git a/examples/scenario-modeler-server/server.ts b/examples/scenario-modeler-server/server.ts index 6abb352..86657f4 100644 --- a/examples/scenario-modeler-server/server.ts +++ b/examples/scenario-modeler-server/server.ts @@ -1,3 +1,8 @@ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -7,12 +12,6 @@ import type { import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -308,7 +307,7 @@ export function createServer(): McpServer { "Returns SaaS scenario templates and optionally computes custom projections for given inputs", inputSchema: GetScenarioDataInputSchema.shape, outputSchema: GetScenarioDataOutputSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (args: { customInputs?: ScenarioInputs; diff --git a/examples/sheet-music-server/server.ts b/examples/sheet-music-server/server.ts index 88337d3..cec1c3d 100644 --- a/examples/sheet-music-server/server.ts +++ b/examples/sheet-music-server/server.ts @@ -9,7 +9,6 @@ import { z } from "zod"; import ABCJS from "abcjs"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -59,7 +58,7 @@ function createServer(): McpServer { "ABC notation string to render as sheet music with audio playback", ), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ abcNotation }): Promise => { // Validate ABC notation using abcjs parser diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 8ac7f7b..9283e21 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -1,3 +1,8 @@ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -9,12 +14,6 @@ import os from "node:os"; import path from "node:path"; import si from "systeminformation"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; // Schemas - types are derived from these using z.infer @@ -149,7 +148,7 @@ export function createServer(): McpServer { "Returns current system statistics including per-core CPU usage, memory, and system info.", inputSchema: {}, outputSchema: SystemStatsSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const stats = await getStats(); diff --git a/examples/threejs-server/server.ts b/examples/threejs-server/server.ts index 8181bad..d359968 100644 --- a/examples/threejs-server/server.ts +++ b/examples/threejs-server/server.ts @@ -3,18 +3,17 @@ * * Provides tools for rendering interactive 3D scenes using Three.js. */ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -170,7 +169,7 @@ export function createServer(): McpServer { code: z.string(), height: z.number(), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ code, height }) => { const data = { code, height }; diff --git a/examples/video-resource-server/server.ts b/examples/video-resource-server/server.ts index 0d3a33c..cd997da 100644 --- a/examples/video-resource-server/server.ts +++ b/examples/video-resource-server/server.ts @@ -4,24 +4,23 @@ * Demonstrates serving binary content (video) via MCP resources. * The server fetches videos from CDN and serves them as base64 blobs. */ +import { + registerAppResource, + registerAppTool, + RESOURCE_MIME_TYPE, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer, ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, } from "@modelcontextprotocol/sdk/types.js"; -import { z } from "zod"; import fs from "node:fs/promises"; import path from "node:path"; -import { - registerAppTool, - registerAppResource, - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, -} from "@modelcontextprotocol/ext-apps/server"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { z } from "zod"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -133,7 +132,7 @@ ${Object.entries(VIDEO_LIBRARY) videoUri: z.string(), description: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + _meta: { ui: { resourceUri: RESOURCE_URI } }, }, async ({ videoId }): Promise => { const video = VIDEO_LIBRARY[videoId]; diff --git a/examples/wiki-explorer-server/server.ts b/examples/wiki-explorer-server/server.ts index 69002c1..8c33150 100644 --- a/examples/wiki-explorer-server/server.ts +++ b/examples/wiki-explorer-server/server.ts @@ -1,3 +1,8 @@ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -8,12 +13,6 @@ import * as cheerio from "cheerio"; import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -108,7 +107,7 @@ export function createServer(): McpServer { ), error: z.string().nullable(), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ url }): Promise => { let title = url; From 741b1d3925da1bb5af5eb87174cab8d0f91a6203 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Mon, 12 Jan 2026 19:42:11 +0000 Subject: [PATCH 052/389] feat(basic-host): improve host UI with collapsible panels and SDK types (#244) * refactor(basic-host): use SDK types for ModelContext and AppMessage - Import McpUiUpdateModelContextRequest and McpUiMessageRequest from SDK - Replace custom ModelContext with McpUiUpdateModelContextRequest['params'] - Replace custom AppMessage with McpUiMessageRequest['params'] - Pass full message params instead of extracting text - Format messages by extracting text from content blocks in display * feat(basic-host): handle non-text content blocks in display - Add formatContentBlock helper for text, image, audio, resource types - Show placeholders like for non-text content - Apply to both messages and model context display * test: update shadertoy screenshot * test: update screenshots from CI (linux x64) --- examples/basic-host/src/implementation.ts | 35 +++- examples/basic-host/src/index.module.css | 100 +++++++++++ examples/basic-host/src/index.tsx | 158 +++++++++++++++--- examples/basic-host/src/sandbox.ts | 21 +-- src/app-bridge.ts | 31 ++++ .../basic-preact.png | Bin 48110 -> 55054 bytes .../servers.spec.ts-snapshots/basic-react.png | Bin 46545 -> 55588 bytes .../servers.spec.ts-snapshots/basic-solid.png | Bin 47934 -> 55492 bytes .../basic-svelte.png | Bin 48075 -> 55065 bytes .../basic-vanillajs.png | Bin 47385 -> 56188 bytes .../servers.spec.ts-snapshots/basic-vue.png | Bin 47389 -> 54847 bytes .../cohort-heatmap.png | Bin 39849 -> 34081 bytes .../customer-segmentation.png | Bin 39306 -> 38161 bytes .../servers.spec.ts-snapshots/integration.png | Bin 45119 -> 53319 bytes .../servers.spec.ts-snapshots/map-server.png | Bin 395717 -> 667887 bytes .../servers.spec.ts-snapshots/shadertoy.png | Bin 24301 -> 23413 bytes .../servers.spec.ts-snapshots/sheet-music.png | Bin 49098 -> 66915 bytes .../system-monitor.png | Bin 37642 -> 41050 bytes .../e2e/servers.spec.ts-snapshots/threejs.png | Bin 37725 -> 32501 bytes .../wiki-explorer.png | Bin 25253 -> 21685 bytes 20 files changed, 302 insertions(+), 43 deletions(-) diff --git a/examples/basic-host/src/implementation.ts b/examples/basic-host/src/implementation.ts index ace3143..faa5bf9 100644 --- a/examples/basic-host/src/implementation.ts +++ b/examples/basic-host/src/implementation.ts @@ -1,4 +1,4 @@ -import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp, type McpUiResourcePermissions } from "@modelcontextprotocol/ext-apps/app-bridge"; +import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp, type McpUiResourcePermissions, buildAllowAttribute, type McpUiUpdateModelContextRequest, type McpUiMessageRequest } from "@modelcontextprotocol/ext-apps/app-bridge"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"; @@ -122,12 +122,19 @@ async function getUiResource(serverInfo: ServerInfo, uri: string): Promise { // Prevent reload if (iframe.src) return Promise.resolve(false); iframe.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms"); + // Set Permission Policy allow attribute based on requested permissions + const allowAttribute = buildAllowAttribute(permissions); + if (allowAttribute) { + iframe.setAttribute("allow", allowAttribute); + } + const readyNotification: McpUiSandboxProxyReadyNotification["method"] = "ui/notifications/sandbox-proxy-ready"; @@ -215,12 +222,26 @@ function hookInitializedCallback(appBridge: AppBridge): Promise { } -export function newAppBridge(serverInfo: ServerInfo, iframe: HTMLIFrameElement): AppBridge { +export type ModelContext = McpUiUpdateModelContextRequest["params"]; +export type AppMessage = McpUiMessageRequest["params"]; + +export interface AppBridgeCallbacks { + onContextUpdate?: (context: ModelContext | null) => void; + onMessage?: (message: AppMessage) => void; +} + +export function newAppBridge( + serverInfo: ServerInfo, + iframe: HTMLIFrameElement, + callbacks?: AppBridgeCallbacks, +): AppBridge { const serverCapabilities = serverInfo.client.getServerCapabilities(); const appBridge = new AppBridge(serverInfo.client, IMPLEMENTATION, { openLinks: {}, serverTools: serverCapabilities?.tools, serverResources: serverCapabilities?.resources, + // Declare support for model context updates + updateModelContext: { text: {} }, }); // Register all handlers before calling connect(). The Guest UI can start @@ -229,6 +250,7 @@ export function newAppBridge(serverInfo: ServerInfo, iframe: HTMLIFrameElement): appBridge.onmessage = async (params, _extra) => { log.info("Message from MCP App:", params); + callbacks?.onMessage?.(params); return {}; }; @@ -242,6 +264,15 @@ export function newAppBridge(serverInfo: ServerInfo, iframe: HTMLIFrameElement): log.info("Log message from MCP App:", params); }; + appBridge.onupdatemodelcontext = async (params) => { + log.info("Model context update from MCP App:", params); + // Normalize: empty content array means clear context + const hasContent = params.content && params.content.length > 0; + const hasStructured = params.structuredContent && Object.keys(params.structuredContent).length > 0; + callbacks?.onContextUpdate?.(hasContent || hasStructured ? params : null); + return {}; + }; + appBridge.onsizechange = async ({ width, height }) => { // The MCP App has requested a `width` and `height`, but if // `box-sizing: border-box` is applied to the outer iframe element, then we diff --git a/examples/basic-host/src/index.module.css b/examples/basic-host/src/index.module.css index 0c4a8b0..e319e35 100644 --- a/examples/basic-host/src/index.module.css +++ b/examples/basic-host/src/index.module.css @@ -126,6 +126,46 @@ min-width: 0; } +.appOutputPanel { + flex: 1; + min-width: 0; +} + +.appHeader { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 0.5rem; + font-size: 1.25rem; + font-weight: 600; + position: relative; + + .toolName { + font-family: monospace; + } + + .closeButton { + position: absolute; + top: 0; + right: 0; + width: 1.5rem; + height: 1.5rem; + padding: 0; + border: none; + border-radius: 4px; + background: #e0e0e0; + font-size: 1.25rem; + line-height: 1; + color: #666; + cursor: pointer; + + &:hover { + background: #d0d0d0; + color: #333; + } + } +} + .jsonBlock { flex-grow: 1; min-height: 0; @@ -148,6 +188,66 @@ } } +.collapsiblePanel { + margin: 0.5rem 0; + padding: 0.5rem 0.75rem; + border: 1px solid #e0e0e0; + border-radius: 4px; + background-color: #fafafa; + font-size: 0.875rem; + cursor: pointer; + transition: background-color 0.15s; + + &:hover { + background-color: #f0f0f0; + } +} + +.collapsibleHeader { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.collapsibleLabel { + font-weight: 600; + color: #555; +} + +.collapsibleSize { + color: #888; + font-size: 0.75rem; +} + +.collapsibleToggle { + margin-left: auto; + color: #888; + font-size: 0.75rem; +} + +.collapsiblePreview { + margin-top: 0.25rem; + color: #666; + font-family: monospace; + font-size: 0.8rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.collapsibleFull { + margin: 0.5rem 0 0; + padding: 0.5rem; + border-radius: 4px; + background-color: #f5f5f5; + font-family: monospace; + font-size: 0.8rem; + white-space: pre-wrap; + word-break: break-word; + max-height: 200px; + overflow: auto; +} + .error { padding: 1.5rem; background-color: #ddd; diff --git a/examples/basic-host/src/index.tsx b/examples/basic-host/src/index.tsx index 1e1313d..d3331fe 100644 --- a/examples/basic-host/src/index.tsx +++ b/examples/basic-host/src/index.tsx @@ -1,7 +1,7 @@ import type { Tool } from "@modelcontextprotocol/sdk/types.js"; import { Component, type ErrorInfo, type ReactNode, StrictMode, Suspense, use, useEffect, useMemo, useRef, useState } from "react"; import { createRoot } from "react-dom/client"; -import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy, log, newAppBridge, type ServerInfo, type ToolCallInfo } from "./implementation"; +import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy, log, newAppBridge, type ServerInfo, type ToolCallInfo, type ModelContext, type AppMessage } from "./implementation"; import styles from "./index.module.css"; @@ -207,23 +207,41 @@ function ToolCallInfoPanel({ toolCallInfo, isDestroying, onRequestClose, onClose className={styles.toolCallInfoPanel} style={isDestroying ? { opacity: 0.5, pointerEvents: "none" } : undefined} > -
-

- {toolCallInfo.serverInfo.name} - {toolCallInfo.tool.name} - {onRequestClose && !isDestroying && ( - - )} -

- -
-
+ {/* For non-app tools, show input/output side by side */} + {!isApp && ( +
+

+ {toolCallInfo.serverInfo.name} + {toolCallInfo.tool.name} + {onRequestClose && !isDestroying && ( + + )} +

+ +
+ )} +
+ {/* For apps, show header above the app: ServerName:tool_name */} + {isApp && ( +
+ {toolCallInfo.serverInfo.name}:{toolCallInfo.tool.name} + {onRequestClose && !isDestroying && ( + + )} +
+ )} { @@ -252,6 +270,43 @@ function JsonBlock({ value }: { value: object }) { } +interface CollapsiblePanelProps { + icon: string; + label: string; + content: string; + badge?: string; + defaultExpanded?: boolean; +} +function CollapsiblePanel({ icon, label, content, badge, defaultExpanded = false }: CollapsiblePanelProps) { + const [expanded, setExpanded] = useState(defaultExpanded); + + return ( +
setExpanded(!expanded)} + title={expanded ? "Click to collapse" : "Click to expand"} + > +
+ {icon} {label} + + {badge ?? `${content.length} chars`} + + + {expanded ? "โ–ผ" : "โ–ถ"} + +
+ {expanded ? ( +
{content}
+ ) : ( +
+ {content.slice(0, 100)}{content.length > 100 ? "โ€ฆ" : ""} +
+ )} +
+ ); +} + + interface AppIFramePanelProps { toolCallInfo: Required; isDestroying?: boolean; @@ -260,25 +315,34 @@ interface AppIFramePanelProps { function AppIFramePanel({ toolCallInfo, isDestroying, onTeardownComplete }: AppIFramePanelProps) { const iframeRef = useRef(null); const appBridgeRef = useRef | null>(null); + const [modelContext, setModelContext] = useState(null); + const [toolResult, setToolResult] = useState(null); + const [messages, setMessages] = useState([]); useEffect(() => { const iframe = iframeRef.current!; - // First get CSP from resource, then load sandbox with CSP in query param - // This ensures CSP is set via HTTP headers (tamper-proof) - toolCallInfo.appResourcePromise.then(({ csp }) => { - loadSandboxProxy(iframe, csp).then((firstTime) => { + // First get CSP and permissions from resource, then load sandbox + // CSP is set via HTTP headers (tamper-proof), permissions via iframe allow attribute + toolCallInfo.appResourcePromise.then(({ csp, permissions }) => { + loadSandboxProxy(iframe, csp, permissions).then((firstTime) => { // The `firstTime` check guards against React Strict Mode's double // invocation (mount โ†’ unmount โ†’ remount simulation in development). // Outside of Strict Mode, this `useEffect` runs only once per // `toolCallInfo`. if (firstTime) { - const appBridge = newAppBridge(toolCallInfo.serverInfo, iframe); + const appBridge = newAppBridge(toolCallInfo.serverInfo, iframe, { + onContextUpdate: setModelContext, + onMessage: (msg) => setMessages((prev) => [...prev, msg]), + }); appBridgeRef.current = appBridge; initializeApp(iframe, appBridge, toolCallInfo); } }); }); + + // Track tool result for display + toolCallInfo.resultPromise.then(setToolResult).catch(() => {}); }, [toolCallInfo]); // Graceful teardown: wait for guest to respond before unmounting @@ -303,9 +367,57 @@ function AppIFramePanel({ toolCallInfo, isDestroying, onTeardownComplete }: AppI }); }, [isDestroying, onTeardownComplete]); + // Format content blocks - handle text, images, resources, etc. + const formatContentBlock = (c: { type: string; [key: string]: unknown }) => { + switch (c.type) { + case "text": + return (c as { type: "text"; text: string }).text; + case "image": + return ``; + case "audio": + return ``; + case "resource": + return ``; + default: + return `<${c.type}>`; + } + }; + + // Format context for display + const contextText = modelContext?.content?.map(formatContentBlock).join("\n") ?? ""; + const contextJson = modelContext?.structuredContent + ? JSON.stringify(modelContext.structuredContent, null, 2) + : ""; + const fullContext = [contextText, contextJson].filter(Boolean).join("\n\n"); + + const inputJson = JSON.stringify(toolCallInfo.input, null, 2); + const resultJson = toolResult ? JSON.stringify(toolResult, null, 2) : null; + + // Format messages + const formatMessage = (m: AppMessage) => { + const content = m.content.map(formatContentBlock).join("\n"); + return `[${m.role}] ${content}`; + }; + const messagesText = messages.map(formatMessage).join("\n\n"); + return (
+