mcp-expose 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/README.md +181 -32
  3. package/dist/adonisjs/index.cjs +366 -6
  4. package/dist/adonisjs/index.cjs.map +1 -1
  5. package/dist/adonisjs/index.d.cts +2 -1
  6. package/dist/adonisjs/index.d.ts +2 -1
  7. package/dist/adonisjs/index.js +366 -6
  8. package/dist/adonisjs/index.js.map +1 -1
  9. package/dist/express/index.cjs +364 -7
  10. package/dist/express/index.cjs.map +1 -1
  11. package/dist/express/index.d.cts +4 -2
  12. package/dist/express/index.d.ts +4 -2
  13. package/dist/express/index.js +364 -7
  14. package/dist/express/index.js.map +1 -1
  15. package/dist/fastify/index.cjs +373 -6
  16. package/dist/fastify/index.cjs.map +1 -1
  17. package/dist/fastify/index.d.cts +2 -1
  18. package/dist/fastify/index.d.ts +2 -1
  19. package/dist/fastify/index.js +373 -6
  20. package/dist/fastify/index.js.map +1 -1
  21. package/dist/hono/index.cjs +367 -6
  22. package/dist/hono/index.cjs.map +1 -1
  23. package/dist/hono/index.d.cts +2 -1
  24. package/dist/hono/index.d.ts +2 -1
  25. package/dist/hono/index.js +367 -6
  26. package/dist/hono/index.js.map +1 -1
  27. package/dist/index.cjs +371 -31
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +10 -5
  30. package/dist/index.d.ts +10 -5
  31. package/dist/index.js +367 -31
  32. package/dist/index.js.map +1 -1
  33. package/dist/koa/index.cjs +366 -6
  34. package/dist/koa/index.cjs.map +1 -1
  35. package/dist/koa/index.d.cts +2 -1
  36. package/dist/koa/index.d.ts +2 -1
  37. package/dist/koa/index.js +366 -6
  38. package/dist/koa/index.js.map +1 -1
  39. package/dist/nestjs/index.cjs +381 -7
  40. package/dist/nestjs/index.cjs.map +1 -1
  41. package/dist/nestjs/index.d.cts +21 -7
  42. package/dist/nestjs/index.d.ts +21 -7
  43. package/dist/nestjs/index.js +382 -8
  44. package/dist/nestjs/index.js.map +1 -1
  45. package/dist/oauth/index.cjs +214 -0
  46. package/dist/oauth/index.cjs.map +1 -0
  47. package/dist/oauth/index.d.cts +69 -0
  48. package/dist/oauth/index.d.ts +69 -0
  49. package/dist/oauth/index.js +177 -0
  50. package/dist/oauth/index.js.map +1 -0
  51. package/dist/oauth-8RmQamGP.d.cts +75 -0
  52. package/dist/oauth-8RmQamGP.d.ts +75 -0
  53. package/dist/{server-fzkb-wJo.d.ts → server--mQVQq3A.d.cts} +81 -1
  54. package/dist/{server-fzkb-wJo.d.cts → server-BPDTsT2o.d.ts} +81 -1
  55. package/package.json +22 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nestjs/index.ts","../../src/core/dispatch.ts","../../src/core/node.ts","../../src/core/schema.ts","../../src/core/route-tool.ts","../../src/core/server.ts","../../src/nestjs/dto-schema.ts"],"sourcesContent":["import {\n All,\n Controller,\n Inject,\n Injectable,\n Module,\n Req,\n Res,\n SetMetadata,\n UseGuards,\n VERSION_NEUTRAL,\n type CanActivate,\n type DynamicModule,\n type Type,\n} from '@nestjs/common';\nimport { ApplicationConfig, DiscoveryModule, DiscoveryService } from '@nestjs/core';\nimport type { IncomingMessage } from 'node:http';\nimport { createFetchDispatcher } from '../core/dispatch.js';\nimport { loopbackBaseUrl, normalizeHeaders } from '../core/node.js';\nimport { createRouteTool, joinPaths, sanitizeToolName } from '../core/route-tool.js';\nimport { McpServer } from '../core/server.js';\nimport type { JsonSchema, McpServerOptions, McpToolDefinition, RouteToolOptions, ToolContext } from '../core/types.js';\nimport { dtoToJsonSchema, primitiveSchema, type ClassValidatorStorage } from './dto-schema.js';\n\nexport { dtoToJsonSchema } from './dto-schema.js';\n\n// Nest's metadata keys (stable across Nest 8 – 12).\nconst PATH_METADATA = 'path';\nconst METHOD_METADATA = 'method';\nconst ROUTE_ARGS_METADATA = '__routeArguments__';\nconst VERSION_METADATA = '__version__';\nconst REQUEST_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'ALL', 'OPTIONS', 'HEAD'];\nconst PARAMTYPE_BODY = 3;\nconst PARAMTYPE_QUERY = 4;\nconst PARAMTYPE_PARAM = 5;\n\nexport const MCP_TOOL_METADATA = 'mcp-expose:tool';\nexport const MCP_MODULE_OPTIONS = Symbol('MCP_MODULE_OPTIONS');\n\ndeclare const Reflect: {\n getMetadata(key: unknown, target: object, prop?: string | symbol): any;\n};\n\n/**\n * Expose a controller method as an MCP tool.\n *\n * @Get(':id')\n * @McpTool({ description: 'Get a user by id' })\n * findOne(@Param('id') id: string) { ... }\n *\n * The input schema is derived from `@Param()`, `@Query()` and `@Body()` DTOs\n * (class-validator rules and @ApiProperty descriptions), unless you pass\n * `input` / `body` / `query` / `params` yourself.\n */\nexport function McpTool(options: RouteToolOptions = {}): MethodDecorator {\n return SetMetadata(MCP_TOOL_METADATA, options);\n}\n\nexport interface McpModuleOptions extends McpServerOptions {\n /**\n * Path of the MCP endpoint. @default 'mcp'\n * The app's global prefix applies to it unless you exclude it.\n */\n path?: string;\n /** Guards for the MCP endpoint itself, e.g. `[JwtAuthGuard]`. Global guards apply too. */\n guards?: (Type<CanActivate> | CanActivate)[];\n /**\n * Base URL for internal calls. Defaults to loopback on the port the MCP\n * request arrived on.\n */\n baseUrl?: string;\n /**\n * Prefix added to every tool route. Normally not needed: the app's global\n * prefix and URI versioning are detected automatically.\n */\n pathPrefix?: string;\n /** Extra hand-written tools (see `defineTool`). */\n tools?: McpToolDefinition[];\n /**\n * class-validator's metadata storage, used to turn DTOs into JSON Schema.\n * Loaded automatically from `class-validator` when installed.\n */\n classValidatorStorage?: ClassValidatorStorage;\n}\n\nexport interface McpModuleAsyncOptions extends Pick<McpModuleOptions, 'path' | 'guards'> {\n /** Modules that export the providers listed in `inject`. */\n imports?: NonNullable<DynamicModule['imports']>;\n /** Providers passed to `useFactory`. */\n inject?: (string | symbol | Function)[];\n /** Returns the remaining options (everything except `path` and `guards`). */\n useFactory: (\n ...args: any[]\n ) => Omit<McpModuleOptions, 'path' | 'guards'> | Promise<Omit<McpModuleOptions, 'path' | 'guards'>>;\n}\n\ninterface ControllerWrapper {\n metatype?: Function | null;\n instance?: object;\n}\n\n/** Holds the MCP server and discovers `@McpTool()` handlers. Inject it to add tools at runtime. */\nexport class McpService {\n readonly server: McpServer;\n\n constructor(\n private readonly discovery: DiscoveryService,\n private readonly appConfig: ApplicationConfig,\n private readonly options: McpModuleOptions,\n ) {\n this.server = new McpServer(options);\n for (const t of options.tools ?? []) this.server.addTool(t);\n const dispatch = createFetchDispatcher({\n baseUrl: options.baseUrl ?? ((ctx) => loopbackBaseUrl(ctx.raw as IncomingMessage)),\n });\n this.server.onLoad(async () => {\n const storage = options.classValidatorStorage ?? (await loadClassValidator());\n for (const t of this.discover(storage)) {\n this.server.addTool(createRouteTool(t.route, t.options, dispatch, options));\n }\n });\n }\n\n private globalPrefix(): string {\n return this.appConfig.getGlobalPrefix?.() ?? '';\n }\n\n private versionSegment(controller: Function, handler: Function): string | undefined {\n const versioning = (\n this.appConfig as {\n getVersioning?(): { type: number; prefix?: string | false; defaultVersion?: unknown } | undefined;\n }\n ).getVersioning?.();\n if (!versioning || versioning.type !== 0 /* VersioningType.URI */) return undefined;\n let version =\n Reflect.getMetadata(VERSION_METADATA, handler) ??\n Reflect.getMetadata(VERSION_METADATA, controller) ??\n versioning.defaultVersion;\n if (Array.isArray(version)) version = version[0];\n if (version === undefined || typeof version === 'symbol') return undefined;\n const prefix = versioning.prefix === false ? '' : (versioning.prefix ?? 'v');\n return `${prefix}${String(version)}`;\n }\n\n private discover(storage: ClassValidatorStorage | undefined) {\n const found: { route: { method: string; path: string }; options: RouteToolOptions }[] = [];\n for (const wrapper of this.discovery.getControllers() as ControllerWrapper[]) {\n const controller = wrapper.metatype;\n if (!controller?.prototype) continue;\n const proto = controller.prototype;\n const ctrlPaths = toArray(Reflect.getMetadata(PATH_METADATA, controller) ?? '/');\n const ctrlName = controller.name.replace(/Controller$/, '');\n\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key === 'constructor') continue;\n const handler = Object.getOwnPropertyDescriptor(proto, key)?.value;\n if (typeof handler !== 'function') continue;\n const meta: RouteToolOptions | undefined = Reflect.getMetadata(MCP_TOOL_METADATA, handler);\n if (!meta) continue;\n const method = REQUEST_METHODS[Reflect.getMetadata(METHOD_METADATA, handler) as number] ?? 'GET';\n const methodPath = toArray(Reflect.getMetadata(PATH_METADATA, handler) ?? '/')[0] as string;\n const path = joinPaths(\n this.globalPrefix(),\n this.versionSegment(controller, handler),\n this.options.pathPrefix,\n ctrlPaths[0] as string,\n methodPath,\n );\n found.push({\n route: { method: method === 'ALL' ? 'POST' : method, path },\n options: {\n name: sanitizeToolName(`${toSnake(ctrlName)}_${toSnake(key)}`),\n ...describeArgs(controller, key, storage),\n ...meta,\n },\n });\n }\n }\n return found;\n }\n}\n\n/** Derive params/query/body schemas from the handler's decorated arguments. */\nfunction describeArgs(controller: Function, key: string, storage: ClassValidatorStorage | undefined): RouteToolOptions {\n const args: Record<string, { index: number; data?: unknown }> =\n Reflect.getMetadata(ROUTE_ARGS_METADATA, controller, key) ?? {};\n const types: unknown[] = Reflect.getMetadata('design:paramtypes', controller.prototype, key) ?? [];\n const params: JsonSchema = { type: 'object', properties: {} };\n const query: JsonSchema = { type: 'object', properties: {}, required: [] };\n let body: JsonSchema | undefined;\n\n const schemaFor = (t: unknown): JsonSchema =>\n primitiveSchema(t) ?? (typeof t === 'function' ? dtoToJsonSchema(t, storage) : {});\n\n for (const [k, arg] of Object.entries(args)) {\n const paramtype = Number(k.split(':')[0]);\n const t = types[arg.index];\n const field = typeof arg.data === 'string' ? arg.data : undefined;\n if (paramtype === PARAMTYPE_PARAM && field) {\n params.properties![field] = primitiveSchema(t) ?? { type: 'string' };\n } else if (paramtype === PARAMTYPE_QUERY) {\n if (field) query.properties![field] = primitiveSchema(t) ?? { type: 'string' };\n else Object.assign(query, mergeObject(query, schemaFor(t)));\n } else if (paramtype === PARAMTYPE_BODY) {\n if (field) {\n body ??= { type: 'object', properties: {}, required: [] };\n body.properties![field] = schemaFor(t);\n (body.required as string[]).push(field);\n } else {\n body = mergeObject(body, schemaFor(t));\n }\n }\n }\n const out: RouteToolOptions = { params };\n if (Object.keys(query.properties!).length) out.query = query;\n if (body) out.body = body;\n return out;\n}\n\nfunction mergeObject(a: JsonSchema | undefined, b: JsonSchema): JsonSchema {\n if (!a) return b;\n return {\n type: 'object',\n properties: { ...a.properties, ...b.properties },\n required: [...(a.required ?? []), ...(b.required ?? [])],\n };\n}\n\nasync function loadClassValidator(): Promise<ClassValidatorStorage | undefined> {\n try {\n const cv = (await import('class-validator')) as { getMetadataStorage?: () => ClassValidatorStorage };\n return cv.getMetadataStorage?.();\n } catch {\n return undefined;\n }\n}\n\nfunction toArray<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nfunction toSnake(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\n// Decorators are applied by hand so this package builds without\n// `experimentalDecorators` / `emitDecoratorMetadata`.\nInjectable()(McpService);\nInject(DiscoveryService)(McpService, undefined as never, 0);\nInject(ApplicationConfig)(McpService, undefined as never, 1);\nInject(MCP_MODULE_OPTIONS)(McpService, undefined as never, 2);\n\ninterface AnyReq {\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n ip?: string;\n raw?: IncomingMessage;\n socket?: unknown;\n}\ninterface AnyRes {\n // Express\n status?(code: number): AnyRes;\n set?(headers: Record<string, string>): AnyRes;\n // Fastify\n code?(code: number): AnyRes;\n headers?(headers: Record<string, string>): AnyRes;\n send(body?: unknown): unknown;\n end?(body?: unknown): unknown;\n}\n\nfunction createMcpController(options: Pick<McpModuleOptions, 'path' | 'guards'>): Type<unknown> {\n class McpController {\n constructor(readonly mcp: McpService) {}\n\n async handle(req: AnyReq, res: AnyRes) {\n const nodeReq = (req.raw ?? req) as IncomingMessage;\n const headers = normalizeHeaders(req.headers);\n const ctx: ToolContext = { headers, clientIp: req.ip, raw: nodeReq };\n const out = await this.mcp.server.handleHttp({ method: req.method, headers, body: req.body }, ctx);\n if (typeof res.code === 'function') {\n res.code(out.status).headers!(out.headers).send(out.body);\n } else {\n res.status!(out.status).set!(out.headers);\n if (out.body === undefined) res.end!();\n else res.send(out.body);\n }\n }\n }\n const proto = McpController.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'handle')!;\n // Version-neutral so URI versioning never moves the endpoint to /v1/mcp.\n Controller({ path: options.path ?? 'mcp', version: VERSION_NEUTRAL })(McpController);\n Inject(McpService)(McpController, undefined as never, 0);\n All()(proto, 'handle', descriptor);\n Req()(proto, 'handle', 0);\n Res()(proto, 'handle', 1);\n if (options.guards?.length) UseGuards(...options.guards)(McpController);\n return McpController;\n}\n\n/**\n * Adds an MCP endpoint to a NestJS app (Express or Fastify platform):\n *\n * @Module({ imports: [McpModule.forRoot({ name: 'shop-api' })] })\n *\n * Remember to exclude the MCP path from your global prefix if you want it at\n * `/mcp`: `app.setGlobalPrefix('api', { exclude: ['mcp'] })`.\n */\nexport class McpModule {\n static forRoot(options: McpModuleOptions): DynamicModule {\n return {\n module: McpModule,\n global: true,\n imports: [DiscoveryModule],\n controllers: [createMcpController(options)],\n providers: [{ provide: MCP_MODULE_OPTIONS, useValue: options }, McpService],\n exports: [McpService],\n };\n }\n\n /**\n * Resolve the options from other providers, e.g. `ConfigService`:\n *\n * McpModule.forRootAsync({\n * imports: [ConfigModule],\n * inject: [ConfigService],\n * useFactory: (config: ConfigService) => ({ name: config.get('APP_NAME') }),\n * })\n *\n * `path` and `guards` define the MCP controller, so they are passed directly.\n */\n static forRootAsync(options: McpModuleAsyncOptions): DynamicModule {\n return {\n module: McpModule,\n global: true,\n imports: [DiscoveryModule, ...(options.imports ?? [])],\n controllers: [createMcpController(options)],\n providers: [\n {\n provide: MCP_MODULE_OPTIONS,\n inject: options.inject ?? [],\n useFactory: async (...args: unknown[]) => ({\n ...(await options.useFactory(...args)),\n ...(options.path ? { path: options.path } : {}),\n }),\n },\n McpService,\n ],\n exports: [McpService],\n };\n }\n}\nModule({})(McpModule);\n","import type { Dispatcher, RouteRequest, ToolContext } from './types.js';\n\nexport function buildUrl(base: string, req: Pick<RouteRequest, 'path' | 'query'>): string {\n const url = new URL(base.replace(/\\/+$/, '') + req.path);\n for (const [k, v] of Object.entries(req.query)) {\n for (const item of Array.isArray(v) ? v : [v]) url.searchParams.append(k, item);\n }\n return url.toString();\n}\n\nexport interface FetchDispatcherOptions {\n /**\n * Base URL of the API, e.g. `http://127.0.0.1:3000` or `https://api.example.com/v1`.\n * A function lets adapters resolve it per call (e.g. from the local port).\n */\n baseUrl: string | ((ctx: ToolContext) => string);\n /** Custom fetch implementation. Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n /** Per-request timeout in ms. @default 30_000 */\n timeoutMs?: number;\n}\n\n/**\n * Dispatches tool calls as real HTTP requests. Used for loopback calls into the\n * host app (Express, Koa, NestJS) and for standalone gateways in front of any API.\n */\nexport function createFetchDispatcher(opts: FetchDispatcherOptions): Dispatcher {\n const doFetch = opts.fetch ?? fetch;\n return async (req, ctx) => {\n const base = typeof opts.baseUrl === 'function' ? opts.baseUrl(ctx) : opts.baseUrl;\n const res = await doFetch(buildUrl(base, req), {\n method: req.method,\n headers: req.headers,\n body:\n req.body === undefined || req.method === 'GET' || req.method === 'HEAD' ? undefined : JSON.stringify(req.body),\n signal: AbortSignal.timeout(opts.timeoutMs ?? 30_000),\n });\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => (headers[k] = v));\n return { status: res.status, headers, body: await res.text() };\n };\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { McpHttpResponse } from './server.js';\n\n/** Flatten Node's IncomingHttpHeaders into lower-cased single strings. */\nexport function normalizeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n}\n\n/** Read and return the raw body of a Node request (for frameworks without a JSON body parser). */\nexport function readRawBody(req: IncomingMessage, limit = 4 * 1024 * 1024): Promise<string> {\n return new Promise((resolve, reject) => {\n let size = 0;\n const chunks: Buffer[] = [];\n req.on('data', (c: Buffer) => {\n size += c.length;\n if (size > limit) {\n reject(new Error('Request body too large'));\n req.destroy();\n } else chunks.push(c);\n });\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\n/** Base URL that reaches the same server the MCP request arrived on. */\nexport function loopbackBaseUrl(req: IncomingMessage): string {\n const socket = req.socket as IncomingMessage['socket'] & {\n encrypted?: boolean;\n server?: { address(): { address: string } | string | null };\n };\n const port = socket.localPort;\n const encrypted = socket.encrypted;\n // Prefer the address the server is bound to: when it listens on all\n // interfaces this yields 127.0.0.1, so internal calls come from loopback\n // (which `trust proxy: 'loopback'` style settings rely on).\n const bound = socket.server?.address();\n let host = (typeof bound === 'object' && bound?.address) || socket.localAddress || '127.0.0.1';\n if (host.startsWith('::ffff:')) host = host.slice(7);\n if (host === '::' || host === '0.0.0.0') host = '127.0.0.1';\n if (host.includes(':')) host = `[${host}]`;\n return `${encrypted ? 'https' : 'http'}://${host}:${port}`;\n}\n\nexport function writeNodeResponse(res: ServerResponse, out: McpHttpResponse): void {\n res.statusCode = out.status;\n for (const [k, v] of Object.entries(out.headers)) res.setHeader(k, v);\n res.end(out.body);\n}\n","import type { JsonSchema, McpToolDefinition, SchemaLike } from './types.js';\n\ninterface StandardSchemaV1 {\n '~standard': {\n validate?: (value: unknown) => unknown;\n jsonSchema?: { input?: (opts: { target: string }) => unknown };\n };\n}\n\nfunction isStandard(s: unknown): s is StandardSchemaV1 {\n return typeof s === 'object' && s !== null && '~standard' in s;\n}\n\n/** Convert any supported schema flavour into a plain JSON Schema object. */\nexport function toJsonSchema(schema: SchemaLike | undefined): JsonSchema | undefined {\n if (schema === undefined || schema === null) return undefined;\n let out: unknown;\n if (isStandard(schema) && typeof schema['~standard'].jsonSchema?.input === 'function') {\n out = schema['~standard'].jsonSchema.input({ target: 'draft-2020-12' });\n } else if (typeof (schema as { toJSONSchema?: unknown }).toJSONSchema === 'function') {\n out = (schema as { toJSONSchema(): unknown }).toJSONSchema();\n } else if (isStandard(schema)) {\n throw new Error(\n 'mcp-expose: this schema library does not support JSON Schema export. Pass a plain JSON Schema instead.',\n );\n } else {\n out = schema;\n }\n const { $schema: _ignored, ...rest } = out as JsonSchema;\n return rest;\n}\n\n/** Build a validator from a Standard Schema, if the input is one. */\nexport function toValidator(schema: SchemaLike | undefined): McpToolDefinition['validate'] {\n if (!isStandard(schema) || typeof schema['~standard'].validate !== 'function') return undefined;\n const validate = schema['~standard'].validate;\n return async (value) => {\n const result = (await validate(value)) as {\n value?: unknown;\n issues?: { message: string; path?: (PropertyKey | { key: PropertyKey })[] }[];\n };\n if (!result.issues) return { ok: true, value: result.value };\n const message = result.issues\n .map((i) => {\n const path = (i.path ?? []).map((p) => (typeof p === 'object' ? String(p.key) : String(p))).join('.');\n return path ? `${path}: ${i.message}` : i.message;\n })\n .join('; ');\n return { ok: false, message };\n };\n}\n\n/** Very small structural check used when no Standard Schema validator exists. */\nexport function checkRequired(schema: JsonSchema, args: Record<string, unknown>): string | undefined {\n const missing = (schema.required ?? []).filter((k) => args[k] === undefined);\n return missing.length ? `Missing required argument(s): ${missing.join(', ')}` : undefined;\n}\n","import { checkRequired, toJsonSchema, toValidator } from './schema.js';\nimport type {\n Dispatcher,\n JsonSchema,\n McpServerOptions,\n McpToolDefinition,\n RouteResponse,\n RouteSpec,\n RouteToolOptions,\n ToolAnnotations,\n ToolContext,\n ToolResult,\n} from './types.js';\n\nexport const DEFAULT_FORWARD_HEADERS = ['authorization', 'cookie', 'x-api-key', 'accept-language'];\nconst BODY_METHODS = new Set(['POST', 'PUT', 'PATCH']);\nconst PARAM_RE = /:([A-Za-z0-9_]+)\\??|\\{([A-Za-z0-9_]+)\\}/g;\n\n/** Names of the path parameters in a route path (`/a/:id/{slug}` -> ['id', 'slug']). */\nexport function pathParams(path: string): string[] {\n return [...path.matchAll(PARAM_RE)].map((m) => (m[1] ?? m[2]) as string);\n}\n\n/**\n * Encode one path-parameter value. Rejects empty, `.` and `..` values: after URL\n * normalisation they would change which route is called (e.g. `/orders/../admin`),\n * letting an agent reach routes that were never exposed as tools.\n */\nfunction encodeSegment(name: string, value: unknown): string {\n const raw = String(value);\n if (raw === '' || raw === '.' || raw === '..') {\n throw new Error(`Invalid value for path parameter \"${name}\": ${JSON.stringify(raw)}`);\n }\n return encodeURIComponent(raw);\n}\n\n/** Replace path placeholders with URL-encoded values. Missing optional params drop their segment. */\nexport function interpolatePath(path: string, values: Record<string, unknown>): string {\n return path\n .replace(/\\/:([A-Za-z0-9_]+)\\?/g, (_, k: string) =>\n values[k] === undefined ? '' : `/${encodeSegment(k, values[k])}`,\n )\n .replace(PARAM_RE, (_, a?: string, b?: string) => {\n const k = (a ?? b) as string;\n return encodeSegment(k, values[k]);\n });\n}\n\n/** Join path segments, normalising slashes. */\nexport function joinPaths(...parts: (string | undefined)[]): string {\n const joined = parts\n .filter((p): p is string => !!p && p !== '/')\n .map((p) => p.replace(/^\\/+|\\/+$/g, ''))\n .filter(Boolean)\n .join('/');\n return `/${joined}`;\n}\n\n/** `GET /users/:id/orders` -> `get_users_by_id_orders` */\nexport function toolNameFromRoute(method: string, path: string): string {\n const segments = path\n .split('/')\n .filter(Boolean)\n .map((s) => {\n const m = /^(?::([A-Za-z0-9_]+)\\??|\\{([A-Za-z0-9_]+)\\})$/.exec(s);\n return m ? `by_${m[1] ?? m[2]}` : s;\n });\n return sanitizeToolName([method.toLowerCase(), ...segments].join('_'));\n}\n\nexport function sanitizeToolName(name: string): string {\n return name\n .replace(/[^A-Za-z0-9_-]+/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n .slice(0, 64);\n}\n\nfunction defaultAnnotations(method: string): ToolAnnotations {\n switch (method) {\n case 'GET':\n case 'HEAD':\n return { readOnlyHint: true, openWorldHint: false };\n case 'DELETE':\n return { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false };\n case 'PUT':\n return { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false };\n default:\n return { readOnlyHint: false, destructiveHint: false, openWorldHint: false };\n }\n}\n\ninterface ArgMapping {\n params: string[];\n query: Set<string>;\n body: Set<string>;\n /** Body schema is not an object: the whole body is passed under the `body` key. */\n wholeBody: boolean;\n bodyMethod: boolean;\n}\n\n/**\n * Build the flat input schema an agent sees, and remember which argument goes\n * to the path, query string or body when the tool is called.\n */\nexport function buildInputSchema(\n route: RouteSpec,\n opts: RouteToolOptions,\n): { schema: JsonSchema; mapping: ArgMapping } {\n const method = route.method.toUpperCase();\n const params = pathParams(route.path);\n const mapping: ArgMapping = {\n params,\n query: new Set(),\n body: new Set(),\n wholeBody: false,\n bodyMethod: BODY_METHODS.has(method),\n };\n\n if (opts.input) {\n const schema = toJsonSchema(opts.input) as JsonSchema;\n return { schema: { type: 'object', ...schema }, mapping };\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required = new Set<string>();\n\n const paramSchema = toJsonSchema(opts.params);\n for (const p of params) {\n properties[p] = paramSchema?.properties?.[p] ?? { type: 'string', description: `Path parameter \"${p}\"` };\n if (!route.path.includes(`:${p}?`)) required.add(p);\n }\n\n const querySchema = toJsonSchema(opts.query);\n for (const [k, v] of Object.entries(querySchema?.properties ?? {})) {\n properties[k] = v;\n mapping.query.add(k);\n }\n for (const k of querySchema?.required ?? []) required.add(k);\n\n const bodySchema = toJsonSchema(opts.body);\n if (bodySchema) {\n if (bodySchema.properties && (bodySchema.type === undefined || bodySchema.type === 'object')) {\n for (const [k, v] of Object.entries(bodySchema.properties)) {\n properties[k] = v;\n mapping.body.add(k);\n }\n for (const k of bodySchema.required ?? []) required.add(k);\n } else {\n properties.body = bodySchema;\n required.add('body');\n mapping.wholeBody = true;\n }\n }\n\n const schema: JsonSchema = { type: 'object', properties };\n if (required.size) schema.required = [...required];\n return { schema, mapping };\n}\n\nfunction splitArgs(args: Record<string, unknown>, mapping: ArgMapping) {\n const pathValues: Record<string, unknown> = {};\n const query: Record<string, string | string[]> = {};\n let body: Record<string, unknown> | unknown | undefined;\n\n for (const [k, v] of Object.entries(args)) {\n if (v === undefined) continue;\n if (mapping.params.includes(k)) {\n pathValues[k] = v;\n } else if (mapping.wholeBody && k === 'body') {\n body = v;\n } else if (mapping.query.has(k) || (!mapping.body.has(k) && !mapping.bodyMethod)) {\n query[k] = Array.isArray(v) ? v.map(String) : typeof v === 'object' && v !== null ? JSON.stringify(v) : String(v);\n } else {\n body = { ...((body as Record<string, unknown>) ?? {}), [k]: v };\n }\n }\n if (body === undefined && mapping.bodyMethod) body = {};\n return { pathValues, query, body };\n}\n\nexport function responseToResult(res: RouteResponse, maxChars: number): ToolResult {\n let text = res.body;\n if (text.length > maxChars) text = `${text.slice(0, maxChars)}\\n…[truncated ${text.length - maxChars} chars]`;\n const isError = res.status >= 400;\n const result: ToolResult = {\n content: [{ type: 'text', text: isError ? `HTTP ${res.status}\\n${text}` : text || `HTTP ${res.status}` }],\n };\n if (isError) {\n result.isError = true;\n return result;\n }\n if ((res.headers['content-type'] ?? '').includes('json') && text === res.body) {\n try {\n const parsed = JSON.parse(res.body);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) result.structuredContent = parsed;\n } catch {\n /* not JSON after all */\n }\n }\n return result;\n}\n\nexport function pickForwardHeaders(ctx: ToolContext, names: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const name of names) {\n const v = ctx.headers[name.toLowerCase()];\n if (v !== undefined) out[name.toLowerCase()] = v;\n }\n return out;\n}\n\n/**\n * Turn an HTTP route + options into an MCP tool whose handler calls the route\n * through `dispatch`, so auth guards, validation and rate limits all still apply.\n */\nexport function createRouteTool(\n route: RouteSpec,\n opts: RouteToolOptions,\n dispatch: Dispatcher,\n serverOpts: Pick<McpServerOptions, 'forwardHeaders' | 'maxResponseChars'> = {},\n): McpToolDefinition {\n const method = route.method.toUpperCase();\n const name = sanitizeToolName(opts.name ?? toolNameFromRoute(method, route.path));\n const { schema, mapping } = buildInputSchema(route, opts);\n const forward = serverOpts.forwardHeaders ?? DEFAULT_FORWARD_HEADERS;\n const maxChars = serverOpts.maxResponseChars ?? 100_000;\n\n return {\n name,\n title: opts.title,\n description: opts.description ?? `${method} ${route.path}`,\n inputSchema: schema,\n annotations: { ...defaultAnnotations(method), ...opts.annotations },\n validate: toValidator(opts.input),\n async handler(args, ctx) {\n const missing = opts.input ? undefined : checkRequired(schema, args);\n if (missing) return { isError: true, content: [{ type: 'text', text: missing }] };\n\n const { pathValues, query, body } = splitArgs(args, mapping);\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...pickForwardHeaders(ctx, forward),\n ...opts.headers,\n 'x-mcp-tool': name,\n };\n if (ctx.clientIp) headers['x-forwarded-for'] = ctx.clientIp;\n if (body !== undefined) headers['content-type'] = 'application/json';\n\n let path: string;\n try {\n path = interpolatePath(route.path, pathValues);\n } catch (err) {\n return { isError: true, content: [{ type: 'text', text: (err as Error).message }] };\n }\n const res = await dispatch({ method, path, query, body, headers }, ctx);\n return responseToResult(res, maxChars);\n },\n };\n}\n","import type { McpServerOptions, McpToolDefinition, ToolContext, ToolResult } from './types.js';\n\nexport const SUPPORTED_PROTOCOL_VERSIONS = ['2025-11-25', '2025-06-18', '2025-03-26', '2024-11-05'];\nexport const LATEST_PROTOCOL_VERSION = SUPPORTED_PROTOCOL_VERSIONS[0] as string;\n\ntype JsonRpcId = string | number | null;\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id?: JsonRpcId;\n method: string;\n params?: Record<string, unknown>;\n}\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: JsonRpcId;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nconst PARSE_ERROR = -32700;\nconst INVALID_REQUEST = -32600;\nconst METHOD_NOT_FOUND = -32601;\nconst INVALID_PARAMS = -32602;\n\nconst ok = (id: JsonRpcId, result: unknown): JsonRpcResponse => ({ jsonrpc: '2.0', id, result });\nconst fail = (id: JsonRpcId, code: number, message: string): JsonRpcResponse => ({\n jsonrpc: '2.0',\n id,\n error: { code, message },\n});\n\n/** Minimal HTTP request/response shapes, so each adapter can bridge its own framework. */\nexport interface McpHttpRequest {\n method: string;\n headers: Record<string, string>;\n /** Parsed JSON body, or the raw string. */\n body: unknown;\n}\nexport interface McpHttpResponse {\n status: number;\n headers: Record<string, string>;\n body?: string;\n}\n\n/**\n * A stateless MCP server speaking the Streamable HTTP transport (JSON responses).\n * Holds the tool registry and answers JSON-RPC messages.\n */\nexport class McpServer {\n private readonly tools = new Map<string, McpToolDefinition>();\n private loaders: (() => void | Promise<void>)[] = [];\n\n constructor(readonly options: McpServerOptions) {}\n\n /** Register a tool. Throws on duplicate names. */\n addTool(tool: McpToolDefinition): this {\n if (this.tools.has(tool.name)) {\n throw new Error(`mcp-expose: duplicate tool name \"${tool.name}\". Set an explicit \\`name\\`.`);\n }\n this.tools.set(tool.name, tool);\n return this;\n }\n\n /** Register a function that adds tools lazily, right before the first MCP request is served. */\n onLoad(loader: () => void | Promise<void>): this {\n this.loaders.push(loader);\n return this;\n }\n\n async listTools(): Promise<McpToolDefinition[]> {\n await this.load();\n return [...this.tools.values()];\n }\n\n private async load() {\n if (!this.loaders.length) return;\n const loaders = this.loaders;\n this.loaders = [];\n for (const l of loaders) await l();\n }\n\n /** Handle one JSON-RPC message (or a batch). Returns null when no response is due. */\n async handleMessage(message: unknown, ctx: ToolContext): Promise<JsonRpcResponse | JsonRpcResponse[] | null> {\n if (Array.isArray(message)) {\n const results = (await Promise.all(message.map((m) => this.handleOne(m, ctx)))).filter(\n (r): r is JsonRpcResponse => r !== null,\n );\n return results.length ? results : null;\n }\n return this.handleOne(message, ctx);\n }\n\n private async handleOne(message: unknown, ctx: ToolContext): Promise<JsonRpcResponse | null> {\n const msg = message as Partial<JsonRpcRequest>;\n if (!msg || typeof msg !== 'object' || msg.jsonrpc !== '2.0') {\n return fail(null, INVALID_REQUEST, 'Invalid JSON-RPC message');\n }\n // Responses from the client or notifications: acknowledge, no reply.\n if (typeof msg.method !== 'string' || msg.id === undefined) return null;\n const id = msg.id;\n const params = msg.params ?? {};\n\n await this.load();\n switch (msg.method) {\n case 'initialize': {\n const requested = params.protocolVersion as string | undefined;\n const protocolVersion =\n requested && SUPPORTED_PROTOCOL_VERSIONS.includes(requested) ? requested : LATEST_PROTOCOL_VERSION;\n return ok(id, {\n protocolVersion,\n capabilities: { tools: { listChanged: false } },\n serverInfo: { name: this.options.name, version: this.options.version ?? '1.0.0' },\n ...(this.options.instructions ? { instructions: this.options.instructions } : {}),\n });\n }\n case 'ping':\n return ok(id, {});\n case 'tools/list':\n return ok(id, {\n tools: [...this.tools.values()].map((t) => ({\n name: t.name,\n ...(t.title ? { title: t.title } : {}),\n description: t.description,\n inputSchema: t.inputSchema,\n ...(t.annotations ? { annotations: t.annotations } : {}),\n })),\n });\n case 'tools/call': {\n const tool = this.tools.get(params.name as string);\n if (!tool) return fail(id, INVALID_PARAMS, `Unknown tool: ${String(params.name)}`);\n return ok(id, await this.callTool(tool, (params.arguments ?? {}) as Record<string, unknown>, ctx));\n }\n case 'resources/list':\n return ok(id, { resources: [] });\n case 'prompts/list':\n return ok(id, { prompts: [] });\n default:\n return fail(id, METHOD_NOT_FOUND, `Method not found: ${msg.method}`);\n }\n }\n\n private async callTool(\n tool: McpToolDefinition,\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n try {\n if (tool.validate) {\n const v = await tool.validate(args);\n if (!v.ok) return { isError: true, content: [{ type: 'text', text: `Invalid arguments: ${v.message}` }] };\n args = v.value as Record<string, unknown>;\n }\n return await tool.handler(args, ctx);\n } catch (err) {\n // Tool failures are reported in-band so the model can react to them.\n return { isError: true, content: [{ type: 'text', text: `Tool error: ${(err as Error).message}` }] };\n }\n }\n\n /** Check the Origin header (DNS rebinding protection). */\n isOriginAllowed(origin: string | undefined): boolean {\n if (!origin) return true;\n const allowed = this.options.allowedOrigins;\n if (allowed === '*') return true;\n return (allowed ?? []).includes(origin);\n }\n\n /**\n * Framework-neutral Streamable HTTP handler. Adapters convert their request\n * into McpHttpRequest, call this, and write the McpHttpResponse back.\n */\n async handleHttp(req: McpHttpRequest, ctx: ToolContext): Promise<McpHttpResponse> {\n const json = { 'content-type': 'application/json' };\n if (!this.isOriginAllowed(req.headers.origin)) {\n return { status: 403, headers: json, body: JSON.stringify(fail(null, INVALID_REQUEST, 'Origin not allowed')) };\n }\n if (req.method.toUpperCase() !== 'POST') {\n // Stateless server: no standalone SSE stream and no sessions to delete.\n return { status: 405, headers: { allow: 'POST' } };\n }\n let body = req.body;\n if (typeof body === 'string' || body instanceof Uint8Array) {\n try {\n body = JSON.parse(typeof body === 'string' ? body : new TextDecoder().decode(body));\n } catch {\n return { status: 400, headers: json, body: JSON.stringify(fail(null, PARSE_ERROR, 'Parse error')) };\n }\n }\n const response = await this.handleMessage(body, ctx);\n if (response === null) return { status: 202, headers: {} };\n return { status: 200, headers: json, body: JSON.stringify(response) };\n }\n}\n","import type { JsonSchema } from '../core/types.js';\n\ninterface ValidationMetadata {\n type: string;\n name?: string;\n propertyName: string;\n constraints?: unknown[];\n each?: boolean;\n}\n\nexport interface ClassValidatorStorage {\n getTargetValidationMetadatas(\n target: Function,\n targetSchema: string,\n always: boolean,\n strictGroups: boolean,\n ): ValidationMetadata[];\n}\n\ndeclare const Reflect: { getMetadata?(key: string, target: object, prop?: string | symbol): unknown };\n\nconst PRIMITIVES = new Map<unknown, JsonSchema>([\n [String, { type: 'string' }],\n [Number, { type: 'number' }],\n [Boolean, { type: 'boolean' }],\n [Date, { type: 'string', format: 'date-time' }],\n [Array, { type: 'array' }],\n [Object, { type: 'object' }],\n]);\n\nexport function primitiveSchema(type: unknown): JsonSchema | undefined {\n const s = PRIMITIVES.get(type);\n return s ? { ...s } : undefined;\n}\n\n/** Apply one class-validator rule to a (property or `items`) schema. */\nfunction applyRule(s: JsonSchema, name: string, c: unknown[] = []): void {\n switch (name) {\n case 'isString':\n s.type = 'string';\n break;\n case 'isNumber':\n case 'isNumberString':\n s.type = name === 'isNumber' ? 'number' : 'string';\n break;\n case 'isInt':\n s.type = 'integer';\n break;\n case 'isBoolean':\n s.type = 'boolean';\n break;\n case 'isDate':\n case 'isDateString':\n case 'isISO8601':\n s.type = 'string';\n s.format = 'date-time';\n break;\n case 'isEmail':\n s.type = 'string';\n s.format = 'email';\n break;\n case 'isUrl':\n s.type = 'string';\n s.format = 'uri';\n break;\n case 'isUUID':\n s.type = 'string';\n s.format = 'uuid';\n break;\n case 'isPositive':\n s.exclusiveMinimum = 0;\n break;\n case 'isNegative':\n s.exclusiveMaximum = 0;\n break;\n case 'min':\n s.minimum = c[0];\n break;\n case 'max':\n s.maximum = c[0];\n break;\n case 'minLength':\n s.minLength = c[0];\n break;\n case 'maxLength':\n s.maxLength = c[0];\n break;\n case 'length':\n s.minLength = c[0];\n if (c[1] !== undefined) s.maxLength = c[1];\n break;\n case 'matches':\n if (c[0] instanceof RegExp) s.pattern = c[0].source;\n break;\n case 'isIn':\n s.enum = c[0] as unknown[];\n break;\n case 'isEnum':\n s.enum = (c[1] as unknown[]) ?? Object.values(c[0] as object);\n break;\n case 'isNotEmpty':\n if (s.type === 'string') s.minLength = Math.max(1, Number(s.minLength ?? 0));\n break;\n case 'isArray':\n s.type = 'array';\n break;\n case 'arrayMinSize':\n s.minItems = c[0];\n break;\n case 'arrayMaxSize':\n s.maxItems = c[0];\n break;\n case 'isObject':\n s.type = 'object';\n break;\n }\n}\n\n/**\n * Derive a JSON Schema from a class-validator DTO. Only used to *describe* the\n * tool to the agent: the real validation still happens in your ValidationPipe.\n */\nexport function dtoToJsonSchema(dto: Function, storage: ClassValidatorStorage | undefined, depth = 0): JsonSchema {\n const schema: JsonSchema = { type: 'object', properties: {} };\n if (!storage || depth > 5) return schema;\n const metas = storage.getTargetValidationMetadatas(dto, '', true, false);\n const properties: Record<string, JsonSchema> = {};\n const optional = new Set<string>();\n\n for (const m of metas) {\n const prop = (properties[m.propertyName] ??= initial(dto, m.propertyName));\n if (m.type === 'conditionalValidation' && m.name === 'isOptional') {\n optional.add(m.propertyName);\n } else if (m.type === 'nestedValidation') {\n const nestedType = Reflect.getMetadata?.('design:type', dto.prototype, m.propertyName);\n if (typeof nestedType === 'function' && !PRIMITIVES.has(nestedType)) {\n Object.assign(prop, dtoToJsonSchema(nestedType, storage, depth + 1));\n }\n } else if (m.type === 'customValidation' && m.name) {\n if (m.each) {\n prop.type = 'array';\n const items = (prop.items ??= {}) as JsonSchema;\n applyRule(items, m.name, m.constraints);\n } else {\n applyRule(prop, m.name, m.constraints);\n }\n }\n }\n\n schema.properties = properties;\n const required = Object.keys(properties).filter((p) => !optional.has(p));\n if (required.length) schema.required = required;\n return schema;\n}\n\nfunction initial(dto: Function, prop: string): JsonSchema {\n const designType = Reflect.getMetadata?.('design:type', dto.prototype, prop);\n const s: JsonSchema = primitiveSchema(designType) ?? {};\n // Pick up @nestjs/swagger @ApiProperty() descriptions/examples when present.\n const api = Reflect.getMetadata?.('swagger/apiModelProperties', dto.prototype, prop) as\n { description?: string; example?: unknown; enum?: unknown } | undefined;\n if (api?.description) s.description = api.description;\n if (api?.example !== undefined) s.examples = [api.example];\n if (Array.isArray(api?.enum)) s.enum = api.enum;\n return s;\n}\n"],"mappings":"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","names":["All","Controller","Inject","Injectable","Module","Req","Res","SetMetadata","UseGuards","VERSION_NEUTRAL","ApplicationConfig","DiscoveryModule","DiscoveryService","buildUrl","base","req","url","URL","replace","path","k","v","Object","entries","query","item","Array","isArray","searchParams","append","toString","createFetchDispatcher","opts","doFetch","fetch","ctx","baseUrl","res","method","headers","body","undefined","JSON","stringify","signal","AbortSignal","timeout","timeoutMs","forEach","status","text","normalizeHeaders","headers","out","k","v","Object","entries","undefined","toLowerCase","Array","isArray","join","String","loopbackBaseUrl","req","socket","port","localPort","encrypted","bound","server","address","host","localAddress","startsWith","slice","includes","isStandard","s","toJsonSchema","schema","undefined","out","jsonSchema","input","target","toJSONSchema","Error","$schema","_ignored","rest","toValidator","validate","value","result","issues","ok","message","map","i","path","p","String","key","join","checkRequired","args","missing","required","filter","k","length","DEFAULT_FORWARD_HEADERS","BODY_METHODS","Set","PARAM_RE","pathParams","path","matchAll","map","m","encodeSegment","name","value","raw","String","Error","JSON","stringify","encodeURIComponent","interpolatePath","values","replace","_","k","undefined","a","b","joinPaths","parts","joined","filter","p","Boolean","join","toolNameFromRoute","method","segments","split","s","exec","sanitizeToolName","toLowerCase","slice","defaultAnnotations","readOnlyHint","openWorldHint","destructiveHint","idempotentHint","buildInputSchema","route","opts","toUpperCase","params","mapping","query","body","wholeBody","bodyMethod","has","input","schema","toJsonSchema","type","properties","required","paramSchema","description","includes","add","querySchema","v","Object","entries","bodySchema","size","splitArgs","args","pathValues","Array","isArray","responseToResult","res","maxChars","text","length","isError","status","result","content","headers","parsed","parse","structuredContent","pickForwardHeaders","ctx","names","out","createRouteTool","dispatch","serverOpts","forward","forwardHeaders","maxResponseChars","title","inputSchema","annotations","validate","toValidator","handler","missing","checkRequired","accept","clientIp","err","message","SUPPORTED_PROTOCOL_VERSIONS","LATEST_PROTOCOL_VERSION","PARSE_ERROR","INVALID_REQUEST","METHOD_NOT_FOUND","INVALID_PARAMS","ok","id","result","jsonrpc","fail","code","message","error","McpServer","tools","Map","loaders","options","addTool","tool","has","name","Error","set","onLoad","loader","push","listTools","load","values","length","l","handleMessage","ctx","Array","isArray","results","Promise","all","map","m","handleOne","filter","r","msg","method","undefined","params","requested","protocolVersion","includes","capabilities","listChanged","serverInfo","version","instructions","t","title","description","inputSchema","annotations","get","String","callTool","arguments","resources","prompts","args","validate","v","isError","content","type","text","value","handler","err","isOriginAllowed","origin","allowed","allowedOrigins","handleHttp","req","json","headers","status","body","JSON","stringify","toUpperCase","allow","Uint8Array","parse","TextDecoder","decode","response","PRIMITIVES","Map","String","type","Number","Boolean","Date","format","Array","Object","primitiveSchema","s","get","undefined","applyRule","name","c","exclusiveMinimum","exclusiveMaximum","minimum","maximum","minLength","maxLength","RegExp","pattern","source","enum","values","Math","max","minItems","maxItems","dtoToJsonSchema","dto","storage","depth","schema","properties","metas","getTargetValidationMetadatas","optional","Set","m","prop","propertyName","initial","add","nestedType","Reflect","getMetadata","prototype","has","assign","each","items","constraints","required","keys","filter","p","length","designType","api","description","example","examples","isArray","PATH_METADATA","METHOD_METADATA","ROUTE_ARGS_METADATA","VERSION_METADATA","REQUEST_METHODS","PARAMTYPE_BODY","PARAMTYPE_QUERY","PARAMTYPE_PARAM","MCP_TOOL_METADATA","MCP_MODULE_OPTIONS","Symbol","McpTool","options","SetMetadata","McpService","server","discovery","appConfig","McpServer","t","tools","addTool","dispatch","createFetchDispatcher","baseUrl","ctx","loopbackBaseUrl","raw","onLoad","storage","classValidatorStorage","loadClassValidator","discover","createRouteTool","route","globalPrefix","getGlobalPrefix","versionSegment","controller","handler","versioning","getVersioning","type","undefined","version","Reflect","getMetadata","defaultVersion","Array","isArray","prefix","String","found","wrapper","getControllers","metatype","prototype","proto","ctrlPaths","toArray","ctrlName","name","replace","key","Object","getOwnPropertyNames","getOwnPropertyDescriptor","value","meta","method","methodPath","path","joinPaths","pathPrefix","push","sanitizeToolName","toSnake","describeArgs","args","types","params","properties","query","required","body","schemaFor","primitiveSchema","dtoToJsonSchema","k","arg","entries","paramtype","Number","split","index","field","data","assign","mergeObject","out","keys","length","a","b","cv","getMetadataStorage","v","s","toLowerCase","Injectable","Inject","DiscoveryService","ApplicationConfig","createMcpController","McpController","mcp","handle","req","res","nodeReq","headers","normalizeHeaders","clientIp","ip","handleHttp","code","status","send","set","end","descriptor","Controller","VERSION_NEUTRAL","All","Req","Res","guards","UseGuards","McpModule","forRoot","module","global","imports","DiscoveryModule","controllers","providers","provide","useValue","exports","forRootAsync","inject","useFactory","Module"]}
1
+ {"version":3,"sources":["../../src/nestjs/index.ts","../../src/core/dispatch.ts","../../src/core/node.ts","../../src/core/result.ts","../../src/core/schema.ts","../../src/core/route-tool.ts","../../src/core/oauth.ts","../../src/core/server.ts","../../src/nestjs/dto-schema.ts"],"sourcesContent":["import {\n All,\n Controller,\n Inject,\n Injectable,\n Module,\n Req,\n Res,\n SetMetadata,\n UseGuards,\n VERSION_NEUTRAL,\n type CanActivate,\n type DynamicModule,\n type Type,\n} from '@nestjs/common';\nimport { ApplicationConfig, DiscoveryModule, DiscoveryService, HttpAdapterHost } from '@nestjs/core';\nimport type { IncomingMessage } from 'node:http';\nimport { createFetchDispatcher } from '../core/dispatch.js';\nimport { loopbackBaseUrl, normalizeHeaders } from '../core/node.js';\nimport { createRouteTool, joinPaths, sanitizeToolName } from '../core/route-tool.js';\nimport { McpServer } from '../core/server.js';\nimport type { JsonSchema, McpServerOptions, McpToolDefinition, RouteToolOptions, ToolContext } from '../core/types.js';\nimport { dtoToJsonSchema, primitiveSchema, type ClassValidatorStorage } from './dto-schema.js';\n\nexport { dtoToJsonSchema } from './dto-schema.js';\n\n// Nest's metadata keys (stable across Nest 8 – 12).\nconst PATH_METADATA = 'path';\nconst METHOD_METADATA = 'method';\nconst ROUTE_ARGS_METADATA = '__routeArguments__';\nconst VERSION_METADATA = '__version__';\nconst REQUEST_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'ALL', 'OPTIONS', 'HEAD'];\nconst PARAMTYPE_BODY = 3;\nconst PARAMTYPE_QUERY = 4;\nconst PARAMTYPE_PARAM = 5;\n\nexport const MCP_TOOL_METADATA = 'mcp-expose:tool';\nexport const MCP_MODULE_OPTIONS = Symbol('MCP_MODULE_OPTIONS');\n\ndeclare const Reflect: {\n getMetadata(key: unknown, target: object, prop?: string | symbol): any;\n};\n\n/**\n * Expose a controller method as an MCP tool.\n *\n * @Get(':id')\n * @McpTool({ description: 'Get a user by id' })\n * findOne(@Param('id') id: string) { ... }\n *\n * The input schema is derived from `@Param()`, `@Query()` and `@Body()` DTOs\n * (class-validator rules and @ApiProperty descriptions), unless you pass\n * `input` / `body` / `query` / `params` yourself.\n */\nexport function McpTool(options: RouteToolOptions = {}): MethodDecorator {\n return SetMetadata(MCP_TOOL_METADATA, options);\n}\n\nexport interface McpModuleOptions extends McpServerOptions {\n /**\n * Path of the MCP endpoint. @default 'mcp'\n * The app's global prefix applies to it unless you exclude it.\n */\n path?: string;\n /** Guards for the MCP endpoint itself, e.g. `[JwtAuthGuard]`. Global guards apply too. */\n guards?: (Type<CanActivate> | CanActivate)[];\n /**\n * Extra decorators for the MCP controller, e.g. `[Public()]` so a global auth\n * guard lets MCP requests through when the `oauth` option checks them instead.\n */\n decorators?: ClassDecorator[];\n /**\n * Base URL for internal calls. Defaults to loopback on the port the MCP\n * request arrived on.\n */\n baseUrl?: string;\n /**\n * Prefix added to every tool route. Normally not needed: the app's global\n * prefix and URI versioning are detected automatically.\n */\n pathPrefix?: string;\n /** Extra hand-written tools (see `defineTool`). */\n tools?: McpToolDefinition[];\n /**\n * class-validator's metadata storage, used to turn DTOs into JSON Schema.\n * Loaded automatically from `class-validator` when installed.\n */\n classValidatorStorage?: ClassValidatorStorage;\n}\n\nexport interface McpModuleAsyncOptions extends Pick<McpModuleOptions, 'path' | 'guards' | 'decorators'> {\n /** Modules that export the providers listed in `inject`. */\n imports?: NonNullable<DynamicModule['imports']>;\n /** Providers passed to `useFactory`. */\n inject?: (string | symbol | Function)[];\n /** Returns the remaining options (everything except `path`, `guards` and `decorators`). */\n useFactory: (...args: any[]) => McpModuleFactoryOptions | Promise<McpModuleFactoryOptions>;\n}\n\nexport type McpModuleFactoryOptions = Omit<McpModuleOptions, 'path' | 'guards' | 'decorators'>;\n\ninterface HttpAdapterLike {\n get(path: string, handler: (req: unknown, res: unknown) => unknown): unknown;\n options(path: string, handler: (req: unknown, res: unknown) => unknown): unknown;\n setHeader(res: unknown, name: string, value: string): unknown;\n reply(res: unknown, body: unknown, status?: number): unknown;\n}\n\ninterface ControllerWrapper {\n metatype?: Function | null;\n instance?: object;\n}\n\n/** Holds the MCP server and discovers `@McpTool()` handlers. Inject it to add tools at runtime. */\nexport class McpService {\n readonly server: McpServer;\n\n constructor(\n private readonly discovery: DiscoveryService,\n private readonly appConfig: ApplicationConfig,\n private readonly options: McpModuleOptions,\n private readonly adapterHost?: HttpAdapterHost,\n ) {\n this.server = new McpServer(options);\n for (const t of options.tools ?? []) this.server.addTool(t);\n const dispatch = createFetchDispatcher({\n baseUrl: options.baseUrl ?? ((ctx) => loopbackBaseUrl(ctx.raw as IncomingMessage)),\n });\n this.server.onLoad(async () => {\n const storage = options.classValidatorStorage ?? (await loadClassValidator());\n for (const t of this.discover(storage)) {\n this.server.addTool(createRouteTool(t.route, t.options, dispatch, options));\n }\n });\n }\n\n /**\n * Serve the OAuth Protected Resource Metadata at the root of the app, outside\n * the global prefix and guards (it must be public). Runs before Nest registers\n * its own routes.\n */\n onModuleInit(): void {\n const adapter = this.adapterHost?.httpAdapter as HttpAdapterLike | undefined;\n if (!adapter) return;\n for (const path of this.server.oauthMetadataPaths) {\n const handler = (method: string) => async (_req: unknown, res: unknown) => {\n const out = await this.server.handleMetadataHttp({ method });\n for (const [k, v] of Object.entries(out.headers)) adapter.setHeader(res, k, v);\n adapter.reply(res, out.body, out.status);\n };\n adapter.get(path, handler('GET'));\n adapter.options(path, handler('OPTIONS'));\n }\n }\n\n private globalPrefix(): string {\n return this.appConfig.getGlobalPrefix?.() ?? '';\n }\n\n private versionSegment(controller: Function, handler: Function): string | undefined {\n const versioning = (\n this.appConfig as {\n getVersioning?(): { type: number; prefix?: string | false; defaultVersion?: unknown } | undefined;\n }\n ).getVersioning?.();\n if (!versioning || versioning.type !== 0 /* VersioningType.URI */) return undefined;\n let version =\n Reflect.getMetadata(VERSION_METADATA, handler) ??\n Reflect.getMetadata(VERSION_METADATA, controller) ??\n versioning.defaultVersion;\n if (Array.isArray(version)) version = version[0];\n if (version === undefined || typeof version === 'symbol') return undefined;\n const prefix = versioning.prefix === false ? '' : (versioning.prefix ?? 'v');\n return `${prefix}${String(version)}`;\n }\n\n private discover(storage: ClassValidatorStorage | undefined) {\n const found: { route: { method: string; path: string }; options: RouteToolOptions }[] = [];\n for (const wrapper of this.discovery.getControllers() as ControllerWrapper[]) {\n const controller = wrapper.metatype;\n if (!controller?.prototype) continue;\n const proto = controller.prototype;\n const ctrlPaths = toArray(Reflect.getMetadata(PATH_METADATA, controller) ?? '/');\n const ctrlName = controller.name.replace(/Controller$/, '');\n\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key === 'constructor') continue;\n const handler = Object.getOwnPropertyDescriptor(proto, key)?.value;\n if (typeof handler !== 'function') continue;\n const meta: RouteToolOptions | undefined = Reflect.getMetadata(MCP_TOOL_METADATA, handler);\n if (!meta) continue;\n const method = REQUEST_METHODS[Reflect.getMetadata(METHOD_METADATA, handler) as number] ?? 'GET';\n const methodPath = toArray(Reflect.getMetadata(PATH_METADATA, handler) ?? '/')[0] as string;\n const path = joinPaths(\n this.globalPrefix(),\n this.versionSegment(controller, handler),\n this.options.pathPrefix,\n ctrlPaths[0] as string,\n methodPath,\n );\n found.push({\n route: { method: method === 'ALL' ? 'POST' : method, path },\n options: {\n name: sanitizeToolName(`${toSnake(ctrlName)}_${toSnake(key)}`),\n ...describeArgs(controller, key, storage),\n ...meta,\n },\n });\n }\n }\n return found;\n }\n}\n\n/** Derive params/query/body schemas from the handler's decorated arguments. */\nfunction describeArgs(controller: Function, key: string, storage: ClassValidatorStorage | undefined): RouteToolOptions {\n const args: Record<string, { index: number; data?: unknown }> =\n Reflect.getMetadata(ROUTE_ARGS_METADATA, controller, key) ?? {};\n const types: unknown[] = Reflect.getMetadata('design:paramtypes', controller.prototype, key) ?? [];\n const params: JsonSchema = { type: 'object', properties: {} };\n const query: JsonSchema = { type: 'object', properties: {}, required: [] };\n let body: JsonSchema | undefined;\n\n const schemaFor = (t: unknown): JsonSchema =>\n primitiveSchema(t) ?? (typeof t === 'function' ? dtoToJsonSchema(t, storage) : {});\n\n for (const [k, arg] of Object.entries(args)) {\n const paramtype = Number(k.split(':')[0]);\n const t = types[arg.index];\n const field = typeof arg.data === 'string' ? arg.data : undefined;\n if (paramtype === PARAMTYPE_PARAM && field) {\n params.properties![field] = primitiveSchema(t) ?? { type: 'string' };\n } else if (paramtype === PARAMTYPE_QUERY) {\n if (field) query.properties![field] = primitiveSchema(t) ?? { type: 'string' };\n else Object.assign(query, mergeObject(query, schemaFor(t)));\n } else if (paramtype === PARAMTYPE_BODY) {\n if (field) {\n body ??= { type: 'object', properties: {}, required: [] };\n body.properties![field] = schemaFor(t);\n (body.required as string[]).push(field);\n } else {\n body = mergeObject(body, schemaFor(t));\n }\n }\n }\n const out: RouteToolOptions = { params };\n if (Object.keys(query.properties!).length) out.query = query;\n if (body) out.body = body;\n return out;\n}\n\nfunction mergeObject(a: JsonSchema | undefined, b: JsonSchema): JsonSchema {\n if (!a) return b;\n return {\n type: 'object',\n properties: { ...a.properties, ...b.properties },\n required: [...(a.required ?? []), ...(b.required ?? [])],\n };\n}\n\nasync function loadClassValidator(): Promise<ClassValidatorStorage | undefined> {\n try {\n const cv = (await import('class-validator')) as { getMetadataStorage?: () => ClassValidatorStorage };\n return cv.getMetadataStorage?.();\n } catch {\n return undefined;\n }\n}\n\nfunction toArray<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nfunction toSnake(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\n// Decorators are applied by hand so this package builds without\n// `experimentalDecorators` / `emitDecoratorMetadata`.\nInjectable()(McpService);\nInject(DiscoveryService)(McpService, undefined as never, 0);\nInject(ApplicationConfig)(McpService, undefined as never, 1);\nInject(MCP_MODULE_OPTIONS)(McpService, undefined as never, 2);\nInject(HttpAdapterHost)(McpService, undefined as never, 3);\n\ninterface AnyReq {\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n ip?: string;\n raw?: IncomingMessage;\n socket?: unknown;\n}\ninterface AnyRes {\n // Express\n status?(code: number): AnyRes;\n set?(headers: Record<string, string>): AnyRes;\n // Fastify\n code?(code: number): AnyRes;\n headers?(headers: Record<string, string>): AnyRes;\n send(body?: unknown): unknown;\n end?(body?: unknown): unknown;\n}\n\nfunction createMcpController(options: Pick<McpModuleOptions, 'path' | 'guards' | 'decorators'>): Type<unknown> {\n class McpController {\n constructor(readonly mcp: McpService) {}\n\n async handle(req: AnyReq, res: AnyRes) {\n const nodeReq = (req.raw ?? req) as IncomingMessage;\n const headers = normalizeHeaders(req.headers);\n const ctx: ToolContext = { headers, clientIp: req.ip, raw: nodeReq };\n const out = await this.mcp.server.handleHttp({ method: req.method, headers, body: req.body }, ctx);\n if (typeof res.code === 'function') {\n res.code(out.status).headers!(out.headers).send(out.body);\n } else {\n res.status!(out.status).set!(out.headers);\n if (out.body === undefined) res.end!();\n else res.send(out.body);\n }\n }\n }\n const proto = McpController.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'handle')!;\n // Version-neutral so URI versioning never moves the endpoint to /v1/mcp.\n Controller({ path: options.path ?? 'mcp', version: VERSION_NEUTRAL })(McpController);\n Inject(McpService)(McpController, undefined as never, 0);\n All()(proto, 'handle', descriptor);\n Req()(proto, 'handle', 0);\n Res()(proto, 'handle', 1);\n if (options.guards?.length) UseGuards(...options.guards)(McpController);\n for (const decorate of options.decorators ?? []) decorate(McpController);\n return McpController;\n}\n\n/**\n * Adds an MCP endpoint to a NestJS app (Express or Fastify platform):\n *\n * @Module({ imports: [McpModule.forRoot({ name: 'shop-api' })] })\n *\n * Remember to exclude the MCP path from your global prefix if you want it at\n * `/mcp`: `app.setGlobalPrefix('api', { exclude: ['mcp'] })`.\n */\nexport class McpModule {\n static forRoot(options: McpModuleOptions): DynamicModule {\n return {\n module: McpModule,\n global: true,\n imports: [DiscoveryModule],\n controllers: [createMcpController(options)],\n providers: [{ provide: MCP_MODULE_OPTIONS, useValue: options }, McpService],\n exports: [McpService],\n };\n }\n\n /**\n * Resolve the options from other providers, e.g. `ConfigService`:\n *\n * McpModule.forRootAsync({\n * imports: [ConfigModule],\n * inject: [ConfigService],\n * useFactory: (config: ConfigService) => ({ name: config.get('APP_NAME') }),\n * })\n *\n * `path` and `guards` define the MCP controller, so they are passed directly.\n */\n static forRootAsync(options: McpModuleAsyncOptions): DynamicModule {\n return {\n module: McpModule,\n global: true,\n imports: [DiscoveryModule, ...(options.imports ?? [])],\n controllers: [createMcpController(options)],\n providers: [\n {\n provide: MCP_MODULE_OPTIONS,\n inject: options.inject ?? [],\n useFactory: async (...args: unknown[]) => ({\n ...(await options.useFactory(...args)),\n ...(options.path ? { path: options.path } : {}),\n }),\n },\n McpService,\n ],\n exports: [McpService],\n };\n }\n}\nModule({})(McpModule);\n","import type { Dispatcher, RouteRequest, ToolContext } from './types.js';\n\nexport function buildUrl(base: string, req: Pick<RouteRequest, 'path' | 'query'>): string {\n const url = new URL(base.replace(/\\/+$/, '') + req.path);\n for (const [k, v] of Object.entries(req.query)) {\n for (const item of Array.isArray(v) ? v : [v]) url.searchParams.append(k, item);\n }\n return url.toString();\n}\n\nexport interface FetchDispatcherOptions {\n /**\n * Base URL of the API, e.g. `http://127.0.0.1:3000` or `https://api.example.com/v1`.\n * A function lets adapters resolve it per call (e.g. from the local port).\n */\n baseUrl: string | ((ctx: ToolContext) => string);\n /** Custom fetch implementation. Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n /** Per-request timeout in ms. @default 30_000 */\n timeoutMs?: number;\n}\n\n/**\n * Dispatches tool calls as real HTTP requests. Used for loopback calls into the\n * host app (Express, Koa, NestJS) and for standalone gateways in front of any API.\n */\nexport function createFetchDispatcher(opts: FetchDispatcherOptions): Dispatcher {\n const doFetch = opts.fetch ?? fetch;\n return async (req, ctx) => {\n const base = typeof opts.baseUrl === 'function' ? opts.baseUrl(ctx) : opts.baseUrl;\n const res = await doFetch(buildUrl(base, req), {\n method: req.method,\n headers: req.headers,\n body:\n req.body === undefined || req.method === 'GET' || req.method === 'HEAD' ? undefined : JSON.stringify(req.body),\n signal: AbortSignal.timeout(opts.timeoutMs ?? 30_000),\n });\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => (headers[k] = v));\n return { status: res.status, headers, body: await res.text() };\n };\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { McpHttpResponse } from './server.js';\n\n/** Flatten Node's IncomingHttpHeaders into lower-cased single strings. */\nexport function normalizeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n}\n\n/** Read and return the raw body of a Node request (for frameworks without a JSON body parser). */\nexport function readRawBody(req: IncomingMessage, limit = 4 * 1024 * 1024): Promise<string> {\n return new Promise((resolve, reject) => {\n let size = 0;\n const chunks: Buffer[] = [];\n req.on('data', (c: Buffer) => {\n size += c.length;\n if (size > limit) {\n reject(new Error('Request body too large'));\n req.destroy();\n } else chunks.push(c);\n });\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\n/** Base URL that reaches the same server the MCP request arrived on. */\nexport function loopbackBaseUrl(req: IncomingMessage): string {\n const socket = req.socket as IncomingMessage['socket'] & {\n encrypted?: boolean;\n server?: { address(): { address: string } | string | null };\n };\n const port = socket.localPort;\n const encrypted = socket.encrypted;\n // Prefer the address the server is bound to: when it listens on all\n // interfaces this yields 127.0.0.1, so internal calls come from loopback\n // (which `trust proxy: 'loopback'` style settings rely on).\n const bound = socket.server?.address();\n let host = (typeof bound === 'object' && bound?.address) || socket.localAddress || '127.0.0.1';\n if (host.startsWith('::ffff:')) host = host.slice(7);\n if (host === '::' || host === '0.0.0.0') host = '127.0.0.1';\n if (host.includes(':')) host = `[${host}]`;\n return `${encrypted ? 'https' : 'http'}://${host}:${port}`;\n}\n\nexport function writeNodeResponse(res: ServerResponse, out: McpHttpResponse): void {\n res.statusCode = out.status;\n for (const [k, v] of Object.entries(out.headers)) res.setHeader(k, v);\n res.end(out.body);\n}\n","import type { ToolResult } from './types.js';\n\n/** A ToolResult: `{ content: [{ type: 'text', ... }, ...] }`. Plain data with a `content` array is not one. */\nexport function isToolResult(value: unknown): value is ToolResult {\n const content = (value as ToolResult | undefined)?.content;\n return (\n !!value &&\n typeof value === 'object' &&\n Array.isArray(content) &&\n content.length > 0 &&\n content.every((c) => !!c && typeof c === 'object' && typeof (c as { type?: unknown }).type === 'string')\n );\n}\n\n/** Turn a handler's return value (string, JSON value or ToolResult) into a ToolResult. */\nexport function toToolResult(value: unknown): ToolResult {\n if (isToolResult(value)) return value;\n if (typeof value === 'string') return { content: [{ type: 'text', text: value }] };\n const text = JSON.stringify(value ?? null);\n const result: ToolResult = { content: [{ type: 'text', text }] };\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result.structuredContent = value as Record<string, unknown>;\n }\n return result;\n}\n","import type { JsonSchema, McpToolDefinition, SchemaLike } from './types.js';\n\ninterface StandardSchemaV1 {\n '~standard': {\n validate?: (value: unknown) => unknown;\n jsonSchema?: { input?: (opts: { target: string }) => unknown };\n };\n}\n\nfunction isStandard(s: unknown): s is StandardSchemaV1 {\n return typeof s === 'object' && s !== null && '~standard' in s;\n}\n\n/** Convert any supported schema flavour into a plain JSON Schema object. */\nexport function toJsonSchema(schema: SchemaLike | undefined): JsonSchema | undefined {\n if (schema === undefined || schema === null) return undefined;\n let out: unknown;\n if (isStandard(schema) && typeof schema['~standard'].jsonSchema?.input === 'function') {\n out = schema['~standard'].jsonSchema.input({ target: 'draft-2020-12' });\n } else if (typeof (schema as { toJSONSchema?: unknown }).toJSONSchema === 'function') {\n out = (schema as { toJSONSchema(): unknown }).toJSONSchema();\n } else if (isStandard(schema)) {\n throw new Error(\n 'mcp-expose: this schema library does not support JSON Schema export. Pass a plain JSON Schema instead.',\n );\n } else {\n out = schema;\n }\n const { $schema: _ignored, ...rest } = out as JsonSchema;\n return rest;\n}\n\n/** Build a validator from a Standard Schema, if the input is one. */\nexport function toValidator(schema: SchemaLike | undefined): McpToolDefinition['validate'] {\n if (!isStandard(schema) || typeof schema['~standard'].validate !== 'function') return undefined;\n const validate = schema['~standard'].validate;\n return async (value) => {\n const result = (await validate(value)) as {\n value?: unknown;\n issues?: { message: string; path?: (PropertyKey | { key: PropertyKey })[] }[];\n };\n if (!result.issues) return { ok: true, value: result.value };\n const message = result.issues\n .map((i) => {\n const path = (i.path ?? []).map((p) => (typeof p === 'object' ? String(p.key) : String(p))).join('.');\n return path ? `${path}: ${i.message}` : i.message;\n })\n .join('; ');\n return { ok: false, message };\n };\n}\n\n/** Very small structural check used when no Standard Schema validator exists. */\nexport function checkRequired(schema: JsonSchema, args: Record<string, unknown>): string | undefined {\n const missing = (schema.required ?? []).filter((k) => args[k] === undefined);\n return missing.length ? `Missing required argument(s): ${missing.join(', ')}` : undefined;\n}\n","import { isToolResult, toToolResult } from './result.js';\nimport { checkRequired, toJsonSchema, toValidator } from './schema.js';\nimport type {\n Dispatcher,\n JsonSchema,\n McpServerOptions,\n McpToolDefinition,\n ResponseTransformContext,\n RouteRequest,\n RouteResponse,\n RouteToolResponse,\n RouteSpec,\n RouteToolOptions,\n ToolAnnotations,\n ToolContext,\n ToolResult,\n} from './types.js';\n\nexport const DEFAULT_FORWARD_HEADERS = ['authorization', 'cookie', 'x-api-key', 'accept-language'];\nconst BODY_METHODS = new Set(['POST', 'PUT', 'PATCH']);\nconst PARAM_RE = /:([A-Za-z0-9_]+)\\??|\\{([A-Za-z0-9_]+)\\}/g;\n\n/** Names of the path parameters in a route path (`/a/:id/{slug}` -> ['id', 'slug']). */\nexport function pathParams(path: string): string[] {\n return [...path.matchAll(PARAM_RE)].map((m) => (m[1] ?? m[2]) as string);\n}\n\n/**\n * Encode one path-parameter value. Rejects empty, `.` and `..` values: after URL\n * normalisation they would change which route is called (e.g. `/orders/../admin`),\n * letting an agent reach routes that were never exposed as tools.\n */\nfunction encodeSegment(name: string, value: unknown): string {\n const raw = String(value);\n if (raw === '' || raw === '.' || raw === '..') {\n throw new Error(`Invalid value for path parameter \"${name}\": ${JSON.stringify(raw)}`);\n }\n return encodeURIComponent(raw);\n}\n\n/** Replace path placeholders with URL-encoded values. Missing optional params drop their segment. */\nexport function interpolatePath(path: string, values: Record<string, unknown>): string {\n return path\n .replace(/\\/:([A-Za-z0-9_]+)\\?/g, (_, k: string) =>\n values[k] === undefined ? '' : `/${encodeSegment(k, values[k])}`,\n )\n .replace(PARAM_RE, (_, a?: string, b?: string) => {\n const k = (a ?? b) as string;\n return encodeSegment(k, values[k]);\n });\n}\n\n/** Join path segments, normalising slashes. */\nexport function joinPaths(...parts: (string | undefined)[]): string {\n const joined = parts\n .filter((p): p is string => !!p && p !== '/')\n .map((p) => p.replace(/^\\/+|\\/+$/g, ''))\n .filter(Boolean)\n .join('/');\n return `/${joined}`;\n}\n\n/** `GET /users/:id/orders` -> `get_users_by_id_orders` */\nexport function toolNameFromRoute(method: string, path: string): string {\n const segments = path\n .split('/')\n .filter(Boolean)\n .map((s) => {\n const m = /^(?::([A-Za-z0-9_]+)\\??|\\{([A-Za-z0-9_]+)\\})$/.exec(s);\n return m ? `by_${m[1] ?? m[2]}` : s;\n });\n return sanitizeToolName([method.toLowerCase(), ...segments].join('_'));\n}\n\nexport function sanitizeToolName(name: string): string {\n return name\n .replace(/[^A-Za-z0-9_-]+/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n .slice(0, 64);\n}\n\nfunction defaultAnnotations(method: string): ToolAnnotations {\n switch (method) {\n case 'GET':\n case 'HEAD':\n return { readOnlyHint: true, openWorldHint: false };\n case 'DELETE':\n return { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false };\n case 'PUT':\n return { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false };\n default:\n return { readOnlyHint: false, destructiveHint: false, openWorldHint: false };\n }\n}\n\ninterface ArgMapping {\n params: string[];\n query: Set<string>;\n body: Set<string>;\n /** Body schema is not an object: the whole body is passed under the `body` key. */\n wholeBody: boolean;\n bodyMethod: boolean;\n}\n\n/**\n * Build the flat input schema an agent sees, and remember which argument goes\n * to the path, query string or body when the tool is called.\n */\nexport function buildInputSchema(\n route: RouteSpec,\n opts: RouteToolOptions,\n): { schema: JsonSchema; mapping: ArgMapping } {\n const method = route.method.toUpperCase();\n const params = pathParams(route.path);\n const mapping: ArgMapping = {\n params,\n query: new Set(),\n body: new Set(),\n wholeBody: false,\n bodyMethod: BODY_METHODS.has(method),\n };\n\n if (opts.input) {\n const schema = toJsonSchema(opts.input) as JsonSchema;\n return { schema: { type: 'object', ...schema }, mapping };\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required = new Set<string>();\n\n const paramSchema = toJsonSchema(opts.params);\n for (const p of params) {\n properties[p] = paramSchema?.properties?.[p] ?? { type: 'string', description: `Path parameter \"${p}\"` };\n if (!route.path.includes(`:${p}?`)) required.add(p);\n }\n\n const querySchema = toJsonSchema(opts.query);\n for (const [k, v] of Object.entries(querySchema?.properties ?? {})) {\n properties[k] = v;\n mapping.query.add(k);\n }\n for (const k of querySchema?.required ?? []) required.add(k);\n\n const bodySchema = toJsonSchema(opts.body);\n if (bodySchema) {\n if (bodySchema.properties && (bodySchema.type === undefined || bodySchema.type === 'object')) {\n for (const [k, v] of Object.entries(bodySchema.properties)) {\n properties[k] = v;\n mapping.body.add(k);\n }\n for (const k of bodySchema.required ?? []) required.add(k);\n } else {\n properties.body = bodySchema;\n required.add('body');\n mapping.wholeBody = true;\n }\n }\n\n const schema: JsonSchema = { type: 'object', properties };\n if (required.size) schema.required = [...required];\n return { schema, mapping };\n}\n\nfunction splitArgs(args: Record<string, unknown>, mapping: ArgMapping) {\n const pathValues: Record<string, unknown> = {};\n const query: Record<string, string | string[]> = {};\n let body: Record<string, unknown> | unknown | undefined;\n\n for (const [k, v] of Object.entries(args)) {\n if (v === undefined) continue;\n if (mapping.params.includes(k)) {\n pathValues[k] = v;\n } else if (mapping.wholeBody && k === 'body') {\n body = v;\n } else if (mapping.query.has(k) || (!mapping.body.has(k) && !mapping.bodyMethod)) {\n query[k] = Array.isArray(v) ? v.map(String) : typeof v === 'object' && v !== null ? JSON.stringify(v) : String(v);\n } else {\n body = { ...((body as Record<string, unknown>) ?? {}), [k]: v };\n }\n }\n if (body === undefined && mapping.bodyMethod) body = {};\n return { pathValues, query, body };\n}\n\nexport function responseToResult(res: RouteResponse, maxChars: number): ToolResult {\n const text = truncate(res.body, maxChars);\n const isError = res.status >= 400;\n const result: ToolResult = {\n content: [{ type: 'text', text: isError ? `HTTP ${res.status}\\n${text}` : text || `HTTP ${res.status}` }],\n };\n if (isError) {\n result.isError = true;\n return result;\n }\n if ((res.headers['content-type'] ?? '').includes('json') && text === res.body) {\n try {\n const parsed = JSON.parse(res.body);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) result.structuredContent = parsed;\n } catch {\n /* not JSON after all */\n }\n }\n return result;\n}\n\nfunction safeDecode(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\nfunction truncate(text: string, maxChars: number): string {\n return text.length > maxChars ? `${text.slice(0, maxChars)}\\n…[truncated ${text.length - maxChars} chars]` : text;\n}\n\n/** Add the parsed JSON body (when the response is JSON) and an `ok` flag. */\nexport function toRouteToolResponse(res: RouteResponse): RouteToolResponse {\n let json: unknown;\n if ((res.headers['content-type'] ?? '').includes('json') && res.body) {\n try {\n json = JSON.parse(res.body);\n } catch {\n /* not JSON after all */\n }\n }\n return { ...res, json, ok: res.status < 400 };\n}\n\n/**\n * Turn what a `transformResponse` hook returned into the tool result. Plain values\n * keep the route's error status; ToolResults are used as they are. Text is capped\n * at `maxChars` either way.\n */\nfunction transformedResult(value: unknown, res: RouteToolResponse, maxChars: number): ToolResult {\n const explicit = isToolResult(value);\n const result = toToolResult(value);\n if (!explicit && !res.ok) {\n result.isError = true;\n delete result.structuredContent;\n }\n let truncated = false;\n const content = result.content.map((c) => {\n if (c.type !== 'text' || c.text.length <= maxChars) return c;\n truncated = true;\n return { ...c, text: truncate(c.text, maxChars) };\n });\n if (!truncated) return result;\n // The text no longer matches the structured data, so only keep the text.\n const { structuredContent: _dropped, ...rest } = result;\n return { ...rest, content };\n}\n\nexport function pickForwardHeaders(ctx: ToolContext, names: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const name of names) {\n const v = ctx.headers[name.toLowerCase()];\n if (v !== undefined) out[name.toLowerCase()] = v;\n }\n return out;\n}\n\n/**\n * Turn an HTTP route + options into an MCP tool whose handler calls the route\n * through `dispatch`, so auth guards, validation and rate limits all still apply.\n */\nexport function createRouteTool(\n route: RouteSpec,\n opts: RouteToolOptions,\n dispatch: Dispatcher,\n serverOpts: Pick<McpServerOptions, 'forwardHeaders' | 'maxResponseChars' | 'transformResponse'> = {},\n): McpToolDefinition {\n const method = route.method.toUpperCase();\n const name = sanitizeToolName(opts.name ?? toolNameFromRoute(method, route.path));\n const { schema, mapping } = buildInputSchema(route, opts);\n const forward = serverOpts.forwardHeaders ?? DEFAULT_FORWARD_HEADERS;\n const maxChars = serverOpts.maxResponseChars ?? 100_000;\n const transform = opts.transformResponse ?? serverOpts.transformResponse;\n\n return {\n name,\n title: opts.title,\n description: opts.description ?? `${method} ${route.path}`,\n inputSchema: schema,\n annotations: { ...defaultAnnotations(method), ...opts.annotations },\n scopes: opts.scopes,\n validate: toValidator(opts.input),\n async handler(args, ctx) {\n const missing = opts.input ? undefined : checkRequired(schema, args);\n if (missing) return { isError: true, content: [{ type: 'text', text: missing }] };\n\n const { pathValues, query, body } = splitArgs(args, mapping);\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...pickForwardHeaders(ctx, forward),\n ...opts.headers,\n 'x-mcp-tool': name,\n };\n if (ctx.clientIp) headers['x-forwarded-for'] = ctx.clientIp;\n if (body !== undefined) headers['content-type'] = 'application/json';\n\n let path: string;\n try {\n path = interpolatePath(route.path, pathValues);\n } catch (err) {\n return { isError: true, content: [{ type: 'text', text: (err as Error).message }] };\n }\n const request: RouteRequest = { method, path, query, body, headers };\n const res = await dispatch(request, ctx);\n if (!transform) return responseToResult(res, maxChars);\n\n const { 'content-type': _ct, ...baseHeaders } = headers;\n const hookCtx: ResponseTransformContext = {\n tool: name,\n args,\n request,\n toolContext: ctx,\n defaultResult: () => responseToResult(res, maxChars),\n async callRoute(r) {\n if (!r.path.startsWith('/')) {\n throw new Error(`callRoute: path must start with \"/\", got ${JSON.stringify(r.path)}`);\n }\n // Placeholders are encoded like tool arguments; dot segments are never allowed.\n const params = r.params ?? {};\n const missing = pathParams(r.path).filter((p) => params[p] === undefined && !r.path.includes(`:${p}?`));\n if (missing.length) throw new Error(`callRoute: missing params for ${r.path}: ${missing.join(', ')}`);\n const subPath = interpolatePath(r.path, params);\n if (subPath.split('/').some((seg) => ['.', '..'].includes(safeDecode(seg)))) {\n throw new Error(`callRoute: path must not contain \".\" or \"..\" segments: ${JSON.stringify(subPath)}`);\n }\n const sub: RouteRequest = {\n method: (r.method ?? 'GET').toUpperCase(),\n path: subPath,\n query: r.query ?? {},\n body: r.body,\n headers: { ...baseHeaders, ...r.headers },\n };\n if (sub.body !== undefined) sub.headers['content-type'] = 'application/json';\n return toRouteToolResponse(await dispatch(sub, ctx));\n },\n };\n const response = toRouteToolResponse(res);\n const value = await transform(response, hookCtx);\n return value === undefined ? responseToResult(res, maxChars) : transformedResult(value, response, maxChars);\n },\n };\n}\n","/**\n * OAuth 2.1 support per the MCP authorization spec: the MCP endpoint acts as an\n * OAuth *resource server*. It publishes Protected Resource Metadata (RFC 9728),\n * answers unauthenticated requests with a `WWW-Authenticate` challenge that\n * tells the client where to log in, and checks bearer tokens with a verifier\n * you provide (see `jwtVerifier` / `introspectionVerifier` in `mcp-expose/oauth`).\n *\n * Runtime-agnostic: no `node:*` imports.\n */\n\n/** Who the access token belongs to and what it allows. Available to tools as `ctx.auth`. */\nexport interface AuthInfo {\n /** The raw access token. */\n token: string;\n /** Scopes granted to the token. */\n scopes: string[];\n /** Subject (user id), e.g. the JWT `sub` claim. */\n subject?: string;\n /** OAuth client the token was issued to. */\n clientId?: string;\n /** Expiry, in seconds since the epoch. Expired tokens are rejected. */\n expiresAt?: number;\n /** All claims / introspection fields. */\n claims?: Record<string, unknown>;\n}\n\nexport interface VerifyTokenContext {\n /** The canonical resource URL (`oauth.resource`). Tokens must be issued for it (audience). */\n resource: string;\n /** Lower-cased headers of the MCP request. */\n headers: Record<string, string>;\n}\n\n/**\n * Checks an access token. Return its AuthInfo, or `undefined` / throw when the\n * token is invalid. It MUST check that the token was issued for this server\n * (audience = `ctx.resource`), or tokens meant for other services would be accepted.\n */\nexport type TokenVerifier = (\n token: string,\n ctx: VerifyTokenContext,\n) => AuthInfo | undefined | null | Promise<AuthInfo | undefined | null>;\n\nexport interface OAuthOptions {\n /**\n * Canonical, public URL of the MCP endpoint, e.g. `https://api.example.com/mcp`.\n * Clients request tokens for this resource, and it must match the URL they connect to.\n */\n resource: string;\n /** Issuer URLs of the authorization servers that issue tokens for this server. */\n authorizationServers: string[];\n /** Checks bearer tokens. */\n verifyToken: TokenVerifier;\n /** Scopes every token needs to use the MCP endpoint at all. */\n requiredScopes?: string[];\n /** Scopes advertised in the metadata. @default requiredScopes plus every tool's `scopes` */\n scopesSupported?: string[];\n /** Human-readable name shown by clients. */\n resourceName?: string;\n /** URL of documentation for developers. */\n resourceDocumentation?: string;\n /** Extra fields merged into the Protected Resource Metadata document. */\n metadata?: Record<string, unknown>;\n}\n\nexport const PROTECTED_RESOURCE_WELL_KNOWN = '/.well-known/oauth-protected-resource';\n\n/**\n * Paths the metadata is served on, per RFC 9728: the well-known prefix with the\n * resource path appended (`/.well-known/oauth-protected-resource/mcp`), plus the\n * bare well-known path that older clients fall back to.\n */\nexport function protectedResourceMetadataPaths(resource: string): string[] {\n const pathname = new URL(resource).pathname.replace(/\\/+$/, '');\n return pathname\n ? [PROTECTED_RESOURCE_WELL_KNOWN + pathname, PROTECTED_RESOURCE_WELL_KNOWN]\n : [PROTECTED_RESOURCE_WELL_KNOWN];\n}\n\n/** Absolute URL of the metadata document, used in `WWW-Authenticate`. */\nexport function protectedResourceMetadataUrl(resource: string): string {\n return new URL(protectedResourceMetadataPaths(resource)[0] as string, resource).href;\n}\n\nexport function validateOAuthOptions(o: OAuthOptions): void {\n let url: URL;\n try {\n url = new URL(o.resource);\n } catch {\n throw new Error(`mcp-expose: oauth.resource must be an absolute URL, got ${JSON.stringify(o.resource)}`);\n }\n if (url.hash) throw new Error('mcp-expose: oauth.resource must not contain a fragment');\n if (!o.authorizationServers?.length) throw new Error('mcp-expose: oauth.authorizationServers must not be empty');\n if (typeof o.verifyToken !== 'function') throw new Error('mcp-expose: oauth.verifyToken is required');\n}\n\nconst quote = (v: string) => `\"${v.replace(/[\"\\\\]/g, '\\\\$&')}\"`;\n\n/** Build a `WWW-Authenticate: Bearer ...` challenge (RFC 6750 + RFC 9728). */\nexport function bearerChallenge(\n resource: string,\n params: { error?: string; errorDescription?: string; scope?: string[] } = {},\n): string {\n const parts: string[] = [];\n if (params.error) parts.push(`error=${quote(params.error)}`);\n if (params.errorDescription) parts.push(`error_description=${quote(params.errorDescription)}`);\n if (params.scope?.length) parts.push(`scope=${quote(params.scope.join(' '))}`);\n parts.push(`resource_metadata=${quote(protectedResourceMetadataUrl(resource))}`);\n return `Bearer ${parts.join(', ')}`;\n}\n\n/** Extract the token from `Authorization: Bearer <token>`. Tokens in the query string are never accepted. */\nexport function bearerToken(headers: Record<string, string>): string | undefined {\n const m = /^Bearer[ ]+([^\\s,]+)\\s*$/i.exec(headers.authorization ?? '');\n return m?.[1];\n}\n\nexport type AuthOutcome =\n | { ok: true; auth: AuthInfo }\n | { ok: false; status: 401 | 403; challenge: string; error: string; description: string };\n\n/** Authenticate one MCP request. */\nexport async function authenticate(o: OAuthOptions, headers: Record<string, string>): Promise<AuthOutcome> {\n const token = bearerToken(headers);\n if (!token) {\n // No credentials: a bare challenge pointing at the metadata starts the client's login flow.\n return {\n ok: false,\n status: 401,\n error: 'unauthorized',\n description: 'Authorization required',\n challenge: bearerChallenge(o.resource, { scope: o.requiredScopes }),\n };\n }\n\n let auth: AuthInfo | undefined | null;\n try {\n auth = await o.verifyToken(token, { resource: o.resource, headers });\n } catch {\n auth = undefined;\n }\n if (!auth) return deny(o, 401, 'invalid_token', 'The access token is invalid');\n if (auth.expiresAt !== undefined && auth.expiresAt * 1000 <= Date.now()) {\n return deny(o, 401, 'invalid_token', 'The access token has expired');\n }\n const missing = missingScopes(auth, o.requiredScopes);\n if (missing.length) {\n // Keep the scopes already granted in the challenge, so re-authorizing never drops access.\n const scope = [...new Set([...(auth.scopes ?? []), ...(o.requiredScopes ?? [])])];\n return deny(o, 403, 'insufficient_scope', `Missing scope: ${missing.join(' ')}`, scope);\n }\n return { ok: true, auth: { ...auth, scopes: auth.scopes ?? [] } };\n}\n\n/** A failed AuthOutcome with an RFC 6750 error challenge. */\nexport function deny(\n o: OAuthOptions,\n status: 401 | 403,\n error: string,\n description: string,\n scope?: string[],\n): AuthOutcome & { ok: false } {\n return {\n ok: false,\n status,\n error,\n description,\n challenge: bearerChallenge(o.resource, { error, errorDescription: description, scope }),\n };\n}\n\nexport function missingScopes(auth: AuthInfo | undefined, required: string[] | undefined): string[] {\n if (!required?.length) return [];\n const granted = new Set(auth?.scopes ?? []);\n return required.filter((s) => !granted.has(s));\n}\n\n/** Parse a space-separated `scope` string or an array of scopes. */\nexport function parseScopes(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String);\n if (typeof value === 'string') return value.split(' ').filter(Boolean);\n return [];\n}\n","import { authenticate, deny, missingScopes, protectedResourceMetadataPaths, validateOAuthOptions } from './oauth.js';\nimport type { McpServerOptions, McpToolDefinition, ToolContext, ToolResult } from './types.js';\n\nexport const SUPPORTED_PROTOCOL_VERSIONS = ['2025-11-25', '2025-06-18', '2025-03-26', '2024-11-05'];\nexport const LATEST_PROTOCOL_VERSION = SUPPORTED_PROTOCOL_VERSIONS[0] as string;\n\ntype JsonRpcId = string | number | null;\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id?: JsonRpcId;\n method: string;\n params?: Record<string, unknown>;\n}\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: JsonRpcId;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nconst PARSE_ERROR = -32700;\nconst INVALID_REQUEST = -32600;\nconst METHOD_NOT_FOUND = -32601;\nconst INVALID_PARAMS = -32602;\n\nconst ok = (id: JsonRpcId, result: unknown): JsonRpcResponse => ({ jsonrpc: '2.0', id, result });\nconst fail = (id: JsonRpcId, code: number, message: string): JsonRpcResponse => ({\n jsonrpc: '2.0',\n id,\n error: { code, message },\n});\n\n/** Minimal HTTP request/response shapes, so each adapter can bridge its own framework. */\nexport interface McpHttpRequest {\n method: string;\n headers: Record<string, string>;\n /** Parsed JSON body, or the raw string. */\n body: unknown;\n}\nexport interface McpHttpResponse {\n status: number;\n headers: Record<string, string>;\n body?: string;\n}\n\n/**\n * A stateless MCP server speaking the Streamable HTTP transport (JSON responses).\n * Holds the tool registry and answers JSON-RPC messages.\n */\nexport class McpServer {\n private readonly tools = new Map<string, McpToolDefinition>();\n private loaders: (() => void | Promise<void>)[] = [];\n\n constructor(readonly options: McpServerOptions) {\n if (options.oauth) validateOAuthOptions(options.oauth);\n }\n\n /** Register a tool. Throws on duplicate names. */\n addTool(tool: McpToolDefinition): this {\n if (this.tools.has(tool.name)) {\n throw new Error(`mcp-expose: duplicate tool name \"${tool.name}\". Set an explicit \\`name\\`.`);\n }\n this.tools.set(tool.name, tool);\n return this;\n }\n\n /** Register a function that adds tools lazily, right before the first MCP request is served. */\n onLoad(loader: () => void | Promise<void>): this {\n this.loaders.push(loader);\n return this;\n }\n\n async listTools(): Promise<McpToolDefinition[]> {\n await this.load();\n return [...this.tools.values()];\n }\n\n private async load() {\n if (!this.loaders.length) return;\n const loaders = this.loaders;\n this.loaders = [];\n for (const l of loaders) await l();\n }\n\n /** Handle one JSON-RPC message (or a batch). Returns null when no response is due. */\n async handleMessage(message: unknown, ctx: ToolContext): Promise<JsonRpcResponse | JsonRpcResponse[] | null> {\n if (Array.isArray(message)) {\n const results = (await Promise.all(message.map((m) => this.handleOne(m, ctx)))).filter(\n (r): r is JsonRpcResponse => r !== null,\n );\n return results.length ? results : null;\n }\n return this.handleOne(message, ctx);\n }\n\n private async handleOne(message: unknown, ctx: ToolContext): Promise<JsonRpcResponse | null> {\n const msg = message as Partial<JsonRpcRequest>;\n if (!msg || typeof msg !== 'object' || msg.jsonrpc !== '2.0') {\n return fail(null, INVALID_REQUEST, 'Invalid JSON-RPC message');\n }\n // Responses from the client or notifications: acknowledge, no reply.\n if (typeof msg.method !== 'string' || msg.id === undefined) return null;\n const id = msg.id;\n const params = msg.params ?? {};\n\n await this.load();\n switch (msg.method) {\n case 'initialize': {\n const requested = params.protocolVersion as string | undefined;\n const protocolVersion =\n requested && SUPPORTED_PROTOCOL_VERSIONS.includes(requested) ? requested : LATEST_PROTOCOL_VERSION;\n return ok(id, {\n protocolVersion,\n capabilities: { tools: { listChanged: false } },\n serverInfo: { name: this.options.name, version: this.options.version ?? '1.0.0' },\n ...(this.options.instructions ? { instructions: this.options.instructions } : {}),\n });\n }\n case 'ping':\n return ok(id, {});\n case 'tools/list':\n return ok(id, {\n tools: [...this.tools.values()].map((t) => ({\n name: t.name,\n ...(t.title ? { title: t.title } : {}),\n description: t.description,\n inputSchema: t.inputSchema,\n ...(t.annotations ? { annotations: t.annotations } : {}),\n })),\n });\n case 'tools/call': {\n const tool = this.tools.get(params.name as string);\n if (!tool) return fail(id, INVALID_PARAMS, `Unknown tool: ${String(params.name)}`);\n return ok(id, await this.callTool(tool, (params.arguments ?? {}) as Record<string, unknown>, ctx));\n }\n case 'resources/list':\n return ok(id, { resources: [] });\n case 'prompts/list':\n return ok(id, { prompts: [] });\n default:\n return fail(id, METHOD_NOT_FOUND, `Method not found: ${msg.method}`);\n }\n }\n\n private async callTool(\n tool: McpToolDefinition,\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n try {\n if (tool.validate) {\n const v = await tool.validate(args);\n if (!v.ok) return { isError: true, content: [{ type: 'text', text: `Invalid arguments: ${v.message}` }] };\n args = v.value as Record<string, unknown>;\n }\n return await tool.handler(args, ctx);\n } catch (err) {\n // Tool failures are reported in-band so the model can react to them.\n return { isError: true, content: [{ type: 'text', text: `Tool error: ${(err as Error).message}` }] };\n }\n }\n\n /** Check the Origin header (DNS rebinding protection). */\n isOriginAllowed(origin: string | undefined): boolean {\n if (!origin) return true;\n const allowed = this.options.allowedOrigins;\n if (allowed === '*') return true;\n return (allowed ?? []).includes(origin);\n }\n\n /**\n * Paths on which adapters serve the OAuth Protected Resource Metadata\n * (empty when `oauth` is not configured). They must be public: no auth middleware.\n */\n get oauthMetadataPaths(): string[] {\n return this.options.oauth ? protectedResourceMetadataPaths(this.options.oauth.resource) : [];\n }\n\n /** The OAuth Protected Resource Metadata document (RFC 9728). */\n async protectedResourceMetadata(): Promise<Record<string, unknown>> {\n const o = this.options.oauth;\n if (!o) throw new Error('mcp-expose: the oauth option is not configured');\n await this.load();\n const scopes = o.scopesSupported ?? [\n ...new Set([...(o.requiredScopes ?? []), ...[...this.tools.values()].flatMap((t) => t.scopes ?? [])]),\n ];\n return {\n resource: o.resource,\n authorization_servers: o.authorizationServers,\n ...(scopes.length ? { scopes_supported: scopes } : {}),\n bearer_methods_supported: ['header'],\n ...(o.resourceName ? { resource_name: o.resourceName } : {}),\n ...(o.resourceDocumentation ? { resource_documentation: o.resourceDocumentation } : {}),\n ...o.metadata,\n };\n }\n\n /** HTTP handler for the metadata paths. Public and CORS-enabled so browser-based clients can read it. */\n async handleMetadataHttp(req: Pick<McpHttpRequest, 'method'>): Promise<McpHttpResponse> {\n const cors = { 'access-control-allow-origin': '*', 'access-control-allow-methods': 'GET, OPTIONS' };\n const method = req.method.toUpperCase();\n if (!this.options.oauth) return { status: 404, headers: {} };\n if (method === 'OPTIONS') return { status: 204, headers: { ...cors, 'access-control-allow-headers': '*' } };\n if (method !== 'GET' && method !== 'HEAD') return { status: 405, headers: { allow: 'GET, OPTIONS' } };\n const body = JSON.stringify(await this.protectedResourceMetadata());\n return {\n status: 200,\n headers: { ...cors, 'content-type': 'application/json', 'cache-control': 'public, max-age=3600' },\n body: method === 'HEAD' ? undefined : body,\n };\n }\n\n /**\n * Framework-neutral Streamable HTTP handler. Adapters convert their request\n * into McpHttpRequest, call this, and write the McpHttpResponse back.\n */\n async handleHttp(req: McpHttpRequest, ctx: ToolContext): Promise<McpHttpResponse> {\n const json = { 'content-type': 'application/json' };\n if (!this.isOriginAllowed(req.headers.origin)) {\n return { status: 403, headers: json, body: JSON.stringify(fail(null, INVALID_REQUEST, 'Origin not allowed')) };\n }\n const oauth = this.options.oauth;\n if (oauth) {\n const outcome = await authenticate(oauth, req.headers);\n if (!outcome.ok) return authError(outcome);\n ctx = { ...ctx, auth: outcome.auth };\n }\n if (req.method.toUpperCase() !== 'POST') {\n // Stateless server: no standalone SSE stream and no sessions to delete.\n return { status: 405, headers: { allow: 'POST' } };\n }\n let body = req.body;\n if (typeof body === 'string' || body instanceof Uint8Array) {\n try {\n body = JSON.parse(typeof body === 'string' ? body : new TextDecoder().decode(body));\n } catch {\n return { status: 400, headers: json, body: JSON.stringify(fail(null, PARSE_ERROR, 'Parse error')) };\n }\n }\n if (oauth) {\n // Per-tool scopes: answer 403 so the client can ask the user for more access (step-up).\n await this.load();\n const calls = (Array.isArray(body) ? body : [body]) as Partial<JsonRpcRequest>[];\n for (const m of calls) {\n if (m?.method !== 'tools/call') continue;\n const tool = this.tools.get(m.params?.name as string);\n const missing = missingScopes(ctx.auth, tool?.scopes);\n if (missing.length) {\n // Include the scopes already granted, so re-authorizing never drops access the user gave before.\n const scope = [\n ...new Set([...(ctx.auth?.scopes ?? []), ...(oauth.requiredScopes ?? []), ...(tool?.scopes ?? [])]),\n ];\n return authError(\n deny(oauth, 403, 'insufficient_scope', `Tool \"${tool!.name}\" needs scope: ${missing.join(' ')}`, scope),\n );\n }\n }\n }\n const response = await this.handleMessage(body, ctx);\n if (response === null) return { status: 202, headers: {} };\n return { status: 200, headers: json, body: JSON.stringify(response) };\n }\n}\n\nfunction authError(o: { status: number; challenge: string; error: string; description: string }): McpHttpResponse {\n return {\n status: o.status,\n headers: { 'content-type': 'application/json', 'www-authenticate': o.challenge },\n body: JSON.stringify({ error: o.error, error_description: o.description }),\n };\n}\n","import type { JsonSchema } from '../core/types.js';\n\ninterface ValidationMetadata {\n type: string;\n name?: string;\n propertyName: string;\n constraints?: unknown[];\n each?: boolean;\n}\n\nexport interface ClassValidatorStorage {\n getTargetValidationMetadatas(\n target: Function,\n targetSchema: string,\n always: boolean,\n strictGroups: boolean,\n ): ValidationMetadata[];\n}\n\ndeclare const Reflect: { getMetadata?(key: string, target: object, prop?: string | symbol): unknown };\n\nconst PRIMITIVES = new Map<unknown, JsonSchema>([\n [String, { type: 'string' }],\n [Number, { type: 'number' }],\n [Boolean, { type: 'boolean' }],\n [Date, { type: 'string', format: 'date-time' }],\n [Array, { type: 'array' }],\n [Object, { type: 'object' }],\n]);\n\nexport function primitiveSchema(type: unknown): JsonSchema | undefined {\n const s = PRIMITIVES.get(type);\n return s ? { ...s } : undefined;\n}\n\n/** Apply one class-validator rule to a (property or `items`) schema. */\nfunction applyRule(s: JsonSchema, name: string, c: unknown[] = []): void {\n switch (name) {\n case 'isString':\n s.type = 'string';\n break;\n case 'isNumber':\n case 'isNumberString':\n s.type = name === 'isNumber' ? 'number' : 'string';\n break;\n case 'isInt':\n s.type = 'integer';\n break;\n case 'isBoolean':\n s.type = 'boolean';\n break;\n case 'isDate':\n case 'isDateString':\n case 'isISO8601':\n s.type = 'string';\n s.format = 'date-time';\n break;\n case 'isEmail':\n s.type = 'string';\n s.format = 'email';\n break;\n case 'isUrl':\n s.type = 'string';\n s.format = 'uri';\n break;\n case 'isUUID':\n s.type = 'string';\n s.format = 'uuid';\n break;\n case 'isPositive':\n s.exclusiveMinimum = 0;\n break;\n case 'isNegative':\n s.exclusiveMaximum = 0;\n break;\n case 'min':\n s.minimum = c[0];\n break;\n case 'max':\n s.maximum = c[0];\n break;\n case 'minLength':\n s.minLength = c[0];\n break;\n case 'maxLength':\n s.maxLength = c[0];\n break;\n case 'length':\n s.minLength = c[0];\n if (c[1] !== undefined) s.maxLength = c[1];\n break;\n case 'matches':\n if (c[0] instanceof RegExp) s.pattern = c[0].source;\n break;\n case 'isIn':\n s.enum = c[0] as unknown[];\n break;\n case 'isEnum':\n s.enum = (c[1] as unknown[]) ?? Object.values(c[0] as object);\n break;\n case 'isNotEmpty':\n if (s.type === 'string') s.minLength = Math.max(1, Number(s.minLength ?? 0));\n break;\n case 'isArray':\n s.type = 'array';\n break;\n case 'arrayMinSize':\n s.minItems = c[0];\n break;\n case 'arrayMaxSize':\n s.maxItems = c[0];\n break;\n case 'isObject':\n s.type = 'object';\n break;\n }\n}\n\n/**\n * Derive a JSON Schema from a class-validator DTO. Only used to *describe* the\n * tool to the agent: the real validation still happens in your ValidationPipe.\n */\nexport function dtoToJsonSchema(dto: Function, storage: ClassValidatorStorage | undefined, depth = 0): JsonSchema {\n const schema: JsonSchema = { type: 'object', properties: {} };\n if (!storage || depth > 5) return schema;\n const metas = storage.getTargetValidationMetadatas(dto, '', true, false);\n const properties: Record<string, JsonSchema> = {};\n const optional = new Set<string>();\n\n for (const m of metas) {\n const prop = (properties[m.propertyName] ??= initial(dto, m.propertyName));\n if (m.type === 'conditionalValidation' && m.name === 'isOptional') {\n optional.add(m.propertyName);\n } else if (m.type === 'nestedValidation') {\n const nestedType = Reflect.getMetadata?.('design:type', dto.prototype, m.propertyName);\n if (typeof nestedType === 'function' && !PRIMITIVES.has(nestedType)) {\n Object.assign(prop, dtoToJsonSchema(nestedType, storage, depth + 1));\n }\n } else if (m.type === 'customValidation' && m.name) {\n if (m.each) {\n prop.type = 'array';\n const items = (prop.items ??= {}) as JsonSchema;\n applyRule(items, m.name, m.constraints);\n } else {\n applyRule(prop, m.name, m.constraints);\n }\n }\n }\n\n schema.properties = properties;\n const required = Object.keys(properties).filter((p) => !optional.has(p));\n if (required.length) schema.required = required;\n return schema;\n}\n\nfunction initial(dto: Function, prop: string): JsonSchema {\n const designType = Reflect.getMetadata?.('design:type', dto.prototype, prop);\n const s: JsonSchema = primitiveSchema(designType) ?? {};\n // Pick up @nestjs/swagger @ApiProperty() descriptions/examples when present.\n const api = Reflect.getMetadata?.('swagger/apiModelProperties', dto.prototype, prop) as\n { description?: string; example?: unknown; enum?: unknown } | undefined;\n if (api?.description) s.description = api.description;\n if (api?.example !== undefined) s.examples = [api.example];\n if (Array.isArray(api?.enum)) s.enum = api.enum;\n return s;\n}\n"],"mappings":";;;;AAAA,SACEA,KACAC,YACAC,QACAC,YACAC,QACAC,KACAC,KACAC,aACAC,WACAC,uBAIK;AACP,SAASC,mBAAmBC,iBAAiBC,kBAAkBC,uBAAuB;;;ACb/E,SAASC,SAASC,MAAcC,KAAyC;AAC9E,QAAMC,MAAM,IAAIC,IAAIH,KAAKI,QAAQ,QAAQ,EAAA,IAAMH,IAAII,IAAI;AACvD,aAAW,CAACC,GAAGC,CAAAA,KAAMC,OAAOC,QAAQR,IAAIS,KAAK,GAAG;AAC9C,eAAWC,QAAQC,MAAMC,QAAQN,CAAAA,IAAKA,IAAI;MAACA;MAAIL,KAAIY,aAAaC,OAAOT,GAAGK,IAAAA;EAC5E;AACA,SAAOT,IAAIc,SAAQ;AACrB;AANgBjB;AAwBT,SAASkB,sBAAsBC,MAA4B;AAChE,QAAMC,UAAUD,KAAKE,SAASA;AAC9B,SAAO,OAAOnB,KAAKoB,QAAAA;AACjB,UAAMrB,OAAO,OAAOkB,KAAKI,YAAY,aAAaJ,KAAKI,QAAQD,GAAAA,IAAOH,KAAKI;AAC3E,UAAMC,MAAM,MAAMJ,QAAQpB,SAASC,MAAMC,GAAAA,GAAM;MAC7CuB,QAAQvB,IAAIuB;MACZC,SAASxB,IAAIwB;MACbC,MACEzB,IAAIyB,SAASC,UAAa1B,IAAIuB,WAAW,SAASvB,IAAIuB,WAAW,SAASG,SAAYC,KAAKC,UAAU5B,IAAIyB,IAAI;MAC/GI,QAAQC,YAAYC,QAAQd,KAAKe,aAAa,GAAA;IAChD,CAAA;AACA,UAAMR,UAAkC,CAAC;AACzCF,QAAIE,QAAQS,QAAQ,CAAC3B,GAAGD,MAAOmB,QAAQnB,CAAAA,IAAKC,CAAAA;AAC5C,WAAO;MAAE4B,QAAQZ,IAAIY;MAAQV;MAASC,MAAM,MAAMH,IAAIa,KAAI;IAAG;EAC/D;AACF;AAfgBnB;;;ACtBT,SAASoB,iBAAiBC,SAAsD;AACrF,QAAMC,MAA8B,CAAC;AACrC,aAAW,CAACC,GAAGC,CAAAA,KAAMC,OAAOC,QAAQL,OAAAA,GAAU;AAC5C,QAAIG,MAAMG,OAAW;AACrBL,QAAIC,EAAEK,YAAW,CAAA,IAAMC,MAAMC,QAAQN,CAAAA,IAAKA,EAAEO,KAAK,IAAA,IAAQC,OAAOR,CAAAA;EAClE;AACA,SAAOF;AACT;AAPgBF;AA2BT,SAASa,gBAAgBC,KAAoB;AAClD,QAAMC,SAASD,IAAIC;AAInB,QAAMC,OAAOD,OAAOE;AACpB,QAAMC,YAAYH,OAAOG;AAIzB,QAAMC,QAAQJ,OAAOK,QAAQC,QAAAA;AAC7B,MAAIC,OAAQ,OAAOH,UAAU,YAAYA,OAAOE,WAAYN,OAAOQ,gBAAgB;AACnF,MAAID,KAAKE,WAAW,SAAA,EAAYF,QAAOA,KAAKG,MAAM,CAAA;AAClD,MAAIH,SAAS,QAAQA,SAAS,UAAWA,QAAO;AAChD,MAAIA,KAAKI,SAAS,GAAA,EAAMJ,QAAO,IAAIA,IAAAA;AACnC,SAAO,GAAGJ,YAAY,UAAU,MAAA,MAAYI,IAAAA,IAAQN,IAAAA;AACtD;AAhBgBH;;;AC5BT,SAASc,aAAaC,OAAc;AACzC,QAAMC,UAAWD,OAAkCC;AACnD,SACE,CAAC,CAACD,SACF,OAAOA,UAAU,YACjBE,MAAMC,QAAQF,OAAAA,KACdA,QAAQG,SAAS,KACjBH,QAAQI,MAAM,CAACC,MAAM,CAAC,CAACA,KAAK,OAAOA,MAAM,YAAY,OAAQA,EAAyBC,SAAS,QAAA;AAEnG;AATgBR;AAYT,SAASS,aAAaR,OAAc;AACzC,MAAID,aAAaC,KAAAA,EAAQ,QAAOA;AAChC,MAAI,OAAOA,UAAU,SAAU,QAAO;IAAEC,SAAS;MAAC;QAAEM,MAAM;QAAQE,MAAMT;MAAM;;EAAG;AACjF,QAAMS,OAAOC,KAAKC,UAAUX,SAAS,IAAA;AACrC,QAAMY,SAAqB;IAAEX,SAAS;MAAC;QAAEM,MAAM;QAAQE;MAAK;;EAAG;AAC/D,MAAIT,SAAS,OAAOA,UAAU,YAAY,CAACE,MAAMC,QAAQH,KAAAA,GAAQ;AAC/DY,WAAOC,oBAAoBb;EAC7B;AACA,SAAOY;AACT;AATgBJ;;;ACNhB,SAASM,WAAWC,GAAU;AAC5B,SAAO,OAAOA,MAAM,YAAYA,MAAM,QAAQ,eAAeA;AAC/D;AAFSD;AAKF,SAASE,aAAaC,QAA8B;AACzD,MAAIA,WAAWC,UAAaD,WAAW,KAAM,QAAOC;AACpD,MAAIC;AACJ,MAAIL,WAAWG,MAAAA,KAAW,OAAOA,OAAO,WAAA,EAAaG,YAAYC,UAAU,YAAY;AACrFF,UAAMF,OAAO,WAAA,EAAaG,WAAWC,MAAM;MAAEC,QAAQ;IAAgB,CAAA;EACvE,WAAW,OAAQL,OAAsCM,iBAAiB,YAAY;AACpFJ,UAAOF,OAAuCM,aAAY;EAC5D,WAAWT,WAAWG,MAAAA,GAAS;AAC7B,UAAM,IAAIO,MACR,wGAAA;EAEJ,OAAO;AACLL,UAAMF;EACR;AACA,QAAM,EAAEQ,SAASC,UAAU,GAAGC,KAAAA,IAASR;AACvC,SAAOQ;AACT;AAhBgBX;AAmBT,SAASY,YAAYX,QAA8B;AACxD,MAAI,CAACH,WAAWG,MAAAA,KAAW,OAAOA,OAAO,WAAA,EAAaY,aAAa,WAAY,QAAOX;AACtF,QAAMW,WAAWZ,OAAO,WAAA,EAAaY;AACrC,SAAO,OAAOC,UAAAA;AACZ,UAAMC,SAAU,MAAMF,SAASC,KAAAA;AAI/B,QAAI,CAACC,OAAOC,OAAQ,QAAO;MAAEC,IAAI;MAAMH,OAAOC,OAAOD;IAAM;AAC3D,UAAMI,UAAUH,OAAOC,OACpBG,IAAI,CAACC,MAAAA;AACJ,YAAMC,QAAQD,EAAEC,QAAQ,CAAA,GAAIF,IAAI,CAACG,MAAO,OAAOA,MAAM,WAAWC,OAAOD,EAAEE,GAAG,IAAID,OAAOD,CAAAA,CAAAA,EAAKG,KAAK,GAAA;AACjG,aAAOJ,OAAO,GAAGA,IAAAA,KAASD,EAAEF,OAAO,KAAKE,EAAEF;IAC5C,CAAA,EACCO,KAAK,IAAA;AACR,WAAO;MAAER,IAAI;MAAOC;IAAQ;EAC9B;AACF;AAjBgBN;AAoBT,SAASc,cAAczB,QAAoB0B,MAA6B;AAC7E,QAAMC,WAAW3B,OAAO4B,YAAY,CAAA,GAAIC,OAAO,CAACC,MAAMJ,KAAKI,CAAAA,MAAO7B,MAAAA;AAClE,SAAO0B,QAAQI,SAAS,iCAAiCJ,QAAQH,KAAK,IAAA,CAAA,KAAUvB;AAClF;AAHgBwB;;;ACnCT,IAAMO,0BAA0B;EAAC;EAAiB;EAAU;EAAa;;AAChF,IAAMC,eAAe,oBAAIC,IAAI;EAAC;EAAQ;EAAO;CAAQ;AACrD,IAAMC,WAAW;AAGV,SAASC,WAAWC,MAAY;AACrC,SAAO;OAAIA,KAAKC,SAASH,QAAAA;IAAWI,IAAI,CAACC,MAAOA,EAAE,CAAA,KAAMA,EAAE,CAAA,CAAE;AAC9D;AAFgBJ;AAShB,SAASK,cAAcC,MAAcC,OAAc;AACjD,QAAMC,MAAMC,OAAOF,KAAAA;AACnB,MAAIC,QAAQ,MAAMA,QAAQ,OAAOA,QAAQ,MAAM;AAC7C,UAAM,IAAIE,MAAM,qCAAqCJ,IAAAA,MAAUK,KAAKC,UAAUJ,GAAAA,CAAAA,EAAM;EACtF;AACA,SAAOK,mBAAmBL,GAAAA;AAC5B;AANSH;AASF,SAASS,gBAAgBb,MAAcc,QAA+B;AAC3E,SAAOd,KACJe,QAAQ,yBAAyB,CAACC,GAAGC,MACpCH,OAAOG,CAAAA,MAAOC,SAAY,KAAK,IAAId,cAAca,GAAGH,OAAOG,CAAAA,CAAE,CAAA,EAAG,EAEjEF,QAAQjB,UAAU,CAACkB,GAAGG,GAAYC,MAAAA;AACjC,UAAMH,IAAKE,KAAKC;AAChB,WAAOhB,cAAca,GAAGH,OAAOG,CAAAA,CAAE;EACnC,CAAA;AACJ;AATgBJ;AAYT,SAASQ,aAAaC,OAA6B;AACxD,QAAMC,SAASD,MACZE,OAAO,CAACC,MAAmB,CAAC,CAACA,KAAKA,MAAM,GAAA,EACxCvB,IAAI,CAACuB,MAAMA,EAAEV,QAAQ,cAAc,EAAA,CAAA,EACnCS,OAAOE,OAAAA,EACPC,KAAK,GAAA;AACR,SAAO,IAAIJ,MAAAA;AACb;AAPgBF;AAUT,SAASO,kBAAkBC,QAAgB7B,MAAY;AAC5D,QAAM8B,WAAW9B,KACd+B,MAAM,GAAA,EACNP,OAAOE,OAAAA,EACPxB,IAAI,CAAC8B,MAAAA;AACJ,UAAM7B,IAAI,gDAAgD8B,KAAKD,CAAAA;AAC/D,WAAO7B,IAAI,MAAMA,EAAE,CAAA,KAAMA,EAAE,CAAA,CAAE,KAAK6B;EACpC,CAAA;AACF,SAAOE,iBAAiB;IAACL,OAAOM,YAAW;OAAOL;IAAUH,KAAK,GAAA,CAAA;AACnE;AATgBC;AAWT,SAASM,iBAAiB7B,MAAY;AAC3C,SAAOA,KACJU,QAAQ,oBAAoB,GAAA,EAC5BA,QAAQ,OAAO,GAAA,EACfA,QAAQ,UAAU,EAAA,EAClBqB,MAAM,GAAG,EAAA;AACd;AANgBF;AAQhB,SAASG,mBAAmBR,QAAc;AACxC,UAAQA,QAAAA;IACN,KAAK;IACL,KAAK;AACH,aAAO;QAAES,cAAc;QAAMC,eAAe;MAAM;IACpD,KAAK;AACH,aAAO;QAAED,cAAc;QAAOE,iBAAiB;QAAMC,gBAAgB;QAAMF,eAAe;MAAM;IAClG,KAAK;AACH,aAAO;QAAED,cAAc;QAAOE,iBAAiB;QAAOC,gBAAgB;QAAMF,eAAe;MAAM;IACnG;AACE,aAAO;QAAED,cAAc;QAAOE,iBAAiB;QAAOD,eAAe;MAAM;EAC/E;AACF;AAZSF;AA2BF,SAASK,iBACdC,OACAC,MAAsB;AAEtB,QAAMf,SAASc,MAAMd,OAAOgB,YAAW;AACvC,QAAMC,SAAS/C,WAAW4C,MAAM3C,IAAI;AACpC,QAAM+C,UAAsB;IAC1BD;IACAE,OAAO,oBAAInD,IAAAA;IACXoD,MAAM,oBAAIpD,IAAAA;IACVqD,WAAW;IACXC,YAAYvD,aAAawD,IAAIvB,MAAAA;EAC/B;AAEA,MAAIe,KAAKS,OAAO;AACd,UAAMC,UAASC,aAAaX,KAAKS,KAAK;AACtC,WAAO;MAAEC,QAAQ;QAAEE,MAAM;QAAU,GAAGF;MAAO;MAAGP;IAAQ;EAC1D;AAEA,QAAMU,aAAyC,CAAC;AAChD,QAAMC,WAAW,oBAAI7D,IAAAA;AAErB,QAAM8D,cAAcJ,aAAaX,KAAKE,MAAM;AAC5C,aAAWrB,KAAKqB,QAAQ;AACtBW,eAAWhC,CAAAA,IAAKkC,aAAaF,aAAahC,CAAAA,KAAM;MAAE+B,MAAM;MAAUI,aAAa,mBAAmBnC,CAAAA;IAAK;AACvG,QAAI,CAACkB,MAAM3C,KAAK6D,SAAS,IAAIpC,CAAAA,GAAI,EAAGiC,UAASI,IAAIrC,CAAAA;EACnD;AAEA,QAAMsC,cAAcR,aAAaX,KAAKI,KAAK;AAC3C,aAAW,CAAC/B,GAAG+C,CAAAA,KAAMC,OAAOC,QAAQH,aAAaN,cAAc,CAAC,CAAA,GAAI;AAClEA,eAAWxC,CAAAA,IAAK+C;AAChBjB,YAAQC,MAAMc,IAAI7C,CAAAA;EACpB;AACA,aAAWA,KAAK8C,aAAaL,YAAY,CAAA,EAAIA,UAASI,IAAI7C,CAAAA;AAE1D,QAAMkD,aAAaZ,aAAaX,KAAKK,IAAI;AACzC,MAAIkB,YAAY;AACd,QAAIA,WAAWV,eAAeU,WAAWX,SAAStC,UAAaiD,WAAWX,SAAS,WAAW;AAC5F,iBAAW,CAACvC,GAAG+C,CAAAA,KAAMC,OAAOC,QAAQC,WAAWV,UAAU,GAAG;AAC1DA,mBAAWxC,CAAAA,IAAK+C;AAChBjB,gBAAQE,KAAKa,IAAI7C,CAAAA;MACnB;AACA,iBAAWA,KAAKkD,WAAWT,YAAY,CAAA,EAAIA,UAASI,IAAI7C,CAAAA;IAC1D,OAAO;AACLwC,iBAAWR,OAAOkB;AAClBT,eAASI,IAAI,MAAA;AACbf,cAAQG,YAAY;IACtB;EACF;AAEA,QAAMI,SAAqB;IAAEE,MAAM;IAAUC;EAAW;AACxD,MAAIC,SAASU,KAAMd,QAAOI,WAAW;OAAIA;;AACzC,SAAO;IAAEJ;IAAQP;EAAQ;AAC3B;AArDgBL;AAuDhB,SAAS2B,UAAUC,MAA+BvB,SAAmB;AACnE,QAAMwB,aAAsC,CAAC;AAC7C,QAAMvB,QAA2C,CAAC;AAClD,MAAIC;AAEJ,aAAW,CAAChC,GAAG+C,CAAAA,KAAMC,OAAOC,QAAQI,IAAAA,GAAO;AACzC,QAAIN,MAAM9C,OAAW;AACrB,QAAI6B,QAAQD,OAAOe,SAAS5C,CAAAA,GAAI;AAC9BsD,iBAAWtD,CAAAA,IAAK+C;IAClB,WAAWjB,QAAQG,aAAajC,MAAM,QAAQ;AAC5CgC,aAAOe;IACT,WAAWjB,QAAQC,MAAMI,IAAInC,CAAAA,KAAO,CAAC8B,QAAQE,KAAKG,IAAInC,CAAAA,KAAM,CAAC8B,QAAQI,YAAa;AAChFH,YAAM/B,CAAAA,IAAKuD,MAAMC,QAAQT,CAAAA,IAAKA,EAAE9D,IAAIM,MAAAA,IAAU,OAAOwD,MAAM,YAAYA,MAAM,OAAOtD,KAAKC,UAAUqD,CAAAA,IAAKxD,OAAOwD,CAAAA;IACjH,OAAO;AACLf,aAAO;QAAE,GAAKA,QAAoC,CAAC;QAAI,CAAChC,CAAAA,GAAI+C;MAAE;IAChE;EACF;AACA,MAAIf,SAAS/B,UAAa6B,QAAQI,WAAYF,QAAO,CAAC;AACtD,SAAO;IAAEsB;IAAYvB;IAAOC;EAAK;AACnC;AAnBSoB;AAqBF,SAASK,iBAAiBC,KAAoBC,UAAgB;AACnE,QAAMC,OAAOC,SAASH,IAAI1B,MAAM2B,QAAAA;AAChC,QAAMG,UAAUJ,IAAIK,UAAU;AAC9B,QAAMC,SAAqB;IACzBC,SAAS;MAAC;QAAE1B,MAAM;QAAQqB,MAAME,UAAU,QAAQJ,IAAIK,MAAM;EAAKH,IAAAA,KAASA,QAAQ,QAAQF,IAAIK,MAAM;MAAG;;EACzG;AACA,MAAID,SAAS;AACXE,WAAOF,UAAU;AACjB,WAAOE;EACT;AACA,OAAKN,IAAIQ,QAAQ,cAAA,KAAmB,IAAItB,SAAS,MAAA,KAAWgB,SAASF,IAAI1B,MAAM;AAC7E,QAAI;AACF,YAAMmC,SAAS1E,KAAK2E,MAAMV,IAAI1B,IAAI;AAClC,UAAImC,UAAU,OAAOA,WAAW,YAAY,CAACZ,MAAMC,QAAQW,MAAAA,EAASH,QAAOK,oBAAoBF;IACjG,QAAQ;IAER;EACF;AACA,SAAOH;AACT;AAnBgBP;AAqBhB,SAASa,WAAWC,SAAe;AACjC,MAAI;AACF,WAAOC,mBAAmBD,OAAAA;EAC5B,QAAQ;AACN,WAAOA;EACT;AACF;AANSD;AAQT,SAAST,SAASD,MAAcD,UAAgB;AAC9C,SAAOC,KAAKa,SAASd,WAAW,GAAGC,KAAKzC,MAAM,GAAGwC,QAAAA,CAAAA;mBAA0BC,KAAKa,SAASd,QAAAA,YAAoBC;AAC/G;AAFSC;AAKF,SAASa,oBAAoBhB,KAAkB;AACpD,MAAIiB;AACJ,OAAKjB,IAAIQ,QAAQ,cAAA,KAAmB,IAAItB,SAAS,MAAA,KAAWc,IAAI1B,MAAM;AACpE,QAAI;AACF2C,aAAOlF,KAAK2E,MAAMV,IAAI1B,IAAI;IAC5B,QAAQ;IAER;EACF;AACA,SAAO;IAAE,GAAG0B;IAAKiB;IAAMC,IAAIlB,IAAIK,SAAS;EAAI;AAC9C;AAVgBW;AAiBhB,SAASG,kBAAkBxF,OAAgBqE,KAAwBC,UAAgB;AACjF,QAAMmB,WAAWC,aAAa1F,KAAAA;AAC9B,QAAM2E,SAASgB,aAAa3F,KAAAA;AAC5B,MAAI,CAACyF,YAAY,CAACpB,IAAIkB,IAAI;AACxBZ,WAAOF,UAAU;AACjB,WAAOE,OAAOK;EAChB;AACA,MAAIY,YAAY;AAChB,QAAMhB,UAAUD,OAAOC,QAAQhF,IAAI,CAACiG,MAAAA;AAClC,QAAIA,EAAE3C,SAAS,UAAU2C,EAAEtB,KAAKa,UAAUd,SAAU,QAAOuB;AAC3DD,gBAAY;AACZ,WAAO;MAAE,GAAGC;MAAGtB,MAAMC,SAASqB,EAAEtB,MAAMD,QAAAA;IAAU;EAClD,CAAA;AACA,MAAI,CAACsB,UAAW,QAAOjB;AAEvB,QAAM,EAAEK,mBAAmBc,UAAU,GAAGC,KAAAA,IAASpB;AACjD,SAAO;IAAE,GAAGoB;IAAMnB;EAAQ;AAC5B;AAjBSY;AAmBF,SAASQ,mBAAmBC,KAAkBC,OAAe;AAClE,QAAMC,MAA8B,CAAC;AACrC,aAAWpG,QAAQmG,OAAO;AACxB,UAAMxC,IAAIuC,IAAIpB,QAAQ9E,KAAK8B,YAAW,CAAA;AACtC,QAAI6B,MAAM9C,OAAWuF,KAAIpG,KAAK8B,YAAW,CAAA,IAAM6B;EACjD;AACA,SAAOyC;AACT;AAPgBH;AAaT,SAASI,gBACd/D,OACAC,MACA+D,UACAC,aAAkG,CAAC,GAAC;AAEpG,QAAM/E,SAASc,MAAMd,OAAOgB,YAAW;AACvC,QAAMxC,OAAO6B,iBAAiBU,KAAKvC,QAAQuB,kBAAkBC,QAAQc,MAAM3C,IAAI,CAAA;AAC/E,QAAM,EAAEsD,QAAQP,QAAO,IAAKL,iBAAiBC,OAAOC,IAAAA;AACpD,QAAMiE,UAAUD,WAAWE,kBAAkBnH;AAC7C,QAAMiF,WAAWgC,WAAWG,oBAAoB;AAChD,QAAMC,YAAYpE,KAAKqE,qBAAqBL,WAAWK;AAEvD,SAAO;IACL5G;IACA6G,OAAOtE,KAAKsE;IACZtD,aAAahB,KAAKgB,eAAe,GAAG/B,MAAAA,IAAUc,MAAM3C,IAAI;IACxDmH,aAAa7D;IACb8D,aAAa;MAAE,GAAG/E,mBAAmBR,MAAAA;MAAS,GAAGe,KAAKwE;IAAY;IAClEC,QAAQzE,KAAKyE;IACbC,UAAUC,YAAY3E,KAAKS,KAAK;IAChC,MAAMmE,QAAQlD,MAAMiC,KAAG;AACrB,YAAMkB,UAAU7E,KAAKS,QAAQnC,SAAYwG,cAAcpE,QAAQgB,IAAAA;AAC/D,UAAImD,QAAS,QAAO;QAAE1C,SAAS;QAAMG,SAAS;UAAC;YAAE1B,MAAM;YAAQqB,MAAM4C;UAAQ;;MAAG;AAEhF,YAAM,EAAElD,YAAYvB,OAAOC,KAAI,IAAKoB,UAAUC,MAAMvB,OAAAA;AACpD,YAAMoC,UAAkC;QACtCwC,QAAQ;QACR,GAAGrB,mBAAmBC,KAAKM,OAAAA;QAC3B,GAAGjE,KAAKuC;QACR,cAAc9E;MAChB;AACA,UAAIkG,IAAIqB,SAAUzC,SAAQ,iBAAA,IAAqBoB,IAAIqB;AACnD,UAAI3E,SAAS/B,OAAWiE,SAAQ,cAAA,IAAkB;AAElD,UAAInF;AACJ,UAAI;AACFA,eAAOa,gBAAgB8B,MAAM3C,MAAMuE,UAAAA;MACrC,SAASsD,KAAK;AACZ,eAAO;UAAE9C,SAAS;UAAMG,SAAS;YAAC;cAAE1B,MAAM;cAAQqB,MAAOgD,IAAcC;YAAQ;;QAAG;MACpF;AACA,YAAMC,UAAwB;QAAElG;QAAQ7B;QAAMgD;QAAOC;QAAMkC;MAAQ;AACnE,YAAMR,MAAM,MAAMgC,SAASoB,SAASxB,GAAAA;AACpC,UAAI,CAACS,UAAW,QAAOtC,iBAAiBC,KAAKC,QAAAA;AAE7C,YAAM,EAAE,gBAAgBoD,KAAK,GAAGC,YAAAA,IAAgB9C;AAChD,YAAM+C,UAAoC;QACxCC,MAAM9H;QACNiE;QACAyD;QACAK,aAAa7B;QACb8B,eAAe,6BAAM3D,iBAAiBC,KAAKC,QAAAA,GAA5B;QACf,MAAM0D,UAAUC,GAAC;AACf,cAAI,CAACA,EAAEvI,KAAKwI,WAAW,GAAA,GAAM;AAC3B,kBAAM,IAAI/H,MAAM,4CAA4CC,KAAKC,UAAU4H,EAAEvI,IAAI,CAAA,EAAG;UACtF;AAEA,gBAAM8C,SAASyF,EAAEzF,UAAU,CAAC;AAC5B,gBAAM2E,WAAU1H,WAAWwI,EAAEvI,IAAI,EAAEwB,OAAO,CAACC,MAAMqB,OAAOrB,CAAAA,MAAOP,UAAa,CAACqH,EAAEvI,KAAK6D,SAAS,IAAIpC,CAAAA,GAAI,CAAA;AACrG,cAAIgG,SAAQ/B,OAAQ,OAAM,IAAIjF,MAAM,iCAAiC8H,EAAEvI,IAAI,KAAKyH,SAAQ9F,KAAK,IAAA,CAAA,EAAO;AACpG,gBAAM8G,UAAU5H,gBAAgB0H,EAAEvI,MAAM8C,MAAAA;AACxC,cAAI2F,QAAQ1G,MAAM,GAAA,EAAK2G,KAAK,CAACC,QAAQ;YAAC;YAAK;YAAM9E,SAAS0B,WAAWoD,GAAAA,CAAAA,CAAAA,GAAQ;AAC3E,kBAAM,IAAIlI,MAAM,0DAA0DC,KAAKC,UAAU8H,OAAAA,CAAAA,EAAU;UACrG;AACA,gBAAMG,MAAoB;YACxB/G,SAAS0G,EAAE1G,UAAU,OAAOgB,YAAW;YACvC7C,MAAMyI;YACNzF,OAAOuF,EAAEvF,SAAS,CAAC;YACnBC,MAAMsF,EAAEtF;YACRkC,SAAS;cAAE,GAAG8C;cAAa,GAAGM,EAAEpD;YAAQ;UAC1C;AACA,cAAIyD,IAAI3F,SAAS/B,OAAW0H,KAAIzD,QAAQ,cAAA,IAAkB;AAC1D,iBAAOQ,oBAAoB,MAAMgB,SAASiC,KAAKrC,GAAAA,CAAAA;QACjD;MACF;AACA,YAAMsC,WAAWlD,oBAAoBhB,GAAAA;AACrC,YAAMrE,QAAQ,MAAM0G,UAAU6B,UAAUX,OAAAA;AACxC,aAAO5H,UAAUY,SAAYwD,iBAAiBC,KAAKC,QAAAA,IAAYkB,kBAAkBxF,OAAOuI,UAAUjE,QAAAA;IACpG;EACF;AACF;AAhFgB8B;;;AC3MT,IAAMoC,gCAAgC;AAOtC,SAASC,+BAA+BC,UAAgB;AAC7D,QAAMC,WAAW,IAAIC,IAAIF,QAAAA,EAAUC,SAASE,QAAQ,QAAQ,EAAA;AAC5D,SAAOF,WACH;IAACH,gCAAgCG;IAAUH;MAC3C;IAACA;;AACP;AALgBC;AAQT,SAASK,6BAA6BJ,UAAgB;AAC3D,SAAO,IAAIE,IAAIH,+BAA+BC,QAAAA,EAAU,CAAA,GAAcA,QAAAA,EAAUK;AAClF;AAFgBD;AAIT,SAASE,qBAAqBC,GAAe;AAClD,MAAIC;AACJ,MAAI;AACFA,UAAM,IAAIN,IAAIK,EAAEP,QAAQ;EAC1B,QAAQ;AACN,UAAM,IAAIS,MAAM,2DAA2DC,KAAKC,UAAUJ,EAAEP,QAAQ,CAAA,EAAG;EACzG;AACA,MAAIQ,IAAII,KAAM,OAAM,IAAIH,MAAM,wDAAA;AAC9B,MAAI,CAACF,EAAEM,sBAAsBC,OAAQ,OAAM,IAAIL,MAAM,0DAAA;AACrD,MAAI,OAAOF,EAAEQ,gBAAgB,WAAY,OAAM,IAAIN,MAAM,2CAAA;AAC3D;AAVgBH;AAYhB,IAAMU,QAAQ,wBAACC,MAAc,IAAIA,EAAEd,QAAQ,UAAU,MAAA,CAAA,KAAvC;AAGP,SAASe,gBACdlB,UACAmB,SAA0E,CAAC,GAAC;AAE5E,QAAMC,QAAkB,CAAA;AACxB,MAAID,OAAOE,MAAOD,OAAME,KAAK,SAASN,MAAMG,OAAOE,KAAK,CAAA,EAAG;AAC3D,MAAIF,OAAOI,iBAAkBH,OAAME,KAAK,qBAAqBN,MAAMG,OAAOI,gBAAgB,CAAA,EAAG;AAC7F,MAAIJ,OAAOK,OAAOV,OAAQM,OAAME,KAAK,SAASN,MAAMG,OAAOK,MAAMC,KAAK,GAAA,CAAA,CAAA,EAAO;AAC7EL,QAAME,KAAK,qBAAqBN,MAAMZ,6BAA6BJ,QAAAA,CAAAA,CAAAA,EAAY;AAC/E,SAAO,UAAUoB,MAAMK,KAAK,IAAA,CAAA;AAC9B;AAVgBP;AAaT,SAASQ,YAAYC,SAA+B;AACzD,QAAMC,IAAI,4BAA4BC,KAAKF,QAAQG,iBAAiB,EAAA;AACpE,SAAOF,IAAI,CAAA;AACb;AAHgBF;AAUhB,eAAsBK,aAAaxB,GAAiBoB,SAA+B;AACjF,QAAMK,QAAQN,YAAYC,OAAAA;AAC1B,MAAI,CAACK,OAAO;AAEV,WAAO;MACLC,IAAI;MACJC,QAAQ;MACRb,OAAO;MACPc,aAAa;MACbC,WAAWlB,gBAAgBX,EAAEP,UAAU;QAAEwB,OAAOjB,EAAE8B;MAAe,CAAA;IACnE;EACF;AAEA,MAAIC;AACJ,MAAI;AACFA,WAAO,MAAM/B,EAAEQ,YAAYiB,OAAO;MAAEhC,UAAUO,EAAEP;MAAU2B;IAAQ,CAAA;EACpE,QAAQ;AACNW,WAAOC;EACT;AACA,MAAI,CAACD,KAAM,QAAOE,KAAKjC,GAAG,KAAK,iBAAiB,6BAAA;AAChD,MAAI+B,KAAKG,cAAcF,UAAaD,KAAKG,YAAY,OAAQC,KAAKC,IAAG,GAAI;AACvE,WAAOH,KAAKjC,GAAG,KAAK,iBAAiB,8BAAA;EACvC;AACA,QAAMqC,UAAUC,cAAcP,MAAM/B,EAAE8B,cAAc;AACpD,MAAIO,QAAQ9B,QAAQ;AAElB,UAAMU,QAAQ;SAAI,oBAAIsB,IAAI;WAAKR,KAAKS,UAAU,CAAA;WAASxC,EAAE8B,kBAAkB,CAAA;OAAI;;AAC/E,WAAOG,KAAKjC,GAAG,KAAK,sBAAsB,kBAAkBqC,QAAQnB,KAAK,GAAA,CAAA,IAAQD,KAAAA;EACnF;AACA,SAAO;IAAES,IAAI;IAAMK,MAAM;MAAE,GAAGA;MAAMS,QAAQT,KAAKS,UAAU,CAAA;IAAG;EAAE;AAClE;AA9BsBhB;AAiCf,SAASS,KACdjC,GACA2B,QACAb,OACAc,aACAX,OAAgB;AAEhB,SAAO;IACLS,IAAI;IACJC;IACAb;IACAc;IACAC,WAAWlB,gBAAgBX,EAAEP,UAAU;MAAEqB;MAAOE,kBAAkBY;MAAaX;IAAM,CAAA;EACvF;AACF;AAdgBgB;AAgBT,SAASK,cAAcP,MAA4BU,UAA8B;AACtF,MAAI,CAACA,UAAUlC,OAAQ,QAAO,CAAA;AAC9B,QAAMmC,UAAU,IAAIH,IAAIR,MAAMS,UAAU,CAAA,CAAE;AAC1C,SAAOC,SAASE,OAAO,CAACC,MAAM,CAACF,QAAQG,IAAID,CAAAA,CAAAA;AAC7C;AAJgBN;;;ACxKT,IAAMQ,8BAA8B;EAAC;EAAc;EAAc;EAAc;;AAC/E,IAAMC,0BAA0BD,4BAA4B,CAAA;AAgBnE,IAAME,cAAc;AACpB,IAAMC,kBAAkB;AACxB,IAAMC,mBAAmB;AACzB,IAAMC,iBAAiB;AAEvB,IAAMC,KAAK,wBAACC,IAAeC,YAAsC;EAAEC,SAAS;EAAOF;EAAIC;AAAO,IAAnF;AACX,IAAME,OAAO,wBAACH,IAAeI,MAAcC,aAAsC;EAC/EH,SAAS;EACTF;EACAM,OAAO;IAAEF;IAAMC;EAAQ;AACzB,IAJa;AAuBN,IAAME,YAAN,MAAMA;EAjDb,OAiDaA;;;;EACMC,QAAQ,oBAAIC,IAAAA;EACrBC,UAA0C,CAAA;EAElD,YAAqBC,SAA2B;SAA3BA,UAAAA;AACnB,QAAIA,QAAQC,MAAOC,sBAAqBF,QAAQC,KAAK;EACvD;;EAGAE,QAAQC,MAA+B;AACrC,QAAI,KAAKP,MAAMQ,IAAID,KAAKE,IAAI,GAAG;AAC7B,YAAM,IAAIC,MAAM,oCAAoCH,KAAKE,IAAI,8BAA8B;IAC7F;AACA,SAAKT,MAAMW,IAAIJ,KAAKE,MAAMF,IAAAA;AAC1B,WAAO;EACT;;EAGAK,OAAOC,QAA0C;AAC/C,SAAKX,QAAQY,KAAKD,MAAAA;AAClB,WAAO;EACT;EAEA,MAAME,YAA0C;AAC9C,UAAM,KAAKC,KAAI;AACf,WAAO;SAAI,KAAKhB,MAAMiB,OAAM;;EAC9B;EAEA,MAAcD,OAAO;AACnB,QAAI,CAAC,KAAKd,QAAQgB,OAAQ;AAC1B,UAAMhB,UAAU,KAAKA;AACrB,SAAKA,UAAU,CAAA;AACf,eAAWiB,KAAKjB,QAAS,OAAMiB,EAAAA;EACjC;;EAGA,MAAMC,cAAcvB,SAAkBwB,KAAuE;AAC3G,QAAIC,MAAMC,QAAQ1B,OAAAA,GAAU;AAC1B,YAAM2B,WAAW,MAAMC,QAAQC,IAAI7B,QAAQ8B,IAAI,CAACC,MAAM,KAAKC,UAAUD,GAAGP,GAAAA,CAAAA,CAAAA,GAAQS,OAC9E,CAACC,MAA4BA,MAAM,IAAA;AAErC,aAAOP,QAAQN,SAASM,UAAU;IACpC;AACA,WAAO,KAAKK,UAAUhC,SAASwB,GAAAA;EACjC;EAEA,MAAcQ,UAAUhC,SAAkBwB,KAAmD;AAC3F,UAAMW,MAAMnC;AACZ,QAAI,CAACmC,OAAO,OAAOA,QAAQ,YAAYA,IAAItC,YAAY,OAAO;AAC5D,aAAOC,KAAK,MAAMP,iBAAiB,0BAAA;IACrC;AAEA,QAAI,OAAO4C,IAAIC,WAAW,YAAYD,IAAIxC,OAAO0C,OAAW,QAAO;AACnE,UAAM1C,KAAKwC,IAAIxC;AACf,UAAM2C,SAASH,IAAIG,UAAU,CAAC;AAE9B,UAAM,KAAKnB,KAAI;AACf,YAAQgB,IAAIC,QAAM;MAChB,KAAK,cAAc;AACjB,cAAMG,YAAYD,OAAOE;AACzB,cAAMA,kBACJD,aAAanD,4BAA4BqD,SAASF,SAAAA,IAAaA,YAAYlD;AAC7E,eAAOK,GAAGC,IAAI;UACZ6C;UACAE,cAAc;YAAEvC,OAAO;cAAEwC,aAAa;YAAM;UAAE;UAC9CC,YAAY;YAAEhC,MAAM,KAAKN,QAAQM;YAAMiC,SAAS,KAAKvC,QAAQuC,WAAW;UAAQ;UAChF,GAAI,KAAKvC,QAAQwC,eAAe;YAAEA,cAAc,KAAKxC,QAAQwC;UAAa,IAAI,CAAC;QACjF,CAAA;MACF;MACA,KAAK;AACH,eAAOpD,GAAGC,IAAI,CAAC,CAAA;MACjB,KAAK;AACH,eAAOD,GAAGC,IAAI;UACZQ,OAAO;eAAI,KAAKA,MAAMiB,OAAM;YAAIU,IAAI,CAACiB,OAAO;YAC1CnC,MAAMmC,EAAEnC;YACR,GAAImC,EAAEC,QAAQ;cAAEA,OAAOD,EAAEC;YAAM,IAAI,CAAC;YACpCC,aAAaF,EAAEE;YACfC,aAAaH,EAAEG;YACf,GAAIH,EAAEI,cAAc;cAAEA,aAAaJ,EAAEI;YAAY,IAAI,CAAC;UACxD,EAAA;QACF,CAAA;MACF,KAAK,cAAc;AACjB,cAAMzC,OAAO,KAAKP,MAAMiD,IAAId,OAAO1B,IAAI;AACvC,YAAI,CAACF,KAAM,QAAOZ,KAAKH,IAAIF,gBAAgB,iBAAiB4D,OAAOf,OAAO1B,IAAI,CAAA,EAAG;AACjF,eAAOlB,GAAGC,IAAI,MAAM,KAAK2D,SAAS5C,MAAO4B,OAAOiB,aAAa,CAAC,GAA+B/B,GAAAA,CAAAA;MAC/F;MACA,KAAK;AACH,eAAO9B,GAAGC,IAAI;UAAE6D,WAAW,CAAA;QAAG,CAAA;MAChC,KAAK;AACH,eAAO9D,GAAGC,IAAI;UAAE8D,SAAS,CAAA;QAAG,CAAA;MAC9B;AACE,eAAO3D,KAAKH,IAAIH,kBAAkB,qBAAqB2C,IAAIC,MAAM,EAAE;IACvE;EACF;EAEA,MAAckB,SACZ5C,MACAgD,MACAlC,KACqB;AACrB,QAAI;AACF,UAAId,KAAKiD,UAAU;AACjB,cAAMC,IAAI,MAAMlD,KAAKiD,SAASD,IAAAA;AAC9B,YAAI,CAACE,EAAElE,GAAI,QAAO;UAAEmE,SAAS;UAAMC,SAAS;YAAC;cAAEC,MAAM;cAAQC,MAAM,sBAAsBJ,EAAE5D,OAAO;YAAG;;QAAG;AACxG0D,eAAOE,EAAEK;MACX;AACA,aAAO,MAAMvD,KAAKwD,QAAQR,MAAMlC,GAAAA;IAClC,SAAS2C,KAAK;AAEZ,aAAO;QAAEN,SAAS;QAAMC,SAAS;UAAC;YAAEC,MAAM;YAAQC,MAAM,eAAgBG,IAAcnE,OAAO;UAAG;;MAAG;IACrG;EACF;;EAGAoE,gBAAgBC,QAAqC;AACnD,QAAI,CAACA,OAAQ,QAAO;AACpB,UAAMC,UAAU,KAAKhE,QAAQiE;AAC7B,QAAID,YAAY,IAAK,QAAO;AAC5B,YAAQA,WAAW,CAAA,GAAI7B,SAAS4B,MAAAA;EAClC;;;;;EAMA,IAAIG,qBAA+B;AACjC,WAAO,KAAKlE,QAAQC,QAAQkE,+BAA+B,KAAKnE,QAAQC,MAAMmE,QAAQ,IAAI,CAAA;EAC5F;;EAGA,MAAMC,4BAA8D;AAClE,UAAMC,IAAI,KAAKtE,QAAQC;AACvB,QAAI,CAACqE,EAAG,OAAM,IAAI/D,MAAM,gDAAA;AACxB,UAAM,KAAKM,KAAI;AACf,UAAM0D,SAASD,EAAEE,mBAAmB;SAC/B,oBAAIC,IAAI;WAAKH,EAAEI,kBAAkB,CAAA;WAAQ;aAAI,KAAK7E,MAAMiB,OAAM;UAAI6D,QAAQ,CAAClC,MAAMA,EAAE8B,UAAU,CAAA,CAAE;OAAE;;AAEtG,WAAO;MACLH,UAAUE,EAAEF;MACZQ,uBAAuBN,EAAEO;MACzB,GAAIN,OAAOxD,SAAS;QAAE+D,kBAAkBP;MAAO,IAAI,CAAC;MACpDQ,0BAA0B;QAAC;;MAC3B,GAAIT,EAAEU,eAAe;QAAEC,eAAeX,EAAEU;MAAa,IAAI,CAAC;MAC1D,GAAIV,EAAEY,wBAAwB;QAAEC,wBAAwBb,EAAEY;MAAsB,IAAI,CAAC;MACrF,GAAGZ,EAAEc;IACP;EACF;;EAGA,MAAMC,mBAAmBC,KAA+D;AACtF,UAAMC,OAAO;MAAE,+BAA+B;MAAK,gCAAgC;IAAe;AAClG,UAAMzD,SAASwD,IAAIxD,OAAO0D,YAAW;AACrC,QAAI,CAAC,KAAKxF,QAAQC,MAAO,QAAO;MAAEwF,QAAQ;MAAKC,SAAS,CAAC;IAAE;AAC3D,QAAI5D,WAAW,UAAW,QAAO;MAAE2D,QAAQ;MAAKC,SAAS;QAAE,GAAGH;QAAM,gCAAgC;MAAI;IAAE;AAC1G,QAAIzD,WAAW,SAASA,WAAW,OAAQ,QAAO;MAAE2D,QAAQ;MAAKC,SAAS;QAAEC,OAAO;MAAe;IAAE;AACpG,UAAMC,OAAOC,KAAKC,UAAU,MAAM,KAAKzB,0BAAyB,CAAA;AAChE,WAAO;MACLoB,QAAQ;MACRC,SAAS;QAAE,GAAGH;QAAM,gBAAgB;QAAoB,iBAAiB;MAAuB;MAChGK,MAAM9D,WAAW,SAASC,SAAY6D;IACxC;EACF;;;;;EAMA,MAAMG,WAAWT,KAAqBpE,KAA4C;AAChF,UAAM8E,OAAO;MAAE,gBAAgB;IAAmB;AAClD,QAAI,CAAC,KAAKlC,gBAAgBwB,IAAII,QAAQ3B,MAAM,GAAG;AAC7C,aAAO;QAAE0B,QAAQ;QAAKC,SAASM;QAAMJ,MAAMC,KAAKC,UAAUtG,KAAK,MAAMP,iBAAiB,oBAAA,CAAA;MAAuB;IAC/G;AACA,UAAMgB,QAAQ,KAAKD,QAAQC;AAC3B,QAAIA,OAAO;AACT,YAAMgG,UAAU,MAAMC,aAAajG,OAAOqF,IAAII,OAAO;AACrD,UAAI,CAACO,QAAQ7G,GAAI,QAAO+G,UAAUF,OAAAA;AAClC/E,YAAM;QAAE,GAAGA;QAAKkF,MAAMH,QAAQG;MAAK;IACrC;AACA,QAAId,IAAIxD,OAAO0D,YAAW,MAAO,QAAQ;AAEvC,aAAO;QAAEC,QAAQ;QAAKC,SAAS;UAAEC,OAAO;QAAO;MAAE;IACnD;AACA,QAAIC,OAAON,IAAIM;AACf,QAAI,OAAOA,SAAS,YAAYA,gBAAgBS,YAAY;AAC1D,UAAI;AACFT,eAAOC,KAAKS,MAAM,OAAOV,SAAS,WAAWA,OAAO,IAAIW,YAAAA,EAAcC,OAAOZ,IAAAA,CAAAA;MAC/E,QAAQ;AACN,eAAO;UAAEH,QAAQ;UAAKC,SAASM;UAAMJ,MAAMC,KAAKC,UAAUtG,KAAK,MAAMR,aAAa,aAAA,CAAA;QAAgB;MACpG;IACF;AACA,QAAIiB,OAAO;AAET,YAAM,KAAKY,KAAI;AACf,YAAM4F,QAAStF,MAAMC,QAAQwE,IAAAA,IAAQA,OAAO;QAACA;;AAC7C,iBAAWnE,KAAKgF,OAAO;AACrB,YAAIhF,GAAGK,WAAW,aAAc;AAChC,cAAM1B,OAAO,KAAKP,MAAMiD,IAAIrB,EAAEO,QAAQ1B,IAAAA;AACtC,cAAMoG,UAAUC,cAAczF,IAAIkF,MAAMhG,MAAMmE,MAAAA;AAC9C,YAAImC,QAAQ3F,QAAQ;AAElB,gBAAM6F,QAAQ;eACT,oBAAInC,IAAI;iBAAKvD,IAAIkF,MAAM7B,UAAU,CAAA;iBAAStE,MAAMyE,kBAAkB,CAAA;iBAAStE,MAAMmE,UAAU,CAAA;aAAI;;AAEpG,iBAAO4B,UACLU,KAAK5G,OAAO,KAAK,sBAAsB,SAASG,KAAME,IAAI,kBAAkBoG,QAAQI,KAAK,GAAA,CAAA,IAAQF,KAAAA,CAAAA;QAErG;MACF;IACF;AACA,UAAMG,WAAW,MAAM,KAAK9F,cAAc2E,MAAM1E,GAAAA;AAChD,QAAI6F,aAAa,KAAM,QAAO;MAAEtB,QAAQ;MAAKC,SAAS,CAAC;IAAE;AACzD,WAAO;MAAED,QAAQ;MAAKC,SAASM;MAAMJ,MAAMC,KAAKC,UAAUiB,QAAAA;IAAU;EACtE;AACF;AAEA,SAASZ,UAAU7B,GAA4E;AAC7F,SAAO;IACLmB,QAAQnB,EAAEmB;IACVC,SAAS;MAAE,gBAAgB;MAAoB,oBAAoBpB,EAAE0C;IAAU;IAC/EpB,MAAMC,KAAKC,UAAU;MAAEnG,OAAO2E,EAAE3E;MAAOsH,mBAAmB3C,EAAE3B;IAAY,CAAA;EAC1E;AACF;AANSwD;;;ACnPT,IAAMe,aAAa,oBAAIC,IAAyB;EAC9C;IAACC;IAAQ;MAAEC,MAAM;IAAS;;EAC1B;IAACC;IAAQ;MAAED,MAAM;IAAS;;EAC1B;IAACE;IAAS;MAAEF,MAAM;IAAU;;EAC5B;IAACG;IAAM;MAAEH,MAAM;MAAUI,QAAQ;IAAY;;EAC7C;IAACC;IAAO;MAAEL,MAAM;IAAQ;;EACxB;IAACM;IAAQ;MAAEN,MAAM;IAAS;;CAC3B;AAEM,SAASO,gBAAgBP,MAAa;AAC3C,QAAMQ,IAAIX,WAAWY,IAAIT,IAAAA;AACzB,SAAOQ,IAAI;IAAE,GAAGA;EAAE,IAAIE;AACxB;AAHgBH;AAMhB,SAASI,UAAUH,GAAeI,MAAcC,IAAe,CAAA,GAAE;AAC/D,UAAQD,MAAAA;IACN,KAAK;AACHJ,QAAER,OAAO;AACT;IACF,KAAK;IACL,KAAK;AACHQ,QAAER,OAAOY,SAAS,aAAa,WAAW;AAC1C;IACF,KAAK;AACHJ,QAAER,OAAO;AACT;IACF,KAAK;AACHQ,QAAER,OAAO;AACT;IACF,KAAK;IACL,KAAK;IACL,KAAK;AACHQ,QAAER,OAAO;AACTQ,QAAEJ,SAAS;AACX;IACF,KAAK;AACHI,QAAER,OAAO;AACTQ,QAAEJ,SAAS;AACX;IACF,KAAK;AACHI,QAAER,OAAO;AACTQ,QAAEJ,SAAS;AACX;IACF,KAAK;AACHI,QAAER,OAAO;AACTQ,QAAEJ,SAAS;AACX;IACF,KAAK;AACHI,QAAEM,mBAAmB;AACrB;IACF,KAAK;AACHN,QAAEO,mBAAmB;AACrB;IACF,KAAK;AACHP,QAAEQ,UAAUH,EAAE,CAAA;AACd;IACF,KAAK;AACHL,QAAES,UAAUJ,EAAE,CAAA;AACd;IACF,KAAK;AACHL,QAAEU,YAAYL,EAAE,CAAA;AAChB;IACF,KAAK;AACHL,QAAEW,YAAYN,EAAE,CAAA;AAChB;IACF,KAAK;AACHL,QAAEU,YAAYL,EAAE,CAAA;AAChB,UAAIA,EAAE,CAAA,MAAOH,OAAWF,GAAEW,YAAYN,EAAE,CAAA;AACxC;IACF,KAAK;AACH,UAAIA,EAAE,CAAA,aAAcO,OAAQZ,GAAEa,UAAUR,EAAE,CAAA,EAAGS;AAC7C;IACF,KAAK;AACHd,QAAEe,OAAOV,EAAE,CAAA;AACX;IACF,KAAK;AACHL,QAAEe,OAAQV,EAAE,CAAA,KAAoBP,OAAOkB,OAAOX,EAAE,CAAA,CAAE;AAClD;IACF,KAAK;AACH,UAAIL,EAAER,SAAS,SAAUQ,GAAEU,YAAYO,KAAKC,IAAI,GAAGzB,OAAOO,EAAEU,aAAa,CAAA,CAAA;AACzE;IACF,KAAK;AACHV,QAAER,OAAO;AACT;IACF,KAAK;AACHQ,QAAEmB,WAAWd,EAAE,CAAA;AACf;IACF,KAAK;AACHL,QAAEoB,WAAWf,EAAE,CAAA;AACf;IACF,KAAK;AACHL,QAAER,OAAO;AACT;EACJ;AACF;AAhFSW;AAsFF,SAASkB,gBAAgBC,KAAeC,SAA4CC,QAAQ,GAAC;AAClG,QAAMC,SAAqB;IAAEjC,MAAM;IAAUkC,YAAY,CAAC;EAAE;AAC5D,MAAI,CAACH,WAAWC,QAAQ,EAAG,QAAOC;AAClC,QAAME,QAAQJ,QAAQK,6BAA6BN,KAAK,IAAI,MAAM,KAAA;AAClE,QAAMI,aAAyC,CAAC;AAChD,QAAMG,WAAW,oBAAIC,IAAAA;AAErB,aAAWC,KAAKJ,OAAO;AACrB,UAAMK,OAAQN,WAAWK,EAAEE,YAAY,MAAMC,QAAQZ,KAAKS,EAAEE,YAAY;AACxE,QAAIF,EAAEvC,SAAS,2BAA2BuC,EAAE3B,SAAS,cAAc;AACjEyB,eAASM,IAAIJ,EAAEE,YAAY;IAC7B,WAAWF,EAAEvC,SAAS,oBAAoB;AACxC,YAAM4C,aAAaC,QAAQC,cAAc,eAAehB,IAAIiB,WAAWR,EAAEE,YAAY;AACrF,UAAI,OAAOG,eAAe,cAAc,CAAC/C,WAAWmD,IAAIJ,UAAAA,GAAa;AACnEtC,eAAO2C,OAAOT,MAAMX,gBAAgBe,YAAYb,SAASC,QAAQ,CAAA,CAAA;MACnE;IACF,WAAWO,EAAEvC,SAAS,sBAAsBuC,EAAE3B,MAAM;AAClD,UAAI2B,EAAEW,MAAM;AACVV,aAAKxC,OAAO;AACZ,cAAMmD,QAASX,KAAKW,UAAU,CAAC;AAC/BxC,kBAAUwC,OAAOZ,EAAE3B,MAAM2B,EAAEa,WAAW;MACxC,OAAO;AACLzC,kBAAU6B,MAAMD,EAAE3B,MAAM2B,EAAEa,WAAW;MACvC;IACF;EACF;AAEAnB,SAAOC,aAAaA;AACpB,QAAMmB,WAAW/C,OAAOgD,KAAKpB,UAAAA,EAAYqB,OAAO,CAACC,MAAM,CAACnB,SAASW,IAAIQ,CAAAA,CAAAA;AACrE,MAAIH,SAASI,OAAQxB,QAAOoB,WAAWA;AACvC,SAAOpB;AACT;AA/BgBJ;AAiChB,SAASa,QAAQZ,KAAeU,MAAY;AAC1C,QAAMkB,aAAab,QAAQC,cAAc,eAAehB,IAAIiB,WAAWP,IAAAA;AACvE,QAAMhC,IAAgBD,gBAAgBmD,UAAAA,KAAe,CAAC;AAEtD,QAAMC,MAAMd,QAAQC,cAAc,8BAA8BhB,IAAIiB,WAAWP,IAAAA;AAE/E,MAAImB,KAAKC,YAAapD,GAAEoD,cAAcD,IAAIC;AAC1C,MAAID,KAAKE,YAAYnD,OAAWF,GAAEsD,WAAW;IAACH,IAAIE;;AAClD,MAAIxD,MAAM0D,QAAQJ,KAAKpC,IAAAA,EAAOf,GAAEe,OAAOoC,IAAIpC;AAC3C,SAAOf;AACT;AAVSkC;;;ARhIT,IAAMsB,gBAAgB;AACtB,IAAMC,kBAAkB;AACxB,IAAMC,sBAAsB;AAC5B,IAAMC,mBAAmB;AACzB,IAAMC,kBAAkB;EAAC;EAAO;EAAQ;EAAO;EAAU;EAAS;EAAO;EAAW;;AACpF,IAAMC,iBAAiB;AACvB,IAAMC,kBAAkB;AACxB,IAAMC,kBAAkB;AAEjB,IAAMC,oBAAoB;AAC1B,IAAMC,qBAAqBC,uBAAO,oBAAA;AAiBlC,SAASC,QAAQC,UAA4B,CAAC,GAAC;AACpD,SAAOC,YAAYL,mBAAmBI,OAAAA;AACxC;AAFgBD;AA4DT,IAAMG,aAAN,MAAMA;EAlHb,OAkHaA;;;;;;;EACFC;EAET,YACmBC,WACAC,WACAL,SACAM,aACjB;SAJiBF,YAAAA;SACAC,YAAAA;SACAL,UAAAA;SACAM,cAAAA;AAEjB,SAAKH,SAAS,IAAII,UAAUP,OAAAA;AAC5B,eAAWQ,KAAKR,QAAQS,SAAS,CAAA,EAAI,MAAKN,OAAOO,QAAQF,CAAAA;AACzD,UAAMG,WAAWC,sBAAsB;MACrCC,SAASb,QAAQa,YAAY,CAACC,QAAQC,gBAAgBD,IAAIE,GAAG;IAC/D,CAAA;AACA,SAAKb,OAAOc,OAAO,YAAA;AACjB,YAAMC,UAAUlB,QAAQmB,yBAA0B,MAAMC,mBAAAA;AACxD,iBAAWZ,KAAK,KAAKa,SAASH,OAAAA,GAAU;AACtC,aAAKf,OAAOO,QAAQY,gBAAgBd,EAAEe,OAAOf,EAAER,SAASW,UAAUX,OAAAA,CAAAA;MACpE;IACF,CAAA;EACF;;;;;;EAOAwB,eAAqB;AACnB,UAAMC,UAAU,KAAKnB,aAAaoB;AAClC,QAAI,CAACD,QAAS;AACd,eAAWE,QAAQ,KAAKxB,OAAOyB,oBAAoB;AACjD,YAAMC,UAAU,wBAACC,WAAmB,OAAOC,MAAeC,QAAAA;AACxD,cAAMC,MAAM,MAAM,KAAK9B,OAAO+B,mBAAmB;UAAEJ;QAAO,CAAA;AAC1D,mBAAW,CAACK,GAAGC,CAAAA,KAAMC,OAAOC,QAAQL,IAAIM,OAAO,EAAGd,SAAQe,UAAUR,KAAKG,GAAGC,CAAAA;AAC5EX,gBAAQgB,MAAMT,KAAKC,IAAIS,MAAMT,IAAIU,MAAM;MACzC,GAJgB;AAKhBlB,cAAQmB,IAAIjB,MAAME,QAAQ,KAAA,CAAA;AAC1BJ,cAAQzB,QAAQ2B,MAAME,QAAQ,SAAA,CAAA;IAChC;EACF;EAEQgB,eAAuB;AAC7B,WAAO,KAAKxC,UAAUyC,kBAAe,KAAQ;EAC/C;EAEQC,eAAeC,YAAsBnB,SAAuC;AAClF,UAAMoB,aACJ,KAAK5C,UAGL6C,gBAAa;AACf,QAAI,CAACD,cAAcA,WAAWE,SAAS,EAA4B,QAAOC;AAC1E,QAAIC,UACFC,QAAQC,YAAYhE,kBAAkBsC,OAAAA,KACtCyB,QAAQC,YAAYhE,kBAAkByD,UAAAA,KACtCC,WAAWO;AACb,QAAIC,MAAMC,QAAQL,OAAAA,EAAUA,WAAUA,QAAQ,CAAA;AAC9C,QAAIA,YAAYD,UAAa,OAAOC,YAAY,SAAU,QAAOD;AACjE,UAAMO,SAASV,WAAWU,WAAW,QAAQ,KAAMV,WAAWU,UAAU;AACxE,WAAO,GAAGA,MAAAA,GAASC,OAAOP,OAAAA,CAAAA;EAC5B;EAEQhC,SAASH,SAA4C;AAC3D,UAAM2C,QAAkF,CAAA;AACxF,eAAWC,WAAW,KAAK1D,UAAU2D,eAAc,GAA2B;AAC5E,YAAMf,aAAac,QAAQE;AAC3B,UAAI,CAAChB,YAAYiB,UAAW;AAC5B,YAAMC,QAAQlB,WAAWiB;AACzB,YAAME,YAAYC,QAAQd,QAAQC,YAAYnE,eAAe4D,UAAAA,KAAe,GAAA;AAC5E,YAAMqB,WAAWrB,WAAWsB,KAAKC,QAAQ,eAAe,EAAA;AAExD,iBAAWC,OAAOnC,OAAOoC,oBAAoBP,KAAAA,GAAQ;AACnD,YAAIM,QAAQ,cAAe;AAC3B,cAAM3C,UAAUQ,OAAOqC,yBAAyBR,OAAOM,GAAAA,GAAMG;AAC7D,YAAI,OAAO9C,YAAY,WAAY;AACnC,cAAM+C,OAAqCtB,QAAQC,YAAY3D,mBAAmBiC,OAAAA;AAClF,YAAI,CAAC+C,KAAM;AACX,cAAM9C,SAAStC,gBAAgB8D,QAAQC,YAAYlE,iBAAiBwC,OAAAA,CAAAA,KAAuB;AAC3F,cAAMgD,aAAaT,QAAQd,QAAQC,YAAYnE,eAAeyC,OAAAA,KAAY,GAAA,EAAK,CAAA;AAC/E,cAAMF,OAAOmD,UACX,KAAKjC,aAAY,GACjB,KAAKE,eAAeC,YAAYnB,OAAAA,GAChC,KAAK7B,QAAQ+E,YACbZ,UAAU,CAAA,GACVU,UAAAA;AAEFhB,cAAMmB,KAAK;UACTzD,OAAO;YAAEO,QAAQA,WAAW,QAAQ,SAASA;YAAQH;UAAK;UAC1D3B,SAAS;YACPsE,MAAMW,iBAAiB,GAAGC,QAAQb,QAAAA,CAAAA,IAAaa,QAAQV,GAAAA,CAAAA,EAAM;YAC7D,GAAGW,aAAanC,YAAYwB,KAAKtD,OAAAA;YACjC,GAAG0D;UACL;QACF,CAAA;MACF;IACF;AACA,WAAOf;EACT;AACF;AAGA,SAASsB,aAAanC,YAAsBwB,KAAatD,SAA0C;AACjG,QAAMkE,OACJ9B,QAAQC,YAAYjE,qBAAqB0D,YAAYwB,GAAAA,KAAQ,CAAC;AAChE,QAAMa,QAAmB/B,QAAQC,YAAY,qBAAqBP,WAAWiB,WAAWO,GAAAA,KAAQ,CAAA;AAChG,QAAMc,SAAqB;IAAEnC,MAAM;IAAUoC,YAAY,CAAC;EAAE;AAC5D,QAAMC,QAAoB;IAAErC,MAAM;IAAUoC,YAAY,CAAC;IAAGE,UAAU,CAAA;EAAG;AACzE,MAAI/C;AAEJ,QAAMgD,YAAY,wBAAClF,MACjBmF,gBAAgBnF,CAAAA,MAAO,OAAOA,MAAM,aAAaoF,gBAAgBpF,GAAGU,OAAAA,IAAW,CAAC,IADhE;AAGlB,aAAW,CAACiB,GAAG0D,GAAAA,KAAQxD,OAAOC,QAAQ8C,IAAAA,GAAO;AAC3C,UAAMU,YAAYC,OAAO5D,EAAE6D,MAAM,GAAA,EAAK,CAAA,CAAE;AACxC,UAAMxF,IAAI6E,MAAMQ,IAAII,KAAK;AACzB,UAAMC,QAAQ,OAAOL,IAAIM,SAAS,WAAWN,IAAIM,OAAO/C;AACxD,QAAI0C,cAAcnG,mBAAmBuG,OAAO;AAC1CZ,aAAOC,WAAYW,KAAAA,IAASP,gBAAgBnF,CAAAA,KAAM;QAAE2C,MAAM;MAAS;IACrE,WAAW2C,cAAcpG,iBAAiB;AACxC,UAAIwG,MAAOV,OAAMD,WAAYW,KAAAA,IAASP,gBAAgBnF,CAAAA,KAAM;QAAE2C,MAAM;MAAS;UACxEd,QAAO+D,OAAOZ,OAAOa,YAAYb,OAAOE,UAAUlF,CAAAA,CAAAA,CAAAA;IACzD,WAAWsF,cAAcrG,gBAAgB;AACvC,UAAIyG,OAAO;AACTxD,iBAAS;UAAES,MAAM;UAAUoC,YAAY,CAAC;UAAGE,UAAU,CAAA;QAAG;AACxD/C,aAAK6C,WAAYW,KAAAA,IAASR,UAAUlF,CAAAA;AACnCkC,aAAK+C,SAAsBT,KAAKkB,KAAAA;MACnC,OAAO;AACLxD,eAAO2D,YAAY3D,MAAMgD,UAAUlF,CAAAA,CAAAA;MACrC;IACF;EACF;AACA,QAAMyB,MAAwB;IAAEqD;EAAO;AACvC,MAAIjD,OAAOiE,KAAKd,MAAMD,UAAU,EAAGgB,OAAQtE,KAAIuD,QAAQA;AACvD,MAAI9C,KAAMT,KAAIS,OAAOA;AACrB,SAAOT;AACT;AAlCSkD;AAoCT,SAASkB,YAAYG,GAA2BC,GAAa;AAC3D,MAAI,CAACD,EAAG,QAAOC;AACf,SAAO;IACLtD,MAAM;IACNoC,YAAY;MAAE,GAAGiB,EAAEjB;MAAY,GAAGkB,EAAElB;IAAW;IAC/CE,UAAU;SAAKe,EAAEf,YAAY,CAAA;SAASgB,EAAEhB,YAAY,CAAA;;EACtD;AACF;AAPSY;AAST,eAAejF,qBAAAA;AACb,MAAI;AACF,UAAMsF,KAAM,MAAM,OAAO,iBAAA;AACzB,WAAOA,GAAGC,qBAAkB;EAC9B,QAAQ;AACN,WAAOvD;EACT;AACF;AAPehC;AASf,SAASgD,QAAWhC,GAAU;AAC5B,SAAOqB,MAAMC,QAAQtB,CAAAA,IAAKA,IAAI;IAACA;;AACjC;AAFSgC;AAIT,SAASc,QAAQ0B,GAAS;AACxB,SAAOA,EACJrC,QAAQ,sBAAsB,OAAA,EAC9BA,QAAQ,WAAW,GAAA,EACnBsC,YAAW;AAChB;AALS3B;AAST4B,WAAAA,EAAa5G,UAAAA;AACb6G,OAAOC,gBAAAA,EAAkB9G,YAAYkD,QAAoB,CAAA;AACzD2D,OAAOE,iBAAAA,EAAmB/G,YAAYkD,QAAoB,CAAA;AAC1D2D,OAAOlH,kBAAAA,EAAoBK,YAAYkD,QAAoB,CAAA;AAC3D2D,OAAOG,eAAAA,EAAiBhH,YAAYkD,QAAoB,CAAA;AAqBxD,SAAS+D,oBAAoBnH,SAAiE;AAC5F,MAAMoH,gBAAN,MAAMA,cAAAA;IApTR,OAoTQA;;;;IACJ,YAAqBC,KAAiB;WAAjBA,MAAAA;IAAkB;IAEvC,MAAMC,OAAOC,KAAavF,KAAa;AACrC,YAAMwF,UAAWD,IAAIvG,OAAOuG;AAC5B,YAAMhF,UAAUkF,iBAAiBF,IAAIhF,OAAO;AAC5C,YAAMzB,MAAmB;QAAEyB;QAASmF,UAAUH,IAAII;QAAI3G,KAAKwG;MAAQ;AACnE,YAAMvF,MAAM,MAAM,KAAKoF,IAAIlH,OAAOyH,WAAW;QAAE9F,QAAQyF,IAAIzF;QAAQS;QAASG,MAAM6E,IAAI7E;MAAK,GAAG5B,GAAAA;AAC9F,UAAI,OAAOkB,IAAI6F,SAAS,YAAY;AAClC7F,YAAI6F,KAAK5F,IAAIU,MAAM,EAAEJ,QAASN,IAAIM,OAAO,EAAEuF,KAAK7F,IAAIS,IAAI;MAC1D,OAAO;AACLV,YAAIW,OAAQV,IAAIU,MAAM,EAAEoF,IAAK9F,IAAIM,OAAO;AACxC,YAAIN,IAAIS,SAASU,OAAWpB,KAAIgG,IAAG;YAC9BhG,KAAI8F,KAAK7F,IAAIS,IAAI;MACxB;IACF;EACF;AACA,QAAMwB,QAAQkD,cAAcnD;AAC5B,QAAMgE,aAAa5F,OAAOqC,yBAAyBR,OAAO,QAAA;AAE1DgE,aAAW;IAAEvG,MAAM3B,QAAQ2B,QAAQ;IAAO0B,SAAS8E;EAAgB,CAAA,EAAGf,aAAAA;AACtEL,SAAO7G,UAAAA,EAAYkH,eAAehE,QAAoB,CAAA;AACtDgF,MAAAA,EAAMlE,OAAO,UAAU+D,UAAAA;AACvBI,MAAAA,EAAMnE,OAAO,UAAU,CAAA;AACvBoE,MAAAA,EAAMpE,OAAO,UAAU,CAAA;AACvB,MAAIlE,QAAQuI,QAAQhC,OAAQiC,WAAAA,GAAaxI,QAAQuI,MAAM,EAAEnB,aAAAA;AACzD,aAAWqB,YAAYzI,QAAQ0I,cAAc,CAAA,EAAID,UAASrB,aAAAA;AAC1D,SAAOA;AACT;AA7BSD;AAuCF,IAAMwB,YAAN,MAAMA,WAAAA;EA1Vb,OA0VaA;;;EACX,OAAOC,QAAQ5I,SAA0C;AACvD,WAAO;MACL6I,QAAQF;MACRG,QAAQ;MACRC,SAAS;QAACC;;MACVC,aAAa;QAAC9B,oBAAoBnH,OAAAA;;MAClCkJ,WAAW;QAAC;UAAEC,SAAStJ;UAAoBuJ,UAAUpJ;QAAQ;QAAGE;;MAChEmJ,SAAS;QAACnJ;;IACZ;EACF;;;;;;;;;;;;EAaA,OAAOoJ,aAAatJ,SAA+C;AACjE,WAAO;MACL6I,QAAQF;MACRG,QAAQ;MACRC,SAAS;QAACC;WAAqBhJ,QAAQ+I,WAAW,CAAA;;MAClDE,aAAa;QAAC9B,oBAAoBnH,OAAAA;;MAClCkJ,WAAW;QACT;UACEC,SAAStJ;UACT0J,QAAQvJ,QAAQuJ,UAAU,CAAA;UAC1BC,YAAY,iCAAUpE,UAAqB;YACzC,GAAI,MAAMpF,QAAQwJ,WAAU,GAAIpE,IAAAA;YAChC,GAAIpF,QAAQ2B,OAAO;cAAEA,MAAM3B,QAAQ2B;YAAK,IAAI,CAAC;UAC/C,IAHY;QAId;QACAzB;;MAEFmJ,SAAS;QAACnJ;;IACZ;EACF;AACF;AACAuJ,OAAO,CAAC,CAAA,EAAGd,SAAAA;","names":["All","Controller","Inject","Injectable","Module","Req","Res","SetMetadata","UseGuards","VERSION_NEUTRAL","ApplicationConfig","DiscoveryModule","DiscoveryService","HttpAdapterHost","buildUrl","base","req","url","URL","replace","path","k","v","Object","entries","query","item","Array","isArray","searchParams","append","toString","createFetchDispatcher","opts","doFetch","fetch","ctx","baseUrl","res","method","headers","body","undefined","JSON","stringify","signal","AbortSignal","timeout","timeoutMs","forEach","status","text","normalizeHeaders","headers","out","k","v","Object","entries","undefined","toLowerCase","Array","isArray","join","String","loopbackBaseUrl","req","socket","port","localPort","encrypted","bound","server","address","host","localAddress","startsWith","slice","includes","isToolResult","value","content","Array","isArray","length","every","c","type","toToolResult","text","JSON","stringify","result","structuredContent","isStandard","s","toJsonSchema","schema","undefined","out","jsonSchema","input","target","toJSONSchema","Error","$schema","_ignored","rest","toValidator","validate","value","result","issues","ok","message","map","i","path","p","String","key","join","checkRequired","args","missing","required","filter","k","length","DEFAULT_FORWARD_HEADERS","BODY_METHODS","Set","PARAM_RE","pathParams","path","matchAll","map","m","encodeSegment","name","value","raw","String","Error","JSON","stringify","encodeURIComponent","interpolatePath","values","replace","_","k","undefined","a","b","joinPaths","parts","joined","filter","p","Boolean","join","toolNameFromRoute","method","segments","split","s","exec","sanitizeToolName","toLowerCase","slice","defaultAnnotations","readOnlyHint","openWorldHint","destructiveHint","idempotentHint","buildInputSchema","route","opts","toUpperCase","params","mapping","query","body","wholeBody","bodyMethod","has","input","schema","toJsonSchema","type","properties","required","paramSchema","description","includes","add","querySchema","v","Object","entries","bodySchema","size","splitArgs","args","pathValues","Array","isArray","responseToResult","res","maxChars","text","truncate","isError","status","result","content","headers","parsed","parse","structuredContent","safeDecode","segment","decodeURIComponent","length","toRouteToolResponse","json","ok","transformedResult","explicit","isToolResult","toToolResult","truncated","c","_dropped","rest","pickForwardHeaders","ctx","names","out","createRouteTool","dispatch","serverOpts","forward","forwardHeaders","maxResponseChars","transform","transformResponse","title","inputSchema","annotations","scopes","validate","toValidator","handler","missing","checkRequired","accept","clientIp","err","message","request","_ct","baseHeaders","hookCtx","tool","toolContext","defaultResult","callRoute","r","startsWith","subPath","some","seg","sub","response","PROTECTED_RESOURCE_WELL_KNOWN","protectedResourceMetadataPaths","resource","pathname","URL","replace","protectedResourceMetadataUrl","href","validateOAuthOptions","o","url","Error","JSON","stringify","hash","authorizationServers","length","verifyToken","quote","v","bearerChallenge","params","parts","error","push","errorDescription","scope","join","bearerToken","headers","m","exec","authorization","authenticate","token","ok","status","description","challenge","requiredScopes","auth","undefined","deny","expiresAt","Date","now","missing","missingScopes","Set","scopes","required","granted","filter","s","has","SUPPORTED_PROTOCOL_VERSIONS","LATEST_PROTOCOL_VERSION","PARSE_ERROR","INVALID_REQUEST","METHOD_NOT_FOUND","INVALID_PARAMS","ok","id","result","jsonrpc","fail","code","message","error","McpServer","tools","Map","loaders","options","oauth","validateOAuthOptions","addTool","tool","has","name","Error","set","onLoad","loader","push","listTools","load","values","length","l","handleMessage","ctx","Array","isArray","results","Promise","all","map","m","handleOne","filter","r","msg","method","undefined","params","requested","protocolVersion","includes","capabilities","listChanged","serverInfo","version","instructions","t","title","description","inputSchema","annotations","get","String","callTool","arguments","resources","prompts","args","validate","v","isError","content","type","text","value","handler","err","isOriginAllowed","origin","allowed","allowedOrigins","oauthMetadataPaths","protectedResourceMetadataPaths","resource","protectedResourceMetadata","o","scopes","scopesSupported","Set","requiredScopes","flatMap","authorization_servers","authorizationServers","scopes_supported","bearer_methods_supported","resourceName","resource_name","resourceDocumentation","resource_documentation","metadata","handleMetadataHttp","req","cors","toUpperCase","status","headers","allow","body","JSON","stringify","handleHttp","json","outcome","authenticate","authError","auth","Uint8Array","parse","TextDecoder","decode","calls","missing","missingScopes","scope","deny","join","response","challenge","error_description","PRIMITIVES","Map","String","type","Number","Boolean","Date","format","Array","Object","primitiveSchema","s","get","undefined","applyRule","name","c","exclusiveMinimum","exclusiveMaximum","minimum","maximum","minLength","maxLength","RegExp","pattern","source","enum","values","Math","max","minItems","maxItems","dtoToJsonSchema","dto","storage","depth","schema","properties","metas","getTargetValidationMetadatas","optional","Set","m","prop","propertyName","initial","add","nestedType","Reflect","getMetadata","prototype","has","assign","each","items","constraints","required","keys","filter","p","length","designType","api","description","example","examples","isArray","PATH_METADATA","METHOD_METADATA","ROUTE_ARGS_METADATA","VERSION_METADATA","REQUEST_METHODS","PARAMTYPE_BODY","PARAMTYPE_QUERY","PARAMTYPE_PARAM","MCP_TOOL_METADATA","MCP_MODULE_OPTIONS","Symbol","McpTool","options","SetMetadata","McpService","server","discovery","appConfig","adapterHost","McpServer","t","tools","addTool","dispatch","createFetchDispatcher","baseUrl","ctx","loopbackBaseUrl","raw","onLoad","storage","classValidatorStorage","loadClassValidator","discover","createRouteTool","route","onModuleInit","adapter","httpAdapter","path","oauthMetadataPaths","handler","method","_req","res","out","handleMetadataHttp","k","v","Object","entries","headers","setHeader","reply","body","status","get","globalPrefix","getGlobalPrefix","versionSegment","controller","versioning","getVersioning","type","undefined","version","Reflect","getMetadata","defaultVersion","Array","isArray","prefix","String","found","wrapper","getControllers","metatype","prototype","proto","ctrlPaths","toArray","ctrlName","name","replace","key","getOwnPropertyNames","getOwnPropertyDescriptor","value","meta","methodPath","joinPaths","pathPrefix","push","sanitizeToolName","toSnake","describeArgs","args","types","params","properties","query","required","schemaFor","primitiveSchema","dtoToJsonSchema","arg","paramtype","Number","split","index","field","data","assign","mergeObject","keys","length","a","b","cv","getMetadataStorage","s","toLowerCase","Injectable","Inject","DiscoveryService","ApplicationConfig","HttpAdapterHost","createMcpController","McpController","mcp","handle","req","nodeReq","normalizeHeaders","clientIp","ip","handleHttp","code","send","set","end","descriptor","Controller","VERSION_NEUTRAL","All","Req","Res","guards","UseGuards","decorate","decorators","McpModule","forRoot","module","global","imports","DiscoveryModule","controllers","providers","provide","useValue","exports","forRootAsync","inject","useFactory","Module"]}