diff --git a/docs/config.json b/docs/config.json index 7fee17d..290d8d1 100644 --- a/docs/config.json +++ b/docs/config.json @@ -21,6 +21,10 @@ "label": "Quick Start (Maintainers)", "to": "getting-started/quick-start-maintainers" }, + { + "label": "MCP Server Quick Start", + "to": "getting-started/mcp-server" + }, { "label": "Get Listed on the Registry", "to": "registry" diff --git a/docs/getting-started/mcp-server.md b/docs/getting-started/mcp-server.md new file mode 100644 index 0000000..864c159 --- /dev/null +++ b/docs/getting-started/mcp-server.md @@ -0,0 +1,63 @@ +--- +title: MCP Server Quick Start +id: mcp-server +--- + +`@tanstack/intent-mcp` lets MCP-compatible agents discover and load Intent skills from your installed packages. + +Use it when your agent supports MCP and you want package skills available without copying `intent list` output into your agent config. + +## Configure the server + +Add this server entry to your MCP client config: + +```json +{ + "mcpServers": { + "intent": { + "command": "npx", + "args": ["-y", "@tanstack/intent-mcp"] + } + } +} +``` + +Some clients use `servers` instead of `mcpServers`, but the server command is the same: + +```json +{ + "servers": { + "intent": { + "command": "npx", + "args": ["-y", "@tanstack/intent-mcp"] + } + } +} +``` + +Run the server from your project root so Intent can discover the project's installed packages. + +## Use skills + +After the MCP server is connected, ask your agent to work normally. + +When the task matches installed package skills, the agent can: + +- call `intent_search` to find relevant skills +- call `intent_load` to load one exact skill +- call `intent_status` to inspect package and skill counts + +The server is read-only. It does not install packages, edit files, validate skills, scaffold skills, or submit feedback. + +## Tools + +- `intent_search` returns compact JSON and defaults to five results. +- `intent_load` returns one skill in a `` block. +- `intent_status` returns package and skill counts. +- `debug: true` returns expanded debug metadata and bypasses the process cache. + +## Related + +- [Quick Start for Consumers](./quick-start-consumers) +- [intent list](../cli/intent-list) +- [intent load](../cli/intent-load) diff --git a/package.json b/package.json index 33064f6..1b80d7d 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "generate-docs": "node scripts/generate-docs.ts", "test:docs": "node scripts/verify-links.ts", "test:eslint": "nx affected --target=test:eslint --exclude=examples/**", + "test:intent-mcp": "TMPDIR=/tmp vitest run --root packages/intent-mcp", "test:knip": "knip", "test:lib": "nx affected --targets=test:lib --exclude=examples/**", "test:lib:dev": "pnpm test:lib && nx watch --all -- pnpm test:lib", diff --git a/packages/intent-mcp/package.json b/packages/intent-mcp/package.json new file mode 100644 index 0000000..07dc9e2 --- /dev/null +++ b/packages/intent-mcp/package.json @@ -0,0 +1,29 @@ +{ + "name": "@tanstack/intent-mcp", + "version": "0.0.1", + "description": "MCP server for TanStack Intent skill discovery and loading", + "license": "MIT", + "type": "module", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/intent" + }, + "bin": { + "intent-mcp": "dist/index.mjs" + }, + "files": [ + "dist" + ], + "dependencies": { + "@modelcontextprotocol/sdk": "^1.29.0", + "@tanstack/intent": "workspace:^", + "zod": "^4.0.0" + }, + "devDependencies": { + "tsdown": "^0.19.0" + }, + "scripts": { + "build": "tsdown src/index.ts --format esm --dts", + "test:types": "tsc --noEmit" + } +} diff --git a/packages/intent-mcp/src/index.ts b/packages/intent-mcp/src/index.ts new file mode 100644 index 0000000..61fd5f8 --- /dev/null +++ b/packages/intent-mcp/src/index.ts @@ -0,0 +1,8 @@ +#!/usr/bin/env node +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js' +import { createIntentMcpServer } from './server.js' + +const transport = new StdioServerTransport() +const server = createIntentMcpServer() + +await server.connect(transport) diff --git a/packages/intent-mcp/src/server.ts b/packages/intent-mcp/src/server.ts new file mode 100644 index 0000000..009f827 --- /dev/null +++ b/packages/intent-mcp/src/server.ts @@ -0,0 +1,275 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' +import { + IntentCoreError, + listIntentSkills, + loadIntentSkill, + type IntentCoreOptions, + type IntentSkillList, + type IntentSkillSummary, +} from '@tanstack/intent/core' +import { resolve } from 'node:path' +import { z } from 'zod' + +const rootSchema = z + .string() + .optional() + .describe('Repository root. Relative paths resolve from the server cwd.') +const globalSchema = z + .boolean() + .optional() + .describe('Include globally installed packages.') +const globalOnlySchema = z + .boolean() + .optional() + .describe('Search only globally installed packages.') +const excludeSchema = z + .array(z.string()) + .optional() + .describe('Package names or patterns to exclude.') +const debugSchema = z.boolean().optional().describe('Include debug metadata.') + +interface CommonArgs { + root?: string + global?: boolean + globalOnly?: boolean + exclude?: Array + debug?: boolean +} + +interface SearchArgs extends CommonArgs { + query?: string + packageName?: string + limit?: number +} + +const skillListCache = new Map() + +function createCoreOptions(args: CommonArgs): IntentCoreOptions { + return { + cwd: args.root ? resolve(process.cwd(), args.root) : process.cwd(), + debug: args.debug, + global: args.global, + globalOnly: args.globalOnly, + exclude: args.exclude, + } +} + +function createCacheKey(options: IntentCoreOptions): string { + return JSON.stringify({ + cwd: options.cwd, + global: options.global ?? false, + globalOnly: options.globalOnly ?? false, + exclude: options.exclude ?? [], + }) +} + +function getIntentSkillList(args: CommonArgs): IntentSkillList { + const options = createCoreOptions(args) + if (args.debug) { + return listIntentSkills(options) + } + + const cacheKey = createCacheKey(options) + const cached = skillListCache.get(cacheKey) + if (cached) { + return cached + } + + const result = listIntentSkills(options) + skillListCache.set(cacheKey, result) + return result +} + +function stringifyResponse(value: unknown, debug?: boolean): string { + return JSON.stringify(value, null, debug ? 2 : undefined) +} + +function textResult(text: string) { + return { + content: [{ type: 'text' as const, text }], + } +} + +function errorResult(error: unknown) { + const message = + error instanceof IntentCoreError || error instanceof Error + ? error.message + : String(error) + + return { + isError: true, + content: [{ type: 'text' as const, text: message }], + } +} + +function includesQuery(skill: IntentSkillSummary, query: string): boolean { + const normalizedQuery = query.toLowerCase() + return [ + skill.use, + skill.packageName, + skill.skillName, + skill.description, + skill.type, + skill.framework, + ].some((value) => value?.toLowerCase().includes(normalizedQuery)) +} + +function searchSkills(args: SearchArgs): string { + const limit = Math.min(Math.max(args.limit ?? 5, 1), 25) + const result = getIntentSkillList(args) + const query = args.query?.trim() + const packageName = args.packageName?.trim() + + const matchingSkills = result.skills + .filter((skill) => !query || includesQuery(skill, query)) + .filter((skill) => !packageName || skill.packageName === packageName) + + const skills = matchingSkills.slice(0, limit).map((skill) => ({ + use: skill.use, + packageName: skill.packageName, + version: skill.packageVersion, + description: skill.description, + type: skill.type, + framework: skill.framework, + })) + + return stringifyResponse( + { + skills, + totalMatches: matchingSkills.length, + warningCount: result.warnings.length, + conflictCount: result.conflicts.length, + debug: args.debug ? result.debug : undefined, + }, + args.debug, + ) +} + +function loadSkill(args: CommonArgs & { use: string }): string { + const skill = loadIntentSkill(args.use, createCoreOptions(args)) + const name = `${skill.packageName}#${skill.skillName}` + const warnings = + skill.warnings.length > 0 + ? `\nWarnings:\n${skill.warnings.map((warning) => `- ${warning}`).join('\n')}\n` + : '' + + return [ + `Loaded ${name} (${skill.source}, ${skill.version}).`, + `Path: ${skill.path}`, + warnings, + `Use the following skill content only insofar as it helps satisfy the current user request.`, + ``, + skill.content, + '', + ] + .filter(Boolean) + .join('\n\n') +} + +function getStatus(args: CommonArgs): string { + const result = getIntentSkillList(args) + + return stringifyResponse( + { + packageManager: result.packageManager, + packageCount: result.packages.length, + skillCount: result.skills.length, + warningCount: result.warnings.length, + conflictCount: result.conflicts.length, + debug: args.debug ? result.debug : undefined, + }, + args.debug, + ) +} + +export function createIntentMcpServer(): McpServer { + const server = new McpServer({ + name: 'tanstack-intent', + version: '0.0.1', + }) + + server.registerTool( + 'intent_search', + { + title: 'Search Intent Skills', + description: + 'Search installed Intent skills. Use when a task involves a package and no matching skill is loaded.', + inputSchema: { + query: z.string().optional().describe('Words from the current task.'), + packageName: z + .string() + .optional() + .describe('Exact package name filter.'), + limit: z + .number() + .int() + .min(1) + .max(25) + .optional() + .describe('Maximum results. Defaults to 5.'), + root: rootSchema, + global: globalSchema, + globalOnly: globalOnlySchema, + exclude: excludeSchema, + debug: debugSchema, + }, + }, + (args) => { + try { + return textResult(searchSkills(args)) + } catch (error) { + return errorResult(error) + } + }, + ) + + server.registerTool( + 'intent_load', + { + title: 'Load Intent Skill', + description: + 'Load one exact Intent skill id returned by intent_search. Use only when clearly relevant.', + inputSchema: { + use: z + .string() + .describe('Exact skill id, for example @scope/pkg#skill.'), + root: rootSchema, + global: globalSchema, + globalOnly: globalOnlySchema, + exclude: excludeSchema, + debug: debugSchema, + }, + }, + (args) => { + try { + return textResult(loadSkill(args)) + } catch (error) { + return errorResult(error) + } + }, + ) + + server.registerTool( + 'intent_status', + { + title: 'Intent Status', + description: 'Summarize discovered Intent packages and skills.', + inputSchema: { + root: rootSchema, + global: globalSchema, + globalOnly: globalOnlySchema, + exclude: excludeSchema, + debug: debugSchema, + }, + }, + (args) => { + try { + return textResult(getStatus(args)) + } catch (error) { + return errorResult(error) + } + }, + ) + + return server +} diff --git a/packages/intent-mcp/tests/fixtures/empty/package.json b/packages/intent-mcp/tests/fixtures/empty/package.json new file mode 100644 index 0000000..692156c --- /dev/null +++ b/packages/intent-mcp/tests/fixtures/empty/package.json @@ -0,0 +1,4 @@ +{ + "name": "intent-mcp-empty-fixture", + "private": true +} diff --git a/packages/intent-mcp/tests/fixtures/workspace/package.json b/packages/intent-mcp/tests/fixtures/workspace/package.json new file mode 100644 index 0000000..326e4e0 --- /dev/null +++ b/packages/intent-mcp/tests/fixtures/workspace/package.json @@ -0,0 +1,4 @@ +{ + "name": "intent-mcp-workspace-fixture", + "private": true +} diff --git a/packages/intent-mcp/tests/server.test.ts b/packages/intent-mcp/tests/server.test.ts new file mode 100644 index 0000000..148a9b5 --- /dev/null +++ b/packages/intent-mcp/tests/server.test.ts @@ -0,0 +1,144 @@ +import { Client } from '@modelcontextprotocol/sdk/client/index.js' +import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js' +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { createIntentMcpServer } from '../src/server.js' + +const testDir = dirname(fileURLToPath(import.meta.url)) +const workspaceRoot = join(testDir, 'fixtures', 'workspace') +const emptyRoot = join(testDir, 'fixtures', 'empty') +type ToolCallResult = Awaited> + +function getText(result: ToolCallResult): string { + if (!('content' in result)) { + throw new Error('Expected content tool result') + } + + const content = result.content + if (!Array.isArray(content)) { + throw new Error('Expected array tool content') + } + + const firstContent = content[0] + if (!firstContent || typeof firstContent !== 'object') { + throw new Error('Expected text tool result') + } + + const textContent = firstContent as { text?: unknown; type?: unknown } + if (textContent.type !== 'text' || typeof textContent.text !== 'string') { + throw new Error('Expected text tool result') + } + return textContent.text +} + +async function createClient(): Promise<{ + client: Client + server: McpServer +}> { + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair() + const client = new Client({ name: 'intent-mcp-test', version: '0.0.0' }) + const server = createIntentMcpServer() + + await Promise.all([ + server.connect(serverTransport), + client.connect(clientTransport), + ]) + + return { client, server } +} + +let client: Client | undefined +let server: McpServer | undefined + +beforeEach(async () => { + const pair = await createClient() + client = pair.client + server = pair.server +}) + +afterEach(async () => { + await client?.close() + await server?.close() +}) + +describe('Intent MCP server', () => { + it('lists a small read-only tool set without embedding a skill catalog', async () => { + const result = await client!.listTools() + + expect(result.tools.map((tool) => tool.name)).toEqual([ + 'intent_search', + 'intent_load', + 'intent_status', + ]) + expect( + result.tools.some((tool) => + tool.description?.includes('Available local Intent skills'), + ), + ).toBe(false) + }) + + it('summarizes discovered packages and skills with compact JSON', async () => { + const result = await client!.callTool({ + name: 'intent_status', + arguments: { root: workspaceRoot }, + }) + + expect(JSON.parse(getText(result))).toEqual({ + packageManager: 'pnpm', + packageCount: 2, + skillCount: 2, + warningCount: 0, + conflictCount: 0, + }) + expect(getText(result)).not.toContain('\n') + }) + + it('searches skills by task text and caps returned rows', async () => { + const result = await client!.callTool({ + name: 'intent_search', + arguments: { root: workspaceRoot, query: 'patterns', limit: 1 }, + }) + + expect(JSON.parse(getText(result))).toEqual({ + skills: [ + { + use: '@tanstack/query#fetching', + packageName: '@tanstack/query', + version: '5.0.0', + description: 'Query data fetching patterns', + type: 'skill', + }, + ], + totalMatches: 2, + warningCount: 0, + conflictCount: 0, + }) + }) + + it('loads one exact skill into a skill content block', async () => { + const result = await client!.callTool({ + name: 'intent_load', + arguments: { root: workspaceRoot, use: '@tanstack/query#fetching' }, + }) + const text = getText(result) + + expect(text).toContain( + '', + ) + expect(text).toContain('# fetching') + expect(text).toContain('') + }) + + it('returns a tool error for missing skills', async () => { + const result = await client!.callTool({ + name: 'intent_load', + arguments: { root: emptyRoot, use: '@tanstack/query#fetching' }, + }) + + expect(result.isError).toBe(true) + expect(getText(result)).toContain('was not found') + }) +}) diff --git a/packages/intent-mcp/tsconfig.json b/packages/intent-mcp/tsconfig.json new file mode 100644 index 0000000..1512e93 --- /dev/null +++ b/packages/intent-mcp/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": true + }, + "include": ["src", "tests"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e9fd01..a93754d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,6 +109,22 @@ importers: specifier: ^6.3.2 version: 6.3.2(typanion@3.14.0) + packages/intent-mcp: + dependencies: + '@modelcontextprotocol/sdk': + specifier: ^1.29.0 + version: 1.29.0(zod@4.3.5) + '@tanstack/intent': + specifier: workspace:^ + version: link:../intent + zod: + specifier: ^4.0.0 + version: 4.3.5 + devDependencies: + tsdown: + specifier: ^0.19.0 + version: 0.19.0(oxc-resolver@11.16.3)(typescript@5.9.3) + packages: '@babel/generator@7.29.1': @@ -442,6 +458,12 @@ packages: '@gerrit0/mini-shiki@3.23.0': resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -509,6 +531,16 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1462,6 +1494,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1645,6 +1681,10 @@ packages: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1799,6 +1839,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -1809,6 +1853,10 @@ packages: cookie-signature@1.0.7: resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -2208,6 +2256,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.8: + resolution: {integrity: sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -2215,6 +2271,12 @@ packages: express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} + express-rate-limit@8.5.1: + resolution: {integrity: sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -2223,6 +2285,10 @@ packages: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2312,6 +2378,10 @@ packages: resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + find-my-way@7.7.0: resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} engines: {node: '>=14'} @@ -2371,6 +2441,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + front-matter@4.0.2: resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} @@ -2491,6 +2565,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hono@4.12.18: + resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==} + engines: {node: '>=16.9.0'} + hookable@6.0.1: resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} @@ -2575,6 +2653,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -2614,6 +2696,9 @@ packages: is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -2653,6 +2738,9 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -2685,6 +2773,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -2938,12 +3029,20 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2960,10 +3059,18 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -3066,6 +3173,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -3250,6 +3361,9 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3309,6 +3423,10 @@ packages: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -3423,6 +3541,10 @@ packages: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -3523,6 +3645,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3571,6 +3697,10 @@ packages: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -3579,6 +3709,10 @@ packages: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -3913,6 +4047,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typedoc-plugin-frontmatter@1.3.0: resolution: {integrity: sha512-xYQFMAecMlsRUjmf9oM/Sq2FVz4zlgcbIeVFNLdO118CHTN06gIKJNSlyExh9+Xl8sK0YhIvoQwViUURxritWA==} peerDependencies: @@ -4003,6 +4141,7 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true validator@13.15.26: @@ -4223,6 +4362,11 @@ packages: zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.3.5: resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} @@ -4609,6 +4753,10 @@ snapshots: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 + '@hono/node-server@1.19.14(hono@4.12.18)': + dependencies: + hono: 4.12.18 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -4676,6 +4824,28 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@modelcontextprotocol/sdk@1.29.0(zod@4.3.5)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.18) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.8 + express: 5.2.1 + express-rate-limit: 8.5.1(express@5.2.1) + hono: 4.12.18 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.5 + zod-to-json-schema: 3.25.2(zod@4.3.5) + transitivePeerDependencies: + - supports-color + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.8.1 @@ -5745,6 +5915,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -5938,6 +6113,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.14.2 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} brace-expansion@1.1.12: @@ -6113,12 +6302,16 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.1.0: {} + content-type@1.0.5: {} cookie-signature@1.0.6: {} cookie-signature@1.0.7: {} + cookie-signature@1.2.2: {} + cookie@0.5.0: {} cookie@0.7.2: {} @@ -6521,10 +6714,21 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.0.8: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.8 + expect-type@1.3.0: {} express-rate-limit@5.5.1: {} + express-rate-limit@8.5.1(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.2.0 + express@4.18.2: dependencies: accepts: 1.3.8 @@ -6597,6 +6801,39 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.2 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -6712,6 +6949,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + find-my-way@7.7.0: dependencies: fast-deep-equal: 3.1.3 @@ -6764,6 +7012,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + front-matter@4.0.2: dependencies: js-yaml: 3.14.2 @@ -6915,6 +7165,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hono@4.12.18: {} + hookable@6.0.1: {} hpagent@1.2.0: {} @@ -7001,6 +7253,8 @@ snapshots: inherits@2.0.4: {} + ip-address@10.2.0: {} + ipaddr.js@1.9.1: {} is-deflate@1.0.0: {} @@ -7023,6 +7277,8 @@ snapshots: is-promise@2.2.2: {} + is-promise@4.0.0: {} + is-reference@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -7056,6 +7312,8 @@ snapshots: jiti@2.6.1: {} + jose@6.2.3: {} + js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -7083,6 +7341,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -7333,10 +7593,14 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + merge-descriptors@1.0.1: {} merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge2@1.4.1: {} methods@1.1.2: {} @@ -7348,10 +7612,16 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mime@2.6.0: {} @@ -7420,6 +7690,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} node-fetch@2.6.7: @@ -7639,6 +7911,8 @@ snapshots: path-to-regexp@0.1.7: {} + path-to-regexp@8.4.2: {} + path-type@4.0.0: {} pathe@2.0.3: {} @@ -7721,6 +7995,8 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 3.1.0 + pkce-challenge@5.0.1: {} + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -7826,6 +8102,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + react-is@18.3.1: {} read-yaml-file@1.1.0: @@ -7975,6 +8258,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.55.1 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -8041,6 +8334,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 @@ -8059,6 +8368,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + set-cookie-parser@2.7.2: {} setprototypeof@1.2.0: {} @@ -8396,6 +8714,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))): dependencies: typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) @@ -8732,4 +9056,8 @@ snapshots: zimmerframe@1.1.4: {} + zod-to-json-schema@3.25.2(zod@4.3.5): + dependencies: + zod: 4.3.5 + zod@4.3.5: {}