@poe-platform/safe-js 0.1.604 → 0.1.605
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.
- package/dist/safe-js/chunks/{chunk-HMJGGU6F.js → chunk-3XEB5VOF.js} +1 -1
- package/dist/safe-js/chunks/{chunk-HMJGGU6F.js.map → chunk-3XEB5VOF.js.map} +2 -2
- package/dist/safe-js/chunks/{chunk-CQHN2MZQ.js → chunk-KX5Y2HHX.js} +2 -2
- package/dist/safe-js/chunks/chunk-KX5Y2HHX.js.map +7 -0
- package/dist/safe-js/chunks/{cli-runtime-TURGGYT5.js → cli-runtime-EEHCUG52.js} +3 -3
- package/dist/safe-js/chunks/{mcp-KV554TH7.js → mcp-TNQ6HZC7.js} +3 -3
- package/dist/safe-js/cli.js +2 -2
- package/dist/safe-js/index.js +2 -2
- package/dist/safe-js/modules/mcp-transport.d.ts +5 -4
- package/dist/safe-js/modules/mcp.d.ts +5 -2
- package/package.json +2 -2
- package/dist/safe-js/chunks/chunk-CQHN2MZQ.js.map +0 -7
- package/dist/tiny-mcp-client/index.d.ts +0 -662
- package/dist/tiny-stdio-mcp-server/content/audio.d.ts +0 -15
- package/dist/tiny-stdio-mcp-server/content/convert.d.ts +0 -16
- package/dist/tiny-stdio-mcp-server/content/file-type.d.ts +0 -11
- package/dist/tiny-stdio-mcp-server/content/file.d.ts +0 -28
- package/dist/tiny-stdio-mcp-server/content/image.d.ts +0 -15
- package/dist/tiny-stdio-mcp-server/content/index.d.ts +0 -7
- package/dist/tiny-stdio-mcp-server/content/mime.d.ts +0 -7
- package/dist/tiny-stdio-mcp-server/content/remote.d.ts +0 -5
- package/dist/tiny-stdio-mcp-server/index.d.ts +0 -9
- package/dist/tiny-stdio-mcp-server/schema.d.ts +0 -20
- package/dist/tiny-stdio-mcp-server/server.d.ts +0 -35
- package/dist/tiny-stdio-mcp-server/types.d.ts +0 -256
- /package/dist/safe-js/chunks/{cli-runtime-TURGGYT5.js.map → cli-runtime-EEHCUG52.js.map} +0 -0
- /package/dist/safe-js/chunks/{mcp-KV554TH7.js.map → mcp-TNQ6HZC7.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../tiny-mcp-client/src/internal.ts", "../../../mcp-oauth/src/client/auth-store-session-store.ts", "../../../auth-store/src/encrypted-file-store.ts", "../../../auth-store/src/error-codes.ts", "../../../auth-store/src/keychain-store.ts", "../../../auth-store/src/create-secret-store.ts", "../../../mcp-oauth/src/resource-indicator.ts", "../../../mcp-oauth/src/client/default-oauth-client-provider.ts", "../../../mcp-oauth/src/client/loopback-authorization.ts", "../../../mcp-oauth/src/client/authorization-state.ts", "../../../mcp-oauth/src/client/pkce.ts", "../../../mcp-oauth/src/client/token-endpoint.ts", "../../../mcp-oauth/src/server/jwks-token-verifier.ts", "../../../tiny-mcp-client/src/oauth-discovery.ts", "../../src/modules/mcp-transport.ts"],
|
|
4
|
-
"sourcesContent": ["import { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n} from \"mcp-oauth\";\nimport type { Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"mcp-oauth\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"mcp-oauth\";\n\nexport type RequestId = number | string;\n\nexport interface Implementation {\n name: string;\n version: string;\n}\n\nexport interface ClientCapabilities {\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n requestTimeoutMs?: number;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: () => Root[] | Promise<Root[]>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentClientCapabilities: ClientCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly subscribedResourceUris = new Set<string>();\n private readonly activeProgressTokens = new Map<ProgressToken, number>();\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities === null\n ? null\n : structuredClone(this.currentServerCapabilities);\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo;\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport): Promise<InitializeResult> {\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n\n const transportClosedReason = transport.closed\n .then((closedEvent) => closedEvent.reason)\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n this.options.requestTimeoutMs,\n transportClosedReason\n );\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params) =>\n onSamplingRequest(params as CreateMessageParams)\n );\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async () => {\n if (onToolsChanged === undefined || this.currentServerCapabilities?.tools?.listChanged !== true) {\n return;\n }\n\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async () => {\n if (\n onResourcesChanged === undefined\n || this.currentServerCapabilities?.resources?.listChanged !== true\n ) {\n return;\n }\n\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\" || !this.subscribedResourceUris.has(uri)) {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async () => {\n if (\n onPromptsChanged === undefined\n || this.currentServerCapabilities?.prompts?.listChanged !== true\n ) {\n return;\n }\n\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (\n !isRequestId(progressToken) ||\n typeof progress !== \"number\" ||\n !this.activeProgressTokens.has(progressToken)\n ) {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n this.currentClientCapabilities = structuredClone(capabilities);\n\n try {\n const initializeResultValue = await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n });\n\n if (!isInitializeResult(initializeResultValue)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid initialize result\");\n }\n\n const initializeResult = initializeResultValue;\n\n if (initializeResult.protocolVersion !== MCP_PROTOCOL_VERSION) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n\n this.currentServerCapabilities = structuredClone(initializeResult.capabilities);\n this.currentServerInfo = { ...initializeResult.serverInfo };\n this.currentInstructions = initializeResult.instructions;\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async () => ({\n roots: await onRootsList(),\n }));\n }\n messageLayer.sendNotification(\"notifications/initialized\");\n this.currentState = \"ready\";\n\n return initializeResult;\n } catch (error) {\n if (this.transport === transport) {\n const reason = error instanceof Error ? error : new Error(String(error));\n messageLayer.dispose(reason);\n transport.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"disconnected\";\n }\n\n throw error;\n }\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}): Promise<{ tools: Tool[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"tools/list\", requestParams);\n if (!isToolsListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tools/list result\");\n }\n\n return result;\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n if (options.signal?.aborted) {\n throw options.signal.reason;\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n if (options.progressToken !== undefined) {\n this.activeProgressTokens.set(\n options.progressToken,\n (this.activeProgressTokens.get(options.progressToken) ?? 0) + 1\n );\n }\n\n try {\n let requestId: RequestId | undefined;\n let cancellationSent = false;\n const sendCancellationNotification = () => {\n if (requestId === undefined || cancellationSent) {\n return;\n }\n cancellationSent = true;\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n };\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n onTimeout: sendCancellationNotification,\n }).then((result) => {\n if (!isCallToolResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tool result\");\n }\n\n return result;\n });\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n sendCancellationNotification();\n if (requestId !== undefined) {\n messageLayer.cancelRequest(requestId, signal.reason);\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n } finally {\n if (options.progressToken !== undefined) {\n const activeCount = this.activeProgressTokens.get(options.progressToken);\n if (activeCount === 1) {\n this.activeProgressTokens.delete(options.progressToken);\n } else if (activeCount !== undefined) {\n this.activeProgressTokens.set(options.progressToken, activeCount - 1);\n }\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}\n ): Promise<{ resources: Resource[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/list\", requestParams);\n if (!isResourcesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/list result\");\n }\n\n return result;\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}\n ): Promise<{ resourceTemplates: ResourceTemplate[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/templates/list\", requestParams);\n if (!isResourceTemplatesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/templates/list result\");\n }\n\n return result;\n }\n\n async readResource(params: ReadResourceParams): Promise<{ contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const result = await messageLayer.sendRequest(\"resources/read\", params);\n if (!isReadResourceResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/read result\");\n }\n\n return result;\n }\n\n async subscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri });\n this.subscribedResourceUris.add(uri);\n }\n\n async unsubscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri });\n this.subscribedResourceUris.delete(uri);\n }\n\n async listPrompts(params: PaginatedParams = {}): Promise<{ prompts: Prompt[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const result = await messageLayer.sendRequest(\"prompts/get\", params);\n if (!isGetPromptResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid prompts/get result\");\n }\n\n return result;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n const result = await messageLayer.sendRequest(\"completion/complete\", params);\n if (!isCompleteResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid completion/complete result\");\n }\n\n return result;\n }\n\n async setLogLevel(level: LogLevel): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level });\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n if (this.currentClientCapabilities?.roots?.listChanged !== true) {\n throw new Error(\"Client did not advertise roots list changes\");\n }\n\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(\"ping\");\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool {\n name: string;\n title?: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n annotations?: ToolAnnotations;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface PaginatedResult {\n nextCursor?: string;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string;\n blob: string;\n}\n\nexport type ResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: ResourceContents;\n}\n\nexport type ContentItem = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\nexport interface Prompt {\n name: string;\n description?: string;\n arguments?: PromptArgument[];\n}\n\nexport interface PromptArgument {\n name: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n}\n\nexport interface Root {\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem | ContentItem[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n model: string;\n content: ContentItem | ContentItem[];\n role: \"user\" | \"assistant\";\n stopReason: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n dispose(reason?: Error): void;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n url: string;\n headers?: RequestInit[\"headers\"];\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n const stderrDecoder = new TextDecoder();\n child.stderr.on(\"data\", (chunk: unknown) => {\n const decoded =\n chunk instanceof Uint8Array\n ? stderrDecoder.decode(chunk, { stream: true })\n : `${stderrDecoder.decode()}${String(chunk)}`;\n this.appendStderrOutput(decoded);\n });\n child.stderr.once(\"end\", () => {\n this.appendStderrOutput(stderrDecoder.decode());\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n private appendStderrOutput(chunk: string): void {\n if (chunk.length === 0) {\n return;\n }\n\n this.stderrOutput += chunk;\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly url: string;\n private readonly headers: HeadersInit;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly openSseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n\n constructor({\n url,\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n }: HttpTransportOptions) {\n this.url = url;\n this.headers = headers;\n this.fetchImpl = fetchImpl;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.abortInFlightFetches();\n this.cancelOpenSseReaders();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n void this.closeWithSessionTermination(reason);\n }\n\n private async closeWithSessionTermination(reason: Error): Promise<void> {\n let closeReason = reason;\n if (this.sessionId !== undefined) {\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n try {\n await this.sendSessionTerminationRequest(sessionId);\n } catch (error) {\n closeReason = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason: closeReason });\n }\n\n private abortInFlightFetches(): void {\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort();\n }\n\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenSseReaders(): void {\n for (const reader of this.openSseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openSseReaders.clear();\n }\n\n private async fetchWithAbort(input: string | URL, init: RequestInit): Promise<Response> {\n if (this.disposed) {\n throw new Error(\"HTTP transport disposed\");\n }\n\n const abortController = new AbortController();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await this.fetchImpl(input, {\n ...init,\n signal: abortController.signal,\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const parsed = parseJsonRpcMessage(line);\n const post = this.sendPost(line);\n if (\n (parsed.type === \"request\" && parsed.message.method === \"initialize\") ||\n (parsed.type === \"notification\" && parsed.message.method === \"notifications/initialized\")\n ) {\n await post;\n } else {\n void post.catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n }\n }\n\n private async sendPost(line: string): Promise<void> {\n const hasSessionId = this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n method: \"POST\",\n createHeaders: () => this.createPostHeaders(),\n body: line,\n });\n\n if (this.disposed) {\n await response.body?.cancel();\n return;\n }\n\n if (hasSessionId && response.status === 404) {\n this.sessionId = undefined;\n this.dispose(new Error(\"HTTP transport session expired (404 response)\"));\n return;\n }\n\n await this.throwForPostHttpError(response);\n if (this.disposed) {\n await response.body?.cancel();\n return;\n }\n this.captureSessionId(response);\n this.maybeOpenGetSseStream();\n void this.forwardResponseMessages(response).catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private async createPostHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createGetHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n }\n if (this.lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", this.lastEventId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createDeleteHeaders(sessionId: string): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n return this.authorizeRequestHeaders(headers);\n }\n\n private async authorizeRequestHeaders(headers: Headers): Promise<Headers> {\n await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers,\n fetch: this.fetchImpl,\n });\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n if (this.sessionId !== undefined && this.sessionId !== sessionId) {\n throw new Error(\"HTTP transport response changed active session ID\");\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private async sendSessionTerminationRequest(sessionId: string): Promise<void> {\n const response = await this.fetchImpl(this.url, {\n method: \"DELETE\",\n headers: await this.createDeleteHeaders(sessionId),\n });\n\n if (response.status === 405 || response.ok) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport DELETE failed (${statusDescriptor})`\n : `HTTP transport DELETE failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: () => this.createGetHeaders(),\n });\n\n if (response.status === 405) {\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n if (response.status === 404) {\n this.sessionId = undefined;\n throw new Error(\"HTTP transport session expired (GET 404 response)\");\n }\n\n if (!response.ok) {\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport GET failed (${statusDescriptor})`\n : `HTTP transport GET failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n if (contentType.toLowerCase().includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n return;\n }\n\n return;\n }\n\n private async throwForPostHttpError(response: Response): Promise<void> {\n if (response.status < 400) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, {\n resourceMetadataUrl,\n });\n const result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url),\n response: response.clone(),\n challenge,\n discovery,\n fetch: this.fetchImpl,\n });\n\n if (result.action === \"retry\") {\n return true;\n }\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n return false;\n }\n\n private async forwardResponseMessages(response: Response): Promise<void> {\n if (response.status === 202) {\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n const normalizedContentType = contentType.toLowerCase();\n if (normalizedContentType.includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n return;\n }\n\n if (normalizedContentType.includes(\"application/json\")) {\n await this.forwardJsonResponseMessage(response);\n return;\n }\n\n throw new Error(\"HTTP transport POST returned an unsupported response content type\");\n }\n\n private async forwardSseResponseMessages(response: Response): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser();\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n this.openSseReaders.add(reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages);\n this.lastEventId = parser.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk));\n this.lastEventId = parser.lastEventId;\n }\n\n this.writeSseMessages(parser.flush());\n this.lastEventId = parser.lastEventId;\n } finally {\n this.openSseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(response: Response): Promise<void> {\n const payload = await response.text();\n if (payload.length === 0) {\n return;\n }\n\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[]): void {\n for (const message of messages) {\n this.writeReadableLine(message.data);\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n method: \"GET\" | \"POST\";\n createHeaders: () => Promise<Headers>;\n body?: BodyInit;\n }): Promise<Response> {\n const request = async (): Promise<Response> =>\n this.fetchWithAbort(this.url, {\n method: input.method,\n headers: await input.createHeaders(),\n body: input.body,\n });\n\n let response = await request();\n if (await this.maybeHandleUnauthorizedResponse(response)) {\n response = await request();\n }\n\n const oauthError = this.oauthProvider === undefined\n ? null\n : this.readOAuthChallengeError(response);\n if (oauthError !== null) {\n throw oauthError;\n }\n\n return response;\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n const decoder = new TextDecoder();\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer +=\n chunk instanceof Uint8Array\n ? decoder.decode(chunk, { stream: true })\n : decoder.decode() + String(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n buffer += decoder.decode();\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n}\n\nexport class SseParser {\n private buffer = \"\";\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n\n while (true) {\n const newlineIndex = this.buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = normalizeLine(this.buffer.slice(0, newlineIndex));\n this.buffer = this.buffer.slice(newlineIndex + 1);\n this.consumeLine(line, messages);\n }\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n const messages: ParsedSseMessage[] = [];\n\n if (this.buffer.length > 0) {\n this.consumeLine(normalizeLine(this.buffer), messages);\n this.buffer = \"\";\n }\n\n this.emitEvent(messages);\n return messages;\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || eventType !== \"message\") {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n }\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\ninterface ActiveIncomingRequest {\n cancelled: boolean;\n}\n\nexport interface JsonRpcRequestOptions {\n timeoutMs?: number;\n onRequestId?: (requestId: RequestId) => void;\n onTimeout?: (requestId: RequestId) => void;\n}\n\ninterface JsonRpcRequestContext {\n id: RequestId;\n method: string;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: JsonRpcRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>\n ) {\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\n }\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n options.onTimeout?.(id);\n reject(new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n cancelRequest(requestId: RequestId, reason: unknown): boolean {\n const pending = this.pendingRequests.get(requestId);\n if (pending === undefined) {\n return false;\n }\n\n this.pendingRequests.delete(requestId);\n clearTimeout(pending.timeout);\n pending.reject(reason);\n return true;\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(): Promise<Error> {\n const streamClosedError = new Error(\"JSON-RPC input stream closed\");\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n clearTimeout(pending.timeout);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n const activeRequest: ActiveIncomingRequest = {\n cancelled: false,\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.cancelled = true;\n this.activeIncomingRequests.delete(requestId);\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isInitializeResult(value: unknown): value is InitializeResult {\n if (!isObjectRecord(value) || typeof value.protocolVersion !== \"string\") {\n return false;\n }\n\n if (!isServerCapabilities(value.capabilities)) {\n return false;\n }\n\n if (\n !isObjectRecord(value.serverInfo)\n || typeof value.serverInfo.name !== \"string\"\n || value.serverInfo.name.length === 0\n || typeof value.serverInfo.version !== \"string\"\n || value.serverInfo.version.length === 0\n ) {\n return false;\n }\n\n return value.instructions === undefined || typeof value.instructions === \"string\";\n}\n\nfunction isServerCapabilities(value: unknown): value is ServerCapabilities {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n for (const capability of [\"prompts\", \"resources\", \"tools\", \"logging\", \"completions\", \"experimental\"] as const) {\n if (value[capability] !== undefined && !isObjectRecord(value[capability])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (!isObjectRecord(value) || !Array.isArray(value.content)) {\n return false;\n }\n\n if (value.structuredContent !== undefined && !isObjectRecord(value.structuredContent)) {\n return false;\n }\n\n if (value.isError !== undefined && typeof value.isError !== \"boolean\") {\n return false;\n }\n\n return value.content.every(isContentItem);\n}\n\nfunction isToolsListResult(value: unknown): value is { tools: Tool[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.tools)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourcesListResult(value: unknown): value is { resources: Resource[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resources)\n && value.resources.every(isResource)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourceTemplatesListResult(\n value: unknown\n): value is { resourceTemplates: ResourceTemplate[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resourceTemplates)\n && value.resourceTemplates.every(isResourceTemplate)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isReadResourceResult(value: unknown): value is { contents: ResourceContents[] } {\n return isObjectRecord(value)\n && Array.isArray(value.contents)\n && value.contents.every(isResourceContents);\n}\n\nfunction isGetPromptResult(value: unknown): value is GetPromptResult {\n return isObjectRecord(value)\n && (value.description === undefined || typeof value.description === \"string\")\n && Array.isArray(value.messages)\n && value.messages.every(isPromptMessage);\n}\n\nfunction isCompleteResult(value: unknown): value is CompleteResult {\n return isObjectRecord(value)\n && isObjectRecord(value.completion)\n && Array.isArray(value.completion.values)\n && value.completion.values.every((candidate) => typeof candidate === \"string\")\n && (value.completion.hasMore === undefined || typeof value.completion.hasMore === \"boolean\")\n && (value.completion.total === undefined || typeof value.completion.total === \"number\");\n}\n\nfunction isResource(value: unknown): value is Resource {\n return isObjectRecord(value)\n && typeof value.uri === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\")\n && (value.size === undefined || typeof value.size === \"number\");\n}\n\nfunction isResourceTemplate(value: unknown): value is ResourceTemplate {\n return isObjectRecord(value)\n && typeof value.uriTemplate === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\");\n}\n\nfunction isResourceContents(value: unknown): value is ResourceContents {\n if (!isObjectRecord(value) || typeof value.uri !== \"string\") {\n return false;\n }\n\n if (value.mimeType !== undefined && typeof value.mimeType !== \"string\") {\n return false;\n }\n\n const hasText = value.text !== undefined;\n const hasBlob = value.blob !== undefined;\n\n if (!hasText && !hasBlob) {\n return false;\n }\n\n return (!hasText || typeof value.text === \"string\")\n && (!hasBlob || typeof value.blob === \"string\");\n}\n\nfunction isPromptMessage(value: unknown): value is PromptMessage {\n return isObjectRecord(value)\n && (value.role === \"user\" || value.role === \"assistant\")\n && isContentItem(value.content);\n}\n\nfunction isContentItem(value: unknown): value is ContentItem {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\" || value.type === \"audio\") {\n return typeof value.data === \"string\" && typeof value.mimeType === \"string\";\n }\n\n if (value.type !== \"resource\" || !isObjectRecord(value.resource)) {\n return false;\n }\n\n return isResourceContents(value.resource);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (typeof value.code !== \"number\" || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { createSecretStore, type CreateSecretStoreInput, type SecretStore } from \"auth-store\";\nimport type { OAuthSessionStore, StoredOAuthSession } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\ninterface StoredOAuthClient {\n clientId: string;\n clientSecret?: string;\n}\n\nexport interface OAuthClientStore {\n load(issuer: string): Promise<StoredOAuthClient | null>;\n save(issuer: string, client: StoredOAuthClient): Promise<void>;\n clear(issuer: string): Promise<void>;\n}\n\nexport function createAuthStoreSessionStore(\n options: CreateSecretStoreInput = {}\n): OAuthSessionStore {\n return {\n async load(resource: string): Promise<StoredOAuthSession | null> {\n const store = createResourceSecretStore(resource, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n if (isStoredOAuthSession(parsed)) {\n return parsed;\n }\n\n throw new Error(\"Stored OAuth session must match the expected shape\");\n },\n async save(resource: string, session: StoredOAuthSession): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.set(JSON.stringify(session));\n },\n async clear(resource: string): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.delete();\n }\n };\n}\n\nexport function createAuthStoreClientStore(options: CreateSecretStoreInput): OAuthClientStore {\n return {\n async load(issuer: string): Promise<StoredOAuthClient | null> {\n const store = createIssuerSecretStore(issuer, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n const clientId = isObjectRecord(parsed) ? getOwnString(parsed, \"clientId\") : undefined;\n if (clientId !== undefined) {\n const client: Record<string, unknown> = { clientId };\n if (\n isObjectRecord(parsed) &&\n Object.prototype.hasOwnProperty.call(parsed, \"clientSecret\")\n ) {\n client.clientSecret = getOwnEntry(parsed, \"clientSecret\");\n }\n\n return client as unknown as StoredOAuthClient;\n }\n\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer: string, client: StoredOAuthClient): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer: string): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.delete();\n }\n };\n}\n\nfunction createNamedSecretStore(\n key: string,\n options: CreateSecretStoreInput,\n defaults: { salt: string; directory: string; service: string; accountPrefix: string }\n): SecretStore {\n const hash = crypto.createHash(\"sha256\").update(key).digest(\"hex\");\n const configuredFilePath = options.fileStore?.filePath;\n const parsedFilePath = configuredFilePath === undefined ? null : path.parse(configuredFilePath);\n\n const fileStore = {\n ...options.fileStore,\n filePath:\n parsedFilePath === null\n ? undefined\n : path.join(\n parsedFilePath.dir,\n `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n ),\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory: options.fileStore?.defaultDirectory || defaults.directory,\n defaultFileName:\n parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`\n };\n\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\n\nfunction createResourceSecretStore(resource: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(canonicalizeResourceIndicator(resource), options, {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\"\n });\n}\n\nfunction createIssuerSecretStore(issuer: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(issuer, options, {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\"\n });\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnString(record: Record<string, unknown>, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isStoredOAuthSession(value: unknown): value is StoredOAuthSession {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resource\") &&\n isNonBlankOwnString(value, \"authorizationServer\") &&\n isStoredOAuthClient(getOwnEntry(value, \"client\")) &&\n isStoredOAuthDiscovery(getOwnEntry(value, \"discovery\")) &&\n isStoredOAuthTokensOrMissing(getOwnEntry(value, \"tokens\"))\n );\n}\n\nfunction isStoredOAuthClient(value: unknown): value is StoredOAuthClient {\n if (!isObjectRecord(value) || !isNonBlankOwnString(value, \"clientId\")) {\n return false;\n }\n\n const clientSecret = getOwnEntry(value, \"clientSecret\");\n return (\n clientSecret === undefined ||\n (typeof clientSecret === \"string\" && clientSecret.trim().length > 0)\n );\n}\n\nfunction isStoredOAuthDiscovery(value: unknown): value is StoredOAuthSession[\"discovery\"] {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resourceMetadataUrl\") &&\n isObjectRecord(getOwnEntry(value, \"resourceMetadata\")) &&\n isObjectRecord(getOwnEntry(value, \"authorizationServerMetadata\"))\n );\n}\n\nfunction isStoredOAuthTokensOrMissing(value: unknown): value is StoredOAuthSession[\"tokens\"] {\n if (value === undefined) {\n return true;\n }\n\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!isNonBlankOwnString(value, \"accessToken\") || getOwnString(value, \"tokenType\") !== \"Bearer\") {\n return false;\n }\n\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n if (\n expiresAt !== null &&\n (typeof expiresAt !== \"number\" ||\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime()))\n ) {\n return false;\n }\n\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n if (\n refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" || refreshToken.trim().length === 0)\n ) {\n return false;\n }\n\n const scope = getOwnEntry(value, \"scope\");\n return scope === undefined || (typeof scope === \"string\" && scope.trim().length > 0);\n}\n\nfunction isNonBlankOwnString(record: Record<string, unknown>, key: string): boolean {\n const value = getOwnString(record, key);\n return value !== undefined && value.trim().length > 0;\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, randomUUID, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport type { SecretStore } from \"./types.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly symbolicLinkCheckStartPath: string | null;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n if (input.filePath === undefined) {\n const homeDirectory = (input.getHomeDirectory ?? homedir)();\n const defaultDirectory = input.defaultDirectory ?? \".auth-store\";\n const defaultFileName = input.defaultFileName ?? \"credentials.enc\";\n assertSafeDefaultDirectory(defaultDirectory);\n assertSafeDefaultFileName(defaultFileName);\n this.filePath = path.join(\n homeDirectory,\n defaultDirectory,\n defaultFileName\n );\n this.symbolicLinkCheckStartPath = resolveDefaultDirectoryCheckStart(\n homeDirectory,\n defaultDirectory\n );\n } else {\n this.filePath = input.filePath;\n this.symbolicLinkCheckStartPath = null;\n }\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async get(): Promise<string | null> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n return null;\n }\n }\n\n async set(value: string): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const temporaryPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;\n let temporaryCreated = false;\n\n try {\n await this.assertCredentialPathHasNoSymbolicLinks(temporaryPath);\n await this.fs.writeFile(temporaryPath, JSON.stringify(document), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: ENCRYPTION_FILE_MODE\n });\n temporaryCreated = true;\n await this.fs.chmod(temporaryPath, ENCRYPTION_FILE_MODE);\n await this.fs.rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated || !isAlreadyExistsError(error)) {\n await removeIfPresent(this.fs, temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async delete(): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private async assertCredentialPathHasNoSymbolicLinks(targetPath: string): Promise<void> {\n const resolvedPath = path.resolve(targetPath);\n const protectedPaths = getProtectedCredentialPaths(\n resolvedPath,\n this.symbolicLinkCheckStartPath\n );\n\n for (const currentPath of protectedPaths) {\n try {\n const stats = await this.fs.lstat(currentPath);\n if (stats.isSymbolicLink()) {\n throw new Error(`Refusing to use encrypted credential path through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n const retryableKeyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt).catch((error) => {\n if (this.keyPromise === retryableKeyPromise) {\n this.keyPromise = null;\n }\n throw error;\n });\n this.keyPromise = retryableKeyPromise;\n }\n return this.keyPromise;\n }\n}\n\nfunction resolveDefaultDirectoryCheckStart(\n homeDirectory: string,\n defaultDirectory: string\n): string {\n const [firstSegment] = defaultDirectory.split(/[\\\\/]+/).filter(Boolean);\n return path.resolve(homeDirectory, firstSegment ?? \".\");\n}\n\nfunction getProtectedCredentialPaths(\n resolvedPath: string,\n symbolicLinkCheckStartPath: string | null\n): string[] {\n if (symbolicLinkCheckStartPath === null) {\n return getExplicitProtectedCredentialPaths(resolvedPath);\n }\n\n const resolvedStartPath = path.resolve(symbolicLinkCheckStartPath);\n if (!isPathInsideOrEqual(resolvedPath, resolvedStartPath)) {\n return [path.dirname(resolvedPath), resolvedPath];\n }\n\n const protectedPaths = [resolvedStartPath];\n let currentPath = resolvedStartPath;\n for (const segment of path.relative(resolvedStartPath, resolvedPath).split(path.sep).filter(Boolean)) {\n currentPath = path.join(currentPath, segment);\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction assertSafeDefaultDirectory(defaultDirectory: string): void {\n if (path.isAbsolute(defaultDirectory) || path.win32.isAbsolute(defaultDirectory)) {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n\n for (const segment of splitPathSegments(defaultDirectory)) {\n if (segment === \"..\") {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n }\n}\n\nfunction assertSafeDefaultFileName(defaultFileName: string): void {\n if (\n defaultFileName.trim().length === 0 ||\n defaultFileName === \".\" ||\n defaultFileName === \"..\" ||\n splitPathSegments(defaultFileName).length !== 1\n ) {\n throw new Error(\"defaultFileName must be a file name without path separators\");\n }\n}\n\nfunction splitPathSegments(value: string): string[] {\n return value\n .split(\"/\")\n .flatMap((segment) => segment.split(\"\\\\\"))\n .filter((segment) => segment.length > 0);\n}\n\nfunction getExplicitProtectedCredentialPaths(resolvedPath: string): string[] {\n const parsed = path.parse(resolvedPath);\n const segments = resolvedPath\n .slice(parsed.root.length)\n .split(path.sep)\n .filter((segment) => segment.length > 0);\n if (segments.length <= 1) {\n return [resolvedPath];\n }\n\n const protectedPaths: string[] = [];\n let currentPath = parsed.root;\n for (const [index, segment] of segments.entries()) {\n currentPath = path.join(currentPath, segment);\n if (index === 0) {\n continue;\n }\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction isPathInsideOrEqual(childPath: string, parentPath: string): boolean {\n const relativePath = path.relative(parentPath, childPath);\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nasync function removeIfPresent(fileSystem: EncryptedFileStoreFileSystem, filePath: string): Promise<void> {\n try {\n await fileSystem.unlink(filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = JSON.stringify([machineIdentity.hostname, machineIdentity.username, salt]);\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise.catch((error) => {\n if (derivedKeyCache.get(cacheKey) === keyPromise) {\n derivedKeyCache.delete(cacheKey);\n }\n throw error;\n });\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n const version = getOwnEntry(parsed, \"version\");\n const iv = getOwnEntry(parsed, \"iv\");\n const authTag = getOwnEntry(parsed, \"authTag\");\n const ciphertext = getOwnEntry(parsed, \"ciphertext\");\n if (version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof iv !== \"string\" ||\n typeof authTag !== \"string\" ||\n typeof ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version,\n iv,\n authTag,\n ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import { spawn } from \"node:child_process\";\nimport type { SecretStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface KeychainCommandOptions {\n stdin?: string;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service.trim();\n this.account = input.account.trim();\n if (this.service.length === 0) {\n throw new Error(\"Keychain service must not be empty\");\n }\n if (this.account.length === 0) {\n throw new Error(\"Keychain account must not be empty\");\n }\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0) {\n return stripTrailingLineBreak(getCommandOutput(result, \"stdout\"));\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async set(value: string): Promise<void> {\n if (value.includes(\"\\n\") || value.includes(\"\\r\")) {\n throw new Error(\"Keychain secrets cannot contain line breaks\");\n }\n\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-U\",\n \"-w\",\n value\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (getCommandExitCode(result) !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string,\n options?: KeychainCommandOptions\n ): Promise<KeychainCommandResult> {\n try {\n if (options === undefined) {\n return await this.runCommand(SECURITY_CLI, args);\n }\n return await this.runCommand(SECURITY_CLI, args, options);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [options?.stdin === undefined ? \"ignore\" : \"pipe\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let stdinErrorMessage: string | undefined;\n const appendStderr = (message: string): void => {\n stderr = stderr.length === 0\n ? message\n : `${stderr}${stderr.endsWith(\"\\n\") ? \"\" : \"\\n\"}${message}`;\n };\n const appendStdinError = (): void => {\n if (stdinErrorMessage === undefined) {\n return;\n }\n\n appendStderr(stdinErrorMessage);\n stdinErrorMessage = undefined;\n };\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n if (options?.stdin !== undefined) {\n child.stdin?.once(\"error\", (error) => {\n stdinErrorMessage = error instanceof Error ? error.message : String(error);\n });\n child.stdin?.end(options.stdin);\n }\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n appendStdinError();\n appendStderr(message);\n resolve({\n stdout,\n stderr,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n appendStdinError();\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n return getCommandExitCode(result) === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE;\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const exitCode = getCommandExitCode(result);\n const details =\n getCommandOutput(result, \"stderr\").trim()\n || getCommandOutput(result, \"stdout\").trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${exitCode}`);\n}\n\nfunction getCommandExitCode(result: KeychainCommandResult): number {\n const value = getOwnEntry(result, \"exitCode\");\n return typeof value === \"number\" && Number.isInteger(value) ? value : 1;\n}\n\nfunction getCommandOutput(\n result: KeychainCommandResult,\n key: \"stdout\" | \"stderr\"\n): string {\n const value = getOwnEntry(result, key);\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\nfunction resolveBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? getOwnEnvValue(input.env, envVar) ?? getOwnEnvValue(process.env, envVar);\n const backend = configuredBackend?.trim();\n\n if (backend === \"keychain\") {\n return \"keychain\";\n }\n\n if (backend === undefined || backend === \"file\") {\n return \"file\";\n }\n\n throw new Error(`Unsupported auth store backend: ${backend}`);\n}\n\nfunction getOwnEnvValue(\n env: NodeJS.ProcessEnv | undefined,\n key: string\n): string | undefined {\n return env !== undefined && Object.prototype.hasOwnProperty.call(env, key)\n ? env[key]\n : undefined;\n}\n", "export function canonicalizeResourceIndicator(value: string | URL): string {\n let url: URL;\n try {\n url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n } catch {\n throw new Error(\"Resource indicator must be an absolute URL\");\n }\n url.hash = \"\";\n return url.toString();\n}\n", "import { URL } from \"node:url\";\nimport type {\n DefaultOAuthClientProviderOptions,\n OAuthAuthorizationServerMetadata,\n OAuthClientMetadata,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n StoredOAuthSession,\n StoredOAuthTokens\n} from \"./types.js\";\nimport {\n createAuthStoreClientStore,\n createAuthStoreSessionStore\n} from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport {\n exchangeAuthorizationCode,\n OAuthError,\n refreshAccessToken,\n isRetryableOAuthError,\n readOAuthJsonObjectResponse\n} from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\nexport function createOAuthClientProvider(\n options: OAuthClientProviderOptions\n): OAuthClientProvider {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n\n return createDefaultOAuthClientProvider(options);\n}\n\nexport function createDefaultOAuthClientProvider(\n options: DefaultOAuthClientProviderOptions\n): OAuthClientProvider {\n const sessionStore = options.sessionStore ?? createAuthStoreSessionStore(options.authStore);\n const clientStore =\n options.authStore === undefined ? null : createAuthStoreClientStore(options.authStore);\n const now = options.now ?? Date.now;\n const registeredClients = new Map<string, StoredOAuthSession[\"client\"] | null>();\n const refreshPromises = new Map<string, Promise<StoredOAuthSession | null>>();\n const authorizationPromises = new Map<string, Promise<StoredOAuthSession>>();\n\n return {\n async authorizeRequest(input): Promise<void> {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false);\n const accessToken = session?.tokens?.accessToken;\n if (\n session === null ||\n accessToken === undefined ||\n session.tokens === undefined ||\n isExpired(session.tokens, now)\n ) {\n return;\n }\n\n assertRequestMatchesResource(requestUrl, session.resource);\n\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n },\n\n async handleUnauthorized(input) {\n try {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const forceRefresh =\n hasCachedAccessToken(await loadSession(resource)) &&\n input.challenge?.params.error === \"invalid_token\";\n const session = await ensureAuthorizedSession(\n resource,\n {\n ...input.discovery,\n resource\n },\n input.fetch,\n true,\n forceRefresh\n );\n\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" } as const;\n }\n\n return { action: \"retry\" } as const;\n } catch (error) {\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error))\n } as const;\n }\n }\n };\n\n async function ensureAuthorizedSession(\n resource: string,\n discovery: OAuthDiscoveryResult | undefined,\n fetch: OAuthMetadataFetch,\n allowInteractive: boolean,\n forceRefresh = false\n ): Promise<StoredOAuthSession | null> {\n const canonicalResource = canonicalizeResourceIndicator(resource);\n let session = await loadSession(canonicalResource);\n const sessionDiscovery = resolveDiscovery(discovery, session);\n\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n\n if (\n session?.tokens?.refreshToken !== undefined &&\n sessionDiscovery !== undefined &&\n (forceRefresh || isExpired(session.tokens, now))\n ) {\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n\n if (forceRefresh && session?.tokens !== undefined) {\n session = clearSessionTokens(session);\n await saveSession(canonicalResource, session);\n }\n\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch);\n }\n\n async function refreshSession(\n resource: string,\n session: StoredOAuthSession,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession | null> {\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n\n const inFlight = refreshPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n try {\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n\n let refreshAttempted = false;\n let refreshedTokens: StoredOAuthTokens;\n\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch,\n now\n });\n break;\n } catch (error) {\n if (error instanceof OAuthError && error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n\n if (\n shouldReRegisterStoredDynamicClient(\n error,\n await loadRegisteredClient(discovery.authorizationServer),\n false\n )\n ) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n\n throw error;\n }\n }\n\n const updatedSession: StoredOAuthSession = {\n ...session,\n tokens: {\n ...refreshedTokens,\n refreshToken: refreshedTokens.refreshToken ?? session.tokens.refreshToken\n },\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, updatedSession);\n return updatedSession;\n } finally {\n refreshPromises.delete(resource);\n }\n })();\n\n refreshPromises.set(resource, promise);\n return promise;\n }\n\n async function authorizeSession(\n resource: string,\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession> {\n const inFlight = authorizationPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n openBrowser: options.browser.openBrowser,\n readLine: options.browser.readLine,\n createServer: options.browser.createServer,\n landingPage: options.browser.landingPage\n });\n let resolvedClient: ResolvedOAuthClient | null = null;\n\n try {\n resolvedClient = await resolveClient(\n currentSession,\n discovery,\n loopback.redirectUri,\n fetch\n );\n const sessionWithoutTokens: StoredOAuthSession = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, sessionWithoutTokens);\n\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata: getClientMetadata(options.client)\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch,\n now\n });\n\n const session: StoredOAuthSession = {\n ...sessionWithoutTokens,\n tokens\n };\n\n await saveSession(resource, session);\n return session;\n } catch (error) {\n if (shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n throw error;\n } finally {\n loopback.close();\n }\n }\n })();\n\n const finalPromise = promise.finally(() => {\n authorizationPromises.delete(resource);\n });\n authorizationPromises.set(resource, finalPromise);\n return finalPromise;\n }\n\n async function resolveClient(\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n redirectUri: string,\n fetch: OAuthMetadataFetch\n ): Promise<ResolvedOAuthClient> {\n const configuredClient = normalizeConfiguredClient(options.client);\n\n if (options.client.mode === \"static\") {\n if (configuredClient === null) {\n throw new Error(\"OAuth client_id must not be blank\");\n }\n\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const registrationEndpoint = getOwnString(\n discovery.authorizationServerMetadata,\n \"registration_endpoint\"\n );\n if (registrationEndpoint === undefined && configuredClient !== null) {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const storedClient = await loadRegisteredClient(discovery.authorizationServer);\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient\n };\n }\n\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n const isConfiguredStaticFallback =\n configuredClient !== null &&\n existingSession.client.clientId === configuredClient.clientId &&\n existingSession.client.clientSecret === configuredClient.clientSecret;\n\n if (!isConfiguredStaticFallback) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n }\n\n const registrationBody = buildClientRegistrationBody(\n getClientMetadata(options.client),\n redirectUri\n );\n const response = await fetch(registrationEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(registrationBody)\n });\n const payload = await readOAuthJsonObjectResponse(response);\n const clientId = getOwnString(payload, \"client_id\");\n\n if (clientId === undefined || clientId.trim().length === 0) {\n throw new Error(\"OAuth client registration response missing client_id\");\n }\n\n const clientSecret = getOwnString(payload, \"client_secret\");\n const registeredClient = {\n clientId: clientId.trim(),\n clientSecret:\n clientSecret !== undefined && clientSecret.trim().length > 0\n ? clientSecret.trim()\n : undefined\n };\n await saveRegisteredClient(discovery.authorizationServer, registeredClient);\n\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: registeredClient\n };\n }\n\n async function loadSession(resource: string): Promise<StoredOAuthSession | null> {\n return normalizeLoadedSession(await sessionStore.load(resource));\n }\n\n async function saveSession(resource: string, session: StoredOAuthSession): Promise<void> {\n await sessionStore.save(resource, session);\n }\n\n async function clearSession(resource: string): Promise<void> {\n await sessionStore.clear(resource);\n }\n\n async function loadRegisteredClient(\n issuer: string\n ): Promise<StoredOAuthSession[\"client\"] | null> {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n\n if (clientStore === null) {\n return null;\n }\n\n const client = await clientStore.load(issuer);\n const normalizedClient = client === null ? null : normalizeStoredClient(client);\n if (client !== null && normalizedClient === null) {\n await clientStore.clear(issuer);\n return null;\n }\n\n registeredClients.set(issuer, normalizedClient);\n return normalizedClient;\n }\n\n async function saveRegisteredClient(\n issuer: string,\n client: StoredOAuthSession[\"client\"]\n ): Promise<void> {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n\n async function clearRegisteredClient(issuer: string): Promise<void> {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\n\nfunction isProviderOptions(\n options: OAuthClientProviderOptions\n): options is { provider: OAuthClientProvider } {\n return Object.prototype.hasOwnProperty.call(options, \"provider\");\n}\n\nfunction isExpired(tokens: StoredOAuthTokens, now: () => number): boolean {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\n\nfunction resolveDiscovery(\n discovery: OAuthDiscoveryResult | undefined,\n session: StoredOAuthSession | null\n): OAuthDiscoveryResult | undefined {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource)\n };\n }\n\n if (session === null) {\n return undefined;\n }\n\n const metadata = session.discovery.authorizationServerMetadata;\n const issuer = getOwnString(metadata, \"issuer\");\n const authorizationEndpoint = getOwnString(metadata, \"authorization_endpoint\");\n const tokenEndpoint = getOwnString(metadata, \"token_endpoint\");\n const codeChallengeMethodsSupported = getOwnStringArray(\n metadata,\n \"code_challenge_methods_supported\"\n );\n if (\n issuer === undefined ||\n authorizationEndpoint === undefined ||\n tokenEndpoint === undefined ||\n codeChallengeMethodsSupported === undefined ||\n !codeChallengeMethodsSupported.includes(\"S256\")\n ) {\n return undefined;\n }\n\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery\n .resourceMetadata as OAuthDiscoveryResult[\"resourceMetadata\"],\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata as OAuthAuthorizationServerMetadata\n };\n}\n\nfunction clearSessionTokens(session: StoredOAuthSession): StoredOAuthSession {\n const nextSession = { ...session };\n delete nextSession.tokens;\n return nextSession;\n}\n\nfunction hasCachedAccessToken(\n session: StoredOAuthSession | null\n): session is StoredOAuthSession & { tokens: StoredOAuthTokens } {\n return session?.tokens?.accessToken !== undefined;\n}\n\nfunction normalizeLoadedSession(session: StoredOAuthSession | null): StoredOAuthSession | null {\n if (session === null) {\n return null;\n }\n\n const client = normalizeStoredClient(getOwnEntry(session, \"client\"));\n if (client === null) {\n return { ...session, client: { clientId: \"\" }, tokens: undefined };\n }\n\n return {\n ...session,\n client,\n tokens: normalizeStoredTokens(getOwnEntry(session, \"tokens\"))\n };\n}\n\nfunction normalizeStoredClient(value: unknown): StoredOAuthSession[\"client\"] | null {\n if (!isObjectRecord(value)) {\n return null;\n }\n\n const clientId = getOwnString(value, \"clientId\");\n if (clientId === undefined || clientId.trim().length === 0) {\n return null;\n }\n const normalizedClientId = clientId.trim();\n\n const clientSecret = getOwnEntry(value, \"clientSecret\");\n if (clientSecret === undefined) {\n return { clientId: normalizedClientId };\n }\n\n if (typeof clientSecret !== \"string\" || clientSecret.trim().length === 0) {\n return null;\n }\n const normalizedClientSecret = clientSecret.trim();\n\n return { clientId: normalizedClientId, clientSecret: normalizedClientSecret };\n}\n\nfunction normalizeStoredTokens(value: unknown): StoredOAuthTokens | undefined {\n if (value === undefined || !isObjectRecord(value)) {\n return undefined;\n }\n\n const accessToken = getOwnString(value, \"accessToken\");\n const tokenType = getOwnString(value, \"tokenType\");\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n const scope = getOwnString(value, \"scope\");\n const normalizedAccessToken = accessToken?.trim();\n const normalizedRefreshToken = typeof refreshToken === \"string\" ? refreshToken.trim() : undefined;\n const normalizedScope = scope?.trim();\n\n if (\n accessToken === undefined ||\n normalizedAccessToken === undefined ||\n normalizedAccessToken.length === 0 ||\n tokenType !== \"Bearer\" ||\n !(\n expiresAt === null ||\n (typeof expiresAt === \"number\" &&\n Number.isSafeInteger(expiresAt) &&\n expiresAt <= MAX_JS_DATE_MS &&\n Number.isFinite(new Date(expiresAt).getTime()))\n ) ||\n (refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" ||\n normalizedRefreshToken === undefined ||\n normalizedRefreshToken.length === 0))\n ) {\n return undefined;\n }\n\n return {\n accessToken: normalizedAccessToken,\n tokenType,\n expiresAt,\n ...(normalizedRefreshToken === undefined ? {} : { refreshToken: normalizedRefreshToken }),\n ...(normalizedScope === undefined || normalizedScope.length === 0\n ? {}\n : { scope: normalizedScope })\n };\n}\n\nfunction getClientMetadata(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): OAuthClientMetadata | undefined {\n if (client.metadata === undefined) {\n return undefined;\n }\n\n return {\n clientName: normalizeOptionalOAuthString(client.metadata.clientName),\n scope: normalizeOptionalOAuthString(client.metadata.scope),\n softwareId: normalizeOptionalOAuthString(client.metadata.softwareId),\n softwareVersion: normalizeOptionalOAuthString(client.metadata.softwareVersion)\n };\n}\n\nfunction normalizeConfiguredClient(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): StoredOAuthSession[\"client\"] | null {\n const clientId = normalizeOptionalOAuthString(client.clientId);\n if (clientId === undefined) {\n return null;\n }\n\n const clientSecret = normalizeOptionalOAuthString(client.clientSecret);\n return clientSecret === undefined ? { clientId } : { clientId, clientSecret };\n}\n\nfunction normalizeOptionalOAuthString(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction requireOwnString(record: object, key: string, label: string): string {\n const value = getOwnString(record, key);\n if (value === undefined) {\n throw new Error(`${label} is missing ${key}`);\n }\n\n return value;\n}\n\nfunction getOwnStringArray(record: object, key: string): string[] | undefined {\n const value = getOwnEntry(record, key);\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\")\n ? value\n : undefined;\n}\n\nfunction buildAuthorizationUrl(input: {\n metadata: OAuthAuthorizationServerMetadata;\n resource: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n clientMetadata: OAuthClientMetadata | undefined;\n}): string {\n const authorizationEndpoint = requireOwnString(\n input.metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const issuer = requireOwnString(input.metadata, \"issuer\", \"Authorization server metadata\");\n const url = new URL(authorizationEndpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer,\n requireIssuer:\n getOwnEntry(input.metadata, \"authorization_response_iss_parameter_supported\") === true\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n\n return url.toString();\n}\n\nfunction assertS256PkceSupport(metadata: OAuthAuthorizationServerMetadata): void {\n if (!getOwnStringArray(metadata, \"code_challenge_methods_supported\")?.includes(\"S256\")) {\n throw new Error(\n \"Authorization server metadata must advertise code_challenge_methods_supported including S256\"\n );\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n return (\n normalizedHostname === \"localhost\" ||\n normalizedHostname === \"::1\" ||\n normalizedHostname.startsWith(\"127.\")\n );\n}\n\nfunction assertSecureUrl(value: string, label: string): void {\n const url = new URL(value);\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction assertSecureOAuthFlowEndpoints(metadata: OAuthAuthorizationServerMetadata): void {\n const authorizationEndpoint = requireOwnString(\n metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const tokenEndpoint = requireOwnString(\n metadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n );\n const registrationEndpoint = getOwnString(metadata, \"registration_endpoint\");\n\n assertNoAccessTokenInUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(tokenEndpoint, \"Token endpoint\");\n assertSecureUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertSecureUrl(tokenEndpoint, \"Token endpoint\");\n\n if (registrationEndpoint !== undefined) {\n assertNoAccessTokenInUrl(registrationEndpoint, \"Registration endpoint\");\n assertSecureUrl(registrationEndpoint, \"Registration endpoint\");\n }\n}\n\nfunction assertNoAccessTokenInUrl(value: string | URL, label: string): void {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\n\nfunction assertRequestMatchesResource(requestUrl: string, resource: string): void {\n if (requestUrl !== resource) {\n throw new Error(\n `OAuth request URL ${requestUrl} does not match discovered resource ${resource}`\n );\n }\n}\n\nfunction buildClientRegistrationBody(\n metadata: OAuthClientMetadata | undefined,\n redirectUri: string\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\"\n };\n const clientName = metadata === undefined ? undefined : getOwnString(metadata, \"clientName\");\n const scope = metadata === undefined ? undefined : getOwnString(metadata, \"scope\");\n const softwareId = metadata === undefined ? undefined : getOwnString(metadata, \"softwareId\");\n const softwareVersion =\n metadata === undefined ? undefined : getOwnString(metadata, \"softwareVersion\");\n\n if (clientName !== undefined && clientName.length > 0) {\n body.client_name = clientName;\n }\n\n if (scope !== undefined && scope.length > 0) {\n body.scope = scope;\n }\n\n if (softwareId !== undefined && softwareId.length > 0) {\n body.software_id = softwareId;\n }\n\n if (softwareVersion !== undefined && softwareVersion.length > 0) {\n body.software_version = softwareVersion;\n }\n\n return body;\n}\n\nfunction toStoredDiscovery(discovery: OAuthDiscoveryResult): StoredOAuthSession[\"discovery\"] {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata\n };\n}\n\ninterface ResolvedOAuthClient {\n kind: \"dynamic\" | \"static\";\n fromStoredRegistration: boolean;\n client: StoredOAuthSession[\"client\"];\n}\n\nfunction shouldReRegisterStoredDynamicClient(\n error: unknown,\n client: ResolvedOAuthClient | StoredOAuthSession[\"client\"] | null,\n alreadyAttempted: boolean\n): boolean {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n\n if (client === null) {\n return false;\n }\n\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n\n return true;\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\n\nexport interface OAuthLandingPage {\n title: string;\n body: string;\n}\n\nexport interface LoopbackAuthorizationOptions {\n openBrowser?: (url: string) => Promise<void>;\n readLine?: () => Promise<string>;\n createServer?: () => http.Server;\n landingPage?: OAuthLandingPage;\n callbackPath?: string;\n}\n\nexport interface LoopbackAuthorizationSession {\n redirectUri: string;\n waitForCode(authorizationUrl: string): Promise<string>;\n close(): void;\n}\n\nexport async function createLoopbackAuthorizationSession(\n options: LoopbackAuthorizationOptions = {}\n): Promise<LoopbackAuthorizationSession> {\n const callbackPath = options.callbackPath ?? \"/callback\";\n const server = options.createServer ? options.createServer() : http.createServer();\n const port = await startServer(server);\n const redirectUri = `http://127.0.0.1:${port}${callbackPath}`;\n\n return {\n redirectUri,\n async waitForCode(authorizationUrl: string): Promise<string> {\n return waitForAuthorizationCode(server, authorizationUrl, options, callbackPath);\n },\n close(): void {\n server.closeAllConnections?.();\n server.close();\n }\n };\n}\n\nasync function startServer(server: http.Server): Promise<number> {\n return new Promise<number>((resolve, reject) => {\n const handleError = (error: Error) => {\n server.off(\"error\", handleError);\n reject(error);\n };\n\n server.once(\"error\", handleError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", handleError);\n const address = server.address() as { port: number };\n resolve(address.port);\n });\n });\n}\n\nfunction waitForAuthorizationCode(\n server: http.Server,\n authorizationUrl: string,\n options: LoopbackAuthorizationOptions,\n callbackPath: string\n): Promise<string> {\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (!settled) {\n settled = true;\n fn();\n }\n };\n\n server.on(\"request\", (req: http.IncomingMessage, res: http.ServerResponse) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname !== callbackPath) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const callbackParameters = {\n code: url.searchParams.get(\"code\"),\n error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\")\n };\n\n try {\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n return;\n }\n\n const authorizationError = callbackParameters.error;\n if (authorizationError !== null) {\n const description = callbackParameters.errorDescription ?? authorizationError;\n res.writeHead(400);\n res.end(`Authorization failed: ${description}`);\n settle(() => reject(createAuthorizationError(authorizationError, description)));\n return;\n }\n\n try {\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n });\n\n if (options.readLine !== undefined) {\n options\n .readLine()\n .then((input) => {\n const callbackParameters = extractCallbackParametersFromInput(input);\n if (callbackParameters === null) {\n settle(() => reject(new Error(\"OAuth callback missing authorization code\")));\n return;\n }\n\n try {\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n if (callbackParameters.error !== null) {\n const description = callbackParameters.errorDescription ?? callbackParameters.error;\n throw createAuthorizationError(callbackParameters.error, description);\n }\n\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n settle(() => resolve(code));\n } catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n })\n .catch((error) => {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n });\n }\n\n if (options.openBrowser !== undefined) {\n options.openBrowser(authorizationUrl).catch((error) => {\n settle(() => reject(error));\n });\n }\n });\n}\n\nexport function extractCodeFromInput(input: string): string | null {\n return extractCallbackParametersFromInput(input)?.code ?? null;\n}\n\nfunction extractCallbackParametersFromInput(input: string): AuthorizationCallbackParameters | null {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get(\"code\"),\n error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\")\n };\n } catch {\n return {\n code: trimmed,\n error: null,\n errorDescription: null,\n state: null,\n iss: null\n };\n }\n}\n\ninterface AuthorizationCallbackParameters {\n code: string | null;\n error: string | null;\n errorDescription: string | null;\n state: string | null;\n iss: string | null;\n}\n\nfunction readExpectedAuthorizationCallback(authorizationUrl: string): {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n} {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false\n };\n}\n\nfunction validateAuthorizationCallbackParameters(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): string {\n validateAuthorizationCallbackBinding(callback, expected);\n\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n\n return callback.code;\n}\n\nfunction validateAuthorizationCallbackBinding(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): void {\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n\n if (\n callback.iss !== null &&\n callback.iss.length > 0 &&\n expected.issuer !== null &&\n callback.iss !== expected.issuer\n ) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n}\n\nfunction createAuthorizationError(error: string, description: string): Error {\n return new Error(`OAuth authorization failed: ${error} \u2014 ${description}`);\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n}\n\nexport function buildSuccessPage(landingPage?: OAuthLandingPage): string {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n '<body style=\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\">',\n '<div style=\"text-align:center\">',\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\"\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\n\ninterface AuthorizationStatePayload {\n v: 1;\n n: string;\n i: string;\n r: boolean;\n}\n\nexport function createAuthorizationState(input: {\n issuer: string;\n requireIssuer: boolean;\n}): string {\n const payload: AuthorizationStatePayload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\n\nexport function parseAuthorizationState(\n value: string | null\n): { issuer: string; requireIssuer: boolean } | null {\n if (value === null || value.length === 0) {\n return null;\n }\n\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded) as unknown;\n if (!isObjectRecord(parsed)) {\n return null;\n }\n\n const version = getOwnEntry(parsed, \"v\");\n const nonce = getOwnEntry(parsed, \"n\");\n const issuer = getOwnEntry(parsed, \"i\");\n const requireIssuer = getOwnEntry(parsed, \"r\");\n if (\n version !== 1\n || typeof nonce !== \"string\"\n || nonce.length === 0\n || typeof issuer !== \"string\"\n || issuer.length === 0\n || typeof requireIssuer !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n issuer,\n requireIssuer,\n };\n } catch {\n return null;\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n", "import crypto from \"node:crypto\";\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "import type { OAuthMetadataFetch, StoredOAuthTokens } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\ninterface OAuthErrorShape {\n error: string;\n error_description?: string;\n error_uri?: string;\n}\n\nexport class OAuthError extends Error {\n readonly error: string;\n readonly errorDescription: string | undefined;\n readonly errorUri: string | undefined;\n readonly error_description: string | undefined;\n readonly error_uri: string | undefined;\n readonly status: number;\n readonly retryable: boolean;\n readonly terminal: boolean;\n\n constructor(shape: OAuthErrorShape, status: number) {\n super(shape.error_description ?? shape.error);\n this.name = \"OAuthError\";\n this.error = shape.error;\n this.errorDescription = shape.error_description;\n this.errorUri = shape.error_uri;\n this.error_description = shape.error_description;\n this.error_uri = shape.error_uri;\n this.status = status;\n this.retryable = isRetryableOAuthError(this);\n this.terminal = !this.retryable;\n }\n}\n\nexport function isRetryableOAuthError(error: unknown): error is OAuthError {\n return (\n error instanceof OAuthError &&\n (error.status >= 500 ||\n error.error === \"server_error\" ||\n error.error === \"temporarily_unavailable\")\n );\n}\n\nexport async function exchangeAuthorizationCode(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n resource\n },\n fetch: input.fetch,\n now: input.now\n });\n}\n\nexport async function refreshAccessToken(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n refreshToken: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"refresh_token\",\n refresh_token: input.refreshToken,\n resource\n },\n fetch: input.fetch,\n now: input.now\n });\n}\n\nasync function requestTokens(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n params: Record<string, string>;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const body = new URLSearchParams({\n client_id: input.clientId,\n ...input.params\n });\n\n if (input.clientSecret !== undefined) {\n body.set(\"client_secret\", input.clientSecret);\n }\n\n const response = await input.fetch(input.tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n },\n body: body.toString()\n });\n const payload = await readOAuthJsonObjectResponse(response);\n const accessToken = getOwnEntry(payload, \"access_token\");\n\n if (typeof accessToken !== \"string\" || accessToken.trim().length === 0) {\n throw new Error(\"OAuth token response missing access_token\");\n }\n const normalizedAccessToken = accessToken.trim();\n\n const tokenType = normalizeBearerTokenType(getOwnEntry(payload, \"token_type\"));\n if (tokenType === null) {\n throw new Error(\"OAuth token response missing token_type=Bearer\");\n }\n\n const expiresIn = getOwnEntry(payload, \"expires_in\");\n let expiresAt: number | null = null;\n if (expiresIn !== undefined) {\n if (\n typeof expiresIn !== \"number\" ||\n !Number.isFinite(expiresIn) ||\n !Number.isInteger(expiresIn) ||\n expiresIn < 0\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n\n expiresAt = input.now() + expiresIn * 1000;\n if (\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime())\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n }\n\n const refreshToken = getOwnEntry(payload, \"refresh_token\");\n const scope = getOwnEntry(payload, \"scope\");\n const normalizedRefreshToken =\n typeof refreshToken === \"string\" && refreshToken.trim().length > 0\n ? refreshToken.trim()\n : undefined;\n const normalizedScope =\n typeof scope === \"string\" && scope.trim().length > 0 ? scope.trim() : undefined;\n return {\n accessToken: normalizedAccessToken,\n refreshToken: normalizedRefreshToken === undefined ? undefined : normalizedRefreshToken,\n tokenType,\n expiresAt,\n scope: normalizedScope === undefined ? undefined : normalizedScope\n };\n}\n\nexport async function readOAuthJsonObjectResponse(\n response: Response\n): Promise<Record<string, unknown>> {\n const fallbackError = createFallbackOAuthError(response.status);\n let payload: unknown;\n\n try {\n payload = await response.json();\n } catch {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n const record = payload as Record<string, unknown>;\n if (!response.ok) {\n throw new OAuthError(readOAuthError(record, fallbackError.error), response.status);\n }\n\n return record;\n}\n\nfunction readOAuthError(\n payload: Record<string, unknown>,\n fallbackError = \"server_error\"\n): OAuthErrorShape {\n const error = getOwnEntry(payload, \"error\");\n const errorDescription = getOwnEntry(payload, \"error_description\");\n const errorUri = getOwnEntry(payload, \"error_uri\");\n return {\n error: typeof error === \"string\" ? error : fallbackError,\n error_description: typeof errorDescription === \"string\" ? errorDescription : undefined,\n error_uri: typeof errorUri === \"string\" ? errorUri : undefined\n };\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction createFallbackOAuthError(status: number): OAuthError {\n const error = status === 503 ? \"temporarily_unavailable\" : \"server_error\";\n return new OAuthError({ error }, status);\n}\n\nfunction normalizeBearerTokenType(value: unknown): \"Bearer\" | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n return value.toLowerCase() === \"bearer\" ? \"Bearer\" : null;\n}\n", "import {\n decodeProtectedHeader,\n errors,\n importJWK,\n jwtVerify,\n type JSONWebKeySet,\n type JWK,\n type JWTPayload\n} from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\"\n] as const;\n\ntype FetchLike = typeof fetch;\ntype TokenVerificationErrorCode =\n | \"invalid_token\"\n | \"insufficient_scope\"\n | \"temporarily_unavailable\";\n\nexport interface JwksTokenVerifierOptions {\n jwksUrl: string | URL;\n clockSkewSeconds?: number;\n allowedAlgorithms?: readonly string[];\n jwksCacheTtlMs?: number;\n jwksFetchTimeoutMs?: number;\n jwksRefreshCooldownMs?: number;\n allowInsecureJwks?: boolean;\n requireAccessTokenType?: boolean;\n fetch?: FetchLike;\n}\n\nexport interface JwksVerifiedAccessToken {\n token: string;\n issuer: string;\n audience: string[];\n scopes: string[];\n expiresAt: number;\n claims: Record<string, unknown>;\n subject?: string;\n clientId?: string;\n}\n\nexport interface JwksTokenVerifier {\n verify(input: {\n token: string;\n resource: string;\n authorizationServers: readonly string[];\n requiredScopes: readonly string[];\n }): Promise<JwksVerifiedAccessToken>;\n}\n\ntype TokenVerificationErrorShape = Error & {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n};\n\nfunction isTokenVerificationErrorShape(error: unknown): error is TokenVerificationErrorShape {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const challengeError = error as { error?: unknown };\n return (\n challengeError.error === \"invalid_token\" ||\n challengeError.error === \"insufficient_scope\" ||\n challengeError.error === \"temporarily_unavailable\"\n );\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction toUrl(value: string | URL, label: string): URL {\n try {\n return new URL(String(value));\n } catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\n\nfunction normalizeAudience(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n return isStringArray(value) ? [...value] : [];\n}\n\nfunction normalizeVerifiedAudience(value: unknown, expectedResource: string): string[] {\n const audiences = normalizeAudience(value);\n for (const audience of audiences) {\n try {\n const normalizedAudience = canonicalizeResourceIndicator(audience);\n if (normalizedAudience === expectedResource) {\n return [normalizedAudience];\n }\n } catch {\n continue;\n }\n }\n\n throw createInvalidTokenError(\"audience mismatch\");\n}\n\nfunction parseScopes(payload: JWTPayload): string[] {\n const scope = getOwnString(payload, \"scope\");\n const scopes = getOwnEntry(payload, \"scopes\");\n const raw = scope !== undefined ? scope : typeof scopes === \"string\" ? scopes : null;\n\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n\n return isStringArray(scopes) ? [...scopes] : [];\n}\n\nfunction toVerifiedAccessToken(\n token: string,\n payload: JWTPayload,\n audience = normalizeAudience(getOwnEntry(payload, \"aud\"))\n): JwksVerifiedAccessToken {\n const issuer = getOwnString(payload, \"iss\");\n const expiresAt = getOwnEntry(payload, \"exp\");\n const subject = getOwnString(payload, \"sub\");\n const clientId = getOwnString(payload, \"client_id\");\n\n return {\n token,\n issuer: issuer ?? \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: expiresAt as number,\n claims: { ...payload },\n ...(subject !== undefined\n ? {\n subject\n }\n : {}),\n ...(clientId !== undefined\n ? {\n clientId\n }\n : {})\n };\n}\n\nfunction createTokenVerificationError(input: {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n}): TokenVerificationErrorShape {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\n\nfunction createTemporarilyUnavailableError(): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"temporarily_unavailable\",\n errorDescription: \"token verification temporarily unavailable\"\n });\n}\n\nfunction createInvalidTokenError(errorDescription: string): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription\n });\n}\n\nfunction normalizeVerificationError(error: unknown): TokenVerificationErrorShape {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n\n if (error.claim === \"exp\") {\n if (error.reason === \"missing\") {\n return createInvalidTokenError(\"token missing expiry\");\n }\n\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error.claim === \"typ\") {\n return createInvalidTokenError(\"invalid access token type\");\n }\n }\n\n if (error instanceof errors.JOSEAlgNotAllowed || error instanceof errors.JOSENotSupported) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n if (\n error instanceof errors.JWKSNoMatchingKey ||\n error instanceof errors.JWKSMultipleMatchingKeys ||\n error instanceof errors.JWSSignatureVerificationFailed\n ) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n\n if (error instanceof errors.JWKSInvalid || error instanceof errors.JWKSTimeout) {\n return createTemporarilyUnavailableError();\n }\n\n return createInvalidTokenError(\"token verification failed\");\n}\n\nasync function loadJwks(\n jwksUrl: URL,\n fetchImplementation: FetchLike,\n timeoutMs: number\n): Promise<JSONWebKeySet> {\n try {\n const response = await fetchImplementation(jwksUrl, {\n headers: {\n Accept: \"application/json\"\n },\n signal: AbortSignal.timeout(timeoutMs)\n });\n\n if (!response.ok) {\n throw createTemporarilyUnavailableError();\n }\n\n const payload = (await response.json()) as unknown;\n const keys = isObjectRecord(payload) ? getOwnEntry(payload, \"keys\") : undefined;\n if (!isObjectRecord(payload) || !Array.isArray(keys) || !keys.every(isObjectRecord)) {\n throw createTemporarilyUnavailableError();\n }\n\n return { keys } as JSONWebKeySet;\n } catch (error) {\n if (isTokenVerificationErrorShape(error)) {\n throw error;\n }\n\n throw createTemporarilyUnavailableError();\n }\n}\n\nfunction resolveAlgorithm(token: string, allowedAlgorithms: readonly string[]): string {\n const header = decodeProtectedHeader(token);\n const alg = getOwnString(header, \"alg\");\n\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n\n if (\n typeof alg !== \"string\" ||\n alg === \"none\" ||\n alg.startsWith(\"HS\") ||\n !allowedAlgorithms.includes(alg)\n ) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n return alg;\n}\n\nfunction hasCriticalHeaderClaims(header: ReturnType<typeof decodeProtectedHeader>): boolean {\n const criticalClaims = getOwnEntry(header, \"crit\");\n return Array.isArray(criticalClaims) && criticalClaims.length > 0;\n}\n\nfunction isVerificationCandidate(key: JWK, alg: string, kid: string | undefined): boolean {\n const keyId = getOwnString(key, \"kid\");\n const keyAlgorithm = getOwnString(key, \"alg\");\n const keyUse = getOwnString(key, \"use\");\n const keyOps = getOwnEntry(key, \"key_ops\");\n\n if (kid !== undefined && keyId !== kid) {\n return false;\n }\n\n if (keyAlgorithm !== undefined && keyAlgorithm !== alg) {\n return false;\n }\n\n if (keyUse !== undefined && keyUse !== \"sig\") {\n return false;\n }\n\n if (Array.isArray(keyOps) && !keyOps.includes(\"verify\")) {\n return false;\n }\n\n return true;\n}\n\nfunction shouldContinueWithNextKey(error: unknown): boolean {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\n\nasync function verifyJwtAgainstJwks(input: {\n token: string;\n jwks: JSONWebKeySet;\n alg: string;\n authorizationServers: readonly string[];\n clockSkewSeconds: number;\n requireAccessTokenType: boolean;\n}) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = getOwnString(protectedHeader, \"kid\");\n const candidateKeys = input.jwks.keys.filter((key) =>\n isVerificationCandidate(key, input.alg, kid)\n );\n\n if (candidateKeys.length === 0) {\n throw new NoMatchingKeyError();\n }\n\n let lastSignatureError: unknown;\n let hasMalformedKey = false;\n\n for (const candidate of candidateKeys) {\n let key;\n try {\n key = await importJWK(candidate, input.alg);\n } catch {\n hasMalformedKey = true;\n continue;\n }\n\n try {\n return await jwtVerify(input.token, key as never, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n requiredClaims: [\"exp\"],\n ...(input.requireAccessTokenType ? { typ: \"at+jwt\" } : {})\n });\n } catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n\n throw error;\n }\n }\n\n if (hasMalformedKey) {\n throw createTemporarilyUnavailableError();\n }\n\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\n\nclass NoMatchingKeyError extends Error {}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) {\n return true;\n }\n\n if (hostname === \"[::1]\" || hostname === \"::1\") {\n return true;\n }\n\n const parts = hostname.split(\".\");\n return (\n parts.length === 4 &&\n parts[0] === \"127\" &&\n parts.slice(1).every((part) => {\n const value = Number(part);\n return Number.isInteger(value) && value >= 0 && value <= 255;\n })\n );\n}\n\nexport function createJwksTokenVerifier(options: JwksTokenVerifierOptions): JwksTokenVerifier {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const jwksCacheTtlMs = options.jwksCacheTtlMs ?? 300_000;\n const jwksFetchTimeoutMs = options.jwksFetchTimeoutMs ?? 5_000;\n const jwksRefreshCooldownMs = options.jwksRefreshCooldownMs ?? 30_000;\n const requireAccessTokenType = options.requireAccessTokenType ?? false;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n let cachedJwks: { value: JSONWebKeySet; expiresAt: number } | undefined;\n let pendingJwks: Promise<JSONWebKeySet> | undefined;\n let pendingForcedRefresh: Promise<JSONWebKeySet> | undefined;\n let lastForcedRefreshAt = Number.NEGATIVE_INFINITY;\n\n if (\n jwksUrl.protocol !== \"https:\" &&\n !isLoopbackHostname(jwksUrl.hostname) &&\n options.allowInsecureJwks !== true\n ) {\n throw new Error(\"jwksUrl must use HTTPS for non-loopback hosts\");\n }\n\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n\n async function getJwks(forceRefresh = false): Promise<JSONWebKeySet> {\n const now = Date.now();\n if (!forceRefresh && cachedJwks !== undefined && cachedJwks.expiresAt > now) {\n return cachedJwks.value;\n }\n\n if (pendingJwks !== undefined) {\n return pendingJwks;\n }\n\n pendingJwks = loadJwks(jwksUrl, fetchImplementation, jwksFetchTimeoutMs)\n .then((jwks) => {\n cachedJwks = {\n value: jwks,\n expiresAt: Date.now() + jwksCacheTtlMs\n };\n return jwks;\n })\n .finally(() => {\n pendingJwks = undefined;\n });\n\n return pendingJwks;\n }\n\n function refreshJwksAfterUnknownKey(): Promise<JSONWebKeySet> {\n if (pendingForcedRefresh !== undefined) {\n return pendingForcedRefresh;\n }\n\n const now = Date.now();\n if (now - lastForcedRefreshAt < jwksRefreshCooldownMs) {\n throw new NoMatchingKeyError();\n }\n\n lastForcedRefreshAt = now;\n pendingForcedRefresh = getJwks(true).finally(() => {\n pendingForcedRefresh = undefined;\n });\n return pendingForcedRefresh;\n }\n\n return {\n async verify(input): Promise<JwksVerifiedAccessToken> {\n try {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n let jwks = await getJwks();\n let verified;\n\n try {\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n } catch (error) {\n if (!(error instanceof NoMatchingKeyError)) {\n throw error;\n }\n\n jwks = await refreshJwksAfterUnknownKey();\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n }\n const audience = normalizeVerifiedAudience(\n getOwnEntry(verified.payload, \"aud\"),\n expectedResource\n );\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n\n if (\n input.requiredScopes.length > 0 &&\n !input.requiredScopes.every((scope) => accessToken.scopes.includes(scope))\n ) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes]\n });\n }\n\n return accessToken;\n } catch (error) {\n if (error instanceof NoMatchingKeyError) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n\n throw normalizeVerificationError(error);\n }\n }\n };\n}\n", "import type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n} from \"mcp-oauth\";\nimport { canonicalizeResourceIndicator } from \"mcp-oauth\";\n\nexport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n};\n\nexport interface OAuthDiscoveryCache {\n get(\n resourceUrl: string\n ): OAuthDiscoveryResult | null | undefined | Promise<OAuthDiscoveryResult | null | undefined>;\n set(resourceUrl: string, value: OAuthDiscoveryResult): void | Promise<void>;\n}\n\nexport interface OAuthMetadataDiscoveryOptions {\n fetch?: OAuthMetadataFetch;\n cache?: OAuthDiscoveryCache;\n}\n\nexport interface OAuthMetadataLookupOptions {\n resourceMetadataUrl?: string | URL;\n}\n\nfunction defaultOAuthMetadataFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\n\nfunction assertSecureUrl(url: URL, label: string): void {\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction validateProtectedResourceMetadata(\n value: unknown,\n resourceUrl: string\n): OAuthProtectedResourceMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Protected resource metadata must be a JSON object\");\n }\n\n if (typeof value.resource !== \"string\" || value.resource.length === 0) {\n throw new Error(\"Protected resource metadata must include a resource string\");\n }\n\n const normalizedResource = canonicalizeResourceIndicator(value.resource);\n\n if (normalizedResource !== resourceUrl) {\n throw new Error(\n `Protected resource metadata resource mismatch: expected ${resourceUrl}, received ${value.resource}`\n );\n }\n\n if (!isStringArray(value.authorization_servers) || value.authorization_servers.length === 0) {\n throw new Error(\n \"Protected resource metadata must include a non-empty authorization_servers array\"\n );\n }\n\n return {\n ...value,\n resource: normalizedResource,\n } as OAuthProtectedResourceMetadata;\n}\n\nfunction validateAuthorizationServerMetadata(\n value: unknown,\n issuer: string\n): OAuthAuthorizationServerMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Authorization server metadata must be a JSON object\");\n }\n\n if (typeof value.issuer !== \"string\" || value.issuer.length === 0) {\n throw new Error(\"Authorization server metadata must include issuer\");\n }\n\n if (value.issuer !== issuer) {\n throw new Error(\n `Authorization server metadata issuer mismatch: expected ${issuer}, received ${value.issuer}`\n );\n }\n\n if (\n typeof value.authorization_endpoint !== \"string\" ||\n value.authorization_endpoint.length === 0\n ) {\n throw new Error(\"Authorization server metadata must include authorization_endpoint\");\n }\n\n if (typeof value.token_endpoint !== \"string\" || value.token_endpoint.length === 0) {\n throw new Error(\"Authorization server metadata must include token_endpoint\");\n }\n\n if (\n !isStringArray(value.response_types_supported) ||\n !value.response_types_supported.includes(\"code\")\n ) {\n throw new Error(\n \"Authorization server metadata must include response_types_supported containing code\"\n );\n }\n\n if (\n !isStringArray(value.code_challenge_methods_supported) ||\n !value.code_challenge_methods_supported.includes(\"S256\")\n ) {\n throw new Error(\n \"Authorization server metadata must include code_challenge_methods_supported containing S256\"\n );\n }\n\n return value as OAuthAuthorizationServerMetadata;\n}\n\nasync function readJsonResponse(response: Response, label: string): Promise<unknown> {\n if (!response.ok) {\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n throw new Error(`${label} request failed (${statusDescriptor})`);\n }\n\n try {\n return await response.json();\n } catch {\n throw new Error(`${label} response must be valid JSON`);\n }\n}\n\nfunction resolveWellKnownMetadataUrl(inputUrl: string | URL, suffix: string): string {\n const url = new URL(typeof inputUrl === \"string\" ? inputUrl : inputUrl.toString());\n\n const resourcePath = url.pathname === \"/\" ? \"\" : url.pathname;\n url.pathname = `/.well-known/${suffix}${resourcePath}`;\n\n return url.toString();\n}\n\nexport function resolveProtectedResourceMetadataUrl(\n resourceUrl: string | URL,\n resourceMetadataUrl?: string | URL\n): string {\n const resource = new URL(canonicalizeResourceIndicator(resourceUrl));\n assertSecureUrl(resource, \"Protected resource URL\");\n\n if (resourceMetadataUrl !== undefined) {\n const resolvedResourceMetadataUrl = new URL(\n typeof resourceMetadataUrl === \"string\" ? resourceMetadataUrl : resourceMetadataUrl.toString(),\n resource\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n }\n\n const resolvedResourceMetadataUrl = new URL(\n resolveWellKnownMetadataUrl(resource, \"oauth-protected-resource\")\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n}\n\nfunction normalizeAuthorizationServerIssuer(issuer: string | URL): string {\n const input = typeof issuer === \"string\" ? issuer : issuer.toString();\n const url = new URL(input);\n if (url.search.length > 0 || url.hash.length > 0) {\n throw new Error(\"Authorization server issuer must not include query or fragment\");\n }\n\n assertSecureUrl(url, \"Authorization server issuer\");\n\n if (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) {\n url.pathname = url.pathname.slice(0, -1);\n }\n\n return url.pathname === \"/\" ? url.origin : url.toString();\n}\n\nexport function resolveAuthorizationServerMetadataUrl(issuer: string | URL): string {\n return resolveWellKnownMetadataUrl(\n normalizeAuthorizationServerIssuer(issuer),\n \"oauth-authorization-server\"\n );\n}\n\nexport class OAuthMetadataDiscovery {\n private readonly fetchImpl: OAuthMetadataFetch;\n private readonly cache: OAuthDiscoveryCache | undefined;\n private readonly memoryCache = new Map<string, OAuthDiscoveryResult>();\n\n constructor({ fetch = defaultOAuthMetadataFetch, cache }: OAuthMetadataDiscoveryOptions = {}) {\n this.fetchImpl = fetch;\n this.cache = cache;\n }\n\n async discover(\n resourceUrl: string | URL,\n { resourceMetadataUrl }: OAuthMetadataLookupOptions = {}\n ): Promise<OAuthDiscoveryResult> {\n const cacheKey = canonicalizeResourceIndicator(resourceUrl);\n const resourceMetadataLocation = resolveProtectedResourceMetadataUrl(\n cacheKey,\n resourceMetadataUrl\n );\n const memoryCachedResult = this.memoryCache.get(cacheKey);\n if (memoryCachedResult !== undefined && resourceMetadataUrl === undefined) {\n return memoryCachedResult;\n }\n\n const sharedCachedResult = await this.cache?.get(cacheKey);\n if (\n sharedCachedResult !== null &&\n sharedCachedResult !== undefined &&\n resourceMetadataUrl === undefined\n ) {\n this.memoryCache.set(cacheKey, sharedCachedResult);\n return sharedCachedResult;\n }\n\n const resourceMetadataResponse = await this.fetchImpl(resourceMetadataLocation, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const resourceMetadata = validateProtectedResourceMetadata(\n await readJsonResponse(resourceMetadataResponse, \"Protected resource metadata\"),\n cacheKey\n );\n\n const authorizationServerErrors: string[] = [];\n\n for (const authorizationServer of resourceMetadata.authorization_servers) {\n const normalizedAuthorizationServer = normalizeAuthorizationServerIssuer(\n authorizationServer\n );\n const authorizationServerMetadataUrl =\n resolveAuthorizationServerMetadataUrl(normalizedAuthorizationServer);\n\n try {\n const authorizationServerResponse = await this.fetchImpl(authorizationServerMetadataUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n await readJsonResponse(\n authorizationServerResponse,\n \"Authorization server metadata\"\n ),\n normalizedAuthorizationServer\n );\n\n const result: OAuthDiscoveryResult = {\n resource: resourceMetadata.resource,\n resourceMetadataUrl: resourceMetadataLocation,\n resourceMetadata,\n authorizationServer: normalizedAuthorizationServer,\n authorizationServerMetadataUrl,\n authorizationServerMetadata,\n };\n\n this.memoryCache.set(cacheKey, result);\n await this.cache?.set(cacheKey, result);\n return result;\n } catch (error) {\n authorizationServerErrors.push(\n `${authorizationServerMetadataUrl}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n throw new Error(\n `Unable to load authorization server metadata for ${cacheKey}: ${authorizationServerErrors.join(\n \"; \"\n )}`\n );\n }\n}\n\nexport async function discoverOAuthMetadata(\n resourceUrl: string | URL,\n options: OAuthMetadataDiscoveryOptions & OAuthMetadataLookupOptions = {}\n): Promise<OAuthDiscoveryResult> {\n const discovery = new OAuthMetadataDiscovery(options);\n return discovery.discover(resourceUrl, options);\n}\n\nfunction skipOptionalWhitespace(value: string, start: number): number {\n let index = start;\n while (index < value.length && (value[index] === \" \" || value[index] === \"\\t\")) {\n index += 1;\n }\n return index;\n}\n\nfunction readToken(value: string, start: number): { token: string; nextIndex: number } | null {\n let index = start;\n while (index < value.length) {\n const character = value[index];\n if (\n character === \" \"\n || character === \"\\t\"\n || character === \",\"\n || character === \"=\"\n || character === \"\\\"\"\n ) {\n break;\n }\n index += 1;\n }\n\n if (index === start) {\n return null;\n }\n\n return {\n token: value.slice(start, index),\n nextIndex: index,\n };\n}\n\nfunction looksLikeAuthParam(value: string, start: number): boolean {\n const token = readToken(value, start);\n if (token === null) {\n return false;\n }\n\n return value[skipOptionalWhitespace(value, token.nextIndex)] === \"=\";\n}\n\nfunction isToken68Character(character: string): boolean {\n return (\n (character >= \"a\" && character <= \"z\")\n || (character >= \"A\" && character <= \"Z\")\n || (character >= \"0\" && character <= \"9\")\n || character === \"-\"\n || character === \".\"\n || character === \"_\"\n || character === \"~\"\n || character === \"+\"\n || character === \"/\"\n );\n}\n\nfunction readToken68(\n value: string,\n start: number\n): { token68: string; nextIndex: number } | null {\n let nextIndex = start;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n const token68 = value.slice(start, nextIndex);\n if (token68.length === 0) {\n return null;\n }\n\n let index = 0;\n while (index < token68.length && isToken68Character(token68[index]!)) {\n index += 1;\n }\n\n if (index === 0) {\n return null;\n }\n\n while (index < token68.length && token68[index] === \"=\") {\n index += 1;\n }\n\n if (index !== token68.length) {\n return null;\n }\n\n return { token68, nextIndex };\n}\n\nfunction readQuotedString(\n value: string,\n start: number\n): { parsedValue: string; nextIndex: number } | null {\n if (value[start] !== \"\\\"\") {\n return null;\n }\n\n let parsedValue = \"\";\n let index = start + 1;\n let escaping = false;\n\n while (index < value.length) {\n const character = value[index];\n if (escaping) {\n parsedValue += character;\n escaping = false;\n index += 1;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n index += 1;\n continue;\n }\n\n if (character === \"\\\"\") {\n return {\n parsedValue,\n nextIndex: index + 1,\n };\n }\n\n parsedValue += character;\n index += 1;\n }\n\n return null;\n}\n\nfunction parseAuthParam(\n value: string,\n start: number\n): { name: string; value: string; nextIndex: number } | null {\n const token = readToken(value, start);\n if (token === null) {\n return null;\n }\n\n let index = skipOptionalWhitespace(value, token.nextIndex);\n if (value[index] !== \"=\") {\n return null;\n }\n\n index = skipOptionalWhitespace(value, index + 1);\n if (index >= value.length) {\n return null;\n }\n\n const quotedValue = readQuotedString(value, index);\n if (quotedValue !== null) {\n return {\n name: token.token,\n value: quotedValue.parsedValue,\n nextIndex: quotedValue.nextIndex,\n };\n }\n\n let nextIndex = index;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n return {\n name: token.token,\n value: value.slice(index, nextIndex),\n nextIndex,\n };\n}\n\nexport function parseBearerWwwAuthenticateHeader(\n headerValue: string | null\n): OAuthUnauthorizedChallenge | null {\n if (headerValue === null) {\n return null;\n }\n\n let index = 0;\n let firstBearerChallenge: OAuthUnauthorizedChallenge | null = null;\n\n while (index < headerValue.length) {\n index = skipOptionalWhitespace(headerValue, index);\n while (headerValue[index] === \",\") {\n index = skipOptionalWhitespace(headerValue, index + 1);\n }\n\n const scheme = readToken(headerValue, index);\n if (scheme === null) {\n break;\n }\n\n index = skipOptionalWhitespace(headerValue, scheme.nextIndex);\n const params: Record<string, string> = Object.create(null) as Record<string, string>;\n\n if (index < headerValue.length && headerValue[index] !== \",\") {\n const token68 = readToken68(headerValue, index);\n if (token68 !== null) {\n index = token68.nextIndex;\n } else if (looksLikeAuthParam(headerValue, index)) {\n while (index < headerValue.length) {\n const parsedParam = parseAuthParam(headerValue, index);\n if (parsedParam === null) {\n break;\n }\n\n params[parsedParam.name] = parsedParam.value;\n index = skipOptionalWhitespace(headerValue, parsedParam.nextIndex);\n\n if (headerValue[index] !== \",\") {\n break;\n }\n\n const nextIndex = skipOptionalWhitespace(headerValue, index + 1);\n if (!looksLikeAuthParam(headerValue, nextIndex)) {\n index = nextIndex;\n break;\n }\n\n index = nextIndex;\n }\n }\n }\n\n if (scheme.token.toLowerCase() === \"bearer\") {\n const challenge: OAuthUnauthorizedChallenge = {\n scheme: \"Bearer\",\n params,\n raw: headerValue,\n };\n if (Object.keys(params).length > 0) {\n return challenge;\n }\n\n firstBearerChallenge ??= challenge;\n }\n\n if (headerValue[index] === \",\") {\n index += 1;\n }\n }\n\n return firstBearerChallenge;\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n HttpTransport,\n McpClient,\n StdioTransport,\n type HttpTransportFetch,\n type McpTransport,\n type StdioSpawn\n} from \"tiny-mcp-client\";\n\nexport type McpServerConfig =\n | { command: string; args?: string[]; cwd?: string; env?: Record<string, string> }\n | { url: string; headers?: Record<string, string> };\n\nexport type McpModuleOptions = {\n servers: Record<string, McpServerConfig>;\n requestTimeoutMs?: number;\n closeTimeoutMs?: number;\n maxToolPages?: number;\n signal?: AbortSignal;\n fetch?: HttpTransportFetch;\n spawn?: StdioSpawn;\n};\n\nexport type ManagedMcpConnection = {\n ready: Promise<McpClient>;\n close(): Promise<void>;\n};\n\nexport function parseMcpConfig(source: string, directory: string): McpModuleOptions {\n const parsed = JSON.parse(source) as unknown;\n const options = normalizeMcpOptions(parsed, [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\"\n ]);\n for (const server of Object.values(options.servers)) {\n if (\"command\" in server) {\n server.cwd = path.resolve(directory, server.cwd ?? \".\");\n if (server.command.includes(\"/\") || server.command.includes(\"\\\\\")) {\n server.command = path.resolve(directory, server.command);\n }\n }\n }\n return options;\n}\n\nexport function normalizeMcpOptions(\n value: unknown,\n keys = [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\",\n \"signal\",\n \"fetch\",\n \"spawn\"\n ]\n): McpModuleOptions {\n const options = readRecord(value, \"MCP options\", keys);\n const servers = readRecord(options.servers, \"MCP servers\");\n const normalized = Object.create(null) as Record<string, McpServerConfig>;\n for (const [name, input] of Object.entries(servers)) {\n if (name.length === 0 || name.trim() !== name)\n throw new TypeError(\"MCP server names must be non-empty without surrounding whitespace.\");\n const server = readRecord(input, `MCP server ${name}`);\n if (Object.hasOwn(server, \"command\")) {\n readRecord(server, `MCP server ${name}`, [\"command\", \"args\", \"cwd\", \"env\"]);\n const command = readText(server.command, \"MCP command\");\n if (\n server.args !== undefined &&\n (!Array.isArray(server.args) ||\n server.args.some((argument) => typeof argument !== \"string\"))\n )\n throw new TypeError(\"MCP args must be an array of strings.\");\n normalized[name] = {\n command,\n ...(server.args === undefined ? {} : { args: [...(server.args as string[])] }),\n ...(server.cwd === undefined ? {} : { cwd: readText(server.cwd, \"MCP cwd\") }),\n env: readStrings(server.env ?? {}, \"MCP environment\")\n };\n } else {\n readRecord(server, `MCP server ${name}`, [\"url\", \"headers\"]);\n const url = new URL(readText(server.url, \"MCP URL\"));\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.hash)\n throw new TypeError(\"MCP URL must use HTTP or HTTPS without credentials or a fragment.\");\n const headers = readStrings(server.headers ?? {}, \"MCP headers\");\n new Headers(headers);\n normalized[name] = { url: url.href, headers };\n }\n }\n for (const name of [\"fetch\", \"spawn\"])\n if (options[name] !== undefined && typeof options[name] !== \"function\")\n throw new TypeError(`MCP ${name} must be a function.`);\n if (options.signal !== undefined && !(options.signal instanceof AbortSignal))\n throw new TypeError(\"MCP signal must be an AbortSignal.\");\n return {\n servers: normalized,\n requestTimeoutMs: readTimeout(options.requestTimeoutMs, 30_000),\n closeTimeoutMs: readTimeout(options.closeTimeoutMs, 1_000),\n maxToolPages: readTimeout(options.maxToolPages, 100),\n ...(options.signal === undefined ? {} : { signal: options.signal as AbortSignal }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch as HttpTransportFetch }),\n ...(options.spawn === undefined ? {} : { spawn: options.spawn as StdioSpawn })\n };\n}\n\nfunction readRecord(value: unknown, label: string, keys?: string[]): Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(value))\n )\n throw new TypeError(`${label} must be a plain object.`);\n const result = Object.create(null) as Record<string, unknown>;\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!(\"value\" in descriptor) || (keys !== undefined && !keys.includes(key)))\n throw new TypeError(`${label} contains unsupported field ${key}.`);\n result[key] = descriptor.value;\n }\n return result;\n}\n\nfunction readText(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.includes(\"\\0\"))\n throw new TypeError(`${label} must be a non-empty string without NUL characters.`);\n return value;\n}\n\nfunction readStrings(value: unknown, label: string): Record<string, string> {\n const entries = readRecord(value, label);\n for (const [name, entry] of Object.entries(entries))\n if (typeof entry !== \"string\" || name.includes(\"\\0\") || entry.includes(\"\\0\"))\n throw new TypeError(`${label} must contain strings without NUL characters.`);\n return entries as Record<string, string>;\n}\n\nfunction readTimeout(value: unknown, fallback: number): number {\n if (value === undefined) return fallback;\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value <= 0 ||\n value > 2_147_483_647\n )\n throw new TypeError(\"MCP timeouts must be positive 32-bit integers.\");\n return value;\n}\n\nexport function connectMcpTransport(\n server: McpServerConfig,\n options: McpModuleOptions,\n signal?: AbortSignal\n): ManagedMcpConnection {\n signal?.throwIfAborted();\n options.signal?.throwIfAborted();\n const client = new McpClient({\n clientInfo: { name: \"safejs\", version: \"1\" },\n requestTimeoutMs: options.requestTimeoutMs\n });\n let child: ChildProcessWithoutNullStreams | undefined;\n const activeRequests = new Set<AbortController>();\n const transport: McpTransport =\n \"command\" in server\n ? new StdioTransport({\n ...server,\n spawn(command, args, spawnOptions) {\n child =\n options.spawn === undefined\n ? (spawn(command, args, spawnOptions) as ChildProcessWithoutNullStreams)\n : options.spawn(command, args, spawnOptions);\n return child;\n }\n })\n : new HttpTransport({\n ...server,\n async fetch(input, init) {\n const controller = new AbortController();\n activeRequests.add(controller);\n const cancel = () => controller.abort(init?.signal?.reason);\n init?.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (init?.signal?.aborted) cancel();\n const timeout = setTimeout(\n () => controller.abort(new Error(\"MCP HTTP request timed out.\")),\n init?.method === \"DELETE\" ? options.closeTimeoutMs : options.requestTimeoutMs\n );\n const finish = () => {\n clearTimeout(timeout);\n activeRequests.delete(controller);\n init?.signal?.removeEventListener(\"abort\", cancel);\n };\n try {\n const response = await (options.fetch ?? fetch)(input, {\n ...init,\n signal: controller.signal,\n redirect: \"error\"\n });\n if (response.body === null) {\n finish();\n return response;\n }\n const reader = response.body.getReader();\n let stopReading: (() => void) | undefined;\n const release = () => {\n finish();\n if (stopReading !== undefined)\n controller.signal.removeEventListener(\"abort\", stopReading);\n };\n const body = new ReadableStream<Uint8Array>({\n start(stream) {\n stopReading = () => {\n void reader.cancel(controller.signal.reason).catch(() => undefined);\n stream.error(controller.signal.reason);\n release();\n };\n controller.signal.addEventListener(\"abort\", stopReading, { once: true });\n if (controller.signal.aborted) stopReading();\n },\n async pull(stream) {\n try {\n const result = await reader.read();\n if (controller.signal.aborted) return;\n if (result.done) {\n release();\n stream.close();\n } else stream.enqueue(result.value);\n } catch (error) {\n release();\n stream.error(error);\n }\n },\n async cancel(reason) {\n release();\n await reader.cancel(reason);\n }\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n } catch (error) {\n finish();\n throw error;\n }\n }\n });\n let closing: Promise<void> | undefined;\n const cancel = () => {\n void close().catch(() => undefined);\n };\n function close(): Promise<void> {\n closing ??= (async () => {\n signal?.removeEventListener(\"abort\", cancel);\n options.signal?.removeEventListener(\"abort\", cancel);\n for (const request of activeRequests) request.abort(new Error(\"MCP connection closed.\"));\n await client.close();\n transport.dispose();\n await new Promise<void>((resolve, reject) => {\n let forced: ReturnType<typeof setTimeout> | undefined;\n const timeout = setTimeout(() => {\n if (child !== undefined && child.exitCode === null && child.signalCode === null)\n child.kill(\"SIGKILL\");\n forced = setTimeout(\n () => reject(new Error(\"MCP transport did not close.\")),\n options.closeTimeoutMs\n );\n }, options.closeTimeoutMs);\n void transport.closed.then(\n () => {\n clearTimeout(timeout);\n clearTimeout(forced);\n resolve();\n },\n (error) => {\n clearTimeout(timeout);\n clearTimeout(forced);\n reject(error);\n }\n );\n });\n })();\n return closing;\n }\n signal?.addEventListener(\"abort\", cancel, { once: true });\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n const aborted = signal?.aborted || options.signal?.aborted;\n if (aborted) cancel();\n const connecting = aborted\n ? Promise.reject(signal?.aborted ? signal.reason : options.signal?.reason)\n : client.connect(transport);\n const ready = connecting.then(\n () => client,\n async (error) => {\n await close().catch(() => undefined);\n throw signal?.aborted\n ? signal.reason\n : options.signal?.aborted\n ? options.signal.reason\n : error;\n }\n );\n return { ready, close };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n} from \"mcp-oauth\";\nimport type { Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"mcp-oauth\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"mcp-oauth\";\n\nexport type RequestId = number | string;\n\nexport interface Implementation {\n name: string;\n version: string;\n}\n\nexport interface ClientCapabilities {\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n requestTimeoutMs?: number;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: () => Root[] | Promise<Root[]>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentClientCapabilities: ClientCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly subscribedResourceUris = new Set<string>();\n private readonly activeProgressTokens = new Map<ProgressToken, number>();\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities === null\n ? null\n : structuredClone(this.currentServerCapabilities);\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo;\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport): Promise<InitializeResult> {\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n\n const transportClosedReason = transport.closed\n .then((closedEvent) => closedEvent.reason)\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n this.options.requestTimeoutMs,\n transportClosedReason\n );\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params) =>\n onSamplingRequest(params as CreateMessageParams)\n );\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async () => {\n if (onToolsChanged === undefined || this.currentServerCapabilities?.tools?.listChanged !== true) {\n return;\n }\n\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async () => {\n if (\n onResourcesChanged === undefined\n || this.currentServerCapabilities?.resources?.listChanged !== true\n ) {\n return;\n }\n\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\" || !this.subscribedResourceUris.has(uri)) {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async () => {\n if (\n onPromptsChanged === undefined\n || this.currentServerCapabilities?.prompts?.listChanged !== true\n ) {\n return;\n }\n\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (\n !isRequestId(progressToken) ||\n typeof progress !== \"number\" ||\n !this.activeProgressTokens.has(progressToken)\n ) {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n this.currentClientCapabilities = structuredClone(capabilities);\n\n try {\n const initializeResultValue = await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n });\n\n if (!isInitializeResult(initializeResultValue)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid initialize result\");\n }\n\n const initializeResult = initializeResultValue;\n\n if (initializeResult.protocolVersion !== MCP_PROTOCOL_VERSION) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n\n this.currentServerCapabilities = structuredClone(initializeResult.capabilities);\n this.currentServerInfo = { ...initializeResult.serverInfo };\n this.currentInstructions = initializeResult.instructions;\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async () => ({\n roots: await onRootsList(),\n }));\n }\n messageLayer.sendNotification(\"notifications/initialized\");\n this.currentState = \"ready\";\n\n return initializeResult;\n } catch (error) {\n if (this.transport === transport) {\n const reason = error instanceof Error ? error : new Error(String(error));\n messageLayer.dispose(reason);\n transport.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"disconnected\";\n }\n\n throw error;\n }\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}): Promise<{ tools: Tool[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"tools/list\", requestParams);\n if (!isToolsListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tools/list result\");\n }\n\n return result;\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n if (options.signal?.aborted) {\n throw options.signal.reason;\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n if (options.progressToken !== undefined) {\n this.activeProgressTokens.set(\n options.progressToken,\n (this.activeProgressTokens.get(options.progressToken) ?? 0) + 1\n );\n }\n\n try {\n let requestId: RequestId | undefined;\n let cancellationSent = false;\n const sendCancellationNotification = () => {\n if (requestId === undefined || cancellationSent) {\n return;\n }\n cancellationSent = true;\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n };\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n onTimeout: sendCancellationNotification,\n }).then((result) => {\n if (!isCallToolResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tool result\");\n }\n\n return result;\n });\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n sendCancellationNotification();\n if (requestId !== undefined) {\n messageLayer.cancelRequest(requestId, signal.reason);\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n } finally {\n if (options.progressToken !== undefined) {\n const activeCount = this.activeProgressTokens.get(options.progressToken);\n if (activeCount === 1) {\n this.activeProgressTokens.delete(options.progressToken);\n } else if (activeCount !== undefined) {\n this.activeProgressTokens.set(options.progressToken, activeCount - 1);\n }\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}\n ): Promise<{ resources: Resource[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/list\", requestParams);\n if (!isResourcesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/list result\");\n }\n\n return result;\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}\n ): Promise<{ resourceTemplates: ResourceTemplate[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/templates/list\", requestParams);\n if (!isResourceTemplatesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/templates/list result\");\n }\n\n return result;\n }\n\n async readResource(params: ReadResourceParams): Promise<{ contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const result = await messageLayer.sendRequest(\"resources/read\", params);\n if (!isReadResourceResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/read result\");\n }\n\n return result;\n }\n\n async subscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri });\n this.subscribedResourceUris.add(uri);\n }\n\n async unsubscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri });\n this.subscribedResourceUris.delete(uri);\n }\n\n async listPrompts(params: PaginatedParams = {}): Promise<{ prompts: Prompt[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const result = await messageLayer.sendRequest(\"prompts/get\", params);\n if (!isGetPromptResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid prompts/get result\");\n }\n\n return result;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n const result = await messageLayer.sendRequest(\"completion/complete\", params);\n if (!isCompleteResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid completion/complete result\");\n }\n\n return result;\n }\n\n async setLogLevel(level: LogLevel): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level });\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n if (this.currentClientCapabilities?.roots?.listChanged !== true) {\n throw new Error(\"Client did not advertise roots list changes\");\n }\n\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(\"ping\");\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool {\n name: string;\n title?: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n annotations?: ToolAnnotations;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface PaginatedResult {\n nextCursor?: string;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string;\n blob: string;\n}\n\nexport type ResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: ResourceContents;\n}\n\nexport type ContentItem = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\nexport interface Prompt {\n name: string;\n description?: string;\n arguments?: PromptArgument[];\n}\n\nexport interface PromptArgument {\n name: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n}\n\nexport interface Root {\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem | ContentItem[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n model: string;\n content: ContentItem | ContentItem[];\n role: \"user\" | \"assistant\";\n stopReason: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n dispose(reason?: Error): void;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n url: string;\n headers?: RequestInit[\"headers\"];\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n const stderrDecoder = new TextDecoder();\n child.stderr.on(\"data\", (chunk: unknown) => {\n const decoded =\n chunk instanceof Uint8Array\n ? stderrDecoder.decode(chunk, { stream: true })\n : `${stderrDecoder.decode()}${String(chunk)}`;\n this.appendStderrOutput(decoded);\n });\n child.stderr.once(\"end\", () => {\n this.appendStderrOutput(stderrDecoder.decode());\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n private appendStderrOutput(chunk: string): void {\n if (chunk.length === 0) {\n return;\n }\n\n this.stderrOutput += chunk;\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly url: string;\n private readonly headers: HeadersInit;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly openSseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n\n constructor({\n url,\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n }: HttpTransportOptions) {\n this.url = url;\n this.headers = headers;\n this.fetchImpl = fetchImpl;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.abortInFlightFetches();\n this.cancelOpenSseReaders();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n void this.closeWithSessionTermination(reason);\n }\n\n private async closeWithSessionTermination(reason: Error): Promise<void> {\n let closeReason = reason;\n if (this.sessionId !== undefined) {\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n try {\n await this.sendSessionTerminationRequest(sessionId);\n } catch (error) {\n closeReason = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason: closeReason });\n }\n\n private abortInFlightFetches(): void {\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort();\n }\n\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenSseReaders(): void {\n for (const reader of this.openSseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openSseReaders.clear();\n }\n\n private async fetchWithAbort(input: string | URL, init: RequestInit): Promise<Response> {\n if (this.disposed) {\n throw new Error(\"HTTP transport disposed\");\n }\n\n const abortController = new AbortController();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await this.fetchImpl(input, {\n ...init,\n signal: abortController.signal,\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const parsed = parseJsonRpcMessage(line);\n const post = this.sendPost(line);\n if (\n (parsed.type === \"request\" && parsed.message.method === \"initialize\") ||\n (parsed.type === \"notification\" && parsed.message.method === \"notifications/initialized\")\n ) {\n await post;\n } else {\n void post.catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n }\n }\n\n private async sendPost(line: string): Promise<void> {\n const hasSessionId = this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n method: \"POST\",\n createHeaders: () => this.createPostHeaders(),\n body: line,\n });\n\n if (this.disposed) {\n await response.body?.cancel();\n return;\n }\n\n if (hasSessionId && response.status === 404) {\n this.sessionId = undefined;\n this.dispose(new Error(\"HTTP transport session expired (404 response)\"));\n return;\n }\n\n await this.throwForPostHttpError(response);\n if (this.disposed) {\n await response.body?.cancel();\n return;\n }\n this.captureSessionId(response);\n this.maybeOpenGetSseStream();\n void this.forwardResponseMessages(response).catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private async createPostHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createGetHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n }\n if (this.lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", this.lastEventId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createDeleteHeaders(sessionId: string): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n return this.authorizeRequestHeaders(headers);\n }\n\n private async authorizeRequestHeaders(headers: Headers): Promise<Headers> {\n await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers,\n fetch: this.fetchImpl,\n });\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n if (this.sessionId !== undefined && this.sessionId !== sessionId) {\n throw new Error(\"HTTP transport response changed active session ID\");\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private async sendSessionTerminationRequest(sessionId: string): Promise<void> {\n const response = await this.fetchImpl(this.url, {\n method: \"DELETE\",\n headers: await this.createDeleteHeaders(sessionId),\n });\n\n if (response.status === 405 || response.ok) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport DELETE failed (${statusDescriptor})`\n : `HTTP transport DELETE failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: () => this.createGetHeaders(),\n });\n\n if (response.status === 405) {\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n if (response.status === 404) {\n this.sessionId = undefined;\n throw new Error(\"HTTP transport session expired (GET 404 response)\");\n }\n\n if (!response.ok) {\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport GET failed (${statusDescriptor})`\n : `HTTP transport GET failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n if (contentType.toLowerCase().includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n return;\n }\n\n return;\n }\n\n private async throwForPostHttpError(response: Response): Promise<void> {\n if (response.status < 400) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, {\n resourceMetadataUrl,\n });\n const result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url),\n response: response.clone(),\n challenge,\n discovery,\n fetch: this.fetchImpl,\n });\n\n if (result.action === \"retry\") {\n return true;\n }\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n return false;\n }\n\n private async forwardResponseMessages(response: Response): Promise<void> {\n if (response.status === 202) {\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n const normalizedContentType = contentType.toLowerCase();\n if (normalizedContentType.includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n return;\n }\n\n if (normalizedContentType.includes(\"application/json\")) {\n await this.forwardJsonResponseMessage(response);\n return;\n }\n\n throw new Error(\"HTTP transport POST returned an unsupported response content type\");\n }\n\n private async forwardSseResponseMessages(response: Response): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser();\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n this.openSseReaders.add(reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages);\n this.lastEventId = parser.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk));\n this.lastEventId = parser.lastEventId;\n }\n\n this.writeSseMessages(parser.flush());\n this.lastEventId = parser.lastEventId;\n } finally {\n this.openSseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(response: Response): Promise<void> {\n const payload = await response.text();\n if (payload.length === 0) {\n return;\n }\n\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[]): void {\n for (const message of messages) {\n this.writeReadableLine(message.data);\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n method: \"GET\" | \"POST\";\n createHeaders: () => Promise<Headers>;\n body?: BodyInit;\n }): Promise<Response> {\n const request = async (): Promise<Response> =>\n this.fetchWithAbort(this.url, {\n method: input.method,\n headers: await input.createHeaders(),\n body: input.body,\n });\n\n let response = await request();\n if (await this.maybeHandleUnauthorizedResponse(response)) {\n response = await request();\n }\n\n const oauthError = this.oauthProvider === undefined\n ? null\n : this.readOAuthChallengeError(response);\n if (oauthError !== null) {\n throw oauthError;\n }\n\n return response;\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n const decoder = new TextDecoder();\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer +=\n chunk instanceof Uint8Array\n ? decoder.decode(chunk, { stream: true })\n : decoder.decode() + String(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n buffer += decoder.decode();\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n}\n\nexport class SseParser {\n private buffer = \"\";\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n\n while (true) {\n const newlineIndex = this.buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = normalizeLine(this.buffer.slice(0, newlineIndex));\n this.buffer = this.buffer.slice(newlineIndex + 1);\n this.consumeLine(line, messages);\n }\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n const messages: ParsedSseMessage[] = [];\n\n if (this.buffer.length > 0) {\n this.consumeLine(normalizeLine(this.buffer), messages);\n this.buffer = \"\";\n }\n\n this.emitEvent(messages);\n return messages;\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || eventType !== \"message\") {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n }\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\ninterface ActiveIncomingRequest {\n cancelled: boolean;\n}\n\nexport interface JsonRpcRequestOptions {\n timeoutMs?: number;\n onRequestId?: (requestId: RequestId) => void;\n onTimeout?: (requestId: RequestId) => void;\n}\n\ninterface JsonRpcRequestContext {\n id: RequestId;\n method: string;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: JsonRpcRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>\n ) {\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\n }\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n options.onTimeout?.(id);\n reject(new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n cancelRequest(requestId: RequestId, reason: unknown): boolean {\n const pending = this.pendingRequests.get(requestId);\n if (pending === undefined) {\n return false;\n }\n\n this.pendingRequests.delete(requestId);\n clearTimeout(pending.timeout);\n pending.reject(reason);\n return true;\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(): Promise<Error> {\n const streamClosedError = new Error(\"JSON-RPC input stream closed\");\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n clearTimeout(pending.timeout);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n const activeRequest: ActiveIncomingRequest = {\n cancelled: false,\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.cancelled = true;\n this.activeIncomingRequests.delete(requestId);\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isInitializeResult(value: unknown): value is InitializeResult {\n if (!isObjectRecord(value) || typeof value.protocolVersion !== \"string\") {\n return false;\n }\n\n if (!isServerCapabilities(value.capabilities)) {\n return false;\n }\n\n if (\n !isObjectRecord(value.serverInfo)\n || typeof value.serverInfo.name !== \"string\"\n || value.serverInfo.name.length === 0\n || typeof value.serverInfo.version !== \"string\"\n || value.serverInfo.version.length === 0\n ) {\n return false;\n }\n\n return value.instructions === undefined || typeof value.instructions === \"string\";\n}\n\nfunction isServerCapabilities(value: unknown): value is ServerCapabilities {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n for (const capability of [\"prompts\", \"resources\", \"tools\", \"logging\", \"completions\", \"experimental\"] as const) {\n if (value[capability] !== undefined && !isObjectRecord(value[capability])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (!isObjectRecord(value) || !Array.isArray(value.content)) {\n return false;\n }\n\n if (value.structuredContent !== undefined && !isObjectRecord(value.structuredContent)) {\n return false;\n }\n\n if (value.isError !== undefined && typeof value.isError !== \"boolean\") {\n return false;\n }\n\n return value.content.every(isContentItem);\n}\n\nfunction isToolsListResult(value: unknown): value is { tools: Tool[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.tools)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourcesListResult(value: unknown): value is { resources: Resource[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resources)\n && value.resources.every(isResource)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourceTemplatesListResult(\n value: unknown\n): value is { resourceTemplates: ResourceTemplate[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resourceTemplates)\n && value.resourceTemplates.every(isResourceTemplate)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isReadResourceResult(value: unknown): value is { contents: ResourceContents[] } {\n return isObjectRecord(value)\n && Array.isArray(value.contents)\n && value.contents.every(isResourceContents);\n}\n\nfunction isGetPromptResult(value: unknown): value is GetPromptResult {\n return isObjectRecord(value)\n && (value.description === undefined || typeof value.description === \"string\")\n && Array.isArray(value.messages)\n && value.messages.every(isPromptMessage);\n}\n\nfunction isCompleteResult(value: unknown): value is CompleteResult {\n return isObjectRecord(value)\n && isObjectRecord(value.completion)\n && Array.isArray(value.completion.values)\n && value.completion.values.every((candidate) => typeof candidate === \"string\")\n && (value.completion.hasMore === undefined || typeof value.completion.hasMore === \"boolean\")\n && (value.completion.total === undefined || typeof value.completion.total === \"number\");\n}\n\nfunction isResource(value: unknown): value is Resource {\n return isObjectRecord(value)\n && typeof value.uri === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\")\n && (value.size === undefined || typeof value.size === \"number\");\n}\n\nfunction isResourceTemplate(value: unknown): value is ResourceTemplate {\n return isObjectRecord(value)\n && typeof value.uriTemplate === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\");\n}\n\nfunction isResourceContents(value: unknown): value is ResourceContents {\n if (!isObjectRecord(value) || typeof value.uri !== \"string\") {\n return false;\n }\n\n if (value.mimeType !== undefined && typeof value.mimeType !== \"string\") {\n return false;\n }\n\n const hasText = value.text !== undefined;\n const hasBlob = value.blob !== undefined;\n\n if (!hasText && !hasBlob) {\n return false;\n }\n\n return (!hasText || typeof value.text === \"string\")\n && (!hasBlob || typeof value.blob === \"string\");\n}\n\nfunction isPromptMessage(value: unknown): value is PromptMessage {\n return isObjectRecord(value)\n && (value.role === \"user\" || value.role === \"assistant\")\n && isContentItem(value.content);\n}\n\nfunction isContentItem(value: unknown): value is ContentItem {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\" || value.type === \"audio\") {\n return typeof value.data === \"string\" && typeof value.mimeType === \"string\";\n }\n\n if (value.type !== \"resource\" || !isObjectRecord(value.resource)) {\n return false;\n }\n\n return isResourceContents(value.resource);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (typeof value.code !== \"number\" || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { createSecretStore, type CreateSecretStoreInput, type SecretStore } from \"auth-store\";\nimport type { OAuthSessionStore, StoredOAuthSession } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\ninterface StoredOAuthClient {\n clientId: string;\n clientSecret?: string;\n}\n\nexport interface OAuthClientStore {\n load(issuer: string): Promise<StoredOAuthClient | null>;\n save(issuer: string, client: StoredOAuthClient): Promise<void>;\n clear(issuer: string): Promise<void>;\n}\n\nexport function createAuthStoreSessionStore(\n options: CreateSecretStoreInput = {}\n): OAuthSessionStore {\n return {\n async load(resource: string): Promise<StoredOAuthSession | null> {\n const store = createResourceSecretStore(resource, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n if (isStoredOAuthSession(parsed)) {\n return parsed;\n }\n\n throw new Error(\"Stored OAuth session must match the expected shape\");\n },\n async save(resource: string, session: StoredOAuthSession): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.set(JSON.stringify(session));\n },\n async clear(resource: string): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.delete();\n }\n };\n}\n\nexport function createAuthStoreClientStore(options: CreateSecretStoreInput): OAuthClientStore {\n return {\n async load(issuer: string): Promise<StoredOAuthClient | null> {\n const store = createIssuerSecretStore(issuer, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n const clientId = isObjectRecord(parsed) ? getOwnString(parsed, \"clientId\") : undefined;\n if (clientId !== undefined) {\n const client: Record<string, unknown> = { clientId };\n if (\n isObjectRecord(parsed) &&\n Object.prototype.hasOwnProperty.call(parsed, \"clientSecret\")\n ) {\n client.clientSecret = getOwnEntry(parsed, \"clientSecret\");\n }\n\n return client as unknown as StoredOAuthClient;\n }\n\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer: string, client: StoredOAuthClient): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer: string): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.delete();\n }\n };\n}\n\nfunction createNamedSecretStore(\n key: string,\n options: CreateSecretStoreInput,\n defaults: { salt: string; directory: string; service: string; accountPrefix: string }\n): SecretStore {\n const hash = crypto.createHash(\"sha256\").update(key).digest(\"hex\");\n const configuredFilePath = options.fileStore?.filePath;\n const parsedFilePath = configuredFilePath === undefined ? null : path.parse(configuredFilePath);\n\n const fileStore = {\n ...options.fileStore,\n filePath:\n parsedFilePath === null\n ? undefined\n : path.join(\n parsedFilePath.dir,\n `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n ),\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory: options.fileStore?.defaultDirectory || defaults.directory,\n defaultFileName:\n parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`\n };\n\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\n\nfunction createResourceSecretStore(resource: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(canonicalizeResourceIndicator(resource), options, {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\"\n });\n}\n\nfunction createIssuerSecretStore(issuer: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(issuer, options, {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\"\n });\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnString(record: Record<string, unknown>, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isStoredOAuthSession(value: unknown): value is StoredOAuthSession {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resource\") &&\n isNonBlankOwnString(value, \"authorizationServer\") &&\n isStoredOAuthClient(getOwnEntry(value, \"client\")) &&\n isStoredOAuthDiscovery(getOwnEntry(value, \"discovery\")) &&\n isStoredOAuthTokensOrMissing(getOwnEntry(value, \"tokens\"))\n );\n}\n\nfunction isStoredOAuthClient(value: unknown): value is StoredOAuthClient {\n if (!isObjectRecord(value) || !isNonBlankOwnString(value, \"clientId\")) {\n return false;\n }\n\n const clientSecret = getOwnEntry(value, \"clientSecret\");\n return (\n clientSecret === undefined ||\n (typeof clientSecret === \"string\" && clientSecret.trim().length > 0)\n );\n}\n\nfunction isStoredOAuthDiscovery(value: unknown): value is StoredOAuthSession[\"discovery\"] {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resourceMetadataUrl\") &&\n isObjectRecord(getOwnEntry(value, \"resourceMetadata\")) &&\n isObjectRecord(getOwnEntry(value, \"authorizationServerMetadata\"))\n );\n}\n\nfunction isStoredOAuthTokensOrMissing(value: unknown): value is StoredOAuthSession[\"tokens\"] {\n if (value === undefined) {\n return true;\n }\n\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!isNonBlankOwnString(value, \"accessToken\") || getOwnString(value, \"tokenType\") !== \"Bearer\") {\n return false;\n }\n\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n if (\n expiresAt !== null &&\n (typeof expiresAt !== \"number\" ||\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime()))\n ) {\n return false;\n }\n\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n if (\n refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" || refreshToken.trim().length === 0)\n ) {\n return false;\n }\n\n const scope = getOwnEntry(value, \"scope\");\n return scope === undefined || (typeof scope === \"string\" && scope.trim().length > 0);\n}\n\nfunction isNonBlankOwnString(record: Record<string, unknown>, key: string): boolean {\n const value = getOwnString(record, key);\n return value !== undefined && value.trim().length > 0;\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, randomUUID, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport type { SecretStore } from \"./types.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly symbolicLinkCheckStartPath: string | null;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n if (input.filePath === undefined) {\n const homeDirectory = (input.getHomeDirectory ?? homedir)();\n const defaultDirectory = input.defaultDirectory ?? \".auth-store\";\n const defaultFileName = input.defaultFileName ?? \"credentials.enc\";\n assertSafeDefaultDirectory(defaultDirectory);\n assertSafeDefaultFileName(defaultFileName);\n this.filePath = path.join(\n homeDirectory,\n defaultDirectory,\n defaultFileName\n );\n this.symbolicLinkCheckStartPath = resolveDefaultDirectoryCheckStart(\n homeDirectory,\n defaultDirectory\n );\n } else {\n this.filePath = input.filePath;\n this.symbolicLinkCheckStartPath = null;\n }\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async get(): Promise<string | null> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n return null;\n }\n }\n\n async set(value: string): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const temporaryPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;\n let temporaryCreated = false;\n\n try {\n await this.assertCredentialPathHasNoSymbolicLinks(temporaryPath);\n await this.fs.writeFile(temporaryPath, JSON.stringify(document), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: ENCRYPTION_FILE_MODE\n });\n temporaryCreated = true;\n await this.fs.chmod(temporaryPath, ENCRYPTION_FILE_MODE);\n await this.fs.rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated || !isAlreadyExistsError(error)) {\n await removeIfPresent(this.fs, temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async delete(): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private async assertCredentialPathHasNoSymbolicLinks(targetPath: string): Promise<void> {\n const resolvedPath = path.resolve(targetPath);\n const protectedPaths = getProtectedCredentialPaths(\n resolvedPath,\n this.symbolicLinkCheckStartPath\n );\n\n for (const currentPath of protectedPaths) {\n try {\n const stats = await this.fs.lstat(currentPath);\n if (stats.isSymbolicLink()) {\n throw new Error(`Refusing to use encrypted credential path through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n const retryableKeyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt).catch((error) => {\n if (this.keyPromise === retryableKeyPromise) {\n this.keyPromise = null;\n }\n throw error;\n });\n this.keyPromise = retryableKeyPromise;\n }\n return this.keyPromise;\n }\n}\n\nfunction resolveDefaultDirectoryCheckStart(\n homeDirectory: string,\n defaultDirectory: string\n): string {\n const [firstSegment] = defaultDirectory.split(/[\\\\/]+/).filter(Boolean);\n return path.resolve(homeDirectory, firstSegment ?? \".\");\n}\n\nfunction getProtectedCredentialPaths(\n resolvedPath: string,\n symbolicLinkCheckStartPath: string | null\n): string[] {\n if (symbolicLinkCheckStartPath === null) {\n return getExplicitProtectedCredentialPaths(resolvedPath);\n }\n\n const resolvedStartPath = path.resolve(symbolicLinkCheckStartPath);\n if (!isPathInsideOrEqual(resolvedPath, resolvedStartPath)) {\n return [path.dirname(resolvedPath), resolvedPath];\n }\n\n const protectedPaths = [resolvedStartPath];\n let currentPath = resolvedStartPath;\n for (const segment of path.relative(resolvedStartPath, resolvedPath).split(path.sep).filter(Boolean)) {\n currentPath = path.join(currentPath, segment);\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction assertSafeDefaultDirectory(defaultDirectory: string): void {\n if (path.isAbsolute(defaultDirectory) || path.win32.isAbsolute(defaultDirectory)) {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n\n for (const segment of splitPathSegments(defaultDirectory)) {\n if (segment === \"..\") {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n }\n}\n\nfunction assertSafeDefaultFileName(defaultFileName: string): void {\n if (\n defaultFileName.trim().length === 0 ||\n defaultFileName === \".\" ||\n defaultFileName === \"..\" ||\n splitPathSegments(defaultFileName).length !== 1\n ) {\n throw new Error(\"defaultFileName must be a file name without path separators\");\n }\n}\n\nfunction splitPathSegments(value: string): string[] {\n return value\n .split(\"/\")\n .flatMap((segment) => segment.split(\"\\\\\"))\n .filter((segment) => segment.length > 0);\n}\n\nfunction getExplicitProtectedCredentialPaths(resolvedPath: string): string[] {\n const parsed = path.parse(resolvedPath);\n const segments = resolvedPath\n .slice(parsed.root.length)\n .split(path.sep)\n .filter((segment) => segment.length > 0);\n if (segments.length <= 1) {\n return [resolvedPath];\n }\n\n const protectedPaths: string[] = [];\n let currentPath = parsed.root;\n for (const [index, segment] of segments.entries()) {\n currentPath = path.join(currentPath, segment);\n if (index === 0) {\n continue;\n }\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction isPathInsideOrEqual(childPath: string, parentPath: string): boolean {\n const relativePath = path.relative(parentPath, childPath);\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nasync function removeIfPresent(fileSystem: EncryptedFileStoreFileSystem, filePath: string): Promise<void> {\n try {\n await fileSystem.unlink(filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = JSON.stringify([machineIdentity.hostname, machineIdentity.username, salt]);\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise.catch((error) => {\n if (derivedKeyCache.get(cacheKey) === keyPromise) {\n derivedKeyCache.delete(cacheKey);\n }\n throw error;\n });\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n const version = getOwnEntry(parsed, \"version\");\n const iv = getOwnEntry(parsed, \"iv\");\n const authTag = getOwnEntry(parsed, \"authTag\");\n const ciphertext = getOwnEntry(parsed, \"ciphertext\");\n if (version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof iv !== \"string\" ||\n typeof authTag !== \"string\" ||\n typeof ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version,\n iv,\n authTag,\n ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import { spawn } from \"node:child_process\";\nimport type { SecretStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface KeychainCommandOptions {\n stdin?: string;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service.trim();\n this.account = input.account.trim();\n if (this.service.length === 0) {\n throw new Error(\"Keychain service must not be empty\");\n }\n if (this.account.length === 0) {\n throw new Error(\"Keychain account must not be empty\");\n }\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0) {\n return stripTrailingLineBreak(getCommandOutput(result, \"stdout\"));\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async set(value: string): Promise<void> {\n if (value.includes(\"\\n\") || value.includes(\"\\r\")) {\n throw new Error(\"Keychain secrets cannot contain line breaks\");\n }\n\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-U\",\n \"-w\",\n value\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (getCommandExitCode(result) !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string,\n options?: KeychainCommandOptions\n ): Promise<KeychainCommandResult> {\n try {\n if (options === undefined) {\n return await this.runCommand(SECURITY_CLI, args);\n }\n return await this.runCommand(SECURITY_CLI, args, options);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [options?.stdin === undefined ? \"ignore\" : \"pipe\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let stdinErrorMessage: string | undefined;\n const appendStderr = (message: string): void => {\n stderr = stderr.length === 0\n ? message\n : `${stderr}${stderr.endsWith(\"\\n\") ? \"\" : \"\\n\"}${message}`;\n };\n const appendStdinError = (): void => {\n if (stdinErrorMessage === undefined) {\n return;\n }\n\n appendStderr(stdinErrorMessage);\n stdinErrorMessage = undefined;\n };\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n if (options?.stdin !== undefined) {\n child.stdin?.once(\"error\", (error) => {\n stdinErrorMessage = error instanceof Error ? error.message : String(error);\n });\n child.stdin?.end(options.stdin);\n }\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n appendStdinError();\n appendStderr(message);\n resolve({\n stdout,\n stderr,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n appendStdinError();\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n return getCommandExitCode(result) === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE;\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const exitCode = getCommandExitCode(result);\n const details =\n getCommandOutput(result, \"stderr\").trim()\n || getCommandOutput(result, \"stdout\").trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${exitCode}`);\n}\n\nfunction getCommandExitCode(result: KeychainCommandResult): number {\n const value = getOwnEntry(result, \"exitCode\");\n return typeof value === \"number\" && Number.isInteger(value) ? value : 1;\n}\n\nfunction getCommandOutput(\n result: KeychainCommandResult,\n key: \"stdout\" | \"stderr\"\n): string {\n const value = getOwnEntry(result, key);\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\nfunction resolveBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? getOwnEnvValue(input.env, envVar) ?? getOwnEnvValue(process.env, envVar);\n const backend = configuredBackend?.trim();\n\n if (backend === \"keychain\") {\n return \"keychain\";\n }\n\n if (backend === undefined || backend === \"file\") {\n return \"file\";\n }\n\n throw new Error(`Unsupported auth store backend: ${backend}`);\n}\n\nfunction getOwnEnvValue(\n env: NodeJS.ProcessEnv | undefined,\n key: string\n): string | undefined {\n return env !== undefined && Object.prototype.hasOwnProperty.call(env, key)\n ? env[key]\n : undefined;\n}\n", "export function canonicalizeResourceIndicator(value: string | URL): string {\n let url: URL;\n try {\n url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n } catch {\n throw new Error(\"Resource indicator must be an absolute URL\");\n }\n url.hash = \"\";\n return url.toString();\n}\n", "import { URL } from \"node:url\";\nimport type {\n DefaultOAuthClientProviderOptions,\n OAuthAuthorizationServerMetadata,\n OAuthClientMetadata,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n StoredOAuthSession,\n StoredOAuthTokens\n} from \"./types.js\";\nimport {\n createAuthStoreClientStore,\n createAuthStoreSessionStore\n} from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport {\n exchangeAuthorizationCode,\n OAuthError,\n refreshAccessToken,\n isRetryableOAuthError,\n readOAuthJsonObjectResponse\n} from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\nexport function createOAuthClientProvider(\n options: OAuthClientProviderOptions\n): OAuthClientProvider {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n\n return createDefaultOAuthClientProvider(options);\n}\n\nexport function createDefaultOAuthClientProvider(\n options: DefaultOAuthClientProviderOptions\n): OAuthClientProvider {\n const sessionStore = options.sessionStore ?? createAuthStoreSessionStore(options.authStore);\n const clientStore =\n options.authStore === undefined ? null : createAuthStoreClientStore(options.authStore);\n const now = options.now ?? Date.now;\n const registeredClients = new Map<string, StoredOAuthSession[\"client\"] | null>();\n const refreshPromises = new Map<string, Promise<StoredOAuthSession | null>>();\n const authorizationPromises = new Map<string, Promise<StoredOAuthSession>>();\n\n return {\n async authorizeRequest(input): Promise<void> {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false);\n const accessToken = session?.tokens?.accessToken;\n if (\n session === null ||\n accessToken === undefined ||\n session.tokens === undefined ||\n isExpired(session.tokens, now)\n ) {\n return;\n }\n\n assertRequestMatchesResource(requestUrl, session.resource);\n\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n },\n\n async handleUnauthorized(input) {\n try {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const forceRefresh =\n hasCachedAccessToken(await loadSession(resource)) &&\n input.challenge?.params.error === \"invalid_token\";\n const session = await ensureAuthorizedSession(\n resource,\n {\n ...input.discovery,\n resource\n },\n input.fetch,\n true,\n forceRefresh\n );\n\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" } as const;\n }\n\n return { action: \"retry\" } as const;\n } catch (error) {\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error))\n } as const;\n }\n }\n };\n\n async function ensureAuthorizedSession(\n resource: string,\n discovery: OAuthDiscoveryResult | undefined,\n fetch: OAuthMetadataFetch,\n allowInteractive: boolean,\n forceRefresh = false\n ): Promise<StoredOAuthSession | null> {\n const canonicalResource = canonicalizeResourceIndicator(resource);\n let session = await loadSession(canonicalResource);\n const sessionDiscovery = resolveDiscovery(discovery, session);\n\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n\n if (\n session?.tokens?.refreshToken !== undefined &&\n sessionDiscovery !== undefined &&\n (forceRefresh || isExpired(session.tokens, now))\n ) {\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n\n if (forceRefresh && session?.tokens !== undefined) {\n session = clearSessionTokens(session);\n await saveSession(canonicalResource, session);\n }\n\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch);\n }\n\n async function refreshSession(\n resource: string,\n session: StoredOAuthSession,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession | null> {\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n\n const inFlight = refreshPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n try {\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n\n let refreshAttempted = false;\n let refreshedTokens: StoredOAuthTokens;\n\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch,\n now\n });\n break;\n } catch (error) {\n if (error instanceof OAuthError && error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n\n if (\n shouldReRegisterStoredDynamicClient(\n error,\n await loadRegisteredClient(discovery.authorizationServer),\n false\n )\n ) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n\n throw error;\n }\n }\n\n const updatedSession: StoredOAuthSession = {\n ...session,\n tokens: {\n ...refreshedTokens,\n refreshToken: refreshedTokens.refreshToken ?? session.tokens.refreshToken\n },\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, updatedSession);\n return updatedSession;\n } finally {\n refreshPromises.delete(resource);\n }\n })();\n\n refreshPromises.set(resource, promise);\n return promise;\n }\n\n async function authorizeSession(\n resource: string,\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession> {\n const inFlight = authorizationPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n openBrowser: options.browser.openBrowser,\n readLine: options.browser.readLine,\n createServer: options.browser.createServer,\n landingPage: options.browser.landingPage\n });\n let resolvedClient: ResolvedOAuthClient | null = null;\n\n try {\n resolvedClient = await resolveClient(\n currentSession,\n discovery,\n loopback.redirectUri,\n fetch\n );\n const sessionWithoutTokens: StoredOAuthSession = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, sessionWithoutTokens);\n\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata: getClientMetadata(options.client)\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch,\n now\n });\n\n const session: StoredOAuthSession = {\n ...sessionWithoutTokens,\n tokens\n };\n\n await saveSession(resource, session);\n return session;\n } catch (error) {\n if (shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n throw error;\n } finally {\n loopback.close();\n }\n }\n })();\n\n const finalPromise = promise.finally(() => {\n authorizationPromises.delete(resource);\n });\n authorizationPromises.set(resource, finalPromise);\n return finalPromise;\n }\n\n async function resolveClient(\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n redirectUri: string,\n fetch: OAuthMetadataFetch\n ): Promise<ResolvedOAuthClient> {\n const configuredClient = normalizeConfiguredClient(options.client);\n\n if (options.client.mode === \"static\") {\n if (configuredClient === null) {\n throw new Error(\"OAuth client_id must not be blank\");\n }\n\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const registrationEndpoint = getOwnString(\n discovery.authorizationServerMetadata,\n \"registration_endpoint\"\n );\n if (registrationEndpoint === undefined && configuredClient !== null) {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const storedClient = await loadRegisteredClient(discovery.authorizationServer);\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient\n };\n }\n\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n const isConfiguredStaticFallback =\n configuredClient !== null &&\n existingSession.client.clientId === configuredClient.clientId &&\n existingSession.client.clientSecret === configuredClient.clientSecret;\n\n if (!isConfiguredStaticFallback) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n }\n\n const registrationBody = buildClientRegistrationBody(\n getClientMetadata(options.client),\n redirectUri\n );\n const response = await fetch(registrationEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(registrationBody)\n });\n const payload = await readOAuthJsonObjectResponse(response);\n const clientId = getOwnString(payload, \"client_id\");\n\n if (clientId === undefined || clientId.trim().length === 0) {\n throw new Error(\"OAuth client registration response missing client_id\");\n }\n\n const clientSecret = getOwnString(payload, \"client_secret\");\n const registeredClient = {\n clientId: clientId.trim(),\n clientSecret:\n clientSecret !== undefined && clientSecret.trim().length > 0\n ? clientSecret.trim()\n : undefined\n };\n await saveRegisteredClient(discovery.authorizationServer, registeredClient);\n\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: registeredClient\n };\n }\n\n async function loadSession(resource: string): Promise<StoredOAuthSession | null> {\n return normalizeLoadedSession(await sessionStore.load(resource));\n }\n\n async function saveSession(resource: string, session: StoredOAuthSession): Promise<void> {\n await sessionStore.save(resource, session);\n }\n\n async function clearSession(resource: string): Promise<void> {\n await sessionStore.clear(resource);\n }\n\n async function loadRegisteredClient(\n issuer: string\n ): Promise<StoredOAuthSession[\"client\"] | null> {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n\n if (clientStore === null) {\n return null;\n }\n\n const client = await clientStore.load(issuer);\n const normalizedClient = client === null ? null : normalizeStoredClient(client);\n if (client !== null && normalizedClient === null) {\n await clientStore.clear(issuer);\n return null;\n }\n\n registeredClients.set(issuer, normalizedClient);\n return normalizedClient;\n }\n\n async function saveRegisteredClient(\n issuer: string,\n client: StoredOAuthSession[\"client\"]\n ): Promise<void> {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n\n async function clearRegisteredClient(issuer: string): Promise<void> {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\n\nfunction isProviderOptions(\n options: OAuthClientProviderOptions\n): options is { provider: OAuthClientProvider } {\n return Object.prototype.hasOwnProperty.call(options, \"provider\");\n}\n\nfunction isExpired(tokens: StoredOAuthTokens, now: () => number): boolean {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\n\nfunction resolveDiscovery(\n discovery: OAuthDiscoveryResult | undefined,\n session: StoredOAuthSession | null\n): OAuthDiscoveryResult | undefined {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource)\n };\n }\n\n if (session === null) {\n return undefined;\n }\n\n const metadata = session.discovery.authorizationServerMetadata;\n const issuer = getOwnString(metadata, \"issuer\");\n const authorizationEndpoint = getOwnString(metadata, \"authorization_endpoint\");\n const tokenEndpoint = getOwnString(metadata, \"token_endpoint\");\n const codeChallengeMethodsSupported = getOwnStringArray(\n metadata,\n \"code_challenge_methods_supported\"\n );\n if (\n issuer === undefined ||\n authorizationEndpoint === undefined ||\n tokenEndpoint === undefined ||\n codeChallengeMethodsSupported === undefined ||\n !codeChallengeMethodsSupported.includes(\"S256\")\n ) {\n return undefined;\n }\n\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery\n .resourceMetadata as OAuthDiscoveryResult[\"resourceMetadata\"],\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata as OAuthAuthorizationServerMetadata\n };\n}\n\nfunction clearSessionTokens(session: StoredOAuthSession): StoredOAuthSession {\n const nextSession = { ...session };\n delete nextSession.tokens;\n return nextSession;\n}\n\nfunction hasCachedAccessToken(\n session: StoredOAuthSession | null\n): session is StoredOAuthSession & { tokens: StoredOAuthTokens } {\n return session?.tokens?.accessToken !== undefined;\n}\n\nfunction normalizeLoadedSession(session: StoredOAuthSession | null): StoredOAuthSession | null {\n if (session === null) {\n return null;\n }\n\n const client = normalizeStoredClient(getOwnEntry(session, \"client\"));\n if (client === null) {\n return { ...session, client: { clientId: \"\" }, tokens: undefined };\n }\n\n return {\n ...session,\n client,\n tokens: normalizeStoredTokens(getOwnEntry(session, \"tokens\"))\n };\n}\n\nfunction normalizeStoredClient(value: unknown): StoredOAuthSession[\"client\"] | null {\n if (!isObjectRecord(value)) {\n return null;\n }\n\n const clientId = getOwnString(value, \"clientId\");\n if (clientId === undefined || clientId.trim().length === 0) {\n return null;\n }\n const normalizedClientId = clientId.trim();\n\n const clientSecret = getOwnEntry(value, \"clientSecret\");\n if (clientSecret === undefined) {\n return { clientId: normalizedClientId };\n }\n\n if (typeof clientSecret !== \"string\" || clientSecret.trim().length === 0) {\n return null;\n }\n const normalizedClientSecret = clientSecret.trim();\n\n return { clientId: normalizedClientId, clientSecret: normalizedClientSecret };\n}\n\nfunction normalizeStoredTokens(value: unknown): StoredOAuthTokens | undefined {\n if (value === undefined || !isObjectRecord(value)) {\n return undefined;\n }\n\n const accessToken = getOwnString(value, \"accessToken\");\n const tokenType = getOwnString(value, \"tokenType\");\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n const scope = getOwnString(value, \"scope\");\n const normalizedAccessToken = accessToken?.trim();\n const normalizedRefreshToken = typeof refreshToken === \"string\" ? refreshToken.trim() : undefined;\n const normalizedScope = scope?.trim();\n\n if (\n accessToken === undefined ||\n normalizedAccessToken === undefined ||\n normalizedAccessToken.length === 0 ||\n tokenType !== \"Bearer\" ||\n !(\n expiresAt === null ||\n (typeof expiresAt === \"number\" &&\n Number.isSafeInteger(expiresAt) &&\n expiresAt <= MAX_JS_DATE_MS &&\n Number.isFinite(new Date(expiresAt).getTime()))\n ) ||\n (refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" ||\n normalizedRefreshToken === undefined ||\n normalizedRefreshToken.length === 0))\n ) {\n return undefined;\n }\n\n return {\n accessToken: normalizedAccessToken,\n tokenType,\n expiresAt,\n ...(normalizedRefreshToken === undefined ? {} : { refreshToken: normalizedRefreshToken }),\n ...(normalizedScope === undefined || normalizedScope.length === 0\n ? {}\n : { scope: normalizedScope })\n };\n}\n\nfunction getClientMetadata(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): OAuthClientMetadata | undefined {\n if (client.metadata === undefined) {\n return undefined;\n }\n\n return {\n clientName: normalizeOptionalOAuthString(client.metadata.clientName),\n scope: normalizeOptionalOAuthString(client.metadata.scope),\n softwareId: normalizeOptionalOAuthString(client.metadata.softwareId),\n softwareVersion: normalizeOptionalOAuthString(client.metadata.softwareVersion)\n };\n}\n\nfunction normalizeConfiguredClient(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): StoredOAuthSession[\"client\"] | null {\n const clientId = normalizeOptionalOAuthString(client.clientId);\n if (clientId === undefined) {\n return null;\n }\n\n const clientSecret = normalizeOptionalOAuthString(client.clientSecret);\n return clientSecret === undefined ? { clientId } : { clientId, clientSecret };\n}\n\nfunction normalizeOptionalOAuthString(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction requireOwnString(record: object, key: string, label: string): string {\n const value = getOwnString(record, key);\n if (value === undefined) {\n throw new Error(`${label} is missing ${key}`);\n }\n\n return value;\n}\n\nfunction getOwnStringArray(record: object, key: string): string[] | undefined {\n const value = getOwnEntry(record, key);\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\")\n ? value\n : undefined;\n}\n\nfunction buildAuthorizationUrl(input: {\n metadata: OAuthAuthorizationServerMetadata;\n resource: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n clientMetadata: OAuthClientMetadata | undefined;\n}): string {\n const authorizationEndpoint = requireOwnString(\n input.metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const issuer = requireOwnString(input.metadata, \"issuer\", \"Authorization server metadata\");\n const url = new URL(authorizationEndpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer,\n requireIssuer:\n getOwnEntry(input.metadata, \"authorization_response_iss_parameter_supported\") === true\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n\n return url.toString();\n}\n\nfunction assertS256PkceSupport(metadata: OAuthAuthorizationServerMetadata): void {\n if (!getOwnStringArray(metadata, \"code_challenge_methods_supported\")?.includes(\"S256\")) {\n throw new Error(\n \"Authorization server metadata must advertise code_challenge_methods_supported including S256\"\n );\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n return (\n normalizedHostname === \"localhost\" ||\n normalizedHostname === \"::1\" ||\n normalizedHostname.startsWith(\"127.\")\n );\n}\n\nfunction assertSecureUrl(value: string, label: string): void {\n const url = new URL(value);\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction assertSecureOAuthFlowEndpoints(metadata: OAuthAuthorizationServerMetadata): void {\n const authorizationEndpoint = requireOwnString(\n metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const tokenEndpoint = requireOwnString(\n metadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n );\n const registrationEndpoint = getOwnString(metadata, \"registration_endpoint\");\n\n assertNoAccessTokenInUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(tokenEndpoint, \"Token endpoint\");\n assertSecureUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertSecureUrl(tokenEndpoint, \"Token endpoint\");\n\n if (registrationEndpoint !== undefined) {\n assertNoAccessTokenInUrl(registrationEndpoint, \"Registration endpoint\");\n assertSecureUrl(registrationEndpoint, \"Registration endpoint\");\n }\n}\n\nfunction assertNoAccessTokenInUrl(value: string | URL, label: string): void {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\n\nfunction assertRequestMatchesResource(requestUrl: string, resource: string): void {\n if (requestUrl !== resource) {\n throw new Error(\n `OAuth request URL ${requestUrl} does not match discovered resource ${resource}`\n );\n }\n}\n\nfunction buildClientRegistrationBody(\n metadata: OAuthClientMetadata | undefined,\n redirectUri: string\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\"\n };\n const clientName = metadata === undefined ? undefined : getOwnString(metadata, \"clientName\");\n const scope = metadata === undefined ? undefined : getOwnString(metadata, \"scope\");\n const softwareId = metadata === undefined ? undefined : getOwnString(metadata, \"softwareId\");\n const softwareVersion =\n metadata === undefined ? undefined : getOwnString(metadata, \"softwareVersion\");\n\n if (clientName !== undefined && clientName.length > 0) {\n body.client_name = clientName;\n }\n\n if (scope !== undefined && scope.length > 0) {\n body.scope = scope;\n }\n\n if (softwareId !== undefined && softwareId.length > 0) {\n body.software_id = softwareId;\n }\n\n if (softwareVersion !== undefined && softwareVersion.length > 0) {\n body.software_version = softwareVersion;\n }\n\n return body;\n}\n\nfunction toStoredDiscovery(discovery: OAuthDiscoveryResult): StoredOAuthSession[\"discovery\"] {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata\n };\n}\n\ninterface ResolvedOAuthClient {\n kind: \"dynamic\" | \"static\";\n fromStoredRegistration: boolean;\n client: StoredOAuthSession[\"client\"];\n}\n\nfunction shouldReRegisterStoredDynamicClient(\n error: unknown,\n client: ResolvedOAuthClient | StoredOAuthSession[\"client\"] | null,\n alreadyAttempted: boolean\n): boolean {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n\n if (client === null) {\n return false;\n }\n\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n\n return true;\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\n\nexport interface OAuthLandingPage {\n title: string;\n body: string;\n}\n\nexport interface LoopbackAuthorizationOptions {\n openBrowser?: (url: string) => Promise<void>;\n readLine?: () => Promise<string>;\n createServer?: () => http.Server;\n landingPage?: OAuthLandingPage;\n callbackPath?: string;\n}\n\nexport interface LoopbackAuthorizationSession {\n redirectUri: string;\n waitForCode(authorizationUrl: string): Promise<string>;\n close(): void;\n}\n\nexport async function createLoopbackAuthorizationSession(\n options: LoopbackAuthorizationOptions = {}\n): Promise<LoopbackAuthorizationSession> {\n const callbackPath = options.callbackPath ?? \"/callback\";\n const server = options.createServer ? options.createServer() : http.createServer();\n const port = await startServer(server);\n const redirectUri = `http://127.0.0.1:${port}${callbackPath}`;\n\n return {\n redirectUri,\n async waitForCode(authorizationUrl: string): Promise<string> {\n return waitForAuthorizationCode(server, authorizationUrl, options, callbackPath);\n },\n close(): void {\n server.closeAllConnections?.();\n server.close();\n }\n };\n}\n\nasync function startServer(server: http.Server): Promise<number> {\n return new Promise<number>((resolve, reject) => {\n const handleError = (error: Error) => {\n server.off(\"error\", handleError);\n reject(error);\n };\n\n server.once(\"error\", handleError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", handleError);\n const address = server.address() as { port: number };\n resolve(address.port);\n });\n });\n}\n\nfunction waitForAuthorizationCode(\n server: http.Server,\n authorizationUrl: string,\n options: LoopbackAuthorizationOptions,\n callbackPath: string\n): Promise<string> {\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (!settled) {\n settled = true;\n fn();\n }\n };\n\n server.on(\"request\", (req: http.IncomingMessage, res: http.ServerResponse) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname !== callbackPath) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const callbackParameters = {\n code: url.searchParams.get(\"code\"),\n error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\")\n };\n\n try {\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n return;\n }\n\n const authorizationError = callbackParameters.error;\n if (authorizationError !== null) {\n const description = callbackParameters.errorDescription ?? authorizationError;\n res.writeHead(400);\n res.end(`Authorization failed: ${description}`);\n settle(() => reject(createAuthorizationError(authorizationError, description)));\n return;\n }\n\n try {\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n });\n\n if (options.readLine !== undefined) {\n options\n .readLine()\n .then((input) => {\n const callbackParameters = extractCallbackParametersFromInput(input);\n if (callbackParameters === null) {\n settle(() => reject(new Error(\"OAuth callback missing authorization code\")));\n return;\n }\n\n try {\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n if (callbackParameters.error !== null) {\n const description = callbackParameters.errorDescription ?? callbackParameters.error;\n throw createAuthorizationError(callbackParameters.error, description);\n }\n\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n settle(() => resolve(code));\n } catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n })\n .catch((error) => {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n });\n }\n\n if (options.openBrowser !== undefined) {\n options.openBrowser(authorizationUrl).catch((error) => {\n settle(() => reject(error));\n });\n }\n });\n}\n\nexport function extractCodeFromInput(input: string): string | null {\n return extractCallbackParametersFromInput(input)?.code ?? null;\n}\n\nfunction extractCallbackParametersFromInput(input: string): AuthorizationCallbackParameters | null {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get(\"code\"),\n error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\")\n };\n } catch {\n return {\n code: trimmed,\n error: null,\n errorDescription: null,\n state: null,\n iss: null\n };\n }\n}\n\ninterface AuthorizationCallbackParameters {\n code: string | null;\n error: string | null;\n errorDescription: string | null;\n state: string | null;\n iss: string | null;\n}\n\nfunction readExpectedAuthorizationCallback(authorizationUrl: string): {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n} {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false\n };\n}\n\nfunction validateAuthorizationCallbackParameters(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): string {\n validateAuthorizationCallbackBinding(callback, expected);\n\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n\n return callback.code;\n}\n\nfunction validateAuthorizationCallbackBinding(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): void {\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n\n if (\n callback.iss !== null &&\n callback.iss.length > 0 &&\n expected.issuer !== null &&\n callback.iss !== expected.issuer\n ) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n}\n\nfunction createAuthorizationError(error: string, description: string): Error {\n return new Error(`OAuth authorization failed: ${error} \u2014 ${description}`);\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n}\n\nexport function buildSuccessPage(landingPage?: OAuthLandingPage): string {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n '<body style=\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\">',\n '<div style=\"text-align:center\">',\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\"\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\n\ninterface AuthorizationStatePayload {\n v: 1;\n n: string;\n i: string;\n r: boolean;\n}\n\nexport function createAuthorizationState(input: {\n issuer: string;\n requireIssuer: boolean;\n}): string {\n const payload: AuthorizationStatePayload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\n\nexport function parseAuthorizationState(\n value: string | null\n): { issuer: string; requireIssuer: boolean } | null {\n if (value === null || value.length === 0) {\n return null;\n }\n\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded) as unknown;\n if (!isObjectRecord(parsed)) {\n return null;\n }\n\n const version = getOwnEntry(parsed, \"v\");\n const nonce = getOwnEntry(parsed, \"n\");\n const issuer = getOwnEntry(parsed, \"i\");\n const requireIssuer = getOwnEntry(parsed, \"r\");\n if (\n version !== 1\n || typeof nonce !== \"string\"\n || nonce.length === 0\n || typeof issuer !== \"string\"\n || issuer.length === 0\n || typeof requireIssuer !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n issuer,\n requireIssuer,\n };\n } catch {\n return null;\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n", "import crypto from \"node:crypto\";\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "import type { OAuthMetadataFetch, StoredOAuthTokens } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\ninterface OAuthErrorShape {\n error: string;\n error_description?: string;\n error_uri?: string;\n}\n\nexport class OAuthError extends Error {\n readonly error: string;\n readonly errorDescription: string | undefined;\n readonly errorUri: string | undefined;\n readonly error_description: string | undefined;\n readonly error_uri: string | undefined;\n readonly status: number;\n readonly retryable: boolean;\n readonly terminal: boolean;\n\n constructor(shape: OAuthErrorShape, status: number) {\n super(shape.error_description ?? shape.error);\n this.name = \"OAuthError\";\n this.error = shape.error;\n this.errorDescription = shape.error_description;\n this.errorUri = shape.error_uri;\n this.error_description = shape.error_description;\n this.error_uri = shape.error_uri;\n this.status = status;\n this.retryable = isRetryableOAuthError(this);\n this.terminal = !this.retryable;\n }\n}\n\nexport function isRetryableOAuthError(error: unknown): error is OAuthError {\n return (\n error instanceof OAuthError &&\n (error.status >= 500 ||\n error.error === \"server_error\" ||\n error.error === \"temporarily_unavailable\")\n );\n}\n\nexport async function exchangeAuthorizationCode(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n resource\n },\n fetch: input.fetch,\n now: input.now\n });\n}\n\nexport async function refreshAccessToken(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n refreshToken: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"refresh_token\",\n refresh_token: input.refreshToken,\n resource\n },\n fetch: input.fetch,\n now: input.now\n });\n}\n\nasync function requestTokens(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n params: Record<string, string>;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const body = new URLSearchParams({\n client_id: input.clientId,\n ...input.params\n });\n\n if (input.clientSecret !== undefined) {\n body.set(\"client_secret\", input.clientSecret);\n }\n\n const response = await input.fetch(input.tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n },\n body: body.toString()\n });\n const payload = await readOAuthJsonObjectResponse(response);\n const accessToken = getOwnEntry(payload, \"access_token\");\n\n if (typeof accessToken !== \"string\" || accessToken.trim().length === 0) {\n throw new Error(\"OAuth token response missing access_token\");\n }\n const normalizedAccessToken = accessToken.trim();\n\n const tokenType = normalizeBearerTokenType(getOwnEntry(payload, \"token_type\"));\n if (tokenType === null) {\n throw new Error(\"OAuth token response missing token_type=Bearer\");\n }\n\n const expiresIn = getOwnEntry(payload, \"expires_in\");\n let expiresAt: number | null = null;\n if (expiresIn !== undefined) {\n if (\n typeof expiresIn !== \"number\" ||\n !Number.isFinite(expiresIn) ||\n !Number.isInteger(expiresIn) ||\n expiresIn < 0\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n\n expiresAt = input.now() + expiresIn * 1000;\n if (\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime())\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n }\n\n const refreshToken = getOwnEntry(payload, \"refresh_token\");\n const scope = getOwnEntry(payload, \"scope\");\n const normalizedRefreshToken =\n typeof refreshToken === \"string\" && refreshToken.trim().length > 0\n ? refreshToken.trim()\n : undefined;\n const normalizedScope =\n typeof scope === \"string\" && scope.trim().length > 0 ? scope.trim() : undefined;\n return {\n accessToken: normalizedAccessToken,\n refreshToken: normalizedRefreshToken === undefined ? undefined : normalizedRefreshToken,\n tokenType,\n expiresAt,\n scope: normalizedScope === undefined ? undefined : normalizedScope\n };\n}\n\nexport async function readOAuthJsonObjectResponse(\n response: Response\n): Promise<Record<string, unknown>> {\n const fallbackError = createFallbackOAuthError(response.status);\n let payload: unknown;\n\n try {\n payload = await response.json();\n } catch {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n const record = payload as Record<string, unknown>;\n if (!response.ok) {\n throw new OAuthError(readOAuthError(record, fallbackError.error), response.status);\n }\n\n return record;\n}\n\nfunction readOAuthError(\n payload: Record<string, unknown>,\n fallbackError = \"server_error\"\n): OAuthErrorShape {\n const error = getOwnEntry(payload, \"error\");\n const errorDescription = getOwnEntry(payload, \"error_description\");\n const errorUri = getOwnEntry(payload, \"error_uri\");\n return {\n error: typeof error === \"string\" ? error : fallbackError,\n error_description: typeof errorDescription === \"string\" ? errorDescription : undefined,\n error_uri: typeof errorUri === \"string\" ? errorUri : undefined\n };\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction createFallbackOAuthError(status: number): OAuthError {\n const error = status === 503 ? \"temporarily_unavailable\" : \"server_error\";\n return new OAuthError({ error }, status);\n}\n\nfunction normalizeBearerTokenType(value: unknown): \"Bearer\" | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n return value.toLowerCase() === \"bearer\" ? \"Bearer\" : null;\n}\n", "import {\n decodeProtectedHeader,\n errors,\n importJWK,\n jwtVerify,\n type JSONWebKeySet,\n type JWK,\n type JWTPayload\n} from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\"\n] as const;\n\ntype FetchLike = typeof fetch;\ntype TokenVerificationErrorCode =\n | \"invalid_token\"\n | \"insufficient_scope\"\n | \"temporarily_unavailable\";\n\nexport interface JwksTokenVerifierOptions {\n jwksUrl: string | URL;\n clockSkewSeconds?: number;\n allowedAlgorithms?: readonly string[];\n jwksCacheTtlMs?: number;\n jwksFetchTimeoutMs?: number;\n jwksRefreshCooldownMs?: number;\n allowInsecureJwks?: boolean;\n requireAccessTokenType?: boolean;\n fetch?: FetchLike;\n}\n\nexport interface JwksVerifiedAccessToken {\n token: string;\n issuer: string;\n audience: string[];\n scopes: string[];\n expiresAt: number;\n claims: Record<string, unknown>;\n subject?: string;\n clientId?: string;\n}\n\nexport interface JwksTokenVerifier {\n verify(input: {\n token: string;\n resource: string;\n authorizationServers: readonly string[];\n requiredScopes: readonly string[];\n }): Promise<JwksVerifiedAccessToken>;\n}\n\ntype TokenVerificationErrorShape = Error & {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n};\n\nfunction isTokenVerificationErrorShape(error: unknown): error is TokenVerificationErrorShape {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const challengeError = error as { error?: unknown };\n return (\n challengeError.error === \"invalid_token\" ||\n challengeError.error === \"insufficient_scope\" ||\n challengeError.error === \"temporarily_unavailable\"\n );\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction toUrl(value: string | URL, label: string): URL {\n try {\n return new URL(String(value));\n } catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\n\nfunction normalizeAudience(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n return isStringArray(value) ? [...value] : [];\n}\n\nfunction normalizeVerifiedAudience(value: unknown, expectedResource: string): string[] {\n const audiences = normalizeAudience(value);\n for (const audience of audiences) {\n try {\n const normalizedAudience = canonicalizeResourceIndicator(audience);\n if (normalizedAudience === expectedResource) {\n return [normalizedAudience];\n }\n } catch {\n continue;\n }\n }\n\n throw createInvalidTokenError(\"audience mismatch\");\n}\n\nfunction parseScopes(payload: JWTPayload): string[] {\n const scope = getOwnString(payload, \"scope\");\n const scopes = getOwnEntry(payload, \"scopes\");\n const raw = scope !== undefined ? scope : typeof scopes === \"string\" ? scopes : null;\n\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n\n return isStringArray(scopes) ? [...scopes] : [];\n}\n\nfunction toVerifiedAccessToken(\n token: string,\n payload: JWTPayload,\n audience = normalizeAudience(getOwnEntry(payload, \"aud\"))\n): JwksVerifiedAccessToken {\n const issuer = getOwnString(payload, \"iss\");\n const expiresAt = getOwnEntry(payload, \"exp\");\n const subject = getOwnString(payload, \"sub\");\n const clientId = getOwnString(payload, \"client_id\");\n\n return {\n token,\n issuer: issuer ?? \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: expiresAt as number,\n claims: { ...payload },\n ...(subject !== undefined\n ? {\n subject\n }\n : {}),\n ...(clientId !== undefined\n ? {\n clientId\n }\n : {})\n };\n}\n\nfunction createTokenVerificationError(input: {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n}): TokenVerificationErrorShape {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\n\nfunction createTemporarilyUnavailableError(): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"temporarily_unavailable\",\n errorDescription: \"token verification temporarily unavailable\"\n });\n}\n\nfunction createInvalidTokenError(errorDescription: string): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription\n });\n}\n\nfunction normalizeVerificationError(error: unknown): TokenVerificationErrorShape {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n\n if (error.claim === \"exp\") {\n if (error.reason === \"missing\") {\n return createInvalidTokenError(\"token missing expiry\");\n }\n\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error.claim === \"typ\") {\n return createInvalidTokenError(\"invalid access token type\");\n }\n }\n\n if (error instanceof errors.JOSEAlgNotAllowed || error instanceof errors.JOSENotSupported) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n if (\n error instanceof errors.JWKSNoMatchingKey ||\n error instanceof errors.JWKSMultipleMatchingKeys ||\n error instanceof errors.JWSSignatureVerificationFailed\n ) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n\n if (error instanceof errors.JWKSInvalid || error instanceof errors.JWKSTimeout) {\n return createTemporarilyUnavailableError();\n }\n\n return createInvalidTokenError(\"token verification failed\");\n}\n\nasync function loadJwks(\n jwksUrl: URL,\n fetchImplementation: FetchLike,\n timeoutMs: number\n): Promise<JSONWebKeySet> {\n try {\n const response = await fetchImplementation(jwksUrl, {\n headers: {\n Accept: \"application/json\"\n },\n signal: AbortSignal.timeout(timeoutMs)\n });\n\n if (!response.ok) {\n throw createTemporarilyUnavailableError();\n }\n\n const payload = (await response.json()) as unknown;\n const keys = isObjectRecord(payload) ? getOwnEntry(payload, \"keys\") : undefined;\n if (!isObjectRecord(payload) || !Array.isArray(keys) || !keys.every(isObjectRecord)) {\n throw createTemporarilyUnavailableError();\n }\n\n return { keys } as JSONWebKeySet;\n } catch (error) {\n if (isTokenVerificationErrorShape(error)) {\n throw error;\n }\n\n throw createTemporarilyUnavailableError();\n }\n}\n\nfunction resolveAlgorithm(token: string, allowedAlgorithms: readonly string[]): string {\n const header = decodeProtectedHeader(token);\n const alg = getOwnString(header, \"alg\");\n\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n\n if (\n typeof alg !== \"string\" ||\n alg === \"none\" ||\n alg.startsWith(\"HS\") ||\n !allowedAlgorithms.includes(alg)\n ) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n return alg;\n}\n\nfunction hasCriticalHeaderClaims(header: ReturnType<typeof decodeProtectedHeader>): boolean {\n const criticalClaims = getOwnEntry(header, \"crit\");\n return Array.isArray(criticalClaims) && criticalClaims.length > 0;\n}\n\nfunction isVerificationCandidate(key: JWK, alg: string, kid: string | undefined): boolean {\n const keyId = getOwnString(key, \"kid\");\n const keyAlgorithm = getOwnString(key, \"alg\");\n const keyUse = getOwnString(key, \"use\");\n const keyOps = getOwnEntry(key, \"key_ops\");\n\n if (kid !== undefined && keyId !== kid) {\n return false;\n }\n\n if (keyAlgorithm !== undefined && keyAlgorithm !== alg) {\n return false;\n }\n\n if (keyUse !== undefined && keyUse !== \"sig\") {\n return false;\n }\n\n if (Array.isArray(keyOps) && !keyOps.includes(\"verify\")) {\n return false;\n }\n\n return true;\n}\n\nfunction shouldContinueWithNextKey(error: unknown): boolean {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\n\nasync function verifyJwtAgainstJwks(input: {\n token: string;\n jwks: JSONWebKeySet;\n alg: string;\n authorizationServers: readonly string[];\n clockSkewSeconds: number;\n requireAccessTokenType: boolean;\n}) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = getOwnString(protectedHeader, \"kid\");\n const candidateKeys = input.jwks.keys.filter((key) =>\n isVerificationCandidate(key, input.alg, kid)\n );\n\n if (candidateKeys.length === 0) {\n throw new NoMatchingKeyError();\n }\n\n let lastSignatureError: unknown;\n let hasMalformedKey = false;\n\n for (const candidate of candidateKeys) {\n let key;\n try {\n key = await importJWK(candidate, input.alg);\n } catch {\n hasMalformedKey = true;\n continue;\n }\n\n try {\n return await jwtVerify(input.token, key as never, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n requiredClaims: [\"exp\"],\n ...(input.requireAccessTokenType ? { typ: \"at+jwt\" } : {})\n });\n } catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n\n throw error;\n }\n }\n\n if (hasMalformedKey) {\n throw createTemporarilyUnavailableError();\n }\n\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\n\nclass NoMatchingKeyError extends Error {}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) {\n return true;\n }\n\n if (hostname === \"[::1]\" || hostname === \"::1\") {\n return true;\n }\n\n const parts = hostname.split(\".\");\n return (\n parts.length === 4 &&\n parts[0] === \"127\" &&\n parts.slice(1).every((part) => {\n const value = Number(part);\n return Number.isInteger(value) && value >= 0 && value <= 255;\n })\n );\n}\n\nexport function createJwksTokenVerifier(options: JwksTokenVerifierOptions): JwksTokenVerifier {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const jwksCacheTtlMs = options.jwksCacheTtlMs ?? 300_000;\n const jwksFetchTimeoutMs = options.jwksFetchTimeoutMs ?? 5_000;\n const jwksRefreshCooldownMs = options.jwksRefreshCooldownMs ?? 30_000;\n const requireAccessTokenType = options.requireAccessTokenType ?? false;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n let cachedJwks: { value: JSONWebKeySet; expiresAt: number } | undefined;\n let pendingJwks: Promise<JSONWebKeySet> | undefined;\n let pendingForcedRefresh: Promise<JSONWebKeySet> | undefined;\n let lastForcedRefreshAt = Number.NEGATIVE_INFINITY;\n\n if (\n jwksUrl.protocol !== \"https:\" &&\n !isLoopbackHostname(jwksUrl.hostname) &&\n options.allowInsecureJwks !== true\n ) {\n throw new Error(\"jwksUrl must use HTTPS for non-loopback hosts\");\n }\n\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n\n async function getJwks(forceRefresh = false): Promise<JSONWebKeySet> {\n const now = Date.now();\n if (!forceRefresh && cachedJwks !== undefined && cachedJwks.expiresAt > now) {\n return cachedJwks.value;\n }\n\n if (pendingJwks !== undefined) {\n return pendingJwks;\n }\n\n pendingJwks = loadJwks(jwksUrl, fetchImplementation, jwksFetchTimeoutMs)\n .then((jwks) => {\n cachedJwks = {\n value: jwks,\n expiresAt: Date.now() + jwksCacheTtlMs\n };\n return jwks;\n })\n .finally(() => {\n pendingJwks = undefined;\n });\n\n return pendingJwks;\n }\n\n function refreshJwksAfterUnknownKey(): Promise<JSONWebKeySet> {\n if (pendingForcedRefresh !== undefined) {\n return pendingForcedRefresh;\n }\n\n const now = Date.now();\n if (now - lastForcedRefreshAt < jwksRefreshCooldownMs) {\n throw new NoMatchingKeyError();\n }\n\n lastForcedRefreshAt = now;\n pendingForcedRefresh = getJwks(true).finally(() => {\n pendingForcedRefresh = undefined;\n });\n return pendingForcedRefresh;\n }\n\n return {\n async verify(input): Promise<JwksVerifiedAccessToken> {\n try {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n let jwks = await getJwks();\n let verified;\n\n try {\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n } catch (error) {\n if (!(error instanceof NoMatchingKeyError)) {\n throw error;\n }\n\n jwks = await refreshJwksAfterUnknownKey();\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n }\n const audience = normalizeVerifiedAudience(\n getOwnEntry(verified.payload, \"aud\"),\n expectedResource\n );\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n\n if (\n input.requiredScopes.length > 0 &&\n !input.requiredScopes.every((scope) => accessToken.scopes.includes(scope))\n ) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes]\n });\n }\n\n return accessToken;\n } catch (error) {\n if (error instanceof NoMatchingKeyError) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n\n throw normalizeVerificationError(error);\n }\n }\n };\n}\n", "import type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n} from \"mcp-oauth\";\nimport { canonicalizeResourceIndicator } from \"mcp-oauth\";\n\nexport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n};\n\nexport interface OAuthDiscoveryCache {\n get(\n resourceUrl: string\n ): OAuthDiscoveryResult | null | undefined | Promise<OAuthDiscoveryResult | null | undefined>;\n set(resourceUrl: string, value: OAuthDiscoveryResult): void | Promise<void>;\n}\n\nexport interface OAuthMetadataDiscoveryOptions {\n fetch?: OAuthMetadataFetch;\n cache?: OAuthDiscoveryCache;\n}\n\nexport interface OAuthMetadataLookupOptions {\n resourceMetadataUrl?: string | URL;\n}\n\nfunction defaultOAuthMetadataFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\n\nfunction assertSecureUrl(url: URL, label: string): void {\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction validateProtectedResourceMetadata(\n value: unknown,\n resourceUrl: string\n): OAuthProtectedResourceMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Protected resource metadata must be a JSON object\");\n }\n\n if (typeof value.resource !== \"string\" || value.resource.length === 0) {\n throw new Error(\"Protected resource metadata must include a resource string\");\n }\n\n const normalizedResource = canonicalizeResourceIndicator(value.resource);\n\n if (normalizedResource !== resourceUrl) {\n throw new Error(\n `Protected resource metadata resource mismatch: expected ${resourceUrl}, received ${value.resource}`\n );\n }\n\n if (!isStringArray(value.authorization_servers) || value.authorization_servers.length === 0) {\n throw new Error(\n \"Protected resource metadata must include a non-empty authorization_servers array\"\n );\n }\n\n return {\n ...value,\n resource: normalizedResource,\n } as OAuthProtectedResourceMetadata;\n}\n\nfunction validateAuthorizationServerMetadata(\n value: unknown,\n issuer: string\n): OAuthAuthorizationServerMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Authorization server metadata must be a JSON object\");\n }\n\n if (typeof value.issuer !== \"string\" || value.issuer.length === 0) {\n throw new Error(\"Authorization server metadata must include issuer\");\n }\n\n if (value.issuer !== issuer) {\n throw new Error(\n `Authorization server metadata issuer mismatch: expected ${issuer}, received ${value.issuer}`\n );\n }\n\n if (\n typeof value.authorization_endpoint !== \"string\" ||\n value.authorization_endpoint.length === 0\n ) {\n throw new Error(\"Authorization server metadata must include authorization_endpoint\");\n }\n\n if (typeof value.token_endpoint !== \"string\" || value.token_endpoint.length === 0) {\n throw new Error(\"Authorization server metadata must include token_endpoint\");\n }\n\n if (\n !isStringArray(value.response_types_supported) ||\n !value.response_types_supported.includes(\"code\")\n ) {\n throw new Error(\n \"Authorization server metadata must include response_types_supported containing code\"\n );\n }\n\n if (\n !isStringArray(value.code_challenge_methods_supported) ||\n !value.code_challenge_methods_supported.includes(\"S256\")\n ) {\n throw new Error(\n \"Authorization server metadata must include code_challenge_methods_supported containing S256\"\n );\n }\n\n return value as OAuthAuthorizationServerMetadata;\n}\n\nasync function readJsonResponse(response: Response, label: string): Promise<unknown> {\n if (!response.ok) {\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n throw new Error(`${label} request failed (${statusDescriptor})`);\n }\n\n try {\n return await response.json();\n } catch {\n throw new Error(`${label} response must be valid JSON`);\n }\n}\n\nfunction resolveWellKnownMetadataUrl(inputUrl: string | URL, suffix: string): string {\n const url = new URL(typeof inputUrl === \"string\" ? inputUrl : inputUrl.toString());\n\n const resourcePath = url.pathname === \"/\" ? \"\" : url.pathname;\n url.pathname = `/.well-known/${suffix}${resourcePath}`;\n\n return url.toString();\n}\n\nexport function resolveProtectedResourceMetadataUrl(\n resourceUrl: string | URL,\n resourceMetadataUrl?: string | URL\n): string {\n const resource = new URL(canonicalizeResourceIndicator(resourceUrl));\n assertSecureUrl(resource, \"Protected resource URL\");\n\n if (resourceMetadataUrl !== undefined) {\n const resolvedResourceMetadataUrl = new URL(\n typeof resourceMetadataUrl === \"string\" ? resourceMetadataUrl : resourceMetadataUrl.toString(),\n resource\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n }\n\n const resolvedResourceMetadataUrl = new URL(\n resolveWellKnownMetadataUrl(resource, \"oauth-protected-resource\")\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n}\n\nfunction normalizeAuthorizationServerIssuer(issuer: string | URL): string {\n const input = typeof issuer === \"string\" ? issuer : issuer.toString();\n const url = new URL(input);\n if (url.search.length > 0 || url.hash.length > 0) {\n throw new Error(\"Authorization server issuer must not include query or fragment\");\n }\n\n assertSecureUrl(url, \"Authorization server issuer\");\n\n if (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) {\n url.pathname = url.pathname.slice(0, -1);\n }\n\n return url.pathname === \"/\" ? url.origin : url.toString();\n}\n\nexport function resolveAuthorizationServerMetadataUrl(issuer: string | URL): string {\n return resolveWellKnownMetadataUrl(\n normalizeAuthorizationServerIssuer(issuer),\n \"oauth-authorization-server\"\n );\n}\n\nexport class OAuthMetadataDiscovery {\n private readonly fetchImpl: OAuthMetadataFetch;\n private readonly cache: OAuthDiscoveryCache | undefined;\n private readonly memoryCache = new Map<string, OAuthDiscoveryResult>();\n\n constructor({ fetch = defaultOAuthMetadataFetch, cache }: OAuthMetadataDiscoveryOptions = {}) {\n this.fetchImpl = fetch;\n this.cache = cache;\n }\n\n async discover(\n resourceUrl: string | URL,\n { resourceMetadataUrl }: OAuthMetadataLookupOptions = {}\n ): Promise<OAuthDiscoveryResult> {\n const cacheKey = canonicalizeResourceIndicator(resourceUrl);\n const resourceMetadataLocation = resolveProtectedResourceMetadataUrl(\n cacheKey,\n resourceMetadataUrl\n );\n const memoryCachedResult = this.memoryCache.get(cacheKey);\n if (memoryCachedResult !== undefined && resourceMetadataUrl === undefined) {\n return memoryCachedResult;\n }\n\n const sharedCachedResult = await this.cache?.get(cacheKey);\n if (\n sharedCachedResult !== null &&\n sharedCachedResult !== undefined &&\n resourceMetadataUrl === undefined\n ) {\n this.memoryCache.set(cacheKey, sharedCachedResult);\n return sharedCachedResult;\n }\n\n const resourceMetadataResponse = await this.fetchImpl(resourceMetadataLocation, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const resourceMetadata = validateProtectedResourceMetadata(\n await readJsonResponse(resourceMetadataResponse, \"Protected resource metadata\"),\n cacheKey\n );\n\n const authorizationServerErrors: string[] = [];\n\n for (const authorizationServer of resourceMetadata.authorization_servers) {\n const normalizedAuthorizationServer = normalizeAuthorizationServerIssuer(\n authorizationServer\n );\n const authorizationServerMetadataUrl =\n resolveAuthorizationServerMetadataUrl(normalizedAuthorizationServer);\n\n try {\n const authorizationServerResponse = await this.fetchImpl(authorizationServerMetadataUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n await readJsonResponse(\n authorizationServerResponse,\n \"Authorization server metadata\"\n ),\n normalizedAuthorizationServer\n );\n\n const result: OAuthDiscoveryResult = {\n resource: resourceMetadata.resource,\n resourceMetadataUrl: resourceMetadataLocation,\n resourceMetadata,\n authorizationServer: normalizedAuthorizationServer,\n authorizationServerMetadataUrl,\n authorizationServerMetadata,\n };\n\n this.memoryCache.set(cacheKey, result);\n await this.cache?.set(cacheKey, result);\n return result;\n } catch (error) {\n authorizationServerErrors.push(\n `${authorizationServerMetadataUrl}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n throw new Error(\n `Unable to load authorization server metadata for ${cacheKey}: ${authorizationServerErrors.join(\n \"; \"\n )}`\n );\n }\n}\n\nexport async function discoverOAuthMetadata(\n resourceUrl: string | URL,\n options: OAuthMetadataDiscoveryOptions & OAuthMetadataLookupOptions = {}\n): Promise<OAuthDiscoveryResult> {\n const discovery = new OAuthMetadataDiscovery(options);\n return discovery.discover(resourceUrl, options);\n}\n\nfunction skipOptionalWhitespace(value: string, start: number): number {\n let index = start;\n while (index < value.length && (value[index] === \" \" || value[index] === \"\\t\")) {\n index += 1;\n }\n return index;\n}\n\nfunction readToken(value: string, start: number): { token: string; nextIndex: number } | null {\n let index = start;\n while (index < value.length) {\n const character = value[index];\n if (\n character === \" \"\n || character === \"\\t\"\n || character === \",\"\n || character === \"=\"\n || character === \"\\\"\"\n ) {\n break;\n }\n index += 1;\n }\n\n if (index === start) {\n return null;\n }\n\n return {\n token: value.slice(start, index),\n nextIndex: index,\n };\n}\n\nfunction looksLikeAuthParam(value: string, start: number): boolean {\n const token = readToken(value, start);\n if (token === null) {\n return false;\n }\n\n return value[skipOptionalWhitespace(value, token.nextIndex)] === \"=\";\n}\n\nfunction isToken68Character(character: string): boolean {\n return (\n (character >= \"a\" && character <= \"z\")\n || (character >= \"A\" && character <= \"Z\")\n || (character >= \"0\" && character <= \"9\")\n || character === \"-\"\n || character === \".\"\n || character === \"_\"\n || character === \"~\"\n || character === \"+\"\n || character === \"/\"\n );\n}\n\nfunction readToken68(\n value: string,\n start: number\n): { token68: string; nextIndex: number } | null {\n let nextIndex = start;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n const token68 = value.slice(start, nextIndex);\n if (token68.length === 0) {\n return null;\n }\n\n let index = 0;\n while (index < token68.length && isToken68Character(token68[index]!)) {\n index += 1;\n }\n\n if (index === 0) {\n return null;\n }\n\n while (index < token68.length && token68[index] === \"=\") {\n index += 1;\n }\n\n if (index !== token68.length) {\n return null;\n }\n\n return { token68, nextIndex };\n}\n\nfunction readQuotedString(\n value: string,\n start: number\n): { parsedValue: string; nextIndex: number } | null {\n if (value[start] !== \"\\\"\") {\n return null;\n }\n\n let parsedValue = \"\";\n let index = start + 1;\n let escaping = false;\n\n while (index < value.length) {\n const character = value[index];\n if (escaping) {\n parsedValue += character;\n escaping = false;\n index += 1;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n index += 1;\n continue;\n }\n\n if (character === \"\\\"\") {\n return {\n parsedValue,\n nextIndex: index + 1,\n };\n }\n\n parsedValue += character;\n index += 1;\n }\n\n return null;\n}\n\nfunction parseAuthParam(\n value: string,\n start: number\n): { name: string; value: string; nextIndex: number } | null {\n const token = readToken(value, start);\n if (token === null) {\n return null;\n }\n\n let index = skipOptionalWhitespace(value, token.nextIndex);\n if (value[index] !== \"=\") {\n return null;\n }\n\n index = skipOptionalWhitespace(value, index + 1);\n if (index >= value.length) {\n return null;\n }\n\n const quotedValue = readQuotedString(value, index);\n if (quotedValue !== null) {\n return {\n name: token.token,\n value: quotedValue.parsedValue,\n nextIndex: quotedValue.nextIndex,\n };\n }\n\n let nextIndex = index;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n return {\n name: token.token,\n value: value.slice(index, nextIndex),\n nextIndex,\n };\n}\n\nexport function parseBearerWwwAuthenticateHeader(\n headerValue: string | null\n): OAuthUnauthorizedChallenge | null {\n if (headerValue === null) {\n return null;\n }\n\n let index = 0;\n let firstBearerChallenge: OAuthUnauthorizedChallenge | null = null;\n\n while (index < headerValue.length) {\n index = skipOptionalWhitespace(headerValue, index);\n while (headerValue[index] === \",\") {\n index = skipOptionalWhitespace(headerValue, index + 1);\n }\n\n const scheme = readToken(headerValue, index);\n if (scheme === null) {\n break;\n }\n\n index = skipOptionalWhitespace(headerValue, scheme.nextIndex);\n const params: Record<string, string> = Object.create(null) as Record<string, string>;\n\n if (index < headerValue.length && headerValue[index] !== \",\") {\n const token68 = readToken68(headerValue, index);\n if (token68 !== null) {\n index = token68.nextIndex;\n } else if (looksLikeAuthParam(headerValue, index)) {\n while (index < headerValue.length) {\n const parsedParam = parseAuthParam(headerValue, index);\n if (parsedParam === null) {\n break;\n }\n\n params[parsedParam.name] = parsedParam.value;\n index = skipOptionalWhitespace(headerValue, parsedParam.nextIndex);\n\n if (headerValue[index] !== \",\") {\n break;\n }\n\n const nextIndex = skipOptionalWhitespace(headerValue, index + 1);\n if (!looksLikeAuthParam(headerValue, nextIndex)) {\n index = nextIndex;\n break;\n }\n\n index = nextIndex;\n }\n }\n }\n\n if (scheme.token.toLowerCase() === \"bearer\") {\n const challenge: OAuthUnauthorizedChallenge = {\n scheme: \"Bearer\",\n params,\n raw: headerValue,\n };\n if (Object.keys(params).length > 0) {\n return challenge;\n }\n\n firstBearerChallenge ??= challenge;\n }\n\n if (headerValue[index] === \",\") {\n index += 1;\n }\n }\n\n return firstBearerChallenge;\n}\n", "import { spawn, type ChildProcessWithoutNullStreams, type SpawnOptions } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n HttpTransport,\n McpClient,\n StdioTransport,\n type McpTransport\n} from \"tiny-mcp-client\";\n\nimport type { McpConnection } from \"./mcp.js\";\n\nexport type McpServerConfig =\n | { command: string; args?: string[]; cwd?: string; env?: Record<string, string> }\n | { url: string; headers?: Record<string, string> };\n\nexport type McpModuleOptions = {\n servers: Record<string, McpServerConfig>;\n requestTimeoutMs?: number;\n closeTimeoutMs?: number;\n maxToolPages?: number;\n signal?: AbortSignal;\n fetch?: (input: string | URL, init?: RequestInit) => Promise<Response>;\n spawn?: (command: string, args: ReadonlyArray<string>, options: SpawnOptions) => ChildProcessWithoutNullStreams;\n};\n\nexport type ManagedMcpConnection = {\n ready: Promise<McpConnection>;\n close(): Promise<void>;\n};\n\nexport function parseMcpConfig(source: string, directory: string): McpModuleOptions {\n const parsed = JSON.parse(source) as unknown;\n const options = normalizeMcpOptions(parsed, [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\"\n ]);\n for (const server of Object.values(options.servers)) {\n if (\"command\" in server) {\n server.cwd = path.resolve(directory, server.cwd ?? \".\");\n if (server.command.includes(\"/\") || server.command.includes(\"\\\\\")) {\n server.command = path.resolve(directory, server.command);\n }\n }\n }\n return options;\n}\n\nexport function normalizeMcpOptions(\n value: unknown,\n keys: string[] = [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\",\n \"signal\",\n \"fetch\",\n \"spawn\"\n ]\n): McpModuleOptions {\n const options = readRecord(value, \"MCP options\", keys);\n const servers = readRecord(options.servers, \"MCP servers\");\n const normalized = Object.create(null) as Record<string, McpServerConfig>;\n for (const [name, input] of Object.entries(servers)) {\n if (name.length === 0 || name.trim() !== name)\n throw new TypeError(\"MCP server names must be non-empty without surrounding whitespace.\");\n const server = readRecord(input, `MCP server ${name}`);\n if (Object.hasOwn(server, \"command\")) {\n readRecord(server, `MCP server ${name}`, [\"command\", \"args\", \"cwd\", \"env\"]);\n const command = readText(server.command, \"MCP command\");\n if (\n server.args !== undefined &&\n (!Array.isArray(server.args) ||\n server.args.some((argument) => typeof argument !== \"string\"))\n )\n throw new TypeError(\"MCP args must be an array of strings.\");\n normalized[name] = {\n command,\n ...(server.args === undefined ? {} : { args: [...(server.args as string[])] }),\n ...(server.cwd === undefined ? {} : { cwd: readText(server.cwd, \"MCP cwd\") }),\n env: readStrings(server.env ?? {}, \"MCP environment\")\n };\n } else {\n readRecord(server, `MCP server ${name}`, [\"url\", \"headers\"]);\n const url = new URL(readText(server.url, \"MCP URL\"));\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.hash)\n throw new TypeError(\"MCP URL must use HTTP or HTTPS without credentials or a fragment.\");\n const headers = readStrings(server.headers ?? {}, \"MCP headers\");\n new Headers(headers);\n normalized[name] = { url: url.href, headers };\n }\n }\n for (const name of [\"fetch\", \"spawn\"])\n if (options[name] !== undefined && typeof options[name] !== \"function\")\n throw new TypeError(`MCP ${name} must be a function.`);\n if (options.signal !== undefined && !(options.signal instanceof AbortSignal))\n throw new TypeError(\"MCP signal must be an AbortSignal.\");\n return {\n servers: normalized,\n requestTimeoutMs: readTimeout(options.requestTimeoutMs, 30_000),\n closeTimeoutMs: readTimeout(options.closeTimeoutMs, 1_000),\n maxToolPages: readTimeout(options.maxToolPages, 100),\n ...(options.signal === undefined ? {} : { signal: options.signal as AbortSignal }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch as McpModuleOptions[\"fetch\"] }),\n ...(options.spawn === undefined ? {} : { spawn: options.spawn as McpModuleOptions[\"spawn\"] })\n };\n}\n\nfunction readRecord(value: unknown, label: string, keys?: string[]): Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(value))\n )\n throw new TypeError(`${label} must be a plain object.`);\n const result = Object.create(null) as Record<string, unknown>;\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!(\"value\" in descriptor) || (keys !== undefined && !keys.includes(key)))\n throw new TypeError(`${label} contains unsupported field ${key}.`);\n result[key] = descriptor.value;\n }\n return result;\n}\n\nfunction readText(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.includes(\"\\0\"))\n throw new TypeError(`${label} must be a non-empty string without NUL characters.`);\n return value;\n}\n\nfunction readStrings(value: unknown, label: string): Record<string, string> {\n const entries = readRecord(value, label);\n for (const [name, entry] of Object.entries(entries))\n if (typeof entry !== \"string\" || name.includes(\"\\0\") || entry.includes(\"\\0\"))\n throw new TypeError(`${label} must contain strings without NUL characters.`);\n return entries as Record<string, string>;\n}\n\nfunction readTimeout(value: unknown, fallback: number): number {\n if (value === undefined) return fallback;\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value <= 0 ||\n value > 2_147_483_647\n )\n throw new TypeError(\"MCP timeouts must be positive 32-bit integers.\");\n return value;\n}\n\nexport function connectMcpTransport(\n server: McpServerConfig,\n options: McpModuleOptions,\n signal?: AbortSignal\n): ManagedMcpConnection {\n signal?.throwIfAborted();\n options.signal?.throwIfAborted();\n const client = new McpClient({\n clientInfo: { name: \"safejs\", version: \"1\" },\n requestTimeoutMs: options.requestTimeoutMs\n });\n let child: ChildProcessWithoutNullStreams | undefined;\n const activeRequests = new Set<AbortController>();\n const transport: McpTransport =\n \"command\" in server\n ? new StdioTransport({\n ...server,\n spawn(command, args, spawnOptions) {\n child =\n options.spawn === undefined\n ? (spawn(command, args, spawnOptions) as ChildProcessWithoutNullStreams)\n : options.spawn(command, args, spawnOptions);\n return child;\n }\n })\n : new HttpTransport({\n ...server,\n async fetch(input, init) {\n const controller = new AbortController();\n activeRequests.add(controller);\n const cancel = () => controller.abort(init?.signal?.reason);\n init?.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (init?.signal?.aborted) cancel();\n const timeout = setTimeout(\n () => controller.abort(new Error(\"MCP HTTP request timed out.\")),\n init?.method === \"DELETE\" ? options.closeTimeoutMs : options.requestTimeoutMs\n );\n const finish = () => {\n clearTimeout(timeout);\n activeRequests.delete(controller);\n init?.signal?.removeEventListener(\"abort\", cancel);\n };\n try {\n const response = await (options.fetch ?? fetch)(input, {\n ...init,\n signal: controller.signal,\n redirect: \"error\"\n });\n if (response.body === null) {\n finish();\n return response;\n }\n const reader = response.body.getReader();\n let stopReading: (() => void) | undefined;\n const release = () => {\n finish();\n if (stopReading !== undefined)\n controller.signal.removeEventListener(\"abort\", stopReading);\n };\n const body = new ReadableStream<Uint8Array>({\n start(stream) {\n stopReading = () => {\n void reader.cancel(controller.signal.reason).catch(() => undefined);\n stream.error(controller.signal.reason);\n release();\n };\n controller.signal.addEventListener(\"abort\", stopReading, { once: true });\n if (controller.signal.aborted) stopReading();\n },\n async pull(stream) {\n try {\n const result = await reader.read();\n if (controller.signal.aborted) return;\n if (result.done) {\n release();\n stream.close();\n } else stream.enqueue(result.value);\n } catch (error) {\n release();\n stream.error(error);\n }\n },\n async cancel(reason) {\n release();\n await reader.cancel(reason);\n }\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n } catch (error) {\n finish();\n throw error;\n }\n }\n });\n let closing: Promise<void> | undefined;\n const cancel = () => {\n void close().catch(() => undefined);\n };\n function close(): Promise<void> {\n closing ??= (async () => {\n signal?.removeEventListener(\"abort\", cancel);\n options.signal?.removeEventListener(\"abort\", cancel);\n for (const request of activeRequests) request.abort(new Error(\"MCP connection closed.\"));\n await client.close();\n transport.dispose();\n await new Promise<void>((resolve, reject) => {\n let forced: ReturnType<typeof setTimeout> | undefined;\n const timeout = setTimeout(() => {\n if (child !== undefined && child.exitCode === null && child.signalCode === null)\n child.kill(\"SIGKILL\");\n forced = setTimeout(\n () => reject(new Error(\"MCP transport did not close.\")),\n options.closeTimeoutMs\n );\n }, options.closeTimeoutMs);\n void transport.closed.then(\n () => {\n clearTimeout(timeout);\n clearTimeout(forced);\n resolve();\n },\n (error) => {\n clearTimeout(timeout);\n clearTimeout(forced);\n reject(error);\n }\n );\n });\n })();\n return closing;\n }\n signal?.addEventListener(\"abort\", cancel, { once: true });\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n const aborted = signal?.aborted || options.signal?.aborted;\n if (aborted) cancel();\n const connecting = aborted\n ? Promise.reject(signal?.aborted ? signal.reason : options.signal?.reason)\n : client.connect(transport);\n const ready = connecting.then(\n () => client,\n async (error) => {\n await close().catch(() => undefined);\n throw signal?.aborted\n ? signal.reason\n : options.signal?.aborted\n ? options.signal.reason\n : error;\n }\n );\n return { ready, close };\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,SAAAA,cAAa;AAEtB,SAAS,mBAAmB;;;ACF5B,OAAO,YAAY;AACnB,OAAOC,WAAU;;;ACDjB,SAAS,gBAAgB,kBAAkB,aAAa,YAAY,cAAc;AAClF,SAAS,YAAY,UAAU;AAC/B,SAAS,SAAS,UAAU,gBAAgB;AAC5C,OAAO,UAAU;;;ACHV,SAAS,gBAAgB,OAAgB,MAAuB;AACrE,SACE,iBAAiB,SACjB,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,KACjD,MAA6B,SAAS;AAE3C;;;ADCA,IAAM,kBAAkB,oBAAI,IAA6B;AAEzD,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AAClC,IAAM,uBAAuB;AAuCtB,IAAM,qBAAN,MAAgD;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,aAAqC;AAAA,EAE7C,YAAY,OAAgC;AAC1C,SAAK,KAAK,MAAM,MAAM;AACtB,SAAK,OAAO,MAAM;AAClB,QAAI,MAAM,aAAa,QAAW;AAChC,YAAM,iBAAiB,MAAM,oBAAoB,SAAS;AAC1D,YAAM,mBAAmB,MAAM,oBAAoB;AACnD,YAAM,kBAAkB,MAAM,mBAAmB;AACjD,iCAA2B,gBAAgB;AAC3C,gCAA0B,eAAe;AACzC,WAAK,WAAW,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,WAAK,6BAA6B;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,WAAW,MAAM;AACtB,WAAK,6BAA6B;AAAA,IACpC;AACA,SAAK,qBAAqB,MAAM,sBAAsB;AACtD,SAAK,iBAAiB,MAAM,kBAAkB;AAAA,EAChD;AAAA,EAEA,MAAM,MAA8B;AAClC,UAAM,KAAK,uCAAuC,KAAK,QAAQ;AAC/D,QAAI;AACJ,QAAI;AACF,oBAAc,MAAM,KAAK,GAAG,SAAS,KAAK,UAAU,MAAM;AAAA,IAC5D,SAAS,OAAO;AACd,UAAI,gBAAgB,KAAK,GAAG;AAC1B,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAEA,UAAM,WAAW,uBAAuB,WAAW;AACnD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAMC,OAAM,MAAM,KAAK,iBAAiB;AAExC,QAAI;AACF,YAAM,KAAK,OAAO,KAAK,SAAS,IAAI,QAAQ;AAC5C,YAAM,UAAU,OAAO,KAAK,SAAS,SAAS,QAAQ;AACtD,YAAM,aAAa,OAAO,KAAK,SAAS,YAAY,QAAQ;AAE5D,UACE,GAAG,eAAe,uBAClB,QAAQ,eAAe,2BACvB;AACA,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,iBAAiB,sBAAsBA,MAAK,EAAE;AAC/D,eAAS,WAAW,OAAO;AAC3B,YAAM,YAAY,OAAO,OAAO,CAAC,SAAS,OAAO,UAAU,GAAG,SAAS,MAAM,CAAC,CAAC;AAC/E,aAAO,UAAU,SAAS,MAAM;AAAA,IAClC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,OAA8B;AACtC,UAAM,KAAK,uCAAuC,KAAK,QAAQ;AAC/D,UAAMA,OAAM,MAAM,KAAK,iBAAiB;AACxC,UAAM,KAAK,KAAK,eAAe,mBAAmB;AAClD,UAAM,SAAS,eAAe,sBAAsBA,MAAK,EAAE;AAC3D,UAAM,aAAa,OAAO,OAAO;AAAA,MAC/B,OAAO,OAAO,OAAO,MAAM;AAAA,MAC3B,OAAO,MAAM;AAAA,IACf,CAAC;AACD,UAAM,UAAU,OAAO,WAAW;AAElC,UAAM,WAA8B;AAAA,MAClC,SAAS;AAAA,MACT,IAAI,GAAG,SAAS,QAAQ;AAAA,MACxB,SAAS,QAAQ,SAAS,QAAQ;AAAA,MAClC,YAAY,WAAW,SAAS,QAAQ;AAAA,IAC1C;AAEA,UAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACpE,UAAM,KAAK,uCAAuC,KAAK,QAAQ;AAC/D,UAAM,gBAAgB,GAAG,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC;AACrE,QAAI,mBAAmB;AAEvB,QAAI;AACF,YAAM,KAAK,uCAAuC,aAAa;AAC/D,YAAM,KAAK,GAAG,UAAU,eAAe,KAAK,UAAU,QAAQ,GAAG;AAAA,QAC/D,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AACD,yBAAmB;AACnB,YAAM,KAAK,GAAG,MAAM,eAAe,oBAAoB;AACvD,YAAM,KAAK,GAAG,OAAO,eAAe,KAAK,QAAQ;AAAA,IACnD,SAAS,OAAO;AACd,UAAI,oBAAoB,CAAC,qBAAqB,KAAK,GAAG;AACpD,cAAM,gBAAgB,KAAK,IAAI,aAAa,EAAE,MAAM,MAAM,MAAS;AAAA,MACrE;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,KAAK,uCAAuC,KAAK,QAAQ;AAC/D,QAAI;AACF,YAAM,KAAK,GAAG,OAAO,KAAK,QAAQ;AAAA,IACpC,SAAS,OAAO;AACd,UAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,uCAAuC,YAAmC;AACtF,UAAM,eAAe,KAAK,QAAQ,UAAU;AAC5C,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,KAAK;AAAA,IACP;AAEA,eAAW,eAAe,gBAAgB;AACxC,UAAI;AACF,cAAM,QAAQ,MAAM,KAAK,GAAG,MAAM,WAAW;AAC7C,YAAI,MAAM,eAAe,GAAG;AAC1B,gBAAM,IAAI,MAAM,oEAAoE,WAAW,EAAE;AAAA,QACnG;AAAA,MACF,SAAS,OAAO;AACd,YAAI,gBAAgB,KAAK,GAAG;AAC1B;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAoC;AAC1C,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,sBAAsB,oBAAoB,KAAK,oBAAoB,KAAK,IAAI,EAAE,MAAM,CAAC,UAAU;AACnG,YAAI,KAAK,eAAe,qBAAqB;AAC3C,eAAK,aAAa;AAAA,QACpB;AACA,cAAM;AAAA,MACR,CAAC;AACD,WAAK,aAAa;AAAA,IACpB;AACA,WAAO,KAAK;AAAA,EACd;AACF;AAEA,SAAS,kCACP,eACA,kBACQ;AACR,QAAM,CAAC,YAAY,IAAI,iBAAiB,MAAM,QAAQ,EAAE,OAAO,OAAO;AACtE,SAAO,KAAK,QAAQ,eAAe,gBAAgB,GAAG;AACxD;AAEA,SAAS,4BACP,cACA,4BACU;AACV,MAAI,+BAA+B,MAAM;AACvC,WAAO,oCAAoC,YAAY;AAAA,EACzD;AAEA,QAAM,oBAAoB,KAAK,QAAQ,0BAA0B;AACjE,MAAI,CAAC,oBAAoB,cAAc,iBAAiB,GAAG;AACzD,WAAO,CAAC,KAAK,QAAQ,YAAY,GAAG,YAAY;AAAA,EAClD;AAEA,QAAM,iBAAiB,CAAC,iBAAiB;AACzC,MAAI,cAAc;AAClB,aAAW,WAAW,KAAK,SAAS,mBAAmB,YAAY,EAAE,MAAM,KAAK,GAAG,EAAE,OAAO,OAAO,GAAG;AACpG,kBAAc,KAAK,KAAK,aAAa,OAAO;AAC5C,mBAAe,KAAK,WAAW;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,kBAAgC;AAClE,MAAI,KAAK,WAAW,gBAAgB,KAAK,KAAK,MAAM,WAAW,gBAAgB,GAAG;AAChF,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAEA,aAAW,WAAW,kBAAkB,gBAAgB,GAAG;AACzD,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,iBAA+B;AAChE,MACE,gBAAgB,KAAK,EAAE,WAAW,KAClC,oBAAoB,OACpB,oBAAoB,QACpB,kBAAkB,eAAe,EAAE,WAAW,GAC9C;AACA,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACF;AAEA,SAAS,kBAAkB,OAAyB;AAClD,SAAO,MACJ,MAAM,GAAG,EACT,QAAQ,CAAC,YAAY,QAAQ,MAAM,IAAI,CAAC,EACxC,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AAC3C;AAEA,SAAS,oCAAoC,cAAgC;AAC3E,QAAM,SAAS,KAAK,MAAM,YAAY;AACtC,QAAM,WAAW,aACd,MAAM,OAAO,KAAK,MAAM,EACxB,MAAM,KAAK,GAAG,EACd,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AACzC,MAAI,SAAS,UAAU,GAAG;AACxB,WAAO,CAAC,YAAY;AAAA,EACtB;AAEA,QAAM,iBAA2B,CAAC;AAClC,MAAI,cAAc,OAAO;AACzB,aAAW,CAAC,OAAO,OAAO,KAAK,SAAS,QAAQ,GAAG;AACjD,kBAAc,KAAK,KAAK,aAAa,OAAO;AAC5C,QAAI,UAAU,GAAG;AACf;AAAA,IACF;AACA,mBAAe,KAAK,WAAW;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,WAAmB,YAA6B;AAC3E,QAAM,eAAe,KAAK,SAAS,YAAY,SAAS;AACxD,SAAO,iBAAiB,MAAO,CAAC,aAAa,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,YAAY;AAChG;AAEA,eAAe,gBAAgB,YAA0C,UAAiC;AACxG,MAAI;AACF,UAAM,WAAW,OAAO,QAAQ;AAAA,EAClC,SAAS,OAAO;AACd,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,yBAA0C;AACjD,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,UAAU,SAAS,EAAE;AAAA,EACvB;AACF;AAEA,eAAe,oBACb,oBACA,MACiB;AACjB,QAAM,kBAAkB,MAAM,mBAAmB;AACjD,QAAM,SAAS,GAAG,gBAAgB,QAAQ,IAAI,gBAAgB,QAAQ;AACtE,QAAM,WAAW,KAAK,UAAU,CAAC,gBAAgB,UAAU,gBAAgB,UAAU,IAAI,CAAC;AAE1F,QAAM,SAAS,gBAAgB,IAAI,QAAQ;AAC3C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC1D,WAAO,QAAQ,MAAM,sBAAsB,CAAC,OAAO,eAAe;AAChE,UAAI,OAAO;AACT,eAAO,KAAK;AACZ;AAAA,MACF;AACA,cAAQ,OAAO,KAAK,UAAU,CAAC;AAAA,IACjC,CAAC;AAAA,EACH,CAAC;AAED,kBAAgB,IAAI,UAAU,UAAU;AACxC,SAAO,WAAW,MAAM,CAAC,UAAU;AACjC,QAAI,gBAAgB,IAAI,QAAQ,MAAM,YAAY;AAChD,sBAAgB,OAAO,QAAQ;AAAA,IACjC;AACA,UAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,uBAAuB,KAAuC;AACrE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,SAAS,MAAM,GAAG;AACrB,aAAO;AAAA,IACT;AACA,UAAM,UAAU,YAAY,QAAQ,SAAS;AAC7C,UAAM,KAAK,YAAY,QAAQ,IAAI;AACnC,UAAM,UAAU,YAAY,QAAQ,SAAS;AAC7C,UAAM,aAAa,YAAY,QAAQ,YAAY;AACnD,QAAI,YAAY,oBAAoB;AAClC,aAAO;AAAA,IACT;AACA,QACE,OAAO,OAAO,YACd,OAAO,YAAY,YACnB,OAAO,eAAe,UACtB;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC;AAC5E;AAEA,SAAS,YAAY,QAAiCA,MAAsB;AAC1E,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQA,IAAG,IAAI,OAAOA,IAAG,IAAI;AAC3E;AAEA,SAAS,gBAAgB,OAAgD;AACvE,SAAO,gBAAgB,OAAO,QAAQ;AACxC;AAEA,SAAS,qBAAqB,OAAgD;AAC5E,SAAO,gBAAgB,OAAO,QAAQ;AACxC;;;AE7YA,SAAS,aAAa;AAGtB,IAAM,eAAe;AACrB,IAAM,oCAAoC;AAwBnC,IAAM,gBAAN,MAA2C;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,OAA2B;AACrC,SAAK,aAAa,MAAM,cAAc;AACtC,SAAK,UAAU,MAAM,QAAQ,KAAK;AAClC,SAAK,UAAU,MAAM,QAAQ,KAAK;AAClC,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,MAA8B;AAClC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,CAAC,yBAAyB,MAAM,KAAK,SAAS,MAAM,KAAK,SAAS,IAAI;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM,MAAM,GAAG;AACpC,aAAO,uBAAuB,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,IAClE;AAEA,QAAI,wBAAwB,MAAM,GAAG;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,yBAAyB,mCAAmC,MAAM;AAAA,EAC1E;AAAA,EAEA,MAAM,IAAI,OAA8B;AACtC,QAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAChD,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,QACE;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM,MAAM,GAAG;AACpC,YAAM,yBAAyB,kCAAkC,MAAM;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,CAAC,2BAA2B,MAAM,KAAK,SAAS,MAAM,KAAK,OAAO;AAAA,MAClE;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM,MAAM,KAAK,wBAAwB,MAAM,GAAG;AACvE;AAAA,IACF;AAEA,UAAM,yBAAyB,qCAAqC,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAc,uBACZ,MACA,WACA,SACgC;AAChC,QAAI;AACF,UAAI,YAAY,QAAW;AACzB,eAAO,MAAM,KAAK,WAAW,cAAc,IAAI;AAAA,MACjD;AACA,aAAO,MAAM,KAAK,WAAW,cAAc,MAAM,OAAO;AAAA,IAC1D,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,MAAM,aAAa,SAAS,KAAK,OAAO,EAAE;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,mBACP,SACA,MACA,SACgC;AAChC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACjC,OAAO,CAAC,SAAS,UAAU,SAAY,WAAW,QAAQ,QAAQ,MAAM;AAAA,IAC1E,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI;AACJ,UAAM,eAAe,CAAC,YAA0B;AAC9C,eAAS,OAAO,WAAW,IACvB,UACA,GAAG,MAAM,GAAG,OAAO,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO;AAAA,IAC7D;AACA,UAAM,mBAAmB,MAAY;AACnC,UAAI,sBAAsB,QAAW;AACnC;AAAA,MACF;AAEA,mBAAa,iBAAiB;AAC9B,0BAAoB;AAAA,IACtB;AAEA,UAAM,QAAQ,YAAY,MAAM;AAChC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AAED,UAAM,QAAQ,YAAY,MAAM;AAChC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AAED,QAAI,SAAS,UAAU,QAAW;AAChC,YAAM,OAAO,KAAK,SAAS,CAAC,UAAU;AACpC,4BAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC3E,CAAC;AACD,YAAM,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC;AAEA,UAAM,GAAG,SAAS,CAAC,UAAiC;AAClD,YAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;AAC1E,uBAAiB;AACjB,mBAAa,OAAO;AACpB,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,uBAAiB;AACjB,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,WAAO,MAAM,MAAM,GAAG,EAAE;AAAA,EAC1B;AAEA,MAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAChD,WAAO,MAAM,MAAM,GAAG,EAAE;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,QAAwC;AACvE,SAAO,mBAAmB,MAAM,MAAM;AACxC;AAEA,SAAS,yBACP,WACA,QACO;AACP,QAAM,WAAW,mBAAmB,MAAM;AAC1C,QAAM,UACJ,iBAAiB,QAAQ,QAAQ,EAAE,KAAK,KACrC,iBAAiB,QAAQ,QAAQ,EAAE,KAAK;AAC7C,MAAI,SAAS;AACX,WAAO,IAAI;AAAA,MACT,aAAa,SAAS,+BAA+B,QAAQ,KAAK,OAAO;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO,IAAI,MAAM,aAAa,SAAS,+BAA+B,QAAQ,EAAE;AAClF;AAEA,SAAS,mBAAmB,QAAuC;AACjE,QAAM,QAAQC,aAAY,QAAQ,UAAU;AAC5C,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,IAAI,QAAQ;AACxE;AAEA,SAAS,iBACP,QACAC,MACQ;AACR,QAAM,QAAQD,aAAY,QAAQC,IAAG;AACrC,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASD,aAAY,QAAgBC,MAAsB;AACzD,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQA,IAAG,IAClD,OAAmCA,IAAG,IACvC;AACN;;;ACjOA,IAAM,0BAA0B;AAChC,IAAM,iBAAiB;AAEvB,IAAM,iBAGF;AAAA,EACF,MAAM,CAAC,UAAU;AACf,QAAI,CAAC,MAAM,WAAW;AACpB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,WAAO,IAAI,mBAAmB,MAAM,SAAS;AAAA,EAC/C;AAAA,EACA,UAAU,CAAC,UAAU;AACnB,QAAI,CAAC,MAAM,eAAe;AACxB,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AACA,WAAO,IAAI,cAAc,MAAM,aAAa;AAAA,EAC9C;AACF;AAEO,SAAS,kBACd,OACyB;AACzB,QAAM,UAAU,eAAe,KAAK;AACpC,QAAM,WAAW,MAAM,YAAY,QAAQ;AAE3C,MAAI,YAAY,cAAc,aAAa,gBAAgB;AACzD,UAAM,IAAI;AAAA,MACR,kEAAkE,QAAQ;AAAA,IAC5E;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,OAAO,EAAE,KAAK;AAE3C,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,eAAe,OAA6C;AACnE,QAAM,SAAS,MAAM,iBAAiB;AACtC,QAAM,oBACJ,MAAM,WAAW,eAAe,MAAM,KAAK,MAAM,KAAK,eAAe,QAAQ,KAAK,MAAM;AAC1F,QAAM,UAAU,mBAAmB,KAAK;AAExC,MAAI,YAAY,YAAY;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,UAAa,YAAY,QAAQ;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,mCAAmC,OAAO,EAAE;AAC9D;AAEA,SAAS,eACP,KACAC,MACoB;AACpB,SAAO,QAAQ,UAAa,OAAO,UAAU,eAAe,KAAK,KAAKA,IAAG,IACrE,IAAIA,IAAG,IACP;AACN;;;ACtEO,SAAS,8BAA8B,OAA6B;AACzE,MAAI;AACJ,MAAI;AACF,UAAM,iBAAiB,MAAM,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI,IAAI,IAAI,KAAK;AAAA,EACxE,QAAQ;AACN,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,MAAI,OAAO;AACX,SAAO,IAAI,SAAS;AACtB;;;ALHA,IAAM,oBAAoB;AAC1B,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AACjC,IAAM,gCAAgC;AACtC,IAAM,kCAAkC;AACxC,IAAM,iBAAiB;AAahB,SAAS,4BACd,UAAkC,CAAC,GAChB;AACnB,SAAO;AAAA,IACL,MAAM,KAAK,UAAsD;AAC/D,YAAM,QAAQ,0BAA0B,UAAU,OAAO;AACzD,YAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,UAAI,qBAAqB,MAAM,GAAG;AAChC,eAAO;AAAA,MACT;AAEA,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAAA,IACA,MAAM,KAAK,UAAkB,SAA4C;AACvE,YAAM,QAAQ,0BAA0B,UAAU,OAAO;AACzD,YAAM,MAAM,IAAI,KAAK,UAAU,OAAO,CAAC;AAAA,IACzC;AAAA,IACA,MAAM,MAAM,UAAiC;AAC3C,YAAM,QAAQ,0BAA0B,UAAU,OAAO;AACzD,YAAM,MAAM,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,SAAmD;AAC5F,SAAO;AAAA,IACL,MAAM,KAAK,QAAmD;AAC5D,YAAM,QAAQ,wBAAwB,QAAQ,OAAO;AACrD,YAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,YAAM,WAAW,eAAe,MAAM,IAAI,aAAa,QAAQ,UAAU,IAAI;AAC7E,UAAI,aAAa,QAAW;AAC1B,cAAM,SAAkC,EAAE,SAAS;AACnD,YACE,eAAe,MAAM,KACrB,OAAO,UAAU,eAAe,KAAK,QAAQ,cAAc,GAC3D;AACA,iBAAO,eAAeC,aAAY,QAAQ,cAAc;AAAA,QAC1D;AAEA,eAAO;AAAA,MACT;AAEA,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAAA,IACA,MAAM,KAAK,QAAgB,QAA0C;AACnE,YAAM,QAAQ,wBAAwB,QAAQ,OAAO;AACrD,YAAM,MAAM,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,IACxC;AAAA,IACA,MAAM,MAAM,QAA+B;AACzC,YAAM,QAAQ,wBAAwB,QAAQ,OAAO;AACrD,YAAM,MAAM,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,uBACPC,MACA,SACA,UACa;AACb,QAAM,OAAO,OAAO,WAAW,QAAQ,EAAE,OAAOA,IAAG,EAAE,OAAO,KAAK;AACjE,QAAM,qBAAqB,QAAQ,WAAW;AAC9C,QAAM,iBAAiB,uBAAuB,SAAY,OAAOC,MAAK,MAAM,kBAAkB;AAE9F,QAAM,YAAY;AAAA,IAChB,GAAG,QAAQ;AAAA,IACX,UACE,mBAAmB,OACf,SACAA,MAAK;AAAA,MACH,eAAe;AAAA,MACf,GAAG,eAAe,IAAI,IAAI,IAAI,GAAG,eAAe,OAAO,MAAM;AAAA,IAC/D;AAAA,IACN,MAAM,QAAQ,WAAW,QAAQ,SAAS;AAAA,IAC1C,kBAAkB,QAAQ,WAAW,oBAAoB,SAAS;AAAA,IAClE,iBACE,mBAAmB,OACf,GAAG,IAAI,SACP,GAAG,eAAe,IAAI,IAAI,IAAI,GAAG,eAAe,OAAO,MAAM;AAAA,EACrE;AACA,QAAM,gBAAgB;AAAA,IACpB,GAAG,QAAQ;AAAA,IACX,SAAS,QAAQ,eAAe,WAAW,SAAS;AAAA,IACpD,SAAS,GAAG,QAAQ,eAAe,WAAW,SAAS,aAAa,IAAI,IAAI;AAAA,EAC9E;AAEA,SAAO,kBAAkB,EAAE,GAAG,SAAS,WAAW,cAAc,CAAC,EAAE;AACrE;AAEA,SAAS,0BAA0B,UAAkB,SAA8C;AACjG,SAAO,uBAAuB,8BAA8B,QAAQ,GAAG,SAAS;AAAA,IAC9E,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,wBAAwB,QAAgB,SAA8C;AAC7F,SAAO,uBAAuB,QAAQ,SAAS;AAAA,IAC7C,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,eAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASF,aAAY,QAAiCC,MAAsB;AAC1E,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQA,IAAG,IAAI,OAAOA,IAAG,IAAI;AAC3E;AAEA,SAAS,aAAa,QAAiCA,MAAiC;AACtF,QAAM,QAAQD,aAAY,QAAQC,IAAG;AACrC,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,qBAAqB,OAA6C;AACzE,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SACE,oBAAoB,OAAO,UAAU,KACrC,oBAAoB,OAAO,qBAAqB,KAChD,oBAAoBD,aAAY,OAAO,QAAQ,CAAC,KAChD,uBAAuBA,aAAY,OAAO,WAAW,CAAC,KACtD,6BAA6BA,aAAY,OAAO,QAAQ,CAAC;AAE7D;AAEA,SAAS,oBAAoB,OAA4C;AACvE,MAAI,CAAC,eAAe,KAAK,KAAK,CAAC,oBAAoB,OAAO,UAAU,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,eAAeA,aAAY,OAAO,cAAc;AACtD,SACE,iBAAiB,UAChB,OAAO,iBAAiB,YAAY,aAAa,KAAK,EAAE,SAAS;AAEtE;AAEA,SAAS,uBAAuB,OAA0D;AACxF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SACE,oBAAoB,OAAO,qBAAqB,KAChD,eAAeA,aAAY,OAAO,kBAAkB,CAAC,KACrD,eAAeA,aAAY,OAAO,6BAA6B,CAAC;AAEpE;AAEA,SAAS,6BAA6B,OAAuD;AAC3F,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,oBAAoB,OAAO,aAAa,KAAK,aAAa,OAAO,WAAW,MAAM,UAAU;AAC/F,WAAO;AAAA,EACT;AAEA,QAAM,YAAYA,aAAY,OAAO,WAAW;AAChD,MACE,cAAc,SACb,OAAO,cAAc,YACpB,CAAC,OAAO,cAAc,SAAS,KAC/B,YAAY,kBACZ,CAAC,OAAO,SAAS,IAAI,KAAK,SAAS,EAAE,QAAQ,CAAC,IAChD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAeA,aAAY,OAAO,cAAc;AACtD,MACE,iBAAiB,WAChB,OAAO,iBAAiB,YAAY,aAAa,KAAK,EAAE,WAAW,IACpE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQA,aAAY,OAAO,OAAO;AACxC,SAAO,UAAU,UAAc,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AACpF;AAEA,SAAS,oBAAoB,QAAiCC,MAAsB;AAClF,QAAM,QAAQ,aAAa,QAAQA,IAAG;AACtC,SAAO,UAAU,UAAa,MAAM,KAAK,EAAE,SAAS;AACtD;;;AMxOA,SAAS,OAAAE,YAAW;;;ACApB,OAAO,UAAU;;;ACAjB,OAAOC,aAAY;AASZ,SAAS,yBAAyB,OAG9B;AACT,QAAM,UAAqC;AAAA,IACzC,GAAG;AAAA,IACH,GAAGA,QAAO,YAAY,EAAE,EAAE,SAAS,WAAW;AAAA,IAC9C,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,EACX;AAEA,SAAO,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG,MAAM,EAAE,SAAS,WAAW;AAC1E;AAEO,SAAS,wBACd,OACmD;AACnD,MAAI,UAAU,QAAQ,MAAM,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,OAAO,KAAK,OAAO,WAAW,EAAE,SAAS,MAAM;AAC/D,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAACC,gBAAe,MAAM,GAAG;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,UAAUC,aAAY,QAAQ,GAAG;AACvC,UAAM,QAAQA,aAAY,QAAQ,GAAG;AACrC,UAAM,SAASA,aAAY,QAAQ,GAAG;AACtC,UAAM,gBAAgBA,aAAY,QAAQ,GAAG;AAC7C,QACE,YAAY,KACT,OAAO,UAAU,YACjB,MAAM,WAAW,KACjB,OAAO,WAAW,YAClB,OAAO,WAAW,KAClB,OAAO,kBAAkB,WAC5B;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASD,gBAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,aAAY,QAAiCC,MAAsB;AAC1E,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQA,IAAG,IAAI,OAAOA,IAAG,IAAI;AAC3E;;;AD7CA,eAAsB,mCACpB,UAAwC,CAAC,GACF;AACvC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,SAAS,QAAQ,eAAe,QAAQ,aAAa,IAAI,KAAK,aAAa;AACjF,QAAM,OAAO,MAAM,YAAY,MAAM;AACrC,QAAM,cAAc,oBAAoB,IAAI,GAAG,YAAY;AAE3D,SAAO;AAAA,IACL;AAAA,IACA,MAAM,YAAY,kBAA2C;AAC3D,aAAO,yBAAyB,QAAQ,kBAAkB,SAAS,YAAY;AAAA,IACjF;AAAA,IACA,QAAc;AACZ,aAAO,sBAAsB;AAC7B,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEA,eAAe,YAAY,QAAsC;AAC/D,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,UAAM,cAAc,CAAC,UAAiB;AACpC,aAAO,IAAI,SAAS,WAAW;AAC/B,aAAO,KAAK;AAAA,IACd;AAEA,WAAO,KAAK,SAAS,WAAW;AAChC,WAAO,OAAO,GAAG,aAAa,MAAM;AAClC,aAAO,IAAI,SAAS,WAAW;AAC/B,YAAM,UAAU,OAAO,QAAQ;AAC/B,cAAQ,QAAQ,IAAI;AAAA,IACtB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,yBACP,QACA,kBACA,SACA,cACiB;AACjB,QAAM,wBAAwB,kCAAkC,gBAAgB;AAEhF,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,OAAmB;AACjC,UAAI,CAAC,SAAS;AACZ,kBAAU;AACV,WAAG;AAAA,MACL;AAAA,IACF;AAEA,WAAO,GAAG,WAAW,CAAC,KAA2B,QAA6B;AAC5E,YAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,kBAAkB;AAEtD,UAAI,IAAI,aAAa,cAAc;AACjC,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI,WAAW;AACnB;AAAA,MACF;AAEA,YAAM,qBAAqB;AAAA,QACzB,MAAM,IAAI,aAAa,IAAI,MAAM;AAAA,QACjC,OAAO,IAAI,aAAa,IAAI,OAAO;AAAA,QACnC,kBAAkB,IAAI,aAAa,IAAI,mBAAmB;AAAA,QAC1D,OAAO,IAAI,aAAa,IAAI,OAAO;AAAA,QACnC,KAAK,IAAI,aAAa,IAAI,KAAK;AAAA,MACjC;AAEA,UAAI;AACF,6CAAqC,oBAAoB,qBAAqB;AAAA,MAChF,SAAS,OAAO;AACd,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;AACzE,eAAO,MAAM,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AAC9E;AAAA,MACF;AAEA,YAAM,qBAAqB,mBAAmB;AAC9C,UAAI,uBAAuB,MAAM;AAC/B,cAAM,cAAc,mBAAmB,oBAAoB;AAC3D,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI,yBAAyB,WAAW,EAAE;AAC9C,eAAO,MAAM,OAAO,yBAAyB,oBAAoB,WAAW,CAAC,CAAC;AAC9E;AAAA,MACF;AAEA,UAAI;AACF,cAAM,OAAO;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAEA,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,iBAAiB,QAAQ,WAAW,CAAC;AAC7C,eAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,MAC5B,SAAS,OAAO;AACd,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;AACzE,eAAO,MAAM,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,MAChF;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,aAAa,QAAW;AAClC,cACG,SAAS,EACT,KAAK,CAAC,UAAU;AACf,cAAM,qBAAqB,mCAAmC,KAAK;AACnE,YAAI,uBAAuB,MAAM;AAC/B,iBAAO,MAAM,OAAO,IAAI,MAAM,2CAA2C,CAAC,CAAC;AAC3E;AAAA,QACF;AAEA,YAAI;AACF,+CAAqC,oBAAoB,qBAAqB;AAC9E,cAAI,mBAAmB,UAAU,MAAM;AACrC,kBAAM,cAAc,mBAAmB,oBAAoB,mBAAmB;AAC9E,kBAAM,yBAAyB,mBAAmB,OAAO,WAAW;AAAA,UACtE;AAEA,gBAAM,OAAO;AAAA,YACX;AAAA,YACA;AAAA,UACF;AACA,iBAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAC5B,SAAS,OAAO;AACd,iBAAO,MAAM,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,QAChF;AAAA,MACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,eAAO,MAAM,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,MAChF,CAAC;AAAA,IACL;AAEA,QAAI,QAAQ,gBAAgB,QAAW;AACrC,cAAQ,YAAY,gBAAgB,EAAE,MAAM,CAAC,UAAU;AACrD,eAAO,MAAM,OAAO,KAAK,CAAC;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAMA,SAAS,mCAAmC,OAAuD;AACjG,QAAM,UAAU,MAAM,WAAW,MAAM,EAAE,EAAE,WAAW,MAAM,EAAE,EAAE,KAAK;AACrE,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,WAAO;AAAA,MACL,MAAM,IAAI,aAAa,IAAI,MAAM;AAAA,MACjC,OAAO,IAAI,aAAa,IAAI,OAAO;AAAA,MACnC,kBAAkB,IAAI,aAAa,IAAI,mBAAmB;AAAA,MAC1D,OAAO,IAAI,aAAa,IAAI,OAAO;AAAA,MACnC,KAAK,IAAI,aAAa,IAAI,KAAK;AAAA,IACjC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,kBAAkB;AAAA,MAClB,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAUA,SAAS,kCAAkC,kBAIzC;AACA,QAAM,MAAM,IAAI,IAAI,gBAAgB;AACpC,QAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAC1C,QAAM,cAAc,wBAAwB,KAAK;AAEjD,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,aAAa,UAAU;AAAA,IAC/B,eAAe,aAAa,iBAAiB;AAAA,EAC/C;AACF;AAEA,SAAS,wCACP,UACA,UAKQ;AACR,uCAAqC,UAAU,QAAQ;AAEvD,MAAI,SAAS,SAAS,QAAQ,SAAS,KAAK,WAAW,GAAG;AACxD,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,SAAO,SAAS;AAClB;AAEA,SAAS,qCACP,UACA,UAKM;AACN,MAAI,SAAS,UAAU,MAAM;AAC3B,QAAI,SAAS,UAAU,QAAQ,SAAS,MAAM,WAAW,GAAG;AAC1D,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,QAAI,SAAS,UAAU,SAAS,OAAO;AACrC,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,SAAS,eAAe;AAC1B,QAAI,SAAS,QAAQ,QAAQ,SAAS,IAAI,WAAW,GAAG;AACtD,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAAA,EACF;AAEA,MACE,SAAS,QAAQ,QACjB,SAAS,IAAI,SAAS,KACtB,SAAS,WAAW,QACpB,SAAS,QAAQ,SAAS,QAC1B;AACA,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACF;AAEA,SAAS,yBAAyB,OAAe,aAA4B;AAC3E,SAAO,IAAI,MAAM,+BAA+B,KAAK,WAAM,WAAW,EAAE;AAC1E;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ;AAC7B;AAEO,SAAS,iBAAiB,aAAwC;AACvE,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,OAAO,aAAa,QAAQ;AAElC,SAAO;AAAA,IACL;AAAA,IACA,0CAA0C,WAAW,KAAK,CAAC;AAAA,IAC3D;AAAA,IACA;AAAA,IACA,OAAO,WAAW,KAAK,CAAC;AAAA,IACxB,yBAAyB,WAAW,IAAI,CAAC;AAAA,IACzC;AAAA,EACF,EAAE,KAAK,EAAE;AACX;;;AEvSA,OAAOC,aAAY;AAEZ,SAAS,uBAA+B;AAC7C,SAAOA,QAAO,YAAY,EAAE,EAAE,SAAS,WAAW;AACpD;AAEO,SAAS,sBAAsB,UAA0B;AAC9D,SAAOA,QAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,WAAW;AACxE;;;ACLA,IAAMC,kBAAiB;AAQhB,IAAM,aAAN,cAAyB,MAAM;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,OAAwB,QAAgB;AAClD,UAAM,MAAM,qBAAqB,MAAM,KAAK;AAC5C,SAAK,OAAO;AACZ,SAAK,QAAQ,MAAM;AACnB,SAAK,mBAAmB,MAAM;AAC9B,SAAK,WAAW,MAAM;AACtB,SAAK,oBAAoB,MAAM;AAC/B,SAAK,YAAY,MAAM;AACvB,SAAK,SAAS;AACd,SAAK,YAAY,sBAAsB,IAAI;AAC3C,SAAK,WAAW,CAAC,KAAK;AAAA,EACxB;AACF;AAEO,SAAS,sBAAsB,OAAqC;AACzE,SACE,iBAAiB,eAChB,MAAM,UAAU,OACf,MAAM,UAAU,kBAChB,MAAM,UAAU;AAEtB;AAEA,eAAsB,0BAA0B,OAUjB;AAC7B,QAAM,WAAW,8BAA8B,MAAM,QAAQ;AAE7D,SAAO,cAAc;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM;AAAA,IACpB,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,eAAe,MAAM;AAAA,MACrB,cAAc,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA,OAAO,MAAM;AAAA,IACb,KAAK,MAAM;AAAA,EACb,CAAC;AACH;AAEA,eAAsB,mBAAmB,OAQV;AAC7B,QAAM,WAAW,8BAA8B,MAAM,QAAQ;AAE7D,SAAO,cAAc;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM;AAAA,IACpB,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,eAAe,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,IACA,OAAO,MAAM;AAAA,IACb,KAAK,MAAM;AAAA,EACb,CAAC;AACH;AAEA,eAAe,cAAc,OAOE;AAC7B,QAAM,OAAO,IAAI,gBAAgB;AAAA,IAC/B,WAAW,MAAM;AAAA,IACjB,GAAG,MAAM;AAAA,EACX,CAAC;AAED,MAAI,MAAM,iBAAiB,QAAW;AACpC,SAAK,IAAI,iBAAiB,MAAM,YAAY;AAAA,EAC9C;AAEA,QAAM,WAAW,MAAM,MAAM,MAAM,MAAM,eAAe;AAAA,IACtD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,IACA,MAAM,KAAK,SAAS;AAAA,EACtB,CAAC;AACD,QAAM,UAAU,MAAM,4BAA4B,QAAQ;AAC1D,QAAM,cAAcC,aAAY,SAAS,cAAc;AAEvD,MAAI,OAAO,gBAAgB,YAAY,YAAY,KAAK,EAAE,WAAW,GAAG;AACtE,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,QAAM,wBAAwB,YAAY,KAAK;AAE/C,QAAM,YAAY,yBAAyBA,aAAY,SAAS,YAAY,CAAC;AAC7E,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,YAAYA,aAAY,SAAS,YAAY;AACnD,MAAI,YAA2B;AAC/B,MAAI,cAAc,QAAW;AAC3B,QACE,OAAO,cAAc,YACrB,CAAC,OAAO,SAAS,SAAS,KAC1B,CAAC,OAAO,UAAU,SAAS,KAC3B,YAAY,GACZ;AACA,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,gBAAY,MAAM,IAAI,IAAI,YAAY;AACtC,QACE,CAAC,OAAO,cAAc,SAAS,KAC/B,YAAYD,mBACZ,CAAC,OAAO,SAAS,IAAI,KAAK,SAAS,EAAE,QAAQ,CAAC,GAC9C;AACA,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,eAAeC,aAAY,SAAS,eAAe;AACzD,QAAM,QAAQA,aAAY,SAAS,OAAO;AAC1C,QAAM,yBACJ,OAAO,iBAAiB,YAAY,aAAa,KAAK,EAAE,SAAS,IAC7D,aAAa,KAAK,IAClB;AACN,QAAM,kBACJ,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AACxE,SAAO;AAAA,IACL,aAAa;AAAA,IACb,cAAc,2BAA2B,SAAY,SAAY;AAAA,IACjE;AAAA,IACA;AAAA,IACA,OAAO,oBAAoB,SAAY,SAAY;AAAA,EACrD;AACF;AAEA,eAAsB,4BACpB,UACkC;AAClC,QAAM,gBAAgB,yBAAyB,SAAS,MAAM;AAC9D,MAAI;AAEJ,MAAI;AACF,cAAU,MAAM,SAAS,KAAK;AAAA,EAChC,QAAQ;AACN,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,GAAG;AAC7E,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,QAAM,SAAS;AACf,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,WAAW,eAAe,QAAQ,cAAc,KAAK,GAAG,SAAS,MAAM;AAAA,EACnF;AAEA,SAAO;AACT;AAEA,SAAS,eACP,SACA,gBAAgB,gBACC;AACjB,QAAM,QAAQA,aAAY,SAAS,OAAO;AAC1C,QAAM,mBAAmBA,aAAY,SAAS,mBAAmB;AACjE,QAAM,WAAWA,aAAY,SAAS,WAAW;AACjD,SAAO;AAAA,IACL,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC3C,mBAAmB,OAAO,qBAAqB,WAAW,mBAAmB;AAAA,IAC7E,WAAW,OAAO,aAAa,WAAW,WAAW;AAAA,EACvD;AACF;AAEA,SAASA,aAAY,QAAiCC,MAAsB;AAC1E,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQA,IAAG,IAAI,OAAOA,IAAG,IAAI;AAC3E;AAEA,SAAS,yBAAyB,QAA4B;AAC5D,QAAM,QAAQ,WAAW,MAAM,4BAA4B;AAC3D,SAAO,IAAI,WAAW,EAAE,MAAM,GAAG,MAAM;AACzC;AAEA,SAAS,yBAAyB,OAAiC;AACjE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,YAAY,MAAM,WAAW,WAAW;AACvD;;;AJ7MA,IAAMC,kBAAiB;AAEhB,SAAS,0BACd,SACqB;AACrB,MAAI,kBAAkB,OAAO,GAAG;AAC9B,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,iCAAiC,OAAO;AACjD;AAEO,SAAS,iCACd,SACqB;AACrB,QAAM,eAAe,QAAQ,gBAAgB,4BAA4B,QAAQ,SAAS;AAC1F,QAAM,cACJ,QAAQ,cAAc,SAAY,OAAO,2BAA2B,QAAQ,SAAS;AACvF,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,QAAM,oBAAoB,oBAAI,IAAiD;AAC/E,QAAM,kBAAkB,oBAAI,IAAgD;AAC5E,QAAM,wBAAwB,oBAAI,IAAyC;AAE3E,SAAO;AAAA,IACL,MAAM,iBAAiB,OAAsB;AAC3C,+BAAyB,MAAM,YAAY,gCAAgC;AAC3E,YAAM,aAAa,8BAA8B,MAAM,UAAU;AACjE,YAAM,UAAU,MAAM,wBAAwB,YAAY,QAAW,MAAM,OAAO,KAAK;AACvF,YAAM,cAAc,SAAS,QAAQ;AACrC,UACE,YAAY,QACZ,gBAAgB,UAChB,QAAQ,WAAW,UACnB,UAAU,QAAQ,QAAQ,GAAG,GAC7B;AACA;AAAA,MACF;AAEA,mCAA6B,YAAY,QAAQ,QAAQ;AAEzD,YAAM,QAAQ,IAAI,iBAAiB,UAAU,WAAW,EAAE;AAAA,IAC5D;AAAA,IAEA,MAAM,mBAAmB,OAAO;AAC9B,UAAI;AACF,iCAAyB,MAAM,YAAY,gCAAgC;AAC3E,cAAM,aAAa,8BAA8B,MAAM,UAAU;AACjE,cAAM,WAAW,8BAA8B,MAAM,UAAU,QAAQ;AACvE,qCAA6B,YAAY,QAAQ;AACjD,cAAM,eACJ,qBAAqB,MAAM,YAAY,QAAQ,CAAC,KAChD,MAAM,WAAW,OAAO,UAAU;AACpC,cAAM,UAAU,MAAM;AAAA,UACpB;AAAA,UACA;AAAA,YACE,GAAG,MAAM;AAAA,YACT;AAAA,UACF;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAEA,YAAI,SAAS,QAAQ,gBAAgB,QAAW;AAC9C,iBAAO,EAAE,QAAQ,OAAO;AAAA,QAC1B;AAEA,eAAO,EAAE,QAAQ,QAAQ;AAAA,MAC3B,SAAS,OAAO;AACd,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,wBACb,UACA,WACAC,QACA,kBACA,eAAe,OACqB;AACpC,UAAM,oBAAoB,8BAA8B,QAAQ;AAChE,QAAI,UAAU,MAAM,YAAY,iBAAiB;AACjD,UAAM,mBAAmB,iBAAiB,WAAW,OAAO;AAE5D,QAAI,SAAS,WAAW,UAAa,CAAC,gBAAgB,CAAC,UAAU,QAAQ,QAAQ,GAAG,GAAG;AACrF,aAAO;AAAA,IACT;AAEA,QACE,SAAS,QAAQ,iBAAiB,UAClC,qBAAqB,WACpB,gBAAgB,UAAU,QAAQ,QAAQ,GAAG,IAC9C;AACA,gBAAU,MAAM,eAAe,mBAAmB,SAAS,kBAAkBA,MAAK;AAClF,UAAI,SAAS,WAAW,UAAa,CAAC,UAAU,QAAQ,QAAQ,GAAG,GAAG;AACpE,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,WAAW,QAAW;AACjD,gBAAU,mBAAmB,OAAO;AACpC,YAAM,YAAY,mBAAmB,OAAO;AAAA,IAC9C;AAEA,QAAI,CAAC,oBAAoB,qBAAqB,QAAW;AACvD,aAAO;AAAA,IACT;AAEA,WAAO,iBAAiB,mBAAmB,SAAS,kBAAkBA,MAAK;AAAA,EAC7E;AAEA,iBAAe,eACb,UACA,SACA,WACAA,QACoC;AACpC,mCAA+B,UAAU,2BAA2B;AAEpE,UAAM,WAAW,gBAAgB,IAAI,QAAQ;AAC7C,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,YAAI,QAAQ,QAAQ,iBAAiB,QAAW;AAC9C,iBAAO;AAAA,QACT;AAEA,YAAI,mBAAmB;AACvB,YAAI;AAEJ,eAAO,MAAM;AACX,cAAI;AACF,8BAAkB,MAAM,mBAAmB;AAAA,cACzC,eAAe;AAAA,gBACb,UAAU;AAAA,gBACV;AAAA,gBACA;AAAA,cACF;AAAA,cACA,UAAU,QAAQ,OAAO;AAAA,cACzB,cAAc,QAAQ,OAAO;AAAA,cAC7B,cAAc,QAAQ,OAAO;AAAA,cAC7B;AAAA,cACA,OAAAA;AAAA,cACA;AAAA,YACF,CAAC;AACD;AAAA,UACF,SAAS,OAAO;AACd,gBAAI,iBAAiB,cAAc,MAAM,UAAU,iBAAiB;AAClE,oBAAM,iBAAiB,mBAAmB,OAAO;AACjD,oBAAM,YAAY,UAAU,cAAc;AAC1C,qBAAO;AAAA,YACT;AAEA,gBACE;AAAA,cACE;AAAA,cACA,MAAM,qBAAqB,UAAU,mBAAmB;AAAA,cACxD;AAAA,YACF,GACA;AACA,oBAAM,sBAAsB,UAAU,mBAAmB;AACzD,oBAAM,aAAa,QAAQ;AAC3B,qBAAO;AAAA,YACT;AAEA,gBAAI,CAAC,oBAAoB,sBAAsB,KAAK,GAAG;AACrD,iCAAmB;AACnB;AAAA,YACF;AAEA,kBAAM;AAAA,UACR;AAAA,QACF;AAEA,cAAM,iBAAqC;AAAA,UACzC,GAAG;AAAA,UACH,QAAQ;AAAA,YACN,GAAG;AAAA,YACH,cAAc,gBAAgB,gBAAgB,QAAQ,OAAO;AAAA,UAC/D;AAAA,UACA,WAAW,kBAAkB,SAAS;AAAA,QACxC;AACA,cAAM,YAAY,UAAU,cAAc;AAC1C,eAAO;AAAA,MACT,UAAE;AACA,wBAAgB,OAAO,QAAQ;AAAA,MACjC;AAAA,IACF,GAAG;AAEH,oBAAgB,IAAI,UAAU,OAAO;AACrC,WAAO;AAAA,EACT;AAEA,iBAAe,iBACb,UACA,iBACA,WACAA,QAC6B;AAC7B,UAAM,WAAW,sBAAsB,IAAI,QAAQ;AACnD,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,YAAY;AAC3B,4BAAsB,UAAU,2BAA2B;AAC3D,qCAA+B,UAAU,2BAA2B;AACpE,UAAI,iBAAiB;AACrB,UAAI,0BAA0B;AAC9B,UAAI,0BAA0B;AAE9B,aAAO,MAAM;AACX,cAAM,WAAW,MAAM,mCAAmC;AAAA,UACxD,aAAa,QAAQ,QAAQ;AAAA,UAC7B,UAAU,QAAQ,QAAQ;AAAA,UAC1B,cAAc,QAAQ,QAAQ;AAAA,UAC9B,aAAa,QAAQ,QAAQ;AAAA,QAC/B,CAAC;AACD,YAAI,iBAA6C;AAEjD,YAAI;AACF,2BAAiB,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACTA;AAAA,UACF;AACA,gBAAM,uBAA2C;AAAA,YAC/C;AAAA,YACA,qBAAqB,UAAU;AAAA,YAC/B,QAAQ,eAAe;AAAA,YACvB,WAAW,kBAAkB,SAAS;AAAA,UACxC;AACA,gBAAM,YAAY,UAAU,oBAAoB;AAEhD,gBAAM,WAAW,qBAAqB;AACtC,gBAAM,YAAY,sBAAsB,QAAQ;AAChD,gBAAM,mBAAmB,sBAAsB;AAAA,YAC7C,UAAU,UAAU;AAAA,YACpB;AAAA,YACA,UAAU,eAAe,OAAO;AAAA,YAChC,aAAa,SAAS;AAAA,YACtB,eAAe;AAAA,YACf,gBAAgB,kBAAkB,QAAQ,MAAM;AAAA,UAClD,CAAC;AACD,gBAAM,OAAO,MAAM,SAAS,YAAY,gBAAgB;AACxD,gBAAM,SAAS,MAAM,0BAA0B;AAAA,YAC7C,eAAe;AAAA,cACb,UAAU;AAAA,cACV;AAAA,cACA;AAAA,YACF;AAAA,YACA,UAAU,eAAe,OAAO;AAAA,YAChC,cAAc,eAAe,OAAO;AAAA,YACpC;AAAA,YACA,cAAc;AAAA,YACd,aAAa,SAAS;AAAA,YACtB;AAAA,YACA,OAAAA;AAAA,YACA;AAAA,UACF,CAAC;AAED,gBAAM,UAA8B;AAAA,YAClC,GAAG;AAAA,YACH;AAAA,UACF;AAEA,gBAAM,YAAY,UAAU,OAAO;AACnC,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,cAAI,oCAAoC,OAAO,gBAAgB,uBAAuB,GAAG;AACvF,sCAA0B;AAC1B,kBAAM,sBAAsB,UAAU,mBAAmB;AACzD,kBAAM,aAAa,QAAQ;AAC3B,6BAAiB;AACjB;AAAA,UACF;AAEA,cAAI,CAAC,2BAA2B,sBAAsB,KAAK,GAAG;AAC5D,sCAA0B;AAC1B,kBAAM,aAAa,QAAQ;AAC3B,6BAAiB;AACjB;AAAA,UACF;AAEA,gBAAM;AAAA,QACR,UAAE;AACA,mBAAS,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,IACF,GAAG;AAEH,UAAM,eAAe,QAAQ,QAAQ,MAAM;AACzC,4BAAsB,OAAO,QAAQ;AAAA,IACvC,CAAC;AACD,0BAAsB,IAAI,UAAU,YAAY;AAChD,WAAO;AAAA,EACT;AAEA,iBAAe,cACb,iBACA,WACA,aACAA,QAC8B;AAC9B,UAAM,mBAAmB,0BAA0B,QAAQ,MAAM;AAEjE,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAI,qBAAqB,MAAM;AAC7B,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,wBAAwB;AAAA,QACxB,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,uBAAuBC;AAAA,MAC3B,UAAU;AAAA,MACV;AAAA,IACF;AACA,QAAI,yBAAyB,UAAa,qBAAqB,MAAM;AACnE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,wBAAwB;AAAA,QACxB,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,qBAAqB,UAAU,mBAAmB;AAC7E,QAAI,iBAAiB,MAAM;AACzB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,wBAAwB;AAAA,QACxB,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,yBAAyB,QAAW;AACtC,UAAI,oBAAoB,QAAQ,gBAAgB,OAAO,SAAS,SAAS,GAAG;AAC1E,eAAO;AAAA,UACL,MAAM;AAAA,UACN,wBAAwB;AAAA,UACxB,QAAQ,gBAAgB;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,gEAAgE;AAAA,IAClF;AAEA,QAAI,oBAAoB,QAAQ,gBAAgB,OAAO,SAAS,SAAS,GAAG;AAC1E,YAAM,6BACJ,qBAAqB,QACrB,gBAAgB,OAAO,aAAa,iBAAiB,YACrD,gBAAgB,OAAO,iBAAiB,iBAAiB;AAE3D,UAAI,CAAC,4BAA4B;AAC/B,cAAM,qBAAqB,UAAU,qBAAqB,gBAAgB,MAAM;AAChF,eAAO;AAAA,UACL,MAAM;AAAA,UACN,wBAAwB;AAAA,UACxB,QAAQ,gBAAgB;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAmB;AAAA,MACvB,kBAAkB,QAAQ,MAAM;AAAA,MAChC;AAAA,IACF;AACA,UAAM,WAAW,MAAMD,OAAM,sBAAsB;AAAA,MACjD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,gBAAgB;AAAA,IACvC,CAAC;AACD,UAAM,UAAU,MAAM,4BAA4B,QAAQ;AAC1D,UAAM,WAAWC,cAAa,SAAS,WAAW;AAElD,QAAI,aAAa,UAAa,SAAS,KAAK,EAAE,WAAW,GAAG;AAC1D,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,UAAM,eAAeA,cAAa,SAAS,eAAe;AAC1D,UAAM,mBAAmB;AAAA,MACvB,UAAU,SAAS,KAAK;AAAA,MACxB,cACE,iBAAiB,UAAa,aAAa,KAAK,EAAE,SAAS,IACvD,aAAa,KAAK,IAClB;AAAA,IACR;AACA,UAAM,qBAAqB,UAAU,qBAAqB,gBAAgB;AAE1E,WAAO;AAAA,MACL,MAAM;AAAA,MACN,wBAAwB;AAAA,MACxB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,iBAAe,YAAY,UAAsD;AAC/E,WAAO,uBAAuB,MAAM,aAAa,KAAK,QAAQ,CAAC;AAAA,EACjE;AAEA,iBAAe,YAAY,UAAkB,SAA4C;AACvF,UAAM,aAAa,KAAK,UAAU,OAAO;AAAA,EAC3C;AAEA,iBAAe,aAAa,UAAiC;AAC3D,UAAM,aAAa,MAAM,QAAQ;AAAA,EACnC;AAEA,iBAAe,qBACb,QAC8C;AAC9C,QAAI,kBAAkB,IAAI,MAAM,GAAG;AACjC,aAAO,kBAAkB,IAAI,MAAM,KAAK;AAAA,IAC1C;AAEA,QAAI,gBAAgB,MAAM;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,YAAY,KAAK,MAAM;AAC5C,UAAM,mBAAmB,WAAW,OAAO,OAAO,sBAAsB,MAAM;AAC9E,QAAI,WAAW,QAAQ,qBAAqB,MAAM;AAChD,YAAM,YAAY,MAAM,MAAM;AAC9B,aAAO;AAAA,IACT;AAEA,sBAAkB,IAAI,QAAQ,gBAAgB;AAC9C,WAAO;AAAA,EACT;AAEA,iBAAe,qBACb,QACA,QACe;AACf,sBAAkB,IAAI,QAAQ,MAAM;AACpC,QAAI,gBAAgB,MAAM;AACxB,YAAM,YAAY,KAAK,QAAQ,MAAM;AAAA,IACvC;AAAA,EACF;AAEA,iBAAe,sBAAsB,QAA+B;AAClE,sBAAkB,OAAO,MAAM;AAC/B,QAAI,gBAAgB,MAAM;AACxB,YAAM,YAAY,MAAM,MAAM;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,kBACP,SAC8C;AAC9C,SAAO,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU;AACjE;AAEA,SAAS,UAAU,QAA2B,KAA4B;AACxE,SAAO,OAAO,cAAc,QAAQ,OAAO,aAAa,IAAI;AAC9D;AAEA,SAAS,iBACP,WACA,SACkC;AAClC,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,8BAA8B,UAAU,QAAQ;AAAA,IAC5D;AAAA,EACF;AAEA,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,UAAU;AACnC,QAAM,SAASA,cAAa,UAAU,QAAQ;AAC9C,QAAM,wBAAwBA,cAAa,UAAU,wBAAwB;AAC7E,QAAM,gBAAgBA,cAAa,UAAU,gBAAgB;AAC7D,QAAM,gCAAgC;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACA,MACE,WAAW,UACX,0BAA0B,UAC1B,kBAAkB,UAClB,kCAAkC,UAClC,CAAC,8BAA8B,SAAS,MAAM,GAC9C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU,8BAA8B,QAAQ,QAAQ;AAAA,IACxD,qBAAqB,QAAQ,UAAU;AAAA,IACvC,kBAAkB,QAAQ,UACvB;AAAA,IACH,qBAAqB,QAAQ;AAAA,IAC7B,gCAAgC;AAAA,IAChC,6BAA6B;AAAA,EAC/B;AACF;AAEA,SAAS,mBAAmB,SAAiD;AAC3E,QAAM,cAAc,EAAE,GAAG,QAAQ;AACjC,SAAO,YAAY;AACnB,SAAO;AACT;AAEA,SAAS,qBACP,SAC+D;AAC/D,SAAO,SAAS,QAAQ,gBAAgB;AAC1C;AAEA,SAAS,uBAAuB,SAA+D;AAC7F,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,sBAAsBC,aAAY,SAAS,QAAQ,CAAC;AACnE,MAAI,WAAW,MAAM;AACnB,WAAO,EAAE,GAAG,SAAS,QAAQ,EAAE,UAAU,GAAG,GAAG,QAAQ,OAAU;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,QAAQ,sBAAsBA,aAAY,SAAS,QAAQ,CAAC;AAAA,EAC9D;AACF;AAEA,SAAS,sBAAsB,OAAqD;AAClF,MAAI,CAACC,gBAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,WAAWF,cAAa,OAAO,UAAU;AAC/C,MAAI,aAAa,UAAa,SAAS,KAAK,EAAE,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,QAAM,qBAAqB,SAAS,KAAK;AAEzC,QAAM,eAAeC,aAAY,OAAO,cAAc;AACtD,MAAI,iBAAiB,QAAW;AAC9B,WAAO,EAAE,UAAU,mBAAmB;AAAA,EACxC;AAEA,MAAI,OAAO,iBAAiB,YAAY,aAAa,KAAK,EAAE,WAAW,GAAG;AACxE,WAAO;AAAA,EACT;AACA,QAAM,yBAAyB,aAAa,KAAK;AAEjD,SAAO,EAAE,UAAU,oBAAoB,cAAc,uBAAuB;AAC9E;AAEA,SAAS,sBAAsB,OAA+C;AAC5E,MAAI,UAAU,UAAa,CAACC,gBAAe,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,cAAcF,cAAa,OAAO,aAAa;AACrD,QAAM,YAAYA,cAAa,OAAO,WAAW;AACjD,QAAM,YAAYC,aAAY,OAAO,WAAW;AAChD,QAAM,eAAeA,aAAY,OAAO,cAAc;AACtD,QAAM,QAAQD,cAAa,OAAO,OAAO;AACzC,QAAM,wBAAwB,aAAa,KAAK;AAChD,QAAM,yBAAyB,OAAO,iBAAiB,WAAW,aAAa,KAAK,IAAI;AACxF,QAAM,kBAAkB,OAAO,KAAK;AAEpC,MACE,gBAAgB,UAChB,0BAA0B,UAC1B,sBAAsB,WAAW,KACjC,cAAc,YACd,EACE,cAAc,QACb,OAAO,cAAc,YACpB,OAAO,cAAc,SAAS,KAC9B,aAAaF,mBACb,OAAO,SAAS,IAAI,KAAK,SAAS,EAAE,QAAQ,CAAC,MAEhD,iBAAiB,WACf,OAAO,iBAAiB,YACvB,2BAA2B,UAC3B,uBAAuB,WAAW,IACtC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,GAAI,2BAA2B,SAAY,CAAC,IAAI,EAAE,cAAc,uBAAuB;AAAA,IACvF,GAAI,oBAAoB,UAAa,gBAAgB,WAAW,IAC5D,CAAC,IACD,EAAE,OAAO,gBAAgB;AAAA,EAC/B;AACF;AAEA,SAAS,kBACP,QACiC;AACjC,MAAI,OAAO,aAAa,QAAW;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,YAAY,6BAA6B,OAAO,SAAS,UAAU;AAAA,IACnE,OAAO,6BAA6B,OAAO,SAAS,KAAK;AAAA,IACzD,YAAY,6BAA6B,OAAO,SAAS,UAAU;AAAA,IACnE,iBAAiB,6BAA6B,OAAO,SAAS,eAAe;AAAA,EAC/E;AACF;AAEA,SAAS,0BACP,QACqC;AACrC,QAAM,WAAW,6BAA6B,OAAO,QAAQ;AAC7D,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,6BAA6B,OAAO,YAAY;AACrE,SAAO,iBAAiB,SAAY,EAAE,SAAS,IAAI,EAAE,UAAU,aAAa;AAC9E;AAEA,SAAS,6BAA6B,OAA+C;AACnF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,WAAW,IAAI,SAAY;AAC5C;AAEA,SAASG,aAAY,QAAgBE,MAAsB;AACzD,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQA,IAAG,IAClD,OAAmCA,IAAG,IACvC;AACN;AAEA,SAASD,gBAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASF,cAAa,QAAgBG,MAAiC;AACrE,QAAM,QAAQF,aAAY,QAAQE,IAAG;AACrC,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,iBAAiB,QAAgBA,MAAa,OAAuB;AAC5E,QAAM,QAAQH,cAAa,QAAQG,IAAG;AACtC,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,GAAG,KAAK,eAAeA,IAAG,EAAE;AAAA,EAC9C;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAgBA,MAAmC;AAC5E,QAAM,QAAQF,aAAY,QAAQE,IAAG;AACrC,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IAC3E,QACA;AACN;AAEA,SAAS,sBAAsB,OAOpB;AACT,QAAM,wBAAwB;AAAA,IAC5B,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,QAAM,SAAS,iBAAiB,MAAM,UAAU,UAAU,+BAA+B;AACzF,QAAM,MAAM,IAAIC,KAAI,qBAAqB;AACzC,QAAM,WAAW,8BAA8B,MAAM,QAAQ;AAC7D,QAAM,QAAQ,yBAAyB;AAAA,IACrC;AAAA,IACA,eACEH,aAAY,MAAM,UAAU,gDAAgD,MAAM;AAAA,EACtF,CAAC;AACD,MAAI,aAAa,IAAI,iBAAiB,MAAM;AAC5C,MAAI,aAAa,IAAI,aAAa,MAAM,QAAQ;AAChD,MAAI,aAAa,IAAI,gBAAgB,MAAM,WAAW;AACtD,MAAI,aAAa,IAAI,kBAAkB,MAAM,aAAa;AAC1D,MAAI,aAAa,IAAI,yBAAyB,MAAM;AACpD,MAAI,aAAa,IAAI,YAAY,QAAQ;AACzC,MAAI,aAAa,IAAI,SAAS,KAAK;AAEnC,MAAI,MAAM,gBAAgB,UAAU,UAAa,MAAM,eAAe,MAAM,SAAS,GAAG;AACtF,QAAI,aAAa,IAAI,SAAS,MAAM,eAAe,KAAK;AAAA,EAC1D;AAEA,SAAO,IAAI,SAAS;AACtB;AAEA,SAAS,sBAAsB,UAAkD;AAC/E,MAAI,CAAC,kBAAkB,UAAU,kCAAkC,GAAG,SAAS,MAAM,GAAG;AACtF,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkBI,WAA0B;AACnD,SAAOA,UAAS,SAAS,GAAG,IAAIA,UAAS,MAAM,GAAG,EAAE,EAAE,YAAY,IAAIA,UAAS,YAAY;AAC7F;AAEA,SAAS,mBAAmBA,WAA2B;AACrD,QAAM,qBAAqB,kBAAkBA,SAAQ;AACrD,SACE,uBAAuB,eACvB,uBAAuB,SACvB,mBAAmB,WAAW,MAAM;AAExC;AAEA,SAAS,gBAAgB,OAAe,OAAqB;AAC3D,QAAM,MAAM,IAAID,KAAI,KAAK;AACzB,MAAI,IAAI,aAAa,UAAU;AAC7B;AAAA,EACF;AAEA,MAAI,IAAI,aAAa,WAAW,mBAAmB,IAAI,QAAQ,GAAG;AAChE;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,GAAG,KAAK,mDAAmD;AAC7E;AAEA,SAAS,+BAA+B,UAAkD;AACxF,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,uBAAuBJ,cAAa,UAAU,uBAAuB;AAE3E,2BAAyB,uBAAuB,wBAAwB;AACxE,2BAAyB,eAAe,gBAAgB;AACxD,kBAAgB,uBAAuB,wBAAwB;AAC/D,kBAAgB,eAAe,gBAAgB;AAE/C,MAAI,yBAAyB,QAAW;AACtC,6BAAyB,sBAAsB,uBAAuB;AACtE,oBAAgB,sBAAsB,uBAAuB;AAAA,EAC/D;AACF;AAEA,SAAS,yBAAyB,OAAqB,OAAqB;AAC1E,QAAM,MAAM,iBAAiBI,OAAM,IAAIA,KAAI,MAAM,SAAS,CAAC,IAAI,IAAIA,KAAI,KAAK;AAC5E,MAAI,IAAI,aAAa,IAAI,cAAc,GAAG;AACxC,UAAM,IAAI,MAAM,GAAG,KAAK,2CAA2C;AAAA,EACrE;AACF;AAEA,SAAS,6BAA6B,YAAoB,UAAwB;AAChF,MAAI,eAAe,UAAU;AAC3B,UAAM,IAAI;AAAA,MACR,qBAAqB,UAAU,uCAAuC,QAAQ;AAAA,IAChF;AAAA,EACF;AACF;AAEA,SAAS,4BACP,UACA,aACyB;AACzB,QAAM,OAAgC;AAAA,IACpC,eAAe,CAAC,WAAW;AAAA,IAC3B,aAAa,CAAC,sBAAsB,eAAe;AAAA,IACnD,gBAAgB,CAAC,MAAM;AAAA,IACvB,4BAA4B;AAAA,EAC9B;AACA,QAAM,aAAa,aAAa,SAAY,SAAYJ,cAAa,UAAU,YAAY;AAC3F,QAAM,QAAQ,aAAa,SAAY,SAAYA,cAAa,UAAU,OAAO;AACjF,QAAM,aAAa,aAAa,SAAY,SAAYA,cAAa,UAAU,YAAY;AAC3F,QAAM,kBACJ,aAAa,SAAY,SAAYA,cAAa,UAAU,iBAAiB;AAE/E,MAAI,eAAe,UAAa,WAAW,SAAS,GAAG;AACrD,SAAK,cAAc;AAAA,EACrB;AAEA,MAAI,UAAU,UAAa,MAAM,SAAS,GAAG;AAC3C,SAAK,QAAQ;AAAA,EACf;AAEA,MAAI,eAAe,UAAa,WAAW,SAAS,GAAG;AACrD,SAAK,cAAc;AAAA,EACrB;AAEA,MAAI,oBAAoB,UAAa,gBAAgB,SAAS,GAAG;AAC/D,SAAK,mBAAmB;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,WAAkE;AAC3F,SAAO;AAAA,IACL,qBAAqB,UAAU;AAAA,IAC/B,kBAAkB,UAAU;AAAA,IAC5B,6BAA6B,UAAU;AAAA,EACzC;AACF;AAQA,SAAS,oCACP,OACA,QACA,kBACS;AACT,MAAI,EAAE,iBAAiB,eAAe,MAAM,UAAU,oBAAoB,kBAAkB;AAC1F,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAQ;AACpB,WAAO,OAAO,SAAS,aAAa,OAAO;AAAA,EAC7C;AAEA,SAAO;AACT;;;AKr3BA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;;;ACyBP,SAAS,0BAA0B,OAAqB,MAAuC;AAC7F,SAAO,MAAM,OAAO,IAAI;AAC1B;AAEA,SAASM,gBAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,cAAc,OAAmC;AACxD,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ;AAC/E;AAEA,SAASC,mBAAkBC,WAA0B;AACnD,SAAOA,UAAS,SAAS,GAAG,IAAIA,UAAS,MAAM,GAAG,EAAE,EAAE,YAAY,IAAIA,UAAS,YAAY;AAC7F;AAEA,SAASC,oBAAmBD,WAA2B;AACrD,QAAM,qBAAqBD,mBAAkBC,SAAQ;AAErD,SAAO,uBAAuB,eACzB,uBAAuB,SACvB,mBAAmB,WAAW,MAAM;AAC3C;AAEA,SAASE,iBAAgB,KAAU,OAAqB;AACtD,MAAI,IAAI,aAAa,UAAU;AAC7B;AAAA,EACF;AAEA,MAAI,IAAI,aAAa,WAAWD,oBAAmB,IAAI,QAAQ,GAAG;AAChE;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,GAAG,KAAK,mDAAmD;AAC7E;AAEA,SAAS,kCACP,OACA,aACgC;AAChC,MAAI,CAACH,gBAAe,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,MAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,WAAW,GAAG;AACrE,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,QAAM,qBAAqB,8BAA8B,MAAM,QAAQ;AAEvE,MAAI,uBAAuB,aAAa;AACtC,UAAM,IAAI;AAAA,MACR,2DAA2D,WAAW,cAAc,MAAM,QAAQ;AAAA,IACpG;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,MAAM,qBAAqB,KAAK,MAAM,sBAAsB,WAAW,GAAG;AAC3F,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,oCACP,OACA,QACkC;AAClC,MAAI,CAACA,gBAAe,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,MAAI,OAAO,MAAM,WAAW,YAAY,MAAM,OAAO,WAAW,GAAG;AACjE,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,MAAI,MAAM,WAAW,QAAQ;AAC3B,UAAM,IAAI;AAAA,MACR,2DAA2D,MAAM,cAAc,MAAM,MAAM;AAAA,IAC7F;AAAA,EACF;AAEA,MACE,OAAO,MAAM,2BAA2B,YACxC,MAAM,uBAAuB,WAAW,GACxC;AACA,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AAEA,MAAI,OAAO,MAAM,mBAAmB,YAAY,MAAM,eAAe,WAAW,GAAG;AACjF,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,MACE,CAAC,cAAc,MAAM,wBAAwB,KAC7C,CAAC,MAAM,yBAAyB,SAAS,MAAM,GAC/C;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,CAAC,cAAc,MAAM,gCAAgC,KACrD,CAAC,MAAM,iCAAiC,SAAS,MAAM,GACvD;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,UAAoB,OAAiC;AACnF,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,mBAAmB,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG,KAAK;AAC1E,UAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB,gBAAgB,GAAG;AAAA,EACjE;AAEA,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,QAAQ;AACN,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B;AAAA,EACxD;AACF;AAEA,SAAS,4BAA4B,UAAwB,QAAwB;AACnF,QAAM,MAAM,IAAI,IAAI,OAAO,aAAa,WAAW,WAAW,SAAS,SAAS,CAAC;AAEjF,QAAM,eAAe,IAAI,aAAa,MAAM,KAAK,IAAI;AACrD,MAAI,WAAW,gBAAgB,MAAM,GAAG,YAAY;AAEpD,SAAO,IAAI,SAAS;AACtB;AAEO,SAAS,oCACd,aACA,qBACQ;AACR,QAAM,WAAW,IAAI,IAAI,8BAA8B,WAAW,CAAC;AACnE,EAAAI,iBAAgB,UAAU,wBAAwB;AAElD,MAAI,wBAAwB,QAAW;AACrC,UAAMC,+BAA8B,IAAI;AAAA,MACtC,OAAO,wBAAwB,WAAW,sBAAsB,oBAAoB,SAAS;AAAA,MAC7F;AAAA,IACF;AACA,IAAAD,iBAAgBC,8BAA6B,iCAAiC;AAC9E,WAAOA,6BAA4B,SAAS;AAAA,EAC9C;AAEA,QAAM,8BAA8B,IAAI;AAAA,IACtC,4BAA4B,UAAU,0BAA0B;AAAA,EAClE;AACA,EAAAD,iBAAgB,6BAA6B,iCAAiC;AAC9E,SAAO,4BAA4B,SAAS;AAC9C;AAEA,SAAS,mCAAmC,QAA8B;AACxE,QAAM,QAAQ,OAAO,WAAW,WAAW,SAAS,OAAO,SAAS;AACpE,QAAM,MAAM,IAAI,IAAI,KAAK;AACzB,MAAI,IAAI,OAAO,SAAS,KAAK,IAAI,KAAK,SAAS,GAAG;AAChD,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAEA,EAAAA,iBAAgB,KAAK,6BAA6B;AAElD,MAAI,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,SAAS,GAAG,GAAG;AACzD,QAAI,WAAW,IAAI,SAAS,MAAM,GAAG,EAAE;AAAA,EACzC;AAEA,SAAO,IAAI,aAAa,MAAM,IAAI,SAAS,IAAI,SAAS;AAC1D;AAEO,SAAS,sCAAsC,QAA8B;AAClF,SAAO;AAAA,IACL,mCAAmC,MAAM;AAAA,IACzC;AAAA,EACF;AACF;AAEO,IAAM,yBAAN,MAA6B;AAAA,EACjB;AAAA,EACA;AAAA,EACA,cAAc,oBAAI,IAAkC;AAAA,EAErE,YAAY,EAAE,OAAAE,SAAQ,2BAA2B,MAAM,IAAmC,CAAC,GAAG;AAC5F,SAAK,YAAYA;AACjB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,SACJ,aACA,EAAE,oBAAoB,IAAgC,CAAC,GACxB;AAC/B,UAAM,WAAW,8BAA8B,WAAW;AAC1D,UAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AACA,UAAM,qBAAqB,KAAK,YAAY,IAAI,QAAQ;AACxD,QAAI,uBAAuB,UAAa,wBAAwB,QAAW;AACzE,aAAO;AAAA,IACT;AAEA,UAAM,qBAAqB,MAAM,KAAK,OAAO,IAAI,QAAQ;AACzD,QACE,uBAAuB,QACvB,uBAAuB,UACvB,wBAAwB,QACxB;AACA,WAAK,YAAY,IAAI,UAAU,kBAAkB;AACjD,aAAO;AAAA,IACT;AAEA,UAAM,2BAA2B,MAAM,KAAK,UAAU,0BAA0B;AAAA,MAC9E,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AACD,UAAM,mBAAmB;AAAA,MACvB,MAAM,iBAAiB,0BAA0B,6BAA6B;AAAA,MAC9E;AAAA,IACF;AAEA,UAAM,4BAAsC,CAAC;AAE7C,eAAW,uBAAuB,iBAAiB,uBAAuB;AACxE,YAAM,gCAAgC;AAAA,QACpC;AAAA,MACF;AACA,YAAM,iCACJ,sCAAsC,6BAA6B;AAErE,UAAI;AACF,cAAM,8BAA8B,MAAM,KAAK,UAAU,gCAAgC;AAAA,UACvF,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,QACF,CAAC;AACD,cAAM,8BAA8B;AAAA,UAClC,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAEA,cAAM,SAA+B;AAAA,UACnC,UAAU,iBAAiB;AAAA,UAC3B,qBAAqB;AAAA,UACrB;AAAA,UACA,qBAAqB;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAEA,aAAK,YAAY,IAAI,UAAU,MAAM;AACrC,cAAM,KAAK,OAAO,IAAI,UAAU,MAAM;AACtC,eAAO;AAAA,MACT,SAAS,OAAO;AACd,kCAA0B;AAAA,UACxB,GAAG,8BAA8B,KAC/B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR,oDAAoD,QAAQ,KAAK,0BAA0B;AAAA,QACzF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAUA,SAAS,uBAAuB,OAAe,OAAuB;AACpE,MAAI,QAAQ;AACZ,SAAO,QAAQ,MAAM,WAAW,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,MAAO;AAC9E,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAe,OAA4D;AAC5F,MAAI,QAAQ;AACZ,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,YAAY,MAAM,KAAK;AAC7B,QACE,cAAc,OACX,cAAc,OACd,cAAc,OACd,cAAc,OACd,cAAc,KACjB;AACA;AAAA,IACF;AACA,aAAS;AAAA,EACX;AAEA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,MAAM,MAAM,OAAO,KAAK;AAAA,IAC/B,WAAW;AAAA,EACb;AACF;AAEA,SAAS,mBAAmB,OAAe,OAAwB;AACjE,QAAM,QAAQ,UAAU,OAAO,KAAK;AACpC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,uBAAuB,OAAO,MAAM,SAAS,CAAC,MAAM;AACnE;AAEA,SAAS,mBAAmB,WAA4B;AACtD,SACG,aAAa,OAAO,aAAa,OAC9B,aAAa,OAAO,aAAa,OACjC,aAAa,OAAO,aAAa,OAClC,cAAc,OACd,cAAc,OACd,cAAc,OACd,cAAc,OACd,cAAc,OACd,cAAc;AAErB;AAEA,SAAS,YACP,OACA,OAC+C;AAC/C,MAAI,YAAY;AAChB,SAAO,YAAY,MAAM,QAAQ;AAC/B,UAAM,YAAY,MAAM,SAAS;AACjC,QAAI,cAAc,OAAO,cAAc,OAAO,cAAc,KAAM;AAChE;AAAA,IACF;AACA,iBAAa;AAAA,EACf;AAEA,QAAM,UAAU,MAAM,MAAM,OAAO,SAAS;AAC5C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,SAAO,QAAQ,QAAQ,UAAU,mBAAmB,QAAQ,KAAK,CAAE,GAAG;AACpE,aAAS;AAAA,EACX;AAEA,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,UAAU,QAAQ,KAAK,MAAM,KAAK;AACvD,aAAS;AAAA,EACX;AAEA,MAAI,UAAU,QAAQ,QAAQ;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,SAAS,UAAU;AAC9B;AAEA,SAAS,iBACP,OACA,OACmD;AACnD,MAAI,MAAM,KAAK,MAAM,KAAM;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,cAAc;AAClB,MAAI,QAAQ,QAAQ;AACpB,MAAI,WAAW;AAEf,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,UAAU;AACZ,qBAAe;AACf,iBAAW;AACX,eAAS;AACT;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,iBAAW;AACX,eAAS;AACT;AAAA,IACF;AAEA,QAAI,cAAc,KAAM;AACtB,aAAO;AAAA,QACL;AAAA,QACA,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEA,mBAAe;AACf,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,SAAS,eACP,OACA,OAC2D;AAC3D,QAAM,QAAQ,UAAU,OAAO,KAAK;AACpC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,uBAAuB,OAAO,MAAM,SAAS;AACzD,MAAI,MAAM,KAAK,MAAM,KAAK;AACxB,WAAO;AAAA,EACT;AAEA,UAAQ,uBAAuB,OAAO,QAAQ,CAAC;AAC/C,MAAI,SAAS,MAAM,QAAQ;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,iBAAiB,OAAO,KAAK;AACjD,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,OAAO,YAAY;AAAA,MACnB,WAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,SAAO,YAAY,MAAM,QAAQ;AAC/B,UAAM,YAAY,MAAM,SAAS;AACjC,QAAI,cAAc,OAAO,cAAc,OAAO,cAAc,KAAM;AAChE;AAAA,IACF;AACA,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM,MAAM,OAAO,SAAS;AAAA,IACnC;AAAA,EACF;AACF;AAEO,SAAS,iCACd,aACmC;AACnC,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,uBAA0D;AAE9D,SAAO,QAAQ,YAAY,QAAQ;AACjC,YAAQ,uBAAuB,aAAa,KAAK;AACjD,WAAO,YAAY,KAAK,MAAM,KAAK;AACjC,cAAQ,uBAAuB,aAAa,QAAQ,CAAC;AAAA,IACvD;AAEA,UAAM,SAAS,UAAU,aAAa,KAAK;AAC3C,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AAEA,YAAQ,uBAAuB,aAAa,OAAO,SAAS;AAC5D,UAAM,SAAiC,uBAAO,OAAO,IAAI;AAEzD,QAAI,QAAQ,YAAY,UAAU,YAAY,KAAK,MAAM,KAAK;AAC5D,YAAM,UAAU,YAAY,aAAa,KAAK;AAC9C,UAAI,YAAY,MAAM;AACpB,gBAAQ,QAAQ;AAAA,MAClB,WAAW,mBAAmB,aAAa,KAAK,GAAG;AACjD,eAAO,QAAQ,YAAY,QAAQ;AACjC,gBAAM,cAAc,eAAe,aAAa,KAAK;AACrD,cAAI,gBAAgB,MAAM;AACxB;AAAA,UACF;AAEA,iBAAO,YAAY,IAAI,IAAI,YAAY;AACvC,kBAAQ,uBAAuB,aAAa,YAAY,SAAS;AAEjE,cAAI,YAAY,KAAK,MAAM,KAAK;AAC9B;AAAA,UACF;AAEA,gBAAM,YAAY,uBAAuB,aAAa,QAAQ,CAAC;AAC/D,cAAI,CAAC,mBAAmB,aAAa,SAAS,GAAG;AAC/C,oBAAQ;AACR;AAAA,UACF;AAEA,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,MAAM,YAAY,MAAM,UAAU;AAC3C,YAAM,YAAwC;AAAA,QAC5C,QAAQ;AAAA,QACR;AAAA,QACA,KAAK;AAAA,MACP;AACA,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,eAAO;AAAA,MACT;AAEA,+BAAyB;AAAA,IAC3B;AAEA,QAAI,YAAY,KAAK,MAAM,KAAK;AAC9B,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;;;AbhdA,IAAM,uBAAuB;AAEtB,IAAM,YAAN,MAAgB;AAAA,EACb,eAAqE;AAAA,EACrE,4BAAuD;AAAA,EACvD,4BAAuD;AAAA,EACvD,oBAA2C;AAAA,EAC3C;AAAA,EACS,yBAAyB,oBAAI,IAAY;AAAA,EACzC,uBAAuB,oBAAI,IAA2B;AAAA,EACtD;AAAA,EACT,YAAiC;AAAA,EACjC,eAA2C;AAAA,EAEnD,YAAY,SAA2B;AACrC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAI,QAA8D;AAChE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,qBAAgD;AAClD,WAAO,KAAK,8BAA8B,OACtC,OACA,gBAAgB,KAAK,yBAAyB;AAAA,EACpD;AAAA,EAEA,IAAI,aAAoC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAmC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,yBAA8C;AACpD,QAAI,KAAK,iBAAiB,gBAAgB;AACxC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,QAAI,KAAK,iBAAiB,UAAU;AAClC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,QAAI,KAAK,iBAAiB,MAAM;AAC9B,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,WAAoD;AAChE,QAAI,KAAK,iBAAiB,kBAAkB,KAAK,iBAAiB,UAAU;AAC1E,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,SAAK,4BAA4B;AACjC,SAAK,4BAA4B;AACjC,SAAK,oBAAoB;AACzB,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB,MAAM;AAClC,SAAK,qBAAqB,MAAM;AAEhC,UAAM,wBAAwB,UAAU,OACrC,KAAK,CAAC,gBAAgB,YAAY,MAAM,EACxC;AAAA,MAAM,CAAC,UACN,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IAC1D;AACF,UAAM,eAAe,IAAI;AAAA,MACvB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACb;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,KAAK;AAET,iBAAa,UAAU,QAAQ,OAAO,CAAC,EAAE;AAEzC,QAAI,sBAAsB,QAAW;AACnC,mBAAa;AAAA,QAAU;AAAA,QAA0B,CAAC,WAChD,kBAAkB,MAA6B;AAAA,MACjD;AAAA,IACF;AAEA,iBAAa,eAAe,oCAAoC,YAAY;AAC1E,UAAI,mBAAmB,UAAa,KAAK,2BAA2B,OAAO,gBAAgB,MAAM;AAC/F;AAAA,MACF;AAEA,YAAM,eAAe;AAAA,IACvB,CAAC;AACD,iBAAa,eAAe,wCAAwC,YAAY;AAC9E,UACE,uBAAuB,UACpB,KAAK,2BAA2B,WAAW,gBAAgB,MAC9D;AACA;AAAA,MACF;AAEA,YAAM,mBAAmB;AAAA,IAC3B,CAAC;AACD,iBAAa,eAAe,mCAAmC,OAAO,WAAW;AAC/E,UAAI,sBAAsB,QAAW;AACnC;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E;AAAA,MACF;AAEA,YAAM,EAAE,IAAI,IAAI;AAChB,UAAI,OAAO,QAAQ,YAAY,CAAC,KAAK,uBAAuB,IAAI,GAAG,GAAG;AACpE;AAAA,MACF;AAEA,YAAM,kBAAkB,GAAG;AAAA,IAC7B,CAAC;AACD,iBAAa,eAAe,sCAAsC,YAAY;AAC5E,UACE,qBAAqB,UAClB,KAAK,2BAA2B,SAAS,gBAAgB,MAC5D;AACA;AAAA,MACF;AAEA,YAAM,iBAAiB;AAAA,IACzB,CAAC;AACD,iBAAa,eAAe,yBAAyB,OAAO,WAAW;AACrE,UAAI,UAAU,UAAa,CAACC,gBAAe,MAAM,KAAK,CAAC,WAAW,OAAO,KAAK,GAAG;AAC/E;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,QAAQ,MAAM,GAAG;AAC3B;AAAA,MACF;AAEA,YAAM,UAAsB;AAAA,QAC1B,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,MACf;AAEA,UAAI,OAAO,WAAW,QAAW;AAC/B,YAAI,OAAO,OAAO,WAAW,UAAU;AACrC;AAAA,QACF;AAEA,gBAAQ,SAAS,OAAO;AAAA,MAC1B;AAEA,YAAM,MAAM,OAAO;AAAA,IACrB,CAAC;AACD,iBAAa,eAAe,0BAA0B,OAAO,WAAW;AACtE,UAAI,eAAe,UAAa,CAACA,gBAAe,MAAM,GAAG;AACvD;AAAA,MACF;AAEA,YAAM,EAAE,eAAe,SAAS,IAAI;AACpC,UACE,CAAC,YAAY,aAAa,KAC1B,OAAO,aAAa,YACpB,CAAC,KAAK,qBAAqB,IAAI,aAAa,GAC5C;AACA;AAAA,MACF;AAEA,YAAM,iBAAiC;AAAA,QACrC;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,UAAU,QAAW;AAC9B,YAAI,OAAO,OAAO,UAAU,UAAU;AACpC;AAAA,QACF;AAEA,uBAAe,QAAQ,OAAO;AAAA,MAChC;AAEA,UAAI,OAAO,YAAY,QAAW;AAChC,YAAI,OAAO,OAAO,YAAY,UAAU;AACtC;AAAA,QACF;AAEA,uBAAe,UAAU,OAAO;AAAA,MAClC;AAEA,YAAM,WAAW,cAAc;AAAA,IACjC,CAAC;AACD,iBAAa,eAAe,2BAA2B,MAAM,MAAS;AAEtE,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,uBAAuB,MAAM;AAClC,SAAK,qBAAqB,MAAM;AAChC,cAAU,OACP,KAAK,CAAC,gBAAgB;AACrB,UAAI,KAAK,cAAc,WAAW;AAChC;AAAA,MACF;AAEA,WAAK,cAAc,QAAQ,YAAY,MAAM;AAC7C,WAAK,eAAe;AACpB,WAAK,YAAY;AACjB,WAAK,eAAe;AAAA,IACtB,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,UAAI,KAAK,cAAc,WAAW;AAChC;AAAA,MACF;AAEA,YAAM,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACvE,WAAK,cAAc,QAAQ,MAAM;AACjC,WAAK,eAAe;AACpB,WAAK,YAAY;AACjB,WAAK,eAAe;AAAA,IACtB,CAAC;AAEH,UAAM,eAAmC;AAAA,MACvC,GAAI,KAAK,QAAQ,gBAAgB,CAAC;AAAA,IACpC;AAEA,QAAI,sBAAsB,UAAa,aAAa,aAAa,QAAW;AAC1E,mBAAa,WAAW,CAAC;AAAA,IAC3B;AAEA,QAAI,gBAAgB,QAAW;AAC7B,mBAAa,QAAQ;AAAA,QACnB,GAAI,aAAa,SAAS,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,SAAK,4BAA4B,gBAAgB,YAAY;AAE7D,QAAI;AACF,YAAM,wBAAwB,MAAM,aAAa,YAAY,cAAc;AAAA,QACzE,iBAAiB;AAAA,QACjB,YAAY,KAAK,QAAQ;AAAA,QACzB;AAAA,MACF,CAAC;AAED,UAAI,CAAC,mBAAmB,qBAAqB,GAAG;AAC9C,cAAM,IAAI,SAAS,uBAAuB,2BAA2B;AAAA,MACvE;AAEA,YAAM,mBAAmB;AAEzB,UAAI,iBAAiB,oBAAoB,sBAAsB;AAC7D,cAAM,IAAI;AAAA,UACR;AAAA,UACA,iCAAiC,iBAAiB,eAAe;AAAA,QACnE;AAAA,MACF;AAEA,WAAK,4BAA4B,gBAAgB,iBAAiB,YAAY;AAC9E,WAAK,oBAAoB,EAAE,GAAG,iBAAiB,WAAW;AAC1D,WAAK,sBAAsB,iBAAiB;AAC5C,UAAI,gBAAgB,QAAW;AAC7B,qBAAa,UAAU,cAAc,aAAa;AAAA,UAChD,OAAO,MAAM,YAAY;AAAA,QAC3B,EAAE;AAAA,MACJ;AACA,mBAAa,iBAAiB,2BAA2B;AACzD,WAAK,eAAe;AAEpB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,KAAK,cAAc,WAAW;AAChC,cAAM,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACvE,qBAAa,QAAQ,MAAM;AAC3B,kBAAU,QAAQ,MAAM;AACxB,aAAK,eAAe;AACpB,aAAK,YAAY;AACjB,aAAK,eAAe;AAAA,MACtB;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,+BAAmD;AACzD,QAAI,KAAK,8BAA8B,MAAM;AAC3C,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,UAAU,SAA0B,CAAC,GAAoD;AAC7F,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,UAAU,QAAW;AAC1C,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,UAAM,gBAAgB,OAAO,WAAW,SAAY,SAAY,EAAE,QAAQ,OAAO,OAAO;AACxF,UAAM,SAAS,MAAM,aAAa,YAAY,cAAc,aAAa;AACzE,QAAI,CAAC,kBAAkB,MAAM,GAAG;AAC9B,YAAM,IAAI,SAAS,uBAAuB,2BAA2B;AAAA,IACvE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,QAAwB,UAA2B,CAAC,GAA4B;AAC7F,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,UAAU,QAAW;AAC1C,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,QAAQ,OAAO;AAAA,IACvB;AAEA,UAAM,gBACJ,QAAQ,kBAAkB,SACtB,SACA;AAAA,MACE,GAAG;AAAA,MACH,OAAO;AAAA,QACL,eAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAEN,QAAI,QAAQ,kBAAkB,QAAW;AACvC,WAAK,qBAAqB;AAAA,QACxB,QAAQ;AAAA,SACP,KAAK,qBAAqB,IAAI,QAAQ,aAAa,KAAK,KAAK;AAAA,MAChE;AAAA,IACF;AAEA,QAAI;AACF,UAAI;AACJ,UAAI,mBAAmB;AACvB,YAAM,+BAA+B,MAAM;AACzC,YAAI,cAAc,UAAa,kBAAkB;AAC/C;AAAA,QACF;AACA,2BAAmB;AACnB,qBAAa,iBAAiB,2BAA2B,EAAE,UAAU,CAAC;AAAA,MACxE;AACA,YAAM,iBAAiB,aAAa,YAAY,cAAc,eAAe;AAAA,QAC3E,aAAa,CAAC,kBAAkB;AAC9B,sBAAY;AAAA,QACd;AAAA,QACA,WAAW;AAAA,MACb,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,YAAI,CAAC,iBAAiB,MAAM,GAAG;AAC7B,gBAAM,IAAI,SAAS,uBAAuB,qBAAqB;AAAA,QACjE;AAEA,eAAO;AAAA,MACT,CAAC;AACD,UAAI,QAAQ,WAAW,QAAW;AAChC,eAAO,MAAM;AAAA,MACf;AACA,YAAM,SAAS,QAAQ;AAEvB,UAAI;AACJ,YAAM,eAAe,IAAI,QAAwB,CAAC,GAAG,WAAW;AAC9D,cAAM,wBAAwB,MAAM;AAClC,uCAA6B;AAC7B,cAAI,cAAc,QAAW;AAC3B,yBAAa,cAAc,WAAW,OAAO,MAAM;AAAA,UACrD;AACA,iBAAO,OAAO,MAAM;AAAA,QACtB;AAEA,wBAAgB;AAChB,eAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAC9D,YAAI,OAAO,SAAS;AAClB,iBAAO,oBAAoB,SAAS,aAAa;AACjD,gCAAsB;AAAA,QACxB;AAAA,MACF,CAAC;AAED,UAAI;AACF,eAAQ,MAAM,QAAQ,KAAK,CAAC,gBAAgB,YAAY,CAAC;AAAA,MAC3D,UAAE;AACA,YAAI,kBAAkB,QAAW;AAC/B,iBAAO,oBAAoB,SAAS,aAAa;AAAA,QACnD;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAI,QAAQ,kBAAkB,QAAW;AACvC,cAAM,cAAc,KAAK,qBAAqB,IAAI,QAAQ,aAAa;AACvE,YAAI,gBAAgB,GAAG;AACrB,eAAK,qBAAqB,OAAO,QAAQ,aAAa;AAAA,QACxD,WAAW,gBAAgB,QAAW;AACpC,eAAK,qBAAqB,IAAI,QAAQ,eAAe,cAAc,CAAC;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,SAA0B,CAAC,GAC8B;AACzD,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,cAAc,QAAW;AAC9C,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,gBAAgB,OAAO,WAAW,SAAY,SAAY,EAAE,QAAQ,OAAO,OAAO;AACxF,UAAM,SAAS,MAAM,aAAa,YAAY,kBAAkB,aAAa;AAC7E,QAAI,CAAC,sBAAsB,MAAM,GAAG;AAClC,YAAM,IAAI,SAAS,uBAAuB,+BAA+B;AAAA,IAC3E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBACJ,SAA0B,CAAC,GAC8C;AACzE,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,cAAc,QAAW;AAC9C,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,gBAAgB,OAAO,WAAW,SAAY,SAAY,EAAE,QAAQ,OAAO,OAAO;AACxF,UAAM,SAAS,MAAM,aAAa,YAAY,4BAA4B,aAAa;AACvF,QAAI,CAAC,8BAA8B,MAAM,GAAG;AAC1C,YAAM,IAAI,SAAS,uBAAuB,yCAAyC;AAAA,IACrF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,QAAuE;AACxF,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,cAAc,QAAW;AAC9C,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,SAAS,MAAM,aAAa,YAAY,kBAAkB,MAAM;AACtE,QAAI,CAAC,qBAAqB,MAAM,GAAG;AACjC,YAAM,IAAI,SAAS,uBAAuB,+BAA+B;AAAA,IAC3E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,KAA4B;AAC1C,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,WAAW,cAAc,MAAM;AACpD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAM,aAAa,YAAY,uBAAuB,EAAE,IAAI,CAAC;AAC7D,SAAK,uBAAuB,IAAI,GAAG;AAAA,EACrC;AAAA,EAEA,MAAM,YAAY,KAA4B;AAC5C,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,WAAW,cAAc,MAAM;AACpD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAM,aAAa,YAAY,yBAAyB,EAAE,IAAI,CAAC;AAC/D,SAAK,uBAAuB,OAAO,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,SAA0B,CAAC,GAAwD;AACnG,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,YAAY,QAAW;AAC5C,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,UAAM,gBAAgB,OAAO,WAAW,SAAY,SAAY,EAAE,QAAQ,OAAO,OAAO;AACxF,WAAQ,MAAM,aAAa,YAAY,gBAAgB,aAAa;AAAA,EAItE;AAAA,EAEA,MAAM,UAAU,QAAmD;AACjE,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,YAAY,QAAW;AAC5C,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,UAAM,SAAS,MAAM,aAAa,YAAY,eAAe,MAAM;AACnE,QAAI,CAAC,kBAAkB,MAAM,GAAG;AAC9B,YAAM,IAAI,SAAS,uBAAuB,4BAA4B;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,QAAiD;AAC9D,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,gBAAgB,QAAW;AAChD,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,UAAM,SAAS,MAAM,aAAa,YAAY,uBAAuB,MAAM;AAC3E,QAAI,CAAC,iBAAiB,MAAM,GAAG;AAC7B,YAAM,IAAI,SAAS,uBAAuB,oCAAoC;AAAA,IAChF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,OAAgC;AAChD,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,qBAAqB,KAAK,6BAA6B;AAC7D,QAAI,mBAAmB,YAAY,QAAW;AAC5C,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,UAAM,aAAa,YAAY,oBAAoB,EAAE,MAAM,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,WAAsB,QAAgC;AACjE,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,SAAoD,EAAE,UAAU;AAEtE,QAAI,WAAW,QAAW;AACxB,aAAO,SAAS;AAAA,IAClB;AAEA,iBAAa,iBAAiB,2BAA2B,MAAM;AAAA,EACjE;AAAA,EAEA,MAAM,mBAAkC;AACtC,UAAM,eAAe,KAAK,uBAAuB;AACjD,QAAI,KAAK,2BAA2B,OAAO,gBAAgB,MAAM;AAC/D,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,iBAAa,iBAAiB,kCAAkC;AAAA,EAClE;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,eAAe,KAAK,uBAAuB;AACjD,UAAM,aAAa,YAAY,MAAM;AAAA,EACvC;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,iBAAiB,UAAU;AAClC;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,MAAM,mBAAmB;AAChD,SAAK,cAAc,QAAQ,UAAU;AACrC,SAAK,WAAW,QAAQ,UAAU;AAClC,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,4BAA4B;AACjC,SAAK,4BAA4B;AACjC,SAAK,oBAAoB;AACzB,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB,MAAM;AAClC,SAAK,qBAAqB,MAAM;AAChC,SAAK,eAAe;AAAA,EACtB;AACF;AA+NO,IAAM,cAAc;AACpB,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAE/B,IAAM,iBAAiB;AAm5C9B,SAAS,kBACP,SACA,MACA,SACgC;AAChC,SAAOC,OAAM,SAAS,MAAM,OAAO;AACrC;AAEA,SAAS,0BAA0B,OAAqB,MAAuC;AAC7F,SAAO,MAAM,OAAO,IAAI;AAC1B;AAEO,IAAM,iBAAN,MAAM,gBAAuC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACT,WAAW;AAAA,EACX,eAAe;AAAA,EACvB,OAAwB,oBAAoB;AAAA,EAE5C,YAAY;AAAA,IACV;AAAA,IACA,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA,OAAO,eAAe;AAAA,EACxB,GAA0B;AACxB,SAAK,QAAQ,aAAa,SAAS,MAAM;AAAA,MACvC;AAAA,MACA;AAAA,MACA,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAED,UAAM,QAAQ,KAAK;AAEnB,SAAK,WAAW,MAAM;AACtB,SAAK,WAAW,MAAM;AACtB,UAAM,gBAAgB,IAAI,YAAY;AACtC,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAmB;AAC1C,YAAM,UACJ,iBAAiB,aACb,cAAc,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,IAC5C,GAAG,cAAc,OAAO,CAAC,GAAG,OAAO,KAAK,CAAC;AAC/C,WAAK,mBAAmB,OAAO;AAAA,IACjC,CAAC;AACD,UAAM,OAAO,KAAK,OAAO,MAAM;AAC7B,WAAK,mBAAmB,cAAc,OAAO,CAAC;AAAA,IAChD,CAAC;AACD,SAAK,SAAS,IAAI,QAAQ,CAAC,YAAY;AACrC,UAAI,UAAU;AACd,YAAM,gBAAgB,CAAC,UAAmC;AACxD,YAAI,SAAS;AACX;AAAA,QACF;AAEA,kBAAU;AACV,gBAAQ,KAAK;AAAA,MACf;AAEA,YAAM,KAAK,QAAQ,CAAC,MAAM,WAAW;AACnC,cAAM,cAAuC;AAAA,UAC3C,QAAQ,IAAI,MAAM,gCAAgC;AAAA,QACpD;AAEA,YAAI,SAAS,MAAM;AACjB,sBAAY,OAAO;AAAA,QACrB;AAEA,YAAI,WAAW,MAAM;AACnB,sBAAY,SAAS;AAAA,QACvB;AAEA,sBAAc,WAAW;AAAA,MAC3B,CAAC;AAED,YAAM,KAAK,SAAS,CAAC,UAAU;AAC7B,cAAM,cAAuC;AAAA,UAC3C,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QAClE;AAEA,YAAI,MAAM,aAAa,MAAM;AAC3B,sBAAY,OAAO,MAAM;AAAA,QAC3B;AAEA,YAAI,MAAM,eAAe,MAAM;AAC7B,sBAAY,SAAS,MAAM;AAAA,QAC7B;AAEA,sBAAc,WAAW;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,mBAAmB,OAAqB;AAC9C,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AAEA,SAAK,gBAAgB;AACrB,QAAI,KAAK,aAAa,SAAS,gBAAe,mBAAmB;AAC/D,WAAK,eAAe,KAAK,aAAa,MAAM,CAAC,gBAAe,iBAAiB;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,QAAQ,SAAS,IAAI,MAAM,0BAA0B,GAAS;AAC5D,SAAK;AAEL,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AAEA,SAAK,WAAW;AAEhB,QAAI,CAAC,KAAK,MAAM,MAAM,aAAa,CAAC,KAAK,MAAM,MAAM,eAAe;AAClE,WAAK,MAAM,MAAM,IAAI;AAAA,IACvB;AAEA,QAAI,KAAK,MAAM,aAAa,QAAQ,KAAK,MAAM,eAAe,QAAQ,CAAC,KAAK,MAAM,QAAQ;AACxF,WAAK,MAAM,KAAK,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,MAA4C;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,IAAI,YAAY;AAAA,EAC7B,cAAc,IAAI,YAAY;AAAA,EACvC;AAAA,EAGA;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACF;AAAA,EACA;AAAA,EACA,gCAAgC,oBAAI,IAAqB;AAAA,EACzD,iBAAiB,oBAAI,IAA6C;AAAA,EAEnF,YAAY;AAAA,IACV;AAAA,IACA,UAAU,CAAC;AAAA,IACX,OAAO,YAAY;AAAA,IACnB;AAAA,IACA;AAAA,EACF,GAAyB;AACvB,SAAK,MAAM;AACX,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,SAAK,gBAAgB,UAAU,SAC3B,SACA,0BAA0B,KAAK;AACnC,SAAK,yBAAyB,UAAU,SACpC,SACA,IAAI,uBAAuB;AAAA,MACzB,OAAO,CAAC,OAAO,SAAS,KAAK,eAAe,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC7D,OAAO;AAAA,IACT,CAAC;AACL,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,KAAK;AACrB,SAAK,SAAS,IAAI,QAAQ,CAAC,YAAY;AACrC,WAAK,gBAAgB;AAAA,IACvB,CAAC;AAED,SAAK,WAAW,KAAK,SAAS,CAAC,UAAU;AACvC,WAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,CAAC;AACD,SAAK,YAAY,KAAK,SAAS,CAAC,UAAU;AACxC,WAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,CAAC;AAED,SAAK,oBAAoB,EAAE,MAAM,CAAC,UAAU;AAC1C,WAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,SAAS,IAAI,MAAM,yBAAyB,GAAS;AAC3D,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AAEA,SAAK,WAAW;AAChB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAE1B,QAAI,CAAC,KAAK,YAAY,aAAa,CAAC,KAAK,YAAY,eAAe;AAClE,WAAK,YAAY,IAAI;AAAA,IACvB;AAEA,QAAI,CAAC,KAAK,WAAW,aAAa,CAAC,KAAK,WAAW,eAAe;AAChE,WAAK,WAAW,IAAI;AAAA,IACtB;AAEA,SAAK,KAAK,4BAA4B,MAAM;AAAA,EAC9C;AAAA,EAEA,MAAc,4BAA4B,QAA8B;AACtE,QAAI,cAAc;AAClB,QAAI,KAAK,cAAc,QAAW;AAChC,YAAM,YAAY,KAAK;AACvB,WAAK,YAAY;AACjB,UAAI;AACF,cAAM,KAAK,8BAA8B,SAAS;AAAA,MACpD,SAAS,OAAO;AACd,sBAAc,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK;AAC3B,SAAK,gBAAgB;AACrB,oBAAgB,EAAE,QAAQ,YAAY,CAAC;AAAA,EACzC;AAAA,EAEQ,uBAA6B;AACnC,eAAW,mBAAmB,KAAK,+BAA+B;AAChE,sBAAgB,MAAM;AAAA,IACxB;AAEA,SAAK,8BAA8B,MAAM;AAAA,EAC3C;AAAA,EAEQ,uBAA6B;AACnC,eAAW,UAAU,KAAK,gBAAgB;AACxC,WAAK,OAAO,OAAO,EAAE,MAAM,MAAM,MAAS;AAAA,IAC5C;AAEA,SAAK,eAAe,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAc,eAAe,OAAqB,MAAsC;AACtF,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,SAAK,8BAA8B,IAAI,eAAe;AAEtD,QAAI;AACF,aAAO,MAAM,KAAK,UAAU,OAAO;AAAA,QACjC,GAAG;AAAA,QACH,QAAQ,gBAAgB;AAAA,MAC1B,CAAC;AAAA,IACH,UAAE;AACA,WAAK,8BAA8B,OAAO,eAAe;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAc,sBAAqC;AACjD,qBAAiB,QAAQ,UAAU,KAAK,WAAW,GAAG;AACpD,UAAI,KAAK,YAAY,KAAK,WAAW,GAAG;AACtC;AAAA,MACF;AAEA,YAAM,SAAS,oBAAoB,IAAI;AACvC,YAAM,OAAO,KAAK,SAAS,IAAI;AAC/B,UACG,OAAO,SAAS,aAAa,OAAO,QAAQ,WAAW,gBACvD,OAAO,SAAS,kBAAkB,OAAO,QAAQ,WAAW,6BAC7D;AACA,cAAM;AAAA,MACR,OAAO;AACL,aAAK,KAAK,MAAM,CAAC,UAAU;AACzB,eAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACxE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAA6B;AAClD,UAAM,eAAe,KAAK,cAAc;AACxC,UAAM,WAAW,MAAM,KAAK,oBAAoB;AAAA,MAC9C,QAAQ;AAAA,MACR,eAAe,MAAM,KAAK,kBAAkB;AAAA,MAC5C,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,UAAU;AACjB,YAAM,SAAS,MAAM,OAAO;AAC5B;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,WAAW,KAAK;AAC3C,WAAK,YAAY;AACjB,WAAK,QAAQ,IAAI,MAAM,+CAA+C,CAAC;AACvE;AAAA,IACF;AAEA,UAAM,KAAK,sBAAsB,QAAQ;AACzC,QAAI,KAAK,UAAU;AACjB,YAAM,SAAS,MAAM,OAAO;AAC5B;AAAA,IACF;AACA,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,sBAAsB;AAC3B,SAAK,KAAK,wBAAwB,QAAQ,EAAE,MAAM,CAAC,UAAU;AAC3D,WAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,oBAAsC;AAClD,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,UAAU,qCAAqC;AAC3D,YAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,QAAI,KAAK,cAAc,QAAW;AAChC,cAAQ,IAAI,kBAAkB,KAAK,SAAS;AAC5C,cAAQ,IAAI,wBAAwB,oBAAoB;AAAA,IAC1D;AACA,WAAO,KAAK,wBAAwB,OAAO;AAAA,EAC7C;AAAA,EAEA,MAAc,mBAAqC;AACjD,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,UAAU,mBAAmB;AACzC,QAAI,KAAK,cAAc,QAAW;AAChC,cAAQ,IAAI,kBAAkB,KAAK,SAAS;AAC5C,cAAQ,IAAI,wBAAwB,oBAAoB;AAAA,IAC1D;AACA,QAAI,KAAK,gBAAgB,QAAW;AAClC,cAAQ,IAAI,iBAAiB,KAAK,WAAW;AAAA,IAC/C;AACA,WAAO,KAAK,wBAAwB,OAAO;AAAA,EAC7C;AAAA,EAEA,MAAc,oBAAoB,WAAqC;AACrE,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,kBAAkB,SAAS;AACvC,YAAQ,IAAI,wBAAwB,oBAAoB;AACxD,WAAO,KAAK,wBAAwB,OAAO;AAAA,EAC7C;AAAA,EAEA,MAAc,wBAAwB,SAAoC;AACxE,UAAM,KAAK,eAAe,mBAAmB;AAAA,MAC3C,YAAY,IAAI,IAAI,KAAK,GAAG;AAAA,MAC5B;AAAA,MACA,OAAO,KAAK;AAAA,IACd,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,UAA0B;AACjD,UAAM,YAAY,SAAS,QAAQ,IAAI,gBAAgB;AACvD,QAAI,cAAc,QAAQ,UAAU,WAAW,GAAG;AAChD;AAAA,IACF;AAEA,QAAI,KAAK,cAAc,UAAa,KAAK,cAAc,WAAW;AAChE,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,wBAA8B;AACpC,QAAI,KAAK,YAAY,KAAK,cAAc,UAAa,KAAK,qBAAqB;AAC7E;AAAA,IACF;AAEA,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB,EAAE,MAAM,CAAC,UAAU;AAC1C,UAAI,iBAAiB,wCAAwC,KAAK,UAAU;AAC1E;AAAA,MACF;AAEA,WAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,8BAA8B,WAAkC;AAC5E,UAAM,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK;AAAA,MAC9C,QAAQ;AAAA,MACR,SAAS,MAAM,KAAK,oBAAoB,SAAS;AAAA,IACnD,CAAC;AAED,QAAI,SAAS,WAAW,OAAO,SAAS,IAAI;AAC1C;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,SAAS,KAAK,GAAG,KAAK;AAClD,UAAM,mBAAmB,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG,KAAK;AAC1E,UAAM,UAAU,aAAa,WAAW,IACpC,iCAAiC,gBAAgB,MACjD,iCAAiC,gBAAgB,MAAM,YAAY;AACvE,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAAA,EAEA,MAAc,sBAAqC;AACjD,UAAM,WAAW,MAAM,KAAK,oBAAoB;AAAA,MAC9C,QAAQ;AAAA,MACR,eAAe,MAAM,KAAK,iBAAiB;AAAA,IAC7C,CAAC;AAED,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,qCAAqC;AAAA,IACjD;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,WAAK,YAAY;AACjB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,gBAAgB,MAAM,SAAS,KAAK,GAAG,KAAK;AAClD,YAAM,mBAAmB,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG,KAAK;AAC1E,YAAM,UAAU,aAAa,WAAW,IACpC,8BAA8B,gBAAgB,MAC9C,8BAA8B,gBAAgB,MAAM,YAAY;AACpE,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAI,gBAAgB,MAAM;AACxB;AAAA,IACF;AAEA,QAAI,YAAY,YAAY,EAAE,SAAS,mBAAmB,GAAG;AAC3D,YAAM,KAAK,2BAA2B,QAAQ;AAC9C,WAAK,sBAAsB;AAC3B,UAAI,CAAC,KAAK,YAAY,KAAK,cAAc,UAAa,KAAK,gBAAgB,QAAW;AACpF,aAAK,sBAAsB;AAAA,MAC7B;AACA;AAAA,IACF;AAEA;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,UAAmC;AACrE,QAAI,SAAS,SAAS,KAAK;AACzB;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,SAAS,KAAK,GAAG,KAAK;AAClD,UAAM,mBAAmB,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG,KAAK;AAC1E,UAAM,UAAU,aAAa,WAAW,IACpC,+BAA+B,gBAAgB,MAC/C,+BAA+B,gBAAgB,MAAM,YAAY;AACrE,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAAA,EAEA,MAAc,gCAAgC,UAAsC;AAClF,QAAI,SAAS,WAAW,OAAO,KAAK,kBAAkB,QAAW;AAC/D,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK;AAC7B,QAAI,oBAAoB,QAAW;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,iCAAiC,SAAS,QAAQ,IAAI,kBAAkB,CAAC;AAC3F,UAAM,sBAAsB,WAAW,OAAO;AAC9C,UAAM,YAAY,MAAM,gBAAgB,SAAS,KAAK,KAAK;AAAA,MACzD;AAAA,IACF,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,cAAc,mBAAmB;AAAA,MACzD,YAAY,IAAI,IAAI,KAAK,GAAG;AAAA,MAC5B,UAAU,SAAS,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA,OAAO,KAAK;AAAA,IACd,CAAC;AAED,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,QAAW;AAC9B,YAAM,OAAO;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,wBAAwB,UAAmC;AACvE,QAAI,SAAS,WAAW,KAAK;AAC3B;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAI,gBAAgB,MAAM;AACxB;AAAA,IACF;AAEA,UAAM,wBAAwB,YAAY,YAAY;AACtD,QAAI,sBAAsB,SAAS,mBAAmB,GAAG;AACvD,YAAM,KAAK,2BAA2B,QAAQ;AAC9C;AAAA,IACF;AAEA,QAAI,sBAAsB,SAAS,kBAAkB,GAAG;AACtD,YAAM,KAAK,2BAA2B,QAAQ;AAC9C;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AAAA,EAEA,MAAc,2BAA2B,UAAmC;AAC1E,QAAI,SAAS,SAAS,MAAM;AAC1B;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,SAAK,eAAe,IAAI,MAAM;AAE9B,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,MAAM;AACR;AAAA,QACF;AAEA,YAAI,UAAU,QAAW;AACvB;AAAA,QACF;AAEA,cAAM,WAAW,OAAO,KAAK,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AACpE,aAAK,iBAAiB,QAAQ;AAC9B,aAAK,cAAc,OAAO;AAAA,MAC5B;AAEA,YAAM,gBAAgB,QAAQ,OAAO;AACrC,UAAI,cAAc,SAAS,GAAG;AAC5B,aAAK,iBAAiB,OAAO,KAAK,aAAa,CAAC;AAChD,aAAK,cAAc,OAAO;AAAA,MAC5B;AAEA,WAAK,iBAAiB,OAAO,MAAM,CAAC;AACpC,WAAK,cAAc,OAAO;AAAA,IAC5B,UAAE;AACA,WAAK,eAAe,OAAO,MAAM;AACjC,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,2BAA2B,UAAmC;AAC1E,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,QAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,MAAM,OAAO;AACxC,SAAK,kBAAkB,KAAK,UAAU,aAAa,CAAC;AAAA,EACtD;AAAA,EAEQ,iBAAiB,UAAoC;AAC3D,eAAW,WAAW,UAAU;AAC9B,WAAK,kBAAkB,QAAQ,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,kBAAkB,MAAoB;AAC5C,QAAI,KAAK,YAAY,KAAK,WAAW,aAAa,KAAK,WAAW,eAAe;AAC/E;AAAA,IACF;AAEA,SAAK,WAAW,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EACnC;AAAA,EAEA,MAAc,oBAAoB,OAIZ;AACpB,UAAM,UAAU,YACd,KAAK,eAAe,KAAK,KAAK;AAAA,MAC5B,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM,MAAM,cAAc;AAAA,MACnC,MAAM,MAAM;AAAA,IACd,CAAC;AAEH,QAAI,WAAW,MAAM,QAAQ;AAC7B,QAAI,MAAM,KAAK,gCAAgC,QAAQ,GAAG;AACxD,iBAAW,MAAM,QAAQ;AAAA,IAC3B;AAEA,UAAM,aAAa,KAAK,kBAAkB,SACtC,OACA,KAAK,wBAAwB,QAAQ;AACzC,QAAI,eAAe,MAAM;AACvB,YAAM;AAAA,IACR;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,UAAuC;AACrE,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,iCAAiC,SAAS,QAAQ,IAAI,kBAAkB,CAAC;AAC3F,UAAM,QAAQ,WAAW,OAAO;AAChC,QAAI,UAAU,UAAa,MAAM,WAAW,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,QACE;AAAA,QACA,mBAAmB,WAAW,OAAO;AAAA,QACrC,WAAW,WAAW,OAAO;AAAA,MAC/B;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,IAAM,uCAAN,cAAmD,MAAM;AAAA,EACvD,cAAc;AACZ,UAAM,wDAAwD;AAAA,EAChE;AACF;AAqBO,IAAM,WAAN,cAAuB,MAAM;AAAA,EACzB;AAAA,EAGT,YAAY,MAAc,SAAiB,MAAgB;AACzD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,QAAI,SAAS,QAAW;AACtB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;AAoCO,SAAS,wBAAwB,SAAiC;AACvE,SAAO,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA;AACnC;AAEA,SAAS,cAAc,MAAsB;AAC3C,SAAO,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AACnD;AAEA,gBAAuB,UAAU,QAA0C;AACzE,MAAI,SAAS;AACb,QAAM,UAAU,IAAI,YAAY;AAEhC,mBAAiB,SAAS,QAAkC;AAC1D,cACE,iBAAiB,aACb,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,IACtC,QAAQ,OAAO,IAAI,OAAO,KAAK;AAErC,WAAO,MAAM;AACX,YAAM,eAAe,OAAO,QAAQ,IAAI;AACxC,UAAI,iBAAiB,IAAI;AACvB;AAAA,MACF;AAEA,YAAM,OAAO,OAAO,MAAM,GAAG,YAAY;AACzC,eAAS,OAAO,MAAM,eAAe,CAAC;AACtC,YAAM,cAAc,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,YAAU,QAAQ,OAAO;AAEzB,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,cAAc,MAAM;AAAA,EAC5B;AACF;AAOO,IAAM,YAAN,MAAgB;AAAA,EACb,SAAS;AAAA,EACT;AAAA,EACA,YAAsB,CAAC;AAAA,EACvB,UAAU;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EAER,IAAI,cAAkC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,KAAK,OAAmC;AACtC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,SAAK,UAAU;AACf,UAAM,WAA+B,CAAC;AAEtC,WAAO,MAAM;AACX,YAAM,eAAe,KAAK,OAAO,QAAQ,IAAI;AAC7C,UAAI,iBAAiB,IAAI;AACvB;AAAA,MACF;AAEA,YAAM,OAAO,cAAc,KAAK,OAAO,MAAM,GAAG,YAAY,CAAC;AAC7D,WAAK,SAAS,KAAK,OAAO,MAAM,eAAe,CAAC;AAChD,WAAK,YAAY,MAAM,QAAQ;AAAA,IACjC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAA4B;AAC1B,UAAM,WAA+B,CAAC;AAEtC,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,WAAK,YAAY,cAAc,KAAK,MAAM,GAAG,QAAQ;AACrD,WAAK,SAAS;AAAA,IAChB;AAEA,SAAK,UAAU,QAAQ;AACvB,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,MAAc,UAAoC;AACpE,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,UAAU,QAAQ;AACvB;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,QAAQ,GAAG;AACvC,UAAM,QAAQ,mBAAmB,KAAK,OAAO,KAAK,MAAM,GAAG,cAAc;AACzE,UAAM,WAAW,mBAAmB,KAAK,KAAK,KAAK,MAAM,iBAAiB,CAAC;AAC3E,UAAM,QAAQ,SAAS,WAAW,GAAG,IAAI,SAAS,MAAM,CAAC,IAAI;AAE7D,QAAI,UAAU,SAAS;AACrB,WAAK,YAAY;AACjB;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ;AACpB,WAAK,UAAU,KAAK,KAAK;AACzB;AAAA,IACF;AAEA,QAAI,UAAU,MAAM;AAClB,UAAI,MAAM,SAAS,IAAI,GAAG;AACxB;AAAA,MACF;AAEA,WAAK,UAAU;AACf,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,UAAU,UAAoC;AACpD,UAAM,YAAY,KAAK,aAAa;AAEpC,QAAI,KAAK,YAAY;AACnB,WAAK,eAAe,KAAK;AAAA,IAC3B;AAEA,QAAI,KAAK,UAAU,WAAW,KAAK,cAAc,WAAW;AAC1D,WAAK,WAAW;AAChB;AAAA,IACF;AAEA,UAAM,UAA4B;AAAA,MAChC,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,IAChC;AAEA,QAAI,KAAK,YAAY;AACnB,cAAQ,KAAK,KAAK;AAAA,IACpB;AAEA,aAAS,KAAK,OAAO;AACrB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,aAAmB;AACzB,SAAK,YAAY;AACjB,SAAK,YAAY,CAAC;AAClB,SAAK,UAAU;AACf,SAAK,aAAa;AAAA,EACpB;AACF;AAqCO,IAAM,sBAAN,MAA0B;AAAA,EACtB;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACT,gBAAgB;AAAA,EAChB;AAAA,EACS,kBAAkB,oBAAI,IAA+B;AAAA,EACrD,yBAAyB,oBAAI,IAAsC;AAAA,EACnE,kBAAkB,oBAAI,IAAmC;AAAA,EACzD,uBAAuB,oBAAI,IAAwC;AAAA,EAEpF,YACE,OACA,QACA,mBAAmB,KACnB,mBACA;AACA,QAAI,CAAC,OAAO,SAAS,gBAAgB,KAAK,mBAAmB,GAAG;AAC9D,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,oBAAoB;AACzB,SAAK,mBAAmB;AACxB,SAAK,aAAa,EAAE,MAAM,MAAM,MAAS;AAAA,EAC3C;AAAA,EAEA,iBAAiB,QAAgB,QAAwB;AACvD,QAAI,KAAK,kBAAkB,QAAW;AACpC,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,UAA+B;AAAA,MACnC,SAAS;AAAA,MACT;AAAA,IACF;AAEA,QAAI,WAAW,QAAW;AACxB,cAAQ,SAAS;AAAA,IACnB;AAEA,SAAK,OAAO,MAAM,wBAAwB,OAAO,CAAC;AAAA,EACpD;AAAA,EAEA,UAAU,QAAgB,SAAsC;AAC9D,SAAK,gBAAgB,IAAI,QAAQ,OAAO;AAAA,EAC1C;AAAA,EAEA,eAAe,QAAgB,SAA2C;AACxE,SAAK,qBAAqB,IAAI,QAAQ,OAAO;AAAA,EAC/C;AAAA,EAEA,YACE,QACA,QACA,UAAiC,CAAC,GAChB;AAClB,QAAI,KAAK,kBAAkB,QAAW;AACpC,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,KAAK,KAAK;AAChB,SAAK,iBAAiB;AACtB,UAAM,YAAY,QAAQ,aAAa,KAAK;AAE5C,QAAI,CAAC,OAAO,SAAS,SAAS,KAAK,YAAY,GAAG;AAChD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,QAAI,QAAQ,gBAAgB,QAAW;AACrC,cAAQ,YAAY,EAAE;AAAA,IACxB;AAEA,UAAM,UAA0B;AAAA,MAC9B,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAEA,QAAI,WAAW,QAAW;AACxB,cAAQ,SAAS;AAAA,IACnB;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,WAAW,MAAM;AAC/B,aAAK,gBAAgB,OAAO,EAAE;AAC9B,gBAAQ,YAAY,EAAE;AACtB,eAAO,IAAI,MAAM,qBAAqB,MAAM,qBAAqB,SAAS,IAAI,CAAC;AAAA,MACjF,GAAG,SAAS;AAEZ,WAAK,gBAAgB,IAAI,IAAI,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAEzD,UAAI;AACF,aAAK,OAAO,MAAM,wBAAwB,OAAO,CAAC;AAAA,MACpD,SAAS,OAAO;AACd,qBAAa,OAAO;AACpB,aAAK,gBAAgB,OAAO,EAAE;AAC9B,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,WAAsB,QAA0B;AAC5D,UAAM,UAAU,KAAK,gBAAgB,IAAI,SAAS;AAClD,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AAEA,SAAK,gBAAgB,OAAO,SAAS;AACrC,iBAAa,QAAQ,OAAO;AAC5B,YAAQ,OAAO,MAAM;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,SAAS,IAAI,MAAM,iCAAiC,GAAS;AACnE,QAAI,KAAK,kBAAkB,QAAW;AACpC;AAAA,IACF;AAEA,SAAK,gBAAgB;AAErB,eAAW,WAAW,KAAK,gBAAgB,OAAO,GAAG;AACnD,mBAAa,QAAQ,OAAO;AAC5B,cAAQ,OAAO,MAAM;AAAA,IACvB;AAEA,SAAK,gBAAgB,MAAM;AAC3B,SAAK,uBAAuB,MAAM;AAAA,EACpC;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI;AACF,uBAAiB,QAAQ,UAAU,KAAK,KAAK,GAAG;AAC9C,YAAI,KAAK,kBAAkB,QAAW;AACpC;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB;AAAA,QACF;AAEA,YAAI;AACJ,YAAI;AACF,uBAAa,KAAK,MAAM,IAAI;AAAA,QAC9B,QAAQ;AACN,gBAAM,KAAK,qBAAqB;AAAA,YAC9B,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,OAAO,WAAW;AAAA,UACpB,CAAC;AACD;AAAA,QACF;AAEA,YAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,qBAAW,WAAW,YAAY;AAChC,gBAAI,KAAK,kBAAkB,QAAW;AACpC;AAAA,YACF;AAEA,kBAAM,KAAK,qBAAqB,oBAAoB,OAAO,CAAC;AAAA,UAC9D;AACA;AAAA,QACF;AAEA,cAAM,KAAK,qBAAqB,oBAAoB,UAAU,CAAC;AAAA,MACjE;AAAA,IACF,SAAS,OAAO;AACd,UAAI,KAAK,kBAAkB,QAAW;AACpC,aAAK;AAAA,UACH,iBAAiB,QACb,QACA,IAAI,MAAM,iCAAiC,OAAO,KAAK,CAAC,EAAE;AAAA,QAChE;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,KAAK,kBAAkB,QAAW;AACpC,YAAM,qBAAqB,MAAM,KAAK,+BAA+B;AACrE,UAAI,KAAK,kBAAkB,QAAW;AACpC,aAAK,QAAQ,kBAAkB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iCAAiD;AAC7D,UAAM,oBAAoB,IAAI,MAAM,8BAA8B;AAClE,QAAI,KAAK,sBAAsB,QAAW;AACxC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,MAAM,QAAQ,KAAK;AAAA,QACxB,KAAK;AAAA,QACL,IAAI,QAAe,CAAC,YAAY;AAC9B,qBAAW,MAAM;AACf,oBAAQ,iBAAiB;AAAA,UAC3B,GAAG,EAAE;AAAA,QACP,CAAC;AAAA,MACH,CAAC;AAAA,IACH,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,QAA6C;AAC9E,QAAI,OAAO,SAAS,WAAW;AAC7B,YAAM,UAAU,KAAK,gBAAgB,IAAI,OAAO,QAAQ,MAAM;AAC9D,UAAI,YAAY,QAAW;AACzB,aAAK,OAAO;AAAA,UACV,wBAAwB;AAAA,YACtB,SAAS;AAAA,YACT,IAAI,OAAO,QAAQ;AAAA,YACnB,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS,qBAAqB,OAAO,QAAQ,MAAM;AAAA,YACrD;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,WAAK,sBAAsB,OAAO,SAAS,OAAO;AAClD;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,gBAAgB;AAClC,UAAI,OAAO,QAAQ,WAAW,2BAA2B;AACvD,aAAK,+BAA+B,OAAO,QAAQ,MAAM;AAAA,MAC3D;AAEA,YAAM,UAAU,KAAK,qBAAqB,IAAI,OAAO,QAAQ,MAAM;AACnE,UAAI,YAAY,QAAW;AACzB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,UACnC,QAAQ,OAAO,QAAQ;AAAA,QACzB,CAAC;AAAA,MACH,QAAQ;AACN;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,WAAW;AAC7B,YAAM,gBAIF;AAAA,QACF,SAAS;AAAA,QACT,IAAI,OAAO;AAAA,QACX,OAAO;AAAA,UACL,MAAM,OAAO,MAAM;AAAA,UACnB,SAAS,OAAO,MAAM;AAAA,QACxB;AAAA,MACF;AAEA,UAAI,OAAO,MAAM,SAAS,QAAW;AACnC,sBAAc,MAAM,OAAO,OAAO,MAAM;AAAA,MAC1C;AAEA,WAAK,OAAO,MAAM,GAAG,KAAK,UAAU,aAAa,CAAC;AAAA,CAAI;AACtD;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,YAAY;AAC9B;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,gBAAgB,IAAI,OAAO,QAAQ,EAAE;AAC1D,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AAEA,SAAK,gBAAgB,OAAO,OAAO,QAAQ,EAAE;AAC7C,iBAAa,QAAQ,OAAO;AAC5B,QAAI,YAAY,OAAO,SAAS;AAC9B,cAAQ,QAAQ,OAAO,QAAQ,MAAM;AACrC;AAAA,IACF;AAEA,YAAQ;AAAA,MACN,IAAI;AAAA,QACF,OAAO,QAAQ,MAAM;AAAA,QACrB,OAAO,QAAQ,MAAM;AAAA,QACrB,OAAO,QAAQ,MAAM;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,SAAyB,SAAsC;AAC3F,UAAM,gBAAuC;AAAA,MAC3C,WAAW;AAAA,IACb;AACA,SAAK,uBAAuB,IAAI,QAAQ,IAAI,aAAa;AAEzD,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ;AAAA,UAC3C,IAAI,QAAQ;AAAA,UACZ,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAED,YAAI,KAAK,kBAAkB,UAAa,cAAc,WAAW;AAC/D;AAAA,QACF;AAEA,aAAK,OAAO;AAAA,UACV,wBAAwB;AAAA,YACtB,SAAS;AAAA,YACT,IAAI,QAAQ;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,YAAI,KAAK,kBAAkB,UAAa,cAAc,WAAW;AAC/D;AAAA,QACF;AAEA,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAK,OAAO;AAAA,UACV,wBAAwB;AAAA,YACtB,SAAS;AAAA,YACT,IAAI,QAAQ;AAAA,YACZ,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,UAAE;AACA,cAAM,kBAAkB,KAAK,uBAAuB,IAAI,QAAQ,EAAE;AAClE,YAAI,oBAAoB,eAAe;AACrC,eAAK,uBAAuB,OAAO,QAAQ,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,+BAA+B,QAAuB;AAC5D,QAAI,CAACC,gBAAe,MAAM,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,YAAY,OAAO;AACzB,QAAI,CAAC,YAAY,SAAS,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,uBAAuB,IAAI,SAAS;AAC/D,QAAI,kBAAkB,QAAW;AAC/B;AAAA,IACF;AAEA,kBAAc,YAAY;AAC1B,SAAK,uBAAuB,OAAO,SAAS;AAAA,EAC9C;AACF;AAEA,SAASA,gBAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,mBAAmB,OAA2C;AACrE,MAAI,CAACA,gBAAe,KAAK,KAAK,OAAO,MAAM,oBAAoB,UAAU;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,qBAAqB,MAAM,YAAY,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,MACE,CAACA,gBAAe,MAAM,UAAU,KAC7B,OAAO,MAAM,WAAW,SAAS,YACjC,MAAM,WAAW,KAAK,WAAW,KACjC,OAAO,MAAM,WAAW,YAAY,YACpC,MAAM,WAAW,QAAQ,WAAW,GACvC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,iBAAiB,UAAa,OAAO,MAAM,iBAAiB;AAC3E;AAEA,SAAS,qBAAqB,OAA6C;AACzE,MAAI,CAACA,gBAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,aAAW,cAAc,CAAC,WAAW,aAAa,SAAS,WAAW,eAAe,cAAc,GAAY;AAC7G,QAAI,MAAM,UAAU,MAAM,UAAa,CAACA,gBAAe,MAAM,UAAU,CAAC,GAAG;AACzE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAyC;AACjE,MAAI,CAACA,gBAAe,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,sBAAsB,UAAa,CAACA,gBAAe,MAAM,iBAAiB,GAAG;AACrF,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,YAAY,UAAa,OAAO,MAAM,YAAY,WAAW;AACrE,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ,MAAM,aAAa;AAC1C;AAEA,SAAS,kBAAkB,OAAiE;AAC1F,SAAOA,gBAAe,KAAK,KACtB,MAAM,QAAQ,MAAM,KAAK,MACxB,MAAM,eAAe,UAAa,OAAO,MAAM,eAAe;AACtE;AAEA,SAAS,sBAAsB,OAAyE;AACtG,SAAOA,gBAAe,KAAK,KACtB,MAAM,QAAQ,MAAM,SAAS,KAC7B,MAAM,UAAU,MAAM,UAAU,MAC/B,MAAM,eAAe,UAAa,OAAO,MAAM,eAAe;AACtE;AAEA,SAAS,8BACP,OACyE;AACzE,SAAOA,gBAAe,KAAK,KACtB,MAAM,QAAQ,MAAM,iBAAiB,KACrC,MAAM,kBAAkB,MAAM,kBAAkB,MAC/C,MAAM,eAAe,UAAa,OAAO,MAAM,eAAe;AACtE;AAEA,SAAS,qBAAqB,OAA2D;AACvF,SAAOA,gBAAe,KAAK,KACtB,MAAM,QAAQ,MAAM,QAAQ,KAC5B,MAAM,SAAS,MAAM,kBAAkB;AAC9C;AAEA,SAAS,kBAAkB,OAA0C;AACnE,SAAOA,gBAAe,KAAK,MACrB,MAAM,gBAAgB,UAAa,OAAO,MAAM,gBAAgB,aACjE,MAAM,QAAQ,MAAM,QAAQ,KAC5B,MAAM,SAAS,MAAM,eAAe;AAC3C;AAEA,SAAS,iBAAiB,OAAyC;AACjE,SAAOA,gBAAe,KAAK,KACtBA,gBAAe,MAAM,UAAU,KAC/B,MAAM,QAAQ,MAAM,WAAW,MAAM,KACrC,MAAM,WAAW,OAAO,MAAM,CAAC,cAAc,OAAO,cAAc,QAAQ,MACzE,MAAM,WAAW,YAAY,UAAa,OAAO,MAAM,WAAW,YAAY,eAC9E,MAAM,WAAW,UAAU,UAAa,OAAO,MAAM,WAAW,UAAU;AAClF;AAEA,SAAS,WAAW,OAAmC;AACrD,SAAOA,gBAAe,KAAK,KACtB,OAAO,MAAM,QAAQ,YACrB,OAAO,MAAM,SAAS,aACrB,MAAM,gBAAgB,UAAa,OAAO,MAAM,gBAAgB,cAChE,MAAM,aAAa,UAAa,OAAO,MAAM,aAAa,cAC1D,MAAM,SAAS,UAAa,OAAO,MAAM,SAAS;AAC1D;AAEA,SAAS,mBAAmB,OAA2C;AACrE,SAAOA,gBAAe,KAAK,KACtB,OAAO,MAAM,gBAAgB,YAC7B,OAAO,MAAM,SAAS,aACrB,MAAM,gBAAgB,UAAa,OAAO,MAAM,gBAAgB,cAChE,MAAM,aAAa,UAAa,OAAO,MAAM,aAAa;AAClE;AAEA,SAAS,mBAAmB,OAA2C;AACrE,MAAI,CAACA,gBAAe,KAAK,KAAK,OAAO,MAAM,QAAQ,UAAU;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,aAAa,UAAa,OAAO,MAAM,aAAa,UAAU;AACtE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,UAAU,MAAM,SAAS;AAE/B,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,WAAO;AAAA,EACT;AAEA,UAAQ,CAAC,WAAW,OAAO,MAAM,SAAS,cACpC,CAAC,WAAW,OAAO,MAAM,SAAS;AAC1C;AAEA,SAAS,gBAAgB,OAAwC;AAC/D,SAAOA,gBAAe,KAAK,MACrB,MAAM,SAAS,UAAU,MAAM,SAAS,gBACzC,cAAc,MAAM,OAAO;AAClC;AAEA,SAAS,cAAc,OAAsC;AAC3D,MAAI,CAACA,gBAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,OAAO,MAAM,SAAS;AAAA,EAC/B;AAEA,MAAI,MAAM,SAAS,WAAW,MAAM,SAAS,SAAS;AACpD,WAAO,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,aAAa;AAAA,EACrE;AAEA,MAAI,MAAM,SAAS,cAAc,CAACA,gBAAe,MAAM,QAAQ,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,SAAO,mBAAmB,MAAM,QAAQ;AAC1C;AAEA,SAAS,OACP,OACA,UACgC;AAChC,SAAO,OAAO,UAAU,eAAe,KAAK,OAAO,QAAQ;AAC7D;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU;AACvD;AAEA,SAAS,WAAW,OAAmC;AACrD,SACE,UAAU,WACV,UAAU,UACV,UAAU,YACV,UAAU,aACV,UAAU,WACV,UAAU,cACV,UAAU,WACV,UAAU;AAEd;AAEA,SAAS,YAAY,OAAkC;AACrD,SAAO,YAAY,KAAK,IAAI,QAAQ;AACtC;AAEA,SAAS,aAAuB;AAC9B,SAAO,IAAI,SAAS,aAAa,aAAa;AAChD;AAEA,SAAS,iBAA2B;AAClC,SAAO,IAAI,SAAS,uBAAuB,iBAAiB;AAC9D;AAEA,SAAS,qBAAqB,OAA6C;AACzE,MAAI,CAACA,gBAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,YAAY,UAAU;AACvE,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,SAAS,UAAa,OAAO,OAAO,MAAM;AACzD;AAEO,SAAS,oBAAoB,MAAoC;AACtE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,oBAAoB,MAAM;AACnC;AAEA,SAAS,oBAAoB,QAAuC;AAClE,MAAI,CAACA,gBAAe,MAAM,GAAG;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,KAAK,YAAY,OAAO,EAAE;AAEhC,MAAI,OAAO,YAAY,OAAO;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,QAAQ,QAAQ;AACzC,QAAM,QAAQ,OAAO,QAAQ,IAAI;AAEjC,MAAI,WAAW;AACb,QAAI,OAAO,OAAO,WAAW,UAAU;AACrC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,OAAO,eAAe;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,OAAO;AACT,UAAI,CAAC,YAAY,OAAO,EAAE,GAAG;AAC3B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,OAAO,eAAe;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,UAA0B;AAAA,QAC9B,SAAS;AAAA,QACT,IAAI,OAAO;AAAA,QACX,QAAQ,OAAO;AAAA,MACjB;AAEA,UAAI,OAAO,QAAQ,QAAQ,GAAG;AAC5B,gBAAQ,SAAS,OAAO;AAAA,MAC1B;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,eAAoC;AAAA,MACxC,SAAS;AAAA,MACT,QAAQ,OAAO;AAAA,IACjB;AAEA,QAAI,OAAO,QAAQ,QAAQ,GAAG;AAC5B,mBAAa,SAAS,OAAO;AAAA,IAC/B;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,CAAC,YAAY,OAAO,EAAE,GAAG;AACrC,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,QAAQ,QAAQ;AACzC,QAAM,WAAW,OAAO,QAAQ,OAAO;AAEvC,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI,OAAO;AAAA,MACX,OAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,WAAW;AACb,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,QACP,SAAS;AAAA,QACT,IAAI,OAAO;AAAA,QACX,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,qBAAqB,OAAO,KAAK,GAAG;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI,OAAO;AAAA,MACX,OAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP,SAAS;AAAA,MACT,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;;;Ac51HA,SAAS,SAAAC,cAAqE;AAC9E,OAAOC,WAAU;AA6BV,SAAS,eAAe,QAAgB,WAAqC;AAClF,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAM,UAAU,oBAAoB,QAAQ;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,aAAW,UAAU,OAAO,OAAO,QAAQ,OAAO,GAAG;AACnD,QAAI,aAAa,QAAQ;AACvB,aAAO,MAAMC,MAAK,QAAQ,WAAW,OAAO,OAAO,GAAG;AACtD,UAAI,OAAO,QAAQ,SAAS,GAAG,KAAK,OAAO,QAAQ,SAAS,IAAI,GAAG;AACjE,eAAO,UAAUA,MAAK,QAAQ,WAAW,OAAO,OAAO;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBACd,OACA,OAAiB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACkB;AAClB,QAAM,UAAU,WAAW,OAAO,eAAe,IAAI;AACrD,QAAM,UAAU,WAAW,QAAQ,SAAS,aAAa;AACzD,QAAM,aAAa,uBAAO,OAAO,IAAI;AACrC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,QAAI,KAAK,WAAW,KAAK,KAAK,KAAK,MAAM;AACvC,YAAM,IAAI,UAAU,oEAAoE;AAC1F,UAAM,SAAS,WAAW,OAAO,cAAc,IAAI,EAAE;AACrD,QAAI,OAAO,OAAO,QAAQ,SAAS,GAAG;AACpC,iBAAW,QAAQ,cAAc,IAAI,IAAI,CAAC,WAAW,QAAQ,OAAO,KAAK,CAAC;AAC1E,YAAM,UAAU,SAAS,OAAO,SAAS,aAAa;AACtD,UACE,OAAO,SAAS,WACf,CAAC,MAAM,QAAQ,OAAO,IAAI,KACzB,OAAO,KAAK,KAAK,CAAC,aAAa,OAAO,aAAa,QAAQ;AAE7D,cAAM,IAAI,UAAU,uCAAuC;AAC7D,iBAAW,IAAI,IAAI;AAAA,QACjB;AAAA,QACA,GAAI,OAAO,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAI,OAAO,IAAiB,EAAE;AAAA,QAC5E,GAAI,OAAO,QAAQ,SAAY,CAAC,IAAI,EAAE,KAAK,SAAS,OAAO,KAAK,SAAS,EAAE;AAAA,QAC3E,KAAK,YAAY,OAAO,OAAO,CAAC,GAAG,iBAAiB;AAAA,MACtD;AAAA,IACF,OAAO;AACL,iBAAW,QAAQ,cAAc,IAAI,IAAI,CAAC,OAAO,SAAS,CAAC;AAC3D,YAAM,MAAM,IAAI,IAAI,SAAS,OAAO,KAAK,SAAS,CAAC;AACnD,UAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI,YAAY,IAAI;AACrF,cAAM,IAAI,UAAU,mEAAmE;AACzF,YAAM,UAAU,YAAY,OAAO,WAAW,CAAC,GAAG,aAAa;AAC/D,UAAI,QAAQ,OAAO;AACnB,iBAAW,IAAI,IAAI,EAAE,KAAK,IAAI,MAAM,QAAQ;AAAA,IAC9C;AAAA,EACF;AACA,aAAW,QAAQ,CAAC,SAAS,OAAO;AAClC,QAAI,QAAQ,IAAI,MAAM,UAAa,OAAO,QAAQ,IAAI,MAAM;AAC1D,YAAM,IAAI,UAAU,OAAO,IAAI,sBAAsB;AACzD,MAAI,QAAQ,WAAW,UAAa,EAAE,QAAQ,kBAAkB;AAC9D,UAAM,IAAI,UAAU,oCAAoC;AAC1D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,kBAAkB,YAAY,QAAQ,kBAAkB,GAAM;AAAA,IAC9D,gBAAgB,YAAY,QAAQ,gBAAgB,GAAK;AAAA,IACzD,cAAc,YAAY,QAAQ,cAAc,GAAG;AAAA,IACnD,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAsB;AAAA,IAChF,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAmC;AAAA,IAC3F,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAmC;AAAA,EAC7F;AACF;AAEA,SAAS,WAAW,OAAgB,OAAe,MAA0C;AAC3F,MACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAQ,KAAK,KACnB,CAAC,CAAC,OAAO,WAAW,IAAI,EAAE,SAAS,OAAO,eAAe,KAAK,CAAC;AAE/D,UAAM,IAAI,UAAU,GAAG,KAAK,0BAA0B;AACxD,QAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,aAAW,CAACC,MAAK,UAAU,KAAK,OAAO,QAAQ,OAAO,0BAA0B,KAAK,CAAC,GAAG;AACvF,QAAI,EAAE,WAAW,eAAgB,SAAS,UAAa,CAAC,KAAK,SAASA,IAAG;AACvE,YAAM,IAAI,UAAU,GAAG,KAAK,+BAA+BA,IAAG,GAAG;AACnE,WAAOA,IAAG,IAAI,WAAW;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAgB,OAAuB;AACvD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,KAAK,MAAM,SAAS,IAAI;AAC/E,UAAM,IAAI,UAAU,GAAG,KAAK,qDAAqD;AACnF,SAAO;AACT;AAEA,SAAS,YAAY,OAAgB,OAAuC;AAC1E,QAAM,UAAU,WAAW,OAAO,KAAK;AACvC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO;AAChD,QAAI,OAAO,UAAU,YAAY,KAAK,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI;AACzE,YAAM,IAAI,UAAU,GAAG,KAAK,+CAA+C;AAC/E,SAAO;AACT;AAEA,SAAS,YAAY,OAAgB,UAA0B;AAC7D,MAAI,UAAU,OAAW,QAAO;AAChC,MACE,OAAO,UAAU,YACjB,CAAC,OAAO,cAAc,KAAK,KAC3B,SAAS,KACT,QAAQ;AAER,UAAM,IAAI,UAAU,gDAAgD;AACtE,SAAO;AACT;AAEO,SAAS,oBACd,QACA,SACA,QACsB;AACtB,UAAQ,eAAe;AACvB,UAAQ,QAAQ,eAAe;AAC/B,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,YAAY,EAAE,MAAM,UAAU,SAAS,IAAI;AAAA,IAC3C,kBAAkB,QAAQ;AAAA,EAC5B,CAAC;AACD,MAAI;AACJ,QAAM,iBAAiB,oBAAI,IAAqB;AAChD,QAAM,YACJ,aAAa,SACT,IAAI,eAAe;AAAA,IACjB,GAAG;AAAA,IACH,MAAM,SAAS,MAAM,cAAc;AACjC,cACE,QAAQ,UAAU,SACbC,OAAM,SAAS,MAAM,YAAY,IAClC,QAAQ,MAAM,SAAS,MAAM,YAAY;AAC/C,aAAO;AAAA,IACT;AAAA,EACF,CAAC,IACD,IAAI,cAAc;AAAA,IAChB,GAAG;AAAA,IACH,MAAM,MAAM,OAAO,MAAM;AACvB,YAAM,aAAa,IAAI,gBAAgB;AACvC,qBAAe,IAAI,UAAU;AAC7B,YAAMC,UAAS,MAAM,WAAW,MAAM,MAAM,QAAQ,MAAM;AAC1D,YAAM,QAAQ,iBAAiB,SAASA,SAAQ,EAAE,MAAM,KAAK,CAAC;AAC9D,UAAI,MAAM,QAAQ,QAAS,CAAAA,QAAO;AAClC,YAAM,UAAU;AAAA,QACd,MAAM,WAAW,MAAM,IAAI,MAAM,6BAA6B,CAAC;AAAA,QAC/D,MAAM,WAAW,WAAW,QAAQ,iBAAiB,QAAQ;AAAA,MAC/D;AACA,YAAM,SAAS,MAAM;AACnB,qBAAa,OAAO;AACpB,uBAAe,OAAO,UAAU;AAChC,cAAM,QAAQ,oBAAoB,SAASA,OAAM;AAAA,MACnD;AACA,UAAI;AACF,cAAM,WAAW,OAAO,QAAQ,SAAS,OAAO,OAAO;AAAA,UACrD,GAAG;AAAA,UACH,QAAQ,WAAW;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AACD,YAAI,SAAS,SAAS,MAAM;AAC1B,iBAAO;AACP,iBAAO;AAAA,QACT;AACA,cAAM,SAAS,SAAS,KAAK,UAAU;AACvC,YAAI;AACJ,cAAM,UAAU,MAAM;AACpB,iBAAO;AACP,cAAI,gBAAgB;AAClB,uBAAW,OAAO,oBAAoB,SAAS,WAAW;AAAA,QAC9D;AACA,cAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,MAAM,QAAQ;AACZ,0BAAc,MAAM;AAClB,mBAAK,OAAO,OAAO,WAAW,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAClE,qBAAO,MAAM,WAAW,OAAO,MAAM;AACrC,sBAAQ;AAAA,YACV;AACA,uBAAW,OAAO,iBAAiB,SAAS,aAAa,EAAE,MAAM,KAAK,CAAC;AACvE,gBAAI,WAAW,OAAO,QAAS,aAAY;AAAA,UAC7C;AAAA,UACA,MAAM,KAAK,QAAQ;AACjB,gBAAI;AACF,oBAAM,SAAS,MAAM,OAAO,KAAK;AACjC,kBAAI,WAAW,OAAO,QAAS;AAC/B,kBAAI,OAAO,MAAM;AACf,wBAAQ;AACR,uBAAO,MAAM;AAAA,cACf,MAAO,QAAO,QAAQ,OAAO,KAAK;AAAA,YACpC,SAAS,OAAO;AACd,sBAAQ;AACR,qBAAO,MAAM,KAAK;AAAA,YACpB;AAAA,UACF;AAAA,UACA,MAAM,OAAO,QAAQ;AACnB,oBAAQ;AACR,kBAAM,OAAO,OAAO,MAAM;AAAA,UAC5B;AAAA,QACF,CAAC;AACD,eAAO,IAAI,SAAS,MAAM;AAAA,UACxB,QAAQ,SAAS;AAAA,UACjB,YAAY,SAAS;AAAA,UACrB,SAAS,SAAS;AAAA,QACpB,CAAC;AAAA,MACH,SAAS,OAAO;AACd,eAAO;AACP,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AACP,MAAI;AACJ,QAAM,SAAS,MAAM;AACnB,SAAK,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EACpC;AACA,WAAS,QAAuB;AAC9B,iBAAa,YAAY;AACvB,cAAQ,oBAAoB,SAAS,MAAM;AAC3C,cAAQ,QAAQ,oBAAoB,SAAS,MAAM;AACnD,iBAAW,WAAW,eAAgB,SAAQ,MAAM,IAAI,MAAM,wBAAwB,CAAC;AACvF,YAAM,OAAO,MAAM;AACnB,gBAAU,QAAQ;AAClB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAI;AACJ,cAAM,UAAU,WAAW,MAAM;AAC/B,cAAI,UAAU,UAAa,MAAM,aAAa,QAAQ,MAAM,eAAe;AACzE,kBAAM,KAAK,SAAS;AACtB,mBAAS;AAAA,YACP,MAAM,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,YACtD,QAAQ;AAAA,UACV;AAAA,QACF,GAAG,QAAQ,cAAc;AACzB,aAAK,UAAU,OAAO;AAAA,UACpB,MAAM;AACJ,yBAAa,OAAO;AACpB,yBAAa,MAAM;AACnB,oBAAQ;AAAA,UACV;AAAA,UACA,CAAC,UAAU;AACT,yBAAa,OAAO;AACpB,yBAAa,MAAM;AACnB,mBAAO,KAAK;AAAA,UACd;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,GAAG;AACH,WAAO;AAAA,EACT;AACA,UAAQ,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACxD,UAAQ,QAAQ,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AAChE,QAAM,UAAU,QAAQ,WAAW,QAAQ,QAAQ;AACnD,MAAI,QAAS,QAAO;AACpB,QAAM,aAAa,UACf,QAAQ,OAAO,QAAQ,UAAU,OAAO,SAAS,QAAQ,QAAQ,MAAM,IACvE,OAAO,QAAQ,SAAS;AAC5B,QAAM,QAAQ,WAAW;AAAA,IACvB,MAAM;AAAA,IACN,OAAO,UAAU;AACf,YAAM,MAAM,EAAE,MAAM,MAAM,MAAS;AACnC,YAAM,QAAQ,UACV,OAAO,SACP,QAAQ,QAAQ,UACd,QAAQ,OAAO,SACf;AAAA,IACR;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM;AACxB;",
|
|
6
6
|
"names": ["spawn", "path", "key", "getOwnEntry", "key", "key", "getOwnEntry", "key", "path", "URL", "crypto", "isObjectRecord", "getOwnEntry", "key", "crypto", "MAX_JS_DATE_MS", "getOwnEntry", "key", "MAX_JS_DATE_MS", "fetch", "getOwnString", "getOwnEntry", "isObjectRecord", "key", "URL", "hostname", "isObjectRecord", "normalizeHostname", "hostname", "isLoopbackHostname", "assertSecureUrl", "resolvedResourceMetadataUrl", "fetch", "isObjectRecord", "spawn", "isObjectRecord", "spawn", "path", "path", "key", "spawn", "cancel"]
|
|
7
7
|
}
|