@bastani/atomic 0.9.25-alpha.3 → 0.9.25-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/CHANGELOG.md +30 -0
  4. package/dist/builtin/mcp/OAUTH.md +59 -269
  5. package/dist/builtin/mcp/README.md +58 -345
  6. package/dist/builtin/mcp/index.bundle.mjs +4 -28073
  7. package/dist/builtin/mcp/native-client-licenses/LICENSES/modelcontextprotocol-typescript-sdk.txt +21 -0
  8. package/dist/builtin/mcp/native-client-licenses/NOTICE +30 -0
  9. package/dist/builtin/mcp/package.json +4 -25
  10. package/dist/builtin/subagents/package.json +1 -1
  11. package/dist/builtin/web-access/package.json +1 -1
  12. package/dist/builtin/workflows/CHANGELOG.md +6 -0
  13. package/dist/builtin/workflows/package.json +1 -1
  14. package/dist/builtin/workflows/src/extension/index.bundle.mjs +18 -3
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +2 -1
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  19. package/dist/core/agent-session-extension-bindings.js +87 -5
  20. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  21. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  22. package/dist/core/agent-session-tool-registry.js +6 -3
  23. package/dist/core/agent-session-tool-registry.js.map +1 -1
  24. package/dist/core/extensions/context-types.d.ts +3 -1
  25. package/dist/core/extensions/context-types.d.ts.map +1 -1
  26. package/dist/core/extensions/context-types.js.map +1 -1
  27. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  28. package/dist/core/extensions/loader-api.js +4 -0
  29. package/dist/core/extensions/loader-api.js.map +1 -1
  30. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  31. package/dist/core/extensions/loader-virtual-modules.js +3 -0
  32. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  33. package/dist/core/mcp-child-policy.d.ts +11 -0
  34. package/dist/core/mcp-child-policy.d.ts.map +1 -0
  35. package/dist/core/mcp-child-policy.js +31 -0
  36. package/dist/core/mcp-child-policy.js.map +1 -0
  37. package/dist/core/mcp-servers.d.ts +32 -26
  38. package/dist/core/mcp-servers.d.ts.map +1 -1
  39. package/dist/core/mcp-servers.js +148 -1
  40. package/dist/core/mcp-servers.js.map +1 -1
  41. package/dist/core/package-manager-manifest.js.map +1 -1
  42. package/dist/core/package-manager-mcp-servers.js +1 -1
  43. package/dist/core/package-manager-mcp-servers.js.map +1 -1
  44. package/dist/core/sdk.js +10 -1
  45. package/dist/core/sdk.js.map +1 -1
  46. package/dist/core/tools/truncate.d.ts +8 -0
  47. package/dist/core/tools/truncate.d.ts.map +1 -1
  48. package/dist/core/tools/truncate.js +24 -0
  49. package/dist/core/tools/truncate.js.map +1 -1
  50. package/dist/extensions/mcp/cli.d.ts +21 -0
  51. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  52. package/dist/extensions/mcp/cli.js +500 -0
  53. package/dist/extensions/mcp/cli.js.map +1 -0
  54. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  55. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  56. package/dist/extensions/mcp/cli.lazy.js +3 -0
  57. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  58. package/dist/extensions/mcp/client/auth-provider.d.ts +15 -0
  59. package/dist/extensions/mcp/client/auth-provider.d.ts.map +1 -0
  60. package/dist/extensions/mcp/client/auth-provider.js +2 -0
  61. package/dist/extensions/mcp/client/auth-provider.js.map +1 -0
  62. package/dist/extensions/mcp/client/client.d.ts +89 -0
  63. package/dist/extensions/mcp/client/client.d.ts.map +1 -0
  64. package/dist/extensions/mcp/client/client.js +457 -0
  65. package/dist/extensions/mcp/client/client.js.map +1 -0
  66. package/dist/extensions/mcp/client/index.d.ts +9 -0
  67. package/dist/extensions/mcp/client/index.d.ts.map +1 -0
  68. package/dist/extensions/mcp/client/index.js +7 -0
  69. package/dist/extensions/mcp/client/index.js.map +1 -0
  70. package/dist/extensions/mcp/client/oauth/callback.d.ts +42 -0
  71. package/dist/extensions/mcp/client/oauth/callback.d.ts.map +1 -0
  72. package/dist/extensions/mcp/client/oauth/callback.js +106 -0
  73. package/dist/extensions/mcp/client/oauth/callback.js.map +1 -0
  74. package/dist/extensions/mcp/client/oauth/discovery.d.ts +27 -0
  75. package/dist/extensions/mcp/client/oauth/discovery.d.ts.map +1 -0
  76. package/dist/extensions/mcp/client/oauth/discovery.js +153 -0
  77. package/dist/extensions/mcp/client/oauth/discovery.js.map +1 -0
  78. package/dist/extensions/mcp/client/oauth/errors.d.ts +24 -0
  79. package/dist/extensions/mcp/client/oauth/errors.d.ts.map +1 -0
  80. package/dist/extensions/mcp/client/oauth/errors.js +46 -0
  81. package/dist/extensions/mcp/client/oauth/errors.js.map +1 -0
  82. package/dist/extensions/mcp/client/oauth/flow.d.ts +82 -0
  83. package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -0
  84. package/dist/extensions/mcp/client/oauth/flow.js +292 -0
  85. package/dist/extensions/mcp/client/oauth/flow.js.map +1 -0
  86. package/dist/extensions/mcp/client/oauth/index.d.ts +7 -0
  87. package/dist/extensions/mcp/client/oauth/index.d.ts.map +1 -0
  88. package/dist/extensions/mcp/client/oauth/index.js +6 -0
  89. package/dist/extensions/mcp/client/oauth/index.js.map +1 -0
  90. package/dist/extensions/mcp/client/oauth/provider.d.ts +59 -0
  91. package/dist/extensions/mcp/client/oauth/provider.d.ts.map +1 -0
  92. package/dist/extensions/mcp/client/oauth/provider.js +116 -0
  93. package/dist/extensions/mcp/client/oauth/provider.js.map +1 -0
  94. package/dist/extensions/mcp/client/oauth/types.d.ts +77 -0
  95. package/dist/extensions/mcp/client/oauth/types.d.ts.map +1 -0
  96. package/dist/extensions/mcp/client/oauth/types.js +109 -0
  97. package/dist/extensions/mcp/client/oauth/types.js.map +1 -0
  98. package/dist/extensions/mcp/client/protocol/content.d.ts +82 -0
  99. package/dist/extensions/mcp/client/protocol/content.d.ts.map +1 -0
  100. package/dist/extensions/mcp/client/protocol/content.js +41 -0
  101. package/dist/extensions/mcp/client/protocol/content.js.map +1 -0
  102. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts +59 -0
  103. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts.map +1 -0
  104. package/dist/extensions/mcp/client/protocol/jsonrpc.js +67 -0
  105. package/dist/extensions/mcp/client/protocol/jsonrpc.js.map +1 -0
  106. package/dist/extensions/mcp/client/protocol/types.d.ts +123 -0
  107. package/dist/extensions/mcp/client/protocol/types.d.ts.map +1 -0
  108. package/dist/extensions/mcp/client/protocol/types.js +7 -0
  109. package/dist/extensions/mcp/client/protocol/types.js.map +1 -0
  110. package/dist/extensions/mcp/client/testing/index.d.ts +2 -0
  111. package/dist/extensions/mcp/client/testing/index.d.ts.map +1 -0
  112. package/dist/extensions/mcp/client/testing/index.js +2 -0
  113. package/dist/extensions/mcp/client/testing/index.js.map +1 -0
  114. package/dist/extensions/mcp/client/transports/in-memory.d.ts +19 -0
  115. package/dist/extensions/mcp/client/transports/in-memory.d.ts.map +1 -0
  116. package/dist/extensions/mcp/client/transports/in-memory.js +50 -0
  117. package/dist/extensions/mcp/client/transports/in-memory.js.map +1 -0
  118. package/dist/extensions/mcp/client/transports/stdio.d.ts +32 -0
  119. package/dist/extensions/mcp/client/transports/stdio.d.ts.map +1 -0
  120. package/dist/extensions/mcp/client/transports/stdio.js +201 -0
  121. package/dist/extensions/mcp/client/transports/stdio.js.map +1 -0
  122. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +96 -0
  123. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -0
  124. package/dist/extensions/mcp/client/transports/streamable-http.js +456 -0
  125. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -0
  126. package/dist/extensions/mcp/client/transports/transport.d.ts +28 -0
  127. package/dist/extensions/mcp/client/transports/transport.d.ts.map +1 -0
  128. package/dist/extensions/mcp/client/transports/transport.js +38 -0
  129. package/dist/extensions/mcp/client/transports/transport.js.map +1 -0
  130. package/dist/extensions/mcp/config.d.ts +72 -0
  131. package/dist/extensions/mcp/config.d.ts.map +1 -0
  132. package/dist/extensions/mcp/config.js +158 -0
  133. package/dist/extensions/mcp/config.js.map +1 -0
  134. package/dist/extensions/mcp/index.d.ts +76 -0
  135. package/dist/extensions/mcp/index.d.ts.map +1 -0
  136. package/dist/extensions/mcp/index.js +1119 -0
  137. package/dist/extensions/mcp/index.js.map +1 -0
  138. package/dist/extensions/mcp/log.d.ts +16 -0
  139. package/dist/extensions/mcp/log.d.ts.map +1 -0
  140. package/dist/extensions/mcp/log.js +66 -0
  141. package/dist/extensions/mcp/log.js.map +1 -0
  142. package/dist/extensions/mcp/oauth.d.ts +103 -0
  143. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  144. package/dist/extensions/mcp/oauth.js +382 -0
  145. package/dist/extensions/mcp/oauth.js.map +1 -0
  146. package/dist/extensions/mcp/resources.d.ts +43 -0
  147. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  148. package/dist/extensions/mcp/resources.js +262 -0
  149. package/dist/extensions/mcp/resources.js.map +1 -0
  150. package/dist/extensions/mcp/runtime.d.ts +104 -0
  151. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  152. package/dist/extensions/mcp/runtime.js +546 -0
  153. package/dist/extensions/mcp/runtime.js.map +1 -0
  154. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  155. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  156. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  157. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  158. package/dist/extensions/mcp/tools.d.ts +84 -0
  159. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  160. package/dist/extensions/mcp/tools.js +251 -0
  161. package/dist/extensions/mcp/tools.js.map +1 -0
  162. package/dist/extensions/mcp/ui.d.ts +60 -0
  163. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  164. package/dist/extensions/mcp/ui.js +175 -0
  165. package/dist/extensions/mcp/ui.js.map +1 -0
  166. package/dist/index.d.ts +5 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +5 -0
  169. package/dist/index.js.map +1 -1
  170. package/dist/main.d.ts.map +1 -1
  171. package/dist/main.js +7 -0
  172. package/dist/main.js.map +1 -1
  173. package/dist/modes/interactive/interactive-slash-commands.js +23 -8
  174. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  175. package/docs/extensions/api-reference.md +3 -3
  176. package/docs/extensions.md +8 -8
  177. package/docs/mcp-servers.md +153 -79
  178. package/docs/packages/authoring.md +2 -2
  179. package/docs/sdk.md +1 -1
  180. package/docs/sessions.md +1 -1
  181. package/npm-shrinkwrap.json +32 -32
  182. package/package.json +3 -3
  183. package/dist/builtin/mcp/app-bridge.bundle.js +0 -67
  184. package/dist/builtin/mcp/xdg-open +0 -1267
@@ -0,0 +1,89 @@
1
+ import type { CallToolResult } from "./protocol/content.js";
2
+ import { type ClientCapabilities, type Implementation, type InitializeResult, type ListResourcesResult, type ListResourceTemplatesResult, type ProgressNotification, type ReadResourceResult, type Resource, type ResourceTemplate, type Root, type ServerCapabilities, type SupportedProtocolVersion, type Tool } from "./protocol/types.js";
3
+ import type { McpTransport } from "./transports/transport.js";
4
+ type ClientState = "idle" | "connecting" | "connected" | "closed";
5
+ type NotificationListener = (params: unknown) => void;
6
+ type ErrorListener = (error: Error) => void;
7
+ type CloseListener = () => void;
8
+ type RequestHandler = (params: unknown, context: {
9
+ signal: AbortSignal;
10
+ }) => unknown | Promise<unknown>;
11
+ export interface McpClientOptions extends Implementation {
12
+ capabilities?: ClientCapabilities;
13
+ protocolVersion?: SupportedProtocolVersion;
14
+ requestTimeoutMs?: number;
15
+ roots?: readonly Root[] | (() => readonly Root[] | Promise<readonly Root[]>);
16
+ }
17
+ export interface McpRequestOptions {
18
+ signal?: AbortSignal;
19
+ timeoutMs?: number;
20
+ onProgress?: (progress: ProgressNotification) => void;
21
+ }
22
+ export declare class McpClient {
23
+ readonly options: Readonly<McpClientOptions>;
24
+ private state;
25
+ private transport;
26
+ private nextRequestId;
27
+ private serverInfoValue;
28
+ private serverCapabilitiesValue;
29
+ private instructionsValue;
30
+ private protocolVersionValue;
31
+ private pending;
32
+ private progressRequests;
33
+ private incoming;
34
+ private requestHandlers;
35
+ private notificationListeners;
36
+ private errorListeners;
37
+ private closeListeners;
38
+ private disposers;
39
+ constructor(options: McpClientOptions);
40
+ get connectionState(): ClientState;
41
+ get serverInfo(): Implementation | undefined;
42
+ get serverCapabilities(): ServerCapabilities | undefined;
43
+ get instructions(): string | undefined;
44
+ get protocolVersion(): string | undefined;
45
+ connect(transport: McpTransport): Promise<InitializeResult>;
46
+ request<Result = unknown>(method: string, params?: Record<string, unknown>, options?: McpRequestOptions): Promise<Result>;
47
+ notify(method: string, params?: Record<string, unknown>): Promise<void>;
48
+ setRequestHandler(method: string, handler: RequestHandler): () => void;
49
+ onNotification(method: string, listener: NotificationListener): () => void;
50
+ onError(listener: ErrorListener): () => void;
51
+ /** Called once when the connection closes, whether the transport dropped or `close()` was called. */
52
+ onClose(listener: CloseListener): () => void;
53
+ ping(options?: McpRequestOptions): Promise<void>;
54
+ listTools(options?: McpRequestOptions): Promise<Tool[]>;
55
+ /** Every resource, following `nextCursor` through all pages. */
56
+ listResources(options?: McpRequestOptions): Promise<Resource[]>;
57
+ /** One page of resources, starting at `cursor`. */
58
+ listResourcesPage(cursor?: string, options?: McpRequestOptions): Promise<ListResourcesResult>;
59
+ /** Every resource template, following `nextCursor` through all pages. */
60
+ listResourceTemplates(options?: McpRequestOptions): Promise<ResourceTemplate[]>;
61
+ /** One page of resource templates, starting at `cursor`. */
62
+ listResourceTemplatesPage(cursor?: string, options?: McpRequestOptions): Promise<ListResourceTemplatesResult>;
63
+ readResource(uri: string, options?: McpRequestOptions): Promise<ReadResourceResult>;
64
+ private listPage;
65
+ /** Every item of a paginated list method. */
66
+ private listAll;
67
+ callTool(name: string, args?: Record<string, unknown>, options?: McpRequestOptions): Promise<CallToolResult>;
68
+ close(): Promise<void>;
69
+ private requestInternal;
70
+ private notifyInternal;
71
+ private requireTransport;
72
+ private handleMessage;
73
+ private handleResponse;
74
+ private handleRequest;
75
+ private handleNotification;
76
+ private handleProgress;
77
+ private handleCancelled;
78
+ private armTimeout;
79
+ private cancelPending;
80
+ private removePending;
81
+ private rejectPending;
82
+ private handleTransportClose;
83
+ /** Idempotent: rejects in-flight requests, aborts server requests we are serving, and flips the state. */
84
+ private markClosed;
85
+ private emitError;
86
+ private disposeTransportListeners;
87
+ }
88
+ export {};
89
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/extensions/mcp/client/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,457 @@
1
+ import { isJsonRpcId, isJsonRpcNotification, isJsonRpcRequest, isJsonRpcResponse, isObject, JSON_RPC_ERROR_CODES, McpAbortError, McpConnectionClosedError, McpError, McpTimeoutError, toError, } from "./protocol/jsonrpc.js";
2
+ import { LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, } from "./protocol/types.js";
3
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
4
+ const MAX_LIST_PAGES = 1_000;
5
+ function validateInitializeResult(value) {
6
+ if (!isObject(value) ||
7
+ typeof value.protocolVersion !== "string" ||
8
+ !isObject(value.capabilities) ||
9
+ !isObject(value.serverInfo) ||
10
+ typeof value.serverInfo.name !== "string" ||
11
+ typeof value.serverInfo.version !== "string" ||
12
+ (value.instructions !== undefined && typeof value.instructions !== "string")) {
13
+ throw new McpError(JSON_RPC_ERROR_CODES.invalidRequest, "Invalid MCP initialize result");
14
+ }
15
+ return value;
16
+ }
17
+ function invalid(message) {
18
+ return new McpError(JSON_RPC_ERROR_CODES.invalidRequest, message);
19
+ }
20
+ /** One page of a paginated list: the items under `key`, each checked by `isItem`. */
21
+ function validateListPage(method, key, value, isItem) {
22
+ const items = isObject(value) ? value[key] : undefined;
23
+ if (!isObject(value) || !Array.isArray(items))
24
+ throw invalid(`Invalid MCP ${method} result`);
25
+ for (const item of items) {
26
+ if (!isObject(item) || !isItem(item))
27
+ throw invalid(`Invalid entry in MCP ${method} result`);
28
+ }
29
+ // Some servers end pagination with `null` or `""` instead of omitting the cursor.
30
+ const nextCursor = value.nextCursor === null || value.nextCursor === "" ? undefined : value.nextCursor;
31
+ if (nextCursor !== undefined && typeof nextCursor !== "string")
32
+ throw invalid(`Invalid MCP ${method} cursor`);
33
+ return { items, ...(nextCursor === undefined ? {} : { nextCursor }) };
34
+ }
35
+ const isTool = (tool) => typeof tool.name === "string" && isObject(tool.inputSchema);
36
+ // `name` is required by the spec, but some servers omit it; the URI stands in.
37
+ const isResource = (resource) => typeof resource.uri === "string" && (resource.name === undefined || typeof resource.name === "string");
38
+ const isResourceTemplate = (template) => typeof template.uriTemplate === "string" && (template.name === undefined || typeof template.name === "string");
39
+ function toResource(item) {
40
+ return { ...item, name: item.name ?? item.uri };
41
+ }
42
+ function toResourceTemplate(item) {
43
+ return { ...item, name: item.name ?? item.uriTemplate };
44
+ }
45
+ function pageCursor(page) {
46
+ return page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor };
47
+ }
48
+ function validateReadResourceResult(value) {
49
+ if (!isObject(value) || !Array.isArray(value.contents))
50
+ throw invalid("Invalid MCP resources/read result");
51
+ for (const contents of value.contents) {
52
+ if (!isObject(contents) ||
53
+ typeof contents.uri !== "string" ||
54
+ (typeof contents.text !== "string" && typeof contents.blob !== "string")) {
55
+ throw invalid("Invalid contents in MCP resources/read result");
56
+ }
57
+ }
58
+ return value;
59
+ }
60
+ /** `content` is required by the spec, but servers that only return `structuredContent` omit it (the SDK defaults it too). */
61
+ function validateCallToolResult(value) {
62
+ if (!isObject(value) || (value.content !== undefined && !Array.isArray(value.content))) {
63
+ throw new McpError(JSON_RPC_ERROR_CODES.invalidRequest, "Invalid MCP tools/call result");
64
+ }
65
+ if (value.structuredContent !== undefined && !isObject(value.structuredContent)) {
66
+ throw new McpError(JSON_RPC_ERROR_CODES.invalidRequest, "Invalid MCP tools/call structured content");
67
+ }
68
+ return (value.content === undefined ? { ...value, content: [] } : value);
69
+ }
70
+ export class McpClient {
71
+ options;
72
+ state = "idle";
73
+ transport;
74
+ nextRequestId = 1;
75
+ serverInfoValue;
76
+ serverCapabilitiesValue;
77
+ instructionsValue;
78
+ protocolVersionValue;
79
+ pending = new Map();
80
+ progressRequests = new Map();
81
+ incoming = new Map();
82
+ requestHandlers = new Map();
83
+ notificationListeners = new Map();
84
+ errorListeners = new Set();
85
+ closeListeners = new Set();
86
+ disposers = [];
87
+ constructor(options) {
88
+ this.options = Object.freeze({ ...options });
89
+ this.requestHandlers.set("ping", () => ({}));
90
+ const roots = options.roots;
91
+ if (roots) {
92
+ this.requestHandlers.set("roots/list", async () => ({
93
+ roots: [...(typeof roots === "function" ? await roots() : roots)],
94
+ }));
95
+ }
96
+ }
97
+ get connectionState() {
98
+ return this.state;
99
+ }
100
+ get serverInfo() {
101
+ return this.serverInfoValue;
102
+ }
103
+ get serverCapabilities() {
104
+ return this.serverCapabilitiesValue;
105
+ }
106
+ get instructions() {
107
+ return this.instructionsValue;
108
+ }
109
+ get protocolVersion() {
110
+ return this.protocolVersionValue;
111
+ }
112
+ async connect(transport) {
113
+ if (this.state !== "idle")
114
+ throw new Error(`Cannot connect MCP client in ${this.state} state`);
115
+ this.state = "connecting";
116
+ this.transport = transport;
117
+ this.disposers = [
118
+ transport.onMessage((message) => this.handleMessage(message)),
119
+ // Transport errors are reported only. Pending requests fail when the transport closes.
120
+ transport.onError((error) => this.emitError(error)),
121
+ transport.onClose(() => this.handleTransportClose()),
122
+ ];
123
+ try {
124
+ await transport.start();
125
+ const capabilities = { ...this.options.capabilities };
126
+ if (this.options.roots && capabilities.roots === undefined)
127
+ capabilities.roots = {};
128
+ const result = validateInitializeResult(await this.requestInternal("initialize", {
129
+ protocolVersion: this.options.protocolVersion ?? LATEST_PROTOCOL_VERSION,
130
+ capabilities,
131
+ clientInfo: {
132
+ name: this.options.name,
133
+ version: this.options.version,
134
+ ...(this.options.title === undefined ? {} : { title: this.options.title }),
135
+ },
136
+ }, {}, true));
137
+ if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {
138
+ throw new Error(`MCP server selected unsupported protocol version ${result.protocolVersion}`);
139
+ }
140
+ this.protocolVersionValue = result.protocolVersion;
141
+ this.serverInfoValue = result.serverInfo;
142
+ this.serverCapabilitiesValue = result.capabilities;
143
+ this.instructionsValue = result.instructions;
144
+ transport.setProtocolVersion?.(result.protocolVersion);
145
+ await this.notifyInternal("notifications/initialized", undefined, true);
146
+ this.state = "connected";
147
+ return result;
148
+ }
149
+ catch (error) {
150
+ await this.close().catch(() => { });
151
+ throw error;
152
+ }
153
+ }
154
+ request(method, params, options = {}) {
155
+ return this.requestInternal(method, params, options, false);
156
+ }
157
+ notify(method, params) {
158
+ return this.notifyInternal(method, params, false);
159
+ }
160
+ setRequestHandler(method, handler) {
161
+ this.requestHandlers.set(method, handler);
162
+ return () => {
163
+ if (this.requestHandlers.get(method) === handler)
164
+ this.requestHandlers.delete(method);
165
+ };
166
+ }
167
+ onNotification(method, listener) {
168
+ const listeners = this.notificationListeners.get(method) ?? new Set();
169
+ this.notificationListeners.set(method, listeners);
170
+ listeners.add(listener);
171
+ return () => {
172
+ listeners.delete(listener);
173
+ if (listeners.size === 0)
174
+ this.notificationListeners.delete(method);
175
+ };
176
+ }
177
+ onError(listener) {
178
+ this.errorListeners.add(listener);
179
+ return () => this.errorListeners.delete(listener);
180
+ }
181
+ /** Called once when the connection closes, whether the transport dropped or `close()` was called. */
182
+ onClose(listener) {
183
+ this.closeListeners.add(listener);
184
+ return () => this.closeListeners.delete(listener);
185
+ }
186
+ async ping(options = {}) {
187
+ await this.request("ping", undefined, options);
188
+ }
189
+ async listTools(options = {}) {
190
+ return (await this.listAll("tools/list", "tools", isTool, options));
191
+ }
192
+ /** Every resource, following `nextCursor` through all pages. */
193
+ async listResources(options = {}) {
194
+ return (await this.listAll("resources/list", "resources", isResource, options)).map(toResource);
195
+ }
196
+ /** One page of resources, starting at `cursor`. */
197
+ async listResourcesPage(cursor, options = {}) {
198
+ const page = await this.listPage("resources/list", "resources", isResource, cursor, options);
199
+ return { resources: page.items.map(toResource), ...pageCursor(page) };
200
+ }
201
+ /** Every resource template, following `nextCursor` through all pages. */
202
+ async listResourceTemplates(options = {}) {
203
+ const templates = await this.listAll("resources/templates/list", "resourceTemplates", isResourceTemplate, options);
204
+ return templates.map(toResourceTemplate);
205
+ }
206
+ /** One page of resource templates, starting at `cursor`. */
207
+ async listResourceTemplatesPage(cursor, options = {}) {
208
+ const page = await this.listPage("resources/templates/list", "resourceTemplates", isResourceTemplate, cursor, options);
209
+ return { resourceTemplates: page.items.map(toResourceTemplate), ...pageCursor(page) };
210
+ }
211
+ async readResource(uri, options = {}) {
212
+ return validateReadResourceResult(await this.request("resources/read", { uri }, options));
213
+ }
214
+ async listPage(method, key, isItem, cursor, options) {
215
+ return validateListPage(method, key, await this.request(method, cursor === undefined ? undefined : { cursor }, options), isItem);
216
+ }
217
+ /** Every item of a paginated list method. */
218
+ async listAll(method, key, isItem, options) {
219
+ const items = [];
220
+ const cursors = new Set();
221
+ let cursor;
222
+ for (let pageNumber = 0; pageNumber < MAX_LIST_PAGES; pageNumber++) {
223
+ const page = await this.listPage(method, key, isItem, cursor, options);
224
+ items.push(...page.items);
225
+ if (page.nextCursor === undefined)
226
+ return items;
227
+ if (cursors.has(page.nextCursor))
228
+ throw new Error(`MCP ${method} returned duplicate cursor: ${page.nextCursor}`);
229
+ cursors.add(page.nextCursor);
230
+ cursor = page.nextCursor;
231
+ }
232
+ throw new Error(`MCP ${method} exceeded ${MAX_LIST_PAGES} pages`);
233
+ }
234
+ async callTool(name, args, options = {}) {
235
+ return validateCallToolResult(await this.request("tools/call", { name, ...(args === undefined ? {} : { arguments: args }) }, options));
236
+ }
237
+ async close() {
238
+ const transport = this.transport;
239
+ this.transport = undefined;
240
+ this.disposeTransportListeners();
241
+ this.markClosed(new McpConnectionClosedError());
242
+ await transport?.close();
243
+ }
244
+ async requestInternal(method, params, options, allowConnecting) {
245
+ const transport = this.requireTransport(allowConnecting);
246
+ if (options.signal?.aborted)
247
+ throw new McpAbortError();
248
+ const id = this.nextRequestId++;
249
+ const progressToken = options.onProgress ? id : undefined;
250
+ const requestParams = progressToken === undefined
251
+ ? params
252
+ : { ...params, _meta: { ...(isObject(params?._meta) ? params._meta : {}), progressToken } };
253
+ const message = {
254
+ jsonrpc: "2.0",
255
+ id,
256
+ method,
257
+ ...(requestParams === undefined ? {} : { params: requestParams }),
258
+ };
259
+ return new Promise((resolve, reject) => {
260
+ const entry = {
261
+ resolve,
262
+ reject,
263
+ timeoutMs: options.timeoutMs ?? this.options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
264
+ timer: undefined,
265
+ signal: options.signal,
266
+ // The spec forbids cancelling `initialize`.
267
+ onAbort: () => this.cancelPending(id, new McpAbortError(), method !== "initialize", String(options.signal?.reason ?? "Aborted")),
268
+ cancellable: method !== "initialize",
269
+ onProgress: options.onProgress,
270
+ progressToken,
271
+ };
272
+ this.pending.set(id, entry);
273
+ if (progressToken !== undefined)
274
+ this.progressRequests.set(progressToken, id);
275
+ options.signal?.addEventListener("abort", entry.onAbort, { once: true });
276
+ this.armTimeout(id, entry);
277
+ transport.send(message).catch((error) => this.cancelPending(id, error, false));
278
+ });
279
+ }
280
+ async notifyInternal(method, params, allowConnecting) {
281
+ await this.requireTransport(allowConnecting).send({
282
+ jsonrpc: "2.0",
283
+ method,
284
+ ...(params === undefined ? {} : { params }),
285
+ });
286
+ }
287
+ requireTransport(allowConnecting) {
288
+ if (this.transport && (this.state === "connected" || (allowConnecting && this.state === "connecting"))) {
289
+ return this.transport;
290
+ }
291
+ throw new McpConnectionClosedError(`MCP client is ${this.state}`);
292
+ }
293
+ handleMessage(message) {
294
+ if (isJsonRpcResponse(message)) {
295
+ this.handleResponse(message);
296
+ return;
297
+ }
298
+ if (isJsonRpcRequest(message)) {
299
+ void this.handleRequest(message);
300
+ return;
301
+ }
302
+ if (isJsonRpcNotification(message)) {
303
+ this.handleNotification(message.method, message.params);
304
+ return;
305
+ }
306
+ this.emitError(new McpError(JSON_RPC_ERROR_CODES.invalidRequest, "Received invalid JSON-RPC message"));
307
+ }
308
+ handleResponse(message) {
309
+ const entry = this.pending.get(message.id);
310
+ if (!entry) {
311
+ this.emitError(new Error(`Received response for unknown MCP request ${String(message.id)}`));
312
+ return;
313
+ }
314
+ this.removePending(message.id, entry);
315
+ if ("error" in message)
316
+ entry.reject(new McpError(message.error.code, message.error.message, message.error.data));
317
+ else
318
+ entry.resolve(message.result);
319
+ }
320
+ async handleRequest(message) {
321
+ const transport = this.transport;
322
+ if (!transport)
323
+ return;
324
+ const handler = this.requestHandlers.get(message.method);
325
+ if (!handler) {
326
+ await transport
327
+ .send({
328
+ jsonrpc: "2.0",
329
+ id: message.id,
330
+ error: { code: JSON_RPC_ERROR_CODES.methodNotFound, message: `Method not found: ${message.method}` },
331
+ })
332
+ .catch((error) => this.emitError(error));
333
+ return;
334
+ }
335
+ const controller = new AbortController();
336
+ this.incoming.set(message.id, controller);
337
+ try {
338
+ const result = await handler(message.params, { signal: controller.signal });
339
+ await transport.send({ jsonrpc: "2.0", id: message.id, result: result ?? {} });
340
+ }
341
+ catch (error) {
342
+ const responseError = error instanceof McpError
343
+ ? { code: error.code, message: error.message, data: error.data }
344
+ : { code: JSON_RPC_ERROR_CODES.internalError, message: toError(error).message };
345
+ await transport
346
+ .send({ jsonrpc: "2.0", id: message.id, error: responseError })
347
+ .catch((sendError) => this.emitError(sendError));
348
+ }
349
+ finally {
350
+ this.incoming.delete(message.id);
351
+ }
352
+ }
353
+ handleNotification(method, params) {
354
+ if (method === "notifications/progress")
355
+ this.handleProgress(params);
356
+ else if (method === "notifications/cancelled")
357
+ this.handleCancelled(params);
358
+ for (const listener of this.notificationListeners.get(method) ?? []) {
359
+ try {
360
+ listener(params);
361
+ }
362
+ catch (error) {
363
+ this.emitError(error);
364
+ }
365
+ }
366
+ }
367
+ handleProgress(params) {
368
+ if (!isObject(params) || !isJsonRpcId(params.progressToken) || typeof params.progress !== "number")
369
+ return;
370
+ const requestId = this.progressRequests.get(params.progressToken);
371
+ const entry = requestId === undefined ? undefined : this.pending.get(requestId);
372
+ if (requestId === undefined || !entry)
373
+ return;
374
+ this.armTimeout(requestId, entry);
375
+ try {
376
+ entry.onProgress?.(params);
377
+ }
378
+ catch (error) {
379
+ this.emitError(error);
380
+ }
381
+ }
382
+ handleCancelled(params) {
383
+ if (isObject(params) && isJsonRpcId(params.requestId))
384
+ this.incoming.get(params.requestId)?.abort(params.reason);
385
+ }
386
+ armTimeout(id, entry) {
387
+ if (entry.timer)
388
+ clearTimeout(entry.timer);
389
+ if (!Number.isFinite(entry.timeoutMs) || entry.timeoutMs <= 0)
390
+ return;
391
+ entry.timer = setTimeout(() => {
392
+ this.cancelPending(id, new McpTimeoutError(entry.timeoutMs), entry.cancellable, "Request timed out");
393
+ }, entry.timeoutMs);
394
+ }
395
+ cancelPending(id, error, notifyServer, reason) {
396
+ const entry = this.pending.get(id);
397
+ if (!entry)
398
+ return;
399
+ this.removePending(id, entry);
400
+ entry.reject(error);
401
+ if (notifyServer && this.transport) {
402
+ void this.transport
403
+ .send({
404
+ jsonrpc: "2.0",
405
+ method: "notifications/cancelled",
406
+ params: { requestId: id, ...(reason ? { reason } : {}) },
407
+ })
408
+ .catch((sendError) => this.emitError(sendError));
409
+ }
410
+ }
411
+ removePending(id, entry) {
412
+ this.pending.delete(id);
413
+ if (entry.timer)
414
+ clearTimeout(entry.timer);
415
+ if (entry.progressToken !== undefined)
416
+ this.progressRequests.delete(entry.progressToken);
417
+ entry.signal?.removeEventListener("abort", entry.onAbort);
418
+ }
419
+ rejectPending(error) {
420
+ for (const [id, entry] of this.pending) {
421
+ this.removePending(id, entry);
422
+ entry.reject(error);
423
+ }
424
+ }
425
+ handleTransportClose() {
426
+ this.markClosed(new McpConnectionClosedError());
427
+ }
428
+ /** Idempotent: rejects in-flight requests, aborts server requests we are serving, and flips the state. */
429
+ markClosed(error) {
430
+ const wasClosed = this.state === "closed";
431
+ this.state = "closed";
432
+ this.rejectPending(error);
433
+ for (const controller of this.incoming.values())
434
+ controller.abort(error);
435
+ this.incoming.clear();
436
+ if (wasClosed)
437
+ return;
438
+ for (const listener of [...this.closeListeners]) {
439
+ try {
440
+ listener();
441
+ }
442
+ catch (listenerError) {
443
+ this.emitError(listenerError);
444
+ }
445
+ }
446
+ }
447
+ emitError(error) {
448
+ const normalized = toError(error);
449
+ for (const listener of this.errorListeners)
450
+ listener(normalized);
451
+ }
452
+ disposeTransportListeners() {
453
+ for (const dispose of this.disposers.splice(0))
454
+ dispose();
455
+ }
456
+ }
457
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/extensions/mcp/client/client.ts"],"names":[],"mappings":"AACA,OAAO,EACN,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,oBAAoB,EAKpB,aAAa,EACb,wBAAwB,EACxB,QAAQ,EACR,eAAe,EACf,OAAO,GACP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAIN,uBAAuB,EASvB,2BAA2B,GAG3B,MAAM,qBAAqB,CAAC;AAG7B,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,cAAc,GAAG,KAAK,CAAC;AAiC7B,SAAS,wBAAwB,CAAC,KAAc;IAC/C,IACC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;QACzC,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;QAC7B,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAC3B,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;QACzC,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,KAAK,QAAQ;QAC5C,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,EAC3E,CAAC;QACF,MAAM,IAAI,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAoC,CAAC;AAC7C,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC/B,OAAO,IAAI,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,qFAAqF;AACrF,SAAS,gBAAgB,CACxB,MAAc,EACd,GAAW,EACX,KAAc,EACd,MAAkD;IAElD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,eAAe,MAAM,SAAS,CAAC,CAAC;IAC7F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,MAAM,OAAO,CAAC,wBAAwB,MAAM,SAAS,CAAC,CAAC;IAC9F,CAAC;IACD,kFAAkF;IAClF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IACvG,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,MAAM,OAAO,CAAC,eAAe,MAAM,SAAS,CAAC,CAAC;IAC9G,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAA6B,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC9G,+EAA+E;AAC/E,MAAM,UAAU,GAAG,CAAC,QAAiC,EAAE,EAAE,CACxD,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACxG,MAAM,kBAAkB,GAAG,CAAC,QAAiC,EAAE,EAAE,CAChE,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAEhH,SAAS,UAAU,CAAC,IAA6B;IAChD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAc,CAAC;AAC7D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA6B;IACxD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAsB,CAAC;AAC7E,CAAC;AAED,SAAS,UAAU,CAAC,IAA6B;IAChD,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAC;IAC3G,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvC,IACC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnB,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ;YAChC,CAAC,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,EACvE,CAAC;YACF,MAAM,OAAO,CAAC,+CAA+C,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;IACD,OAAO,KAAsC,CAAC;AAC/C,CAAC;AAED,6HAA6H;AAC7H,SAAS,sBAAsB,CAAC,KAAc;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,2CAA2C,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAA8B,CAAC;AACvG,CAAC;AAED,MAAM,OAAO,SAAS;IACZ,OAAO,CAA6B;IACrC,KAAK,GAAgB,MAAM,CAAC;IAC5B,SAAS,CAA2B;IACpC,aAAa,GAAG,CAAC,CAAC;IAClB,eAAe,CAA6B;IAC5C,uBAAuB,CAAiC;IACxD,iBAAiB,CAAqB;IACtC,oBAAoB,CAAqB;IACzC,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC/C,gBAAgB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACnD,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACjD,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,qBAAqB,GAAG,IAAI,GAAG,EAAqC,CAAC;IACrE,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,SAAS,GAAmB,EAAE,CAAC;IAEvC,YAAY,OAAyB;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACnD,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACjE,CAAC,CAAC,CAAC;QACL,CAAC;IACF,CAAC;IAED,IAAI,eAAe;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,IAAI,kBAAkB;QACrB,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACrC,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAC/B,CAAC;IAED,IAAI,eAAe;QAClB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAuB;QACpC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG;YAChB,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC7D,uFAAuF;YACvF,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnD,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;SACpD,CAAC;QAEF,IAAI,CAAC;YACJ,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,YAAY,GAAuB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC;YACpF,MAAM,MAAM,GAAG,wBAAwB,CACtC,MAAM,IAAI,CAAC,eAAe,CACzB,YAAY,EACZ;gBACC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,uBAAuB;gBACxE,YAAY;gBACZ,UAAU,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;oBAC7B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;iBAC1E;aACD,EACD,EAAE,EACF,IAAI,CACJ,CACD,CAAC;YACF,IAAI,CAAE,2BAAiD,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1F,MAAM,IAAI,KAAK,CAAC,oDAAoD,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;YAC/F,CAAC;YACD,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,eAAe,CAAC;YACnD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;YACzC,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,YAAY,CAAC;YACnD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC;YAC7C,SAAS,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACvD,MAAM,IAAI,CAAC,cAAc,CAAC,2BAA2B,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACxE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,OAAO,MAAM,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,CACN,MAAc,EACd,MAAgC,EAChC,OAAO,GAAsB,EAAE;QAE/B,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAoB,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,MAAgC;QACtD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,OAAuB;QACxD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACX,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,OAAO;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvF,CAAC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,QAA8B;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAwB,CAAC;QAC5F,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACX,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrE,CAAC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,QAAuB;QAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,qGAAqG;IACrG,OAAO,CAAC,QAAuB;QAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAO,GAAsB,EAAE;QACzC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAO,GAAsB,EAAE;QAC9C,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAsB,CAAC;IAC1F,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,aAAa,CAAC,OAAO,GAAsB,EAAE;QAClD,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACjG,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,iBAAiB,CAAC,MAAe,EAAE,OAAO,GAAsB,EAAE;QACvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7F,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,qBAAqB,CAAC,OAAO,GAAsB,EAAE;QAC1D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CACnC,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,OAAO,CACP,CAAC;QACF,OAAO,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,yBAAyB,CAC9B,MAAe,EACf,OAAO,GAAsB,EAAE;QAE/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC/B,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,OAAO,CACP,CAAC;QACF,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,OAAO,GAAsB,EAAE;QAC9D,OAAO,0BAA0B,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3F,CAAC;IAEO,KAAK,CAAC,QAAQ,CACrB,MAAc,EACd,GAAW,EACX,MAAkD,EAClD,MAA0B,EAC1B,OAA0B;QAE1B,OAAO,gBAAgB,CACtB,MAAM,EACN,GAAG,EACH,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAClF,MAAM,CACN,CAAC;IACH,CAAC;IAED,6CAA6C;IACrC,KAAK,CAAC,OAAO,CACpB,MAAc,EACd,GAAW,EACX,MAAkD,EAClD,OAA0B;QAE1B,MAAM,KAAK,GAA8B,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,IAAI,MAA0B,CAAC;QAC/B,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,+BAA+B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,aAAa,cAAc,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,QAAQ,CACb,IAAY,EACZ,IAA8B,EAC9B,OAAO,GAAsB,EAAE;QAE/B,OAAO,sBAAsB,CAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CACvG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,eAAe,CAC5B,MAAc,EACd,MAA2C,EAC3C,OAA0B,EAC1B,eAAwB;QAExB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,aAAa,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,aAAa,GAClB,aAAa,KAAK,SAAS;YAC1B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAmB;YAC/B,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM;YACN,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;SACjE,CAAC;QACF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAmB;gBAC7B,OAAO;gBACP,MAAM;gBACN,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,0BAA0B;gBAC3F,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,4CAA4C;gBAC5C,OAAO,EAAE,GAAG,EAAE,CACb,IAAI,CAAC,aAAa,CACjB,EAAE,EACF,IAAI,aAAa,EAAE,EACnB,MAAM,KAAK,YAAY,EACvB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC,CAC3C;gBACF,WAAW,EAAE,MAAM,KAAK,YAAY;gBACpC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,aAAa;aACb,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,aAAa,KAAK,SAAS;gBAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAC3B,MAAc,EACd,MAA2C,EAC3C,eAAwB;QAExB,MAAM,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC;YACjD,OAAO,EAAE,KAAK;YACd,MAAM;YACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC3C,CAAC,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,eAAwB;QAChD,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC;YACxG,OAAO,IAAI,CAAC,SAAS,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,aAAa,CAAC,OAAuB;QAC5C,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO;QACR,CAAC;QACD,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO;QACR,CAAC;QACD,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO;QACR,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,mCAAmC,CAAC,CAAC,CAAC;IACxG,CAAC;IAEO,cAAc,CAAC,OAAwB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7F,OAAO;QACR,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO,IAAI,OAAO;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;;YAC7G,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAuB;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,SAAS;iBACb,IAAI,CAAC;gBACL,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,CAAC,cAAc,EAAE,OAAO,EAAE,qBAAqB,OAAO,CAAC,MAAM,EAAE,EAAE;aACpG,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,OAAO;QACR,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,aAAa,GAClB,KAAK,YAAY,QAAQ;gBACxB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;gBAChE,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAClF,MAAM,SAAS;iBACb,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;iBAC9D,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAEO,kBAAkB,CAAC,MAAc,EAAE,MAAe;QACzD,IAAI,MAAM,KAAK,wBAAwB;YAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;aAChE,IAAI,MAAM,KAAK,yBAAyB;YAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACrE,IAAI,CAAC;gBACJ,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;IACF,CAAC;IAEO,cAAc,CAAC,MAAe;QACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO;QAC3G,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK;YAAE,OAAO;QAC9C,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC;YACJ,KAAK,CAAC,UAAU,EAAE,CAAC,MAAyC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IAEO,eAAe,CAAC,MAAe;QACtC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClH,CAAC;IAEO,UAAU,CAAC,EAAa,EAAE,KAAqB;QACtD,IAAI,KAAK,CAAC,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC;YAAE,OAAO;QACtE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QACtG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAEO,aAAa,CAAC,EAAa,EAAE,KAAc,EAAE,YAAqB,EAAE,MAAe;QAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,SAAS;iBACjB,IAAI,CAAC;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,yBAAyB;gBACjC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;aACxD,CAAC;iBACD,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,EAAa,EAAE,KAAqB;QACzD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS;YAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACzF,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEO,aAAa,CAAC,KAAc;QACnC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACF,CAAC;IAEO,oBAAoB;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,0GAA0G;IAClG,UAAU,CAAC,KAAY;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,SAAS;YAAE,OAAO;QACtB,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC;gBACJ,QAAQ,EAAE,CAAC;YACZ,CAAC;YAAC,OAAO,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IAEO,SAAS,CAAC,KAAc;QAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc;YAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAEO,yBAAyB;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;IAC3D,CAAC;CACD","sourcesContent":["import type { CallToolResult } from \"./protocol/content.js\";\nimport {\n\tisJsonRpcId,\n\tisJsonRpcNotification,\n\tisJsonRpcRequest,\n\tisJsonRpcResponse,\n\tisObject,\n\tJSON_RPC_ERROR_CODES,\n\ttype JsonRpcId,\n\ttype JsonRpcMessage,\n\ttype JsonRpcRequest,\n\ttype JsonRpcResponse,\n\tMcpAbortError,\n\tMcpConnectionClosedError,\n\tMcpError,\n\tMcpTimeoutError,\n\ttoError,\n} from \"./protocol/jsonrpc.js\";\nimport {\n\ttype ClientCapabilities,\n\ttype Implementation,\n\ttype InitializeResult,\n\tLATEST_PROTOCOL_VERSION,\n\ttype ListResourcesResult,\n\ttype ListResourceTemplatesResult,\n\ttype ProgressNotification,\n\ttype ReadResourceResult,\n\ttype Resource,\n\ttype ResourceTemplate,\n\ttype Root,\n\ttype ServerCapabilities,\n\tSUPPORTED_PROTOCOL_VERSIONS,\n\ttype SupportedProtocolVersion,\n\ttype Tool,\n} from \"./protocol/types.js\";\nimport type { McpTransport } from \"./transports/transport.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nconst MAX_LIST_PAGES = 1_000;\n\ntype ClientState = \"idle\" | \"connecting\" | \"connected\" | \"closed\";\ntype NotificationListener = (params: unknown) => void;\ntype ErrorListener = (error: Error) => void;\ntype CloseListener = () => void;\ntype RequestHandler = (params: unknown, context: { signal: AbortSignal }) => unknown | Promise<unknown>;\n\nexport interface McpClientOptions extends Implementation {\n\tcapabilities?: ClientCapabilities;\n\tprotocolVersion?: SupportedProtocolVersion;\n\trequestTimeoutMs?: number;\n\troots?: readonly Root[] | (() => readonly Root[] | Promise<readonly Root[]>);\n}\n\nexport interface McpRequestOptions {\n\tsignal?: AbortSignal;\n\ttimeoutMs?: number;\n\tonProgress?: (progress: ProgressNotification) => void;\n}\n\ninterface PendingRequest {\n\tresolve: (value: unknown) => void;\n\treject: (reason: unknown) => void;\n\ttimeoutMs: number;\n\ttimer: ReturnType<typeof setTimeout> | undefined;\n\tsignal: AbortSignal | undefined;\n\tonAbort: () => void;\n\tcancellable: boolean;\n\tonProgress: ((progress: ProgressNotification) => void) | undefined;\n\tprogressToken: JsonRpcId | undefined;\n}\n\nfunction validateInitializeResult(value: unknown): InitializeResult {\n\tif (\n\t\t!isObject(value) ||\n\t\ttypeof value.protocolVersion !== \"string\" ||\n\t\t!isObject(value.capabilities) ||\n\t\t!isObject(value.serverInfo) ||\n\t\ttypeof value.serverInfo.name !== \"string\" ||\n\t\ttypeof value.serverInfo.version !== \"string\" ||\n\t\t(value.instructions !== undefined && typeof value.instructions !== \"string\")\n\t) {\n\t\tthrow new McpError(JSON_RPC_ERROR_CODES.invalidRequest, \"Invalid MCP initialize result\");\n\t}\n\treturn value as unknown as InitializeResult;\n}\n\nfunction invalid(message: string): McpError {\n\treturn new McpError(JSON_RPC_ERROR_CODES.invalidRequest, message);\n}\n\n/** One page of a paginated list: the items under `key`, each checked by `isItem`. */\nfunction validateListPage(\n\tmethod: string,\n\tkey: string,\n\tvalue: unknown,\n\tisItem: (item: Record<string, unknown>) => boolean,\n): { items: Record<string, unknown>[]; nextCursor?: string } {\n\tconst items = isObject(value) ? value[key] : undefined;\n\tif (!isObject(value) || !Array.isArray(items)) throw invalid(`Invalid MCP ${method} result`);\n\tfor (const item of items) {\n\t\tif (!isObject(item) || !isItem(item)) throw invalid(`Invalid entry in MCP ${method} result`);\n\t}\n\t// Some servers end pagination with `null` or `\"\"` instead of omitting the cursor.\n\tconst nextCursor = value.nextCursor === null || value.nextCursor === \"\" ? undefined : value.nextCursor;\n\tif (nextCursor !== undefined && typeof nextCursor !== \"string\") throw invalid(`Invalid MCP ${method} cursor`);\n\treturn { items, ...(nextCursor === undefined ? {} : { nextCursor }) };\n}\n\nconst isTool = (tool: Record<string, unknown>) => typeof tool.name === \"string\" && isObject(tool.inputSchema);\n// `name` is required by the spec, but some servers omit it; the URI stands in.\nconst isResource = (resource: Record<string, unknown>) =>\n\ttypeof resource.uri === \"string\" && (resource.name === undefined || typeof resource.name === \"string\");\nconst isResourceTemplate = (template: Record<string, unknown>) =>\n\ttypeof template.uriTemplate === \"string\" && (template.name === undefined || typeof template.name === \"string\");\n\nfunction toResource(item: Record<string, unknown>): Resource {\n\treturn { ...item, name: item.name ?? item.uri } as Resource;\n}\n\nfunction toResourceTemplate(item: Record<string, unknown>): ResourceTemplate {\n\treturn { ...item, name: item.name ?? item.uriTemplate } as ResourceTemplate;\n}\n\nfunction pageCursor(page: { nextCursor?: string }): { nextCursor?: string } {\n\treturn page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor };\n}\n\nfunction validateReadResourceResult(value: unknown): ReadResourceResult {\n\tif (!isObject(value) || !Array.isArray(value.contents)) throw invalid(\"Invalid MCP resources/read result\");\n\tfor (const contents of value.contents) {\n\t\tif (\n\t\t\t!isObject(contents) ||\n\t\t\ttypeof contents.uri !== \"string\" ||\n\t\t\t(typeof contents.text !== \"string\" && typeof contents.blob !== \"string\")\n\t\t) {\n\t\t\tthrow invalid(\"Invalid contents in MCP resources/read result\");\n\t\t}\n\t}\n\treturn value as unknown as ReadResourceResult;\n}\n\n/** `content` is required by the spec, but servers that only return `structuredContent` omit it (the SDK defaults it too). */\nfunction validateCallToolResult(value: unknown): CallToolResult {\n\tif (!isObject(value) || (value.content !== undefined && !Array.isArray(value.content))) {\n\t\tthrow new McpError(JSON_RPC_ERROR_CODES.invalidRequest, \"Invalid MCP tools/call result\");\n\t}\n\tif (value.structuredContent !== undefined && !isObject(value.structuredContent)) {\n\t\tthrow new McpError(JSON_RPC_ERROR_CODES.invalidRequest, \"Invalid MCP tools/call structured content\");\n\t}\n\treturn (value.content === undefined ? { ...value, content: [] } : value) as unknown as CallToolResult;\n}\n\nexport class McpClient {\n\treadonly options: Readonly<McpClientOptions>;\n\tprivate state: ClientState = \"idle\";\n\tprivate transport: McpTransport | undefined;\n\tprivate nextRequestId = 1;\n\tprivate serverInfoValue: Implementation | undefined;\n\tprivate serverCapabilitiesValue: ServerCapabilities | undefined;\n\tprivate instructionsValue: string | undefined;\n\tprivate protocolVersionValue: string | undefined;\n\tprivate pending = new Map<JsonRpcId, PendingRequest>();\n\tprivate progressRequests = new Map<JsonRpcId, JsonRpcId>();\n\tprivate incoming = new Map<JsonRpcId, AbortController>();\n\tprivate requestHandlers = new Map<string, RequestHandler>();\n\tprivate notificationListeners = new Map<string, Set<NotificationListener>>();\n\tprivate errorListeners = new Set<ErrorListener>();\n\tprivate closeListeners = new Set<CloseListener>();\n\tprivate disposers: (() => void)[] = [];\n\n\tconstructor(options: McpClientOptions) {\n\t\tthis.options = Object.freeze({ ...options });\n\t\tthis.requestHandlers.set(\"ping\", () => ({}));\n\t\tconst roots = options.roots;\n\t\tif (roots) {\n\t\t\tthis.requestHandlers.set(\"roots/list\", async () => ({\n\t\t\t\troots: [...(typeof roots === \"function\" ? await roots() : roots)],\n\t\t\t}));\n\t\t}\n\t}\n\n\tget connectionState(): ClientState {\n\t\treturn this.state;\n\t}\n\n\tget serverInfo(): Implementation | undefined {\n\t\treturn this.serverInfoValue;\n\t}\n\n\tget serverCapabilities(): ServerCapabilities | undefined {\n\t\treturn this.serverCapabilitiesValue;\n\t}\n\n\tget instructions(): string | undefined {\n\t\treturn this.instructionsValue;\n\t}\n\n\tget protocolVersion(): string | undefined {\n\t\treturn this.protocolVersionValue;\n\t}\n\n\tasync connect(transport: McpTransport): Promise<InitializeResult> {\n\t\tif (this.state !== \"idle\") throw new Error(`Cannot connect MCP client in ${this.state} state`);\n\t\tthis.state = \"connecting\";\n\t\tthis.transport = transport;\n\t\tthis.disposers = [\n\t\t\ttransport.onMessage((message) => this.handleMessage(message)),\n\t\t\t// Transport errors are reported only. Pending requests fail when the transport closes.\n\t\t\ttransport.onError((error) => this.emitError(error)),\n\t\t\ttransport.onClose(() => this.handleTransportClose()),\n\t\t];\n\n\t\ttry {\n\t\t\tawait transport.start();\n\t\t\tconst capabilities: ClientCapabilities = { ...this.options.capabilities };\n\t\t\tif (this.options.roots && capabilities.roots === undefined) capabilities.roots = {};\n\t\t\tconst result = validateInitializeResult(\n\t\t\t\tawait this.requestInternal(\n\t\t\t\t\t\"initialize\",\n\t\t\t\t\t{\n\t\t\t\t\t\tprotocolVersion: this.options.protocolVersion ?? LATEST_PROTOCOL_VERSION,\n\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t\tclientInfo: {\n\t\t\t\t\t\t\tname: this.options.name,\n\t\t\t\t\t\t\tversion: this.options.version,\n\t\t\t\t\t\t\t...(this.options.title === undefined ? {} : { title: this.options.title }),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{},\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (!(SUPPORTED_PROTOCOL_VERSIONS as readonly string[]).includes(result.protocolVersion)) {\n\t\t\t\tthrow new Error(`MCP server selected unsupported protocol version ${result.protocolVersion}`);\n\t\t\t}\n\t\t\tthis.protocolVersionValue = result.protocolVersion;\n\t\t\tthis.serverInfoValue = result.serverInfo;\n\t\t\tthis.serverCapabilitiesValue = result.capabilities;\n\t\t\tthis.instructionsValue = result.instructions;\n\t\t\ttransport.setProtocolVersion?.(result.protocolVersion);\n\t\t\tawait this.notifyInternal(\"notifications/initialized\", undefined, true);\n\t\t\tthis.state = \"connected\";\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tawait this.close().catch(() => {});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\trequest<Result = unknown>(\n\t\tmethod: string,\n\t\tparams?: Record<string, unknown>,\n\t\toptions: McpRequestOptions = {},\n\t): Promise<Result> {\n\t\treturn this.requestInternal(method, params, options, false) as Promise<Result>;\n\t}\n\n\tnotify(method: string, params?: Record<string, unknown>): Promise<void> {\n\t\treturn this.notifyInternal(method, params, false);\n\t}\n\n\tsetRequestHandler(method: string, handler: RequestHandler): () => void {\n\t\tthis.requestHandlers.set(method, handler);\n\t\treturn () => {\n\t\t\tif (this.requestHandlers.get(method) === handler) this.requestHandlers.delete(method);\n\t\t};\n\t}\n\n\tonNotification(method: string, listener: NotificationListener): () => void {\n\t\tconst listeners = this.notificationListeners.get(method) ?? new Set<NotificationListener>();\n\t\tthis.notificationListeners.set(method, listeners);\n\t\tlisteners.add(listener);\n\t\treturn () => {\n\t\t\tlisteners.delete(listener);\n\t\t\tif (listeners.size === 0) this.notificationListeners.delete(method);\n\t\t};\n\t}\n\n\tonError(listener: ErrorListener): () => void {\n\t\tthis.errorListeners.add(listener);\n\t\treturn () => this.errorListeners.delete(listener);\n\t}\n\n\t/** Called once when the connection closes, whether the transport dropped or `close()` was called. */\n\tonClose(listener: CloseListener): () => void {\n\t\tthis.closeListeners.add(listener);\n\t\treturn () => this.closeListeners.delete(listener);\n\t}\n\n\tasync ping(options: McpRequestOptions = {}): Promise<void> {\n\t\tawait this.request(\"ping\", undefined, options);\n\t}\n\n\tasync listTools(options: McpRequestOptions = {}): Promise<Tool[]> {\n\t\treturn (await this.listAll(\"tools/list\", \"tools\", isTool, options)) as unknown as Tool[];\n\t}\n\n\t/** Every resource, following `nextCursor` through all pages. */\n\tasync listResources(options: McpRequestOptions = {}): Promise<Resource[]> {\n\t\treturn (await this.listAll(\"resources/list\", \"resources\", isResource, options)).map(toResource);\n\t}\n\n\t/** One page of resources, starting at `cursor`. */\n\tasync listResourcesPage(cursor?: string, options: McpRequestOptions = {}): Promise<ListResourcesResult> {\n\t\tconst page = await this.listPage(\"resources/list\", \"resources\", isResource, cursor, options);\n\t\treturn { resources: page.items.map(toResource), ...pageCursor(page) };\n\t}\n\n\t/** Every resource template, following `nextCursor` through all pages. */\n\tasync listResourceTemplates(options: McpRequestOptions = {}): Promise<ResourceTemplate[]> {\n\t\tconst templates = await this.listAll(\n\t\t\t\"resources/templates/list\",\n\t\t\t\"resourceTemplates\",\n\t\t\tisResourceTemplate,\n\t\t\toptions,\n\t\t);\n\t\treturn templates.map(toResourceTemplate);\n\t}\n\n\t/** One page of resource templates, starting at `cursor`. */\n\tasync listResourceTemplatesPage(\n\t\tcursor?: string,\n\t\toptions: McpRequestOptions = {},\n\t): Promise<ListResourceTemplatesResult> {\n\t\tconst page = await this.listPage(\n\t\t\t\"resources/templates/list\",\n\t\t\t\"resourceTemplates\",\n\t\t\tisResourceTemplate,\n\t\t\tcursor,\n\t\t\toptions,\n\t\t);\n\t\treturn { resourceTemplates: page.items.map(toResourceTemplate), ...pageCursor(page) };\n\t}\n\n\tasync readResource(uri: string, options: McpRequestOptions = {}): Promise<ReadResourceResult> {\n\t\treturn validateReadResourceResult(await this.request(\"resources/read\", { uri }, options));\n\t}\n\n\tprivate async listPage(\n\t\tmethod: string,\n\t\tkey: string,\n\t\tisItem: (item: Record<string, unknown>) => boolean,\n\t\tcursor: string | undefined,\n\t\toptions: McpRequestOptions,\n\t): Promise<{ items: Record<string, unknown>[]; nextCursor?: string }> {\n\t\treturn validateListPage(\n\t\t\tmethod,\n\t\t\tkey,\n\t\t\tawait this.request(method, cursor === undefined ? undefined : { cursor }, options),\n\t\t\tisItem,\n\t\t);\n\t}\n\n\t/** Every item of a paginated list method. */\n\tprivate async listAll(\n\t\tmethod: string,\n\t\tkey: string,\n\t\tisItem: (item: Record<string, unknown>) => boolean,\n\t\toptions: McpRequestOptions,\n\t): Promise<Record<string, unknown>[]> {\n\t\tconst items: Record<string, unknown>[] = [];\n\t\tconst cursors = new Set<string>();\n\t\tlet cursor: string | undefined;\n\t\tfor (let pageNumber = 0; pageNumber < MAX_LIST_PAGES; pageNumber++) {\n\t\t\tconst page = await this.listPage(method, key, isItem, cursor, options);\n\t\t\titems.push(...page.items);\n\t\t\tif (page.nextCursor === undefined) return items;\n\t\t\tif (cursors.has(page.nextCursor))\n\t\t\t\tthrow new Error(`MCP ${method} returned duplicate cursor: ${page.nextCursor}`);\n\t\t\tcursors.add(page.nextCursor);\n\t\t\tcursor = page.nextCursor;\n\t\t}\n\t\tthrow new Error(`MCP ${method} exceeded ${MAX_LIST_PAGES} pages`);\n\t}\n\n\tasync callTool(\n\t\tname: string,\n\t\targs?: Record<string, unknown>,\n\t\toptions: McpRequestOptions = {},\n\t): Promise<CallToolResult> {\n\t\treturn validateCallToolResult(\n\t\t\tawait this.request(\"tools/call\", { name, ...(args === undefined ? {} : { arguments: args }) }, options),\n\t\t);\n\t}\n\n\tasync close(): Promise<void> {\n\t\tconst transport = this.transport;\n\t\tthis.transport = undefined;\n\t\tthis.disposeTransportListeners();\n\t\tthis.markClosed(new McpConnectionClosedError());\n\t\tawait transport?.close();\n\t}\n\n\tprivate async requestInternal(\n\t\tmethod: string,\n\t\tparams: Record<string, unknown> | undefined,\n\t\toptions: McpRequestOptions,\n\t\tallowConnecting: boolean,\n\t): Promise<unknown> {\n\t\tconst transport = this.requireTransport(allowConnecting);\n\t\tif (options.signal?.aborted) throw new McpAbortError();\n\t\tconst id = this.nextRequestId++;\n\t\tconst progressToken = options.onProgress ? id : undefined;\n\t\tconst requestParams =\n\t\t\tprogressToken === undefined\n\t\t\t\t? params\n\t\t\t\t: { ...params, _meta: { ...(isObject(params?._meta) ? params._meta : {}), progressToken } };\n\t\tconst message: JsonRpcRequest = {\n\t\t\tjsonrpc: \"2.0\",\n\t\t\tid,\n\t\t\tmethod,\n\t\t\t...(requestParams === undefined ? {} : { params: requestParams }),\n\t\t};\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst entry: PendingRequest = {\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\ttimeoutMs: options.timeoutMs ?? this.options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n\t\t\t\ttimer: undefined,\n\t\t\t\tsignal: options.signal,\n\t\t\t\t// The spec forbids cancelling `initialize`.\n\t\t\t\tonAbort: () =>\n\t\t\t\t\tthis.cancelPending(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tnew McpAbortError(),\n\t\t\t\t\t\tmethod !== \"initialize\",\n\t\t\t\t\t\tString(options.signal?.reason ?? \"Aborted\"),\n\t\t\t\t\t),\n\t\t\t\tcancellable: method !== \"initialize\",\n\t\t\t\tonProgress: options.onProgress,\n\t\t\t\tprogressToken,\n\t\t\t};\n\t\t\tthis.pending.set(id, entry);\n\t\t\tif (progressToken !== undefined) this.progressRequests.set(progressToken, id);\n\t\t\toptions.signal?.addEventListener(\"abort\", entry.onAbort, { once: true });\n\t\t\tthis.armTimeout(id, entry);\n\t\t\ttransport.send(message).catch((error) => this.cancelPending(id, error, false));\n\t\t});\n\t}\n\n\tprivate async notifyInternal(\n\t\tmethod: string,\n\t\tparams: Record<string, unknown> | undefined,\n\t\tallowConnecting: boolean,\n\t): Promise<void> {\n\t\tawait this.requireTransport(allowConnecting).send({\n\t\t\tjsonrpc: \"2.0\",\n\t\t\tmethod,\n\t\t\t...(params === undefined ? {} : { params }),\n\t\t});\n\t}\n\n\tprivate requireTransport(allowConnecting: boolean): McpTransport {\n\t\tif (this.transport && (this.state === \"connected\" || (allowConnecting && this.state === \"connecting\"))) {\n\t\t\treturn this.transport;\n\t\t}\n\t\tthrow new McpConnectionClosedError(`MCP client is ${this.state}`);\n\t}\n\n\tprivate handleMessage(message: JsonRpcMessage): void {\n\t\tif (isJsonRpcResponse(message)) {\n\t\t\tthis.handleResponse(message);\n\t\t\treturn;\n\t\t}\n\t\tif (isJsonRpcRequest(message)) {\n\t\t\tvoid this.handleRequest(message);\n\t\t\treturn;\n\t\t}\n\t\tif (isJsonRpcNotification(message)) {\n\t\t\tthis.handleNotification(message.method, message.params);\n\t\t\treturn;\n\t\t}\n\t\tthis.emitError(new McpError(JSON_RPC_ERROR_CODES.invalidRequest, \"Received invalid JSON-RPC message\"));\n\t}\n\n\tprivate handleResponse(message: JsonRpcResponse): void {\n\t\tconst entry = this.pending.get(message.id);\n\t\tif (!entry) {\n\t\t\tthis.emitError(new Error(`Received response for unknown MCP request ${String(message.id)}`));\n\t\t\treturn;\n\t\t}\n\t\tthis.removePending(message.id, entry);\n\t\tif (\"error\" in message) entry.reject(new McpError(message.error.code, message.error.message, message.error.data));\n\t\telse entry.resolve(message.result);\n\t}\n\n\tprivate async handleRequest(message: JsonRpcRequest): Promise<void> {\n\t\tconst transport = this.transport;\n\t\tif (!transport) return;\n\t\tconst handler = this.requestHandlers.get(message.method);\n\t\tif (!handler) {\n\t\t\tawait transport\n\t\t\t\t.send({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid: message.id,\n\t\t\t\t\terror: { code: JSON_RPC_ERROR_CODES.methodNotFound, message: `Method not found: ${message.method}` },\n\t\t\t\t})\n\t\t\t\t.catch((error) => this.emitError(error));\n\t\t\treturn;\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tthis.incoming.set(message.id, controller);\n\t\ttry {\n\t\t\tconst result = await handler(message.params, { signal: controller.signal });\n\t\t\tawait transport.send({ jsonrpc: \"2.0\", id: message.id, result: result ?? {} });\n\t\t} catch (error) {\n\t\t\tconst responseError =\n\t\t\t\terror instanceof McpError\n\t\t\t\t\t? { code: error.code, message: error.message, data: error.data }\n\t\t\t\t\t: { code: JSON_RPC_ERROR_CODES.internalError, message: toError(error).message };\n\t\t\tawait transport\n\t\t\t\t.send({ jsonrpc: \"2.0\", id: message.id, error: responseError })\n\t\t\t\t.catch((sendError) => this.emitError(sendError));\n\t\t} finally {\n\t\t\tthis.incoming.delete(message.id);\n\t\t}\n\t}\n\n\tprivate handleNotification(method: string, params: unknown): void {\n\t\tif (method === \"notifications/progress\") this.handleProgress(params);\n\t\telse if (method === \"notifications/cancelled\") this.handleCancelled(params);\n\t\tfor (const listener of this.notificationListeners.get(method) ?? []) {\n\t\t\ttry {\n\t\t\t\tlistener(params);\n\t\t\t} catch (error) {\n\t\t\t\tthis.emitError(error);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleProgress(params: unknown): void {\n\t\tif (!isObject(params) || !isJsonRpcId(params.progressToken) || typeof params.progress !== \"number\") return;\n\t\tconst requestId = this.progressRequests.get(params.progressToken);\n\t\tconst entry = requestId === undefined ? undefined : this.pending.get(requestId);\n\t\tif (requestId === undefined || !entry) return;\n\t\tthis.armTimeout(requestId, entry);\n\t\ttry {\n\t\t\tentry.onProgress?.(params as unknown as ProgressNotification);\n\t\t} catch (error) {\n\t\t\tthis.emitError(error);\n\t\t}\n\t}\n\n\tprivate handleCancelled(params: unknown): void {\n\t\tif (isObject(params) && isJsonRpcId(params.requestId)) this.incoming.get(params.requestId)?.abort(params.reason);\n\t}\n\n\tprivate armTimeout(id: JsonRpcId, entry: PendingRequest): void {\n\t\tif (entry.timer) clearTimeout(entry.timer);\n\t\tif (!Number.isFinite(entry.timeoutMs) || entry.timeoutMs <= 0) return;\n\t\tentry.timer = setTimeout(() => {\n\t\t\tthis.cancelPending(id, new McpTimeoutError(entry.timeoutMs), entry.cancellable, \"Request timed out\");\n\t\t}, entry.timeoutMs);\n\t}\n\n\tprivate cancelPending(id: JsonRpcId, error: unknown, notifyServer: boolean, reason?: string): void {\n\t\tconst entry = this.pending.get(id);\n\t\tif (!entry) return;\n\t\tthis.removePending(id, entry);\n\t\tentry.reject(error);\n\t\tif (notifyServer && this.transport) {\n\t\t\tvoid this.transport\n\t\t\t\t.send({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tmethod: \"notifications/cancelled\",\n\t\t\t\t\tparams: { requestId: id, ...(reason ? { reason } : {}) },\n\t\t\t\t})\n\t\t\t\t.catch((sendError) => this.emitError(sendError));\n\t\t}\n\t}\n\n\tprivate removePending(id: JsonRpcId, entry: PendingRequest): void {\n\t\tthis.pending.delete(id);\n\t\tif (entry.timer) clearTimeout(entry.timer);\n\t\tif (entry.progressToken !== undefined) this.progressRequests.delete(entry.progressToken);\n\t\tentry.signal?.removeEventListener(\"abort\", entry.onAbort);\n\t}\n\n\tprivate rejectPending(error: unknown): void {\n\t\tfor (const [id, entry] of this.pending) {\n\t\t\tthis.removePending(id, entry);\n\t\t\tentry.reject(error);\n\t\t}\n\t}\n\n\tprivate handleTransportClose(): void {\n\t\tthis.markClosed(new McpConnectionClosedError());\n\t}\n\n\t/** Idempotent: rejects in-flight requests, aborts server requests we are serving, and flips the state. */\n\tprivate markClosed(error: Error): void {\n\t\tconst wasClosed = this.state === \"closed\";\n\t\tthis.state = \"closed\";\n\t\tthis.rejectPending(error);\n\t\tfor (const controller of this.incoming.values()) controller.abort(error);\n\t\tthis.incoming.clear();\n\t\tif (wasClosed) return;\n\t\tfor (const listener of [...this.closeListeners]) {\n\t\t\ttry {\n\t\t\t\tlistener();\n\t\t\t} catch (listenerError) {\n\t\t\t\tthis.emitError(listenerError);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate emitError(error: unknown): void {\n\t\tconst normalized = toError(error);\n\t\tfor (const listener of this.errorListeners) listener(normalized);\n\t}\n\n\tprivate disposeTransportListeners(): void {\n\t\tfor (const dispose of this.disposers.splice(0)) dispose();\n\t}\n}\n"]}