@prefecthq/fastmcp-ts 0.0.2 → 0.0.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/FastMCP.ts","../src/server/auth/types.ts","../src/server/context.ts","../src/server/middleware.ts","../src/server/transform.ts","../src/server/tool.ts","../src/server/resource.ts","../src/server/apps/types.ts","../src/server/prompt.ts","../src/server/auth/authorization.ts","../src/server/auth/multiAuth.ts","../src/server/auth/verifiers/jwt.ts","../src/server/auth/verifiers/introspection.ts","../src/server/auth/verifiers/static.ts","../src/server/auth/oauth/provider.ts","../src/server/auth/oauth/proxy.ts","../src/server/proxy.ts","../src/server/apps/FastMCPApp.ts","../src/server/apps/actionRef.ts","../src/server/apps/generative.ts","../src/server/apps/components.ts","../src/server/apps/providers/Approval.ts","../src/server/apps/providers/Choice.ts","../src/server/apps/providers/FileUpload.ts","../src/server/apps/providers/FormInput.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server'\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n McpError,\n ErrorCode,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\nimport type { OAuthServerProvider } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { randomUUID } from 'node:crypto'\nimport type { Readable, Writable } from 'node:stream'\nimport type { Server as HttpServer, IncomingMessage } from 'node:http'\nimport type { AddressInfo } from 'node:net'\nimport { AuthorizationError } from './auth/types'\nimport type { TokenVerifier, AccessToken } from './auth/types'\nimport type { AuthCheck } from './auth/authorization'\nimport { contextStore, createContext, SESSION_CLOSE_CALLBACKS_KEY } from './context'\nimport type { McpContext } from './context'\nimport { runMiddlewareChain } from './middleware'\nimport type { Middleware } from './middleware'\nimport { applyTransformChain } from './transform'\nimport type { Transform, ToolView, ResourceView, PromptView, SynthesizedTool } from './transform'\nimport { convertResult, toJsonSchema, validateInput, ToolResult } from './tool'\nimport {\n convertResourceResult,\n isUriTemplate,\n matchTemplate,\n ResourceResult,\n} from './resource'\nimport type { ResourceConfig } from './resource'\nimport { UI_EXTENSION_KEY } from './apps/types'\nimport type { UiToolMeta } from './apps/types'\nimport { convertPromptResult, PromptResult } from './prompt'\nimport type { PromptConfig } from './prompt'\n\nfunction prefixResourceUri(uri: string, prefix: string): string {\n const idx = uri.indexOf('://')\n if (idx === -1) return `${prefix}/${uri}`\n return `${uri.slice(0, idx + 3)}${prefix}/${uri.slice(idx + 3)}`\n}\n\nexport interface OAuthConfig {\n /** OAuth server provider implementing the authorization and token flow. */\n provider: OAuthServerProvider\n /**\n * Issuer URL for the OAuth server (used in metadata endpoints).\n * Defaults to the HTTP server's bound address when not specified.\n */\n issuerUrl?: URL\n /** Scopes supported by this server, advertised in OAuth metadata. */\n scopes?: string[]\n}\n\nexport interface FastMCPOptions {\n name: string\n version?: string\n /** Simple bearer-token verifier for non-OAuth auth scenarios. */\n auth?: TokenVerifier\n /** Full OAuth 2.1 server with Dynamic Client Registration support. */\n oauth?: OAuthConfig\n /** Maximum number of tools returned per listTools page. Default: 50. */\n toolsPageSize?: number\n /** Maximum number of resources (or templates) returned per page. Default: 50. */\n resourcesPageSize?: number\n /** Maximum number of prompts returned per prompts/list page. Default: 50. */\n promptsPageSize?: number\n /** Middleware applied to every request in registration order. */\n middleware?: Middleware[]\n /** Transforms applied to component list responses in registration order. */\n transforms?: Transform[]\n}\n\nexport interface RunOptions {\n transport?: 'stdio' | 'http'\n port?: number\n host?: string\n path?: string\n /** Custom stdin stream for the stdio transport. Defaults to process.stdin. */\n stdin?: Readable\n /** Custom stdout stream for the stdio transport. Defaults to process.stdout. */\n stdout?: Writable\n}\n\nexport interface ServerAddress {\n host: string\n port: number\n path: string\n}\n\nexport interface ToolConfig {\n name: string\n /** Human-readable display name shown in UIs. Takes precedence over `name` for display purposes. */\n title?: string\n description: string\n /** Standard Schema validator for the tool's input arguments. Used for runtime validation. */\n input?: StandardSchemaV1\n /**\n * Explicit JSON Schema advertised to clients as `inputSchema`. Overrides auto-generation from\n * `input`. Use when you need JSON Schema features beyond what your validator auto-generates\n * (e.g. `examples`, `$comment`, per-property descriptions, or custom annotations).\n */\n inputSchema?: Record<string, unknown>\n /** Standard Schema validator for the tool's return value. Validated before result conversion. */\n output?: StandardSchemaV1\n /**\n * Explicit JSON Schema advertised to clients as `outputSchema`. Overrides auto-generation from\n * `output`. Use when you need JSON Schema features beyond what your validator auto-generates.\n */\n outputSchema?: Record<string, unknown>\n /** Execution timeout in milliseconds. No timeout by default. */\n timeout?: number\n /** When true the tool is hidden from listTools and cannot be invoked via tools/call. */\n disabled?: boolean\n /** Arbitrary tags for server-side filtering. */\n tags?: string[]\n auth?: AuthCheck\n /** Apps extension — links this tool to a UI resource and controls visibility. */\n ui?: UiToolMeta\n}\n\ninterface RegisteredTool {\n config: ToolConfig\n handler: (args: unknown) => unknown\n}\n\ninterface RegisteredResource {\n config: ResourceConfig\n handler: (params?: Record<string, string>) => unknown\n}\n\ninterface ResolvedPromptConfig extends Required<Pick<PromptConfig, 'name' | 'description'>> {\n title?: string\n arguments?: PromptConfig['arguments']\n disabled?: boolean\n timeout?: number\n tags?: string[]\n auth?: PromptConfig['auth']\n}\n\ninterface RegisteredPrompt {\n config: ResolvedPromptConfig\n handler: (args?: Record<string, string>) => unknown\n}\n\ninterface Session {\n transport: StreamableHTTPServerTransport\n server: Server\n state: Map<string, unknown>\n}\n\n/** Converts a camelCase or PascalCase name to space-separated words. e.g. `getWeather` → `\"get weather\"` */\nfunction inferDescription(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/[-_]+/g, ' ')\n .trim()\n .toLowerCase()\n}\n\nfunction toAccessToken(authInfo: AuthInfo | undefined): AccessToken | undefined {\n if (!authInfo) return undefined\n return {\n token: authInfo.token,\n clientId: authInfo.clientId || undefined,\n scopes: authInfo.scopes,\n expiresAt: authInfo.expiresAt,\n claims: authInfo.extra ?? {},\n }\n}\n\n// Cached result of verifying FASTMCP_CLI_AUTH_TOKEN once per process.\n// undefined = not yet resolved; null = env var absent or verification failed.\nlet _cliEnvToken: AccessToken | null | undefined\n\nasync function resolveCliEnvToken(verifier: TokenVerifier | undefined): Promise<AccessToken | undefined> {\n if (!verifier) return undefined\n if (_cliEnvToken !== undefined) return _cliEnvToken ?? undefined\n const raw = process.env['FASTMCP_CLI_AUTH_TOKEN']\n if (!raw) { _cliEnvToken = null; return undefined }\n try {\n _cliEnvToken = await verifier.verify(raw)\n return _cliEnvToken\n } catch {\n _cliEnvToken = null\n return undefined\n }\n}\n\nasync function runAuthCheck(check: AuthCheck, token: AccessToken | undefined): Promise<void> {\n if (!token) throw new McpError(ErrorCode.InvalidRequest, 'Authentication required')\n try {\n await check(token)\n } catch (err) {\n if (err instanceof AuthorizationError) {\n throw new McpError(ErrorCode.InvalidRequest, err.message)\n }\n throw err\n }\n}\n\nexport class FastMCP {\n readonly name: string\n readonly version: string\n\n private _auth: TokenVerifier | undefined\n private _oauth: OAuthConfig | undefined\n private _toolsPageSize: number\n private _resourcesPageSize: number\n private _tools = new Map<string, RegisteredTool>()\n private _staticResources = new Map<string, RegisteredResource>()\n private _templateResources = new Map<string, RegisteredResource>()\n private _prompts = new Map<string, RegisteredPrompt>()\n private _promptsPageSize: number\n private _middleware: Middleware[]\n private _transforms: Transform[]\n private _primaryState = new Map<string, unknown>()\n private _httpServer: HttpServer | null = null\n private _address: ServerAddress | null = null\n private _sessions = new Map<string, Session>()\n // Primary server used by connect() and stdio\n private _primaryServer: Server\n\n private _toolRegisteredCallbacks: Array<(tool: RegisteredTool) => void> = []\n private _resourceRegisteredCallbacks: Array<(resource: RegisteredResource) => void> = []\n private _promptRegisteredCallbacks: Array<(prompt: RegisteredPrompt) => void> = []\n private _proxyCloseCallbacks: Array<() => Promise<void>> = []\n private _mountedChildren = new Set<FastMCP>()\n\n constructor(options: FastMCPOptions) {\n this.name = options.name\n this.version = options.version ?? '0.0.1'\n this._auth = options.auth\n this._oauth = options.oauth\n this._toolsPageSize = options.toolsPageSize ?? 50\n this._resourcesPageSize = options.resourcesPageSize ?? 50\n this._promptsPageSize = options.promptsPageSize ?? 50\n this._middleware = options.middleware ? [...options.middleware] : []\n this._transforms = options.transforms ? [...options.transforms] : []\n this._primaryServer = this._makeServer()\n }\n\n private _hasUiComponents(): boolean {\n for (const t of this._tools.values()) {\n if (t.config.ui) return true\n }\n for (const r of this._staticResources.values()) {\n if (r.config.ui || r.config.uri.startsWith('ui://')) return true\n }\n for (const r of this._templateResources.values()) {\n if (r.config.uri.startsWith('ui://')) return true\n }\n return false\n }\n\n /** Create a new Server instance with all request handlers wired up. */\n private _makeServer(sessionState?: Map<string, unknown>): Server {\n const state = sessionState ?? this._primaryState\n const extensions = this._hasUiComponents() ? { [UI_EXTENSION_KEY]: {} } : undefined\n const server = new Server(\n { name: this.name, version: this.version },\n { capabilities: { tools: { listChanged: true }, resources: { listChanged: true }, prompts: { listChanged: true }, logging: {}, ...(extensions ? { extensions } : {}) } },\n )\n for (const mw of this._middleware) mw.setup?.(server)\n this._setupHandlers(server, state)\n return server\n }\n\n private async _resolveToken(authInfo: AuthInfo | undefined): Promise<AccessToken | undefined> {\n return toAccessToken(authInfo) ?? await resolveCliEnvToken(this._auth)\n }\n\n private _setupHandlers(server: Server, sessionState: Map<string, unknown>): void {\n server.setRequestHandler(ListToolsRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/list', req.params, ctx, async () => {\n const clientIsUiCapable = !!(server.getClientCapabilities()?.extensions as Record<string, unknown> | undefined)?.[UI_EXTENSION_KEY]\n\n const allVisible = (\n await Promise.all(\n [...this._tools.values()].map(async (t) => {\n if (t.config.disabled) return null\n // App-only tools are hidden from listTools (visible only inside the iframe)\n if (t.config.ui?.visibility && !t.config.ui.visibility.includes('model')) return null\n if (!t.config.auth) return t\n if (!token) return null\n try { await t.config.auth(token); return t } catch { return null }\n }),\n )\n ).filter((t): t is RegisteredTool => t !== null)\n\n const transformedTools = this._applyTransformsToTools(allVisible)\n const { resourceViews, promptViews } = await this._getVisibleViews(token)\n const synthesized = this._buildSynthesizedTools(resourceViews, promptViews)\n\n type ListEntry =\n | { kind: 'registered'; name: string; title: string | undefined; description: string; config: ToolConfig }\n | { kind: 'synthesized'; name: string; title: string | undefined; description: string; inputSchema: Record<string, unknown> | undefined }\n\n const allEntries: ListEntry[] = [\n ...transformedTools.map(\n (t): ListEntry => ({ kind: 'registered', name: t.name, title: t.title, description: t.description, config: t.config }),\n ),\n ...synthesized.map(\n (s): ListEntry => ({ kind: 'synthesized', name: s.name, title: s.title, description: s.description, inputSchema: s.inputSchema }),\n ),\n ]\n\n const pageSize = this._toolsPageSize\n const cursorName = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorName !== null) {\n const idx = allEntries.findIndex((e) => e.name === cursorName)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = allEntries.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < allEntries.length\n ? Buffer.from(page[page.length - 1].name).toString('base64url')\n : undefined\n\n const tools = await Promise.all(\n page.map(async (entry) => {\n if (entry.kind === 'synthesized') {\n return {\n name: entry.name,\n ...(entry.title !== undefined ? { title: entry.title } : {}),\n description: entry.description,\n inputSchema: entry.inputSchema ?? { type: 'object' as const },\n }\n }\n const t = entry.config\n const inputSchema =\n t.inputSchema ??\n (t.input\n ? await toJsonSchema(t.input, `tool \"${t.name}\" input`)\n : { type: 'object' as const })\n const outputSchema =\n t.outputSchema ??\n (t.output\n ? await toJsonSchema(t.output, `tool \"${t.name}\" output`)\n : undefined)\n const uiMeta = clientIsUiCapable && t.ui\n ? {\n resourceUri: t.ui.resourceUri ?? `ui://${t.name}`,\n ...(t.ui.visibility ? { visibility: t.ui.visibility } : {}),\n }\n : undefined\n return {\n name: entry.name,\n ...(entry.title !== undefined ? { title: entry.title } : {}),\n description: entry.description,\n inputSchema,\n ...(outputSchema ? { outputSchema } : {}),\n ...(uiMeta ? { _meta: { ui: uiMeta } } : {}),\n }\n }),\n )\n\n return { tools, ...(nextCursor ? { nextCursor } : {}) }\n }),\n )\n })\n\n server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {\n const requestedName = req.params.name\n const token = await this._resolveToken(extra.authInfo)\n\n // Check synthesized tools first\n const { resourceViews, promptViews } = await this._getVisibleViews(token)\n const synthesizedList = this._buildSynthesizedTools(resourceViews, promptViews)\n const synthTool = synthesizedList.find((s) => s.name === requestedName)\n if (synthTool) {\n if (synthTool.auth) await runAuthCheck(synthTool.auth, token)\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n try {\n return await contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/call', req.params, ctx, async () => {\n let executePromise: Promise<unknown> = Promise.resolve(\n synthTool.handler(req.params.arguments ?? {}),\n )\n if (synthTool.timeout) {\n const ms = synthTool.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Tool \"${requestedName}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n return convertResult(await executePromise)\n }),\n )\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n }\n\n // Find by transformed name, then fall back to direct registry (for hidden/unaffected tools)\n let tool: RegisteredTool | undefined\n if (this._transforms.length > 0) {\n for (const t of this._tools.values()) {\n const view = applyTransformChain<ToolView>(\n { name: t.config.name, description: t.config.description, tags: t.config.tags ?? [] },\n this._transforms,\n (tr, v) => tr.transformTool?.(v),\n )\n if (view && view.name === requestedName) { tool = t; break }\n }\n }\n if (!tool) tool = this._tools.get(requestedName)\n\n if (!tool || tool.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown tool: \"${requestedName}\"`)\n }\n\n if (tool.config.auth) await runAuthCheck(tool.config.auth, token)\n\n const resolvedTool = tool\n const rawArgs: unknown = req.params.arguments ?? {}\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n\n try {\n return await contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/call', req.params, ctx, async () => {\n const args = resolvedTool.config.input ? await validateInput(resolvedTool.config.input, rawArgs, true) : rawArgs\n\n let executePromise: Promise<unknown> = Promise.resolve(resolvedTool.handler(args))\n\n if (resolvedTool.config.timeout) {\n const ms = resolvedTool.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Tool \"${requestedName}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n\n let resultValue = await executePromise\n if (resolvedTool.config.output) resultValue = await validateInput(resolvedTool.config.output, resultValue)\n const callResult = convertResult(resultValue)\n // Graceful degradation: strip structuredContent for non-UI clients calling UI tools\n if (resolvedTool.config.ui) {\n const clientIsUi = !!(server.getClientCapabilities()?.extensions as Record<string, unknown> | undefined)?.[UI_EXTENSION_KEY]\n if (!clientIsUi && callResult.structuredContent !== undefined) {\n return { content: [{ type: 'text' as const, text: '[UI not available in this client]' }] }\n }\n }\n return callResult\n }),\n )\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n })\n\n server.setRequestHandler(ListResourcesRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/list', req.params, ctx, async () => {\n const allVisible = (\n await Promise.all(\n [...this._staticResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const transformedResources = this._applyTransformsToResources(allVisible)\n\n const pageSize = this._resourcesPageSize\n const cursorUri = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorUri !== null) {\n const idx = transformedResources.findIndex((r) => r.uri === cursorUri)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = transformedResources.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < transformedResources.length\n ? Buffer.from(page[page.length - 1].uri).toString('base64url')\n : undefined\n\n const clientIsUiCapableRes = !!(server.getClientCapabilities()?.extensions as Record<string, unknown> | undefined)?.[UI_EXTENSION_KEY]\n return {\n resources: page.map((r) => ({\n uri: r.uri,\n name: r.name,\n ...(r.config.title !== undefined ? { title: r.config.title } : {}),\n ...(r.config.description !== undefined ? { description: r.config.description } : {}),\n ...(r.config.mimeType !== undefined ? { mimeType: r.config.mimeType } : {}),\n ...(r.config.size !== undefined ? { size: r.config.size } : {}),\n ...(r.config.annotations !== undefined ? { annotations: r.config.annotations } : {}),\n ...(clientIsUiCapableRes && r.config.ui ? { _meta: { ui: r.config.ui } } : {}),\n })),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }),\n )\n })\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/templates/list', req.params, ctx, async () => {\n const allVisible = (\n await Promise.all(\n [...this._templateResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const transformedTemplates = this._applyTransformsToResourceTemplates(allVisible)\n\n const pageSize = this._resourcesPageSize\n const cursorUri = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorUri !== null) {\n const idx = transformedTemplates.findIndex((r) => r.uri === cursorUri)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = transformedTemplates.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < transformedTemplates.length\n ? Buffer.from(page[page.length - 1].uri).toString('base64url')\n : undefined\n\n return {\n resourceTemplates: page.map((r) => ({\n uriTemplate: r.uri,\n name: r.name,\n ...(r.config.title !== undefined ? { title: r.config.title } : {}),\n ...(r.config.description !== undefined ? { description: r.config.description } : {}),\n ...(r.config.mimeType !== undefined ? { mimeType: r.config.mimeType } : {}),\n ...(r.config.annotations !== undefined ? { annotations: r.config.annotations } : {}),\n })),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }),\n )\n })\n\n server.setRequestHandler(ReadResourceRequestSchema, async (req, extra) => {\n const requestedUri = req.params.uri\n const token = await this._resolveToken(extra.authInfo)\n\n let resource: RegisteredResource | undefined = this._staticResources.get(requestedUri)\n let templateParams: Record<string, string> | undefined\n\n // Direct template matching (original URIs — also handles hidden-but-callable resources)\n if (!resource) {\n for (const r of this._templateResources.values()) {\n if (r.config.disabled) continue\n const params = matchTemplate(r.config.uri, requestedUri)\n if (params !== null) { resource = r; templateParams = params; break }\n }\n }\n\n // Transformed static lookup\n if (!resource && this._transforms.length > 0) {\n for (const r of this._staticResources.values()) {\n if (r.config.disabled) continue\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: r.config.name ?? r.config.uri, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResource?.(v),\n )\n if (view && view.uri === requestedUri) { resource = r; break }\n }\n }\n\n // Transformed template matching\n if (!resource && this._transforms.length > 0) {\n for (const r of this._templateResources.values()) {\n if (r.config.disabled) continue\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: r.config.name ?? r.config.uri, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResourceTemplate?.(v),\n )\n if (view) {\n const params = matchTemplate(view.uri, requestedUri)\n if (params !== null) { resource = r; templateParams = params; break }\n }\n }\n }\n\n if (!resource || resource.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown resource: \"${requestedUri}\"`)\n }\n\n if (resource.config.auth) await runAuthCheck(resource.config.auth, token)\n\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/read', req.params, ctx, async () => {\n let executePromise: Promise<unknown> = Promise.resolve(resource!.handler(templateParams))\n\n if (resource!.config.timeout) {\n const ms = resource!.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Resource \"${requestedUri}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n ) as Promise<unknown>\n }\n\n const result = await executePromise\n return convertResourceResult(result, requestedUri, resource!.config.mimeType)\n }),\n )\n })\n\n server.setRequestHandler(ListPromptsRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'prompts/list', req.params, ctx, async () => {\n const allVisible = (\n await Promise.all(\n [...this._prompts.values()].map(async (p) => {\n if (p.config.disabled) return null\n if (!p.config.auth) return p\n if (!token) return null\n try { await p.config.auth(token); return p } catch { return null }\n }),\n )\n ).filter((p): p is RegisteredPrompt => p !== null)\n\n const transformedPrompts = this._applyTransformsToPrompts(allVisible)\n\n const pageSize = this._promptsPageSize\n const cursorName = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorName !== null) {\n const idx = transformedPrompts.findIndex((p) => p.name === cursorName)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = transformedPrompts.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < transformedPrompts.length\n ? Buffer.from(page[page.length - 1].name).toString('base64url')\n : undefined\n\n return {\n prompts: page.map((p) => ({\n name: p.name,\n ...(p.config.title !== undefined ? { title: p.config.title } : {}),\n description: p.description,\n ...(p.config.arguments?.length ? { arguments: p.config.arguments } : {}),\n })),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }),\n )\n })\n\n server.setRequestHandler(GetPromptRequestSchema, async (req, extra) => {\n const requestedName = req.params.name\n let prompt: RegisteredPrompt | undefined\n if (this._transforms.length > 0) {\n for (const p of this._prompts.values()) {\n const view = applyTransformChain<PromptView>(\n { name: p.config.name, description: p.config.description, tags: p.config.tags ?? [] },\n this._transforms,\n (t, v) => t.transformPrompt?.(v),\n )\n if (view && view.name === requestedName) { prompt = p; break }\n }\n }\n if (!prompt) prompt = this._prompts.get(requestedName)\n\n if (!prompt || prompt.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown prompt: \"${requestedName}\"`)\n }\n\n const resolvedPrompt = prompt\n const token = await this._resolveToken(extra.authInfo)\n if (resolvedPrompt.config.auth) await runAuthCheck(resolvedPrompt.config.auth, token)\n\n const suppliedArgs = req.params.arguments ?? {}\n for (const arg of resolvedPrompt.config.arguments ?? []) {\n if (arg.required && !(arg.name in suppliedArgs)) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Missing required argument \"${arg.name}\" for prompt \"${requestedName}\"`,\n )\n }\n }\n\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'prompts/get', req.params, ctx, async () => {\n let executePromise = Promise.resolve(resolvedPrompt.handler(suppliedArgs))\n if (resolvedPrompt.config.timeout) {\n const ms = resolvedPrompt.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Prompt \"${requestedName}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n return convertPromptResult(await executePromise)\n }),\n )\n })\n }\n\n private _notifyToolListChanged(): void {\n this._primaryServer.sendToolListChanged().catch(() => {})\n for (const { server } of this._sessions.values()) {\n server.sendToolListChanged().catch(() => {})\n }\n }\n\n private _notifyResourceListChanged(): void {\n this._primaryServer.sendResourceListChanged().catch(() => {})\n for (const { server } of this._sessions.values()) {\n server.sendResourceListChanged().catch(() => {})\n }\n }\n\n private _notifyPromptListChanged(): void {\n this._primaryServer.sendPromptListChanged().catch(() => {})\n for (const { server } of this._sessions.values()) {\n server.sendPromptListChanged().catch(() => {})\n }\n }\n\n // Overload: typed handler inferred from input schema\n tool<S extends StandardSchemaV1>(\n config: Omit<ToolConfig, 'input'> & { input: S },\n handler: (args: StandardSchemaV1.InferOutput<S>) => unknown,\n ): void\n // Overload: untyped handler\n tool(config: ToolConfig, handler: (args: Record<string, unknown>) => unknown): void\n // Implementation (handler typed as any to satisfy both overload signatures)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool(config: ToolConfig, handler: (args: any) => any): void {\n const registered: RegisteredTool = { config, handler }\n this._tools.set(config.name, registered)\n this._notifyToolListChanged()\n for (const cb of this._toolRegisteredCallbacks) cb(registered)\n }\n\n prompt(config: PromptConfig, handler: (args?: Record<string, string>) => unknown): void {\n const name = config.name ?? (handler as { name?: string }).name\n if (!name) throw new Error('Prompt name must be provided in config or inferrable from the handler function name')\n const description = config.description ?? inferDescription(name)\n const resolvedConfig: ResolvedPromptConfig = { ...config, name, description }\n const registered: RegisteredPrompt = { config: resolvedConfig, handler }\n this._prompts.set(name, registered)\n this._notifyPromptListChanged()\n for (const cb of this._promptRegisteredCallbacks) cb(registered)\n }\n\n resource(config: ResourceConfig, handler: (params?: Record<string, string>) => unknown): void {\n const registered: RegisteredResource = { config, handler }\n if (isUriTemplate(config.uri)) {\n this._templateResources.set(config.uri, registered)\n } else {\n this._staticResources.set(config.uri, registered)\n }\n this._notifyResourceListChanged()\n for (const cb of this._resourceRegisteredCallbacks) cb(registered)\n }\n\n _removeTool(name: string): boolean {\n if (!this._tools.has(name)) return false\n this._tools.delete(name)\n this._notifyToolListChanged()\n return true\n }\n\n _removeResource(uri: string): boolean {\n if (this._staticResources.has(uri)) {\n this._staticResources.delete(uri)\n this._notifyResourceListChanged()\n return true\n }\n if (this._templateResources.has(uri)) {\n this._templateResources.delete(uri)\n this._notifyResourceListChanged()\n return true\n }\n return false\n }\n\n _removePrompt(name: string): boolean {\n if (!this._prompts.has(name)) return false\n this._prompts.delete(name)\n this._notifyPromptListChanged()\n return true\n }\n\n /** Add a transform to the pipeline. Applied to list responses in registration order. */\n transform(t: Transform): this {\n this._transforms.push(t)\n return this\n }\n\n /**\n * Dispatch a tool call through this server's middleware chain using an inherited context.\n * Used by parent servers to honour child-level middleware when routing mounted tool calls.\n */\n async _dispatchTool(\n name: string,\n rawArgs: unknown,\n ctx: McpContext,\n ) {\n const tool = this._tools.get(name)\n if (!tool || tool.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown tool: \"${name}\"`)\n }\n if (tool.config.auth) await runAuthCheck(tool.config.auth, ctx.auth)\n\n try {\n return await contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/call', { name, arguments: rawArgs }, ctx, async () => {\n const args = tool.config.input\n ? await validateInput(tool.config.input, rawArgs, true)\n : rawArgs\n\n let executePromise: Promise<unknown> = Promise.resolve(tool.handler(args))\n if (tool.config.timeout) {\n const ms = tool.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Tool \"${name}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n\n let resultValue = await executePromise\n if (tool.config.output) resultValue = await validateInput(tool.config.output, resultValue)\n return convertResult(resultValue)\n }),\n )\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n }\n\n /**\n * Run a resource read through this server's middleware chain using an inherited context.\n * Returns the raw handler result so the parent can apply convertResourceResult with the\n * actual requested URI (important for template resources).\n */\n async _dispatchResource(\n uri: string,\n params: Record<string, string> | undefined,\n ctx: McpContext,\n ): Promise<unknown> {\n const resource = isUriTemplate(uri)\n ? this._templateResources.get(uri)\n : this._staticResources.get(uri)\n\n if (!resource || resource.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown resource: \"${uri}\"`)\n }\n if (resource.config.auth) await runAuthCheck(resource.config.auth, ctx.auth)\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/read', { uri }, ctx, async () => {\n let executePromise: Promise<unknown> = Promise.resolve(resource.handler(params))\n if (resource.config.timeout) {\n const ms = resource.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Resource \"${uri}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n ) as Promise<unknown>\n }\n return await executePromise\n }),\n )\n }\n\n /**\n * Dispatch a prompt render through this server's middleware chain using an inherited context.\n */\n async _dispatchPrompt(\n name: string,\n args: Record<string, string>,\n ctx: McpContext,\n ) {\n const prompt = this._prompts.get(name)\n if (!prompt || prompt.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown prompt: \"${name}\"`)\n }\n if (prompt.config.auth) await runAuthCheck(prompt.config.auth, ctx.auth)\n\n for (const arg of prompt.config.arguments ?? []) {\n if (arg.required && !(arg.name in args)) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Missing required argument \"${arg.name}\" for prompt \"${name}\"`,\n )\n }\n }\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'prompts/get', { name, arguments: args }, ctx, async () => {\n let executePromise = Promise.resolve(prompt.handler(args))\n if (prompt.config.timeout) {\n const ms = prompt.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Prompt \"${name}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n return convertPromptResult(await executePromise)\n }),\n )\n }\n\n private _mirrorTool(child: FastMCP, tool: RegisteredTool, prefix?: string): void {\n const originalName = tool.config.name\n const key = prefix ? `${prefix}_${originalName}` : originalName\n if (this._tools.has(key)) throw new Error(`Tool name collision on mount: \"${key}\" is already registered`)\n // Strip runtime validators — child's _dispatchTool runs them.\n // inputSchema/outputSchema are kept so clients see the correct JSON Schema.\n const forwardedConfig: ToolConfig = { ...tool.config, name: key, input: undefined, output: undefined }\n this.tool(forwardedConfig, (args: unknown) => {\n const parentCtx = contextStore.getStore()!\n // Inject prefix-aware tool name resolver so toolRef() inside the child resolves correctly.\n const childCtx: typeof parentCtx = prefix\n ? { ...parentCtx, resolveToolName: (name) => `${prefix}_${name}` }\n : parentCtx\n return child._dispatchTool(originalName, args, childCtx).then((result) => new ToolResult(result))\n })\n }\n\n private _mirrorResource(child: FastMCP, resource: RegisteredResource, prefix?: string): void {\n const name = resource.config.name ?? resource.config.uri\n const originalUri = resource.config.uri\n const targetUri = prefix ? prefixResourceUri(originalUri, prefix) : originalUri\n if (this._staticResources.has(targetUri) || this._templateResources.has(targetUri)) {\n throw new Error(`Resource URI collision on mount: \"${targetUri}\" is already registered`)\n }\n const forwardedConfig: ResourceConfig = {\n ...resource.config,\n uri: targetUri,\n name: prefix ? `${prefix}_${name}` : name,\n }\n // Return the raw handler result so the parent's ReadResource handler can call\n // convertResourceResult with the actual requested URI (correct for template expansions).\n this.resource(forwardedConfig, (params?: Record<string, string>) => {\n const ctx = contextStore.getStore()!\n return child._dispatchResource(originalUri, params, ctx)\n })\n }\n\n private _mirrorPrompt(child: FastMCP, prompt: RegisteredPrompt, prefix?: string): void {\n const originalName = prompt.config.name\n const key = prefix ? `${prefix}_${originalName}` : originalName\n if (this._prompts.has(key)) throw new Error(`Prompt name collision on mount: \"${key}\" is already registered`)\n const forwardedConfig: PromptConfig = { ...(prompt.config as PromptConfig), name: key }\n this.prompt(forwardedConfig, (args?: Record<string, string>) => {\n const ctx = contextStore.getStore()!\n return child\n ._dispatchPrompt(originalName, args ?? {}, ctx)\n .then((result) => new PromptResult(result.messages, result.description))\n })\n }\n\n /** Mount a child server onto this server. All tools, resources, and prompts from the child become accessible via this server. Pass a prefix to namespace names and prevent collisions. */\n mount(child: FastMCP, prefix?: string): this {\n if (child === this) throw new Error('Cannot mount a server onto itself')\n if (this._mountedChildren.has(child)) return this\n this._mountedChildren.add(child)\n\n for (const tool of child._tools.values()) this._mirrorTool(child, tool, prefix)\n for (const resource of child._staticResources.values()) this._mirrorResource(child, resource, prefix)\n for (const resource of child._templateResources.values()) this._mirrorResource(child, resource, prefix)\n for (const prompt of child._prompts.values()) this._mirrorPrompt(child, prompt, prefix)\n\n child._toolRegisteredCallbacks.push((tool) => this._mirrorTool(child, tool, prefix))\n child._resourceRegisteredCallbacks.push((resource) => this._mirrorResource(child, resource, prefix))\n child._promptRegisteredCallbacks.push((prompt) => this._mirrorPrompt(child, prompt, prefix))\n\n // When this server closes, drain the child's owned proxy connections\n this._proxyCloseCallbacks.push(async () => {\n await Promise.all(child._proxyCloseCallbacks.map((cb) => cb().catch(() => {})))\n child._proxyCloseCallbacks.length = 0\n })\n\n return this\n }\n\n /** Register a callback invoked when this server is closed — used by proxy connections. */\n _addCloseCallback(cb: () => Promise<void>): void {\n this._proxyCloseCallbacks.push(cb)\n }\n\n /**\n * Register a provider (FastMCPApp or FastMCP) on this server.\n * All tools, resources, and prompts from the provider are mounted without a prefix.\n * For FastMCPApp, pass provider.server; for FastMCP, pass directly.\n */\n addProvider(provider: FastMCP | { server: FastMCP }): this {\n const child = 'server' in provider ? provider.server : provider\n return this.mount(child)\n }\n\n private _applyTransformsToTools(\n tools: RegisteredTool[],\n ): Array<{ name: string; title: string | undefined; description: string; originalName: string; config: ToolConfig; handler: (args: unknown) => unknown }> {\n return tools.flatMap((tool) => {\n const view = applyTransformChain<ToolView>(\n { name: tool.config.name, title: tool.config.title, description: tool.config.description, tags: tool.config.tags ?? [] },\n this._transforms,\n (t, v) => t.transformTool?.(v),\n )\n return view\n ? [{ name: view.name, title: view.title, description: view.description, originalName: tool.config.name, config: tool.config, handler: tool.handler }]\n : []\n })\n }\n\n private _applyTransformsToResources(\n resources: RegisteredResource[],\n ): Array<{ uri: string; name: string; originalUri: string; config: ResourceConfig; handler: (params?: Record<string, string>) => unknown }> {\n return resources.flatMap((r) => {\n const resolvedName = r.config.name ?? r.config.uri\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: resolvedName, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResource?.(v),\n )\n return view\n ? [{ uri: view.uri, name: view.name, originalUri: r.config.uri, config: r.config, handler: r.handler }]\n : []\n })\n }\n\n private _applyTransformsToResourceTemplates(\n templates: RegisteredResource[],\n ): Array<{ uri: string; name: string; originalUri: string; config: ResourceConfig; handler: (params?: Record<string, string>) => unknown }> {\n return templates.flatMap((r) => {\n const resolvedName = r.config.name ?? r.config.uri\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: resolvedName, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResourceTemplate?.(v),\n )\n return view\n ? [{ uri: view.uri, name: view.name, originalUri: r.config.uri, config: r.config, handler: r.handler }]\n : []\n })\n }\n\n private _applyTransformsToPrompts(\n prompts: RegisteredPrompt[],\n ): Array<{ name: string; description: string; originalName: string; config: ResolvedPromptConfig; handler: (args?: Record<string, string>) => unknown }> {\n return prompts.flatMap((p) => {\n const view = applyTransformChain<PromptView>(\n { name: p.config.name, description: p.config.description, tags: p.config.tags ?? [] },\n this._transforms,\n (t, v) => t.transformPrompt?.(v),\n )\n return view\n ? [{ name: view.name, description: view.description, originalName: p.config.name, config: p.config, handler: p.handler }]\n : []\n })\n }\n\n private _buildSynthesizedTools(resourceViews: ResourceView[], promptViews: PromptView[]): SynthesizedTool[] {\n if (this._transforms.length === 0) return []\n const raw = this._transforms.flatMap((t) => t.synthesizeTools?.(resourceViews, promptViews) ?? [])\n return raw.flatMap((s) => {\n const view = applyTransformChain<ToolView>(\n { name: s.name, title: s.title, description: s.description, tags: [] },\n this._transforms,\n (t, v) => t.transformTool?.(v),\n )\n return view ? [{ ...s, name: view.name, title: view.title, description: view.description }] : []\n })\n }\n\n private async _getVisibleViews(\n token: AccessToken | undefined,\n ): Promise<{ resourceViews: ResourceView[]; promptViews: PromptView[] }> {\n const visibleStatic = (\n await Promise.all(\n [...this._staticResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const visibleTemplates = (\n await Promise.all(\n [...this._templateResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const visiblePrompts = (\n await Promise.all(\n [...this._prompts.values()].map(async (p) => {\n if (p.config.disabled) return null\n if (!p.config.auth) return p\n if (!token) return null\n try { await p.config.auth(token); return p } catch { return null }\n }),\n )\n ).filter((p): p is RegisteredPrompt => p !== null)\n\n const resourceViews: ResourceView[] = [\n ...this._applyTransformsToResources(visibleStatic),\n ...this._applyTransformsToResourceTemplates(visibleTemplates),\n ].map((r) => ({\n uri: r.uri,\n name: r.name,\n tags: r.config.tags ?? [],\n mimeType: r.config.mimeType,\n title: r.config.title,\n }))\n\n const promptViews: PromptView[] = this._applyTransformsToPrompts(visiblePrompts).map((p) => ({\n name: p.name,\n description: p.description,\n tags: p.config.tags ?? [],\n }))\n\n return { resourceViews, promptViews }\n }\n\n /**\n * Add a middleware to the pipeline.\n *\n * Can be called at any point before the first request arrives. `setup()` is\n * called immediately on the primary server so that notification handlers and\n * other server-level side-effects are active before `connect()` / `run()` is\n * called. HTTP sessions created after `use()` will also have `setup()` called\n * via `_makeServer()`.\n */\n use(mw: Middleware): this {\n this._middleware.push(mw)\n mw.setup?.(this._primaryServer)\n return this\n }\n\n getContext(): McpContext {\n const ctx = contextStore.getStore()\n if (!ctx) throw new Error('getContext() called outside of a request handler')\n return ctx\n }\n\n /** The bound address after run() resolves for the http transport. Null for stdio or before run(). */\n get address(): ServerAddress | null {\n return this._address\n }\n\n async connect(transport: Transport): Promise<void> {\n // Rebuild so UI extension capability reflects all registered components.\n this._primaryServer = this._makeServer()\n await this._primaryServer.connect(transport)\n }\n\n async run(options?: RunOptions): Promise<void> {\n const rawTransport = process.env.MCP_TRANSPORT ?? options?.transport ?? 'stdio'\n if (rawTransport !== 'stdio' && rawTransport !== 'http') {\n throw new Error(`Unknown transport: \"${rawTransport}\". Supported: stdio, http.`)\n }\n const transport = rawTransport as 'stdio' | 'http'\n\n const port = options?.port ?? parseInt(process.env.MCP_PORT ?? process.env.PORT ?? '3000', 10)\n const host = options?.host ?? process.env.MCP_HOST ?? '0.0.0.0'\n const path = options?.path ?? process.env.MCP_PATH ?? '/mcp'\n\n if (transport === 'stdio') {\n const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio')\n await this.connect(new StdioServerTransport(options?.stdin, options?.stdout))\n } else if (this._oauth) {\n await this._runHttpOAuth(port, host, path)\n } else {\n await this._runHttpSimple(port, host, path)\n }\n }\n\n private async _runHttpOAuth(port: number, host: string, path: string): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp'\n )\n const express = (await import('express')).default\n const { mcpAuthRouter } = await import('@modelcontextprotocol/sdk/server/auth/router')\n const { requireBearerAuth } = await import(\n '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth'\n )\n\n const oauth = this._oauth!\n const app = express()\n\n // Bind first so we can infer the issuerUrl from the actual bound port (handles port=0)\n const httpServer = await new Promise<HttpServer>((resolve, reject) => {\n const srv = app.listen(port, host, () => resolve(srv))\n srv.on('error', reject)\n })\n\n const bound = httpServer.address() as AddressInfo\n const issuerUrl = oauth.issuerUrl ?? new URL(`http://${bound.address}:${bound.port}`)\n\n // OAuth endpoints (authorize, token, register, metadata)\n app.use(\n mcpAuthRouter({\n provider: oauth.provider,\n issuerUrl,\n scopesSupported: oauth.scopes,\n }),\n )\n\n // MCP endpoint — protected by bearer auth\n app.all(\n path,\n requireBearerAuth({ verifier: oauth.provider }),\n async (req, res, _next) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n let mcpTransport: StreamableHTTPServerTransport\n\n if (sessionId) {\n const existing = this._sessions.get(sessionId)\n if (!existing) {\n res.status(404).json({ error: 'Session not found' })\n return\n }\n mcpTransport = existing.transport\n } else {\n const sessionState = new Map<string, unknown>()\n const sessionServer = this._makeServer(sessionState)\n mcpTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n this._sessions.set(id, { transport: mcpTransport, server: sessionServer, state: sessionState })\n },\n onsessionclosed: (id) => {\n const session = this._sessions.get(id)\n if (session) {\n const callbacks = (session.state.get(SESSION_CLOSE_CALLBACKS_KEY) as Array<() => void> | undefined) ?? []\n for (const cb of callbacks) cb()\n }\n this._sessions.delete(id)\n },\n })\n await sessionServer.connect(mcpTransport)\n }\n\n await mcpTransport.handleRequest(req, res)\n },\n )\n\n this._httpServer = httpServer\n this._address = { host: bound.address, port: bound.port, path }\n }\n\n private async _runHttpSimple(port: number, host: string, path: string): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp'\n )\n const { createServer } = await import('node:http')\n\n const auth = this._auth\n\n const corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization, Mcp-Session-Id',\n }\n\n const httpServer = createServer(async (req, res) => {\n // CORS preflight\n if (req.method === 'OPTIONS') {\n res.writeHead(204, corsHeaders).end()\n return\n }\n\n if (req.url?.split('?')[0] !== path) {\n res.writeHead(404).end()\n return\n }\n\n // Attach CORS headers to all responses\n for (const [k, v] of Object.entries(corsHeaders)) res.setHeader(k, v)\n\n // Auth middleware\n if (auth) {\n const authHeader = req.headers.authorization\n const bearer = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null\n\n if (!bearer) {\n res\n .writeHead(401, { 'Content-Type': 'application/json', 'WWW-Authenticate': 'Bearer realm=\"mcp\"' })\n .end(JSON.stringify({ error: 'Missing bearer token' }))\n return\n }\n\n try {\n const accessToken = await auth.verify(bearer)\n ;(req as IncomingMessage & { auth: AuthInfo }).auth = {\n token: accessToken.token,\n clientId: accessToken.clientId ?? '',\n scopes: accessToken.scopes,\n expiresAt: accessToken.expiresAt,\n extra: accessToken.claims,\n }\n } catch (err) {\n if (err instanceof AuthorizationError) {\n res\n .writeHead(403, { 'Content-Type': 'application/json' })\n .end(JSON.stringify({ error: err.message }))\n } else {\n res\n .writeHead(401, { 'Content-Type': 'application/json', 'WWW-Authenticate': 'Bearer realm=\"mcp\"' })\n .end(JSON.stringify({ error: err instanceof Error ? err.message : 'Authentication failed' }))\n }\n return\n }\n }\n\n // Session routing: each client connection gets its own transport + server\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n let mcpTransport: StreamableHTTPServerTransport\n\n if (sessionId) {\n const existing = this._sessions.get(sessionId)\n if (!existing) {\n res\n .writeHead(404, { 'Content-Type': 'application/json' })\n .end(JSON.stringify({ error: 'Session not found' }))\n return\n }\n mcpTransport = existing.transport\n } else {\n const sessionState = new Map<string, unknown>()\n const sessionServer = this._makeServer(sessionState)\n mcpTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n this._sessions.set(id, { transport: mcpTransport, server: sessionServer, state: sessionState })\n },\n onsessionclosed: (id) => {\n const session = this._sessions.get(id)\n if (session) {\n const callbacks = (session.state.get(SESSION_CLOSE_CALLBACKS_KEY) as Array<() => void> | undefined) ?? []\n for (const cb of callbacks) cb()\n }\n this._sessions.delete(id)\n },\n })\n await sessionServer.connect(mcpTransport)\n }\n\n await mcpTransport.handleRequest(req, res)\n })\n\n this._httpServer = httpServer\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once('error', reject)\n httpServer.listen(port, host, resolve)\n })\n\n const bound = httpServer.address() as AddressInfo\n this._address = { host: bound.address, port: bound.port, path }\n }\n\n async close(): Promise<void> {\n await Promise.all(this._proxyCloseCallbacks.map((cb) => cb().catch(() => {})))\n this._proxyCloseCallbacks.length = 0\n\n await Promise.all(\n [...this._sessions.values()].map(({ transport }) => transport.close().catch(() => {})),\n )\n this._sessions.clear()\n\n if (this._httpServer) {\n await new Promise<void>((resolve, reject) => {\n this._httpServer!.close((err) => (err != null ? reject(err) : resolve()))\n })\n this._httpServer = null\n }\n this._address = null\n await this._primaryServer.close()\n }\n}\n","export interface AccessToken {\n /** The raw bearer token string. */\n token: string\n /** The subject/client identifier from the token. */\n clientId?: string\n /** Scopes granted to the token. */\n scopes: string[]\n /** Unix timestamp (seconds) when the token expires. */\n expiresAt?: number\n /** All claims from the token payload. */\n claims: Record<string, unknown>\n}\n\nexport interface TokenVerifier {\n verify(token: string): Promise<AccessToken>\n}\n\n/**\n * Thrown by authorization checks to produce a 403 response.\n * Any other error thrown during verification produces a 401.\n */\nexport class AuthorizationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'AuthorizationError'\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport type { Server } from '@modelcontextprotocol/sdk/server'\nimport type { AccessToken } from './auth/types'\n\n// ---------------------------------------------------------------------------\n// Supporting types\n// ---------------------------------------------------------------------------\n\nexport type LogLevel =\n | 'debug'\n | 'info'\n | 'notice'\n | 'warning'\n | 'error'\n | 'critical'\n | 'alert'\n | 'emergency'\n\nexport interface SamplingMessage {\n role: 'user' | 'assistant'\n content:\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n}\n\nexport interface SamplingParams {\n messages: SamplingMessage[]\n systemPrompt?: string\n /** Maximum tokens to generate. Defaults to 1024. */\n maxTokens?: number\n temperature?: number\n stopSequences?: string[]\n modelPreferences?: {\n hints?: Array<{ name?: string }>\n costPriority?: number\n speedPriority?: number\n intelligencePriority?: number\n }\n}\n\nexport interface SamplingResult {\n role: 'assistant'\n content:\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n model: string\n stopReason?: string\n}\n\n/**\n * Flat JSON Schema object describing fields to collect from the user.\n * Only primitive property types (string, number, boolean) are allowed per the MCP spec.\n */\nexport interface ElicitationSchema {\n type: 'object'\n properties: Record<\n string,\n { type: 'string' | 'number' | 'boolean'; title?: string; description?: string }\n >\n required?: string[]\n}\n\nexport interface ElicitationResult {\n /** How the user responded to the elicitation. */\n action: 'accept' | 'decline' | 'cancel'\n /** Submitted form values. Present only when action is 'accept'. */\n content?: Record<string, string | number | boolean>\n}\n\nexport interface Root {\n uri: string\n name?: string\n}\n\n// ---------------------------------------------------------------------------\n// McpContext — public interface returned by mcp.getContext()\n// ---------------------------------------------------------------------------\n\nexport interface McpContext {\n /** Auth token for the current request, if any. */\n auth: AccessToken | undefined\n /** The MCP request ID for the current call. */\n requestId: string | undefined\n\n // --- Logging ---\n\n /** Send a log message to the client at the specified RFC 5424 severity level. */\n log(level: LogLevel, message: string, loggerName?: string): Promise<void>\n debug(message: string, loggerName?: string): Promise<void>\n info(message: string, loggerName?: string): Promise<void>\n notice(message: string, loggerName?: string): Promise<void>\n warning(message: string, loggerName?: string): Promise<void>\n error(message: string, loggerName?: string): Promise<void>\n critical(message: string, loggerName?: string): Promise<void>\n alert(message: string, loggerName?: string): Promise<void>\n emergency(message: string, loggerName?: string): Promise<void>\n\n // --- Progress ---\n\n /**\n * Send a progress notification to the client.\n * No-op if the request did not include a `progressToken` in its `_meta`.\n */\n reportProgress(progress: number, total?: number, message?: string): Promise<void>\n\n // --- Sampling ---\n\n /**\n * Ask the client to perform an LLM inference call and return the result.\n * Throws if the client has not advertised the `sampling` capability.\n */\n sample(params: SamplingParams): Promise<SamplingResult>\n\n // --- Elicitation ---\n\n /**\n * Ask the client to collect input from the user via a form dialog.\n * Throws if the client has not advertised the `elicitation` capability.\n */\n elicit(message: string, schema: ElicitationSchema): Promise<ElicitationResult>\n\n // --- Roots ---\n\n /**\n * Request the list of filesystem roots the client has declared.\n * Throws if the client has not advertised the `roots` capability.\n */\n listRoots(): Promise<Root[]>\n\n // --- Session state ---\n\n /** Retrieve a value from session-scoped state. Returns undefined if not set. */\n getState(key: string): unknown\n /** Store a value in session-scoped state. Persists for the lifetime of the session. */\n setState(key: string, value: unknown): void\n /** Remove a value from session-scoped state. */\n deleteState(key: string): void\n\n // --- Apps ---\n\n /**\n * Resolve a logical tool name to its current external name, accounting for\n * any namespace prefix applied when the owning FastMCPApp was mounted.\n * Returns the name unchanged when called outside a mounted context.\n */\n resolveToolName(name: string): string\n\n // --- Session lifecycle ---\n\n /**\n * Register a callback that runs when the current session closes.\n * Useful for releasing per-session resources (e.g. uploaded files).\n * No-op if called outside an active HTTP session.\n */\n onClose(callback: () => void): void\n}\n\n// ---------------------------------------------------------------------------\n// AsyncLocalStorage store\n// ---------------------------------------------------------------------------\n\nexport const contextStore = new AsyncLocalStorage<McpContext>()\n\n/** Internal session-state key for per-session close callbacks. */\nexport const SESSION_CLOSE_CALLBACKS_KEY = '__fastmcp_session_close_callbacks'\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a McpContext for a single request.\n *\n * @param server The SDK Server instance for this session.\n * @param requestId The MCP request ID from the incoming message.\n * @param progressToken The progress token from `req.params._meta.progressToken`, if any.\n * @param auth The verified access token, if any.\n * @param sessionState The per-session state Map (shared across requests in the same session).\n */\nexport function createContext(\n server: Server,\n requestId: string | undefined,\n progressToken: string | number | undefined,\n auth: AccessToken | undefined,\n sessionState: Map<string, unknown>,\n): McpContext {\n async function log(level: LogLevel, message: string, loggerName?: string): Promise<void> {\n await server.sendLoggingMessage({\n level,\n data: message,\n ...(loggerName !== undefined ? { logger: loggerName } : {}),\n })\n }\n\n return {\n auth,\n requestId,\n\n log,\n debug: (msg, logger) => log('debug', msg, logger),\n info: (msg, logger) => log('info', msg, logger),\n notice: (msg, logger) => log('notice', msg, logger),\n warning: (msg, logger) => log('warning', msg, logger),\n error: (msg, logger) => log('error', msg, logger),\n critical: (msg, logger) => log('critical', msg, logger),\n alert: (msg, logger) => log('alert', msg, logger),\n emergency: (msg, logger) => log('emergency', msg, logger),\n\n async reportProgress(progress, total, message) {\n if (progressToken === undefined) return\n await server.notification({\n method: 'notifications/progress',\n params: {\n progressToken,\n progress,\n ...(total !== undefined ? { total } : {}),\n ...(message !== undefined ? { message } : {}),\n },\n })\n },\n\n async sample(params) {\n const caps = server.getClientCapabilities()\n if (!caps?.sampling) {\n throw new Error(\n '[fastmcp] Client does not support sampling. Ensure the client advertises the sampling capability before calling ctx.sample().',\n )\n }\n const result = await server.createMessage({\n messages: params.messages,\n maxTokens: params.maxTokens ?? 1024,\n ...(params.systemPrompt !== undefined ? { systemPrompt: params.systemPrompt } : {}),\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences !== undefined ? { stopSequences: params.stopSequences } : {}),\n ...(params.modelPreferences !== undefined\n ? { modelPreferences: params.modelPreferences }\n : {}),\n })\n return {\n role: 'assistant' as const,\n content: result.content as SamplingResult['content'],\n model: result.model,\n stopReason: result.stopReason,\n }\n },\n\n async elicit(message, schema) {\n const caps = server.getClientCapabilities()\n if (!caps?.elicitation) {\n throw new Error(\n '[fastmcp] Client does not support elicitation. Ensure the client advertises the elicitation capability before calling ctx.elicit().',\n )\n }\n const result = await server.elicitInput({\n message,\n // Cast: our simplified ElicitationSchema is a subset of the SDK's PrimitiveSchemaDefinition union\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n requestedSchema: schema as any,\n })\n return {\n action: result.action,\n content: result.content as ElicitationResult['content'],\n }\n },\n\n async listRoots() {\n const caps = server.getClientCapabilities()\n if (!caps?.roots) {\n throw new Error(\n '[fastmcp] Client does not support roots. Ensure the client advertises the roots capability before calling ctx.listRoots().',\n )\n }\n const result = await server.listRoots()\n return result.roots\n },\n\n getState: (key) => sessionState.get(key),\n setState: (key, value) => {\n sessionState.set(key, value)\n },\n deleteState: (key) => {\n sessionState.delete(key)\n },\n\n resolveToolName: (name) => name,\n\n onClose(callback) {\n const existing = (sessionState.get(SESSION_CLOSE_CALLBACKS_KEY) as Array<() => void> | undefined) ?? []\n sessionState.set(SESSION_CLOSE_CALLBACKS_KEY, [...existing, callback])\n },\n }\n}\n","import { McpError, ErrorCode, CancelledNotificationSchema } from '@modelcontextprotocol/sdk/types.js'\nimport type { Server } from '@modelcontextprotocol/sdk/server'\nimport type { McpContext } from './context'\n\n// ---------------------------------------------------------------------------\n// Core types\n// ---------------------------------------------------------------------------\n\nexport interface MiddlewareContext<T = unknown> {\n readonly method: string\n readonly request: T\n readonly mcpContext: McpContext\n}\n\nexport type Next<R = unknown> = () => Promise<R>\n\nexport interface Middleware {\n /** Called once per Server instance. Use to register notification handlers or other server-level setup. */\n setup?(server: Server): void\n\n // Coarse hook — fires for every request that has no more-specific hook on this instance\n onRequest?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n\n // Per-method hooks — take precedence over onRequest for their specific method\n onCallTool?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n onListTools?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n onReadResource?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n onListResources?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n onListResourceTemplates?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n onGetPrompt?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n onListPrompts?<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R>\n}\n\n// ---------------------------------------------------------------------------\n// Chain execution\n// ---------------------------------------------------------------------------\n\nconst METHOD_HOOK_KEY: Partial<Record<string, keyof Middleware>> = {\n 'tools/call': 'onCallTool',\n 'tools/list': 'onListTools',\n 'resources/read': 'onReadResource',\n 'resources/list': 'onListResources',\n 'resources/templates/list': 'onListResourceTemplates',\n 'prompts/get': 'onGetPrompt',\n 'prompts/list': 'onListPrompts',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyHookFn = (ctx: MiddlewareContext<any>, next: Next<any>) => Promise<any>\n\nfunction selectHook(mw: Middleware, method: string): AnyHookFn | null {\n const key = METHOD_HOOK_KEY[method]\n const specific = key ? (mw[key] as AnyHookFn | undefined) : undefined\n if (specific) return specific.bind(mw)\n if (mw.onRequest) return (mw.onRequest as AnyHookFn).bind(mw)\n return null\n}\n\n/** Build and execute the middleware chain, calling `handler` at the innermost level. */\nexport function runMiddlewareChain<R>(\n middleware: Middleware[],\n method: string,\n request: unknown,\n mcpContext: McpContext,\n handler: () => Promise<R>,\n): Promise<R> {\n const hooks: AnyHookFn[] = []\n for (const mw of middleware) {\n const hook = selectHook(mw, method)\n if (hook) hooks.push(hook)\n }\n\n const ctx: MiddlewareContext = { method, request, mcpContext }\n\n function dispatch(i: number): Promise<R> {\n if (i >= hooks.length) return handler()\n return hooks[i](ctx, () => dispatch(i + 1))\n }\n\n return dispatch(0)\n}\n\n// ---------------------------------------------------------------------------\n// Built-in middleware\n// ---------------------------------------------------------------------------\n\n/** Logs every request with method, outcome, and elapsed time. */\nexport class LoggingMiddleware implements Middleware {\n constructor(private readonly emit: (msg: string) => void = console.log) {}\n\n async onRequest<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n const t0 = Date.now()\n this.emit(`[fastmcp] → ${ctx.method}`)\n try {\n const result = await next()\n this.emit(`[fastmcp] ← ${ctx.method} (${Date.now() - t0}ms)`)\n return result\n } catch (err) {\n this.emit(\n `[fastmcp] ✗ ${ctx.method} (${Date.now() - t0}ms): ${err instanceof Error ? err.message : String(err)}`,\n )\n throw err\n }\n }\n}\n\n/**\n * Custom cache key function. Receives the full middleware context so callers can\n * incorporate auth identity or any other dimension into the key.\n *\n * **Required when using per-component auth checks.** The default key is\n * `\"method:JSON(params)\"`, which contains no auth information. If auth-filtered\n * list results (tools, resources, prompts) are cached with the default key, one\n * session's filtered results can be served to a session with different permissions.\n * Pass a `keyFn` that includes the caller identity, e.g.:\n *\n * ```ts\n * new CachingMiddleware(60_000, (ctx) =>\n * `${ctx.method}:${ctx.mcpContext.auth?.clientId ?? ''}:${JSON.stringify(ctx.request)}`\n * )\n * ```\n */\nexport type CacheKeyFn = (ctx: MiddlewareContext) => string\n\n/** TTL-based response cache keyed on method + serialised request params by default.\n * Pass a custom `keyFn` when using per-component auth so cached results are\n * partitioned by caller identity. */\nexport class CachingMiddleware implements Middleware {\n private readonly _cache = new Map<string, { value: unknown; expiresAt: number }>()\n\n constructor(\n readonly ttl: number = 60_000,\n private readonly _keyFn?: CacheKeyFn,\n ) {}\n\n async onRequest<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n const key = this._keyFn\n ? this._keyFn(ctx as MiddlewareContext)\n : `${ctx.method}:${JSON.stringify(ctx.request)}`\n const entry = this._cache.get(key)\n if (entry && entry.expiresAt > Date.now()) return entry.value as R\n const result = await next()\n this._cache.set(key, { value: result, expiresAt: Date.now() + this.ttl })\n return result\n }\n}\n\n/** Fixed-window counter rate limiter. Resets to full capacity after every windowMs interval. */\nexport class RateLimitingMiddleware implements Middleware {\n private _tokens: number\n private _lastRefill: number\n\n constructor(\n private readonly limit: number,\n private readonly windowMs: number = 60_000,\n ) {\n this._tokens = limit\n this._lastRefill = Date.now()\n }\n\n async onRequest<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n const now = Date.now()\n if (now - this._lastRefill >= this.windowMs) {\n this._tokens = this.limit\n this._lastRefill = now\n }\n if (this._tokens <= 0) {\n throw new McpError(ErrorCode.InvalidRequest, 'Rate limit exceeded')\n }\n this._tokens--\n return next()\n }\n}\n\n/** Rejects responses whose JSON serialisation exceeds maxBytes. */\nexport class SizeLimitingMiddleware implements Middleware {\n constructor(private readonly maxBytes: number) {}\n\n async onRequest<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n const result = await next()\n const size = Buffer.byteLength(JSON.stringify(result), 'utf8')\n if (size > this.maxBytes) {\n throw new McpError(\n ErrorCode.InternalError,\n `Response size (${size} bytes) exceeds limit (${this.maxBytes} bytes)`,\n )\n }\n return result\n }\n}\n\n/**\n * Normalises errors thrown by handlers to proper MCP shapes:\n * - tools/call plain errors → { isError: true, content: [...] } (per MCP spec)\n * - tools/call McpError → re-thrown as a protocol-level error\n * - all other methods → McpError(InternalError, message)\n *\n * Re-throwing McpError from onCallTool ensures that middleware-level errors\n * (e.g. from RateLimitingMiddleware or SizeLimitingMiddleware stacked before\n * this middleware) always propagate as protocol errors and are never silently\n * converted to isError:true tool responses.\n */\nexport class ErrorNormalizationMiddleware implements Middleware {\n async onCallTool<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n try {\n return await next()\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n } as unknown as R\n }\n }\n\n async onRequest<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n try {\n return await next()\n } catch (err) {\n if (err instanceof McpError) throw err\n throw new McpError(\n ErrorCode.InternalError,\n err instanceof Error ? err.message : String(err),\n )\n }\n }\n}\n\n/**\n * Intercepts `notifications/cancelled` from the client and aborts the matching\n * in-flight handler via Promise.race + AbortController.\n */\nexport class CancellationMiddleware implements Middleware {\n private readonly _inFlight = new Map<string, AbortController>()\n\n setup(server: Server): void {\n server.setNotificationHandler(CancelledNotificationSchema, (notification) => {\n const requestId = String(notification.params.requestId)\n this._inFlight.get(requestId)?.abort()\n })\n }\n\n async onRequest<T, R>(ctx: MiddlewareContext<T>, next: Next<R>): Promise<R> {\n const { requestId } = ctx.mcpContext\n if (!requestId) return next()\n\n const controller = new AbortController()\n this._inFlight.set(requestId, controller)\n\n const abortPromise = new Promise<never>((_, reject) => {\n controller.signal.addEventListener('abort', () =>\n reject(new McpError(ErrorCode.InternalError, 'Request was cancelled by the client')),\n )\n })\n\n try {\n return await Promise.race([next(), abortPromise])\n } finally {\n this._inFlight.delete(requestId)\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// View types — simplified projections passed to transforms\n// ---------------------------------------------------------------------------\n\nexport interface ToolView {\n readonly name: string\n /** Human-readable display name shown in UIs. Takes precedence over `name` for display purposes. */\n readonly title?: string\n readonly description: string\n readonly tags: readonly string[]\n}\n\nexport interface ResourceView {\n readonly uri: string\n readonly name: string\n readonly tags: readonly string[]\n readonly mimeType?: string\n readonly title?: string\n}\n\nexport interface PromptView {\n readonly name: string\n readonly description: string\n readonly tags: readonly string[]\n}\n\n// ---------------------------------------------------------------------------\n// Synthesized tool — produced by a transform from other components\n// ---------------------------------------------------------------------------\n\nexport interface SynthesizedTool {\n readonly name: string\n /** Human-readable display name shown in UIs. Takes precedence over `name` for display purposes. */\n readonly title?: string\n readonly description: string\n readonly inputSchema?: Record<string, unknown>\n readonly auth?: import('./auth/authorization').AuthCheck\n readonly timeout?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly handler: (args: any) => unknown\n}\n\n// ---------------------------------------------------------------------------\n// Transform interface\n// ---------------------------------------------------------------------------\n\nexport interface Transform {\n /**\n * Transform a tool view before it appears in list responses.\n * Return a modified view to rename/redescribe; return null to hide the tool\n * from list responses (it remains callable by its original name).\n */\n transformTool?(view: ToolView): ToolView | null\n\n /** Transform a static resource view. */\n transformResource?(view: ResourceView): ResourceView | null\n\n /** Transform a URI-template resource view. */\n transformResourceTemplate?(view: ResourceView): ResourceView | null\n\n /** Transform a prompt view. */\n transformPrompt?(view: PromptView): PromptView | null\n\n /**\n * Synthesize additional tools derived from the current resource and prompt lists.\n * Called at request time so the snapshot is always fresh.\n */\n synthesizeTools?(resources: ResourceView[], prompts: PromptView[]): SynthesizedTool[]\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper — apply a chain of transforms to a single view\n// ---------------------------------------------------------------------------\n\nexport function applyTransformChain<T>(\n value: T,\n transforms: Transform[],\n pick: (t: Transform, v: T) => T | null | undefined,\n): T | null {\n let current: T | null = value\n for (const t of transforms) {\n if (current === null) break\n const next = pick(t, current)\n if (next !== undefined) current = next\n }\n return current\n}\n\n// ---------------------------------------------------------------------------\n// Built-in transforms\n// ---------------------------------------------------------------------------\n\n/** Rename a single tool. The original name still resolves at call time. */\nexport function renameTool(originalName: string, newName: string): Transform {\n return {\n transformTool: (v) => (v.name === originalName ? { ...v, name: newName } : v),\n }\n}\n\n/** Rewrite the description of a single tool. */\nexport function redescribeTool(toolName: string, description: string): Transform {\n return {\n transformTool: (v) => (v.name === toolName ? { ...v, description } : v),\n }\n}\n\n/**\n * Hide components whose predicate returns false.\n * Hidden items are removed from list responses but remain callable by original name.\n */\nexport class FilterTransform implements Transform {\n constructor(\n private readonly predicates: {\n tools?: (v: ToolView) => boolean\n resources?: (v: ResourceView) => boolean\n /** When omitted, falls back to the `resources` predicate. */\n resourceTemplates?: (v: ResourceView) => boolean\n prompts?: (v: PromptView) => boolean\n },\n ) {}\n\n transformTool(v: ToolView): ToolView | null {\n return (this.predicates.tools?.(v) ?? true) ? v : null\n }\n transformResource(v: ResourceView): ResourceView | null {\n return (this.predicates.resources?.(v) ?? true) ? v : null\n }\n transformResourceTemplate(v: ResourceView): ResourceView | null {\n const pred = this.predicates.resourceTemplates ?? this.predicates.resources\n return (pred?.(v) ?? true) ? v : null\n }\n transformPrompt(v: PromptView): PromptView | null {\n return (this.predicates.prompts?.(v) ?? true) ? v : null\n }\n}\n\n/** Prefix all tool, prompt, and resource names with a string. URIs are left unchanged. */\nexport class NamespaceTransform implements Transform {\n constructor(private readonly prefix: string) {}\n\n transformTool(v: ToolView): ToolView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n transformResource(v: ResourceView): ResourceView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n transformResourceTemplate(v: ResourceView): ResourceView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n transformPrompt(v: PromptView): PromptView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n}\n\n/** Expose registered resources as a `list_resources` tool. */\nexport class ResourcesAsTools implements Transform {\n synthesizeTools(resources: ResourceView[]): SynthesizedTool[] {\n return [\n {\n name: 'list_resources',\n description: 'List all available MCP resources',\n inputSchema: { type: 'object', properties: {} },\n handler: () => resources.map((r) => ({ uri: r.uri, name: r.name, mimeType: r.mimeType })),\n },\n ]\n }\n}\n\n/** Expose registered prompts as a `list_prompts` tool. */\nexport class PromptsAsTools implements Transform {\n synthesizeTools(_resources: ResourceView[], prompts: PromptView[]): SynthesizedTool[] {\n return [\n {\n name: 'list_prompts',\n description: 'List all available MCP prompts',\n inputSchema: { type: 'object', properties: {} },\n handler: () => prompts.map((p) => ({ name: p.name, description: p.description })),\n },\n ]\n }\n}\n\n/**\n * Expose only components whose tags include the specified version string.\n * Components with no tags are always excluded.\n */\nexport class VersionFilter implements Transform {\n constructor(private readonly version: string) {}\n\n private _matches(tags: readonly string[]): boolean {\n return tags.includes(this.version)\n }\n\n transformTool(v: ToolView): ToolView | null {\n return this._matches(v.tags) ? v : null\n }\n transformResource(v: ResourceView): ResourceView | null {\n return this._matches(v.tags) ? v : null\n }\n transformResourceTemplate(v: ResourceView): ResourceView | null {\n return this._matches(v.tags) ? v : null\n }\n transformPrompt(v: PromptView): PromptView | null {\n return this._matches(v.tags) ? v : null\n }\n}\n","import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\n\nexport class Image {\n constructor(\n readonly buffer: Buffer | Uint8Array,\n readonly mimeType: string,\n ) {}\n}\n\nexport class File {\n constructor(\n readonly buffer: Buffer | Uint8Array,\n readonly name: string,\n readonly mimeType: string,\n ) {}\n}\n\nexport class ToolResult {\n constructor(readonly result: CallToolResult) {}\n}\n\nexport function convertResult(value: unknown): CallToolResult {\n if (value instanceof ToolResult) {\n return value.result\n }\n if (value instanceof Image) {\n return {\n content: [\n {\n type: 'image',\n data: Buffer.from(value.buffer).toString('base64'),\n mimeType: value.mimeType,\n },\n ],\n }\n }\n if (value instanceof File) {\n return {\n content: [\n {\n type: 'resource',\n resource: {\n uri: `file://${value.name}`,\n mimeType: value.mimeType,\n blob: Buffer.from(value.buffer).toString('base64'),\n },\n },\n ],\n }\n }\n if (value === undefined || value === null) {\n return { content: [] }\n }\n if (Array.isArray(value)) {\n console.warn(\n '[fastmcp] Tool returned an array — structuredContent will not be set (MCP spec requires a plain object). Wrap in an object or use ToolResult to suppress this warning.',\n )\n return {\n content: [{ type: 'text', text: JSON.stringify(value) }],\n }\n }\n if (typeof value === 'object') {\n const json = JSON.stringify(value)\n return {\n content: [{ type: 'text', text: json }],\n structuredContent: value as Record<string, unknown>,\n }\n }\n // string, number, boolean\n return {\n content: [{ type: 'text', text: String(value) }],\n }\n}\n\nexport async function toJsonSchema(\n schema: StandardSchemaV1,\n context?: string,\n): Promise<Record<string, unknown>> {\n // Strategy 1: schema-native .toJsonSchema() method (ArkType and any library following this convention)\n const maybeNative = schema as { toJsonSchema?: () => unknown }\n if (typeof maybeNative.toJsonSchema === 'function') {\n try {\n const result = maybeNative.toJsonSchema()\n if (result !== null && typeof result === 'object') {\n return result as Record<string, unknown>\n }\n } catch {\n // fall through\n }\n }\n\n // Strategy 2: Zod v4 z.toJSONSchema()\n try {\n const { z } = await import('zod')\n return (z as unknown as { toJSONSchema: (s: unknown) => Record<string, unknown> }).toJSONSchema(\n schema,\n )\n } catch {\n // fall through\n }\n\n const where = context ? ` for ${context}` : ''\n console.warn(\n `[fastmcp] Could not auto-generate JSON schema${where}. Sending { type: 'object' } to clients. Provide an explicit 'inputSchema' in ToolConfig to suppress this warning.`,\n )\n return { type: 'object' }\n}\n\nexport async function validateInput<S extends StandardSchemaV1>(\n schema: S,\n input: unknown,\n throwAsProtocolError = false,\n): Promise<StandardSchemaV1.InferOutput<S>> {\n const result = await schema['~standard'].validate(input)\n if (result.issues) {\n const messages = result.issues.map((i) => i.message).join('; ')\n if (throwAsProtocolError) {\n throw new McpError(ErrorCode.InvalidParams, `Validation failed: ${messages}`)\n }\n throw new Error(`Validation failed: ${messages}`)\n }\n return result.value as StandardSchemaV1.InferOutput<S>\n}\n","import type { AuthCheck } from './auth/authorization'\nimport type { ResourceUiMeta } from './apps/types'\n\nexport interface ResourceAnnotations {\n /** Intended audience(s) — 'user', 'assistant', or both. */\n audience?: Array<'user' | 'assistant'>\n /** Importance hint from 0 (least) to 1 (most). */\n priority?: number\n /** ISO 8601 timestamp of last modification. */\n lastModified?: string\n}\n\nexport interface ResourceConfig {\n /** Static URI (e.g. `file://readme`) or RFC 6570 template (e.g. `user://{id}`). */\n uri: string\n /** Programmatic identifier. Defaults to the uri. */\n name?: string\n /** Human-readable display name shown in UIs. Defaults to `name`. */\n title?: string\n description?: string\n /** MIME type of the resource content. Defaults to 'text/plain' for strings, 'application/octet-stream' for binary. */\n mimeType?: string\n /**\n * Size of the resource content in bytes, if known.\n * Only meaningful for static resources; ignored for URI templates.\n */\n size?: number\n /** Behavioral hints for clients. */\n annotations?: ResourceAnnotations\n /** Execution timeout in milliseconds. No timeout by default. */\n timeout?: number\n /** When true the resource is hidden from list responses and cannot be read. */\n disabled?: boolean\n /** Arbitrary tags for server-side filtering. */\n tags?: string[]\n auth?: AuthCheck\n /** Apps extension metadata. Included in _meta.ui in resources/list for UI-capable clients. */\n ui?: ResourceUiMeta\n}\n\n/**\n * Escape hatch for full control over resource response content.\n * Return this from a resource handler to specify content directly.\n */\nexport class ResourceResult {\n constructor(\n readonly contents: Array<{\n uri: string\n mimeType?: string\n text?: string\n blob?: string\n }>,\n ) {}\n}\n\ntype ResourceContent =\n | { uri: string; mimeType?: string; text: string }\n | { uri: string; mimeType?: string; blob: string }\n\n/**\n * Converts a resource handler's return value into the MCP ReadResourceResult shape.\n *\n * - string → text content\n * - Buffer / Uint8Array → base64 blob content\n * - object / array → JSON-serialised text with mimeType application/json\n * - ResourceResult → passthrough\n * - null / undefined → empty text content\n */\nexport function convertResourceResult(\n value: unknown,\n uri: string,\n mimeType?: string,\n): { contents: ResourceContent[] } {\n if (value instanceof ResourceResult) {\n return { contents: value.contents as ResourceContent[] }\n }\n if (value instanceof Buffer || value instanceof Uint8Array) {\n return {\n contents: [\n {\n uri,\n mimeType: mimeType ?? 'application/octet-stream',\n blob: Buffer.from(value).toString('base64'),\n },\n ],\n }\n }\n if (value === null || value === undefined) {\n return { contents: [{ uri, mimeType: mimeType ?? 'text/plain', text: '' }] }\n }\n if (typeof value === 'object') {\n return {\n contents: [{ uri, mimeType: mimeType ?? 'application/json', text: JSON.stringify(value) }],\n }\n }\n // string, number, boolean\n return { contents: [{ uri, mimeType: mimeType ?? 'text/plain', text: String(value) }] }\n}\n\n/** Returns true if the URI string contains RFC 6570 template expressions. */\nexport function isUriTemplate(uri: string): boolean {\n return uri.includes('{')\n}\n\n/**\n * Matches a concrete URI against an RFC 6570 URI template and returns the\n * extracted parameter values, or null if the URI does not match the template.\n *\n * Supports:\n * - Simple path params: {id} → matches a single path segment\n * - Wildcard path params: {path*} → matches multiple segments (including '/')\n * - Query params: {?q,lang} → extracted from the query string\n */\nexport function matchTemplate(\n uriTemplate: string,\n uri: string,\n): Record<string, string> | null {\n // Split URI into base and query string\n const qIdx = uri.indexOf('?')\n const baseUri = qIdx >= 0 ? uri.slice(0, qIdx) : uri\n const queryString = qIdx >= 0 ? uri.slice(qIdx + 1) : ''\n\n // Pull out query param names from {?...} expressions and strip them from the template\n const queryParamNames: string[] = []\n const baseTemplate = uriTemplate.replace(/\\{[?][^}]+\\}/g, (match) => {\n match\n .slice(2, -1)\n .split(',')\n .map((s) => s.trim())\n .forEach((n) => queryParamNames.push(n))\n return ''\n })\n\n // Build a regex from the base template, collecting path param names\n const names: string[] = []\n const segments = baseTemplate.split(/(\\{[^}]+\\})/g)\n let pattern = '^'\n for (const seg of segments) {\n if (seg.startsWith('{') && seg.endsWith('}')) {\n const inner = seg.slice(1, -1)\n if (inner.endsWith('*')) {\n names.push(inner.slice(0, -1))\n pattern += '(.+)'\n } else {\n names.push(inner)\n pattern += '([^/?]+)'\n }\n } else if (seg) {\n // Escape regex metacharacters in literal parts\n pattern += seg.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n }\n }\n pattern += '$'\n\n const pathMatch = baseUri.match(new RegExp(pattern))\n if (!pathMatch) return null\n\n const params: Record<string, string> = {}\n names.forEach((name, i) => {\n params[name] = decodeURIComponent(pathMatch[i + 1])\n })\n\n // Extract query parameters\n if (queryParamNames.length > 0 && queryString) {\n const sp = new URLSearchParams(queryString)\n for (const name of queryParamNames) {\n const val = sp.get(name)\n if (val !== null) params[name] = val\n }\n }\n\n return params\n}\n","export const UI_EXTENSION_KEY = 'io.modelcontextprotocol/ui'\nexport const UI_RESOURCE_MIME_TYPE = 'text/html;profile=mcp-app'\n\nexport type Visibility = 'model' | 'app'\n\nexport interface CspPolicy {\n connectDomains?: string[]\n /** Covers img-src, script-src, style-src, font-src, media-src. */\n resourceDomains?: string[]\n frameDomains?: string[]\n baseUriDomains?: string[]\n}\n\nexport interface UiToolMeta {\n /** Explicit resource URI. Auto-derived from tool name when omitted. */\n resourceUri?: string\n /** Who can see this tool. Defaults to ['model']. */\n visibility?: Visibility[]\n}\n\nexport interface BrowserPermissions {\n camera?: Record<string, never>\n microphone?: Record<string, never>\n geolocation?: Record<string, never>\n clipboardWrite?: Record<string, never>\n}\n\nexport interface ResourceUiMeta {\n csp?: CspPolicy\n permissions?: BrowserPermissions\n domain?: string\n prefersBorder?: boolean\n}\n","import type { AuthCheck } from './auth/authorization'\n\nexport interface PromptArgument {\n name: string\n description?: string\n /** When true, the client must supply this argument. Defaults to false. */\n required?: boolean\n}\n\nexport interface PromptConfig {\n /** Unique prompt identifier. Inferred from the handler function name when omitted. */\n name?: string\n /** Human-readable display name shown in UIs. */\n title?: string\n /** Description shown to clients and LLMs. Inferred from name when omitted. */\n description?: string\n /** Declared arguments. Advertised to clients in prompts/list. */\n arguments?: PromptArgument[]\n /** When true the prompt is hidden from list responses and cannot be invoked. */\n disabled?: boolean\n /** Execution timeout in milliseconds. No timeout by default. */\n timeout?: number\n /** Arbitrary tags for server-side filtering and transforms. */\n tags?: string[]\n auth?: AuthCheck\n}\n\n// ---------------------------------------------------------------------------\n// Content and message types\n// ---------------------------------------------------------------------------\n\nexport type TextContent = { type: 'text'; text: string }\nexport type ImageContent = { type: 'image'; data: string; mimeType: string }\nexport type AudioContent = { type: 'audio'; data: string; mimeType: string }\nexport type ResourceLinkContent = {\n type: 'resource_link'\n uri: string\n name?: string\n description?: string\n mimeType?: string\n}\nexport type EmbeddedResource = {\n type: 'resource'\n resource: { uri: string; mimeType?: string } & ({ text: string } | { blob: string })\n}\n\nexport type PromptContent = TextContent | ImageContent | AudioContent | EmbeddedResource | ResourceLinkContent\n\nexport interface PromptMessage {\n role: 'user' | 'assistant'\n content: PromptContent\n}\n\n/**\n * Escape hatch for full control over the prompt response.\n * Return this from a prompt handler to set an explicit description and/or\n * supply a custom multi-turn message sequence.\n */\nexport class PromptResult {\n constructor(\n readonly messages: PromptMessage[],\n readonly description?: string,\n ) {}\n}\n\n// ---------------------------------------------------------------------------\n// Return value conversion\n// ---------------------------------------------------------------------------\n\nfunction isPromptMessage(value: unknown): value is PromptMessage {\n if (value === null || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n if (v.role !== 'user' && v.role !== 'assistant') return false\n if (!v.content || typeof v.content !== 'object') return false\n return typeof (v.content as Record<string, unknown>).type === 'string'\n}\n\n/**\n * Converts a prompt handler's return value into the MCP GetPromptResult shape.\n *\n * - string → single user text message\n * - PromptMessage → wrapped in a one-element array\n * - PromptMessage[] → used as-is\n * - PromptResult → passthrough (escape hatch)\n */\nexport function convertPromptResult(value: unknown): { description?: string; messages: PromptMessage[] } {\n if (value instanceof PromptResult) {\n return { description: value.description, messages: value.messages }\n }\n if (typeof value === 'string') {\n return { messages: [{ role: 'user', content: { type: 'text', text: value } }] }\n }\n if (isPromptMessage(value)) {\n return { messages: [value] }\n }\n if (Array.isArray(value) && value.every(isPromptMessage)) {\n return { messages: value }\n }\n throw new Error(\n `Prompt handler returned an unsupported value. Expected string, PromptMessage, PromptMessage[], or PromptResult.`,\n )\n}\n","import type { AccessToken } from './types'\nimport { AuthorizationError } from './types'\n\nexport type AuthCheck = (token: AccessToken) => void | Promise<void>\n\nexport function requireScopes(...scopes: string[]): AuthCheck {\n return async (token) => {\n for (const scope of scopes) {\n if (!token.scopes.includes(scope)) {\n throw new AuthorizationError(`Missing required scope: \"${scope}\"`)\n }\n }\n }\n}\n","import type { AccessToken, TokenVerifier } from './types'\n\nexport function multiAuth(...verifiers: TokenVerifier[]): TokenVerifier {\n return {\n async verify(token: string): Promise<AccessToken> {\n const errors: string[] = []\n for (const verifier of verifiers) {\n try {\n return await verifier.verify(token)\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err))\n }\n }\n throw new Error(`All auth sources rejected the token: ${errors.join('; ')}`)\n },\n }\n}\n","import { createRemoteJWKSet, jwtVerify } from 'jose'\nimport type { AccessToken, TokenVerifier } from '../types'\n\nexport interface JwtVerifierOptions {\n jwksUri: string\n issuer?: string\n audience?: string | string[]\n /** Clock skew tolerance in seconds. Default: 0. */\n leeway?: number\n}\n\nexport function jwtVerifier(options: JwtVerifierOptions): TokenVerifier {\n const JWKS = createRemoteJWKSet(new URL(options.jwksUri))\n\n return {\n async verify(token: string): Promise<AccessToken> {\n const { payload } = await jwtVerify(token, JWKS, {\n issuer: options.issuer,\n audience: options.audience,\n clockTolerance: options.leeway ?? 0,\n })\n\n const scopes =\n typeof payload.scope === 'string'\n ? payload.scope.split(' ').filter(Boolean)\n : Array.isArray(payload.scope)\n ? (payload.scope as string[])\n : []\n\n return {\n token,\n clientId: typeof payload.sub === 'string' ? payload.sub : undefined,\n scopes,\n expiresAt: payload.exp,\n claims: payload as Record<string, unknown>,\n }\n },\n }\n}\n","import type { AccessToken, TokenVerifier } from '../types'\n\nexport interface IntrospectionVerifierOptions {\n endpoint: string\n credentials: { clientId: string; clientSecret: string }\n /** Cache TTL in seconds. Omit or set to 0 to disable caching. */\n cacheTtl?: number\n}\n\ninterface CacheEntry {\n token: AccessToken\n expiresAt: number\n}\n\nexport function introspectionVerifier(options: IntrospectionVerifierOptions): TokenVerifier {\n const cache = options.cacheTtl ? new Map<string, CacheEntry>() : null\n\n return {\n async verify(rawToken: string): Promise<AccessToken> {\n if (cache) {\n const cached = cache.get(rawToken)\n if (cached && Date.now() < cached.expiresAt) {\n return cached.token\n }\n cache.delete(rawToken)\n }\n\n const credentials = Buffer.from(\n `${options.credentials.clientId}:${options.credentials.clientSecret}`,\n ).toString('base64')\n\n const response = await fetch(options.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${credentials}`,\n },\n body: new URLSearchParams({ token: rawToken }),\n })\n\n if (!response.ok) {\n throw new Error(`Introspection endpoint returned ${response.status}`)\n }\n\n const data = (await response.json()) as {\n active: boolean\n scope?: string\n client_id?: string\n exp?: number\n [key: string]: unknown\n }\n\n if (!data.active) {\n throw new Error('Token is not active')\n }\n\n const accessToken: AccessToken = {\n token: rawToken,\n clientId: data.client_id,\n scopes: data.scope ? data.scope.split(' ').filter(Boolean) : [],\n expiresAt: data.exp,\n claims: data as Record<string, unknown>,\n }\n\n if (cache && options.cacheTtl) {\n cache.set(rawToken, {\n token: accessToken,\n expiresAt: Date.now() + options.cacheTtl * 1000,\n })\n }\n\n return accessToken\n },\n }\n}\n","import type { AccessToken, TokenVerifier } from '../types'\n\nexport function staticTokenVerifier(\n map: Record<string, Partial<Omit<AccessToken, 'token'>>>,\n): TokenVerifier {\n return {\n async verify(token: string): Promise<AccessToken> {\n const entry = map[token]\n if (!entry) {\n throw new Error('Unknown token')\n }\n if (entry.expiresAt !== undefined && entry.expiresAt < Math.floor(Date.now() / 1000)) {\n throw new Error('Token has expired')\n }\n return {\n token,\n clientId: entry.clientId,\n scopes: entry.scopes ?? [],\n expiresAt: entry.expiresAt,\n claims: entry.claims ?? {},\n }\n },\n }\n}\n\nexport function debugTokenVerifier(): TokenVerifier {\n console.warn('[fastmcp] debugTokenVerifier() accepts all bearer tokens — never use in production')\n return {\n async verify(token: string): Promise<AccessToken> {\n if (!token) {\n throw new Error('Empty token')\n }\n return { token, scopes: [], claims: {} }\n },\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { UnsupportedGrantTypeError } from '@modelcontextprotocol/sdk/server/auth/errors.js'\nimport type { Response } from 'express'\nimport type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js'\nimport type { OAuthClientInformationFull } from '@modelcontextprotocol/sdk/shared/auth.js'\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\n\nexport interface OAuthProviderOptions {\n /**\n * Called during the authorization step. Implementations must eventually redirect\n * to `params.redirectUri` with a `code` query parameter (and `state` if present).\n *\n * If omitted, all authorization requests are auto-approved immediately — suitable\n * for testing and development only.\n */\n onAuthorize?: (\n client: OAuthClientInformationFull,\n params: AuthorizationParams,\n res: Response,\n ) => Promise<void>\n /** Scopes supported by this server, advertised in OAuth metadata. */\n scopes?: string[]\n /** Access token lifetime in seconds. Default: 3600. */\n tokenTtl?: number\n}\n\n/**\n * Creates an in-memory OAuth 2.1 server provider with Dynamic Client Registration support.\n *\n * Suitable for development, testing, and simple deployments where persistence is not required.\n * All state (clients, codes, tokens) is held in memory and lost on restart.\n */\nexport function oauthProvider(options: OAuthProviderOptions = {}): OAuthServerProvider {\n const clients = new Map<string, OAuthClientInformationFull>()\n const codes = new Map<string, { client: OAuthClientInformationFull; params: AuthorizationParams }>()\n const tokens = new Map<string, { clientId: string; scopes: string[]; expiresAt: number }>()\n\n // The SDK registration handler generates client_id and other fields before calling\n // registerClient, so at runtime the argument is always a full OAuthClientInformationFull.\n const clientsStore: OAuthRegisteredClientsStore = {\n async getClient(clientId) {\n return clients.get(clientId)\n },\n async registerClient(client) {\n const full = client as OAuthClientInformationFull\n clients.set(full.client_id, full)\n return full\n },\n }\n\n return {\n clientsStore,\n\n async authorize(client, params, res) {\n if (options.onAuthorize) {\n return options.onAuthorize(client, params, res)\n }\n // Default: auto-approve — issue code and redirect immediately\n const code = randomUUID()\n codes.set(code, { client, params })\n const redirectUrl = new URL(params.redirectUri)\n redirectUrl.searchParams.set('code', code)\n if (params.state) redirectUrl.searchParams.set('state', params.state)\n res.redirect(redirectUrl.toString())\n },\n\n async challengeForAuthorizationCode(_client, authorizationCode) {\n const data = codes.get(authorizationCode)\n if (!data) throw new Error('Invalid authorization code')\n return data.params.codeChallenge\n },\n\n async exchangeAuthorizationCode(client, authorizationCode) {\n const data = codes.get(authorizationCode)\n if (!data) throw new Error('Invalid authorization code')\n if (data.client.client_id !== client.client_id) {\n throw new Error('Authorization code was not issued to this client')\n }\n codes.delete(authorizationCode)\n\n const token = randomUUID()\n const ttl = options.tokenTtl ?? 3600\n const requestedScopes = data.params.scopes ?? []\n const grantedScopes =\n options.scopes !== undefined\n ? requestedScopes.filter((s) => options.scopes!.includes(s))\n : requestedScopes\n tokens.set(token, {\n clientId: client.client_id,\n scopes: grantedScopes,\n expiresAt: Math.floor(Date.now() / 1000) + ttl,\n })\n return {\n access_token: token,\n token_type: 'bearer',\n expires_in: ttl,\n scope: grantedScopes.join(' '),\n }\n },\n\n async exchangeRefreshToken() {\n throw new UnsupportedGrantTypeError('Refresh tokens are not supported by this provider')\n },\n\n async verifyAccessToken(token): Promise<AuthInfo> {\n const data = tokens.get(token)\n if (!data) throw new Error('Invalid token')\n if (data.expiresAt < Math.floor(Date.now() / 1000)) throw new Error('Token has expired')\n return {\n token,\n clientId: data.clientId,\n scopes: data.scopes,\n expiresAt: data.expiresAt,\n }\n },\n }\n}\n","import type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js'\nimport type { OAuthClientInformationFull, OAuthTokenRevocationRequest, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js'\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\n\nexport interface OAuthProxyOptions {\n /** Pre-registered credentials this proxy uses when talking to the upstream server. */\n upstreamCredentials: {\n clientId: string\n clientSecret?: string\n }\n /** Upstream OAuth server endpoint URLs. */\n endpoints: {\n authorizationUrl: string\n tokenUrl: string\n revocationUrl?: string\n }\n /**\n * Verifies an access token issued by the upstream and returns information about it.\n * Called for every MCP request to validate the bearer token.\n */\n verifyAccessToken: (token: string) => Promise<AuthInfo>\n}\n\n/**\n * Creates an OAuth provider that proxies to an existing upstream OAuth server using\n * pre-registered credentials.\n *\n * MCP clients interact with this proxy using Dynamic Client Registration. The proxy\n * presents a DCR-compliant interface while internally using its own fixed credentials\n * (`upstreamCredentials`) when communicating with the upstream authorization server.\n */\nexport function oauthProxy(options: OAuthProxyOptions): OAuthServerProvider {\n const clients = new Map<string, OAuthClientInformationFull>()\n\n const clientsStore: OAuthRegisteredClientsStore = {\n async getClient(clientId) {\n return clients.get(clientId)\n },\n // DCR for incoming MCP clients — stored locally, not proxied upstream\n async registerClient(client) {\n const full = client as OAuthClientInformationFull\n clients.set(full.client_id, full)\n return full\n },\n }\n\n return {\n clientsStore,\n // Let the upstream server validate PKCE — we pass code_verifier through\n skipLocalPkceValidation: true as const,\n\n async authorize(_client, params, res) {\n // Redirect to upstream using the proxy's registered client_id\n const targetUrl = new URL(options.endpoints.authorizationUrl)\n targetUrl.searchParams.set('client_id', options.upstreamCredentials.clientId)\n targetUrl.searchParams.set('response_type', 'code')\n targetUrl.searchParams.set('redirect_uri', params.redirectUri)\n targetUrl.searchParams.set('code_challenge', params.codeChallenge)\n targetUrl.searchParams.set('code_challenge_method', 'S256')\n if (params.state) targetUrl.searchParams.set('state', params.state)\n if (params.scopes?.length) targetUrl.searchParams.set('scope', params.scopes.join(' '))\n res.redirect(targetUrl.toString())\n },\n\n async challengeForAuthorizationCode() {\n // PKCE is validated by the upstream; returning empty string skips local validation\n return ''\n },\n\n async exchangeAuthorizationCode(_client, authorizationCode, codeVerifier, redirectUri): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: options.upstreamCredentials.clientId,\n code: authorizationCode,\n })\n if (options.upstreamCredentials.clientSecret) {\n body.set('client_secret', options.upstreamCredentials.clientSecret)\n }\n if (codeVerifier) body.set('code_verifier', codeVerifier)\n if (redirectUri) body.set('redirect_uri', redirectUri)\n\n const response = await fetch(options.endpoints.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n if (!response.ok) {\n await response.body?.cancel()\n throw new Error(`Upstream token exchange failed: ${response.status}`)\n }\n return response.json() as Promise<OAuthTokens>\n },\n\n async exchangeRefreshToken(_client, refreshToken, scopes): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: options.upstreamCredentials.clientId,\n refresh_token: refreshToken,\n })\n if (options.upstreamCredentials.clientSecret) {\n body.set('client_secret', options.upstreamCredentials.clientSecret)\n }\n if (scopes?.length) body.set('scope', scopes.join(' '))\n\n const response = await fetch(options.endpoints.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n if (!response.ok) {\n await response.body?.cancel()\n throw new Error(`Upstream token refresh failed: ${response.status}`)\n }\n return response.json() as Promise<OAuthTokens>\n },\n\n verifyAccessToken: options.verifyAccessToken,\n\n ...(options.endpoints.revocationUrl\n ? {\n async revokeToken(\n _client: OAuthClientInformationFull,\n request: OAuthTokenRevocationRequest,\n ): Promise<void> {\n const body = new URLSearchParams({\n token: request.token,\n client_id: options.upstreamCredentials.clientId,\n })\n if (options.upstreamCredentials.clientSecret) {\n body.set('client_secret', options.upstreamCredentials.clientSecret)\n }\n if (request.token_type_hint) {\n body.set('token_type_hint', request.token_type_hint)\n }\n const response = await fetch(options.endpoints.revocationUrl!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n if (!response.ok) {\n await response.body?.cancel()\n // RFC 7009 §2.2: servers should not signal errors on revocation\n }\n },\n }\n : {}),\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport {\n CallToolResultSchema,\n type CallToolResult,\n ToolListChangedNotificationSchema,\n ResourceListChangedNotificationSchema,\n PromptListChangedNotificationSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { parseTemplate } from 'url-template'\nimport { FastMCP } from './FastMCP'\nimport { ToolResult } from './tool'\nimport { ResourceResult } from './resource'\nimport { PromptResult } from './prompt'\nimport type { PromptMessage } from './prompt'\n\ntype StdioTransport = {\n type: 'stdio'\n command: string\n args?: string[]\n env?: Record<string, string>\n cwd?: string\n /** How long (ms) before the proxy re-fetches component lists. Default 30 000. Set 0 for notifications-only. */\n cacheTtl?: number\n}\n\ntype HttpTransport = {\n type: 'http'\n url: string\n requestInit?: RequestInit\n /** How long (ms) before the proxy re-fetches component lists. Default 30 000. Set 0 for notifications-only. */\n cacheTtl?: number\n}\n\nexport type ProxyTransport = StdioTransport | HttpTransport\n\n/**\n * Build a FastMCP proxy around an already-connected MCP Client.\n * Exported to enable testing with in-memory transports.\n */\nexport async function buildProxyFromClient(\n client: Client,\n options?: { cacheTtl?: number; name?: string },\n): Promise<FastMCP> {\n const cacheTtl = options?.cacheTtl ?? 30_000\n\n const serverInfo = client.getServerVersion()\n const proxyName = options?.name ?? serverInfo?.name ?? 'proxy'\n const proxyVersion = serverInfo?.version ?? '0.0.1'\n\n const proxy = new FastMCP({ name: proxyName, version: proxyVersion })\n\n // Track which component identifiers were registered by this proxy so we can diff on resync.\n const proxiedTools = new Set<string>()\n const proxiedResources = new Set<string>()\n const proxiedPrompts = new Set<string>()\n\n // Per-type timestamp of last successful sync (0 forces an immediate resync on first list request).\n const lastSync = { tools: 0, resources: 0, prompts: 0 }\n\n async function resyncTools(): Promise<void> {\n const tools: Awaited<ReturnType<typeof client.listTools>>['tools'] = []\n let cursor: string | undefined\n do {\n const page = await client.listTools({ cursor })\n tools.push(...page.tools)\n cursor = page.nextCursor\n } while (cursor)\n\n const incoming = new Set(tools.map((t) => t.name))\n\n for (const name of proxiedTools) {\n if (!incoming.has(name)) {\n proxy._removeTool(name)\n proxiedTools.delete(name)\n }\n }\n\n for (const tool of tools) {\n if (proxiedTools.has(tool.name)) {\n // Update metadata if it changed\n proxy._removeTool(tool.name)\n proxiedTools.delete(tool.name)\n }\n proxy.tool(\n {\n name: tool.name,\n ...(tool.title !== undefined ? { title: tool.title } : {}),\n description: tool.description ?? tool.name,\n inputSchema: (tool.inputSchema as Record<string, unknown>) ?? {},\n },\n async (args: unknown) => {\n const result = await client.callTool(\n { name: tool.name, arguments: args as Record<string, unknown> },\n CallToolResultSchema,\n )\n // Zod infers _meta on content items as Record<string,unknown> but\n // CallToolResult types it more specifically — identical at runtime.\n return new ToolResult(result as unknown as CallToolResult)\n },\n )\n proxiedTools.add(tool.name)\n }\n\n lastSync.tools = Date.now()\n }\n\n async function resyncResources(): Promise<void> {\n const incoming = new Set<string>()\n\n try {\n const resources: Awaited<ReturnType<typeof client.listResources>>['resources'] = []\n let cursor: string | undefined\n do {\n const page = await client.listResources({ cursor })\n resources.push(...page.resources)\n cursor = page.nextCursor\n } while (cursor)\n\n for (const resource of resources) {\n incoming.add(resource.uri)\n if (!proxiedResources.has(resource.uri)) {\n proxy.resource(\n {\n uri: resource.uri,\n name: resource.name,\n ...(resource.description !== undefined ? { description: resource.description } : {}),\n ...(resource.mimeType !== undefined ? { mimeType: resource.mimeType } : {}),\n },\n async () => {\n const result = await client.readResource({ uri: resource.uri })\n return new ResourceResult(\n result.contents as Array<{\n uri: string\n mimeType?: string\n text?: string\n blob?: string\n }>,\n )\n },\n )\n proxiedResources.add(resource.uri)\n }\n }\n } catch {\n // server may not support resources\n }\n\n try {\n const resourceTemplates: Awaited<ReturnType<typeof client.listResourceTemplates>>['resourceTemplates'] = []\n let templateCursor: string | undefined\n do {\n const page = await client.listResourceTemplates({ cursor: templateCursor })\n resourceTemplates.push(...page.resourceTemplates)\n templateCursor = page.nextCursor\n } while (templateCursor)\n\n for (const template of resourceTemplates) {\n const uriTemplate = template.uriTemplate\n incoming.add(uriTemplate)\n if (!proxiedResources.has(uriTemplate)) {\n const expander = parseTemplate(uriTemplate)\n proxy.resource(\n {\n uri: uriTemplate,\n name: template.name,\n ...(template.description !== undefined\n ? { description: template.description }\n : {}),\n ...(template.mimeType !== undefined ? { mimeType: template.mimeType } : {}),\n },\n async (params?: Record<string, string>) => {\n const actualUri = params ? expander.expand(params) : uriTemplate\n const result = await client.readResource({ uri: actualUri })\n return new ResourceResult(\n result.contents as Array<{\n uri: string\n mimeType?: string\n text?: string\n blob?: string\n }>,\n )\n },\n )\n proxiedResources.add(uriTemplate)\n }\n }\n } catch {\n // server may not support resource templates\n }\n\n for (const uri of proxiedResources) {\n if (!incoming.has(uri)) {\n proxy._removeResource(uri)\n proxiedResources.delete(uri)\n }\n }\n\n lastSync.resources = Date.now()\n }\n\n async function resyncPrompts(): Promise<void> {\n const prompts: Awaited<ReturnType<typeof client.listPrompts>>['prompts'] = []\n let cursor: string | undefined\n do {\n const page = await client.listPrompts({ cursor })\n prompts.push(...page.prompts)\n cursor = page.nextCursor\n } while (cursor)\n\n const incoming = new Set(prompts.map((p) => p.name))\n\n for (const name of proxiedPrompts) {\n if (!incoming.has(name)) {\n proxy._removePrompt(name)\n proxiedPrompts.delete(name)\n }\n }\n\n for (const prompt of prompts) {\n if (!proxiedPrompts.has(prompt.name)) {\n proxy.prompt(\n {\n name: prompt.name,\n description: prompt.description,\n ...(prompt.arguments?.length ? { arguments: prompt.arguments } : {}),\n },\n async (args?: Record<string, string>) => {\n const result = await client.getPrompt({ name: prompt.name, arguments: args })\n return new PromptResult(result.messages as PromptMessage[], result.description)\n },\n )\n proxiedPrompts.add(prompt.name)\n }\n }\n\n lastSync.prompts = Date.now()\n }\n\n // Initial sync.\n await Promise.all([\n resyncTools().catch(() => {}),\n resyncResources().catch(() => {}),\n resyncPrompts().catch(() => {}),\n ])\n\n // Subscribe to backend change notifications for immediate resync.\n client.setNotificationHandler(ToolListChangedNotificationSchema, () => {\n resyncTools().catch(() => {})\n })\n client.setNotificationHandler(ResourceListChangedNotificationSchema, () => {\n resyncResources().catch(() => {})\n })\n client.setNotificationHandler(PromptListChangedNotificationSchema, () => {\n resyncPrompts().catch(() => {})\n })\n\n // TTL-based lazy resync: re-fetch on list requests when the cache is stale.\n if (cacheTtl > 0) {\n proxy.use({\n async onListTools(ctx, next) {\n if (Date.now() - lastSync.tools > cacheTtl) await resyncTools().catch(() => {})\n return next()\n },\n async onListResources(ctx, next) {\n if (Date.now() - lastSync.resources > cacheTtl) await resyncResources().catch(() => {})\n return next()\n },\n async onListResourceTemplates(ctx, next) {\n if (Date.now() - lastSync.resources > cacheTtl) await resyncResources().catch(() => {})\n return next()\n },\n async onListPrompts(ctx, next) {\n if (Date.now() - lastSync.prompts > cacheTtl) await resyncPrompts().catch(() => {})\n return next()\n },\n })\n }\n\n proxy._addCloseCallback(async () => {\n await client.close()\n })\n\n return proxy\n}\n\n/**\n * Create a FastMCP instance that proxies all requests to a remote MCP server.\n * The returned instance can be mounted onto a parent server via `parent.mount(proxy)`.\n *\n * Component lists (tools, resources, prompts) are kept in sync via:\n * - Change notifications from the backend (immediate resync)\n * - TTL-based lazy resync on each list request (configurable via `cacheTtl`, default 30 s)\n */\nexport async function createProxy(config: ProxyTransport, name?: string): Promise<FastMCP> {\n let transport: import('@modelcontextprotocol/sdk/shared/transport').Transport\n\n if (config.type === 'stdio') {\n const { StdioClientTransport } = await import('@modelcontextprotocol/sdk/client/stdio')\n transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n })\n } else {\n const { StreamableHTTPClientTransport } = await import(\n '@modelcontextprotocol/sdk/client/streamableHttp'\n )\n transport = new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: config.requestInit,\n })\n }\n\n const client = new Client(\n { name: name ?? 'fastmcp-proxy', version: '0.0.1' },\n { capabilities: {} },\n )\n\n await client.connect(transport)\n\n return buildProxyFromClient(client, { cacheTtl: config.cacheTtl, name })\n}\n","import { FastMCP } from '../FastMCP'\nimport type { ToolConfig } from '../FastMCP'\nimport { contextStore } from '../context'\nimport type { Component } from './components'\nimport type { Visibility } from './types'\n\nexport interface EntrypointConfig {\n name: string\n description: string\n title?: string\n}\n\nexport interface BackendToolConfig {\n name: string\n description: string\n title?: string\n /** Defaults to ['app']. Pass ['model', 'app'] to also expose to the LLM. */\n visibility?: Visibility[]\n}\n\nexport interface FastMCPAppOptions {\n name: string\n version?: string\n}\n\nexport class FastMCPApp {\n readonly server: FastMCP\n\n constructor(options: FastMCPAppOptions) {\n this.server = new FastMCP({ name: options.name, version: options.version })\n }\n\n /**\n * Register an entry-point tool.\n * Entry-points are visible to the LLM (visibility: ['model', 'app']) and\n * automatically linked to a generated ui:// resource URI.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entrypoint(config: EntrypointConfig, handler: (args?: any) => Component): void {\n const resourceUri = `ui://${config.name}`\n const toolConfig: ToolConfig = {\n name: config.name,\n description: config.description,\n ...(config.title !== undefined ? { title: config.title } : {}),\n ui: { visibility: ['model', 'app'], resourceUri },\n }\n this.server.tool(toolConfig, handler)\n // Stub resource so resources/read on the ui:// URI doesn't 404.\n // Replaced by the real UI runtime bundle when bundling is implemented.\n this.server.resource(\n { uri: resourceUri, mimeType: 'text/html;profile=mcp-app', name: config.name },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n }\n\n /**\n * Register a backend tool.\n * Backend tools are hidden from listTools by default (visibility: ['app']).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n backendTool(config: BackendToolConfig, handler: (args: any) => unknown): void {\n const visibility = config.visibility ?? ['app']\n const toolConfig: ToolConfig = {\n name: config.name,\n description: config.description,\n ...(config.title !== undefined ? { title: config.title } : {}),\n ui: { visibility },\n }\n this.server.tool(toolConfig, handler)\n }\n\n /**\n * Returns a reference to a tool that resolves to the correct external name\n * (including any mount prefix) when evaluated inside a request handler.\n * Call inside a handler function — not at definition time.\n */\n toolRef(name: string): string {\n const ctx = contextStore.getStore()\n if (!ctx) return name\n return ctx.resolveToolName(name)\n }\n}\n","import { contextStore } from '../context'\n\n/**\n * Resolve a logical tool name to its current external name inside a request\n * handler, accounting for any mount prefix applied by a parent server.\n *\n * Use this in providers that are built on bare FastMCP (not FastMCPApp) to\n * produce mount-prefix–aware action strings for Button components.\n */\nexport function actionRef(name: string): string {\n return contextStore.getStore()?.resolveToolName(name) ?? name\n}\n","import { runInNewContext } from 'node:vm'\nimport { FastMCP } from '../FastMCP'\nimport { ToolResult } from '../tool'\nimport { COMPONENT_CATALOG } from './components'\nimport * as Components from './components'\n\nexport class GenerativeUI {\n readonly server: FastMCP\n\n constructor() {\n this.server = new FastMCP({ name: 'generative-ui' })\n\n // Regular LLM tool — catalog lookup, always returns structured data\n this.server.tool(\n {\n name: 'search_components',\n description: 'List available UI components with their types and descriptions',\n },\n () => new ToolResult({\n content: [{ type: 'text', text: JSON.stringify(COMPONENT_CATALOG) }],\n }),\n )\n\n // LLM-visible tool — executes component code in an isolated sandbox\n this.server.tool(\n {\n name: 'generate_ui',\n description: 'Execute a UI component expression and return the component tree. Use search_components to discover available component APIs first.',\n inputSchema: {\n type: 'object',\n properties: {\n code: { type: 'string', description: 'A JavaScript expression using the component builders (Column, Text, Button, etc.) that evaluates to a component tree' },\n },\n required: ['code'],\n },\n },\n (args: Record<string, unknown>) => {\n const { code } = args as { code: string }\n // Sandbox: only the component builder functions are in scope — no Node globals\n const sandbox: Record<string, unknown> = { ...Components }\n delete sandbox['COMPONENT_CATALOG']\n\n try {\n // NOTE: vm.runInNewContext is NOT a true security sandbox — prototype chain\n // escapes are possible. Do not execute untrusted code in production.\n return runInNewContext(code, sandbox, { timeout: 2000 })\n } catch (err) {\n throw new Error(`[generate_ui] ${err instanceof Error ? err.message : String(err)}`)\n }\n },\n )\n }\n}\n","// ---------------------------------------------------------------------------\n// Component tree types\n// ---------------------------------------------------------------------------\n\nexport interface Component {\n type: string\n props?: Record<string, unknown>\n children?: Component[]\n}\n\n// If-node carries builder methods but they must be non-enumerable so\n// toEqual/JSON.stringify treat the node as a plain object.\nexport interface IfNode extends Component {\n type: 'if'\n branches: Array<{ condition: string; node: Component }>\n fallback?: Component\n elif(condition: string, node: Component): IfNode\n else(node: Component): Component\n}\n\n// ---------------------------------------------------------------------------\n// Component catalog — used by GenerativeUI.search_components\n// ---------------------------------------------------------------------------\n\nexport interface CatalogEntry {\n type: string\n description: string\n}\n\nexport const COMPONENT_CATALOG: CatalogEntry[] = [\n { type: 'column', description: 'Vertical stack layout. Props: gap, align, padding. Children: any components.' },\n { type: 'row', description: 'Horizontal stack layout. Props: gap, align, justify, wrap. Children: any components.' },\n { type: 'grid', description: 'CSS grid layout. Props: columns, gap. Children: any components.' },\n { type: 'text', description: 'Text display. Props: content (string or Rx), variant (heading|body|caption|code), color.' },\n { type: 'badge', description: 'Status badge. Props: text, color, variant.' },\n { type: 'table', description: 'Data table. Props: columns (string[]), rows (string[][]). No children.' },\n { type: 'chart-bar', description: 'Bar chart. Props: data (object[]), xKey, yKey, title.' },\n { type: 'chart-line', description: 'Line chart. Props: data (object[]), xKey, yKey, title.' },\n { type: 'chart-area', description: 'Area chart. Props: data (object[]), xKey, yKey, title.' },\n { type: 'chart-pie', description: 'Pie chart. Props: data (object[]), labelKey, valueKey, title.' },\n { type: 'input', description: 'Form text input. Props: name, label, type (text|email|number|password), placeholder, required.' },\n { type: 'select', description: 'Dropdown select. Props: name, label, options (string[] or {value,label}[]), required.' },\n { type: 'button', description: 'Clickable button. Props: label, action (tool name string), variant, disabled.' },\n { type: 'if', description: 'Conditional rendering. branches: [{condition, node}], fallback.' },\n { type: 'foreach', description: 'Dynamic list. Props: items (binding expression). Children: [template].' },\n { type: 'rx', description: 'Reactive value. Props: expression (client-side state binding). Embeddable as prop.' },\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction withChildren(type: string, props?: Record<string, unknown>, children?: Component[]): Component {\n const node: Component = { type }\n if (props && Object.keys(props).length > 0) node.props = props\n if (children && children.length > 0) node.children = children\n return node\n}\n\nfunction withProps(type: string, props: Record<string, unknown>): Component {\n return { type, props }\n}\n\n// ---------------------------------------------------------------------------\n// Layout\n// ---------------------------------------------------------------------------\n\nexport function Column(props?: Record<string, unknown>, children?: Component[]): Component {\n return withChildren('column', props, children)\n}\n\nexport function Row(props?: Record<string, unknown>, children?: Component[]): Component {\n return withChildren('row', props, children)\n}\n\nexport function Grid(props?: Record<string, unknown>, children?: Component[]): Component {\n return withChildren('grid', props, children)\n}\n\n// ---------------------------------------------------------------------------\n// Data display\n// ---------------------------------------------------------------------------\n\nexport function Text(content: string | Component, extraProps?: Record<string, unknown>): Component {\n return withProps('text', { content, ...extraProps })\n}\n\nexport function Badge(text: string, extraProps?: Record<string, unknown>): Component {\n return withProps('badge', { text, ...extraProps })\n}\n\nexport function Table(props: { columns: string[]; rows: string[][]; [key: string]: unknown }): Component {\n return withProps('table', props as Record<string, unknown>)\n}\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nexport function Bar(props: Record<string, unknown>): Component {\n return withProps('chart-bar', props)\n}\n\nexport function Line(props: Record<string, unknown>): Component {\n return withProps('chart-line', props)\n}\n\nexport function Area(props: Record<string, unknown>): Component {\n return withProps('chart-area', props)\n}\n\nexport function Pie(props: Record<string, unknown>): Component {\n return withProps('chart-pie', props)\n}\n\n// ---------------------------------------------------------------------------\n// Forms\n// ---------------------------------------------------------------------------\n\nexport function Input(props: Record<string, unknown>): Component {\n return withProps('input', props)\n}\n\nexport function Select(props: Record<string, unknown>): Component {\n return withProps('select', props)\n}\n\nexport function Button(props: Record<string, unknown>): Component {\n return withProps('button', props)\n}\n\n// ---------------------------------------------------------------------------\n// Control flow — If with non-enumerable builder methods\n// ---------------------------------------------------------------------------\n\nfunction makeIfNode(\n branches: Array<{ condition: string; node: Component }>,\n fallback?: Component,\n): IfNode {\n const node = { type: 'if' as const, branches, ...(fallback !== undefined ? { fallback } : {}) } as IfNode\n\n Object.defineProperty(node, 'elif', {\n enumerable: false,\n value(condition: string, child: Component): IfNode {\n return makeIfNode([...branches, { condition, node: child }], fallback)\n },\n })\n\n Object.defineProperty(node, 'else', {\n enumerable: false,\n value(child: Component): Component {\n return makeIfNode(branches, child)\n },\n })\n\n return node\n}\n\nexport function If(condition: string, then: Component, fallback?: Component): IfNode {\n return makeIfNode([{ condition, node: then }], fallback)\n}\n\n// ---------------------------------------------------------------------------\n// Dynamic list\n// ---------------------------------------------------------------------------\n\nexport function ForEach(items: string, template: Component): Component {\n return { type: 'foreach', props: { items }, children: [template] }\n}\n\n// ---------------------------------------------------------------------------\n// Reactive state binding\n// ---------------------------------------------------------------------------\n\nexport function Rx(expression: string): Component {\n return withProps('rx', { expression })\n}\n","import { FastMCP } from '../../FastMCP'\nimport { actionRef } from '../actionRef'\nimport { Column, Text, Button } from '../components'\n\nexport class Approval {\n readonly server: FastMCP\n\n constructor() {\n this.server = new FastMCP({ name: 'approval' })\n\n this.server.tool(\n {\n name: 'approval_request',\n description: 'Present a confirm/deny approval card to the user',\n inputSchema: {\n type: 'object',\n properties: {\n message: { type: 'string', description: 'The question or action to seek approval for' },\n },\n required: ['message'],\n },\n ui: { visibility: ['model', 'app'] },\n },\n (args: Record<string, unknown>) => {\n const message = (args.message as string) ?? 'Approve?'\n return Column({}, [\n Text(message),\n Button({ label: 'Confirm', action: actionRef('approval_confirm') }),\n Button({ label: 'Deny', action: actionRef('approval_deny'), variant: 'secondary' }),\n ])\n },\n )\n\n this.server.resource(\n { uri: 'ui://approval_request', mimeType: 'text/html;profile=mcp-app', name: 'approval_request' },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n\n this.server.tool(\n {\n name: 'approval_confirm',\n description: 'Record a confirmed approval decision',\n ui: { visibility: ['app'] },\n },\n () => ({ decision: 'approved' as const }),\n )\n\n this.server.tool(\n {\n name: 'approval_deny',\n description: 'Record a denied approval decision',\n ui: { visibility: ['app'] },\n },\n () => ({ decision: 'denied' as const }),\n )\n }\n}\n","import { FastMCP } from '../../FastMCP'\nimport { actionRef } from '../actionRef'\nimport { Row, Button } from '../components'\n\nexport class Choice {\n readonly server: FastMCP\n\n constructor() {\n this.server = new FastMCP({ name: 'choice' })\n\n this.server.tool(\n {\n name: 'choice_present',\n description: 'Present a list of options for the user to choose from',\n inputSchema: {\n type: 'object',\n properties: {\n question: { type: 'string', description: 'The question to ask the user' },\n options: { type: 'array', items: { type: 'string' }, description: 'The options to present' },\n },\n required: ['question', 'options'],\n },\n ui: { visibility: ['model', 'app'] },\n },\n (args: Record<string, unknown>) => {\n const options = (args.options as string[]) ?? []\n return Row(\n {},\n // Each button carries its option value as args so the host can\n // forward it to choice_select without extra state.\n options.map((opt) =>\n Button({ label: opt, action: actionRef('choice_select'), args: { option: opt } }),\n ),\n )\n },\n )\n\n this.server.resource(\n { uri: 'ui://choice_present', mimeType: 'text/html;profile=mcp-app', name: 'choice_present' },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n\n this.server.tool(\n {\n name: 'choice_select',\n description: \"Record the user's selection\",\n ui: { visibility: ['app'] },\n },\n (args: Record<string, unknown>) => ({ selected: args.option as string }),\n )\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { FastMCP } from '../../FastMCP'\nimport { ResourceResult } from '../../resource'\nimport { contextStore } from '../../context'\nimport { actionRef } from '../actionRef'\nimport { Column, Text, Button } from '../components'\n\nexport interface FileHandle {\n handle: string\n name: string\n mimeType: string\n data: Buffer\n}\n\nexport interface FileStorageAdapter {\n save(handle: string, file: FileHandle): void\n load(handle: string): FileHandle | undefined\n delete(handle: string): void\n}\n\nfunction makeInMemoryAdapter(): FileStorageAdapter {\n const store = new Map<string, FileHandle>()\n return {\n save: (handle, file) => store.set(handle, file),\n load: (handle) => store.get(handle),\n delete: (handle) => store.delete(handle),\n }\n}\n\nexport interface FileUploadOptions {\n storage?: FileStorageAdapter\n}\n\nconst SESSION_HANDLES_KEY = '__fastmcp_file_handles'\n\nexport class FileUpload {\n readonly server: FastMCP\n private readonly _storage: FileStorageAdapter\n\n constructor(options?: FileUploadOptions) {\n this._storage = options?.storage ?? makeInMemoryAdapter()\n this.server = new FastMCP({ name: 'file-upload' })\n\n const storage = this._storage\n\n this.server.tool(\n {\n name: 'file_upload_open',\n description: 'Open a file picker UI for the user to upload a file',\n inputSchema: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Instructions shown above the file picker' },\n },\n },\n ui: { visibility: ['model', 'app'] },\n },\n (args: Record<string, unknown>) => {\n return Column({}, [\n Text((args.prompt as string | undefined) ?? 'Upload a file'),\n Button({ label: 'Choose file', action: actionRef('file_upload_submit') }),\n ])\n },\n )\n\n this.server.tool(\n {\n name: 'file_upload_submit',\n description: 'Receive and store uploaded file bytes server-side',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'File name' },\n mimeType: { type: 'string', description: 'MIME type of the file' },\n data: { type: 'string', description: 'Base64-encoded file content' },\n },\n required: ['name', 'mimeType', 'data'],\n },\n ui: { visibility: ['app'] },\n },\n (args: Record<string, unknown>) => {\n const handle = randomUUID()\n const fileData = Buffer.from(args.data as string, 'base64')\n storage.save(handle, {\n handle,\n name: args.name as string,\n mimeType: args.mimeType as string,\n data: fileData,\n })\n\n // Track handle in session state and register cleanup on session close\n const ctx = contextStore.getStore()\n if (ctx) {\n const existing = (ctx.getState(SESSION_HANDLES_KEY) as string[] | undefined) ?? []\n ctx.setState(SESSION_HANDLES_KEY, [...existing, handle])\n ctx.onClose(() => storage.delete(handle))\n }\n\n const uri = `ui://files/${handle}`\n return { handle, uri }\n },\n )\n\n this.server.tool(\n {\n name: 'file_upload_delete',\n description: 'Delete a previously uploaded file by its handle',\n inputSchema: {\n type: 'object',\n properties: {\n handle: { type: 'string', description: 'The file handle returned by file_upload_submit' },\n },\n required: ['handle'],\n },\n ui: { visibility: ['app'] },\n },\n (args: Record<string, unknown>) => {\n const handle = args.handle as string\n storage.delete(handle)\n const ctx = contextStore.getStore()\n if (ctx) {\n const existing = (ctx.getState(SESSION_HANDLES_KEY) as string[] | undefined) ?? []\n ctx.setState(SESSION_HANDLES_KEY, existing.filter((h) => h !== handle))\n }\n return { deleted: handle }\n },\n )\n\n this.server.resource(\n { uri: 'ui://files/{handle}', name: 'uploaded-file', mimeType: 'application/octet-stream' },\n (params) => {\n const h = params?.handle\n if (!h) throw new Error('Missing file handle')\n const file = storage.load(h)\n if (!file) throw new Error(`File not found: ${h}`)\n const uri = `ui://files/${h}`\n if (file.mimeType.startsWith('text/')) {\n return new ResourceResult([{ uri, mimeType: file.mimeType, text: file.data.toString('utf8') }])\n }\n return new ResourceResult([{ uri, mimeType: file.mimeType, blob: file.data.toString('base64') }])\n },\n )\n }\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { FastMCP } from '../../FastMCP'\nimport { toJsonSchema } from '../../tool'\nimport { actionRef } from '../actionRef'\nimport { Column, Input, Select, Button } from '../components'\n\nexport interface FormInputOptions {\n name: string\n description: string\n schema: StandardSchemaV1\n}\n\ntype FieldSchema = Record<string, unknown>\n\nfunction buildField(fieldName: string, fieldSchema: FieldSchema, required: string[]) {\n const isRequired = required.includes(fieldName)\n const type = fieldSchema.type as string | undefined\n if (Array.isArray(fieldSchema.enum)) {\n return Select({ name: fieldName, label: fieldName, options: fieldSchema.enum as string[], required: isRequired })\n }\n if (type === 'number' || type === 'integer') {\n return Input({ name: fieldName, label: fieldName, type: 'number', required: isRequired })\n }\n return Input({ name: fieldName, label: fieldName, type: 'text', required: isRequired })\n}\n\nasync function validateWithSchema(\n schema: StandardSchemaV1,\n data: unknown,\n): Promise<{ valid: true; value: unknown } | { valid: false; errors: Record<string, string> }> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await (schema['~standard'].validate as (v: unknown) => Promise<any>)(data)\n if (result.issues && result.issues.length > 0) {\n const errors: Record<string, string> = {}\n for (const issue of result.issues) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const path = issue.path?.map((p: any) => String(typeof p === 'object' ? p.key : p)).join('.') ?? 'root'\n errors[path] = String(issue.message)\n }\n return { valid: false, errors }\n }\n return { valid: true, value: result.value }\n}\n\nexport class FormInput {\n readonly server: FastMCP\n\n constructor(options: FormInputOptions) {\n this.server = new FastMCP({ name: options.name })\n const { name, description, schema } = options\n const submitName = `${name}_submit`\n\n this.server.resource(\n { uri: `ui://${name}`, mimeType: 'text/html;profile=mcp-app', name },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n\n this.server.tool(\n { name, description, ui: { visibility: ['model', 'app'] } },\n async () => {\n // Use the shared extractor so Zod, Valibot, ArkType, etc. all work.\n const jsonSchema = await toJsonSchema(schema, `form \"${name}\"`)\n const properties = (jsonSchema.properties ?? {}) as Record<string, FieldSchema>\n const required = (jsonSchema.required ?? []) as string[]\n\n const fields = Object.entries(properties).map(([fieldName, fieldSchema]) =>\n buildField(fieldName, fieldSchema, required),\n )\n\n return Column({}, [...fields, Button({ label: 'Submit', action: actionRef(submitName) })])\n },\n )\n\n this.server.tool(\n {\n name: submitName,\n description: `Submit ${name} form data`,\n inputSchema: {\n type: 'object',\n properties: {\n data: { type: 'object', description: 'Form field values keyed by field name' },\n },\n required: ['data'],\n },\n ui: { visibility: ['app'] },\n },\n async (args: Record<string, unknown>) => {\n const result = await validateWithSchema(schema, args.data)\n if (!result.valid) {\n return { errors: result.errors }\n }\n return result.value\n },\n )\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAA;AAAA,EACA,aAAAC;AAAA,OACK;AAMP,SAAS,kBAAkB;;;ACIpB,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AC1BA,SAAS,yBAAyB;AAiK3B,IAAM,eAAe,IAAI,kBAA8B;AAGvD,IAAM,8BAA8B;AAepC,SAAS,cACd,QACA,WACA,eACA,MACA,cACY;AACZ,iBAAe,IAAI,OAAiB,SAAiB,YAAoC;AACvF,UAAM,OAAO,mBAAmB;AAAA,MAC9B;AAAA,MACA,MAAM;AAAA,MACN,GAAI,eAAe,SAAY,EAAE,QAAQ,WAAW,IAAI,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA;AAAA,IACA,OAAO,CAAC,KAAK,WAAW,IAAI,SAAS,KAAK,MAAM;AAAA,IAChD,MAAM,CAAC,KAAK,WAAW,IAAI,QAAQ,KAAK,MAAM;AAAA,IAC9C,QAAQ,CAAC,KAAK,WAAW,IAAI,UAAU,KAAK,MAAM;AAAA,IAClD,SAAS,CAAC,KAAK,WAAW,IAAI,WAAW,KAAK,MAAM;AAAA,IACpD,OAAO,CAAC,KAAK,WAAW,IAAI,SAAS,KAAK,MAAM;AAAA,IAChD,UAAU,CAAC,KAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAAA,IACtD,OAAO,CAAC,KAAK,WAAW,IAAI,SAAS,KAAK,MAAM;AAAA,IAChD,WAAW,CAAC,KAAK,WAAW,IAAI,aAAa,KAAK,MAAM;AAAA,IAExD,MAAM,eAAe,UAAU,OAAO,SAAS;AAC7C,UAAI,kBAAkB,OAAW;AACjC,YAAM,OAAO,aAAa;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,UACvC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC7C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,OAAO,QAAQ;AACnB,YAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAI,CAAC,MAAM,UAAU;AACnB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,MAAM,OAAO,cAAc;AAAA,QACxC,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,aAAa;AAAA,QAC/B,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,gBAAgB,SAAY,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,QAC9E,GAAI,OAAO,kBAAkB,SAAY,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;AAAA,QACpF,GAAI,OAAO,qBAAqB,SAC5B,EAAE,kBAAkB,OAAO,iBAAiB,IAC5C,CAAC;AAAA,MACP,CAAC;AACD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,MACrB;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,SAAS,QAAQ;AAC5B,YAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAI,CAAC,MAAM,aAAa;AACtB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,MAAM,OAAO,YAAY;AAAA,QACtC;AAAA;AAAA;AAAA,QAGA,iBAAiB;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAAA,IAEA,MAAM,YAAY;AAChB,YAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAI,CAAC,MAAM,OAAO;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,MAAM,OAAO,UAAU;AACtC,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,UAAU,CAAC,QAAQ,aAAa,IAAI,GAAG;AAAA,IACvC,UAAU,CAAC,KAAK,UAAU;AACxB,mBAAa,IAAI,KAAK,KAAK;AAAA,IAC7B;AAAA,IACA,aAAa,CAAC,QAAQ;AACpB,mBAAa,OAAO,GAAG;AAAA,IACzB;AAAA,IAEA,iBAAiB,CAAC,SAAS;AAAA,IAE3B,QAAQ,UAAU;AAChB,YAAM,WAAY,aAAa,IAAI,2BAA2B,KAAuC,CAAC;AACtG,mBAAa,IAAI,6BAA6B,CAAC,GAAG,UAAU,QAAQ,CAAC;AAAA,IACvE;AAAA,EACF;AACF;;;ACnSA,SAAS,UAAU,WAAW,mCAAmC;AAqCjE,IAAM,kBAA6D;AAAA,EACjE,cAAc;AAAA,EACd,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,4BAA4B;AAAA,EAC5B,eAAe;AAAA,EACf,gBAAgB;AAClB;AAKA,SAAS,WAAW,IAAgB,QAAkC;AACpE,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,WAAW,MAAO,GAAG,GAAG,IAA8B;AAC5D,MAAI,SAAU,QAAO,SAAS,KAAK,EAAE;AACrC,MAAI,GAAG,UAAW,QAAQ,GAAG,UAAwB,KAAK,EAAE;AAC5D,SAAO;AACT;AAGO,SAAS,mBACd,YACA,QACA,SACA,YACA,SACY;AACZ,QAAM,QAAqB,CAAC;AAC5B,aAAW,MAAM,YAAY;AAC3B,UAAM,OAAO,WAAW,IAAI,MAAM;AAClC,QAAI,KAAM,OAAM,KAAK,IAAI;AAAA,EAC3B;AAEA,QAAM,MAAyB,EAAE,QAAQ,SAAS,WAAW;AAE7D,WAAS,SAAS,GAAuB;AACvC,QAAI,KAAK,MAAM,OAAQ,QAAO,QAAQ;AACtC,WAAO,MAAM,CAAC,EAAE,KAAK,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,EAC5C;AAEA,SAAO,SAAS,CAAC;AACnB;AAOO,IAAM,oBAAN,MAA8C;AAAA,EACnD,YAA6B,OAA8B,QAAQ,KAAK;AAA3C;AAAA,EAA4C;AAAA,EAA5C;AAAA,EAE7B,MAAM,UAAgB,KAA2B,MAA2B;AAC1E,UAAM,KAAK,KAAK,IAAI;AACpB,SAAK,KAAK,oBAAe,IAAI,MAAM,EAAE;AACrC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK;AAC1B,WAAK,KAAK,oBAAe,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK;AAC5D,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,WAAK;AAAA,QACH,oBAAe,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACvG;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAuBO,IAAM,oBAAN,MAA8C;AAAA,EAGnD,YACW,MAAc,KACN,QACjB;AAFS;AACQ;AAAA,EAChB;AAAA,EAFQ;AAAA,EACQ;AAAA,EAJF,SAAS,oBAAI,IAAmD;AAAA,EAOjF,MAAM,UAAgB,KAA2B,MAA2B;AAC1E,UAAM,MAAM,KAAK,SACb,KAAK,OAAO,GAAwB,IACpC,GAAG,IAAI,MAAM,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC;AAChD,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AACjC,QAAI,SAAS,MAAM,YAAY,KAAK,IAAI,EAAG,QAAO,MAAM;AACxD,UAAM,SAAS,MAAM,KAAK;AAC1B,SAAK,OAAO,IAAI,KAAK,EAAE,OAAO,QAAQ,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC;AACxE,WAAO;AAAA,EACT;AACF;AAGO,IAAM,yBAAN,MAAmD;AAAA,EAIxD,YACmB,OACA,WAAmB,KACpC;AAFiB;AACA;AAEjB,SAAK,UAAU;AACf,SAAK,cAAc,KAAK,IAAI;AAAA,EAC9B;AAAA,EALmB;AAAA,EACA;AAAA,EALX;AAAA,EACA;AAAA,EAUR,MAAM,UAAgB,KAA2B,MAA2B;AAC1E,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,KAAK,eAAe,KAAK,UAAU;AAC3C,WAAK,UAAU,KAAK;AACpB,WAAK,cAAc;AAAA,IACrB;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,IAAI,SAAS,UAAU,gBAAgB,qBAAqB;AAAA,IACpE;AACA,SAAK;AACL,WAAO,KAAK;AAAA,EACd;AACF;AAGO,IAAM,yBAAN,MAAmD;AAAA,EACxD,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAE7B,MAAM,UAAgB,KAA2B,MAA2B;AAC1E,UAAM,SAAS,MAAM,KAAK;AAC1B,UAAM,OAAO,OAAO,WAAW,KAAK,UAAU,MAAM,GAAG,MAAM;AAC7D,QAAI,OAAO,KAAK,UAAU;AACxB,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,kBAAkB,IAAI,0BAA0B,KAAK,QAAQ;AAAA,MAC/D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAaO,IAAM,+BAAN,MAAyD;AAAA,EAC9D,MAAM,WAAiB,KAA2B,MAA2B;AAC3E,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,SAAS,KAAK;AACZ,UAAI,eAAe,SAAU,OAAM;AACnC,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QAC3F,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAgB,KAA2B,MAA2B;AAC1E,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,SAAS,KAAK;AACZ,UAAI,eAAe,SAAU,OAAM;AACnC,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,yBAAN,MAAmD;AAAA,EACvC,YAAY,oBAAI,IAA6B;AAAA,EAE9D,MAAM,QAAsB;AAC1B,WAAO,uBAAuB,6BAA6B,CAAC,iBAAiB;AAC3E,YAAM,YAAY,OAAO,aAAa,OAAO,SAAS;AACtD,WAAK,UAAU,IAAI,SAAS,GAAG,MAAM;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAgB,KAA2B,MAA2B;AAC1E,UAAM,EAAE,UAAU,IAAI,IAAI;AAC1B,QAAI,CAAC,UAAW,QAAO,KAAK;AAE5B,UAAM,aAAa,IAAI,gBAAgB;AACvC,SAAK,UAAU,IAAI,WAAW,UAAU;AAExC,UAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,iBAAW,OAAO;AAAA,QAAiB;AAAA,QAAS,MAC1C,OAAO,IAAI,SAAS,UAAU,eAAe,qCAAqC,CAAC;AAAA,MACrF;AAAA,IACF,CAAC;AAED,QAAI;AACF,aAAO,MAAM,QAAQ,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC;AAAA,IAClD,UAAE;AACA,WAAK,UAAU,OAAO,SAAS;AAAA,IACjC;AAAA,EACF;AACF;;;AC3LO,SAAS,oBACd,OACA,YACA,MACU;AACV,MAAI,UAAoB;AACxB,aAAW,KAAK,YAAY;AAC1B,QAAI,YAAY,KAAM;AACtB,UAAM,OAAO,KAAK,GAAG,OAAO;AAC5B,QAAI,SAAS,OAAW,WAAU;AAAA,EACpC;AACA,SAAO;AACT;AAOO,SAAS,WAAW,cAAsB,SAA4B;AAC3E,SAAO;AAAA,IACL,eAAe,CAAC,MAAO,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,MAAM,QAAQ,IAAI;AAAA,EAC7E;AACF;AAGO,SAAS,eAAe,UAAkB,aAAgC;AAC/E,SAAO;AAAA,IACL,eAAe,CAAC,MAAO,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,YAAY,IAAI;AAAA,EACvE;AACF;AAMO,IAAM,kBAAN,MAA2C;AAAA,EAChD,YACmB,YAOjB;AAPiB;AAAA,EAOhB;AAAA,EAPgB;AAAA,EASnB,cAAc,GAA8B;AAC1C,WAAQ,KAAK,WAAW,QAAQ,CAAC,KAAK,OAAQ,IAAI;AAAA,EACpD;AAAA,EACA,kBAAkB,GAAsC;AACtD,WAAQ,KAAK,WAAW,YAAY,CAAC,KAAK,OAAQ,IAAI;AAAA,EACxD;AAAA,EACA,0BAA0B,GAAsC;AAC9D,UAAM,OAAO,KAAK,WAAW,qBAAqB,KAAK,WAAW;AAClE,WAAQ,OAAO,CAAC,KAAK,OAAQ,IAAI;AAAA,EACnC;AAAA,EACA,gBAAgB,GAAkC;AAChD,WAAQ,KAAK,WAAW,UAAU,CAAC,KAAK,OAAQ,IAAI;AAAA,EACtD;AACF;AAGO,IAAM,qBAAN,MAA8C;AAAA,EACnD,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAAjB;AAAA,EAE7B,cAAc,GAAuB;AACnC,WAAO,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG;AAAA,EACjD;AAAA,EACA,kBAAkB,GAA+B;AAC/C,WAAO,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG;AAAA,EACjD;AAAA,EACA,0BAA0B,GAA+B;AACvD,WAAO,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG;AAAA,EACjD;AAAA,EACA,gBAAgB,GAA2B;AACzC,WAAO,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG;AAAA,EACjD;AACF;AAGO,IAAM,mBAAN,MAA4C;AAAA,EACjD,gBAAgB,WAA8C;AAC5D,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,QAC9C,SAAS,MAAM,UAAU,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,EAAE,SAAS,EAAE;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,iBAAN,MAA0C;AAAA,EAC/C,gBAAgB,YAA4B,SAA0C;AACpF,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,QAC9C,SAAS,MAAM,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,EAAE;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,gBAAN,MAAyC;AAAA,EAC9C,YAA6B,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAErB,SAAS,MAAkC;AACjD,WAAO,KAAK,SAAS,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,cAAc,GAA8B;AAC1C,WAAO,KAAK,SAAS,EAAE,IAAI,IAAI,IAAI;AAAA,EACrC;AAAA,EACA,kBAAkB,GAAsC;AACtD,WAAO,KAAK,SAAS,EAAE,IAAI,IAAI,IAAI;AAAA,EACrC;AAAA,EACA,0BAA0B,GAAsC;AAC9D,WAAO,KAAK,SAAS,EAAE,IAAI,IAAI,IAAI;AAAA,EACrC;AAAA,EACA,gBAAgB,GAAkC;AAChD,WAAO,KAAK,SAAS,EAAE,IAAI,IAAI,IAAI;AAAA,EACrC;AACF;;;AC7MA,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAI7B,IAAM,QAAN,MAAY;AAAA,EACjB,YACW,QACA,UACT;AAFS;AACA;AAAA,EACR;AAAA,EAFQ;AAAA,EACA;AAEb;AAEO,IAAM,OAAN,MAAW;AAAA,EAChB,YACW,QACA,MACA,UACT;AAHS;AACA;AACA;AAAA,EACR;AAAA,EAHQ;AAAA,EACA;AAAA,EACA;AAEb;AAEO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAqB,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AACvB;AAEO,SAAS,cAAc,OAAgC;AAC5D,MAAI,iBAAiB,YAAY;AAC/B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ;AAAA,UACjD,UAAU,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,UAAU;AAAA,YACR,KAAK,UAAU,MAAM,IAAI;AAAA,YACzB,UAAU,MAAM;AAAA,YAChB,MAAM,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO,EAAE,SAAS,CAAC,EAAE;AAAA,EACvB;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,KAAK,EAAE,CAAC;AAAA,IACzD;AAAA,EACF;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,OAAO,KAAK,UAAU,KAAK;AACjC,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,MACtC,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,EACjD;AACF;AAEA,eAAsB,aACpB,QACA,SACkC;AAElC,QAAM,cAAc;AACpB,MAAI,OAAO,YAAY,iBAAiB,YAAY;AAClD,QAAI;AACF,YAAM,SAAS,YAAY,aAAa;AACxC,UAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AACjD,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,EAAE,IAAI,MAAM,OAAO,mBAAK;AAChC,WAAQ,EAA2E;AAAA,MACjF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,QAAQ,UAAU,QAAQ,OAAO,KAAK;AAC5C,UAAQ;AAAA,IACN,gDAAgD,KAAK;AAAA,EACvD;AACA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAEA,eAAsB,cACpB,QACA,OACA,uBAAuB,OACmB;AAC1C,QAAM,SAAS,MAAM,OAAO,WAAW,EAAE,SAAS,KAAK;AACvD,MAAI,OAAO,QAAQ;AACjB,UAAM,WAAW,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAC9D,QAAI,sBAAsB;AACxB,YAAM,IAAID,UAASC,WAAU,eAAe,sBAAsB,QAAQ,EAAE;AAAA,IAC9E;AACA,UAAM,IAAI,MAAM,sBAAsB,QAAQ,EAAE;AAAA,EAClD;AACA,SAAO,OAAO;AAChB;;;AChFO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACW,UAMT;AANS;AAAA,EAMR;AAAA,EANQ;AAOb;AAeO,SAAS,sBACd,OACA,KACA,UACiC;AACjC,MAAI,iBAAiB,gBAAgB;AACnC,WAAO,EAAE,UAAU,MAAM,SAA8B;AAAA,EACzD;AACA,MAAI,iBAAiB,UAAU,iBAAiB,YAAY;AAC1D,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE;AAAA,UACA,UAAU,YAAY;AAAA,UACtB,MAAM,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO,EAAE,UAAU,CAAC,EAAE,KAAK,UAAU,YAAY,cAAc,MAAM,GAAG,CAAC,EAAE;AAAA,EAC7E;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,UAAU,CAAC,EAAE,KAAK,UAAU,YAAY,oBAAoB,MAAM,KAAK,UAAU,KAAK,EAAE,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,CAAC,EAAE,KAAK,UAAU,YAAY,cAAc,MAAM,OAAO,KAAK,EAAE,CAAC,EAAE;AACxF;AAGO,SAAS,cAAc,KAAsB;AAClD,SAAO,IAAI,SAAS,GAAG;AACzB;AAWO,SAAS,cACd,aACA,KAC+B;AAE/B,QAAM,OAAO,IAAI,QAAQ,GAAG;AAC5B,QAAM,UAAU,QAAQ,IAAI,IAAI,MAAM,GAAG,IAAI,IAAI;AACjD,QAAM,cAAc,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,IAAI;AAGtD,QAAM,kBAA4B,CAAC;AACnC,QAAM,eAAe,YAAY,QAAQ,iBAAiB,CAAC,UAAU;AACnE,UACG,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,QAAQ,CAAC,MAAM,gBAAgB,KAAK,CAAC,CAAC;AACzC,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAW,aAAa,MAAM,cAAc;AAClD,MAAI,UAAU;AACd,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;AAC5C,YAAM,QAAQ,IAAI,MAAM,GAAG,EAAE;AAC7B,UAAI,MAAM,SAAS,GAAG,GAAG;AACvB,cAAM,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC;AAC7B,mBAAW;AAAA,MACb,OAAO;AACL,cAAM,KAAK,KAAK;AAChB,mBAAW;AAAA,MACb;AAAA,IACF,WAAW,KAAK;AAEd,iBAAW,IAAI,QAAQ,uBAAuB,MAAM;AAAA,IACtD;AAAA,EACF;AACA,aAAW;AAEX,QAAM,YAAY,QAAQ,MAAM,IAAI,OAAO,OAAO,CAAC;AACnD,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,WAAO,IAAI,IAAI,mBAAmB,UAAU,IAAI,CAAC,CAAC;AAAA,EACpD,CAAC;AAGD,MAAI,gBAAgB,SAAS,KAAK,aAAa;AAC7C,UAAM,KAAK,IAAI,gBAAgB,WAAW;AAC1C,eAAW,QAAQ,iBAAiB;AAClC,YAAM,MAAM,GAAG,IAAI,IAAI;AACvB,UAAI,QAAQ,KAAM,QAAO,IAAI,IAAI;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;;;AC5KO,IAAM,mBAAmB;;;AC0DzB,IAAM,eAAN,MAAmB;AAAA,EACxB,YACW,UACA,aACT;AAFS;AACA;AAAA,EACR;AAAA,EAFQ;AAAA,EACA;AAEb;AAMA,SAAS,gBAAgB,OAAwC;AAC/D,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,IAAI;AACV,MAAI,EAAE,SAAS,UAAU,EAAE,SAAS,YAAa,QAAO;AACxD,MAAI,CAAC,EAAE,WAAW,OAAO,EAAE,YAAY,SAAU,QAAO;AACxD,SAAO,OAAQ,EAAE,QAAoC,SAAS;AAChE;AAUO,SAAS,oBAAoB,OAAqE;AACvG,MAAI,iBAAiB,cAAc;AACjC,WAAO,EAAE,aAAa,MAAM,aAAa,UAAU,MAAM,SAAS;AAAA,EACpE;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,EAAE,CAAC,EAAE;AAAA,EAChF;AACA,MAAI,gBAAgB,KAAK,GAAG;AAC1B,WAAO,EAAE,UAAU,CAAC,KAAK,EAAE;AAAA,EAC7B;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,eAAe,GAAG;AACxD,WAAO,EAAE,UAAU,MAAM;AAAA,EAC3B;AACA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;AR1DA,SAAS,kBAAkB,KAAa,QAAwB;AAC9D,QAAM,MAAM,IAAI,QAAQ,KAAK;AAC7B,MAAI,QAAQ,GAAI,QAAO,GAAG,MAAM,IAAI,GAAG;AACvC,SAAO,GAAG,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC;AAChE;AAgHA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,UAAU,GAAG,EACrB,KAAK,EACL,YAAY;AACjB;AAEA,SAAS,cAAc,UAAyD;AAC9E,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,UAAU,SAAS,YAAY;AAAA,IAC/B,QAAQ,SAAS;AAAA,IACjB,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS,SAAS,CAAC;AAAA,EAC7B;AACF;AAIA,IAAI;AAEJ,eAAe,mBAAmB,UAAuE;AACvG,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,iBAAiB,OAAW,QAAO,gBAAgB;AACvD,QAAM,MAAM,QAAQ,IAAI,wBAAwB;AAChD,MAAI,CAAC,KAAK;AAAE,mBAAe;AAAM,WAAO;AAAA,EAAU;AAClD,MAAI;AACF,mBAAe,MAAM,SAAS,OAAO,GAAG;AACxC,WAAO;AAAA,EACT,QAAQ;AACN,mBAAe;AACf,WAAO;AAAA,EACT;AACF;AAEA,eAAe,aAAa,OAAkB,OAA+C;AAC3F,MAAI,CAAC,MAAO,OAAM,IAAIC,UAASC,WAAU,gBAAgB,yBAAyB;AAClF,MAAI;AACF,UAAM,MAAM,KAAK;AAAA,EACnB,SAAS,KAAK;AACZ,QAAI,eAAe,oBAAoB;AACrC,YAAM,IAAID,UAASC,WAAU,gBAAgB,IAAI,OAAO;AAAA,IAC1D;AACA,UAAM;AAAA,EACR;AACF;AAEO,IAAM,UAAN,MAAc;AAAA,EACV;AAAA,EACA;AAAA,EAED;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,oBAAI,IAA4B;AAAA,EACzC,mBAAmB,oBAAI,IAAgC;AAAA,EACvD,qBAAqB,oBAAI,IAAgC;AAAA,EACzD,WAAW,oBAAI,IAA8B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,oBAAI,IAAqB;AAAA,EACzC,cAAiC;AAAA,EACjC,WAAiC;AAAA,EACjC,YAAY,oBAAI,IAAqB;AAAA;AAAA,EAErC;AAAA,EAEA,2BAAkE,CAAC;AAAA,EACnE,+BAA8E,CAAC;AAAA,EAC/E,6BAAwE,CAAC;AAAA,EACzE,uBAAmD,CAAC;AAAA,EACpD,mBAAmB,oBAAI,IAAa;AAAA,EAE5C,YAAY,SAAyB;AACnC,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,QAAQ,QAAQ;AACrB,SAAK,SAAS,QAAQ;AACtB,SAAK,iBAAiB,QAAQ,iBAAiB;AAC/C,SAAK,qBAAqB,QAAQ,qBAAqB;AACvD,SAAK,mBAAmB,QAAQ,mBAAmB;AACnD,SAAK,cAAc,QAAQ,aAAa,CAAC,GAAG,QAAQ,UAAU,IAAI,CAAC;AACnE,SAAK,cAAc,QAAQ,aAAa,CAAC,GAAG,QAAQ,UAAU,IAAI,CAAC;AACnE,SAAK,iBAAiB,KAAK,YAAY;AAAA,EACzC;AAAA,EAEQ,mBAA4B;AAClC,eAAW,KAAK,KAAK,OAAO,OAAO,GAAG;AACpC,UAAI,EAAE,OAAO,GAAI,QAAO;AAAA,IAC1B;AACA,eAAW,KAAK,KAAK,iBAAiB,OAAO,GAAG;AAC9C,UAAI,EAAE,OAAO,MAAM,EAAE,OAAO,IAAI,WAAW,OAAO,EAAG,QAAO;AAAA,IAC9D;AACA,eAAW,KAAK,KAAK,mBAAmB,OAAO,GAAG;AAChD,UAAI,EAAE,OAAO,IAAI,WAAW,OAAO,EAAG,QAAO;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,YAAY,cAA6C;AAC/D,UAAM,QAAQ,gBAAgB,KAAK;AACnC,UAAM,aAAa,KAAK,iBAAiB,IAAI,EAAE,CAAC,gBAAgB,GAAG,CAAC,EAAE,IAAI;AAC1E,UAAM,SAAS,IAAI;AAAA,MACjB,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ;AAAA,MACzC,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,KAAK,GAAG,WAAW,EAAE,aAAa,KAAK,GAAG,SAAS,EAAE,aAAa,KAAK,GAAG,SAAS,CAAC,GAAG,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC,EAAG,EAAE;AAAA,IACzK;AACA,eAAW,MAAM,KAAK,YAAa,IAAG,QAAQ,MAAM;AACpD,SAAK,eAAe,QAAQ,KAAK;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,UAAkE;AAC5F,WAAO,cAAc,QAAQ,KAAK,MAAM,mBAAmB,KAAK,KAAK;AAAA,EACvE;AAAA,EAEQ,eAAe,QAAgB,cAA0C;AAC/E,WAAO,kBAAkB,wBAAwB,OAAO,KAAK,UAAU;AACrE,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AACrD,YAAM,MAAM,cAAc,QAAQ,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI,QAAW,QAAW,OAAO,YAAY;AACrI,aAAO,aAAa;AAAA,QAAI;AAAA,QAAK,MAC3B,mBAAmB,KAAK,aAAa,cAAc,IAAI,QAAQ,KAAK,YAAY;AAC9E,gBAAM,oBAAoB,CAAC,CAAE,OAAO,sBAAsB,GAAG,aAAqD,gBAAgB;AAElI,gBAAM,cACJ,MAAM,QAAQ;AAAA,YACZ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AACzC,kBAAI,EAAE,OAAO,SAAU,QAAO;AAE9B,kBAAI,EAAE,OAAO,IAAI,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,SAAS,OAAO,EAAG,QAAO;AACjF,kBAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,kBAAI,CAAC,MAAO,QAAO;AACnB,kBAAI;AAAE,sBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,uBAAO;AAAA,cAAE,QAAQ;AAAE,uBAAO;AAAA,cAAK;AAAA,YACnE,CAAC;AAAA,UACH,GACA,OAAO,CAAC,MAA2B,MAAM,IAAI;AAE/C,gBAAM,mBAAmB,KAAK,wBAAwB,UAAU;AAChE,gBAAM,EAAE,eAAe,YAAY,IAAI,MAAM,KAAK,iBAAiB,KAAK;AACxE,gBAAM,cAAc,KAAK,uBAAuB,eAAe,WAAW;AAM1E,gBAAM,aAA0B;AAAA,YAC9B,GAAG,iBAAiB;AAAA,cAClB,CAAC,OAAkB,EAAE,MAAM,cAAc,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,aAAa,EAAE,aAAa,QAAQ,EAAE,OAAO;AAAA,YACtH;AAAA,YACA,GAAG,YAAY;AAAA,cACb,CAAC,OAAkB,EAAE,MAAM,eAAe,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,aAAa,EAAE,aAAa,aAAa,EAAE,YAAY;AAAA,YACjI;AAAA,UACF;AAEA,gBAAM,WAAW,KAAK;AACtB,gBAAM,aAAa,IAAI,QAAQ,SAC3B,OAAO,KAAK,IAAI,OAAO,QAAQ,WAAW,EAAE,SAAS,IACrD;AACJ,cAAI,WAAW;AACf,cAAI,eAAe,MAAM;AACvB,kBAAM,MAAM,WAAW,UAAU,CAAC,MAAM,EAAE,SAAS,UAAU;AAC7D,gBAAI,MAAM,EAAG,OAAM,IAAID,UAASC,WAAU,eAAe,2BAA2B;AACpF,uBAAW,MAAM;AAAA,UACnB;AACA,gBAAM,OAAO,WAAW,MAAM,UAAU,WAAW,QAAQ;AAC3D,gBAAM,aACJ,WAAW,WAAW,WAAW,SAC7B,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,WAAW,IAC5D;AAEN,gBAAM,QAAQ,MAAM,QAAQ;AAAA,YAC1B,KAAK,IAAI,OAAO,UAAU;AACxB,kBAAI,MAAM,SAAS,eAAe;AAChC,uBAAO;AAAA,kBACL,MAAM,MAAM;AAAA,kBACZ,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,kBAC1D,aAAa,MAAM;AAAA,kBACnB,aAAa,MAAM,eAAe,EAAE,MAAM,SAAkB;AAAA,gBAC9D;AAAA,cACF;AACA,oBAAM,IAAI,MAAM;AAChB,oBAAM,cACJ,EAAE,gBACD,EAAE,QACC,MAAM,aAAa,EAAE,OAAO,SAAS,EAAE,IAAI,SAAS,IACpD,EAAE,MAAM,SAAkB;AAChC,oBAAM,eACJ,EAAE,iBACD,EAAE,SACC,MAAM,aAAa,EAAE,QAAQ,SAAS,EAAE,IAAI,UAAU,IACtD;AACN,oBAAM,SAAS,qBAAqB,EAAE,KAClC;AAAA,gBACE,aAAa,EAAE,GAAG,eAAe,QAAQ,EAAE,IAAI;AAAA,gBAC/C,GAAI,EAAE,GAAG,aAAa,EAAE,YAAY,EAAE,GAAG,WAAW,IAAI,CAAC;AAAA,cAC3D,IACA;AACJ,qBAAO;AAAA,gBACL,MAAM,MAAM;AAAA,gBACZ,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,gBAC1D,aAAa,MAAM;AAAA,gBACnB;AAAA,gBACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,gBACvC,GAAI,SAAS,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,IAAI,CAAC;AAAA,cAC5C;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO,EAAE,OAAO,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC,EAAG;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,uBAAuB,OAAO,KAAK,UAAU;AACpE,YAAM,gBAAgB,IAAI,OAAO;AACjC,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AAGrD,YAAM,EAAE,eAAe,YAAY,IAAI,MAAM,KAAK,iBAAiB,KAAK;AACxE,YAAM,kBAAkB,KAAK,uBAAuB,eAAe,WAAW;AAC9E,YAAM,YAAY,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa;AACtE,UAAI,WAAW;AACb,YAAI,UAAU,KAAM,OAAM,aAAa,UAAU,MAAM,KAAK;AAC5D,cAAMC,OAAM;AAAA,UACV;AAAA,UACA,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI;AAAA,UAC1D,MAAM,OAAO;AAAA,UACb;AAAA,UACA;AAAA,QACF;AACA,YAAI;AACF,iBAAO,MAAM,aAAa;AAAA,YAAIA;AAAA,YAAK,MACjC,mBAAmB,KAAK,aAAa,cAAc,IAAI,QAAQA,MAAK,YAAY;AAC9E,kBAAI,iBAAmC,QAAQ;AAAA,gBAC7C,UAAU,QAAQ,IAAI,OAAO,aAAa,CAAC,CAAC;AAAA,cAC9C;AACA,kBAAI,UAAU,SAAS;AACrB,sBAAM,KAAK,UAAU;AACrB,oBAAI;AACJ,sBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,0BAAQ;AAAA,oBACN,MAAM,OAAO,IAAI,MAAM,SAAS,aAAa,qBAAqB,EAAE,IAAI,CAAC;AAAA,oBACzE;AAAA,kBACF;AAAA,gBACF,CAAC;AACD,iCAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,kBAAQ,MACtE,aAAa,KAAK;AAAA,gBACpB;AAAA,cACF;AACA,qBAAO,cAAc,MAAM,cAAc;AAAA,YAC3C,CAAC;AAAA,UACH;AAAA,QACF,SAAS,KAAK;AACZ,cAAI,eAAeF,UAAU,OAAM;AACnC,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,YAC3F,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAGA,UAAI;AACJ,UAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,mBAAW,KAAK,KAAK,OAAO,OAAO,GAAG;AACpC,gBAAM,OAAO;AAAA,YACX,EAAE,MAAM,EAAE,OAAO,MAAM,aAAa,EAAE,OAAO,aAAa,MAAM,EAAE,OAAO,QAAQ,CAAC,EAAE;AAAA,YACpF,KAAK;AAAA,YACL,CAAC,IAAI,MAAM,GAAG,gBAAgB,CAAC;AAAA,UACjC;AACA,cAAI,QAAQ,KAAK,SAAS,eAAe;AAAE,mBAAO;AAAG;AAAA,UAAM;AAAA,QAC7D;AAAA,MACF;AACA,UAAI,CAAC,KAAM,QAAO,KAAK,OAAO,IAAI,aAAa;AAE/C,UAAI,CAAC,QAAQ,KAAK,OAAO,UAAU;AACjC,cAAM,IAAIA,UAASC,WAAU,eAAe,kBAAkB,aAAa,GAAG;AAAA,MAChF;AAEA,UAAI,KAAK,OAAO,KAAM,OAAM,aAAa,KAAK,OAAO,MAAM,KAAK;AAEhE,YAAM,eAAe;AACrB,YAAM,UAAmB,IAAI,OAAO,aAAa,CAAC;AAClD,YAAM,MAAM;AAAA,QACV;AAAA,QACA,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI;AAAA,QAC1D,MAAM,OAAO;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAEA,UAAI;AACF,eAAO,MAAM,aAAa;AAAA,UAAI;AAAA,UAAK,MACjC,mBAAmB,KAAK,aAAa,cAAc,IAAI,QAAQ,KAAK,YAAY;AAC9E,kBAAM,OAAO,aAAa,OAAO,QAAQ,MAAM,cAAc,aAAa,OAAO,OAAO,SAAS,IAAI,IAAI;AAEzG,gBAAI,iBAAmC,QAAQ,QAAQ,aAAa,QAAQ,IAAI,CAAC;AAEjF,gBAAI,aAAa,OAAO,SAAS;AAC/B,oBAAM,KAAK,aAAa,OAAO;AAC/B,kBAAI;AACJ,oBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,wBAAQ;AAAA,kBACN,MAAM,OAAO,IAAI,MAAM,SAAS,aAAa,qBAAqB,EAAE,IAAI,CAAC;AAAA,kBACzE;AAAA,gBACF;AAAA,cACF,CAAC;AACD,+BAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,gBAAQ,MACtE,aAAa,KAAK;AAAA,cACpB;AAAA,YACF;AAEA,gBAAI,cAAc,MAAM;AACxB,gBAAI,aAAa,OAAO,OAAQ,eAAc,MAAM,cAAc,aAAa,OAAO,QAAQ,WAAW;AACzG,kBAAM,aAAa,cAAc,WAAW;AAE5C,gBAAI,aAAa,OAAO,IAAI;AAC1B,oBAAM,aAAa,CAAC,CAAE,OAAO,sBAAsB,GAAG,aAAqD,gBAAgB;AAC3H,kBAAI,CAAC,cAAc,WAAW,sBAAsB,QAAW;AAC7D,uBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,oCAAoC,CAAC,EAAE;AAAA,cAC3F;AAAA,YACF;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,eAAeD,UAAU,OAAM;AACnC,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,UAC3F,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,4BAA4B,OAAO,KAAK,UAAU;AACzE,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AACrD,YAAM,MAAM,cAAc,QAAQ,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI,QAAW,QAAW,OAAO,YAAY;AACrI,aAAO,aAAa;AAAA,QAAI;AAAA,QAAK,MAC3B,mBAAmB,KAAK,aAAa,kBAAkB,IAAI,QAAQ,KAAK,YAAY;AAClF,gBAAM,cACJ,MAAM,QAAQ;AAAA,YACZ,CAAC,GAAG,KAAK,iBAAiB,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AACnD,kBAAI,EAAE,OAAO,SAAU,QAAO;AAC9B,kBAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,kBAAI,CAAC,MAAO,QAAO;AACnB,kBAAI;AAAE,sBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,uBAAO;AAAA,cAAE,QAAQ;AAAE,uBAAO;AAAA,cAAK;AAAA,YACnE,CAAC;AAAA,UACH,GACA,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEnD,gBAAM,uBAAuB,KAAK,4BAA4B,UAAU;AAExE,gBAAM,WAAW,KAAK;AACtB,gBAAM,YAAY,IAAI,QAAQ,SAC1B,OAAO,KAAK,IAAI,OAAO,QAAQ,WAAW,EAAE,SAAS,IACrD;AACJ,cAAI,WAAW;AACf,cAAI,cAAc,MAAM;AACtB,kBAAM,MAAM,qBAAqB,UAAU,CAAC,MAAM,EAAE,QAAQ,SAAS;AACrE,gBAAI,MAAM,EAAG,OAAM,IAAIA,UAASC,WAAU,eAAe,2BAA2B;AACpF,uBAAW,MAAM;AAAA,UACnB;AACA,gBAAM,OAAO,qBAAqB,MAAM,UAAU,WAAW,QAAQ;AACrE,gBAAM,aACJ,WAAW,WAAW,qBAAqB,SACvC,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,GAAG,EAAE,SAAS,WAAW,IAC3D;AAEN,gBAAM,uBAAuB,CAAC,CAAE,OAAO,sBAAsB,GAAG,aAAqD,gBAAgB;AACrI,iBAAO;AAAA,YACL,WAAW,KAAK,IAAI,CAAC,OAAO;AAAA,cAC1B,KAAK,EAAE;AAAA,cACP,MAAM,EAAE;AAAA,cACR,GAAI,EAAE,OAAO,UAAU,SAAY,EAAE,OAAO,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,cAChE,GAAI,EAAE,OAAO,gBAAgB,SAAY,EAAE,aAAa,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,cAClF,GAAI,EAAE,OAAO,aAAa,SAAY,EAAE,UAAU,EAAE,OAAO,SAAS,IAAI,CAAC;AAAA,cACzE,GAAI,EAAE,OAAO,SAAS,SAAY,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,cAC7D,GAAI,EAAE,OAAO,gBAAgB,SAAY,EAAE,aAAa,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,cAClF,GAAI,wBAAwB,EAAE,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC;AAAA,YAC9E,EAAE;AAAA,YACF,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,UACrC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,oCAAoC,OAAO,KAAK,UAAU;AACjF,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AACrD,YAAM,MAAM,cAAc,QAAQ,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI,QAAW,QAAW,OAAO,YAAY;AACrI,aAAO,aAAa;AAAA,QAAI;AAAA,QAAK,MAC3B,mBAAmB,KAAK,aAAa,4BAA4B,IAAI,QAAQ,KAAK,YAAY;AAC5F,gBAAM,cACJ,MAAM,QAAQ;AAAA,YACZ,CAAC,GAAG,KAAK,mBAAmB,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AACrD,kBAAI,EAAE,OAAO,SAAU,QAAO;AAC9B,kBAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,kBAAI,CAAC,MAAO,QAAO;AACnB,kBAAI;AAAE,sBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,uBAAO;AAAA,cAAE,QAAQ;AAAE,uBAAO;AAAA,cAAK;AAAA,YACnE,CAAC;AAAA,UACH,GACA,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEnD,gBAAM,uBAAuB,KAAK,oCAAoC,UAAU;AAEhF,gBAAM,WAAW,KAAK;AACtB,gBAAM,YAAY,IAAI,QAAQ,SAC1B,OAAO,KAAK,IAAI,OAAO,QAAQ,WAAW,EAAE,SAAS,IACrD;AACJ,cAAI,WAAW;AACf,cAAI,cAAc,MAAM;AACtB,kBAAM,MAAM,qBAAqB,UAAU,CAAC,MAAM,EAAE,QAAQ,SAAS;AACrE,gBAAI,MAAM,EAAG,OAAM,IAAID,UAASC,WAAU,eAAe,2BAA2B;AACpF,uBAAW,MAAM;AAAA,UACnB;AACA,gBAAM,OAAO,qBAAqB,MAAM,UAAU,WAAW,QAAQ;AACrE,gBAAM,aACJ,WAAW,WAAW,qBAAqB,SACvC,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,GAAG,EAAE,SAAS,WAAW,IAC3D;AAEN,iBAAO;AAAA,YACL,mBAAmB,KAAK,IAAI,CAAC,OAAO;AAAA,cAClC,aAAa,EAAE;AAAA,cACf,MAAM,EAAE;AAAA,cACR,GAAI,EAAE,OAAO,UAAU,SAAY,EAAE,OAAO,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,cAChE,GAAI,EAAE,OAAO,gBAAgB,SAAY,EAAE,aAAa,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,cAClF,GAAI,EAAE,OAAO,aAAa,SAAY,EAAE,UAAU,EAAE,OAAO,SAAS,IAAI,CAAC;AAAA,cACzE,GAAI,EAAE,OAAO,gBAAgB,SAAY,EAAE,aAAa,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,YACpF,EAAE;AAAA,YACF,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,UACrC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,2BAA2B,OAAO,KAAK,UAAU;AACxE,YAAM,eAAe,IAAI,OAAO;AAChC,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AAErD,UAAI,WAA2C,KAAK,iBAAiB,IAAI,YAAY;AACrF,UAAI;AAGJ,UAAI,CAAC,UAAU;AACb,mBAAW,KAAK,KAAK,mBAAmB,OAAO,GAAG;AAChD,cAAI,EAAE,OAAO,SAAU;AACvB,gBAAM,SAAS,cAAc,EAAE,OAAO,KAAK,YAAY;AACvD,cAAI,WAAW,MAAM;AAAE,uBAAW;AAAG,6BAAiB;AAAQ;AAAA,UAAM;AAAA,QACtE;AAAA,MACF;AAGA,UAAI,CAAC,YAAY,KAAK,YAAY,SAAS,GAAG;AAC5C,mBAAW,KAAK,KAAK,iBAAiB,OAAO,GAAG;AAC9C,cAAI,EAAE,OAAO,SAAU;AACvB,gBAAM,OAAO;AAAA,YACX,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,UAAU,EAAE,OAAO,UAAU,OAAO,EAAE,OAAO,MAAM;AAAA,YACxI,KAAK;AAAA,YACL,CAAC,GAAG,MAAM,EAAE,oBAAoB,CAAC;AAAA,UACnC;AACA,cAAI,QAAQ,KAAK,QAAQ,cAAc;AAAE,uBAAW;AAAG;AAAA,UAAM;AAAA,QAC/D;AAAA,MACF;AAGA,UAAI,CAAC,YAAY,KAAK,YAAY,SAAS,GAAG;AAC5C,mBAAW,KAAK,KAAK,mBAAmB,OAAO,GAAG;AAChD,cAAI,EAAE,OAAO,SAAU;AACvB,gBAAM,OAAO;AAAA,YACX,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,UAAU,EAAE,OAAO,UAAU,OAAO,EAAE,OAAO,MAAM;AAAA,YACxI,KAAK;AAAA,YACL,CAAC,GAAG,MAAM,EAAE,4BAA4B,CAAC;AAAA,UAC3C;AACA,cAAI,MAAM;AACR,kBAAM,SAAS,cAAc,KAAK,KAAK,YAAY;AACnD,gBAAI,WAAW,MAAM;AAAE,yBAAW;AAAG,+BAAiB;AAAQ;AAAA,YAAM;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,YAAY,SAAS,OAAO,UAAU;AACzC,cAAM,IAAID,UAASC,WAAU,eAAe,sBAAsB,YAAY,GAAG;AAAA,MACnF;AAEA,UAAI,SAAS,OAAO,KAAM,OAAM,aAAa,SAAS,OAAO,MAAM,KAAK;AAExE,YAAM,MAAM;AAAA,QACV;AAAA,QACA,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI;AAAA,QAC1D,MAAM,OAAO;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAEA,aAAO,aAAa;AAAA,QAAI;AAAA,QAAK,MAC3B,mBAAmB,KAAK,aAAa,kBAAkB,IAAI,QAAQ,KAAK,YAAY;AAClF,cAAI,iBAAmC,QAAQ,QAAQ,SAAU,QAAQ,cAAc,CAAC;AAExF,cAAI,SAAU,OAAO,SAAS;AAC5B,kBAAM,KAAK,SAAU,OAAO;AAC5B,gBAAI;AACJ,kBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,sBAAQ;AAAA,gBACN,MAAM,OAAO,IAAI,MAAM,aAAa,YAAY,qBAAqB,EAAE,IAAI,CAAC;AAAA,gBAC5E;AAAA,cACF;AAAA,YACF,CAAC;AACD,6BAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,cAAQ,MACtE,aAAa,KAAK;AAAA,YACpB;AAAA,UACF;AAEA,gBAAM,SAAS,MAAM;AACrB,iBAAO,sBAAsB,QAAQ,cAAc,SAAU,OAAO,QAAQ;AAAA,QAC9E,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,0BAA0B,OAAO,KAAK,UAAU;AACvE,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AACrD,YAAM,MAAM,cAAc,QAAQ,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI,QAAW,QAAW,OAAO,YAAY;AACrI,aAAO,aAAa;AAAA,QAAI;AAAA,QAAK,MAC3B,mBAAmB,KAAK,aAAa,gBAAgB,IAAI,QAAQ,KAAK,YAAY;AAChF,gBAAM,cACJ,MAAM,QAAQ;AAAA,YACZ,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AAC3C,kBAAI,EAAE,OAAO,SAAU,QAAO;AAC9B,kBAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,kBAAI,CAAC,MAAO,QAAO;AACnB,kBAAI;AAAE,sBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,uBAAO;AAAA,cAAE,QAAQ;AAAE,uBAAO;AAAA,cAAK;AAAA,YACnE,CAAC;AAAA,UACH,GACA,OAAO,CAAC,MAA6B,MAAM,IAAI;AAEjD,gBAAM,qBAAqB,KAAK,0BAA0B,UAAU;AAEpE,gBAAM,WAAW,KAAK;AACtB,gBAAM,aAAa,IAAI,QAAQ,SAC3B,OAAO,KAAK,IAAI,OAAO,QAAQ,WAAW,EAAE,SAAS,IACrD;AACJ,cAAI,WAAW;AACf,cAAI,eAAe,MAAM;AACvB,kBAAM,MAAM,mBAAmB,UAAU,CAAC,MAAM,EAAE,SAAS,UAAU;AACrE,gBAAI,MAAM,EAAG,OAAM,IAAID,UAASC,WAAU,eAAe,2BAA2B;AACpF,uBAAW,MAAM;AAAA,UACnB;AACA,gBAAM,OAAO,mBAAmB,MAAM,UAAU,WAAW,QAAQ;AACnE,gBAAM,aACJ,WAAW,WAAW,mBAAmB,SACrC,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,WAAW,IAC5D;AAEN,iBAAO;AAAA,YACL,SAAS,KAAK,IAAI,CAAC,OAAO;AAAA,cACxB,MAAM,EAAE;AAAA,cACR,GAAI,EAAE,OAAO,UAAU,SAAY,EAAE,OAAO,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,cAChE,aAAa,EAAE;AAAA,cACf,GAAI,EAAE,OAAO,WAAW,SAAS,EAAE,WAAW,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,YACxE,EAAE;AAAA,YACF,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,UACrC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,wBAAwB,OAAO,KAAK,UAAU;AACrE,YAAM,gBAAgB,IAAI,OAAO;AACjC,UAAI;AACJ,UAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,mBAAW,KAAK,KAAK,SAAS,OAAO,GAAG;AACtC,gBAAM,OAAO;AAAA,YACX,EAAE,MAAM,EAAE,OAAO,MAAM,aAAa,EAAE,OAAO,aAAa,MAAM,EAAE,OAAO,QAAQ,CAAC,EAAE;AAAA,YACpF,KAAK;AAAA,YACL,CAAC,GAAG,MAAM,EAAE,kBAAkB,CAAC;AAAA,UACjC;AACA,cAAI,QAAQ,KAAK,SAAS,eAAe;AAAE,qBAAS;AAAG;AAAA,UAAM;AAAA,QAC/D;AAAA,MACF;AACA,UAAI,CAAC,OAAQ,UAAS,KAAK,SAAS,IAAI,aAAa;AAErD,UAAI,CAAC,UAAU,OAAO,OAAO,UAAU;AACrC,cAAM,IAAID,UAASC,WAAU,eAAe,oBAAoB,aAAa,GAAG;AAAA,MAClF;AAEA,YAAM,iBAAiB;AACvB,YAAM,QAAQ,MAAM,KAAK,cAAc,MAAM,QAAQ;AACrD,UAAI,eAAe,OAAO,KAAM,OAAM,aAAa,eAAe,OAAO,MAAM,KAAK;AAEpF,YAAM,eAAe,IAAI,OAAO,aAAa,CAAC;AAC9C,iBAAW,OAAO,eAAe,OAAO,aAAa,CAAC,GAAG;AACvD,YAAI,IAAI,YAAY,EAAE,IAAI,QAAQ,eAAe;AAC/C,gBAAM,IAAID;AAAA,YACRC,WAAU;AAAA,YACV,8BAA8B,IAAI,IAAI,iBAAiB,aAAa;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAEA,YAAM,MAAM;AAAA,QACV;AAAA,QACA,MAAM,cAAc,SAAY,OAAO,MAAM,SAAS,IAAI;AAAA,QAC1D,MAAM,OAAO;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAEA,aAAO,aAAa;AAAA,QAAI;AAAA,QAAK,MAC3B,mBAAmB,KAAK,aAAa,eAAe,IAAI,QAAQ,KAAK,YAAY;AAC/E,cAAI,iBAAiB,QAAQ,QAAQ,eAAe,QAAQ,YAAY,CAAC;AACzE,cAAI,eAAe,OAAO,SAAS;AACjC,kBAAM,KAAK,eAAe,OAAO;AACjC,gBAAI;AACJ,kBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,sBAAQ;AAAA,gBACN,MAAM,OAAO,IAAI,MAAM,WAAW,aAAa,qBAAqB,EAAE,IAAI,CAAC;AAAA,gBAC3E;AAAA,cACF;AAAA,YACF,CAAC;AACD,6BAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,cAAQ,MACtE,aAAa,KAAK;AAAA,YACpB;AAAA,UACF;AACA,iBAAO,oBAAoB,MAAM,cAAc;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,yBAA+B;AACrC,SAAK,eAAe,oBAAoB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACxD,eAAW,EAAE,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG;AAChD,aAAO,oBAAoB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,6BAAmC;AACzC,SAAK,eAAe,wBAAwB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC5D,eAAW,EAAE,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG;AAChD,aAAO,wBAAwB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,2BAAiC;AACvC,SAAK,eAAe,sBAAsB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC1D,eAAW,EAAE,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG;AAChD,aAAO,sBAAsB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA,EAWA,KAAK,QAAoB,SAAmC;AAC1D,UAAM,aAA6B,EAAE,QAAQ,QAAQ;AACrD,SAAK,OAAO,IAAI,OAAO,MAAM,UAAU;AACvC,SAAK,uBAAuB;AAC5B,eAAW,MAAM,KAAK,yBAA0B,IAAG,UAAU;AAAA,EAC/D;AAAA,EAEA,OAAO,QAAsB,SAA2D;AACtF,UAAM,OAAO,OAAO,QAAS,QAA8B;AAC3D,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,qFAAqF;AAChH,UAAM,cAAc,OAAO,eAAe,iBAAiB,IAAI;AAC/D,UAAM,iBAAuC,EAAE,GAAG,QAAQ,MAAM,YAAY;AAC5E,UAAM,aAA+B,EAAE,QAAQ,gBAAgB,QAAQ;AACvE,SAAK,SAAS,IAAI,MAAM,UAAU;AAClC,SAAK,yBAAyB;AAC9B,eAAW,MAAM,KAAK,2BAA4B,IAAG,UAAU;AAAA,EACjE;AAAA,EAEA,SAAS,QAAwB,SAA6D;AAC5F,UAAM,aAAiC,EAAE,QAAQ,QAAQ;AACzD,QAAI,cAAc,OAAO,GAAG,GAAG;AAC7B,WAAK,mBAAmB,IAAI,OAAO,KAAK,UAAU;AAAA,IACpD,OAAO;AACL,WAAK,iBAAiB,IAAI,OAAO,KAAK,UAAU;AAAA,IAClD;AACA,SAAK,2BAA2B;AAChC,eAAW,MAAM,KAAK,6BAA8B,IAAG,UAAU;AAAA,EACnE;AAAA,EAEA,YAAY,MAAuB;AACjC,QAAI,CAAC,KAAK,OAAO,IAAI,IAAI,EAAG,QAAO;AACnC,SAAK,OAAO,OAAO,IAAI;AACvB,SAAK,uBAAuB;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,KAAsB;AACpC,QAAI,KAAK,iBAAiB,IAAI,GAAG,GAAG;AAClC,WAAK,iBAAiB,OAAO,GAAG;AAChC,WAAK,2BAA2B;AAChC,aAAO;AAAA,IACT;AACA,QAAI,KAAK,mBAAmB,IAAI,GAAG,GAAG;AACpC,WAAK,mBAAmB,OAAO,GAAG;AAClC,WAAK,2BAA2B;AAChC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAuB;AACnC,QAAI,CAAC,KAAK,SAAS,IAAI,IAAI,EAAG,QAAO;AACrC,SAAK,SAAS,OAAO,IAAI;AACzB,SAAK,yBAAyB;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,GAAoB;AAC5B,SAAK,YAAY,KAAK,CAAC;AACvB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,MACA,SACA,KACA;AACA,UAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,QAAI,CAAC,QAAQ,KAAK,OAAO,UAAU;AACjC,YAAM,IAAID,UAASC,WAAU,eAAe,kBAAkB,IAAI,GAAG;AAAA,IACvE;AACA,QAAI,KAAK,OAAO,KAAM,OAAM,aAAa,KAAK,OAAO,MAAM,IAAI,IAAI;AAEnE,QAAI;AACF,aAAO,MAAM,aAAa;AAAA,QAAI;AAAA,QAAK,MACjC,mBAAmB,KAAK,aAAa,cAAc,EAAE,MAAM,WAAW,QAAQ,GAAG,KAAK,YAAY;AAChG,gBAAM,OAAO,KAAK,OAAO,QACrB,MAAM,cAAc,KAAK,OAAO,OAAO,SAAS,IAAI,IACpD;AAEJ,cAAI,iBAAmC,QAAQ,QAAQ,KAAK,QAAQ,IAAI,CAAC;AACzE,cAAI,KAAK,OAAO,SAAS;AACvB,kBAAM,KAAK,KAAK,OAAO;AACvB,gBAAI;AACJ,kBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,sBAAQ;AAAA,gBACN,MAAM,OAAO,IAAI,MAAM,SAAS,IAAI,qBAAqB,EAAE,IAAI,CAAC;AAAA,gBAChE;AAAA,cACF;AAAA,YACF,CAAC;AACD,6BAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,cAAQ,MACtE,aAAa,KAAK;AAAA,YACpB;AAAA,UACF;AAEA,cAAI,cAAc,MAAM;AACxB,cAAI,KAAK,OAAO,OAAQ,eAAc,MAAM,cAAc,KAAK,OAAO,QAAQ,WAAW;AACzF,iBAAO,cAAc,WAAW;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAeD,UAAU,OAAM;AACnC,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QAC3F,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBACJ,KACA,QACA,KACkB;AAClB,UAAM,WAAW,cAAc,GAAG,IAC9B,KAAK,mBAAmB,IAAI,GAAG,IAC/B,KAAK,iBAAiB,IAAI,GAAG;AAEjC,QAAI,CAAC,YAAY,SAAS,OAAO,UAAU;AACzC,YAAM,IAAIA,UAASC,WAAU,eAAe,sBAAsB,GAAG,GAAG;AAAA,IAC1E;AACA,QAAI,SAAS,OAAO,KAAM,OAAM,aAAa,SAAS,OAAO,MAAM,IAAI,IAAI;AAE3E,WAAO,aAAa;AAAA,MAAI;AAAA,MAAK,MAC3B,mBAAmB,KAAK,aAAa,kBAAkB,EAAE,IAAI,GAAG,KAAK,YAAY;AAC/E,YAAI,iBAAmC,QAAQ,QAAQ,SAAS,QAAQ,MAAM,CAAC;AAC/E,YAAI,SAAS,OAAO,SAAS;AAC3B,gBAAM,KAAK,SAAS,OAAO;AAC3B,cAAI;AACJ,gBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,oBAAQ;AAAA,cACN,MAAM,OAAO,IAAI,MAAM,aAAa,GAAG,qBAAqB,EAAE,IAAI,CAAC;AAAA,cACnE;AAAA,YACF;AAAA,UACF,CAAC;AACD,2BAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,YAAQ,MACtE,aAAa,KAAK;AAAA,UACpB;AAAA,QACF;AACA,eAAO,MAAM;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,MACA,MACA,KACA;AACA,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI;AACrC,QAAI,CAAC,UAAU,OAAO,OAAO,UAAU;AACrC,YAAM,IAAID,UAASC,WAAU,eAAe,oBAAoB,IAAI,GAAG;AAAA,IACzE;AACA,QAAI,OAAO,OAAO,KAAM,OAAM,aAAa,OAAO,OAAO,MAAM,IAAI,IAAI;AAEvE,eAAW,OAAO,OAAO,OAAO,aAAa,CAAC,GAAG;AAC/C,UAAI,IAAI,YAAY,EAAE,IAAI,QAAQ,OAAO;AACvC,cAAM,IAAID;AAAA,UACRC,WAAU;AAAA,UACV,8BAA8B,IAAI,IAAI,iBAAiB,IAAI;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,aAAa;AAAA,MAAI;AAAA,MAAK,MAC3B,mBAAmB,KAAK,aAAa,eAAe,EAAE,MAAM,WAAW,KAAK,GAAG,KAAK,YAAY;AAC9F,YAAI,iBAAiB,QAAQ,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACzD,YAAI,OAAO,OAAO,SAAS;AACzB,gBAAM,KAAK,OAAO,OAAO;AACzB,cAAI;AACJ,gBAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,oBAAQ;AAAA,cACN,MAAM,OAAO,IAAI,MAAM,WAAW,IAAI,qBAAqB,EAAE,IAAI,CAAC;AAAA,cAClE;AAAA,YACF;AAAA,UACF,CAAC;AACD,2BAAiB,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE;AAAA,YAAQ,MACtE,aAAa,KAAK;AAAA,UACpB;AAAA,QACF;AACA,eAAO,oBAAoB,MAAM,cAAc;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,YAAY,OAAgB,MAAsB,QAAuB;AAC/E,UAAM,eAAe,KAAK,OAAO;AACjC,UAAM,MAAM,SAAS,GAAG,MAAM,IAAI,YAAY,KAAK;AACnD,QAAI,KAAK,OAAO,IAAI,GAAG,EAAG,OAAM,IAAI,MAAM,kCAAkC,GAAG,yBAAyB;AAGxG,UAAM,kBAA8B,EAAE,GAAG,KAAK,QAAQ,MAAM,KAAK,OAAO,QAAW,QAAQ,OAAU;AACrG,SAAK,KAAK,iBAAiB,CAAC,SAAkB;AAC5C,YAAM,YAAY,aAAa,SAAS;AAExC,YAAM,WAA6B,SAC/B,EAAE,GAAG,WAAW,iBAAiB,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,GAAG,IAC/D;AACJ,aAAO,MAAM,cAAc,cAAc,MAAM,QAAQ,EAAE,KAAK,CAAC,WAAW,IAAI,WAAW,MAAM,CAAC;AAAA,IAClG,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB,OAAgB,UAA8B,QAAuB;AAC3F,UAAM,OAAO,SAAS,OAAO,QAAQ,SAAS,OAAO;AACrD,UAAM,cAAc,SAAS,OAAO;AACpC,UAAM,YAAY,SAAS,kBAAkB,aAAa,MAAM,IAAI;AACpE,QAAI,KAAK,iBAAiB,IAAI,SAAS,KAAK,KAAK,mBAAmB,IAAI,SAAS,GAAG;AAClF,YAAM,IAAI,MAAM,qCAAqC,SAAS,yBAAyB;AAAA,IACzF;AACA,UAAM,kBAAkC;AAAA,MACtC,GAAG,SAAS;AAAA,MACZ,KAAK;AAAA,MACL,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAAA,IACvC;AAGA,SAAK,SAAS,iBAAiB,CAAC,WAAoC;AAClE,YAAM,MAAM,aAAa,SAAS;AAClC,aAAO,MAAM,kBAAkB,aAAa,QAAQ,GAAG;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,OAAgB,QAA0B,QAAuB;AACrF,UAAM,eAAe,OAAO,OAAO;AACnC,UAAM,MAAM,SAAS,GAAG,MAAM,IAAI,YAAY,KAAK;AACnD,QAAI,KAAK,SAAS,IAAI,GAAG,EAAG,OAAM,IAAI,MAAM,oCAAoC,GAAG,yBAAyB;AAC5G,UAAM,kBAAgC,EAAE,GAAI,OAAO,QAAyB,MAAM,IAAI;AACtF,SAAK,OAAO,iBAAiB,CAAC,SAAkC;AAC9D,YAAM,MAAM,aAAa,SAAS;AAClC,aAAO,MACJ,gBAAgB,cAAc,QAAQ,CAAC,GAAG,GAAG,EAC7C,KAAK,CAAC,WAAW,IAAI,aAAa,OAAO,UAAU,OAAO,WAAW,CAAC;AAAA,IAC3E,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAgB,QAAuB;AAC3C,QAAI,UAAU,KAAM,OAAM,IAAI,MAAM,mCAAmC;AACvE,QAAI,KAAK,iBAAiB,IAAI,KAAK,EAAG,QAAO;AAC7C,SAAK,iBAAiB,IAAI,KAAK;AAE/B,eAAW,QAAQ,MAAM,OAAO,OAAO,EAAG,MAAK,YAAY,OAAO,MAAM,MAAM;AAC9E,eAAW,YAAY,MAAM,iBAAiB,OAAO,EAAG,MAAK,gBAAgB,OAAO,UAAU,MAAM;AACpG,eAAW,YAAY,MAAM,mBAAmB,OAAO,EAAG,MAAK,gBAAgB,OAAO,UAAU,MAAM;AACtG,eAAW,UAAU,MAAM,SAAS,OAAO,EAAG,MAAK,cAAc,OAAO,QAAQ,MAAM;AAEtF,UAAM,yBAAyB,KAAK,CAAC,SAAS,KAAK,YAAY,OAAO,MAAM,MAAM,CAAC;AACnF,UAAM,6BAA6B,KAAK,CAAC,aAAa,KAAK,gBAAgB,OAAO,UAAU,MAAM,CAAC;AACnG,UAAM,2BAA2B,KAAK,CAAC,WAAW,KAAK,cAAc,OAAO,QAAQ,MAAM,CAAC;AAG3F,SAAK,qBAAqB,KAAK,YAAY;AACzC,YAAM,QAAQ,IAAI,MAAM,qBAAqB,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAC,CAAC;AAC9E,YAAM,qBAAqB,SAAS;AAAA,IACtC,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,kBAAkB,IAA+B;AAC/C,SAAK,qBAAqB,KAAK,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,UAA+C;AACzD,UAAM,QAAQ,YAAY,WAAW,SAAS,SAAS;AACvD,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEQ,wBACN,OACwJ;AACxJ,WAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,YAAM,OAAO;AAAA,QACX,EAAE,MAAM,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,aAAa,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE;AAAA,QACvH,KAAK;AAAA,QACL,CAAC,GAAG,MAAM,EAAE,gBAAgB,CAAC;AAAA,MAC/B;AACA,aAAO,OACH,CAAC,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,aAAa,KAAK,aAAa,cAAc,KAAK,OAAO,MAAM,QAAQ,KAAK,QAAQ,SAAS,KAAK,QAAQ,CAAC,IAClJ,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,4BACN,WAC0I;AAC1I,WAAO,UAAU,QAAQ,CAAC,MAAM;AAC9B,YAAM,eAAe,EAAE,OAAO,QAAQ,EAAE,OAAO;AAC/C,YAAM,OAAO;AAAA,QACX,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,cAAc,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,UAAU,EAAE,OAAO,UAAU,OAAO,EAAE,OAAO,MAAM;AAAA,QACvH,KAAK;AAAA,QACL,CAAC,GAAG,MAAM,EAAE,oBAAoB,CAAC;AAAA,MACnC;AACA,aAAO,OACH,CAAC,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,aAAa,EAAE,OAAO,KAAK,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ,CAAC,IACpG,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,oCACN,WAC0I;AAC1I,WAAO,UAAU,QAAQ,CAAC,MAAM;AAC9B,YAAM,eAAe,EAAE,OAAO,QAAQ,EAAE,OAAO;AAC/C,YAAM,OAAO;AAAA,QACX,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,cAAc,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,UAAU,EAAE,OAAO,UAAU,OAAO,EAAE,OAAO,MAAM;AAAA,QACvH,KAAK;AAAA,QACL,CAAC,GAAG,MAAM,EAAE,4BAA4B,CAAC;AAAA,MAC3C;AACA,aAAO,OACH,CAAC,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,aAAa,EAAE,OAAO,KAAK,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ,CAAC,IACpG,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,0BACN,SACuJ;AACvJ,WAAO,QAAQ,QAAQ,CAAC,MAAM;AAC5B,YAAM,OAAO;AAAA,QACX,EAAE,MAAM,EAAE,OAAO,MAAM,aAAa,EAAE,OAAO,aAAa,MAAM,EAAE,OAAO,QAAQ,CAAC,EAAE;AAAA,QACpF,KAAK;AAAA,QACL,CAAC,GAAG,MAAM,EAAE,kBAAkB,CAAC;AAAA,MACjC;AACA,aAAO,OACH,CAAC,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,aAAa,cAAc,EAAE,OAAO,MAAM,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ,CAAC,IACtH,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,eAA+B,aAA8C;AAC1G,QAAI,KAAK,YAAY,WAAW,EAAG,QAAO,CAAC;AAC3C,UAAM,MAAM,KAAK,YAAY,QAAQ,CAAC,MAAM,EAAE,kBAAkB,eAAe,WAAW,KAAK,CAAC,CAAC;AACjG,WAAO,IAAI,QAAQ,CAAC,MAAM;AACxB,YAAM,OAAO;AAAA,QACX,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,aAAa,EAAE,aAAa,MAAM,CAAC,EAAE;AAAA,QACrE,KAAK;AAAA,QACL,CAAC,GAAG,MAAM,EAAE,gBAAgB,CAAC;AAAA,MAC/B;AACA,aAAO,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,aAAa,KAAK,YAAY,CAAC,IAAI,CAAC;AAAA,IACjG,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,iBACZ,OACuE;AACvE,UAAM,iBACJ,MAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,iBAAiB,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AACnD,YAAI,EAAE,OAAO,SAAU,QAAO;AAC9B,YAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AAAE,gBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,iBAAO;AAAA,QAAE,QAAQ;AAAE,iBAAO;AAAA,QAAK;AAAA,MACnE,CAAC;AAAA,IACH,GACA,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEnD,UAAM,oBACJ,MAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,mBAAmB,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AACrD,YAAI,EAAE,OAAO,SAAU,QAAO;AAC9B,YAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AAAE,gBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,iBAAO;AAAA,QAAE,QAAQ;AAAE,iBAAO;AAAA,QAAK;AAAA,MACnE,CAAC;AAAA,IACH,GACA,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEnD,UAAM,kBACJ,MAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AAC3C,YAAI,EAAE,OAAO,SAAU,QAAO;AAC9B,YAAI,CAAC,EAAE,OAAO,KAAM,QAAO;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AAAE,gBAAM,EAAE,OAAO,KAAK,KAAK;AAAG,iBAAO;AAAA,QAAE,QAAQ;AAAE,iBAAO;AAAA,QAAK;AAAA,MACnE,CAAC;AAAA,IACH,GACA,OAAO,CAAC,MAA6B,MAAM,IAAI;AAEjD,UAAM,gBAAgC;AAAA,MACpC,GAAG,KAAK,4BAA4B,aAAa;AAAA,MACjD,GAAG,KAAK,oCAAoC,gBAAgB;AAAA,IAC9D,EAAE,IAAI,CAAC,OAAO;AAAA,MACZ,KAAK,EAAE;AAAA,MACP,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,OAAO,QAAQ,CAAC;AAAA,MACxB,UAAU,EAAE,OAAO;AAAA,MACnB,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAEF,UAAM,cAA4B,KAAK,0BAA0B,cAAc,EAAE,IAAI,CAAC,OAAO;AAAA,MAC3F,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,MAAM,EAAE,OAAO,QAAQ,CAAC;AAAA,IAC1B,EAAE;AAEF,WAAO,EAAE,eAAe,YAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,IAAsB;AACxB,SAAK,YAAY,KAAK,EAAE;AACxB,OAAG,QAAQ,KAAK,cAAc;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,aAAyB;AACvB,UAAM,MAAM,aAAa,SAAS;AAClC,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kDAAkD;AAC5E,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,UAAgC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,WAAqC;AAEjD,SAAK,iBAAiB,KAAK,YAAY;AACvC,UAAM,KAAK,eAAe,QAAQ,SAAS;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAI,SAAqC;AAC7C,UAAM,eAAe,QAAQ,IAAI,iBAAiB,SAAS,aAAa;AACxE,QAAI,iBAAiB,WAAW,iBAAiB,QAAQ;AACvD,YAAM,IAAI,MAAM,uBAAuB,YAAY,4BAA4B;AAAA,IACjF;AACA,UAAM,YAAY;AAElB,UAAM,OAAO,SAAS,QAAQ,SAAS,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AAC7F,UAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,YAAY;AACtD,UAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,YAAY;AAEtD,QAAI,cAAc,SAAS;AACzB,YAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,wCAAwC;AACtF,YAAM,KAAK,QAAQ,IAAI,qBAAqB,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,IAC9E,WAAW,KAAK,QAAQ;AACtB,YAAM,KAAK,cAAc,MAAM,MAAM,IAAI;AAAA,IAC3C,OAAO;AACL,YAAM,KAAK,eAAe,MAAM,MAAM,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,MAAc,MAAc,MAA6B;AACnF,UAAM,EAAE,8BAA8B,IAAI,MAAM,OAC9C,iDACF;AACA,UAAM,WAAW,MAAM,OAAO,SAAS,GAAG;AAC1C,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8CAA8C;AACrF,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAClC,6DACF;AAEA,UAAM,QAAQ,KAAK;AACnB,UAAM,MAAM,QAAQ;AAGpB,UAAM,aAAa,MAAM,IAAI,QAAoB,CAAC,SAAS,WAAW;AACpE,YAAM,MAAM,IAAI,OAAO,MAAM,MAAM,MAAM,QAAQ,GAAG,CAAC;AACrD,UAAI,GAAG,SAAS,MAAM;AAAA,IACxB,CAAC;AAED,UAAM,QAAQ,WAAW,QAAQ;AACjC,UAAM,YAAY,MAAM,aAAa,IAAI,IAAI,UAAU,MAAM,OAAO,IAAI,MAAM,IAAI,EAAE;AAGpF,QAAI;AAAA,MACF,cAAc;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB;AAAA,QACA,iBAAiB,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AAGA,QAAI;AAAA,MACF;AAAA,MACA,kBAAkB,EAAE,UAAU,MAAM,SAAS,CAAC;AAAA,MAC9C,OAAO,KAAK,KAAK,UAAU;AACzB,cAAM,YAAY,IAAI,QAAQ,gBAAgB;AAC9C,YAAI;AAEJ,YAAI,WAAW;AACb,gBAAM,WAAW,KAAK,UAAU,IAAI,SAAS;AAC7C,cAAI,CAAC,UAAU;AACb,gBAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,UACF;AACA,yBAAe,SAAS;AAAA,QAC1B,OAAO;AACL,gBAAM,eAAe,oBAAI,IAAqB;AAC9C,gBAAM,gBAAgB,KAAK,YAAY,YAAY;AACnD,yBAAe,IAAI,8BAA8B;AAAA,YAC/C,oBAAoB,MAAM,WAAW;AAAA,YACrC,sBAAsB,CAAC,OAAO;AAC5B,mBAAK,UAAU,IAAI,IAAI,EAAE,WAAW,cAAc,QAAQ,eAAe,OAAO,aAAa,CAAC;AAAA,YAChG;AAAA,YACA,iBAAiB,CAAC,OAAO;AACvB,oBAAM,UAAU,KAAK,UAAU,IAAI,EAAE;AACrC,kBAAI,SAAS;AACX,sBAAM,YAAa,QAAQ,MAAM,IAAI,2BAA2B,KAAuC,CAAC;AACxG,2BAAW,MAAM,UAAW,IAAG;AAAA,cACjC;AACA,mBAAK,UAAU,OAAO,EAAE;AAAA,YAC1B;AAAA,UACF,CAAC;AACD,gBAAM,cAAc,QAAQ,YAAY;AAAA,QAC1C;AAEA,cAAM,aAAa,cAAc,KAAK,GAAG;AAAA,MAC3C;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,SAAK,WAAW,EAAE,MAAM,MAAM,SAAS,MAAM,MAAM,MAAM,KAAK;AAAA,EAChE;AAAA,EAEA,MAAc,eAAe,MAAc,MAAc,MAA6B;AACpF,UAAM,EAAE,8BAA8B,IAAI,MAAM,OAC9C,iDACF;AACA,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,MAAW;AAEjD,UAAM,OAAO,KAAK;AAElB,UAAM,cAAc;AAAA,MAClB,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCAAgC;AAAA,IAClC;AAEA,UAAM,aAAa,aAAa,OAAO,KAAK,QAAQ;AAElD,UAAI,IAAI,WAAW,WAAW;AAC5B,YAAI,UAAU,KAAK,WAAW,EAAE,IAAI;AACpC;AAAA,MACF;AAEA,UAAI,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,MAAM,MAAM;AACnC,YAAI,UAAU,GAAG,EAAE,IAAI;AACvB;AAAA,MACF;AAGA,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,WAAW,EAAG,KAAI,UAAU,GAAG,CAAC;AAGpE,UAAI,MAAM;AACR,cAAM,aAAa,IAAI,QAAQ;AAC/B,cAAM,SAAS,YAAY,WAAW,SAAS,IAAI,WAAW,MAAM,CAAC,IAAI;AAEzE,YAAI,CAAC,QAAQ;AACX,cACG,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,oBAAoB,qBAAqB,CAAC,EAC/F,IAAI,KAAK,UAAU,EAAE,OAAO,uBAAuB,CAAC,CAAC;AACxD;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,OAAO,MAAM;AAC3C,UAAC,IAA6C,OAAO;AAAA,YACpD,OAAO,YAAY;AAAA,YACnB,UAAU,YAAY,YAAY;AAAA,YAClC,QAAQ,YAAY;AAAA,YACpB,WAAW,YAAY;AAAA,YACvB,OAAO,YAAY;AAAA,UACrB;AAAA,QACF,SAAS,KAAK;AACZ,cAAI,eAAe,oBAAoB;AACrC,gBACG,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC,EACrD,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,CAAC;AAAA,UAC/C,OAAO;AACL,gBACG,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,oBAAoB,qBAAqB,CAAC,EAC/F,IAAI,KAAK,UAAU,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,wBAAwB,CAAC,CAAC;AAAA,UAChG;AACA;AAAA,QACF;AAAA,MACF;AAGA,YAAM,YAAY,IAAI,QAAQ,gBAAgB;AAC9C,UAAI;AAEJ,UAAI,WAAW;AACb,cAAM,WAAW,KAAK,UAAU,IAAI,SAAS;AAC7C,YAAI,CAAC,UAAU;AACb,cACG,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC,EACrD,IAAI,KAAK,UAAU,EAAE,OAAO,oBAAoB,CAAC,CAAC;AACrD;AAAA,QACF;AACA,uBAAe,SAAS;AAAA,MAC1B,OAAO;AACL,cAAM,eAAe,oBAAI,IAAqB;AAC9C,cAAM,gBAAgB,KAAK,YAAY,YAAY;AACnD,uBAAe,IAAI,8BAA8B;AAAA,UAC/C,oBAAoB,MAAM,WAAW;AAAA,UACrC,sBAAsB,CAAC,OAAO;AAC5B,iBAAK,UAAU,IAAI,IAAI,EAAE,WAAW,cAAc,QAAQ,eAAe,OAAO,aAAa,CAAC;AAAA,UAChG;AAAA,UACA,iBAAiB,CAAC,OAAO;AACvB,kBAAM,UAAU,KAAK,UAAU,IAAI,EAAE;AACrC,gBAAI,SAAS;AACX,oBAAM,YAAa,QAAQ,MAAM,IAAI,2BAA2B,KAAuC,CAAC;AACxG,yBAAW,MAAM,UAAW,IAAG;AAAA,YACjC;AACA,iBAAK,UAAU,OAAO,EAAE;AAAA,UAC1B;AAAA,QACF,CAAC;AACD,cAAM,cAAc,QAAQ,YAAY;AAAA,MAC1C;AAEA,YAAM,aAAa,cAAc,KAAK,GAAG;AAAA,IAC3C,CAAC;AAED,SAAK,cAAc;AAEnB,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,iBAAW,KAAK,SAAS,MAAM;AAC/B,iBAAW,OAAO,MAAM,MAAM,OAAO;AAAA,IACvC,CAAC;AAED,UAAM,QAAQ,WAAW,QAAQ;AACjC,SAAK,WAAW,EAAE,MAAM,MAAM,SAAS,MAAM,MAAM,MAAM,KAAK;AAAA,EAChE;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,IAAI,KAAK,qBAAqB,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAC,CAAC;AAC7E,SAAK,qBAAqB,SAAS;AAEnC,UAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,UAAU,MAAM,UAAU,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAC;AAAA,IACvF;AACA,SAAK,UAAU,MAAM;AAErB,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,aAAK,YAAa,MAAM,CAAC,QAAS,OAAO,OAAO,OAAO,GAAG,IAAI,QAAQ,CAAE;AAAA,MAC1E,CAAC;AACD,WAAK,cAAc;AAAA,IACrB;AACA,SAAK,WAAW;AAChB,UAAM,KAAK,eAAe,MAAM;AAAA,EAClC;AACF;;;ASl9CO,SAAS,iBAAiB,QAA6B;AAC5D,SAAO,OAAO,UAAU;AACtB,eAAW,SAAS,QAAQ;AAC1B,UAAI,CAAC,MAAM,OAAO,SAAS,KAAK,GAAG;AACjC,cAAM,IAAI,mBAAmB,4BAA4B,KAAK,GAAG;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF;;;ACXO,SAAS,aAAa,WAA2C;AACtE,SAAO;AAAA,IACL,MAAM,OAAO,OAAqC;AAChD,YAAM,SAAmB,CAAC;AAC1B,iBAAW,YAAY,WAAW;AAChC,YAAI;AACF,iBAAO,MAAM,SAAS,OAAO,KAAK;AAAA,QACpC,SAAS,KAAK;AACZ,iBAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC9D;AAAA,MACF;AACA,YAAM,IAAI,MAAM,wCAAwC,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7E;AAAA,EACF;AACF;;;AChBA,SAAS,oBAAoB,iBAAiB;AAWvC,SAAS,YAAY,SAA4C;AACtE,QAAM,OAAO,mBAAmB,IAAI,IAAI,QAAQ,OAAO,CAAC;AAExD,SAAO;AAAA,IACL,MAAM,OAAO,OAAqC;AAChD,YAAM,EAAE,QAAQ,IAAI,MAAM,UAAU,OAAO,MAAM;AAAA,QAC/C,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,QAClB,gBAAgB,QAAQ,UAAU;AAAA,MACpC,CAAC;AAED,YAAM,SACJ,OAAO,QAAQ,UAAU,WACrB,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO,IACvC,MAAM,QAAQ,QAAQ,KAAK,IACxB,QAAQ,QACT,CAAC;AAET,aAAO;AAAA,QACL;AAAA,QACA,UAAU,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;AAAA,QAC1D;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;;;ACxBO,SAAS,sBAAsB,SAAsD;AAC1F,QAAM,QAAQ,QAAQ,WAAW,oBAAI,IAAwB,IAAI;AAEjE,SAAO;AAAA,IACL,MAAM,OAAO,UAAwC;AACnD,UAAI,OAAO;AACT,cAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,YAAI,UAAU,KAAK,IAAI,IAAI,OAAO,WAAW;AAC3C,iBAAO,OAAO;AAAA,QAChB;AACA,cAAM,OAAO,QAAQ;AAAA,MACvB;AAEA,YAAM,cAAc,OAAO;AAAA,QACzB,GAAG,QAAQ,YAAY,QAAQ,IAAI,QAAQ,YAAY,YAAY;AAAA,MACrE,EAAE,SAAS,QAAQ;AAEnB,YAAM,WAAW,MAAM,MAAM,QAAQ,UAAU;AAAA,QAC7C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,SAAS,WAAW;AAAA,QACrC;AAAA,QACA,MAAM,IAAI,gBAAgB,EAAE,OAAO,SAAS,CAAC;AAAA,MAC/C,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,mCAAmC,SAAS,MAAM,EAAE;AAAA,MACtE;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAQlC,UAAI,CAAC,KAAK,QAAQ;AAChB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AAEA,YAAM,cAA2B;AAAA,QAC/B,OAAO;AAAA,QACP,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,QAC9D,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,MACV;AAEA,UAAI,SAAS,QAAQ,UAAU;AAC7B,cAAM,IAAI,UAAU;AAAA,UAClB,OAAO;AAAA,UACP,WAAW,KAAK,IAAI,IAAI,QAAQ,WAAW;AAAA,QAC7C,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxEO,SAAS,oBACd,KACe;AACf,SAAO;AAAA,IACL,MAAM,OAAO,OAAqC;AAChD,YAAM,QAAQ,IAAI,KAAK;AACvB,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,eAAe;AAAA,MACjC;AACA,UAAI,MAAM,cAAc,UAAa,MAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,GAAG;AACpF,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AACA,aAAO;AAAA,QACL;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM,UAAU,CAAC;AAAA,QACzB,WAAW,MAAM;AAAA,QACjB,QAAQ,MAAM,UAAU,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,qBAAoC;AAClD,UAAQ,KAAK,yFAAoF;AACjG,SAAO;AAAA,IACL,MAAM,OAAO,OAAqC;AAChD,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,aAAa;AAAA,MAC/B;AACA,aAAO,EAAE,OAAO,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IACzC;AAAA,EACF;AACF;;;ACnCA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,iCAAiC;AAgCnC,SAAS,cAAc,UAAgC,CAAC,GAAwB;AACrF,QAAM,UAAU,oBAAI,IAAwC;AAC5D,QAAM,QAAQ,oBAAI,IAAiF;AACnG,QAAM,SAAS,oBAAI,IAAuE;AAI1F,QAAM,eAA4C;AAAA,IAChD,MAAM,UAAU,UAAU;AACxB,aAAO,QAAQ,IAAI,QAAQ;AAAA,IAC7B;AAAA,IACA,MAAM,eAAe,QAAQ;AAC3B,YAAM,OAAO;AACb,cAAQ,IAAI,KAAK,WAAW,IAAI;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IAEA,MAAM,UAAU,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,aAAa;AACvB,eAAO,QAAQ,YAAY,QAAQ,QAAQ,GAAG;AAAA,MAChD;AAEA,YAAM,OAAOA,YAAW;AACxB,YAAM,IAAI,MAAM,EAAE,QAAQ,OAAO,CAAC;AAClC,YAAM,cAAc,IAAI,IAAI,OAAO,WAAW;AAC9C,kBAAY,aAAa,IAAI,QAAQ,IAAI;AACzC,UAAI,OAAO,MAAO,aAAY,aAAa,IAAI,SAAS,OAAO,KAAK;AACpE,UAAI,SAAS,YAAY,SAAS,CAAC;AAAA,IACrC;AAAA,IAEA,MAAM,8BAA8B,SAAS,mBAAmB;AAC9D,YAAM,OAAO,MAAM,IAAI,iBAAiB;AACxC,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,4BAA4B;AACvD,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,IAEA,MAAM,0BAA0B,QAAQ,mBAAmB;AACzD,YAAM,OAAO,MAAM,IAAI,iBAAiB;AACxC,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,4BAA4B;AACvD,UAAI,KAAK,OAAO,cAAc,OAAO,WAAW;AAC9C,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AACA,YAAM,OAAO,iBAAiB;AAE9B,YAAM,QAAQA,YAAW;AACzB,YAAM,MAAM,QAAQ,YAAY;AAChC,YAAM,kBAAkB,KAAK,OAAO,UAAU,CAAC;AAC/C,YAAM,gBACJ,QAAQ,WAAW,SACf,gBAAgB,OAAO,CAAC,MAAM,QAAQ,OAAQ,SAAS,CAAC,CAAC,IACzD;AACN,aAAO,IAAI,OAAO;AAAA,QAChB,UAAU,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA,MAC7C,CAAC;AACD,aAAO;AAAA,QACL,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,OAAO,cAAc,KAAK,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,IAEA,MAAM,uBAAuB;AAC3B,YAAM,IAAI,0BAA0B,mDAAmD;AAAA,IACzF;AAAA,IAEA,MAAM,kBAAkB,OAA0B;AAChD,YAAM,OAAO,OAAO,IAAI,KAAK;AAC7B,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,eAAe;AAC1C,UAAI,KAAK,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAG,OAAM,IAAI,MAAM,mBAAmB;AACvF,aAAO;AAAA,QACL;AAAA,QACA,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;ACrFO,SAAS,WAAW,SAAiD;AAC1E,QAAM,UAAU,oBAAI,IAAwC;AAE5D,QAAM,eAA4C;AAAA,IAChD,MAAM,UAAU,UAAU;AACxB,aAAO,QAAQ,IAAI,QAAQ;AAAA,IAC7B;AAAA;AAAA,IAEA,MAAM,eAAe,QAAQ;AAC3B,YAAM,OAAO;AACb,cAAQ,IAAI,KAAK,WAAW,IAAI;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA;AAAA,IAEA,yBAAyB;AAAA,IAEzB,MAAM,UAAU,SAAS,QAAQ,KAAK;AAEpC,YAAM,YAAY,IAAI,IAAI,QAAQ,UAAU,gBAAgB;AAC5D,gBAAU,aAAa,IAAI,aAAa,QAAQ,oBAAoB,QAAQ;AAC5E,gBAAU,aAAa,IAAI,iBAAiB,MAAM;AAClD,gBAAU,aAAa,IAAI,gBAAgB,OAAO,WAAW;AAC7D,gBAAU,aAAa,IAAI,kBAAkB,OAAO,aAAa;AACjE,gBAAU,aAAa,IAAI,yBAAyB,MAAM;AAC1D,UAAI,OAAO,MAAO,WAAU,aAAa,IAAI,SAAS,OAAO,KAAK;AAClE,UAAI,OAAO,QAAQ,OAAQ,WAAU,aAAa,IAAI,SAAS,OAAO,OAAO,KAAK,GAAG,CAAC;AACtF,UAAI,SAAS,UAAU,SAAS,CAAC;AAAA,IACnC;AAAA,IAEA,MAAM,gCAAgC;AAEpC,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,0BAA0B,SAAS,mBAAmB,cAAc,aAAmC;AAC3G,YAAM,OAAO,IAAI,gBAAgB;AAAA,QAC/B,YAAY;AAAA,QACZ,WAAW,QAAQ,oBAAoB;AAAA,QACvC,MAAM;AAAA,MACR,CAAC;AACD,UAAI,QAAQ,oBAAoB,cAAc;AAC5C,aAAK,IAAI,iBAAiB,QAAQ,oBAAoB,YAAY;AAAA,MACpE;AACA,UAAI,aAAc,MAAK,IAAI,iBAAiB,YAAY;AACxD,UAAI,YAAa,MAAK,IAAI,gBAAgB,WAAW;AAErD,YAAM,WAAW,MAAM,MAAM,QAAQ,UAAU,UAAU;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,QAC/D,MAAM,KAAK,SAAS;AAAA,MACtB,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,SAAS,MAAM,OAAO;AAC5B,cAAM,IAAI,MAAM,mCAAmC,SAAS,MAAM,EAAE;AAAA,MACtE;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IAEA,MAAM,qBAAqB,SAAS,cAAc,QAA8B;AAC9E,YAAM,OAAO,IAAI,gBAAgB;AAAA,QAC/B,YAAY;AAAA,QACZ,WAAW,QAAQ,oBAAoB;AAAA,QACvC,eAAe;AAAA,MACjB,CAAC;AACD,UAAI,QAAQ,oBAAoB,cAAc;AAC5C,aAAK,IAAI,iBAAiB,QAAQ,oBAAoB,YAAY;AAAA,MACpE;AACA,UAAI,QAAQ,OAAQ,MAAK,IAAI,SAAS,OAAO,KAAK,GAAG,CAAC;AAEtD,YAAM,WAAW,MAAM,MAAM,QAAQ,UAAU,UAAU;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,QAC/D,MAAM,KAAK,SAAS;AAAA,MACtB,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,SAAS,MAAM,OAAO;AAC5B,cAAM,IAAI,MAAM,kCAAkC,SAAS,MAAM,EAAE;AAAA,MACrE;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IAEA,mBAAmB,QAAQ;AAAA,IAE3B,GAAI,QAAQ,UAAU,gBAClB;AAAA,MACE,MAAM,YACJ,SACA,SACe;AACf,cAAM,OAAO,IAAI,gBAAgB;AAAA,UAC/B,OAAO,QAAQ;AAAA,UACf,WAAW,QAAQ,oBAAoB;AAAA,QACzC,CAAC;AACD,YAAI,QAAQ,oBAAoB,cAAc;AAC5C,eAAK,IAAI,iBAAiB,QAAQ,oBAAoB,YAAY;AAAA,QACpE;AACA,YAAI,QAAQ,iBAAiB;AAC3B,eAAK,IAAI,mBAAmB,QAAQ,eAAe;AAAA,QACrD;AACA,cAAM,WAAW,MAAM,MAAM,QAAQ,UAAU,eAAgB;AAAA,UAC7D,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,UAC/D,MAAM,KAAK,SAAS;AAAA,QACtB,CAAC;AACD,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,SAAS,MAAM,OAAO;AAAA,QAE9B;AAAA,MACF;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;;;ACpJA,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AA+B9B,eAAsB,qBACpB,QACA,SACkB;AAClB,QAAM,WAAW,SAAS,YAAY;AAEtC,QAAM,aAAa,OAAO,iBAAiB;AAC3C,QAAM,YAAY,SAAS,QAAQ,YAAY,QAAQ;AACvD,QAAM,eAAe,YAAY,WAAW;AAE5C,QAAM,QAAQ,IAAI,QAAQ,EAAE,MAAM,WAAW,SAAS,aAAa,CAAC;AAGpE,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,mBAAmB,oBAAI,IAAY;AACzC,QAAM,iBAAiB,oBAAI,IAAY;AAGvC,QAAM,WAAW,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,EAAE;AAEtD,iBAAe,cAA6B;AAC1C,UAAM,QAA+D,CAAC;AACtE,QAAI;AACJ,OAAG;AACD,YAAM,OAAO,MAAM,OAAO,UAAU,EAAE,OAAO,CAAC;AAC9C,YAAM,KAAK,GAAG,KAAK,KAAK;AACxB,eAAS,KAAK;AAAA,IAChB,SAAS;AAET,UAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEjD,eAAW,QAAQ,cAAc;AAC/B,UAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACvB,cAAM,YAAY,IAAI;AACtB,qBAAa,OAAO,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,UAAI,aAAa,IAAI,KAAK,IAAI,GAAG;AAE/B,cAAM,YAAY,KAAK,IAAI;AAC3B,qBAAa,OAAO,KAAK,IAAI;AAAA,MAC/B;AACA,YAAM;AAAA,QACJ;AAAA,UACE,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,UACxD,aAAa,KAAK,eAAe,KAAK;AAAA,UACtC,aAAc,KAAK,eAA2C,CAAC;AAAA,QACjE;AAAA,QACA,OAAO,SAAkB;AACvB,gBAAM,SAAS,MAAM,OAAO;AAAA,YAC1B,EAAE,MAAM,KAAK,MAAM,WAAW,KAAgC;AAAA,YAC9D;AAAA,UACF;AAGA,iBAAO,IAAI,WAAW,MAAmC;AAAA,QAC3D;AAAA,MACF;AACA,mBAAa,IAAI,KAAK,IAAI;AAAA,IAC5B;AAEA,aAAS,QAAQ,KAAK,IAAI;AAAA,EAC5B;AAEA,iBAAe,kBAAiC;AAC9C,UAAM,WAAW,oBAAI,IAAY;AAEjC,QAAI;AACF,YAAM,YAA2E,CAAC;AAClF,UAAI;AACJ,SAAG;AACD,cAAM,OAAO,MAAM,OAAO,cAAc,EAAE,OAAO,CAAC;AAClD,kBAAU,KAAK,GAAG,KAAK,SAAS;AAChC,iBAAS,KAAK;AAAA,MAChB,SAAS;AAET,iBAAW,YAAY,WAAW;AAChC,iBAAS,IAAI,SAAS,GAAG;AACzB,YAAI,CAAC,iBAAiB,IAAI,SAAS,GAAG,GAAG;AACvC,gBAAM;AAAA,YACJ;AAAA,cACE,KAAK,SAAS;AAAA,cACd,MAAM,SAAS;AAAA,cACf,GAAI,SAAS,gBAAgB,SAAY,EAAE,aAAa,SAAS,YAAY,IAAI,CAAC;AAAA,cAClF,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,YAC3E;AAAA,YACA,YAAY;AACV,oBAAM,SAAS,MAAM,OAAO,aAAa,EAAE,KAAK,SAAS,IAAI,CAAC;AAC9D,qBAAO,IAAI;AAAA,gBACT,OAAO;AAAA,cAMT;AAAA,YACF;AAAA,UACF;AACA,2BAAiB,IAAI,SAAS,GAAG;AAAA,QACnC;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,YAAM,oBAAmG,CAAC;AAC1G,UAAI;AACJ,SAAG;AACD,cAAM,OAAO,MAAM,OAAO,sBAAsB,EAAE,QAAQ,eAAe,CAAC;AAC1E,0BAAkB,KAAK,GAAG,KAAK,iBAAiB;AAChD,yBAAiB,KAAK;AAAA,MACxB,SAAS;AAET,iBAAW,YAAY,mBAAmB;AACxC,cAAM,cAAc,SAAS;AAC7B,iBAAS,IAAI,WAAW;AACxB,YAAI,CAAC,iBAAiB,IAAI,WAAW,GAAG;AACtC,gBAAM,WAAW,cAAc,WAAW;AAC1C,gBAAM;AAAA,YACJ;AAAA,cACE,KAAK;AAAA,cACL,MAAM,SAAS;AAAA,cACf,GAAI,SAAS,gBAAgB,SACzB,EAAE,aAAa,SAAS,YAAY,IACpC,CAAC;AAAA,cACL,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,YAC3E;AAAA,YACA,OAAO,WAAoC;AACzC,oBAAM,YAAY,SAAS,SAAS,OAAO,MAAM,IAAI;AACrD,oBAAM,SAAS,MAAM,OAAO,aAAa,EAAE,KAAK,UAAU,CAAC;AAC3D,qBAAO,IAAI;AAAA,gBACT,OAAO;AAAA,cAMT;AAAA,YACF;AAAA,UACF;AACA,2BAAiB,IAAI,WAAW;AAAA,QAClC;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,eAAW,OAAO,kBAAkB;AAClC,UAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,cAAM,gBAAgB,GAAG;AACzB,yBAAiB,OAAO,GAAG;AAAA,MAC7B;AAAA,IACF;AAEA,aAAS,YAAY,KAAK,IAAI;AAAA,EAChC;AAEA,iBAAe,gBAA+B;AAC5C,UAAM,UAAqE,CAAC;AAC5E,QAAI;AACJ,OAAG;AACD,YAAM,OAAO,MAAM,OAAO,YAAY,EAAE,OAAO,CAAC;AAChD,cAAQ,KAAK,GAAG,KAAK,OAAO;AAC5B,eAAS,KAAK;AAAA,IAChB,SAAS;AAET,UAAM,WAAW,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEnD,eAAW,QAAQ,gBAAgB;AACjC,UAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACvB,cAAM,cAAc,IAAI;AACxB,uBAAe,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AAEA,eAAW,UAAU,SAAS;AAC5B,UAAI,CAAC,eAAe,IAAI,OAAO,IAAI,GAAG;AACpC,cAAM;AAAA,UACJ;AAAA,YACE,MAAM,OAAO;AAAA,YACb,aAAa,OAAO;AAAA,YACpB,GAAI,OAAO,WAAW,SAAS,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,UACpE;AAAA,UACA,OAAO,SAAkC;AACvC,kBAAM,SAAS,MAAM,OAAO,UAAU,EAAE,MAAM,OAAO,MAAM,WAAW,KAAK,CAAC;AAC5E,mBAAO,IAAI,aAAa,OAAO,UAA6B,OAAO,WAAW;AAAA,UAChF;AAAA,QACF;AACA,uBAAe,IAAI,OAAO,IAAI;AAAA,MAChC;AAAA,IACF;AAEA,aAAS,UAAU,KAAK,IAAI;AAAA,EAC9B;AAGA,QAAM,QAAQ,IAAI;AAAA,IAChB,YAAY,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,IAC5B,gBAAgB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,IAChC,cAAc,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChC,CAAC;AAGD,SAAO,uBAAuB,mCAAmC,MAAM;AACrE,gBAAY,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC9B,CAAC;AACD,SAAO,uBAAuB,uCAAuC,MAAM;AACzE,oBAAgB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAClC,CAAC;AACD,SAAO,uBAAuB,qCAAqC,MAAM;AACvE,kBAAc,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChC,CAAC;AAGD,MAAI,WAAW,GAAG;AAChB,UAAM,IAAI;AAAA,MACR,MAAM,YAAY,KAAK,MAAM;AAC3B,YAAI,KAAK,IAAI,IAAI,SAAS,QAAQ,SAAU,OAAM,YAAY,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC9E,eAAO,KAAK;AAAA,MACd;AAAA,MACA,MAAM,gBAAgB,KAAK,MAAM;AAC/B,YAAI,KAAK,IAAI,IAAI,SAAS,YAAY,SAAU,OAAM,gBAAgB,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACtF,eAAO,KAAK;AAAA,MACd;AAAA,MACA,MAAM,wBAAwB,KAAK,MAAM;AACvC,YAAI,KAAK,IAAI,IAAI,SAAS,YAAY,SAAU,OAAM,gBAAgB,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACtF,eAAO,KAAK;AAAA,MACd;AAAA,MACA,MAAM,cAAc,KAAK,MAAM;AAC7B,YAAI,KAAK,IAAI,IAAI,SAAS,UAAU,SAAU,OAAM,cAAc,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAClF,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,YAAY;AAClC,UAAM,OAAO,MAAM;AAAA,EACrB,CAAC;AAED,SAAO;AACT;AAUA,eAAsB,YAAY,QAAwB,MAAiC;AACzF,MAAI;AAEJ,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,wCAAwC;AACtF,gBAAY,IAAI,qBAAqB;AAAA,MACnC,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,IACd,CAAC;AAAA,EACH,OAAO;AACL,UAAM,EAAE,8BAA8B,IAAI,MAAM,OAC9C,iDACF;AACA,gBAAY,IAAI,8BAA8B,IAAI,IAAI,OAAO,GAAG,GAAG;AAAA,MACjE,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,QAAQ,iBAAiB,SAAS,QAAQ;AAAA,IAClD,EAAE,cAAc,CAAC,EAAE;AAAA,EACrB;AAEA,QAAM,OAAO,QAAQ,SAAS;AAE9B,SAAO,qBAAqB,QAAQ,EAAE,UAAU,OAAO,UAAU,KAAK,CAAC;AACzE;;;ACxSO,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EAET,YAAY,SAA4B;AACtC,SAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,QAAQ,MAAM,SAAS,QAAQ,QAAQ,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,QAA0B,SAA0C;AAC7E,UAAM,cAAc,QAAQ,OAAO,IAAI;AACvC,UAAM,aAAyB;AAAA,MAC7B,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC5D,IAAI,EAAE,YAAY,CAAC,SAAS,KAAK,GAAG,YAAY;AAAA,IAClD;AACA,SAAK,OAAO,KAAK,YAAY,OAAO;AAGpC,SAAK,OAAO;AAAA,MACV,EAAE,KAAK,aAAa,UAAU,6BAA6B,MAAM,OAAO,KAAK;AAAA,MAC7E,MAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,QAA2B,SAAuC;AAC5E,UAAM,aAAa,OAAO,cAAc,CAAC,KAAK;AAC9C,UAAM,aAAyB;AAAA,MAC7B,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC5D,IAAI,EAAE,WAAW;AAAA,IACnB;AACA,SAAK,OAAO,KAAK,YAAY,OAAO;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,MAAsB;AAC5B,UAAM,MAAM,aAAa,SAAS;AAClC,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,IAAI,gBAAgB,IAAI;AAAA,EACjC;AACF;;;ACxEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,aAAa,SAAS,GAAG,gBAAgB,IAAI,KAAK;AAC3D;;;ACXA,SAAS,uBAAuB;;;ACAhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BO,IAAM,oBAAoC;AAAA,EAC/C,EAAE,MAAM,UAAU,aAAa,+EAA+E;AAAA,EAC9G,EAAE,MAAM,OAAO,aAAa,uFAAuF;AAAA,EACnH,EAAE,MAAM,QAAQ,aAAa,kEAAkE;AAAA,EAC/F,EAAE,MAAM,QAAQ,aAAa,2FAA2F;AAAA,EACxH,EAAE,MAAM,SAAS,aAAa,6CAA6C;AAAA,EAC3E,EAAE,MAAM,SAAS,aAAa,yEAAyE;AAAA,EACvG,EAAE,MAAM,aAAa,aAAa,wDAAwD;AAAA,EAC1F,EAAE,MAAM,cAAc,aAAa,yDAAyD;AAAA,EAC5F,EAAE,MAAM,cAAc,aAAa,yDAAyD;AAAA,EAC5F,EAAE,MAAM,aAAa,aAAa,gEAAgE;AAAA,EAClG,EAAE,MAAM,SAAS,aAAa,iGAAiG;AAAA,EAC/H,EAAE,MAAM,UAAU,aAAa,wFAAwF;AAAA,EACvH,EAAE,MAAM,UAAU,aAAa,gFAAgF;AAAA,EAC/G,EAAE,MAAM,MAAM,aAAa,kEAAkE;AAAA,EAC7F,EAAE,MAAM,WAAW,aAAa,yEAAyE;AAAA,EACzG,EAAE,MAAM,MAAM,aAAa,qFAAqF;AAClH;AAMA,SAAS,aAAa,MAAc,OAAiC,UAAmC;AACtG,QAAM,OAAkB,EAAE,KAAK;AAC/B,MAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,EAAG,MAAK,QAAQ;AACzD,MAAI,YAAY,SAAS,SAAS,EAAG,MAAK,WAAW;AACrD,SAAO;AACT;AAEA,SAAS,UAAU,MAAc,OAA2C;AAC1E,SAAO,EAAE,MAAM,MAAM;AACvB;AAMO,SAAS,OAAO,OAAiC,UAAmC;AACzF,SAAO,aAAa,UAAU,OAAO,QAAQ;AAC/C;AAEO,SAAS,IAAI,OAAiC,UAAmC;AACtF,SAAO,aAAa,OAAO,OAAO,QAAQ;AAC5C;AAEO,SAAS,KAAK,OAAiC,UAAmC;AACvF,SAAO,aAAa,QAAQ,OAAO,QAAQ;AAC7C;AAMO,SAAS,KAAK,SAA6B,YAAiD;AACjG,SAAO,UAAU,QAAQ,EAAE,SAAS,GAAG,WAAW,CAAC;AACrD;AAEO,SAAS,MAAM,MAAc,YAAiD;AACnF,SAAO,UAAU,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC;AACnD;AAEO,SAAS,MAAM,OAAmF;AACvG,SAAO,UAAU,SAAS,KAAgC;AAC5D;AAMO,SAAS,IAAI,OAA2C;AAC7D,SAAO,UAAU,aAAa,KAAK;AACrC;AAEO,SAAS,KAAK,OAA2C;AAC9D,SAAO,UAAU,cAAc,KAAK;AACtC;AAEO,SAAS,KAAK,OAA2C;AAC9D,SAAO,UAAU,cAAc,KAAK;AACtC;AAEO,SAAS,IAAI,OAA2C;AAC7D,SAAO,UAAU,aAAa,KAAK;AACrC;AAMO,SAAS,MAAM,OAA2C;AAC/D,SAAO,UAAU,SAAS,KAAK;AACjC;AAEO,SAAS,OAAO,OAA2C;AAChE,SAAO,UAAU,UAAU,KAAK;AAClC;AAEO,SAAS,OAAO,OAA2C;AAChE,SAAO,UAAU,UAAU,KAAK;AAClC;AAMA,SAAS,WACP,UACA,UACQ;AACR,QAAM,OAAO,EAAE,MAAM,MAAe,UAAU,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC,EAAG;AAE9F,SAAO,eAAe,MAAM,QAAQ;AAAA,IAClC,YAAY;AAAA,IACZ,MAAM,WAAmB,OAA0B;AACjD,aAAO,WAAW,CAAC,GAAG,UAAU,EAAE,WAAW,MAAM,MAAM,CAAC,GAAG,QAAQ;AAAA,IACvE;AAAA,EACF,CAAC;AAED,SAAO,eAAe,MAAM,QAAQ;AAAA,IAClC,YAAY;AAAA,IACZ,MAAM,OAA6B;AACjC,aAAO,WAAW,UAAU,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,GAAG,WAAmB,MAAiB,UAA8B;AACnF,SAAO,WAAW,CAAC,EAAE,WAAW,MAAM,KAAK,CAAC,GAAG,QAAQ;AACzD;AAMO,SAAS,QAAQ,OAAe,UAAgC;AACrE,SAAO,EAAE,MAAM,WAAW,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE;AACnE;AAMO,SAAS,GAAG,YAA+B;AAChD,SAAO,UAAU,MAAM,EAAE,WAAW,CAAC;AACvC;;;AD1KO,IAAM,eAAN,MAAmB;AAAA,EACf;AAAA,EAET,cAAc;AACZ,SAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGnD,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM,IAAI,WAAW;AAAA,QACnB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,iBAAiB,EAAE,CAAC;AAAA,MACrE,CAAC;AAAA,IACH;AAGA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM,EAAE,MAAM,UAAU,aAAa,uHAAuH;AAAA,UAC9J;AAAA,UACA,UAAU,CAAC,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,MACA,CAAC,SAAkC;AACjC,cAAM,EAAE,KAAK,IAAI;AAEjB,cAAM,UAAmC,EAAE,GAAG,mBAAW;AACzD,eAAO,QAAQ,mBAAmB;AAElC,YAAI;AAGF,iBAAO,gBAAgB,MAAM,SAAS,EAAE,SAAS,IAAK,CAAC;AAAA,QACzD,SAAS,KAAK;AACZ,gBAAM,IAAI,MAAM,iBAAiB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AEhDO,IAAM,WAAN,MAAe;AAAA,EACX;AAAA,EAET,cAAc;AACZ,SAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE9C,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,SAAS,EAAE,MAAM,UAAU,aAAa,8CAA8C;AAAA,UACxF;AAAA,UACA,UAAU,CAAC,SAAS;AAAA,QACtB;AAAA,QACA,IAAI,EAAE,YAAY,CAAC,SAAS,KAAK,EAAE;AAAA,MACrC;AAAA,MACA,CAAC,SAAkC;AACjC,cAAM,UAAW,KAAK,WAAsB;AAC5C,eAAO,OAAO,CAAC,GAAG;AAAA,UAChB,KAAK,OAAO;AAAA,UACZ,OAAO,EAAE,OAAO,WAAW,QAAQ,UAAU,kBAAkB,EAAE,CAAC;AAAA,UAClE,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,eAAe,GAAG,SAAS,YAAY,CAAC;AAAA,QACpF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,OAAO;AAAA,MACV,EAAE,KAAK,yBAAyB,UAAU,6BAA6B,MAAM,mBAAmB;AAAA,MAChG,MAAM;AAAA,IACR;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,OAAO,EAAE,UAAU,WAAoB;AAAA,IACzC;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,OAAO,EAAE,UAAU,SAAkB;AAAA,IACvC;AAAA,EACF;AACF;;;ACpDO,IAAM,SAAN,MAAa;AAAA,EACT;AAAA,EAET,cAAc;AACZ,SAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,UAAU,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,YACxE,SAAS,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,yBAAyB;AAAA,UAC7F;AAAA,UACA,UAAU,CAAC,YAAY,SAAS;AAAA,QAClC;AAAA,QACA,IAAI,EAAE,YAAY,CAAC,SAAS,KAAK,EAAE;AAAA,MACrC;AAAA,MACA,CAAC,SAAkC;AACjC,cAAM,UAAW,KAAK,WAAwB,CAAC;AAC/C,eAAO;AAAA,UACL,CAAC;AAAA;AAAA;AAAA,UAGD,QAAQ;AAAA,YAAI,CAAC,QACX,OAAO,EAAE,OAAO,KAAK,QAAQ,UAAU,eAAe,GAAG,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,OAAO;AAAA,MACV,EAAE,KAAK,uBAAuB,UAAU,6BAA6B,MAAM,iBAAiB;AAAA,MAC5F,MAAM;AAAA,IACR;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,CAAC,UAAmC,EAAE,UAAU,KAAK,OAAiB;AAAA,IACxE;AAAA,EACF;AACF;;;ACnDA,SAAS,cAAAC,mBAAkB;AAoB3B,SAAS,sBAA0C;AACjD,QAAM,QAAQ,oBAAI,IAAwB;AAC1C,SAAO;AAAA,IACL,MAAM,CAAC,QAAQ,SAAS,MAAM,IAAI,QAAQ,IAAI;AAAA,IAC9C,MAAM,CAAC,WAAW,MAAM,IAAI,MAAM;AAAA,IAClC,QAAQ,CAAC,WAAW,MAAM,OAAO,MAAM;AAAA,EACzC;AACF;AAMA,IAAM,sBAAsB;AAErB,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EACQ;AAAA,EAEjB,YAAY,SAA6B;AACvC,SAAK,WAAW,SAAS,WAAW,oBAAoB;AACxD,SAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEjD,UAAM,UAAU,KAAK;AAErB,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,QAAQ,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,UACpF;AAAA,QACF;AAAA,QACA,IAAI,EAAE,YAAY,CAAC,SAAS,KAAK,EAAE;AAAA,MACrC;AAAA,MACA,CAAC,SAAkC;AACjC,eAAO,OAAO,CAAC,GAAG;AAAA,UAChB,KAAM,KAAK,UAAiC,eAAe;AAAA,UAC3D,OAAO,EAAE,OAAO,eAAe,QAAQ,UAAU,oBAAoB,EAAE,CAAC;AAAA,QAC1E,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,YACjD,UAAU,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,YACjE,MAAM,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACrE;AAAA,UACA,UAAU,CAAC,QAAQ,YAAY,MAAM;AAAA,QACvC;AAAA,QACA,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,CAAC,SAAkC;AACjC,cAAM,SAASC,YAAW;AAC1B,cAAM,WAAW,OAAO,KAAK,KAAK,MAAgB,QAAQ;AAC1D,gBAAQ,KAAK,QAAQ;AAAA,UACnB;AAAA,UACA,MAAM,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,MAAM;AAAA,QACR,CAAC;AAGD,cAAM,MAAM,aAAa,SAAS;AAClC,YAAI,KAAK;AACP,gBAAM,WAAY,IAAI,SAAS,mBAAmB,KAA8B,CAAC;AACjF,cAAI,SAAS,qBAAqB,CAAC,GAAG,UAAU,MAAM,CAAC;AACvD,cAAI,QAAQ,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,QAC1C;AAEA,cAAM,MAAM,cAAc,MAAM;AAChC,eAAO,EAAE,QAAQ,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,QAAQ,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,UAC1F;AAAA,UACA,UAAU,CAAC,QAAQ;AAAA,QACrB;AAAA,QACA,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,CAAC,SAAkC;AACjC,cAAM,SAAS,KAAK;AACpB,gBAAQ,OAAO,MAAM;AACrB,cAAM,MAAM,aAAa,SAAS;AAClC,YAAI,KAAK;AACP,gBAAM,WAAY,IAAI,SAAS,mBAAmB,KAA8B,CAAC;AACjF,cAAI,SAAS,qBAAqB,SAAS,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA,QACxE;AACA,eAAO,EAAE,SAAS,OAAO;AAAA,MAC3B;AAAA,IACF;AAEA,SAAK,OAAO;AAAA,MACV,EAAE,KAAK,uBAAuB,MAAM,iBAAiB,UAAU,2BAA2B;AAAA,MAC1F,CAAC,WAAW;AACV,cAAM,IAAI,QAAQ;AAClB,YAAI,CAAC,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAC7C,cAAM,OAAO,QAAQ,KAAK,CAAC;AAC3B,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,CAAC,EAAE;AACjD,cAAM,MAAM,cAAc,CAAC;AAC3B,YAAI,KAAK,SAAS,WAAW,OAAO,GAAG;AACrC,iBAAO,IAAI,eAAe,CAAC,EAAE,KAAK,UAAU,KAAK,UAAU,MAAM,KAAK,KAAK,SAAS,MAAM,EAAE,CAAC,CAAC;AAAA,QAChG;AACA,eAAO,IAAI,eAAe,CAAC,EAAE,KAAK,UAAU,KAAK,UAAU,MAAM,KAAK,KAAK,SAAS,QAAQ,EAAE,CAAC,CAAC;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AACF;;;ACjIA,SAAS,WAAW,WAAmB,aAA0B,UAAoB;AACnF,QAAM,aAAa,SAAS,SAAS,SAAS;AAC9C,QAAM,OAAO,YAAY;AACzB,MAAI,MAAM,QAAQ,YAAY,IAAI,GAAG;AACnC,WAAO,OAAO,EAAE,MAAM,WAAW,OAAO,WAAW,SAAS,YAAY,MAAkB,UAAU,WAAW,CAAC;AAAA,EAClH;AACA,MAAI,SAAS,YAAY,SAAS,WAAW;AAC3C,WAAO,MAAM,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,UAAU,UAAU,WAAW,CAAC;AAAA,EAC1F;AACA,SAAO,MAAM,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,QAAQ,UAAU,WAAW,CAAC;AACxF;AAEA,eAAe,mBACb,QACA,MAC6F;AAE7F,QAAM,SAAS,MAAO,OAAO,WAAW,EAAE,SAA0C,IAAI;AACxF,MAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,UAAM,SAAiC,CAAC;AACxC,eAAW,SAAS,OAAO,QAAQ;AAEjC,YAAM,OAAO,MAAM,MAAM,IAAI,CAAC,MAAW,OAAO,OAAO,MAAM,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK;AACjG,aAAO,IAAI,IAAI,OAAO,MAAM,OAAO;AAAA,IACrC;AACA,WAAO,EAAE,OAAO,OAAO,OAAO;AAAA,EAChC;AACA,SAAO,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM;AAC5C;AAEO,IAAM,YAAN,MAAgB;AAAA,EACZ;AAAA,EAET,YAAY,SAA2B;AACrC,SAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,QAAQ,KAAK,CAAC;AAChD,UAAM,EAAE,MAAM,aAAa,OAAO,IAAI;AACtC,UAAM,aAAa,GAAG,IAAI;AAE1B,SAAK,OAAO;AAAA,MACV,EAAE,KAAK,QAAQ,IAAI,IAAI,UAAU,6BAA6B,KAAK;AAAA,MACnE,MAAM;AAAA,IACR;AAEA,SAAK,OAAO;AAAA,MACV,EAAE,MAAM,aAAa,IAAI,EAAE,YAAY,CAAC,SAAS,KAAK,EAAE,EAAE;AAAA,MAC1D,YAAY;AAEV,cAAM,aAAa,MAAM,aAAa,QAAQ,SAAS,IAAI,GAAG;AAC9D,cAAM,aAAc,WAAW,cAAc,CAAC;AAC9C,cAAM,WAAY,WAAW,YAAY,CAAC;AAE1C,cAAM,SAAS,OAAO,QAAQ,UAAU,EAAE;AAAA,UAAI,CAAC,CAAC,WAAW,WAAW,MACpE,WAAW,WAAW,aAAa,QAAQ;AAAA,QAC7C;AAEA,eAAO,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,UAAU,EAAE,CAAC,CAAC,CAAC;AAAA,MAC3F;AAAA,IACF;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa,UAAU,IAAI;AAAA,QAC3B,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,UAC/E;AAAA,UACA,UAAU,CAAC,MAAM;AAAA,QACnB;AAAA,QACA,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,OAAO,SAAkC;AACvC,cAAM,SAAS,MAAM,mBAAmB,QAAQ,KAAK,IAAI;AACzD,YAAI,CAAC,OAAO,OAAO;AACjB,iBAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,QACjC;AACA,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;","names":["McpError","ErrorCode","McpError","ErrorCode","McpError","ErrorCode","ctx","randomUUID","randomUUID","randomUUID"]}
1
+ {"version":3,"sources":["../src/server/FastMCP.ts","../src/server/auth/types.ts","../src/server/context.ts","../src/server/middleware.ts","../src/server/transform.ts","../src/server/tool.ts","../src/server/resource.ts","../src/server/apps/types.ts","../src/server/prompt.ts","../src/server/auth/authorization.ts","../src/server/auth/multiAuth.ts","../src/server/auth/verifiers/jwt.ts","../src/server/auth/verifiers/introspection.ts","../src/server/auth/verifiers/static.ts","../src/server/auth/oauth/provider.ts","../src/server/auth/oauth/proxy.ts","../src/server/proxy.ts","../src/server/apps/FastMCPApp.ts","../src/server/apps/actionRef.ts","../src/server/apps/generative.ts","../src/server/apps/components.ts","../src/server/apps/providers/Approval.ts","../src/server/apps/providers/Choice.ts","../src/server/apps/providers/FileUpload.ts","../src/server/apps/providers/FormInput.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server'\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n McpError,\n ErrorCode,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\nimport type { OAuthServerProvider } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { randomUUID } from 'node:crypto'\nimport type { Readable, Writable } from 'node:stream'\nimport type { Server as HttpServer, IncomingMessage } from 'node:http'\nimport type { AddressInfo } from 'node:net'\nimport { AuthorizationError } from './auth/types'\nimport type { TokenVerifier, AccessToken } from './auth/types'\nimport type { AuthCheck } from './auth/authorization'\nimport { contextStore, createContext, SESSION_CLOSE_CALLBACKS_KEY } from './context'\nimport type { McpContext } from './context'\nimport { runMiddlewareChain } from './middleware'\nimport type { Middleware } from './middleware'\nimport { applyTransformChain } from './transform'\nimport type { Transform, ToolView, ResourceView, PromptView, SynthesizedTool } from './transform'\nimport { convertResult, toJsonSchema, validateInput, ToolResult } from './tool'\nimport {\n convertResourceResult,\n isUriTemplate,\n matchTemplate,\n ResourceResult,\n} from './resource'\nimport type { ResourceConfig } from './resource'\nimport { UI_EXTENSION_KEY } from './apps/types'\nimport type { UiToolMeta } from './apps/types'\nimport { convertPromptResult, PromptResult } from './prompt'\nimport type { PromptConfig } from './prompt'\n\nfunction prefixResourceUri(uri: string, prefix: string): string {\n const idx = uri.indexOf('://')\n if (idx === -1) return `${prefix}/${uri}`\n return `${uri.slice(0, idx + 3)}${prefix}/${uri.slice(idx + 3)}`\n}\n\nexport interface OAuthConfig {\n /** OAuth server provider implementing the authorization and token flow. */\n provider: OAuthServerProvider\n /**\n * Issuer URL for the OAuth server (used in metadata endpoints).\n * Defaults to the HTTP server's bound address when not specified.\n */\n issuerUrl?: URL\n /** Scopes supported by this server, advertised in OAuth metadata. */\n scopes?: string[]\n}\n\nexport interface FastMCPOptions {\n name: string\n version?: string\n /** Simple bearer-token verifier for non-OAuth auth scenarios. */\n auth?: TokenVerifier\n /** Full OAuth 2.1 server with Dynamic Client Registration support. */\n oauth?: OAuthConfig\n /** Maximum number of tools returned per listTools page. Default: 50. */\n toolsPageSize?: number\n /** Maximum number of resources (or templates) returned per page. Default: 50. */\n resourcesPageSize?: number\n /** Maximum number of prompts returned per prompts/list page. Default: 50. */\n promptsPageSize?: number\n /** Middleware applied to every request in registration order. */\n middleware?: Middleware[]\n /** Transforms applied to component list responses in registration order. */\n transforms?: Transform[]\n}\n\nexport interface RunOptions {\n transport?: 'stdio' | 'http'\n port?: number\n host?: string\n path?: string\n /** Custom stdin stream for the stdio transport. Defaults to process.stdin. */\n stdin?: Readable\n /** Custom stdout stream for the stdio transport. Defaults to process.stdout. */\n stdout?: Writable\n}\n\nexport interface ServerAddress {\n host: string\n port: number\n path: string\n}\n\nexport interface ToolConfig {\n name: string\n /** Human-readable display name shown in UIs. Takes precedence over `name` for display purposes. */\n title?: string\n description: string\n /** Standard Schema validator for the tool's input arguments. Used for runtime validation. */\n input?: StandardSchemaV1\n /**\n * Explicit JSON Schema advertised to clients as `inputSchema`. Overrides auto-generation from\n * `input`. Use when you need JSON Schema features beyond what your validator auto-generates\n * (e.g. `examples`, `$comment`, per-property descriptions, or custom annotations).\n */\n inputSchema?: Record<string, unknown>\n /** Standard Schema validator for the tool's return value. Validated before result conversion. */\n output?: StandardSchemaV1\n /**\n * Explicit JSON Schema advertised to clients as `outputSchema`. Overrides auto-generation from\n * `output`. Use when you need JSON Schema features beyond what your validator auto-generates.\n */\n outputSchema?: Record<string, unknown>\n /** Execution timeout in milliseconds. No timeout by default. */\n timeout?: number\n /** When true the tool is hidden from listTools and cannot be invoked via tools/call. */\n disabled?: boolean\n /** Arbitrary tags for server-side filtering. */\n tags?: string[]\n auth?: AuthCheck\n /** Apps extension — links this tool to a UI resource and controls visibility. */\n ui?: UiToolMeta\n}\n\ninterface RegisteredTool {\n config: ToolConfig\n handler: (args: unknown) => unknown\n}\n\ninterface RegisteredResource {\n config: ResourceConfig\n handler: (params?: Record<string, string>) => unknown\n}\n\ninterface ResolvedPromptConfig extends Required<Pick<PromptConfig, 'name' | 'description'>> {\n title?: string\n arguments?: PromptConfig['arguments']\n disabled?: boolean\n timeout?: number\n tags?: string[]\n auth?: PromptConfig['auth']\n}\n\ninterface RegisteredPrompt {\n config: ResolvedPromptConfig\n handler: (args?: Record<string, string>) => unknown\n}\n\ninterface Session {\n transport: StreamableHTTPServerTransport\n server: Server\n state: Map<string, unknown>\n}\n\n/** Converts a camelCase or PascalCase name to space-separated words. e.g. `getWeather` → `\"get weather\"` */\nfunction inferDescription(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/[-_]+/g, ' ')\n .trim()\n .toLowerCase()\n}\n\nfunction toAccessToken(authInfo: AuthInfo | undefined): AccessToken | undefined {\n if (!authInfo) return undefined\n return {\n token: authInfo.token,\n clientId: authInfo.clientId || undefined,\n scopes: authInfo.scopes,\n expiresAt: authInfo.expiresAt,\n claims: authInfo.extra ?? {},\n }\n}\n\n// Cached result of verifying FASTMCP_CLI_AUTH_TOKEN once per process.\n// undefined = not yet resolved; null = env var absent or verification failed.\nlet _cliEnvToken: AccessToken | null | undefined\n\nasync function resolveCliEnvToken(verifier: TokenVerifier | undefined): Promise<AccessToken | undefined> {\n if (!verifier) return undefined\n if (_cliEnvToken !== undefined) return _cliEnvToken ?? undefined\n const raw = process.env['FASTMCP_CLI_AUTH_TOKEN']\n if (!raw) { _cliEnvToken = null; return undefined }\n try {\n _cliEnvToken = await verifier.verify(raw)\n return _cliEnvToken\n } catch {\n _cliEnvToken = null\n return undefined\n }\n}\n\nasync function runAuthCheck(check: AuthCheck, token: AccessToken | undefined): Promise<void> {\n if (!token) throw new McpError(ErrorCode.InvalidRequest, 'Authentication required')\n try {\n await check(token)\n } catch (err) {\n if (err instanceof AuthorizationError) {\n throw new McpError(ErrorCode.InvalidRequest, err.message)\n }\n throw err\n }\n}\n\nexport class FastMCP {\n readonly name: string\n readonly version: string\n\n private _auth: TokenVerifier | undefined\n private _oauth: OAuthConfig | undefined\n private _toolsPageSize: number\n private _resourcesPageSize: number\n private _tools = new Map<string, RegisteredTool>()\n private _staticResources = new Map<string, RegisteredResource>()\n private _templateResources = new Map<string, RegisteredResource>()\n private _prompts = new Map<string, RegisteredPrompt>()\n private _promptsPageSize: number\n private _middleware: Middleware[]\n private _transforms: Transform[]\n private _primaryState = new Map<string, unknown>()\n private _httpServer: HttpServer | null = null\n private _address: ServerAddress | null = null\n private _sessions = new Map<string, Session>()\n // Primary server used by connect() and stdio\n private _primaryServer: Server\n\n private _toolRegisteredCallbacks: Array<(tool: RegisteredTool) => void> = []\n private _resourceRegisteredCallbacks: Array<(resource: RegisteredResource) => void> = []\n private _promptRegisteredCallbacks: Array<(prompt: RegisteredPrompt) => void> = []\n private _proxyCloseCallbacks: Array<() => Promise<void>> = []\n private _mountedChildren = new Set<FastMCP>()\n\n constructor(options: FastMCPOptions) {\n this.name = options.name\n this.version = options.version ?? '0.0.1'\n this._auth = options.auth\n this._oauth = options.oauth\n this._toolsPageSize = options.toolsPageSize ?? 50\n this._resourcesPageSize = options.resourcesPageSize ?? 50\n this._promptsPageSize = options.promptsPageSize ?? 50\n this._middleware = options.middleware ? [...options.middleware] : []\n this._transforms = options.transforms ? [...options.transforms] : []\n this._primaryServer = this._makeServer()\n }\n\n private _hasUiComponents(): boolean {\n for (const t of this._tools.values()) {\n if (t.config.ui) return true\n }\n for (const r of this._staticResources.values()) {\n if (r.config.ui || r.config.uri.startsWith('ui://')) return true\n }\n for (const r of this._templateResources.values()) {\n if (r.config.uri.startsWith('ui://')) return true\n }\n return false\n }\n\n /** Create a new Server instance with all request handlers wired up. */\n private _makeServer(sessionState?: Map<string, unknown>): Server {\n const state = sessionState ?? this._primaryState\n const extensions = this._hasUiComponents() ? { [UI_EXTENSION_KEY]: {} } : undefined\n const server = new Server(\n { name: this.name, version: this.version },\n { capabilities: { tools: { listChanged: true }, resources: { listChanged: true }, prompts: { listChanged: true }, logging: {}, ...(extensions ? { extensions } : {}) } },\n )\n for (const mw of this._middleware) mw.setup?.(server)\n this._setupHandlers(server, state)\n return server\n }\n\n private async _resolveToken(authInfo: AuthInfo | undefined): Promise<AccessToken | undefined> {\n return toAccessToken(authInfo) ?? await resolveCliEnvToken(this._auth)\n }\n\n private _setupHandlers(server: Server, sessionState: Map<string, unknown>): void {\n server.setRequestHandler(ListToolsRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/list', req.params, ctx, async () => {\n const clientIsUiCapable = !!(server.getClientCapabilities()?.extensions as Record<string, unknown> | undefined)?.[UI_EXTENSION_KEY]\n\n const allVisible = (\n await Promise.all(\n [...this._tools.values()].map(async (t) => {\n if (t.config.disabled) return null\n // App-only tools are hidden from listTools (visible only inside the iframe)\n if (t.config.ui?.visibility && !t.config.ui.visibility.includes('model')) return null\n if (!t.config.auth) return t\n if (!token) return null\n try { await t.config.auth(token); return t } catch { return null }\n }),\n )\n ).filter((t): t is RegisteredTool => t !== null)\n\n const transformedTools = this._applyTransformsToTools(allVisible)\n const { resourceViews, promptViews } = await this._getVisibleViews(token)\n const synthesized = this._buildSynthesizedTools(resourceViews, promptViews)\n\n type ListEntry =\n | { kind: 'registered'; name: string; title: string | undefined; description: string; config: ToolConfig }\n | { kind: 'synthesized'; name: string; title: string | undefined; description: string; inputSchema: Record<string, unknown> | undefined }\n\n const allEntries: ListEntry[] = [\n ...transformedTools.map(\n (t): ListEntry => ({ kind: 'registered', name: t.name, title: t.title, description: t.description, config: t.config }),\n ),\n ...synthesized.map(\n (s): ListEntry => ({ kind: 'synthesized', name: s.name, title: s.title, description: s.description, inputSchema: s.inputSchema }),\n ),\n ]\n\n const pageSize = this._toolsPageSize\n const cursorName = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorName !== null) {\n const idx = allEntries.findIndex((e) => e.name === cursorName)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = allEntries.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < allEntries.length\n ? Buffer.from(page[page.length - 1].name).toString('base64url')\n : undefined\n\n const tools = await Promise.all(\n page.map(async (entry) => {\n if (entry.kind === 'synthesized') {\n return {\n name: entry.name,\n ...(entry.title !== undefined ? { title: entry.title } : {}),\n description: entry.description,\n inputSchema: entry.inputSchema ?? { type: 'object' as const },\n }\n }\n const t = entry.config\n const inputSchema =\n t.inputSchema ??\n (t.input\n ? await toJsonSchema(t.input, `tool \"${t.name}\" input`)\n : { type: 'object' as const })\n const outputSchema =\n t.outputSchema ??\n (t.output\n ? await toJsonSchema(t.output, `tool \"${t.name}\" output`)\n : undefined)\n const uiMeta = clientIsUiCapable && t.ui\n ? {\n resourceUri: t.ui.resourceUri ?? `ui://${t.name}`,\n ...(t.ui.visibility ? { visibility: t.ui.visibility } : {}),\n }\n : undefined\n return {\n name: entry.name,\n ...(entry.title !== undefined ? { title: entry.title } : {}),\n description: entry.description,\n inputSchema,\n ...(outputSchema ? { outputSchema } : {}),\n ...(uiMeta ? { _meta: { ui: uiMeta } } : {}),\n }\n }),\n )\n\n return { tools, ...(nextCursor ? { nextCursor } : {}) }\n }),\n )\n })\n\n server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {\n const requestedName = req.params.name\n const token = await this._resolveToken(extra.authInfo)\n\n // Check synthesized tools first\n const { resourceViews, promptViews } = await this._getVisibleViews(token)\n const synthesizedList = this._buildSynthesizedTools(resourceViews, promptViews)\n const synthTool = synthesizedList.find((s) => s.name === requestedName)\n if (synthTool) {\n if (synthTool.auth) await runAuthCheck(synthTool.auth, token)\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n try {\n return await contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/call', req.params, ctx, async () => {\n let executePromise: Promise<unknown> = Promise.resolve(\n synthTool.handler(req.params.arguments ?? {}),\n )\n if (synthTool.timeout) {\n const ms = synthTool.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Tool \"${requestedName}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n return convertResult(await executePromise)\n }),\n )\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n }\n\n // Find by transformed name, then fall back to direct registry (for hidden/unaffected tools)\n let tool: RegisteredTool | undefined\n if (this._transforms.length > 0) {\n for (const t of this._tools.values()) {\n const view = applyTransformChain<ToolView>(\n { name: t.config.name, description: t.config.description, tags: t.config.tags ?? [] },\n this._transforms,\n (tr, v) => tr.transformTool?.(v),\n )\n if (view && view.name === requestedName) { tool = t; break }\n }\n }\n if (!tool) tool = this._tools.get(requestedName)\n\n if (!tool || tool.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown tool: \"${requestedName}\"`)\n }\n\n if (tool.config.auth) await runAuthCheck(tool.config.auth, token)\n\n const resolvedTool = tool\n const rawArgs: unknown = req.params.arguments ?? {}\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n\n try {\n return await contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/call', req.params, ctx, async () => {\n const args = resolvedTool.config.input ? await validateInput(resolvedTool.config.input, rawArgs, true) : rawArgs\n\n let executePromise: Promise<unknown> = Promise.resolve(resolvedTool.handler(args))\n\n if (resolvedTool.config.timeout) {\n const ms = resolvedTool.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Tool \"${requestedName}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n\n let resultValue = await executePromise\n if (resolvedTool.config.output) resultValue = await validateInput(resolvedTool.config.output, resultValue)\n const callResult = convertResult(resultValue)\n // Graceful degradation: strip structuredContent for non-UI clients calling UI tools\n if (resolvedTool.config.ui) {\n const clientIsUi = !!(server.getClientCapabilities()?.extensions as Record<string, unknown> | undefined)?.[UI_EXTENSION_KEY]\n if (!clientIsUi && callResult.structuredContent !== undefined) {\n return { content: [{ type: 'text' as const, text: '[UI not available in this client]' }] }\n }\n }\n return callResult\n }),\n )\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n })\n\n server.setRequestHandler(ListResourcesRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/list', req.params, ctx, async () => {\n const allVisible = (\n await Promise.all(\n [...this._staticResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const transformedResources = this._applyTransformsToResources(allVisible)\n\n const pageSize = this._resourcesPageSize\n const cursorUri = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorUri !== null) {\n const idx = transformedResources.findIndex((r) => r.uri === cursorUri)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = transformedResources.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < transformedResources.length\n ? Buffer.from(page[page.length - 1].uri).toString('base64url')\n : undefined\n\n const clientIsUiCapableRes = !!(server.getClientCapabilities()?.extensions as Record<string, unknown> | undefined)?.[UI_EXTENSION_KEY]\n return {\n resources: page.map((r) => ({\n uri: r.uri,\n name: r.name,\n ...(r.config.title !== undefined ? { title: r.config.title } : {}),\n ...(r.config.description !== undefined ? { description: r.config.description } : {}),\n ...(r.config.mimeType !== undefined ? { mimeType: r.config.mimeType } : {}),\n ...(r.config.size !== undefined ? { size: r.config.size } : {}),\n ...(r.config.annotations !== undefined ? { annotations: r.config.annotations } : {}),\n ...(clientIsUiCapableRes && r.config.ui ? { _meta: { ui: r.config.ui } } : {}),\n })),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }),\n )\n })\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/templates/list', req.params, ctx, async () => {\n const allVisible = (\n await Promise.all(\n [...this._templateResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const transformedTemplates = this._applyTransformsToResourceTemplates(allVisible)\n\n const pageSize = this._resourcesPageSize\n const cursorUri = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorUri !== null) {\n const idx = transformedTemplates.findIndex((r) => r.uri === cursorUri)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = transformedTemplates.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < transformedTemplates.length\n ? Buffer.from(page[page.length - 1].uri).toString('base64url')\n : undefined\n\n return {\n resourceTemplates: page.map((r) => ({\n uriTemplate: r.uri,\n name: r.name,\n ...(r.config.title !== undefined ? { title: r.config.title } : {}),\n ...(r.config.description !== undefined ? { description: r.config.description } : {}),\n ...(r.config.mimeType !== undefined ? { mimeType: r.config.mimeType } : {}),\n ...(r.config.annotations !== undefined ? { annotations: r.config.annotations } : {}),\n })),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }),\n )\n })\n\n server.setRequestHandler(ReadResourceRequestSchema, async (req, extra) => {\n const requestedUri = req.params.uri\n const token = await this._resolveToken(extra.authInfo)\n\n let resource: RegisteredResource | undefined = this._staticResources.get(requestedUri)\n let templateParams: Record<string, string> | undefined\n\n // Direct template matching (original URIs — also handles hidden-but-callable resources)\n if (!resource) {\n for (const r of this._templateResources.values()) {\n if (r.config.disabled) continue\n const params = matchTemplate(r.config.uri, requestedUri)\n if (params !== null) { resource = r; templateParams = params; break }\n }\n }\n\n // Transformed static lookup\n if (!resource && this._transforms.length > 0) {\n for (const r of this._staticResources.values()) {\n if (r.config.disabled) continue\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: r.config.name ?? r.config.uri, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResource?.(v),\n )\n if (view && view.uri === requestedUri) { resource = r; break }\n }\n }\n\n // Transformed template matching\n if (!resource && this._transforms.length > 0) {\n for (const r of this._templateResources.values()) {\n if (r.config.disabled) continue\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: r.config.name ?? r.config.uri, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResourceTemplate?.(v),\n )\n if (view) {\n const params = matchTemplate(view.uri, requestedUri)\n if (params !== null) { resource = r; templateParams = params; break }\n }\n }\n }\n\n if (!resource || resource.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown resource: \"${requestedUri}\"`)\n }\n\n if (resource.config.auth) await runAuthCheck(resource.config.auth, token)\n\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/read', req.params, ctx, async () => {\n let executePromise: Promise<unknown> = Promise.resolve(resource!.handler(templateParams))\n\n if (resource!.config.timeout) {\n const ms = resource!.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Resource \"${requestedUri}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n ) as Promise<unknown>\n }\n\n const result = await executePromise\n return convertResourceResult(result, requestedUri, resource!.config.mimeType)\n }),\n )\n })\n\n server.setRequestHandler(ListPromptsRequestSchema, async (req, extra) => {\n const token = await this._resolveToken(extra.authInfo)\n const ctx = createContext(server, extra.requestId !== undefined ? String(extra.requestId) : undefined, undefined, token, sessionState)\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'prompts/list', req.params, ctx, async () => {\n const allVisible = (\n await Promise.all(\n [...this._prompts.values()].map(async (p) => {\n if (p.config.disabled) return null\n if (!p.config.auth) return p\n if (!token) return null\n try { await p.config.auth(token); return p } catch { return null }\n }),\n )\n ).filter((p): p is RegisteredPrompt => p !== null)\n\n const transformedPrompts = this._applyTransformsToPrompts(allVisible)\n\n const pageSize = this._promptsPageSize\n const cursorName = req.params?.cursor\n ? Buffer.from(req.params.cursor, 'base64url').toString()\n : null\n let startIdx = 0\n if (cursorName !== null) {\n const idx = transformedPrompts.findIndex((p) => p.name === cursorName)\n if (idx < 0) throw new McpError(ErrorCode.InvalidParams, 'Invalid or expired cursor')\n startIdx = idx + 1\n }\n const page = transformedPrompts.slice(startIdx, startIdx + pageSize)\n const nextCursor =\n startIdx + pageSize < transformedPrompts.length\n ? Buffer.from(page[page.length - 1].name).toString('base64url')\n : undefined\n\n return {\n prompts: page.map((p) => ({\n name: p.name,\n ...(p.config.title !== undefined ? { title: p.config.title } : {}),\n description: p.description,\n ...(p.config.arguments?.length ? { arguments: p.config.arguments } : {}),\n })),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }),\n )\n })\n\n server.setRequestHandler(GetPromptRequestSchema, async (req, extra) => {\n const requestedName = req.params.name\n let prompt: RegisteredPrompt | undefined\n if (this._transforms.length > 0) {\n for (const p of this._prompts.values()) {\n const view = applyTransformChain<PromptView>(\n { name: p.config.name, description: p.config.description, tags: p.config.tags ?? [] },\n this._transforms,\n (t, v) => t.transformPrompt?.(v),\n )\n if (view && view.name === requestedName) { prompt = p; break }\n }\n }\n if (!prompt) prompt = this._prompts.get(requestedName)\n\n if (!prompt || prompt.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown prompt: \"${requestedName}\"`)\n }\n\n const resolvedPrompt = prompt\n const token = await this._resolveToken(extra.authInfo)\n if (resolvedPrompt.config.auth) await runAuthCheck(resolvedPrompt.config.auth, token)\n\n const suppliedArgs = req.params.arguments ?? {}\n for (const arg of resolvedPrompt.config.arguments ?? []) {\n if (arg.required && !(arg.name in suppliedArgs)) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Missing required argument \"${arg.name}\" for prompt \"${requestedName}\"`,\n )\n }\n }\n\n const ctx = createContext(\n server,\n extra.requestId !== undefined ? String(extra.requestId) : undefined,\n extra._meta?.progressToken,\n token,\n sessionState,\n )\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'prompts/get', req.params, ctx, async () => {\n let executePromise = Promise.resolve(resolvedPrompt.handler(suppliedArgs))\n if (resolvedPrompt.config.timeout) {\n const ms = resolvedPrompt.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Prompt \"${requestedName}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n return convertPromptResult(await executePromise)\n }),\n )\n })\n }\n\n private _notifyToolListChanged(): void {\n this._primaryServer.sendToolListChanged().catch(() => {})\n for (const { server } of this._sessions.values()) {\n server.sendToolListChanged().catch(() => {})\n }\n }\n\n private _notifyResourceListChanged(): void {\n this._primaryServer.sendResourceListChanged().catch(() => {})\n for (const { server } of this._sessions.values()) {\n server.sendResourceListChanged().catch(() => {})\n }\n }\n\n private _notifyPromptListChanged(): void {\n this._primaryServer.sendPromptListChanged().catch(() => {})\n for (const { server } of this._sessions.values()) {\n server.sendPromptListChanged().catch(() => {})\n }\n }\n\n // Overload: typed handler inferred from input schema\n tool<S extends StandardSchemaV1>(\n config: Omit<ToolConfig, 'input'> & { input: S },\n handler: (args: StandardSchemaV1.InferOutput<S>) => unknown,\n ): void\n // Overload: untyped handler\n tool(config: ToolConfig, handler: (args: Record<string, unknown>) => unknown): void\n // Implementation (handler typed as any to satisfy both overload signatures)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool(config: ToolConfig, handler: (args: any) => any): void {\n const registered: RegisteredTool = { config, handler }\n this._tools.set(config.name, registered)\n this._notifyToolListChanged()\n for (const cb of this._toolRegisteredCallbacks) cb(registered)\n }\n\n prompt(config: PromptConfig, handler: (args?: Record<string, string>) => unknown): void {\n const name = config.name ?? (handler as { name?: string }).name\n if (!name) throw new Error('Prompt name must be provided in config or inferrable from the handler function name')\n const description = config.description ?? inferDescription(name)\n const resolvedConfig: ResolvedPromptConfig = { ...config, name, description }\n const registered: RegisteredPrompt = { config: resolvedConfig, handler }\n this._prompts.set(name, registered)\n this._notifyPromptListChanged()\n for (const cb of this._promptRegisteredCallbacks) cb(registered)\n }\n\n resource(config: ResourceConfig, handler: (params?: Record<string, string>) => unknown): void {\n const registered: RegisteredResource = { config, handler }\n if (isUriTemplate(config.uri)) {\n this._templateResources.set(config.uri, registered)\n } else {\n this._staticResources.set(config.uri, registered)\n }\n this._notifyResourceListChanged()\n for (const cb of this._resourceRegisteredCallbacks) cb(registered)\n }\n\n _removeTool(name: string): boolean {\n if (!this._tools.has(name)) return false\n this._tools.delete(name)\n this._notifyToolListChanged()\n return true\n }\n\n _removeResource(uri: string): boolean {\n if (this._staticResources.has(uri)) {\n this._staticResources.delete(uri)\n this._notifyResourceListChanged()\n return true\n }\n if (this._templateResources.has(uri)) {\n this._templateResources.delete(uri)\n this._notifyResourceListChanged()\n return true\n }\n return false\n }\n\n _removePrompt(name: string): boolean {\n if (!this._prompts.has(name)) return false\n this._prompts.delete(name)\n this._notifyPromptListChanged()\n return true\n }\n\n /** Add a transform to the pipeline. Applied to list responses in registration order. */\n transform(t: Transform): this {\n this._transforms.push(t)\n return this\n }\n\n /**\n * Dispatch a tool call through this server's middleware chain using an inherited context.\n * Used by parent servers to honour child-level middleware when routing mounted tool calls.\n */\n async _dispatchTool(\n name: string,\n rawArgs: unknown,\n ctx: McpContext,\n ) {\n const tool = this._tools.get(name)\n if (!tool || tool.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown tool: \"${name}\"`)\n }\n if (tool.config.auth) await runAuthCheck(tool.config.auth, ctx.auth)\n\n try {\n return await contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'tools/call', { name, arguments: rawArgs }, ctx, async () => {\n const args = tool.config.input\n ? await validateInput(tool.config.input, rawArgs, true)\n : rawArgs\n\n let executePromise: Promise<unknown> = Promise.resolve(tool.handler(args))\n if (tool.config.timeout) {\n const ms = tool.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Tool \"${name}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n\n let resultValue = await executePromise\n if (tool.config.output) resultValue = await validateInput(tool.config.output, resultValue)\n return convertResult(resultValue)\n }),\n )\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n }\n\n /**\n * Run a resource read through this server's middleware chain using an inherited context.\n * Returns the raw handler result so the parent can apply convertResourceResult with the\n * actual requested URI (important for template resources).\n */\n async _dispatchResource(\n uri: string,\n params: Record<string, string> | undefined,\n ctx: McpContext,\n ): Promise<unknown> {\n const resource = isUriTemplate(uri)\n ? this._templateResources.get(uri)\n : this._staticResources.get(uri)\n\n if (!resource || resource.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown resource: \"${uri}\"`)\n }\n if (resource.config.auth) await runAuthCheck(resource.config.auth, ctx.auth)\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'resources/read', { uri }, ctx, async () => {\n let executePromise: Promise<unknown> = Promise.resolve(resource.handler(params))\n if (resource.config.timeout) {\n const ms = resource.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Resource \"${uri}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n ) as Promise<unknown>\n }\n return await executePromise\n }),\n )\n }\n\n /**\n * Dispatch a prompt render through this server's middleware chain using an inherited context.\n */\n async _dispatchPrompt(\n name: string,\n args: Record<string, string>,\n ctx: McpContext,\n ) {\n const prompt = this._prompts.get(name)\n if (!prompt || prompt.config.disabled) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown prompt: \"${name}\"`)\n }\n if (prompt.config.auth) await runAuthCheck(prompt.config.auth, ctx.auth)\n\n for (const arg of prompt.config.arguments ?? []) {\n if (arg.required && !(arg.name in args)) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Missing required argument \"${arg.name}\" for prompt \"${name}\"`,\n )\n }\n }\n\n return contextStore.run(ctx, () =>\n runMiddlewareChain(this._middleware, 'prompts/get', { name, arguments: args }, ctx, async () => {\n let executePromise = Promise.resolve(prompt.handler(args))\n if (prompt.config.timeout) {\n const ms = prompt.config.timeout\n let timer!: ReturnType<typeof setTimeout>\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Prompt \"${name}\" timed out after ${ms}ms`)),\n ms,\n )\n })\n executePromise = Promise.race([executePromise, timeoutPromise]).finally(() =>\n clearTimeout(timer),\n )\n }\n return convertPromptResult(await executePromise)\n }),\n )\n }\n\n private _mirrorTool(child: FastMCP, tool: RegisteredTool, prefix?: string): void {\n const originalName = tool.config.name\n const key = prefix ? `${prefix}_${originalName}` : originalName\n if (this._tools.has(key)) throw new Error(`Tool name collision on mount: \"${key}\" is already registered`)\n // Strip runtime validators — child's _dispatchTool runs them.\n // inputSchema/outputSchema are kept so clients see the correct JSON Schema.\n const forwardedConfig: ToolConfig = { ...tool.config, name: key, input: undefined, output: undefined }\n this.tool(forwardedConfig, (args: unknown) => {\n const parentCtx = contextStore.getStore()!\n // Inject prefix-aware tool name resolver so toolRef() inside the child resolves correctly.\n const childCtx: typeof parentCtx = prefix\n ? { ...parentCtx, resolveToolName: (name) => `${prefix}_${name}` }\n : parentCtx\n return child._dispatchTool(originalName, args, childCtx).then((result) => new ToolResult(result))\n })\n }\n\n private _mirrorResource(child: FastMCP, resource: RegisteredResource, prefix?: string): void {\n const name = resource.config.name ?? resource.config.uri\n const originalUri = resource.config.uri\n const targetUri = prefix ? prefixResourceUri(originalUri, prefix) : originalUri\n if (this._staticResources.has(targetUri) || this._templateResources.has(targetUri)) {\n throw new Error(`Resource URI collision on mount: \"${targetUri}\" is already registered`)\n }\n const forwardedConfig: ResourceConfig = {\n ...resource.config,\n uri: targetUri,\n name: prefix ? `${prefix}_${name}` : name,\n }\n // Return the raw handler result so the parent's ReadResource handler can call\n // convertResourceResult with the actual requested URI (correct for template expansions).\n this.resource(forwardedConfig, (params?: Record<string, string>) => {\n const ctx = contextStore.getStore()!\n return child._dispatchResource(originalUri, params, ctx)\n })\n }\n\n private _mirrorPrompt(child: FastMCP, prompt: RegisteredPrompt, prefix?: string): void {\n const originalName = prompt.config.name\n const key = prefix ? `${prefix}_${originalName}` : originalName\n if (this._prompts.has(key)) throw new Error(`Prompt name collision on mount: \"${key}\" is already registered`)\n const forwardedConfig: PromptConfig = { ...(prompt.config as PromptConfig), name: key }\n this.prompt(forwardedConfig, (args?: Record<string, string>) => {\n const ctx = contextStore.getStore()!\n return child\n ._dispatchPrompt(originalName, args ?? {}, ctx)\n .then((result) => new PromptResult(result.messages, result.description))\n })\n }\n\n /** Mount a child server onto this server. All tools, resources, and prompts from the child become accessible via this server. Pass a prefix to namespace names and prevent collisions. */\n mount(child: FastMCP, prefix?: string): this {\n if (child === this) throw new Error('Cannot mount a server onto itself')\n if (this._mountedChildren.has(child)) return this\n this._mountedChildren.add(child)\n\n for (const tool of child._tools.values()) this._mirrorTool(child, tool, prefix)\n for (const resource of child._staticResources.values()) this._mirrorResource(child, resource, prefix)\n for (const resource of child._templateResources.values()) this._mirrorResource(child, resource, prefix)\n for (const prompt of child._prompts.values()) this._mirrorPrompt(child, prompt, prefix)\n\n child._toolRegisteredCallbacks.push((tool) => this._mirrorTool(child, tool, prefix))\n child._resourceRegisteredCallbacks.push((resource) => this._mirrorResource(child, resource, prefix))\n child._promptRegisteredCallbacks.push((prompt) => this._mirrorPrompt(child, prompt, prefix))\n\n // When this server closes, drain the child's owned proxy connections\n this._proxyCloseCallbacks.push(async () => {\n await Promise.all(child._proxyCloseCallbacks.map((cb) => cb().catch(() => {})))\n child._proxyCloseCallbacks.length = 0\n })\n\n return this\n }\n\n /** Register a callback invoked when this server is closed — used by proxy connections. */\n _addCloseCallback(cb: () => Promise<void>): void {\n this._proxyCloseCallbacks.push(cb)\n }\n\n /**\n * Register a provider (FastMCPApp or FastMCP) on this server.\n * All tools, resources, and prompts from the provider are mounted without a prefix.\n * For FastMCPApp, pass provider.server; for FastMCP, pass directly.\n */\n addProvider(provider: FastMCP | { server: FastMCP }): this {\n const child = 'server' in provider ? provider.server : provider\n return this.mount(child)\n }\n\n private _applyTransformsToTools(\n tools: RegisteredTool[],\n ): Array<{ name: string; title: string | undefined; description: string; originalName: string; config: ToolConfig; handler: (args: unknown) => unknown }> {\n return tools.flatMap((tool) => {\n const view = applyTransformChain<ToolView>(\n { name: tool.config.name, title: tool.config.title, description: tool.config.description, tags: tool.config.tags ?? [] },\n this._transforms,\n (t, v) => t.transformTool?.(v),\n )\n return view\n ? [{ name: view.name, title: view.title, description: view.description, originalName: tool.config.name, config: tool.config, handler: tool.handler }]\n : []\n })\n }\n\n private _applyTransformsToResources(\n resources: RegisteredResource[],\n ): Array<{ uri: string; name: string; originalUri: string; config: ResourceConfig; handler: (params?: Record<string, string>) => unknown }> {\n return resources.flatMap((r) => {\n const resolvedName = r.config.name ?? r.config.uri\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: resolvedName, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResource?.(v),\n )\n return view\n ? [{ uri: view.uri, name: view.name, originalUri: r.config.uri, config: r.config, handler: r.handler }]\n : []\n })\n }\n\n private _applyTransformsToResourceTemplates(\n templates: RegisteredResource[],\n ): Array<{ uri: string; name: string; originalUri: string; config: ResourceConfig; handler: (params?: Record<string, string>) => unknown }> {\n return templates.flatMap((r) => {\n const resolvedName = r.config.name ?? r.config.uri\n const view = applyTransformChain<ResourceView>(\n { uri: r.config.uri, name: resolvedName, tags: r.config.tags ?? [], mimeType: r.config.mimeType, title: r.config.title },\n this._transforms,\n (t, v) => t.transformResourceTemplate?.(v),\n )\n return view\n ? [{ uri: view.uri, name: view.name, originalUri: r.config.uri, config: r.config, handler: r.handler }]\n : []\n })\n }\n\n private _applyTransformsToPrompts(\n prompts: RegisteredPrompt[],\n ): Array<{ name: string; description: string; originalName: string; config: ResolvedPromptConfig; handler: (args?: Record<string, string>) => unknown }> {\n return prompts.flatMap((p) => {\n const view = applyTransformChain<PromptView>(\n { name: p.config.name, description: p.config.description, tags: p.config.tags ?? [] },\n this._transforms,\n (t, v) => t.transformPrompt?.(v),\n )\n return view\n ? [{ name: view.name, description: view.description, originalName: p.config.name, config: p.config, handler: p.handler }]\n : []\n })\n }\n\n private _buildSynthesizedTools(resourceViews: ResourceView[], promptViews: PromptView[]): SynthesizedTool[] {\n if (this._transforms.length === 0) return []\n const raw = this._transforms.flatMap((t) => t.synthesizeTools?.(resourceViews, promptViews) ?? [])\n return raw.flatMap((s) => {\n const view = applyTransformChain<ToolView>(\n { name: s.name, title: s.title, description: s.description, tags: [] },\n this._transforms,\n (t, v) => t.transformTool?.(v),\n )\n return view ? [{ ...s, name: view.name, title: view.title, description: view.description }] : []\n })\n }\n\n private async _getVisibleViews(\n token: AccessToken | undefined,\n ): Promise<{ resourceViews: ResourceView[]; promptViews: PromptView[] }> {\n const visibleStatic = (\n await Promise.all(\n [...this._staticResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const visibleTemplates = (\n await Promise.all(\n [...this._templateResources.values()].map(async (r) => {\n if (r.config.disabled) return null\n if (!r.config.auth) return r\n if (!token) return null\n try { await r.config.auth(token); return r } catch { return null }\n }),\n )\n ).filter((r): r is RegisteredResource => r !== null)\n\n const visiblePrompts = (\n await Promise.all(\n [...this._prompts.values()].map(async (p) => {\n if (p.config.disabled) return null\n if (!p.config.auth) return p\n if (!token) return null\n try { await p.config.auth(token); return p } catch { return null }\n }),\n )\n ).filter((p): p is RegisteredPrompt => p !== null)\n\n const resourceViews: ResourceView[] = [\n ...this._applyTransformsToResources(visibleStatic),\n ...this._applyTransformsToResourceTemplates(visibleTemplates),\n ].map((r) => ({\n uri: r.uri,\n name: r.name,\n tags: r.config.tags ?? [],\n mimeType: r.config.mimeType,\n title: r.config.title,\n }))\n\n const promptViews: PromptView[] = this._applyTransformsToPrompts(visiblePrompts).map((p) => ({\n name: p.name,\n description: p.description,\n tags: p.config.tags ?? [],\n }))\n\n return { resourceViews, promptViews }\n }\n\n /**\n * Add a middleware to the pipeline.\n *\n * Can be called at any point before the first request arrives. `setup()` is\n * called immediately on the primary server so that notification handlers and\n * other server-level side-effects are active before `connect()` / `run()` is\n * called. HTTP sessions created after `use()` will also have `setup()` called\n * via `_makeServer()`.\n */\n use(mw: Middleware): this {\n this._middleware.push(mw)\n mw.setup?.(this._primaryServer)\n return this\n }\n\n getContext(): McpContext {\n const ctx = contextStore.getStore()\n if (!ctx) throw new Error('getContext() called outside of a request handler')\n return ctx\n }\n\n /** The bound address after run() resolves for the http transport. Null for stdio or before run(). */\n get address(): ServerAddress | null {\n return this._address\n }\n\n async connect(transport: Transport): Promise<void> {\n // Rebuild so UI extension capability reflects all registered components.\n this._primaryServer = this._makeServer()\n await this._primaryServer.connect(transport)\n }\n\n async run(options?: RunOptions): Promise<void> {\n const rawTransport = process.env.MCP_TRANSPORT ?? options?.transport ?? 'stdio'\n if (rawTransport !== 'stdio' && rawTransport !== 'http') {\n throw new Error(`Unknown transport: \"${rawTransport}\". Supported: stdio, http.`)\n }\n const transport = rawTransport as 'stdio' | 'http'\n\n const port = options?.port ?? parseInt(process.env.MCP_PORT ?? process.env.PORT ?? '3000', 10)\n const host = options?.host ?? process.env.MCP_HOST ?? '0.0.0.0'\n const path = options?.path ?? process.env.MCP_PATH ?? '/mcp'\n\n if (transport === 'stdio') {\n const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio')\n await this.connect(new StdioServerTransport(options?.stdin, options?.stdout))\n } else if (this._oauth) {\n await this._runHttpOAuth(port, host, path)\n } else {\n await this._runHttpSimple(port, host, path)\n }\n }\n\n private async _runHttpOAuth(port: number, host: string, path: string): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp'\n )\n const express = (await import('express')).default\n const { mcpAuthRouter } = await import('@modelcontextprotocol/sdk/server/auth/router')\n const { requireBearerAuth } = await import(\n '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth'\n )\n\n const oauth = this._oauth!\n const app = express()\n\n // Bind first so we can infer the issuerUrl from the actual bound port (handles port=0)\n const httpServer = await new Promise<HttpServer>((resolve, reject) => {\n const srv = app.listen(port, host, () => resolve(srv))\n srv.on('error', reject)\n })\n\n const bound = httpServer.address() as AddressInfo\n const issuerUrl = oauth.issuerUrl ?? new URL(`http://${bound.address}:${bound.port}`)\n\n // OAuth endpoints (authorize, token, register, metadata)\n app.use(\n mcpAuthRouter({\n provider: oauth.provider,\n issuerUrl,\n scopesSupported: oauth.scopes,\n }),\n )\n\n // MCP endpoint — protected by bearer auth\n app.all(\n path,\n requireBearerAuth({ verifier: oauth.provider }),\n async (req, res, _next) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n let mcpTransport: StreamableHTTPServerTransport\n\n if (sessionId) {\n const existing = this._sessions.get(sessionId)\n if (!existing) {\n res.status(404).json({ error: 'Session not found' })\n return\n }\n mcpTransport = existing.transport\n } else {\n const sessionState = new Map<string, unknown>()\n const sessionServer = this._makeServer(sessionState)\n mcpTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n this._sessions.set(id, { transport: mcpTransport, server: sessionServer, state: sessionState })\n },\n onsessionclosed: (id) => {\n const session = this._sessions.get(id)\n if (session) {\n const callbacks = (session.state.get(SESSION_CLOSE_CALLBACKS_KEY) as Array<() => void> | undefined) ?? []\n for (const cb of callbacks) cb()\n }\n this._sessions.delete(id)\n },\n })\n await sessionServer.connect(mcpTransport)\n }\n\n await mcpTransport.handleRequest(req, res)\n },\n )\n\n this._httpServer = httpServer\n this._address = { host: bound.address, port: bound.port, path }\n }\n\n private async _runHttpSimple(port: number, host: string, path: string): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp'\n )\n const { createServer } = await import('node:http')\n\n const auth = this._auth\n\n const corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization, Mcp-Session-Id',\n }\n\n const httpServer = createServer(async (req, res) => {\n // CORS preflight\n if (req.method === 'OPTIONS') {\n res.writeHead(204, corsHeaders).end()\n return\n }\n\n if (req.url?.split('?')[0] !== path) {\n res.writeHead(404).end()\n return\n }\n\n // Attach CORS headers to all responses\n for (const [k, v] of Object.entries(corsHeaders)) res.setHeader(k, v)\n\n // Auth middleware\n if (auth) {\n const authHeader = req.headers.authorization\n const bearer = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null\n\n if (!bearer) {\n res\n .writeHead(401, { 'Content-Type': 'application/json', 'WWW-Authenticate': 'Bearer realm=\"mcp\"' })\n .end(JSON.stringify({ error: 'Missing bearer token' }))\n return\n }\n\n try {\n const accessToken = await auth.verify(bearer)\n ;(req as IncomingMessage & { auth: AuthInfo }).auth = {\n token: accessToken.token,\n clientId: accessToken.clientId ?? '',\n scopes: accessToken.scopes,\n expiresAt: accessToken.expiresAt,\n extra: accessToken.claims,\n }\n } catch (err) {\n if (err instanceof AuthorizationError) {\n res\n .writeHead(403, { 'Content-Type': 'application/json' })\n .end(JSON.stringify({ error: err.message }))\n } else {\n res\n .writeHead(401, { 'Content-Type': 'application/json', 'WWW-Authenticate': 'Bearer realm=\"mcp\"' })\n .end(JSON.stringify({ error: err instanceof Error ? err.message : 'Authentication failed' }))\n }\n return\n }\n }\n\n // Session routing: each client connection gets its own transport + server\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n let mcpTransport: StreamableHTTPServerTransport\n\n if (sessionId) {\n const existing = this._sessions.get(sessionId)\n if (!existing) {\n res\n .writeHead(404, { 'Content-Type': 'application/json' })\n .end(JSON.stringify({ error: 'Session not found' }))\n return\n }\n mcpTransport = existing.transport\n } else {\n const sessionState = new Map<string, unknown>()\n const sessionServer = this._makeServer(sessionState)\n mcpTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n this._sessions.set(id, { transport: mcpTransport, server: sessionServer, state: sessionState })\n },\n onsessionclosed: (id) => {\n const session = this._sessions.get(id)\n if (session) {\n const callbacks = (session.state.get(SESSION_CLOSE_CALLBACKS_KEY) as Array<() => void> | undefined) ?? []\n for (const cb of callbacks) cb()\n }\n this._sessions.delete(id)\n },\n })\n await sessionServer.connect(mcpTransport)\n }\n\n await mcpTransport.handleRequest(req, res)\n })\n\n this._httpServer = httpServer\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once('error', reject)\n httpServer.listen(port, host, resolve)\n })\n\n const bound = httpServer.address() as AddressInfo\n this._address = { host: bound.address, port: bound.port, path }\n }\n\n async close(): Promise<void> {\n await Promise.all(this._proxyCloseCallbacks.map((cb) => cb().catch(() => {})))\n this._proxyCloseCallbacks.length = 0\n\n await Promise.all(\n [...this._sessions.values()].map(({ transport }) => transport.close().catch(() => {})),\n )\n this._sessions.clear()\n\n if (this._httpServer) {\n await new Promise<void>((resolve, reject) => {\n this._httpServer!.close((err) => (err != null ? reject(err) : resolve()))\n })\n this._httpServer = null\n }\n this._address = null\n await this._primaryServer.close()\n }\n}\n","export interface AccessToken {\n /** The raw bearer token string. */\n token: string\n /** The subject/client identifier from the token. */\n clientId?: string\n /** Scopes granted to the token. */\n scopes: string[]\n /** Unix timestamp (seconds) when the token expires. */\n expiresAt?: number\n /** All claims from the token payload. */\n claims: Record<string, unknown>\n}\n\nexport interface TokenVerifier {\n verify(token: string): Promise<AccessToken>\n}\n\n/**\n * Thrown by authorization checks to produce a 403 response.\n * Any other error thrown during verification produces a 401.\n */\nexport class AuthorizationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'AuthorizationError'\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport type { Server } from '@modelcontextprotocol/sdk/server'\nimport type { AccessToken } from './auth/types'\n\n// ---------------------------------------------------------------------------\n// Supporting types\n// ---------------------------------------------------------------------------\n\nexport type LogLevel =\n | 'debug'\n | 'info'\n | 'notice'\n | 'warning'\n | 'error'\n | 'critical'\n | 'alert'\n | 'emergency'\n\nexport interface SamplingMessage {\n role: 'user' | 'assistant'\n content:\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n}\n\nexport interface SamplingParams {\n messages: SamplingMessage[]\n systemPrompt?: string\n /** Maximum tokens to generate. Defaults to 1024. */\n maxTokens?: number\n temperature?: number\n stopSequences?: string[]\n modelPreferences?: {\n hints?: Array<{ name?: string }>\n costPriority?: number\n speedPriority?: number\n intelligencePriority?: number\n }\n}\n\nexport interface SamplingResult {\n role: 'assistant'\n content:\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n model: string\n stopReason?: string\n}\n\n/**\n * Flat JSON Schema object describing fields to collect from the user.\n * Only primitive property types (string, number, boolean) are allowed per the MCP spec.\n */\nexport interface ElicitationSchema {\n type: 'object'\n properties: Record<\n string,\n { type: 'string' | 'number' | 'boolean'; title?: string; description?: string }\n >\n required?: string[]\n}\n\nexport interface ElicitationResult {\n /** How the user responded to the elicitation. */\n action: 'accept' | 'decline' | 'cancel'\n /** Submitted form values. Present only when action is 'accept'. */\n content?: Record<string, string | number | boolean>\n}\n\nexport interface Root {\n uri: string\n name?: string\n}\n\n// ---------------------------------------------------------------------------\n// McpContext — public interface returned by mcp.getContext()\n// ---------------------------------------------------------------------------\n\nexport interface McpContext {\n /** Auth token for the current request, if any. */\n auth: AccessToken | undefined\n /** The MCP request ID for the current call. */\n requestId: string | undefined\n\n // --- Logging ---\n\n /** Send a log message to the client at the specified RFC 5424 severity level. */\n log(level: LogLevel, message: string, loggerName?: string): Promise<void>\n debug(message: string, loggerName?: string): Promise<void>\n info(message: string, loggerName?: string): Promise<void>\n notice(message: string, loggerName?: string): Promise<void>\n warning(message: string, loggerName?: string): Promise<void>\n error(message: string, loggerName?: string): Promise<void>\n critical(message: string, loggerName?: string): Promise<void>\n alert(message: string, loggerName?: string): Promise<void>\n emergency(message: string, loggerName?: string): Promise<void>\n\n // --- Progress ---\n\n /**\n * Send a progress notification to the client.\n * No-op if the request did not include a `progressToken` in its `_meta`.\n */\n reportProgress(progress: number, total?: number, message?: string): Promise<void>\n\n // --- Sampling ---\n\n /**\n * Ask the client to perform an LLM inference call and return the result.\n * Throws if the client has not advertised the `sampling` capability.\n */\n sample(params: SamplingParams): Promise<SamplingResult>\n\n // --- Elicitation ---\n\n /**\n * Ask the client to collect input from the user via a form dialog.\n * Throws if the client has not advertised the `elicitation` capability.\n */\n elicit(message: string, schema: ElicitationSchema): Promise<ElicitationResult>\n\n // --- Roots ---\n\n /**\n * Request the list of filesystem roots the client has declared.\n * Throws if the client has not advertised the `roots` capability.\n */\n listRoots(): Promise<Root[]>\n\n // --- Session state ---\n\n /** Retrieve a value from session-scoped state. Returns undefined if not set. */\n getState(key: string): unknown\n /** Store a value in session-scoped state. Persists for the lifetime of the session. */\n setState(key: string, value: unknown): void\n /** Remove a value from session-scoped state. */\n deleteState(key: string): void\n\n // --- Apps ---\n\n /**\n * Resolve a logical tool name to its current external name, accounting for\n * any namespace prefix applied when the owning FastMCPApp was mounted.\n * Returns the name unchanged when called outside a mounted context.\n */\n resolveToolName(name: string): string\n\n // --- Session lifecycle ---\n\n /**\n * Register a callback that runs when the current session closes.\n * Useful for releasing per-session resources (e.g. uploaded files).\n * No-op if called outside an active HTTP session.\n */\n onClose(callback: () => void): void\n}\n\n// ---------------------------------------------------------------------------\n// AsyncLocalStorage store\n// ---------------------------------------------------------------------------\n\nexport const contextStore = new AsyncLocalStorage<McpContext>()\n\n/** Internal session-state key for per-session close callbacks. */\nexport const SESSION_CLOSE_CALLBACKS_KEY = '__fastmcp_session_close_callbacks'\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a McpContext for a single request.\n *\n * @param server The SDK Server instance for this session.\n * @param requestId The MCP request ID from the incoming message.\n * @param progressToken The progress token from `req.params._meta.progressToken`, if any.\n * @param auth The verified access token, if any.\n * @param sessionState The per-session state Map (shared across requests in the same session).\n */\nexport function createContext(\n server: Server,\n requestId: string | undefined,\n progressToken: string | number | undefined,\n auth: AccessToken | undefined,\n sessionState: Map<string, unknown>,\n): McpContext {\n async function log(level: LogLevel, message: string, loggerName?: string): Promise<void> {\n await server.sendLoggingMessage({\n level,\n data: message,\n ...(loggerName !== undefined ? { logger: loggerName } : {}),\n })\n }\n\n return {\n auth,\n requestId,\n\n log,\n debug: (msg, logger) => log('debug', msg, logger),\n info: (msg, logger) => log('info', msg, logger),\n notice: (msg, logger) => log('notice', msg, logger),\n warning: (msg, logger) => log('warning', msg, logger),\n error: (msg, logger) => log('error', msg, logger),\n critical: (msg, logger) => log('critical', msg, logger),\n alert: (msg, logger) => log('alert', msg, logger),\n emergency: (msg, logger) => log('emergency', msg, logger),\n\n async reportProgress(progress, total, message) {\n if (progressToken === undefined) return\n await server.notification({\n method: 'notifications/progress',\n params: {\n progressToken,\n progress,\n ...(total !== undefined ? { total } : {}),\n ...(message !== undefined ? { message } : {}),\n },\n })\n },\n\n async sample(params) {\n const caps = server.getClientCapabilities()\n if (!caps?.sampling) {\n throw new Error(\n '[fastmcp] Client does not support sampling. Ensure the client advertises the sampling capability before calling ctx.sample().',\n )\n }\n const result = await server.createMessage({\n messages: params.messages,\n maxTokens: params.maxTokens ?? 1024,\n ...(params.systemPrompt !== undefined ? { systemPrompt: params.systemPrompt } : {}),\n ...(params.temperature !== undefined ? { temperature: params.temperature } : {}),\n ...(params.stopSequences !== undefined ? { stopSequences: params.stopSequences } : {}),\n ...(params.modelPreferences !== undefined\n ? { modelPreferences: params.modelPreferences }\n : {}),\n })\n return {\n role: 'assistant' as const,\n content: result.content as SamplingResult['content'],\n model: result.model,\n stopReason: result.stopReason,\n }\n },\n\n async elicit(message, schema) {\n const caps = server.getClientCapabilities()\n if (!caps?.elicitation) {\n throw new Error(\n '[fastmcp] Client does not support elicitation. Ensure the client advertises the elicitation capability before calling ctx.elicit().',\n )\n }\n const result = await server.elicitInput({\n message,\n // Cast: our simplified ElicitationSchema is a subset of the SDK's PrimitiveSchemaDefinition union\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n requestedSchema: schema as any,\n })\n return {\n action: result.action,\n content: result.content as ElicitationResult['content'],\n }\n },\n\n async listRoots() {\n const caps = server.getClientCapabilities()\n if (!caps?.roots) {\n throw new Error(\n '[fastmcp] Client does not support roots. Ensure the client advertises the roots capability before calling ctx.listRoots().',\n )\n }\n const result = await server.listRoots()\n return result.roots\n },\n\n getState: (key) => sessionState.get(key),\n setState: (key, value) => {\n sessionState.set(key, value)\n },\n deleteState: (key) => {\n sessionState.delete(key)\n },\n\n resolveToolName: (name) => name,\n\n onClose(callback) {\n const existing = (sessionState.get(SESSION_CLOSE_CALLBACKS_KEY) as Array<() => void> | undefined) ?? []\n sessionState.set(SESSION_CLOSE_CALLBACKS_KEY, [...existing, callback])\n },\n }\n}\n","import { McpError, ErrorCode, CancelledNotificationSchema } from '@modelcontextprotocol/sdk/types.js'\nimport type { Server } from '@modelcontextprotocol/sdk/server'\nimport type { McpContext } from './context'\n\n// ---------------------------------------------------------------------------\n// Core types\n// ---------------------------------------------------------------------------\n\nexport interface MiddlewareContext<T = unknown> {\n readonly method: string\n readonly request: T\n readonly mcpContext: McpContext\n}\n\nexport type Next<R = unknown> = () => Promise<R>\n\n/**\n * A middleware hook. Either call `next()` and return (optionally transforming) its\n * result, or short-circuit by returning your own result without calling `next()`.\n * The return is typed `Promise<unknown>` because a hook can substitute any result\n * shape for the method it intercepts; the framework resolves the concrete type at\n * the call boundary.\n */\nexport interface Middleware {\n /** Called once per Server instance. Use to register notification handlers or other server-level setup. */\n setup?(server: Server): void\n\n // Coarse hook — fires for every request that has no more-specific hook on this instance\n onRequest?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n\n // Per-method hooks — take precedence over onRequest for their specific method\n onCallTool?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n onListTools?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n onReadResource?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n onListResources?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n onListResourceTemplates?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n onGetPrompt?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n onListPrompts?(ctx: MiddlewareContext, next: Next): Promise<unknown>\n}\n\n// ---------------------------------------------------------------------------\n// Chain execution\n// ---------------------------------------------------------------------------\n\nconst METHOD_HOOK_KEY: Partial<Record<string, keyof Middleware>> = {\n 'tools/call': 'onCallTool',\n 'tools/list': 'onListTools',\n 'resources/read': 'onReadResource',\n 'resources/list': 'onListResources',\n 'resources/templates/list': 'onListResourceTemplates',\n 'prompts/get': 'onGetPrompt',\n 'prompts/list': 'onListPrompts',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyHookFn = (ctx: MiddlewareContext<any>, next: Next<any>) => Promise<any>\n\nfunction selectHook(mw: Middleware, method: string): AnyHookFn | null {\n const key = METHOD_HOOK_KEY[method]\n const specific = key ? (mw[key] as AnyHookFn | undefined) : undefined\n if (specific) return specific.bind(mw)\n if (mw.onRequest) return (mw.onRequest as AnyHookFn).bind(mw)\n return null\n}\n\n/** Build and execute the middleware chain, calling `handler` at the innermost level. */\nexport function runMiddlewareChain<R>(\n middleware: Middleware[],\n method: string,\n request: unknown,\n mcpContext: McpContext,\n handler: () => Promise<R>,\n): Promise<R> {\n const hooks: AnyHookFn[] = []\n for (const mw of middleware) {\n const hook = selectHook(mw, method)\n if (hook) hooks.push(hook)\n }\n\n const ctx: MiddlewareContext = { method, request, mcpContext }\n\n function dispatch(i: number): Promise<R> {\n if (i >= hooks.length) return handler()\n return hooks[i](ctx, () => dispatch(i + 1))\n }\n\n return dispatch(0)\n}\n\n// ---------------------------------------------------------------------------\n// Built-in middleware\n// ---------------------------------------------------------------------------\n\n/** Logs every request with method, outcome, and elapsed time. */\nexport class LoggingMiddleware implements Middleware {\n constructor(private readonly emit: (msg: string) => void = console.log) {}\n\n async onRequest(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n const t0 = Date.now()\n this.emit(`[fastmcp] → ${ctx.method}`)\n try {\n const result = await next()\n this.emit(`[fastmcp] ← ${ctx.method} (${Date.now() - t0}ms)`)\n return result\n } catch (err) {\n this.emit(\n `[fastmcp] ✗ ${ctx.method} (${Date.now() - t0}ms): ${err instanceof Error ? err.message : String(err)}`,\n )\n throw err\n }\n }\n}\n\n/**\n * Custom cache key function. Receives the full middleware context so callers can\n * incorporate auth identity or any other dimension into the key.\n *\n * **Required when using per-component auth checks.** The default key is\n * `\"method:JSON(params)\"`, which contains no auth information. If auth-filtered\n * list results (tools, resources, prompts) are cached with the default key, one\n * session's filtered results can be served to a session with different permissions.\n * Pass a `keyFn` that includes the caller identity, e.g.:\n *\n * ```ts\n * new CachingMiddleware(60_000, (ctx) =>\n * `${ctx.method}:${ctx.mcpContext.auth?.clientId ?? ''}:${JSON.stringify(ctx.request)}`\n * )\n * ```\n */\nexport type CacheKeyFn = (ctx: MiddlewareContext) => string\n\n/** TTL-based response cache keyed on method + serialised request params by default.\n * Pass a custom `keyFn` when using per-component auth so cached results are\n * partitioned by caller identity. */\nexport class CachingMiddleware implements Middleware {\n private readonly _cache = new Map<string, { value: unknown; expiresAt: number }>()\n\n constructor(\n readonly ttl: number = 60_000,\n private readonly _keyFn?: CacheKeyFn,\n ) {}\n\n async onRequest(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n const key = this._keyFn\n ? this._keyFn(ctx as MiddlewareContext)\n : `${ctx.method}:${JSON.stringify(ctx.request)}`\n const entry = this._cache.get(key)\n if (entry && entry.expiresAt > Date.now()) return entry.value\n const result = await next()\n this._cache.set(key, { value: result, expiresAt: Date.now() + this.ttl })\n return result\n }\n}\n\n/** Fixed-window counter rate limiter. Resets to full capacity after every windowMs interval. */\nexport class RateLimitingMiddleware implements Middleware {\n private _tokens: number\n private _lastRefill: number\n\n constructor(\n private readonly limit: number,\n private readonly windowMs: number = 60_000,\n ) {\n this._tokens = limit\n this._lastRefill = Date.now()\n }\n\n async onRequest(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n const now = Date.now()\n if (now - this._lastRefill >= this.windowMs) {\n this._tokens = this.limit\n this._lastRefill = now\n }\n if (this._tokens <= 0) {\n throw new McpError(ErrorCode.InvalidRequest, 'Rate limit exceeded')\n }\n this._tokens--\n return next()\n }\n}\n\n/** Rejects responses whose JSON serialisation exceeds maxBytes. */\nexport class SizeLimitingMiddleware implements Middleware {\n constructor(private readonly maxBytes: number) {}\n\n async onRequest(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n const result = await next()\n const size = Buffer.byteLength(JSON.stringify(result), 'utf8')\n if (size > this.maxBytes) {\n throw new McpError(\n ErrorCode.InternalError,\n `Response size (${size} bytes) exceeds limit (${this.maxBytes} bytes)`,\n )\n }\n return result\n }\n}\n\n/**\n * Normalises errors thrown by handlers to proper MCP shapes:\n * - tools/call plain errors → { isError: true, content: [...] } (per MCP spec)\n * - tools/call McpError → re-thrown as a protocol-level error\n * - all other methods → McpError(InternalError, message)\n *\n * Re-throwing McpError from onCallTool ensures that middleware-level errors\n * (e.g. from RateLimitingMiddleware or SizeLimitingMiddleware stacked before\n * this middleware) always propagate as protocol errors and are never silently\n * converted to isError:true tool responses.\n */\nexport class ErrorNormalizationMiddleware implements Middleware {\n async onCallTool(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n try {\n return await next()\n } catch (err) {\n if (err instanceof McpError) throw err\n return {\n content: [{ type: 'text' as const, text: err instanceof Error ? err.message : String(err) }],\n isError: true,\n }\n }\n }\n\n async onRequest(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n try {\n return await next()\n } catch (err) {\n if (err instanceof McpError) throw err\n throw new McpError(\n ErrorCode.InternalError,\n err instanceof Error ? err.message : String(err),\n )\n }\n }\n}\n\n/**\n * Intercepts `notifications/cancelled` from the client and aborts the matching\n * in-flight handler via Promise.race + AbortController.\n */\nexport class CancellationMiddleware implements Middleware {\n private readonly _inFlight = new Map<string, AbortController>()\n\n setup(server: Server): void {\n server.setNotificationHandler(CancelledNotificationSchema, (notification) => {\n const requestId = String(notification.params.requestId)\n this._inFlight.get(requestId)?.abort()\n })\n }\n\n async onRequest(ctx: MiddlewareContext, next: Next): Promise<unknown> {\n const { requestId } = ctx.mcpContext\n if (!requestId) return next()\n\n const controller = new AbortController()\n this._inFlight.set(requestId, controller)\n\n const abortPromise = new Promise<never>((_, reject) => {\n controller.signal.addEventListener('abort', () =>\n reject(new McpError(ErrorCode.InternalError, 'Request was cancelled by the client')),\n )\n })\n\n try {\n return await Promise.race([next(), abortPromise])\n } finally {\n this._inFlight.delete(requestId)\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// View types — simplified projections passed to transforms\n// ---------------------------------------------------------------------------\n\nexport interface ToolView {\n readonly name: string\n /** Human-readable display name shown in UIs. Takes precedence over `name` for display purposes. */\n readonly title?: string\n readonly description: string\n readonly tags: readonly string[]\n}\n\nexport interface ResourceView {\n readonly uri: string\n readonly name: string\n readonly tags: readonly string[]\n readonly mimeType?: string\n readonly title?: string\n}\n\nexport interface PromptView {\n readonly name: string\n readonly description: string\n readonly tags: readonly string[]\n}\n\n// ---------------------------------------------------------------------------\n// Synthesized tool — produced by a transform from other components\n// ---------------------------------------------------------------------------\n\nexport interface SynthesizedTool {\n readonly name: string\n /** Human-readable display name shown in UIs. Takes precedence over `name` for display purposes. */\n readonly title?: string\n readonly description: string\n readonly inputSchema?: Record<string, unknown>\n readonly auth?: import('./auth/authorization').AuthCheck\n readonly timeout?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly handler: (args: any) => unknown\n}\n\n// ---------------------------------------------------------------------------\n// Transform interface\n// ---------------------------------------------------------------------------\n\nexport interface Transform {\n /**\n * Transform a tool view before it appears in list responses.\n * Return a modified view to rename/redescribe; return null to hide the tool\n * from list responses (it remains callable by its original name).\n */\n transformTool?(view: ToolView): ToolView | null\n\n /** Transform a static resource view. */\n transformResource?(view: ResourceView): ResourceView | null\n\n /** Transform a URI-template resource view. */\n transformResourceTemplate?(view: ResourceView): ResourceView | null\n\n /** Transform a prompt view. */\n transformPrompt?(view: PromptView): PromptView | null\n\n /**\n * Synthesize additional tools derived from the current resource and prompt lists.\n * Called at request time so the snapshot is always fresh.\n */\n synthesizeTools?(resources: ResourceView[], prompts: PromptView[]): SynthesizedTool[]\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper — apply a chain of transforms to a single view\n// ---------------------------------------------------------------------------\n\nexport function applyTransformChain<T>(\n value: T,\n transforms: Transform[],\n pick: (t: Transform, v: T) => T | null | undefined,\n): T | null {\n let current: T | null = value\n for (const t of transforms) {\n if (current === null) break\n const next = pick(t, current)\n if (next !== undefined) current = next\n }\n return current\n}\n\n// ---------------------------------------------------------------------------\n// Built-in transforms\n// ---------------------------------------------------------------------------\n\n/** Rename a single tool. The original name still resolves at call time. */\nexport function renameTool(originalName: string, newName: string): Transform {\n return {\n transformTool: (v) => (v.name === originalName ? { ...v, name: newName } : v),\n }\n}\n\n/** Rewrite the description of a single tool. */\nexport function redescribeTool(toolName: string, description: string): Transform {\n return {\n transformTool: (v) => (v.name === toolName ? { ...v, description } : v),\n }\n}\n\n/**\n * Hide components whose predicate returns false.\n * Hidden items are removed from list responses but remain callable by original name.\n */\nexport class FilterTransform implements Transform {\n constructor(\n private readonly predicates: {\n tools?: (v: ToolView) => boolean\n resources?: (v: ResourceView) => boolean\n /** When omitted, falls back to the `resources` predicate. */\n resourceTemplates?: (v: ResourceView) => boolean\n prompts?: (v: PromptView) => boolean\n },\n ) {}\n\n transformTool(v: ToolView): ToolView | null {\n return (this.predicates.tools?.(v) ?? true) ? v : null\n }\n transformResource(v: ResourceView): ResourceView | null {\n return (this.predicates.resources?.(v) ?? true) ? v : null\n }\n transformResourceTemplate(v: ResourceView): ResourceView | null {\n const pred = this.predicates.resourceTemplates ?? this.predicates.resources\n return (pred?.(v) ?? true) ? v : null\n }\n transformPrompt(v: PromptView): PromptView | null {\n return (this.predicates.prompts?.(v) ?? true) ? v : null\n }\n}\n\n/** Prefix all tool, prompt, and resource names with a string. URIs are left unchanged. */\nexport class NamespaceTransform implements Transform {\n constructor(private readonly prefix: string) {}\n\n transformTool(v: ToolView): ToolView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n transformResource(v: ResourceView): ResourceView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n transformResourceTemplate(v: ResourceView): ResourceView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n transformPrompt(v: PromptView): PromptView {\n return { ...v, name: `${this.prefix}${v.name}` }\n }\n}\n\n/** Expose registered resources as a `list_resources` tool. */\nexport class ResourcesAsTools implements Transform {\n synthesizeTools(resources: ResourceView[]): SynthesizedTool[] {\n return [\n {\n name: 'list_resources',\n description: 'List all available MCP resources',\n inputSchema: { type: 'object', properties: {} },\n handler: () => resources.map((r) => ({ uri: r.uri, name: r.name, mimeType: r.mimeType })),\n },\n ]\n }\n}\n\n/** Expose registered prompts as a `list_prompts` tool. */\nexport class PromptsAsTools implements Transform {\n synthesizeTools(_resources: ResourceView[], prompts: PromptView[]): SynthesizedTool[] {\n return [\n {\n name: 'list_prompts',\n description: 'List all available MCP prompts',\n inputSchema: { type: 'object', properties: {} },\n handler: () => prompts.map((p) => ({ name: p.name, description: p.description })),\n },\n ]\n }\n}\n\n/**\n * Expose only components whose tags include the specified version string.\n * Components with no tags are always excluded.\n */\nexport class VersionFilter implements Transform {\n constructor(private readonly version: string) {}\n\n private _matches(tags: readonly string[]): boolean {\n return tags.includes(this.version)\n }\n\n transformTool(v: ToolView): ToolView | null {\n return this._matches(v.tags) ? v : null\n }\n transformResource(v: ResourceView): ResourceView | null {\n return this._matches(v.tags) ? v : null\n }\n transformResourceTemplate(v: ResourceView): ResourceView | null {\n return this._matches(v.tags) ? v : null\n }\n transformPrompt(v: PromptView): PromptView | null {\n return this._matches(v.tags) ? v : null\n }\n}\n","import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\n\nexport class Image {\n constructor(\n readonly buffer: Buffer | Uint8Array,\n readonly mimeType: string,\n ) {}\n}\n\nexport class File {\n constructor(\n readonly buffer: Buffer | Uint8Array,\n readonly name: string,\n readonly mimeType: string,\n ) {}\n}\n\nexport class ToolResult {\n constructor(readonly result: CallToolResult) {}\n}\n\nexport function convertResult(value: unknown): CallToolResult {\n if (value instanceof ToolResult) {\n return value.result\n }\n if (value instanceof Image) {\n return {\n content: [\n {\n type: 'image',\n data: Buffer.from(value.buffer).toString('base64'),\n mimeType: value.mimeType,\n },\n ],\n }\n }\n if (value instanceof File) {\n return {\n content: [\n {\n type: 'resource',\n resource: {\n uri: `file://${value.name}`,\n mimeType: value.mimeType,\n blob: Buffer.from(value.buffer).toString('base64'),\n },\n },\n ],\n }\n }\n if (value === undefined || value === null) {\n return { content: [] }\n }\n if (Array.isArray(value)) {\n console.warn(\n '[fastmcp] Tool returned an array — structuredContent will not be set (MCP spec requires a plain object). Wrap in an object or use ToolResult to suppress this warning.',\n )\n return {\n content: [{ type: 'text', text: JSON.stringify(value) }],\n }\n }\n if (typeof value === 'object') {\n const json = JSON.stringify(value)\n return {\n content: [{ type: 'text', text: json }],\n structuredContent: value as Record<string, unknown>,\n }\n }\n // string, number, boolean\n return {\n content: [{ type: 'text', text: String(value) }],\n }\n}\n\nexport async function toJsonSchema(\n schema: StandardSchemaV1,\n context?: string,\n): Promise<Record<string, unknown>> {\n // Strategy 1: schema-native .toJsonSchema() method (ArkType and any library following this convention)\n const maybeNative = schema as { toJsonSchema?: () => unknown }\n if (typeof maybeNative.toJsonSchema === 'function') {\n try {\n const result = maybeNative.toJsonSchema()\n if (result !== null && typeof result === 'object') {\n return result as Record<string, unknown>\n }\n } catch {\n // fall through\n }\n }\n\n // Strategy 2: Zod v4 z.toJSONSchema()\n try {\n const { z } = await import('zod')\n return (z as unknown as { toJSONSchema: (s: unknown) => Record<string, unknown> }).toJSONSchema(\n schema,\n )\n } catch {\n // fall through\n }\n\n const where = context ? ` for ${context}` : ''\n console.warn(\n `[fastmcp] Could not auto-generate JSON schema${where}. Sending { type: 'object' } to clients. Provide an explicit 'inputSchema' in ToolConfig to suppress this warning.`,\n )\n return { type: 'object' }\n}\n\nexport async function validateInput<S extends StandardSchemaV1>(\n schema: S,\n input: unknown,\n throwAsProtocolError = false,\n): Promise<StandardSchemaV1.InferOutput<S>> {\n const result = await schema['~standard'].validate(input)\n if (result.issues) {\n const messages = result.issues.map((i) => i.message).join('; ')\n if (throwAsProtocolError) {\n throw new McpError(ErrorCode.InvalidParams, `Validation failed: ${messages}`)\n }\n throw new Error(`Validation failed: ${messages}`)\n }\n return result.value as StandardSchemaV1.InferOutput<S>\n}\n","import type { AuthCheck } from './auth/authorization'\nimport type { ResourceUiMeta } from './apps/types'\n\nexport interface ResourceAnnotations {\n /** Intended audience(s) — 'user', 'assistant', or both. */\n audience?: Array<'user' | 'assistant'>\n /** Importance hint from 0 (least) to 1 (most). */\n priority?: number\n /** ISO 8601 timestamp of last modification. */\n lastModified?: string\n}\n\nexport interface ResourceConfig {\n /** Static URI (e.g. `file://readme`) or RFC 6570 template (e.g. `user://{id}`). */\n uri: string\n /** Programmatic identifier. Defaults to the uri. */\n name?: string\n /** Human-readable display name shown in UIs. Defaults to `name`. */\n title?: string\n description?: string\n /** MIME type of the resource content. Defaults to 'text/plain' for strings, 'application/octet-stream' for binary. */\n mimeType?: string\n /**\n * Size of the resource content in bytes, if known.\n * Only meaningful for static resources; ignored for URI templates.\n */\n size?: number\n /** Behavioral hints for clients. */\n annotations?: ResourceAnnotations\n /** Execution timeout in milliseconds. No timeout by default. */\n timeout?: number\n /** When true the resource is hidden from list responses and cannot be read. */\n disabled?: boolean\n /** Arbitrary tags for server-side filtering. */\n tags?: string[]\n auth?: AuthCheck\n /** Apps extension metadata. Included in _meta.ui in resources/list for UI-capable clients. */\n ui?: ResourceUiMeta\n}\n\n/**\n * Escape hatch for full control over resource response content.\n * Return this from a resource handler to specify content directly.\n */\nexport class ResourceResult {\n constructor(\n readonly contents: Array<{\n uri: string\n mimeType?: string\n text?: string\n blob?: string\n }>,\n ) {}\n}\n\ntype ResourceContent =\n | { uri: string; mimeType?: string; text: string }\n | { uri: string; mimeType?: string; blob: string }\n\n/**\n * Converts a resource handler's return value into the MCP ReadResourceResult shape.\n *\n * - string → text content\n * - Buffer / Uint8Array → base64 blob content\n * - object / array → JSON-serialised text with mimeType application/json\n * - ResourceResult → passthrough\n * - null / undefined → empty text content\n */\nexport function convertResourceResult(\n value: unknown,\n uri: string,\n mimeType?: string,\n): { contents: ResourceContent[] } {\n if (value instanceof ResourceResult) {\n return { contents: value.contents as ResourceContent[] }\n }\n if (value instanceof Buffer || value instanceof Uint8Array) {\n return {\n contents: [\n {\n uri,\n mimeType: mimeType ?? 'application/octet-stream',\n blob: Buffer.from(value).toString('base64'),\n },\n ],\n }\n }\n if (value === null || value === undefined) {\n return { contents: [{ uri, mimeType: mimeType ?? 'text/plain', text: '' }] }\n }\n if (typeof value === 'object') {\n return {\n contents: [{ uri, mimeType: mimeType ?? 'application/json', text: JSON.stringify(value) }],\n }\n }\n // string, number, boolean\n return { contents: [{ uri, mimeType: mimeType ?? 'text/plain', text: String(value) }] }\n}\n\n/** Returns true if the URI string contains RFC 6570 template expressions. */\nexport function isUriTemplate(uri: string): boolean {\n return uri.includes('{')\n}\n\n/**\n * Matches a concrete URI against an RFC 6570 URI template and returns the\n * extracted parameter values, or null if the URI does not match the template.\n *\n * Supports:\n * - Simple path params: {id} → matches a single path segment\n * - Wildcard path params: {path*} → matches multiple segments (including '/')\n * - Query params: {?q,lang} → extracted from the query string\n */\nexport function matchTemplate(\n uriTemplate: string,\n uri: string,\n): Record<string, string> | null {\n // Split URI into base and query string\n const qIdx = uri.indexOf('?')\n const baseUri = qIdx >= 0 ? uri.slice(0, qIdx) : uri\n const queryString = qIdx >= 0 ? uri.slice(qIdx + 1) : ''\n\n // Pull out query param names from {?...} expressions and strip them from the template\n const queryParamNames: string[] = []\n const baseTemplate = uriTemplate.replace(/\\{[?][^}]+\\}/g, (match) => {\n match\n .slice(2, -1)\n .split(',')\n .map((s) => s.trim())\n .forEach((n) => queryParamNames.push(n))\n return ''\n })\n\n // Build a regex from the base template, collecting path param names\n const names: string[] = []\n const segments = baseTemplate.split(/(\\{[^}]+\\})/g)\n let pattern = '^'\n for (const seg of segments) {\n if (seg.startsWith('{') && seg.endsWith('}')) {\n const inner = seg.slice(1, -1)\n if (inner.endsWith('*')) {\n names.push(inner.slice(0, -1))\n pattern += '(.+)'\n } else {\n names.push(inner)\n pattern += '([^/?]+)'\n }\n } else if (seg) {\n // Escape regex metacharacters in literal parts\n pattern += seg.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n }\n }\n pattern += '$'\n\n const pathMatch = baseUri.match(new RegExp(pattern))\n if (!pathMatch) return null\n\n const params: Record<string, string> = {}\n names.forEach((name, i) => {\n params[name] = decodeURIComponent(pathMatch[i + 1])\n })\n\n // Extract query parameters\n if (queryParamNames.length > 0 && queryString) {\n const sp = new URLSearchParams(queryString)\n for (const name of queryParamNames) {\n const val = sp.get(name)\n if (val !== null) params[name] = val\n }\n }\n\n return params\n}\n","export const UI_EXTENSION_KEY = 'io.modelcontextprotocol/ui'\nexport const UI_RESOURCE_MIME_TYPE = 'text/html;profile=mcp-app'\n\nexport type Visibility = 'model' | 'app'\n\nexport interface CspPolicy {\n connectDomains?: string[]\n /** Covers img-src, script-src, style-src, font-src, media-src. */\n resourceDomains?: string[]\n frameDomains?: string[]\n baseUriDomains?: string[]\n}\n\nexport interface UiToolMeta {\n /** Explicit resource URI. Auto-derived from tool name when omitted. */\n resourceUri?: string\n /** Who can see this tool. Defaults to ['model']. */\n visibility?: Visibility[]\n}\n\nexport interface BrowserPermissions {\n camera?: Record<string, never>\n microphone?: Record<string, never>\n geolocation?: Record<string, never>\n clipboardWrite?: Record<string, never>\n}\n\nexport interface ResourceUiMeta {\n csp?: CspPolicy\n permissions?: BrowserPermissions\n domain?: string\n prefersBorder?: boolean\n}\n","import type { AuthCheck } from './auth/authorization'\n\nexport interface PromptArgument {\n name: string\n description?: string\n /** When true, the client must supply this argument. Defaults to false. */\n required?: boolean\n}\n\nexport interface PromptConfig {\n /** Unique prompt identifier. Inferred from the handler function name when omitted. */\n name?: string\n /** Human-readable display name shown in UIs. */\n title?: string\n /** Description shown to clients and LLMs. Inferred from name when omitted. */\n description?: string\n /** Declared arguments. Advertised to clients in prompts/list. */\n arguments?: PromptArgument[]\n /** When true the prompt is hidden from list responses and cannot be invoked. */\n disabled?: boolean\n /** Execution timeout in milliseconds. No timeout by default. */\n timeout?: number\n /** Arbitrary tags for server-side filtering and transforms. */\n tags?: string[]\n auth?: AuthCheck\n}\n\n// ---------------------------------------------------------------------------\n// Content and message types\n// ---------------------------------------------------------------------------\n\nexport type TextContent = { type: 'text'; text: string }\nexport type ImageContent = { type: 'image'; data: string; mimeType: string }\nexport type AudioContent = { type: 'audio'; data: string; mimeType: string }\nexport type ResourceLinkContent = {\n type: 'resource_link'\n uri: string\n name?: string\n description?: string\n mimeType?: string\n}\nexport type EmbeddedResource = {\n type: 'resource'\n resource: { uri: string; mimeType?: string } & ({ text: string } | { blob: string })\n}\n\nexport type PromptContent = TextContent | ImageContent | AudioContent | EmbeddedResource | ResourceLinkContent\n\nexport interface PromptMessage {\n role: 'user' | 'assistant'\n content: PromptContent\n}\n\n/**\n * Escape hatch for full control over the prompt response.\n * Return this from a prompt handler to set an explicit description and/or\n * supply a custom multi-turn message sequence.\n */\nexport class PromptResult {\n constructor(\n readonly messages: PromptMessage[],\n readonly description?: string,\n ) {}\n}\n\n// ---------------------------------------------------------------------------\n// Return value conversion\n// ---------------------------------------------------------------------------\n\nfunction isPromptMessage(value: unknown): value is PromptMessage {\n if (value === null || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n if (v.role !== 'user' && v.role !== 'assistant') return false\n if (!v.content || typeof v.content !== 'object') return false\n return typeof (v.content as Record<string, unknown>).type === 'string'\n}\n\n/**\n * Converts a prompt handler's return value into the MCP GetPromptResult shape.\n *\n * - string → single user text message\n * - PromptMessage → wrapped in a one-element array\n * - PromptMessage[] → used as-is\n * - PromptResult → passthrough (escape hatch)\n */\nexport function convertPromptResult(value: unknown): { description?: string; messages: PromptMessage[] } {\n if (value instanceof PromptResult) {\n return { description: value.description, messages: value.messages }\n }\n if (typeof value === 'string') {\n return { messages: [{ role: 'user', content: { type: 'text', text: value } }] }\n }\n if (isPromptMessage(value)) {\n return { messages: [value] }\n }\n if (Array.isArray(value) && value.every(isPromptMessage)) {\n return { messages: value }\n }\n throw new Error(\n `Prompt handler returned an unsupported value. Expected string, PromptMessage, PromptMessage[], or PromptResult.`,\n )\n}\n","import type { AccessToken } from './types'\nimport { AuthorizationError } from './types'\n\nexport type AuthCheck = (token: AccessToken) => void | Promise<void>\n\nexport function requireScopes(...scopes: string[]): AuthCheck {\n return async (token) => {\n for (const scope of scopes) {\n if (!token.scopes.includes(scope)) {\n throw new AuthorizationError(`Missing required scope: \"${scope}\"`)\n }\n }\n }\n}\n","import type { AccessToken, TokenVerifier } from './types'\n\nexport function multiAuth(...verifiers: TokenVerifier[]): TokenVerifier {\n return {\n async verify(token: string): Promise<AccessToken> {\n const errors: string[] = []\n for (const verifier of verifiers) {\n try {\n return await verifier.verify(token)\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err))\n }\n }\n throw new Error(`All auth sources rejected the token: ${errors.join('; ')}`)\n },\n }\n}\n","import { createRemoteJWKSet, jwtVerify } from 'jose'\nimport type { AccessToken, TokenVerifier } from '../types'\n\nexport interface JwtVerifierOptions {\n jwksUri: string\n issuer?: string\n audience?: string | string[]\n /** Clock skew tolerance in seconds. Default: 0. */\n leeway?: number\n}\n\nexport function jwtVerifier(options: JwtVerifierOptions): TokenVerifier {\n const JWKS = createRemoteJWKSet(new URL(options.jwksUri))\n\n return {\n async verify(token: string): Promise<AccessToken> {\n const { payload } = await jwtVerify(token, JWKS, {\n issuer: options.issuer,\n audience: options.audience,\n clockTolerance: options.leeway ?? 0,\n })\n\n const scopes =\n typeof payload.scope === 'string'\n ? payload.scope.split(' ').filter(Boolean)\n : Array.isArray(payload.scope)\n ? (payload.scope as string[])\n : []\n\n return {\n token,\n clientId: typeof payload.sub === 'string' ? payload.sub : undefined,\n scopes,\n expiresAt: payload.exp,\n claims: payload as Record<string, unknown>,\n }\n },\n }\n}\n","import type { AccessToken, TokenVerifier } from '../types'\n\nexport interface IntrospectionVerifierOptions {\n endpoint: string\n credentials: { clientId: string; clientSecret: string }\n /** Cache TTL in seconds. Omit or set to 0 to disable caching. */\n cacheTtl?: number\n}\n\ninterface CacheEntry {\n token: AccessToken\n expiresAt: number\n}\n\nexport function introspectionVerifier(options: IntrospectionVerifierOptions): TokenVerifier {\n const cache = options.cacheTtl ? new Map<string, CacheEntry>() : null\n\n return {\n async verify(rawToken: string): Promise<AccessToken> {\n if (cache) {\n const cached = cache.get(rawToken)\n if (cached && Date.now() < cached.expiresAt) {\n return cached.token\n }\n cache.delete(rawToken)\n }\n\n const credentials = Buffer.from(\n `${options.credentials.clientId}:${options.credentials.clientSecret}`,\n ).toString('base64')\n\n const response = await fetch(options.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${credentials}`,\n },\n body: new URLSearchParams({ token: rawToken }),\n })\n\n if (!response.ok) {\n throw new Error(`Introspection endpoint returned ${response.status}`)\n }\n\n const data = (await response.json()) as {\n active: boolean\n scope?: string\n client_id?: string\n exp?: number\n [key: string]: unknown\n }\n\n if (!data.active) {\n throw new Error('Token is not active')\n }\n\n const accessToken: AccessToken = {\n token: rawToken,\n clientId: data.client_id,\n scopes: data.scope ? data.scope.split(' ').filter(Boolean) : [],\n expiresAt: data.exp,\n claims: data as Record<string, unknown>,\n }\n\n if (cache && options.cacheTtl) {\n cache.set(rawToken, {\n token: accessToken,\n expiresAt: Date.now() + options.cacheTtl * 1000,\n })\n }\n\n return accessToken\n },\n }\n}\n","import type { AccessToken, TokenVerifier } from '../types'\n\nexport function staticTokenVerifier(\n map: Record<string, Partial<Omit<AccessToken, 'token'>>>,\n): TokenVerifier {\n return {\n async verify(token: string): Promise<AccessToken> {\n const entry = map[token]\n if (!entry) {\n throw new Error('Unknown token')\n }\n if (entry.expiresAt !== undefined && entry.expiresAt < Math.floor(Date.now() / 1000)) {\n throw new Error('Token has expired')\n }\n return {\n token,\n clientId: entry.clientId,\n scopes: entry.scopes ?? [],\n expiresAt: entry.expiresAt,\n claims: entry.claims ?? {},\n }\n },\n }\n}\n\nexport function debugTokenVerifier(): TokenVerifier {\n console.warn('[fastmcp] debugTokenVerifier() accepts all bearer tokens — never use in production')\n return {\n async verify(token: string): Promise<AccessToken> {\n if (!token) {\n throw new Error('Empty token')\n }\n return { token, scopes: [], claims: {} }\n },\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { UnsupportedGrantTypeError } from '@modelcontextprotocol/sdk/server/auth/errors.js'\nimport type { Response } from 'express'\nimport type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js'\nimport type { OAuthClientInformationFull } from '@modelcontextprotocol/sdk/shared/auth.js'\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\n\nexport interface OAuthProviderOptions {\n /**\n * Called during the authorization step. Implementations must eventually redirect\n * to `params.redirectUri` with a `code` query parameter (and `state` if present).\n *\n * If omitted, all authorization requests are auto-approved immediately — suitable\n * for testing and development only.\n */\n onAuthorize?: (\n client: OAuthClientInformationFull,\n params: AuthorizationParams,\n res: Response,\n ) => Promise<void>\n /** Scopes supported by this server, advertised in OAuth metadata. */\n scopes?: string[]\n /** Access token lifetime in seconds. Default: 3600. */\n tokenTtl?: number\n}\n\n/**\n * Creates an in-memory OAuth 2.1 server provider with Dynamic Client Registration support.\n *\n * Suitable for development, testing, and simple deployments where persistence is not required.\n * All state (clients, codes, tokens) is held in memory and lost on restart.\n */\nexport function oauthProvider(options: OAuthProviderOptions = {}): OAuthServerProvider {\n const clients = new Map<string, OAuthClientInformationFull>()\n const codes = new Map<string, { client: OAuthClientInformationFull; params: AuthorizationParams }>()\n const tokens = new Map<string, { clientId: string; scopes: string[]; expiresAt: number }>()\n\n // The SDK registration handler generates client_id and other fields before calling\n // registerClient, so at runtime the argument is always a full OAuthClientInformationFull.\n const clientsStore: OAuthRegisteredClientsStore = {\n async getClient(clientId) {\n return clients.get(clientId)\n },\n async registerClient(client) {\n const full = client as OAuthClientInformationFull\n clients.set(full.client_id, full)\n return full\n },\n }\n\n return {\n clientsStore,\n\n async authorize(client, params, res) {\n if (options.onAuthorize) {\n return options.onAuthorize(client, params, res)\n }\n // Default: auto-approve — issue code and redirect immediately\n const code = randomUUID()\n codes.set(code, { client, params })\n const redirectUrl = new URL(params.redirectUri)\n redirectUrl.searchParams.set('code', code)\n if (params.state) redirectUrl.searchParams.set('state', params.state)\n res.redirect(redirectUrl.toString())\n },\n\n async challengeForAuthorizationCode(_client, authorizationCode) {\n const data = codes.get(authorizationCode)\n if (!data) throw new Error('Invalid authorization code')\n return data.params.codeChallenge\n },\n\n async exchangeAuthorizationCode(client, authorizationCode) {\n const data = codes.get(authorizationCode)\n if (!data) throw new Error('Invalid authorization code')\n if (data.client.client_id !== client.client_id) {\n throw new Error('Authorization code was not issued to this client')\n }\n codes.delete(authorizationCode)\n\n const token = randomUUID()\n const ttl = options.tokenTtl ?? 3600\n const requestedScopes = data.params.scopes ?? []\n const grantedScopes =\n options.scopes !== undefined\n ? requestedScopes.filter((s) => options.scopes!.includes(s))\n : requestedScopes\n tokens.set(token, {\n clientId: client.client_id,\n scopes: grantedScopes,\n expiresAt: Math.floor(Date.now() / 1000) + ttl,\n })\n return {\n access_token: token,\n token_type: 'bearer',\n expires_in: ttl,\n scope: grantedScopes.join(' '),\n }\n },\n\n async exchangeRefreshToken() {\n throw new UnsupportedGrantTypeError('Refresh tokens are not supported by this provider')\n },\n\n async verifyAccessToken(token): Promise<AuthInfo> {\n const data = tokens.get(token)\n if (!data) throw new Error('Invalid token')\n if (data.expiresAt < Math.floor(Date.now() / 1000)) throw new Error('Token has expired')\n return {\n token,\n clientId: data.clientId,\n scopes: data.scopes,\n expiresAt: data.expiresAt,\n }\n },\n }\n}\n","import type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js'\nimport type { OAuthClientInformationFull, OAuthTokenRevocationRequest, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js'\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\n\nexport interface OAuthProxyOptions {\n /** Pre-registered credentials this proxy uses when talking to the upstream server. */\n upstreamCredentials: {\n clientId: string\n clientSecret?: string\n }\n /** Upstream OAuth server endpoint URLs. */\n endpoints: {\n authorizationUrl: string\n tokenUrl: string\n revocationUrl?: string\n }\n /**\n * Verifies an access token issued by the upstream and returns information about it.\n * Called for every MCP request to validate the bearer token.\n */\n verifyAccessToken: (token: string) => Promise<AuthInfo>\n}\n\n/**\n * Creates an OAuth provider that proxies to an existing upstream OAuth server using\n * pre-registered credentials.\n *\n * MCP clients interact with this proxy using Dynamic Client Registration. The proxy\n * presents a DCR-compliant interface while internally using its own fixed credentials\n * (`upstreamCredentials`) when communicating with the upstream authorization server.\n */\nexport function oauthProxy(options: OAuthProxyOptions): OAuthServerProvider {\n const clients = new Map<string, OAuthClientInformationFull>()\n\n const clientsStore: OAuthRegisteredClientsStore = {\n async getClient(clientId) {\n return clients.get(clientId)\n },\n // DCR for incoming MCP clients — stored locally, not proxied upstream\n async registerClient(client) {\n const full = client as OAuthClientInformationFull\n clients.set(full.client_id, full)\n return full\n },\n }\n\n return {\n clientsStore,\n // Let the upstream server validate PKCE — we pass code_verifier through\n skipLocalPkceValidation: true as const,\n\n async authorize(_client, params, res) {\n // Redirect to upstream using the proxy's registered client_id\n const targetUrl = new URL(options.endpoints.authorizationUrl)\n targetUrl.searchParams.set('client_id', options.upstreamCredentials.clientId)\n targetUrl.searchParams.set('response_type', 'code')\n targetUrl.searchParams.set('redirect_uri', params.redirectUri)\n targetUrl.searchParams.set('code_challenge', params.codeChallenge)\n targetUrl.searchParams.set('code_challenge_method', 'S256')\n if (params.state) targetUrl.searchParams.set('state', params.state)\n if (params.scopes?.length) targetUrl.searchParams.set('scope', params.scopes.join(' '))\n res.redirect(targetUrl.toString())\n },\n\n async challengeForAuthorizationCode() {\n // PKCE is validated by the upstream; returning empty string skips local validation\n return ''\n },\n\n async exchangeAuthorizationCode(_client, authorizationCode, codeVerifier, redirectUri): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: options.upstreamCredentials.clientId,\n code: authorizationCode,\n })\n if (options.upstreamCredentials.clientSecret) {\n body.set('client_secret', options.upstreamCredentials.clientSecret)\n }\n if (codeVerifier) body.set('code_verifier', codeVerifier)\n if (redirectUri) body.set('redirect_uri', redirectUri)\n\n const response = await fetch(options.endpoints.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n if (!response.ok) {\n await response.body?.cancel()\n throw new Error(`Upstream token exchange failed: ${response.status}`)\n }\n return response.json() as Promise<OAuthTokens>\n },\n\n async exchangeRefreshToken(_client, refreshToken, scopes): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: options.upstreamCredentials.clientId,\n refresh_token: refreshToken,\n })\n if (options.upstreamCredentials.clientSecret) {\n body.set('client_secret', options.upstreamCredentials.clientSecret)\n }\n if (scopes?.length) body.set('scope', scopes.join(' '))\n\n const response = await fetch(options.endpoints.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n if (!response.ok) {\n await response.body?.cancel()\n throw new Error(`Upstream token refresh failed: ${response.status}`)\n }\n return response.json() as Promise<OAuthTokens>\n },\n\n verifyAccessToken: options.verifyAccessToken,\n\n ...(options.endpoints.revocationUrl\n ? {\n async revokeToken(\n _client: OAuthClientInformationFull,\n request: OAuthTokenRevocationRequest,\n ): Promise<void> {\n const body = new URLSearchParams({\n token: request.token,\n client_id: options.upstreamCredentials.clientId,\n })\n if (options.upstreamCredentials.clientSecret) {\n body.set('client_secret', options.upstreamCredentials.clientSecret)\n }\n if (request.token_type_hint) {\n body.set('token_type_hint', request.token_type_hint)\n }\n const response = await fetch(options.endpoints.revocationUrl!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n if (!response.ok) {\n await response.body?.cancel()\n // RFC 7009 §2.2: servers should not signal errors on revocation\n }\n },\n }\n : {}),\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport {\n CallToolResultSchema,\n type CallToolResult,\n ToolListChangedNotificationSchema,\n ResourceListChangedNotificationSchema,\n PromptListChangedNotificationSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { parseTemplate } from 'url-template'\nimport { FastMCP } from './FastMCP'\nimport { ToolResult } from './tool'\nimport { ResourceResult } from './resource'\nimport { PromptResult } from './prompt'\nimport type { PromptMessage } from './prompt'\n\ntype StdioTransport = {\n type: 'stdio'\n command: string\n args?: string[]\n env?: Record<string, string>\n cwd?: string\n /** How long (ms) before the proxy re-fetches component lists. Default 30 000. Set 0 for notifications-only. */\n cacheTtl?: number\n}\n\ntype HttpTransport = {\n type: 'http'\n url: string\n requestInit?: RequestInit\n /** How long (ms) before the proxy re-fetches component lists. Default 30 000. Set 0 for notifications-only. */\n cacheTtl?: number\n}\n\nexport type ProxyTransport = StdioTransport | HttpTransport\n\n/**\n * Build a FastMCP proxy around an already-connected MCP Client.\n * Exported to enable testing with in-memory transports.\n */\nexport async function buildProxyFromClient(\n client: Client,\n options?: { cacheTtl?: number; name?: string },\n): Promise<FastMCP> {\n const cacheTtl = options?.cacheTtl ?? 30_000\n\n const serverInfo = client.getServerVersion()\n const proxyName = options?.name ?? serverInfo?.name ?? 'proxy'\n const proxyVersion = serverInfo?.version ?? '0.0.1'\n\n const proxy = new FastMCP({ name: proxyName, version: proxyVersion })\n\n // Track which component identifiers were registered by this proxy so we can diff on resync.\n const proxiedTools = new Set<string>()\n const proxiedResources = new Set<string>()\n const proxiedPrompts = new Set<string>()\n\n // Per-type timestamp of last successful sync (0 forces an immediate resync on first list request).\n const lastSync = { tools: 0, resources: 0, prompts: 0 }\n\n async function resyncTools(): Promise<void> {\n const tools: Awaited<ReturnType<typeof client.listTools>>['tools'] = []\n let cursor: string | undefined\n do {\n const page = await client.listTools({ cursor })\n tools.push(...page.tools)\n cursor = page.nextCursor\n } while (cursor)\n\n const incoming = new Set(tools.map((t) => t.name))\n\n for (const name of proxiedTools) {\n if (!incoming.has(name)) {\n proxy._removeTool(name)\n proxiedTools.delete(name)\n }\n }\n\n for (const tool of tools) {\n if (proxiedTools.has(tool.name)) {\n // Update metadata if it changed\n proxy._removeTool(tool.name)\n proxiedTools.delete(tool.name)\n }\n proxy.tool(\n {\n name: tool.name,\n ...(tool.title !== undefined ? { title: tool.title } : {}),\n description: tool.description ?? tool.name,\n inputSchema: (tool.inputSchema as Record<string, unknown>) ?? {},\n },\n async (args: unknown) => {\n const result = await client.callTool(\n { name: tool.name, arguments: args as Record<string, unknown> },\n CallToolResultSchema,\n )\n // Zod infers _meta on content items as Record<string,unknown> but\n // CallToolResult types it more specifically — identical at runtime.\n return new ToolResult(result as unknown as CallToolResult)\n },\n )\n proxiedTools.add(tool.name)\n }\n\n lastSync.tools = Date.now()\n }\n\n async function resyncResources(): Promise<void> {\n const incoming = new Set<string>()\n\n try {\n const resources: Awaited<ReturnType<typeof client.listResources>>['resources'] = []\n let cursor: string | undefined\n do {\n const page = await client.listResources({ cursor })\n resources.push(...page.resources)\n cursor = page.nextCursor\n } while (cursor)\n\n for (const resource of resources) {\n incoming.add(resource.uri)\n if (!proxiedResources.has(resource.uri)) {\n proxy.resource(\n {\n uri: resource.uri,\n name: resource.name,\n ...(resource.description !== undefined ? { description: resource.description } : {}),\n ...(resource.mimeType !== undefined ? { mimeType: resource.mimeType } : {}),\n },\n async () => {\n const result = await client.readResource({ uri: resource.uri })\n return new ResourceResult(\n result.contents as Array<{\n uri: string\n mimeType?: string\n text?: string\n blob?: string\n }>,\n )\n },\n )\n proxiedResources.add(resource.uri)\n }\n }\n } catch {\n // server may not support resources\n }\n\n try {\n const resourceTemplates: Awaited<ReturnType<typeof client.listResourceTemplates>>['resourceTemplates'] = []\n let templateCursor: string | undefined\n do {\n const page = await client.listResourceTemplates({ cursor: templateCursor })\n resourceTemplates.push(...page.resourceTemplates)\n templateCursor = page.nextCursor\n } while (templateCursor)\n\n for (const template of resourceTemplates) {\n const uriTemplate = template.uriTemplate\n incoming.add(uriTemplate)\n if (!proxiedResources.has(uriTemplate)) {\n const expander = parseTemplate(uriTemplate)\n proxy.resource(\n {\n uri: uriTemplate,\n name: template.name,\n ...(template.description !== undefined\n ? { description: template.description }\n : {}),\n ...(template.mimeType !== undefined ? { mimeType: template.mimeType } : {}),\n },\n async (params?: Record<string, string>) => {\n const actualUri = params ? expander.expand(params) : uriTemplate\n const result = await client.readResource({ uri: actualUri })\n return new ResourceResult(\n result.contents as Array<{\n uri: string\n mimeType?: string\n text?: string\n blob?: string\n }>,\n )\n },\n )\n proxiedResources.add(uriTemplate)\n }\n }\n } catch {\n // server may not support resource templates\n }\n\n for (const uri of proxiedResources) {\n if (!incoming.has(uri)) {\n proxy._removeResource(uri)\n proxiedResources.delete(uri)\n }\n }\n\n lastSync.resources = Date.now()\n }\n\n async function resyncPrompts(): Promise<void> {\n const prompts: Awaited<ReturnType<typeof client.listPrompts>>['prompts'] = []\n let cursor: string | undefined\n do {\n const page = await client.listPrompts({ cursor })\n prompts.push(...page.prompts)\n cursor = page.nextCursor\n } while (cursor)\n\n const incoming = new Set(prompts.map((p) => p.name))\n\n for (const name of proxiedPrompts) {\n if (!incoming.has(name)) {\n proxy._removePrompt(name)\n proxiedPrompts.delete(name)\n }\n }\n\n for (const prompt of prompts) {\n if (!proxiedPrompts.has(prompt.name)) {\n proxy.prompt(\n {\n name: prompt.name,\n description: prompt.description,\n ...(prompt.arguments?.length ? { arguments: prompt.arguments } : {}),\n },\n async (args?: Record<string, string>) => {\n const result = await client.getPrompt({ name: prompt.name, arguments: args })\n return new PromptResult(result.messages as PromptMessage[], result.description)\n },\n )\n proxiedPrompts.add(prompt.name)\n }\n }\n\n lastSync.prompts = Date.now()\n }\n\n // Initial sync.\n await Promise.all([\n resyncTools().catch(() => {}),\n resyncResources().catch(() => {}),\n resyncPrompts().catch(() => {}),\n ])\n\n // Subscribe to backend change notifications for immediate resync.\n client.setNotificationHandler(ToolListChangedNotificationSchema, () => {\n resyncTools().catch(() => {})\n })\n client.setNotificationHandler(ResourceListChangedNotificationSchema, () => {\n resyncResources().catch(() => {})\n })\n client.setNotificationHandler(PromptListChangedNotificationSchema, () => {\n resyncPrompts().catch(() => {})\n })\n\n // TTL-based lazy resync: re-fetch on list requests when the cache is stale.\n if (cacheTtl > 0) {\n proxy.use({\n async onListTools(ctx, next) {\n if (Date.now() - lastSync.tools > cacheTtl) await resyncTools().catch(() => {})\n return next()\n },\n async onListResources(ctx, next) {\n if (Date.now() - lastSync.resources > cacheTtl) await resyncResources().catch(() => {})\n return next()\n },\n async onListResourceTemplates(ctx, next) {\n if (Date.now() - lastSync.resources > cacheTtl) await resyncResources().catch(() => {})\n return next()\n },\n async onListPrompts(ctx, next) {\n if (Date.now() - lastSync.prompts > cacheTtl) await resyncPrompts().catch(() => {})\n return next()\n },\n })\n }\n\n proxy._addCloseCallback(async () => {\n await client.close()\n })\n\n return proxy\n}\n\n/**\n * Create a FastMCP instance that proxies all requests to a remote MCP server.\n * The returned instance can be mounted onto a parent server via `parent.mount(proxy)`.\n *\n * Component lists (tools, resources, prompts) are kept in sync via:\n * - Change notifications from the backend (immediate resync)\n * - TTL-based lazy resync on each list request (configurable via `cacheTtl`, default 30 s)\n */\nexport async function createProxy(config: ProxyTransport, name?: string): Promise<FastMCP> {\n let transport: import('@modelcontextprotocol/sdk/shared/transport').Transport\n\n if (config.type === 'stdio') {\n const { StdioClientTransport } = await import('@modelcontextprotocol/sdk/client/stdio')\n transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n })\n } else {\n const { StreamableHTTPClientTransport } = await import(\n '@modelcontextprotocol/sdk/client/streamableHttp'\n )\n transport = new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: config.requestInit,\n })\n }\n\n const client = new Client(\n { name: name ?? 'fastmcp-proxy', version: '0.0.1' },\n { capabilities: {} },\n )\n\n await client.connect(transport)\n\n return buildProxyFromClient(client, { cacheTtl: config.cacheTtl, name })\n}\n","import { FastMCP } from '../FastMCP'\nimport type { ToolConfig } from '../FastMCP'\nimport { contextStore } from '../context'\nimport type { Component } from './components'\nimport type { Visibility } from './types'\n\nexport interface EntrypointConfig {\n name: string\n description: string\n title?: string\n}\n\nexport interface BackendToolConfig {\n name: string\n description: string\n title?: string\n /** Defaults to ['app']. Pass ['model', 'app'] to also expose to the LLM. */\n visibility?: Visibility[]\n}\n\nexport interface FastMCPAppOptions {\n name: string\n version?: string\n}\n\nexport class FastMCPApp {\n readonly server: FastMCP\n\n constructor(options: FastMCPAppOptions) {\n this.server = new FastMCP({ name: options.name, version: options.version })\n }\n\n /**\n * Register an entry-point tool.\n * Entry-points are visible to the LLM (visibility: ['model', 'app']) and\n * automatically linked to a generated ui:// resource URI.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entrypoint(config: EntrypointConfig, handler: (args?: any) => Component): void {\n const resourceUri = `ui://${config.name}`\n const toolConfig: ToolConfig = {\n name: config.name,\n description: config.description,\n ...(config.title !== undefined ? { title: config.title } : {}),\n ui: { visibility: ['model', 'app'], resourceUri },\n }\n this.server.tool(toolConfig, handler)\n // Stub resource so resources/read on the ui:// URI doesn't 404.\n // Replaced by the real UI runtime bundle when bundling is implemented.\n this.server.resource(\n { uri: resourceUri, mimeType: 'text/html;profile=mcp-app', name: config.name },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n }\n\n /**\n * Register a backend tool.\n * Backend tools are hidden from listTools by default (visibility: ['app']).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n backendTool(config: BackendToolConfig, handler: (args: any) => unknown): void {\n const visibility = config.visibility ?? ['app']\n const toolConfig: ToolConfig = {\n name: config.name,\n description: config.description,\n ...(config.title !== undefined ? { title: config.title } : {}),\n ui: { visibility },\n }\n this.server.tool(toolConfig, handler)\n }\n\n /**\n * Returns a reference to a tool that resolves to the correct external name\n * (including any mount prefix) when evaluated inside a request handler.\n * Call inside a handler function — not at definition time.\n */\n toolRef(name: string): string {\n const ctx = contextStore.getStore()\n if (!ctx) return name\n return ctx.resolveToolName(name)\n }\n}\n","import { contextStore } from '../context'\n\n/**\n * Resolve a logical tool name to its current external name inside a request\n * handler, accounting for any mount prefix applied by a parent server.\n *\n * Use this in providers that are built on bare FastMCP (not FastMCPApp) to\n * produce mount-prefix–aware action strings for Button components.\n */\nexport function actionRef(name: string): string {\n return contextStore.getStore()?.resolveToolName(name) ?? name\n}\n","import { runInNewContext } from 'node:vm'\nimport { FastMCP } from '../FastMCP'\nimport { ToolResult } from '../tool'\nimport { COMPONENT_CATALOG } from './components'\nimport * as Components from './components'\n\nexport class GenerativeUI {\n readonly server: FastMCP\n\n constructor() {\n this.server = new FastMCP({ name: 'generative-ui' })\n\n // Regular LLM tool — catalog lookup, always returns structured data\n this.server.tool(\n {\n name: 'search_components',\n description: 'List available UI components with their types and descriptions',\n },\n () => new ToolResult({\n content: [{ type: 'text', text: JSON.stringify(COMPONENT_CATALOG) }],\n }),\n )\n\n // LLM-visible tool — executes component code in an isolated sandbox\n this.server.tool(\n {\n name: 'generate_ui',\n description: 'Execute a UI component expression and return the component tree. Use search_components to discover available component APIs first.',\n inputSchema: {\n type: 'object',\n properties: {\n code: { type: 'string', description: 'A JavaScript expression using the component builders (Column, Text, Button, etc.) that evaluates to a component tree' },\n },\n required: ['code'],\n },\n },\n (args: Record<string, unknown>) => {\n const { code } = args as { code: string }\n // Sandbox: only the component builder functions are in scope — no Node globals\n const sandbox: Record<string, unknown> = { ...Components }\n delete sandbox['COMPONENT_CATALOG']\n\n try {\n // NOTE: vm.runInNewContext is NOT a true security sandbox — prototype chain\n // escapes are possible. Do not execute untrusted code in production.\n return runInNewContext(code, sandbox, { timeout: 2000 })\n } catch (err) {\n throw new Error(`[generate_ui] ${err instanceof Error ? err.message : String(err)}`)\n }\n },\n )\n }\n}\n","// ---------------------------------------------------------------------------\n// Component tree types\n// ---------------------------------------------------------------------------\n\nexport interface Component {\n type: string\n props?: Record<string, unknown>\n children?: Component[]\n}\n\n// If-node carries builder methods but they must be non-enumerable so\n// toEqual/JSON.stringify treat the node as a plain object.\nexport interface IfNode extends Component {\n type: 'if'\n branches: Array<{ condition: string; node: Component }>\n fallback?: Component\n elif(condition: string, node: Component): IfNode\n else(node: Component): Component\n}\n\n// ---------------------------------------------------------------------------\n// Component catalog — used by GenerativeUI.search_components\n// ---------------------------------------------------------------------------\n\nexport interface CatalogEntry {\n type: string\n description: string\n}\n\nexport const COMPONENT_CATALOG: CatalogEntry[] = [\n { type: 'column', description: 'Vertical stack layout. Props: gap, align, padding. Children: any components.' },\n { type: 'row', description: 'Horizontal stack layout. Props: gap, align, justify, wrap. Children: any components.' },\n { type: 'grid', description: 'CSS grid layout. Props: columns, gap. Children: any components.' },\n { type: 'text', description: 'Text display. Props: content (string or Rx), variant (heading|body|caption|code), color.' },\n { type: 'badge', description: 'Status badge. Props: text, color, variant.' },\n { type: 'table', description: 'Data table. Props: columns (string[]), rows (string[][]). No children.' },\n { type: 'chart-bar', description: 'Bar chart. Props: data (object[]), xKey, yKey, title.' },\n { type: 'chart-line', description: 'Line chart. Props: data (object[]), xKey, yKey, title.' },\n { type: 'chart-area', description: 'Area chart. Props: data (object[]), xKey, yKey, title.' },\n { type: 'chart-pie', description: 'Pie chart. Props: data (object[]), labelKey, valueKey, title.' },\n { type: 'input', description: 'Form text input. Props: name, label, type (text|email|number|password), placeholder, required.' },\n { type: 'select', description: 'Dropdown select. Props: name, label, options (string[] or {value,label}[]), required.' },\n { type: 'button', description: 'Clickable button. Props: label, action (tool name string), variant, disabled.' },\n { type: 'if', description: 'Conditional rendering. branches: [{condition, node}], fallback.' },\n { type: 'foreach', description: 'Dynamic list. Props: items (binding expression). Children: [template].' },\n { type: 'rx', description: 'Reactive value. Props: expression (client-side state binding). Embeddable as prop.' },\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction withChildren(type: string, props?: Record<string, unknown>, children?: Component[]): Component {\n const node: Component = { type }\n if (props && Object.keys(props).length > 0) node.props = props\n if (children && children.length > 0) node.children = children\n return node\n}\n\nfunction withProps(type: string, props: Record<string, unknown>): Component {\n return { type, props }\n}\n\n// ---------------------------------------------------------------------------\n// Layout\n// ---------------------------------------------------------------------------\n\nexport function Column(props?: Record<string, unknown>, children?: Component[]): Component {\n return withChildren('column', props, children)\n}\n\nexport function Row(props?: Record<string, unknown>, children?: Component[]): Component {\n return withChildren('row', props, children)\n}\n\nexport function Grid(props?: Record<string, unknown>, children?: Component[]): Component {\n return withChildren('grid', props, children)\n}\n\n// ---------------------------------------------------------------------------\n// Data display\n// ---------------------------------------------------------------------------\n\nexport function Text(content: string | Component, extraProps?: Record<string, unknown>): Component {\n return withProps('text', { content, ...extraProps })\n}\n\nexport function Badge(text: string, extraProps?: Record<string, unknown>): Component {\n return withProps('badge', { text, ...extraProps })\n}\n\nexport function Table(props: { columns: string[]; rows: string[][]; [key: string]: unknown }): Component {\n return withProps('table', props as Record<string, unknown>)\n}\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nexport function Bar(props: Record<string, unknown>): Component {\n return withProps('chart-bar', props)\n}\n\nexport function Line(props: Record<string, unknown>): Component {\n return withProps('chart-line', props)\n}\n\nexport function Area(props: Record<string, unknown>): Component {\n return withProps('chart-area', props)\n}\n\nexport function Pie(props: Record<string, unknown>): Component {\n return withProps('chart-pie', props)\n}\n\n// ---------------------------------------------------------------------------\n// Forms\n// ---------------------------------------------------------------------------\n\nexport function Input(props: Record<string, unknown>): Component {\n return withProps('input', props)\n}\n\nexport function Select(props: Record<string, unknown>): Component {\n return withProps('select', props)\n}\n\nexport function Button(props: Record<string, unknown>): Component {\n return withProps('button', props)\n}\n\n// ---------------------------------------------------------------------------\n// Control flow — If with non-enumerable builder methods\n// ---------------------------------------------------------------------------\n\nfunction makeIfNode(\n branches: Array<{ condition: string; node: Component }>,\n fallback?: Component,\n): IfNode {\n const node = { type: 'if' as const, branches, ...(fallback !== undefined ? { fallback } : {}) } as IfNode\n\n Object.defineProperty(node, 'elif', {\n enumerable: false,\n value(condition: string, child: Component): IfNode {\n return makeIfNode([...branches, { condition, node: child }], fallback)\n },\n })\n\n Object.defineProperty(node, 'else', {\n enumerable: false,\n value(child: Component): Component {\n return makeIfNode(branches, child)\n },\n })\n\n return node\n}\n\nexport function If(condition: string, then: Component, fallback?: Component): IfNode {\n return makeIfNode([{ condition, node: then }], fallback)\n}\n\n// ---------------------------------------------------------------------------\n// Dynamic list\n// ---------------------------------------------------------------------------\n\nexport function ForEach(items: string, template: Component): Component {\n return { type: 'foreach', props: { items }, children: [template] }\n}\n\n// ---------------------------------------------------------------------------\n// Reactive state binding\n// ---------------------------------------------------------------------------\n\nexport function Rx(expression: string): Component {\n return withProps('rx', { expression })\n}\n","import { FastMCP } from '../../FastMCP'\nimport { actionRef } from '../actionRef'\nimport { Column, Text, Button } from '../components'\n\nexport class Approval {\n readonly server: FastMCP\n\n constructor() {\n this.server = new FastMCP({ name: 'approval' })\n\n this.server.tool(\n {\n name: 'approval_request',\n description: 'Present a confirm/deny approval card to the user',\n inputSchema: {\n type: 'object',\n properties: {\n message: { type: 'string', description: 'The question or action to seek approval for' },\n },\n required: ['message'],\n },\n ui: { visibility: ['model', 'app'] },\n },\n (args: Record<string, unknown>) => {\n const message = (args.message as string) ?? 'Approve?'\n return Column({}, [\n Text(message),\n Button({ label: 'Confirm', action: actionRef('approval_confirm') }),\n Button({ label: 'Deny', action: actionRef('approval_deny'), variant: 'secondary' }),\n ])\n },\n )\n\n this.server.resource(\n { uri: 'ui://approval_request', mimeType: 'text/html;profile=mcp-app', name: 'approval_request' },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n\n this.server.tool(\n {\n name: 'approval_confirm',\n description: 'Record a confirmed approval decision',\n ui: { visibility: ['app'] },\n },\n () => ({ decision: 'approved' as const }),\n )\n\n this.server.tool(\n {\n name: 'approval_deny',\n description: 'Record a denied approval decision',\n ui: { visibility: ['app'] },\n },\n () => ({ decision: 'denied' as const }),\n )\n }\n}\n","import { FastMCP } from '../../FastMCP'\nimport { actionRef } from '../actionRef'\nimport { Row, Button } from '../components'\n\nexport class Choice {\n readonly server: FastMCP\n\n constructor() {\n this.server = new FastMCP({ name: 'choice' })\n\n this.server.tool(\n {\n name: 'choice_present',\n description: 'Present a list of options for the user to choose from',\n inputSchema: {\n type: 'object',\n properties: {\n question: { type: 'string', description: 'The question to ask the user' },\n options: { type: 'array', items: { type: 'string' }, description: 'The options to present' },\n },\n required: ['question', 'options'],\n },\n ui: { visibility: ['model', 'app'] },\n },\n (args: Record<string, unknown>) => {\n const options = (args.options as string[]) ?? []\n return Row(\n {},\n // Each button carries its option value as args so the host can\n // forward it to choice_select without extra state.\n options.map((opt) =>\n Button({ label: opt, action: actionRef('choice_select'), args: { option: opt } }),\n ),\n )\n },\n )\n\n this.server.resource(\n { uri: 'ui://choice_present', mimeType: 'text/html;profile=mcp-app', name: 'choice_present' },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n\n this.server.tool(\n {\n name: 'choice_select',\n description: \"Record the user's selection\",\n ui: { visibility: ['app'] },\n },\n (args: Record<string, unknown>) => ({ selected: args.option as string }),\n )\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { FastMCP } from '../../FastMCP'\nimport { ResourceResult } from '../../resource'\nimport { contextStore } from '../../context'\nimport { actionRef } from '../actionRef'\nimport { Column, Text, Button } from '../components'\n\nexport interface FileHandle {\n handle: string\n name: string\n mimeType: string\n data: Buffer\n}\n\nexport interface FileStorageAdapter {\n save(handle: string, file: FileHandle): void\n load(handle: string): FileHandle | undefined\n delete(handle: string): void\n}\n\nfunction makeInMemoryAdapter(): FileStorageAdapter {\n const store = new Map<string, FileHandle>()\n return {\n save: (handle, file) => store.set(handle, file),\n load: (handle) => store.get(handle),\n delete: (handle) => store.delete(handle),\n }\n}\n\nexport interface FileUploadOptions {\n storage?: FileStorageAdapter\n}\n\nconst SESSION_HANDLES_KEY = '__fastmcp_file_handles'\n\nexport class FileUpload {\n readonly server: FastMCP\n private readonly _storage: FileStorageAdapter\n\n constructor(options?: FileUploadOptions) {\n this._storage = options?.storage ?? makeInMemoryAdapter()\n this.server = new FastMCP({ name: 'file-upload' })\n\n const storage = this._storage\n\n this.server.tool(\n {\n name: 'file_upload_open',\n description: 'Open a file picker UI for the user to upload a file',\n inputSchema: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Instructions shown above the file picker' },\n },\n },\n ui: { visibility: ['model', 'app'] },\n },\n (args: Record<string, unknown>) => {\n return Column({}, [\n Text((args.prompt as string | undefined) ?? 'Upload a file'),\n Button({ label: 'Choose file', action: actionRef('file_upload_submit') }),\n ])\n },\n )\n\n this.server.tool(\n {\n name: 'file_upload_submit',\n description: 'Receive and store uploaded file bytes server-side',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'File name' },\n mimeType: { type: 'string', description: 'MIME type of the file' },\n data: { type: 'string', description: 'Base64-encoded file content' },\n },\n required: ['name', 'mimeType', 'data'],\n },\n ui: { visibility: ['app'] },\n },\n (args: Record<string, unknown>) => {\n const handle = randomUUID()\n const fileData = Buffer.from(args.data as string, 'base64')\n storage.save(handle, {\n handle,\n name: args.name as string,\n mimeType: args.mimeType as string,\n data: fileData,\n })\n\n // Track handle in session state and register cleanup on session close\n const ctx = contextStore.getStore()\n if (ctx) {\n const existing = (ctx.getState(SESSION_HANDLES_KEY) as string[] | undefined) ?? []\n ctx.setState(SESSION_HANDLES_KEY, [...existing, handle])\n ctx.onClose(() => storage.delete(handle))\n }\n\n const uri = `ui://files/${handle}`\n return { handle, uri }\n },\n )\n\n this.server.tool(\n {\n name: 'file_upload_delete',\n description: 'Delete a previously uploaded file by its handle',\n inputSchema: {\n type: 'object',\n properties: {\n handle: { type: 'string', description: 'The file handle returned by file_upload_submit' },\n },\n required: ['handle'],\n },\n ui: { visibility: ['app'] },\n },\n (args: Record<string, unknown>) => {\n const handle = args.handle as string\n storage.delete(handle)\n const ctx = contextStore.getStore()\n if (ctx) {\n const existing = (ctx.getState(SESSION_HANDLES_KEY) as string[] | undefined) ?? []\n ctx.setState(SESSION_HANDLES_KEY, existing.filter((h) => h !== handle))\n }\n return { deleted: handle }\n },\n )\n\n this.server.resource(\n { uri: 'ui://files/{handle}', name: 'uploaded-file', mimeType: 'application/octet-stream' },\n (params) => {\n const h = params?.handle\n if (!h) throw new Error('Missing file handle')\n const file = storage.load(h)\n if (!file) throw new Error(`File not found: ${h}`)\n const uri = `ui://files/${h}`\n if (file.mimeType.startsWith('text/')) {\n return new ResourceResult([{ uri, mimeType: file.mimeType, text: file.data.toString('utf8') }])\n }\n return new ResourceResult([{ uri, mimeType: file.mimeType, blob: file.data.toString('base64') }])\n },\n )\n }\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { FastMCP } from '../../FastMCP'\nimport { toJsonSchema } from '../../tool'\nimport { actionRef } from '../actionRef'\nimport { Column, Input, Select, Button } from '../components'\n\nexport interface FormInputOptions {\n name: string\n description: string\n schema: StandardSchemaV1\n}\n\ntype FieldSchema = Record<string, unknown>\n\nfunction buildField(fieldName: string, fieldSchema: FieldSchema, required: string[]) {\n const isRequired = required.includes(fieldName)\n const type = fieldSchema.type as string | undefined\n if (Array.isArray(fieldSchema.enum)) {\n return Select({ name: fieldName, label: fieldName, options: fieldSchema.enum as string[], required: isRequired })\n }\n if (type === 'number' || type === 'integer') {\n return Input({ name: fieldName, label: fieldName, type: 'number', required: isRequired })\n }\n return Input({ name: fieldName, label: fieldName, type: 'text', required: isRequired })\n}\n\nasync function validateWithSchema(\n schema: StandardSchemaV1,\n data: unknown,\n): Promise<{ valid: true; value: unknown } | { valid: false; errors: Record<string, string> }> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await (schema['~standard'].validate as (v: unknown) => Promise<any>)(data)\n if (result.issues && result.issues.length > 0) {\n const errors: Record<string, string> = {}\n for (const issue of result.issues) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const path = issue.path?.map((p: any) => String(typeof p === 'object' ? p.key : p)).join('.') ?? 'root'\n errors[path] = String(issue.message)\n }\n return { valid: false, errors }\n }\n return { valid: true, value: result.value }\n}\n\nexport class FormInput {\n readonly server: FastMCP\n\n constructor(options: FormInputOptions) {\n this.server = new FastMCP({ name: options.name })\n const { name, description, schema } = options\n const submitName = `${name}_submit`\n\n this.server.resource(\n { uri: `ui://${name}`, mimeType: 'text/html;profile=mcp-app', name },\n () => `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><!-- fastmcp ui-runtime placeholder --></body></html>`,\n )\n\n this.server.tool(\n { name, description, ui: { visibility: ['model', 'app'] } },\n async () => {\n // Use the shared extractor so Zod, Valibot, ArkType, etc. all work.\n const jsonSchema = await toJsonSchema(schema, `form \"${name}\"`)\n const properties = (jsonSchema.properties ?? {}) as Record<string, FieldSchema>\n const required = (jsonSchema.required ?? []) as string[]\n\n const fields = Object.entries(properties).map(([fieldName, fieldSchema]) =>\n buildField(fieldName, fieldSchema, required),\n )\n\n return Column({}, [...fields, Button({ label: 'Submit', action: actionRef(submitName) })])\n },\n )\n\n this.server.tool(\n {\n name: submitName,\n description: `Submit ${name} form data`,\n inputSchema: {\n type: 'object',\n properties: {\n data: { type: 'object', description: 'Form field values keyed by field name' },\n },\n required: ['data'],\n },\n ui: { visibility: ['app'] },\n },\n async (args: Record<string, unknown>) => {\n const result = await validateWithSchema(schema, args.data)\n if (!result.valid) {\n return { errors: result.errors }\n }\n return result.value\n },\n )\n }\n}\n"],"mappings":"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","names":["McpError","ErrorCode","McpError","ErrorCode","McpError","ErrorCode","ctx","randomUUID","randomUUID","randomUUID"]}