@yourgpt/copilot-sdk 2.0.1 → 2.0.2-beta.2

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 (215) hide show
  1. package/README.md +42 -0
  2. package/dist/{ThreadManager-JT0sqSSD.d.ts → ThreadManager-Dkp_eLty.d.ts} +1 -1
  3. package/dist/{ThreadManager-CUq5Ocu2.d.cts → ThreadManager-LfFRhr4e.d.cts} +1 -1
  4. package/dist/anthropic-6F5GRE3B.js +4 -0
  5. package/dist/anthropic-6F5GRE3B.js.map +1 -0
  6. package/dist/anthropic-DGalr_Fw.d.cts +17 -0
  7. package/dist/anthropic-DkCEDYOt.d.ts +17 -0
  8. package/dist/anthropic-NMTRABEH.cjs +21 -0
  9. package/dist/anthropic-NMTRABEH.cjs.map +1 -0
  10. package/dist/brave-DdnWb7Gb.d.cts +17 -0
  11. package/dist/brave-DsI9n7Wr.d.ts +17 -0
  12. package/dist/brave-OYKCOZEM.cjs +21 -0
  13. package/dist/brave-OYKCOZEM.cjs.map +1 -0
  14. package/dist/brave-XSASGGH2.js +4 -0
  15. package/dist/brave-XSASGGH2.js.map +1 -0
  16. package/dist/chunk-2FAWEBZS.cjs +88 -0
  17. package/dist/chunk-2FAWEBZS.cjs.map +1 -0
  18. package/dist/chunk-53UGJNHN.js +92 -0
  19. package/dist/chunk-53UGJNHN.js.map +1 -0
  20. package/dist/chunk-6T5XXJEP.cjs +80 -0
  21. package/dist/chunk-6T5XXJEP.cjs.map +1 -0
  22. package/dist/chunk-7K7HZMP4.cjs +1170 -0
  23. package/dist/chunk-7K7HZMP4.cjs.map +1 -0
  24. package/dist/chunk-7W7QLZNC.js +72 -0
  25. package/dist/chunk-7W7QLZNC.js.map +1 -0
  26. package/dist/{chunk-JM7PB2LP.js → chunk-7XFFRV7D.js} +10 -66
  27. package/dist/chunk-7XFFRV7D.js.map +1 -0
  28. package/dist/chunk-ASV6JLYG.cjs +99 -0
  29. package/dist/chunk-ASV6JLYG.cjs.map +1 -0
  30. package/dist/chunk-BH7MNDWW.js +1152 -0
  31. package/dist/chunk-BH7MNDWW.js.map +1 -0
  32. package/dist/chunk-BKO7DSPU.js +67 -0
  33. package/dist/chunk-BKO7DSPU.js.map +1 -0
  34. package/dist/chunk-CBAHCI4R.cjs +76 -0
  35. package/dist/chunk-CBAHCI4R.cjs.map +1 -0
  36. package/dist/chunk-CEKAYA2Q.cjs +74 -0
  37. package/dist/chunk-CEKAYA2Q.cjs.map +1 -0
  38. package/dist/chunk-CEOMTQTP.js +85 -0
  39. package/dist/chunk-CEOMTQTP.js.map +1 -0
  40. package/dist/chunk-DABZYCVX.js +84 -0
  41. package/dist/chunk-DABZYCVX.js.map +1 -0
  42. package/dist/chunk-DGUM43GV.js +10 -0
  43. package/dist/chunk-DGUM43GV.js.map +1 -0
  44. package/dist/chunk-G4SF2PNQ.js +33 -0
  45. package/dist/chunk-G4SF2PNQ.js.map +1 -0
  46. package/dist/chunk-GANCV72Z.cjs +110 -0
  47. package/dist/chunk-GANCV72Z.cjs.map +1 -0
  48. package/dist/{chunk-BLSI67J6.cjs → chunk-H5XMKBBA.cjs} +425 -30
  49. package/dist/chunk-H5XMKBBA.cjs.map +1 -0
  50. package/dist/{chunk-CJ7UWN2Y.js → chunk-IXFV6AW6.js} +397 -7
  51. package/dist/chunk-IXFV6AW6.js.map +1 -0
  52. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  53. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  54. package/dist/chunk-JO4BHPAD.cjs +40 -0
  55. package/dist/chunk-JO4BHPAD.cjs.map +1 -0
  56. package/dist/chunk-MEBXW75C.cjs +89 -0
  57. package/dist/chunk-MEBXW75C.cjs.map +1 -0
  58. package/dist/chunk-MNDGIW47.js +76 -0
  59. package/dist/chunk-MNDGIW47.js.map +1 -0
  60. package/dist/chunk-PPFHA6IL.js +83 -0
  61. package/dist/chunk-PPFHA6IL.js.map +1 -0
  62. package/dist/chunk-RQ74USYU.js +128 -0
  63. package/dist/chunk-RQ74USYU.js.map +1 -0
  64. package/dist/chunk-TXLIY7GF.cjs +132 -0
  65. package/dist/chunk-TXLIY7GF.cjs.map +1 -0
  66. package/dist/chunk-UIWFYMAO.cjs +82 -0
  67. package/dist/chunk-UIWFYMAO.cjs.map +1 -0
  68. package/dist/{chunk-4PRWNAXQ.cjs → chunk-UOWLKFXK.cjs} +27 -89
  69. package/dist/chunk-UOWLKFXK.cjs.map +1 -0
  70. package/dist/chunk-VD74IPKB.js +106 -0
  71. package/dist/chunk-VD74IPKB.js.map +1 -0
  72. package/dist/chunk-W73FBYIH.cjs +87 -0
  73. package/dist/chunk-W73FBYIH.cjs.map +1 -0
  74. package/dist/chunk-XGITAEXU.js +93 -0
  75. package/dist/chunk-XGITAEXU.js.map +1 -0
  76. package/dist/chunk-XWOHNY3F.cjs +96 -0
  77. package/dist/chunk-XWOHNY3F.cjs.map +1 -0
  78. package/dist/chunk-ZPYQDMUX.js +79 -0
  79. package/dist/chunk-ZPYQDMUX.js.map +1 -0
  80. package/dist/core/index.cjs +156 -84
  81. package/dist/core/index.d.cts +16 -4
  82. package/dist/core/index.d.ts +16 -4
  83. package/dist/core/index.js +13 -1
  84. package/dist/exa-72KFY5A7.cjs +21 -0
  85. package/dist/exa-72KFY5A7.cjs.map +1 -0
  86. package/dist/exa-Dp9U-WTc.d.ts +17 -0
  87. package/dist/exa-NNVPBC2M.js +4 -0
  88. package/dist/exa-NNVPBC2M.js.map +1 -0
  89. package/dist/exa-jJSPhyUW.d.cts +17 -0
  90. package/dist/google-CHU2yycE.d.cts +17 -0
  91. package/dist/google-CTEK6SV2.js +4 -0
  92. package/dist/google-CTEK6SV2.js.map +1 -0
  93. package/dist/google-Da8IQxaI.d.ts +17 -0
  94. package/dist/google-IIUXFFVF.cjs +21 -0
  95. package/dist/google-IIUXFFVF.cjs.map +1 -0
  96. package/dist/index-2VtgKM8S.d.cts +206 -0
  97. package/dist/index-pWEH7pUE.d.ts +206 -0
  98. package/dist/mcp/index.cjs +670 -0
  99. package/dist/mcp/index.cjs.map +1 -0
  100. package/dist/mcp/index.d.cts +779 -0
  101. package/dist/mcp/index.d.ts +779 -0
  102. package/dist/mcp/index.js +574 -0
  103. package/dist/mcp/index.js.map +1 -0
  104. package/dist/openai-6KTCQ7PZ.cjs +21 -0
  105. package/dist/openai-6KTCQ7PZ.cjs.map +1 -0
  106. package/dist/openai-7W2PCNW5.js +4 -0
  107. package/dist/openai-7W2PCNW5.js.map +1 -0
  108. package/dist/openai-Cam8hF4f.d.ts +17 -0
  109. package/dist/openai-HVSCuXgO.d.cts +17 -0
  110. package/dist/react/index.cjs +75 -42
  111. package/dist/react/index.d.cts +270 -45
  112. package/dist/react/index.d.ts +270 -45
  113. package/dist/react/index.js +15 -2
  114. package/dist/searxng-AXLVGY7Z.js +4 -0
  115. package/dist/searxng-AXLVGY7Z.js.map +1 -0
  116. package/dist/searxng-EJKNY236.cjs +21 -0
  117. package/dist/searxng-EJKNY236.cjs.map +1 -0
  118. package/dist/searxng-K0qtY9vp.d.ts +17 -0
  119. package/dist/searxng-QGOte_Gq.d.cts +17 -0
  120. package/dist/serper-3JYJHJX6.js +4 -0
  121. package/dist/serper-3JYJHJX6.js.map +1 -0
  122. package/dist/serper-63FT4AOL.cjs +21 -0
  123. package/dist/serper-63FT4AOL.cjs.map +1 -0
  124. package/dist/serper-7Czya3PW.d.ts +17 -0
  125. package/dist/serper-JzdaSnS9.d.cts +17 -0
  126. package/dist/styles.css +38 -0
  127. package/dist/tavily-AWFP4RM7.cjs +21 -0
  128. package/dist/tavily-AWFP4RM7.cjs.map +1 -0
  129. package/dist/tavily-C8cXXojE.d.cts +17 -0
  130. package/dist/tavily-CIWAAZPH.js +4 -0
  131. package/dist/tavily-CIWAAZPH.js.map +1 -0
  132. package/dist/tavily-DdSGVgkE.d.ts +17 -0
  133. package/dist/themes/catppuccin.css +2 -0
  134. package/dist/themes/claude.css +2 -0
  135. package/dist/themes/linear.css +2 -0
  136. package/dist/themes/modern-minimal.css +2 -0
  137. package/dist/themes/posthog.css +2 -0
  138. package/dist/themes/supabase.css +2 -0
  139. package/dist/themes/twitter.css +2 -0
  140. package/dist/themes/vercel.css +2 -0
  141. package/dist/tools/anthropic/index.cjs +61 -0
  142. package/dist/tools/anthropic/index.cjs.map +1 -0
  143. package/dist/tools/anthropic/index.d.cts +67 -0
  144. package/dist/tools/anthropic/index.d.ts +67 -0
  145. package/dist/tools/anthropic/index.js +56 -0
  146. package/dist/tools/anthropic/index.js.map +1 -0
  147. package/dist/tools/brave/index.cjs +85 -0
  148. package/dist/tools/brave/index.cjs.map +1 -0
  149. package/dist/tools/brave/index.d.cts +91 -0
  150. package/dist/tools/brave/index.d.ts +91 -0
  151. package/dist/tools/brave/index.js +80 -0
  152. package/dist/tools/brave/index.js.map +1 -0
  153. package/dist/tools/exa/index.cjs +90 -0
  154. package/dist/tools/exa/index.cjs.map +1 -0
  155. package/dist/tools/exa/index.d.cts +92 -0
  156. package/dist/tools/exa/index.d.ts +92 -0
  157. package/dist/tools/exa/index.js +85 -0
  158. package/dist/tools/exa/index.js.map +1 -0
  159. package/dist/tools/google/index.cjs +81 -0
  160. package/dist/tools/google/index.cjs.map +1 -0
  161. package/dist/tools/google/index.d.cts +81 -0
  162. package/dist/tools/google/index.d.ts +81 -0
  163. package/dist/tools/google/index.js +76 -0
  164. package/dist/tools/google/index.js.map +1 -0
  165. package/dist/tools/openai/index.cjs +83 -0
  166. package/dist/tools/openai/index.cjs.map +1 -0
  167. package/dist/tools/openai/index.d.cts +84 -0
  168. package/dist/tools/openai/index.d.ts +84 -0
  169. package/dist/tools/openai/index.js +78 -0
  170. package/dist/tools/openai/index.js.map +1 -0
  171. package/dist/tools/searxng/index.cjs +85 -0
  172. package/dist/tools/searxng/index.cjs.map +1 -0
  173. package/dist/tools/searxng/index.d.cts +91 -0
  174. package/dist/tools/searxng/index.d.ts +91 -0
  175. package/dist/tools/searxng/index.js +80 -0
  176. package/dist/tools/searxng/index.js.map +1 -0
  177. package/dist/tools/serper/index.cjs +85 -0
  178. package/dist/tools/serper/index.cjs.map +1 -0
  179. package/dist/tools/serper/index.d.cts +91 -0
  180. package/dist/tools/serper/index.d.ts +91 -0
  181. package/dist/tools/serper/index.js +80 -0
  182. package/dist/tools/serper/index.js.map +1 -0
  183. package/dist/tools/tavily/index.cjs +91 -0
  184. package/dist/tools/tavily/index.cjs.map +1 -0
  185. package/dist/tools/tavily/index.d.cts +95 -0
  186. package/dist/tools/tavily/index.d.ts +95 -0
  187. package/dist/tools/tavily/index.js +86 -0
  188. package/dist/tools/tavily/index.js.map +1 -0
  189. package/dist/tools/web-search/index.cjs +31 -0
  190. package/dist/tools/web-search/index.cjs.map +1 -0
  191. package/dist/tools/web-search/index.d.cts +3 -0
  192. package/dist/tools/web-search/index.d.ts +3 -0
  193. package/dist/tools/web-search/index.js +14 -0
  194. package/dist/tools/web-search/index.js.map +1 -0
  195. package/dist/{types-BtAaOV07.d.cts → tools-DDWrco4h.d.cts} +43 -367
  196. package/dist/{types-BtAaOV07.d.ts → tools-DDWrco4h.d.ts} +43 -367
  197. package/dist/types-B20VCJXL.d.cts +347 -0
  198. package/dist/types-B20VCJXL.d.ts +347 -0
  199. package/dist/types-Cizh9K_f.d.ts +441 -0
  200. package/dist/types-DG2ya08y.d.cts +367 -0
  201. package/dist/types-DG2ya08y.d.ts +367 -0
  202. package/dist/types-DjSfYNKj.d.cts +441 -0
  203. package/dist/types-ZguuKEs_.d.cts +127 -0
  204. package/dist/types-ZguuKEs_.d.ts +127 -0
  205. package/dist/ui/index.cjs +1075 -148
  206. package/dist/ui/index.cjs.map +1 -1
  207. package/dist/ui/index.d.cts +410 -4
  208. package/dist/ui/index.d.ts +410 -4
  209. package/dist/ui/index.js +1007 -96
  210. package/dist/ui/index.js.map +1 -1
  211. package/package.json +52 -2
  212. package/dist/chunk-4PRWNAXQ.cjs.map +0 -1
  213. package/dist/chunk-BLSI67J6.cjs.map +0 -1
  214. package/dist/chunk-CJ7UWN2Y.js.map +0 -1
  215. package/dist/chunk-JM7PB2LP.js.map +0 -1
@@ -0,0 +1,574 @@
1
+ export { DEFAULT_MCP_UI_SANDBOX, RESTRICTED_MCP_UI_SANDBOX, isMCPUIIntent, isMCPUIMessage, isMCPUIResourceContent, parseMCPUIMessage } from '../chunk-G4SF2PNQ.js';
2
+ import { createMCPClient, BaseTransport, MCPError, JSON_RPC_ERROR_CODES } from '../chunk-BH7MNDWW.js';
3
+ export { BaseTransport, DEFAULT_CLIENT_CAPABILITIES, DEFAULT_CLIENT_INFO, HttpTransport, JSON_RPC_ERROR_CODES, JsonRpcHandler, MCPClient, MCPError, MCPToolAdapter, MCP_METHODS, MCP_PROTOCOL_VERSION, createInitializeParams, createMCPClient, createToolCallParams, createToolsListParams, mcpToolToDefinition, mcpToolsToDefinitions } from '../chunk-BH7MNDWW.js';
4
+ import { __require } from '../chunk-DGUM43GV.js';
5
+
6
+ // src/mcp/client/MCPClientManager.ts
7
+ var MCPClientManager = class {
8
+ constructor(configs, events) {
9
+ this.clients = /* @__PURE__ */ new Map();
10
+ this.configs = configs;
11
+ this.events = events ?? {};
12
+ }
13
+ /**
14
+ * Get the current aggregated state
15
+ */
16
+ getState() {
17
+ const clientStates = {};
18
+ const allTools = [];
19
+ let allConnected = true;
20
+ let anyConnecting = false;
21
+ let anyError = false;
22
+ for (const config of this.configs) {
23
+ if (config.enabled === false) continue;
24
+ const client = this.clients.get(config.name);
25
+ if (client) {
26
+ const state = client.getState();
27
+ clientStates[config.name] = state;
28
+ allTools.push(...state.tools);
29
+ if (state.connectionState !== "connected") {
30
+ allConnected = false;
31
+ }
32
+ if (state.connectionState === "connecting") {
33
+ anyConnecting = true;
34
+ }
35
+ if (state.connectionState === "error") {
36
+ anyError = true;
37
+ }
38
+ } else {
39
+ allConnected = false;
40
+ }
41
+ }
42
+ return {
43
+ clients: clientStates,
44
+ allTools,
45
+ allConnected,
46
+ anyConnecting,
47
+ anyError,
48
+ totalToolCount: allTools.length
49
+ };
50
+ }
51
+ /**
52
+ * Connect all enabled clients
53
+ */
54
+ async connectAll() {
55
+ const connectPromises = [];
56
+ for (const config of this.configs) {
57
+ if (config.enabled === false) continue;
58
+ const promise = this.connect(config.name).catch((error) => {
59
+ console.error(`Failed to connect ${config.name}:`, error);
60
+ this.events.onError?.(
61
+ config.name,
62
+ error instanceof Error ? error : new Error(String(error))
63
+ );
64
+ });
65
+ connectPromises.push(promise);
66
+ }
67
+ await Promise.all(connectPromises);
68
+ const state = this.getState();
69
+ if (state.allConnected) {
70
+ this.events.onAllConnected?.();
71
+ }
72
+ }
73
+ /**
74
+ * Connect a specific client
75
+ */
76
+ async connect(name) {
77
+ const config = this.configs.find((c) => c.name === name);
78
+ if (!config) {
79
+ throw new Error(`Client "${name}" not found in configuration`);
80
+ }
81
+ if (config.enabled === false) {
82
+ throw new Error(`Client "${name}" is disabled`);
83
+ }
84
+ let client = this.clients.get(name);
85
+ if (!client) {
86
+ client = this.createClient(config);
87
+ this.clients.set(name, client);
88
+ }
89
+ await client.connect();
90
+ }
91
+ /**
92
+ * Disconnect all clients
93
+ */
94
+ async disconnectAll() {
95
+ const disconnectPromises = [];
96
+ for (const client of this.clients.values()) {
97
+ disconnectPromises.push(
98
+ client.disconnect().catch((error) => {
99
+ console.error("Error disconnecting client:", error);
100
+ })
101
+ );
102
+ }
103
+ await Promise.all(disconnectPromises);
104
+ this.events.onAllDisconnected?.();
105
+ }
106
+ /**
107
+ * Disconnect a specific client
108
+ */
109
+ async disconnect(name) {
110
+ const client = this.clients.get(name);
111
+ if (client) {
112
+ await client.disconnect();
113
+ }
114
+ }
115
+ /**
116
+ * Get a specific client
117
+ */
118
+ getClient(name) {
119
+ return this.clients.get(name);
120
+ }
121
+ /**
122
+ * Get all connected clients
123
+ */
124
+ getConnectedClients() {
125
+ return Array.from(this.clients.values()).filter((c) => c.isConnected());
126
+ }
127
+ /**
128
+ * Get all tool definitions from all connected clients
129
+ */
130
+ getAllToolDefinitions(options) {
131
+ const tools = [];
132
+ for (const client of this.getConnectedClients()) {
133
+ const clientTools = client.toToolDefinitions({
134
+ prefixToolNames: options?.prefixToolNames ?? true
135
+ });
136
+ tools.push(...clientTools);
137
+ }
138
+ return tools;
139
+ }
140
+ /**
141
+ * Get tool definitions from a specific client
142
+ */
143
+ getToolDefinitions(name, options) {
144
+ const client = this.clients.get(name);
145
+ if (!client || !client.isConnected()) {
146
+ return [];
147
+ }
148
+ return client.toToolDefinitions({
149
+ prefixToolNames: options?.prefixToolNames ?? true
150
+ });
151
+ }
152
+ /**
153
+ * Call a tool on a specific client
154
+ */
155
+ async callTool(clientName, toolName, args) {
156
+ const client = this.clients.get(clientName);
157
+ if (!client) {
158
+ throw new Error(`Client "${clientName}" not found`);
159
+ }
160
+ if (!client.isConnected()) {
161
+ throw new Error(`Client "${clientName}" is not connected`);
162
+ }
163
+ return client.callTool(toolName, args);
164
+ }
165
+ /**
166
+ * Refresh tools for all connected clients
167
+ */
168
+ async refreshAllTools() {
169
+ const refreshPromises = [];
170
+ for (const client of this.getConnectedClients()) {
171
+ refreshPromises.push(
172
+ client.refreshTools().then(() => void 0).catch((error) => {
173
+ console.error("Error refreshing tools:", error);
174
+ })
175
+ );
176
+ }
177
+ await Promise.all(refreshPromises);
178
+ }
179
+ /**
180
+ * Check if a specific client is connected
181
+ */
182
+ isConnected(name) {
183
+ const client = this.clients.get(name);
184
+ return client?.isConnected() ?? false;
185
+ }
186
+ /**
187
+ * Create a client with event forwarding
188
+ */
189
+ createClient(config) {
190
+ const clientEvents = {
191
+ onConnectionStateChange: (state) => {
192
+ this.events.onConnectionStateChange?.(config.name, state);
193
+ const managerState = this.getState();
194
+ if (state === "connected" && managerState.allConnected) {
195
+ this.events.onAllConnected?.();
196
+ }
197
+ },
198
+ onToolsChange: (tools) => {
199
+ this.events.onToolsChange?.(config.name, tools);
200
+ },
201
+ onError: (error) => {
202
+ this.events.onError?.(config.name, error);
203
+ }
204
+ };
205
+ return createMCPClient(config, clientEvents);
206
+ }
207
+ };
208
+ function createMCPClientManager(configs, events) {
209
+ return new MCPClientManager(configs, events);
210
+ }
211
+
212
+ // src/mcp/transports/SSETransport.ts
213
+ var SSETransport = class extends BaseTransport {
214
+ constructor(options) {
215
+ super();
216
+ this.url = options.url;
217
+ this.headers = options.headers ?? {};
218
+ this.timeout = options.timeout ?? 3e4;
219
+ }
220
+ /**
221
+ * Connect to the SSE endpoint
222
+ */
223
+ async connect() {
224
+ if (this.connected) {
225
+ return;
226
+ }
227
+ return new Promise((resolve, reject) => {
228
+ try {
229
+ const sseUrl = new URL(this.url);
230
+ if (this.sessionId) {
231
+ sseUrl.searchParams.set("sessionId", this.sessionId);
232
+ }
233
+ this.eventSource = new EventSource(sseUrl.toString());
234
+ this.eventSource.onopen = () => {
235
+ this.connected = true;
236
+ resolve();
237
+ };
238
+ this.eventSource.onmessage = (event) => {
239
+ this.handleSSEMessage(event.data);
240
+ };
241
+ this.eventSource.addEventListener("message", (event) => {
242
+ this.handleSSEMessage(event.data);
243
+ });
244
+ this.eventSource.addEventListener("endpoint", (event) => {
245
+ try {
246
+ const data = JSON.parse(event.data);
247
+ if (data.endpoint) {
248
+ this.messageEndpoint = data.endpoint;
249
+ }
250
+ if (data.sessionId) {
251
+ this.sessionId = data.sessionId;
252
+ }
253
+ } catch {
254
+ }
255
+ });
256
+ this.eventSource.onerror = (error) => {
257
+ if (!this.connected) {
258
+ reject(new MCPError("SSE connection failed"));
259
+ } else {
260
+ this.emitError(new MCPError("SSE connection error"));
261
+ }
262
+ };
263
+ setTimeout(() => {
264
+ if (!this.connected) {
265
+ this.eventSource?.close();
266
+ reject(new MCPError("SSE connection timeout"));
267
+ }
268
+ }, this.timeout);
269
+ } catch (error) {
270
+ reject(
271
+ error instanceof Error ? error : new MCPError("Failed to create SSE connection")
272
+ );
273
+ }
274
+ });
275
+ }
276
+ /**
277
+ * Disconnect from the SSE endpoint
278
+ */
279
+ async disconnect() {
280
+ if (this.eventSource) {
281
+ this.eventSource.close();
282
+ this.eventSource = void 0;
283
+ }
284
+ this.messageEndpoint = void 0;
285
+ this.sessionId = void 0;
286
+ this.connected = false;
287
+ this.emitClose();
288
+ }
289
+ /**
290
+ * Send a JSON-RPC message via HTTP POST
291
+ */
292
+ async send(message) {
293
+ if (!this.connected) {
294
+ throw new MCPError(
295
+ "Transport not connected",
296
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
297
+ );
298
+ }
299
+ const endpoint = this.messageEndpoint || this.url;
300
+ const headers = {
301
+ "Content-Type": "application/json",
302
+ Accept: "application/json",
303
+ ...this.headers
304
+ };
305
+ if (this.sessionId) {
306
+ headers["Mcp-Session-Id"] = this.sessionId;
307
+ }
308
+ const controller = new AbortController();
309
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
310
+ try {
311
+ const response = await fetch(endpoint, {
312
+ method: "POST",
313
+ headers,
314
+ body: JSON.stringify(message),
315
+ signal: controller.signal
316
+ });
317
+ clearTimeout(timeoutId);
318
+ if (!response.ok) {
319
+ throw new MCPError(
320
+ `HTTP error: ${response.status} ${response.statusText}`,
321
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
322
+ );
323
+ }
324
+ const contentType = response.headers.get("content-type");
325
+ if (contentType?.includes("application/json")) {
326
+ const text = await response.text();
327
+ if (text.trim()) {
328
+ const messages = this.parseResponseText(text);
329
+ for (const msg of messages) {
330
+ this.emitMessage(msg);
331
+ }
332
+ }
333
+ }
334
+ } catch (error) {
335
+ clearTimeout(timeoutId);
336
+ if (error instanceof MCPError) {
337
+ throw error;
338
+ }
339
+ if (error instanceof Error && error.name === "AbortError") {
340
+ throw new MCPError(
341
+ "Request timed out",
342
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
343
+ );
344
+ }
345
+ throw new MCPError(
346
+ `Send failed: ${error instanceof Error ? error.message : "Unknown error"}`,
347
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
348
+ );
349
+ }
350
+ }
351
+ /**
352
+ * Handle an SSE message
353
+ */
354
+ handleSSEMessage(data) {
355
+ try {
356
+ const messages = this.parseResponseText(data);
357
+ for (const msg of messages) {
358
+ this.emitMessage(msg);
359
+ }
360
+ } catch (error) {
361
+ console.warn("Failed to parse SSE message:", error);
362
+ }
363
+ }
364
+ /**
365
+ * Parse response text into JSON-RPC messages
366
+ */
367
+ parseResponseText(text) {
368
+ const trimmed = text.trim();
369
+ if (!trimmed) {
370
+ return [];
371
+ }
372
+ const parsed = JSON.parse(trimmed);
373
+ if (Array.isArray(parsed)) {
374
+ return parsed.filter(
375
+ (msg) => this.isValidJsonRpcMessage(msg)
376
+ );
377
+ }
378
+ if (this.isValidJsonRpcMessage(parsed)) {
379
+ return [parsed];
380
+ }
381
+ return [];
382
+ }
383
+ /**
384
+ * Validate a JSON-RPC message
385
+ */
386
+ isValidJsonRpcMessage(msg) {
387
+ if (!msg || typeof msg !== "object") {
388
+ return false;
389
+ }
390
+ const m = msg;
391
+ if (m.jsonrpc !== "2.0") {
392
+ return false;
393
+ }
394
+ if ("method" in m && typeof m.method === "string") {
395
+ return true;
396
+ }
397
+ if ("id" in m && ("result" in m || "error" in m)) {
398
+ return true;
399
+ }
400
+ return false;
401
+ }
402
+ /**
403
+ * Get the current session ID
404
+ */
405
+ getSessionId() {
406
+ return this.sessionId;
407
+ }
408
+ };
409
+
410
+ // src/mcp/transports/StdioTransport.ts
411
+ var StdioTransport = class extends BaseTransport {
412
+ constructor(options) {
413
+ super();
414
+ this.buffer = "";
415
+ this.command = options.command;
416
+ this.args = options.args ?? [];
417
+ this.env = options.env;
418
+ this.cwd = options.cwd;
419
+ }
420
+ /**
421
+ * Connect by spawning the MCP server process
422
+ */
423
+ async connect() {
424
+ if (this.connected) {
425
+ return;
426
+ }
427
+ if (typeof process === "undefined" || typeof __require === "undefined") {
428
+ throw new MCPError(
429
+ "Stdio transport is only available in Node.js environments",
430
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
431
+ );
432
+ }
433
+ try {
434
+ const childProcess = __require("child_process");
435
+ this.spawn = childProcess.spawn;
436
+ const env = {};
437
+ for (const [key, value] of Object.entries(process.env)) {
438
+ if (value !== void 0) {
439
+ env[key] = value;
440
+ }
441
+ }
442
+ if (this.env) {
443
+ Object.assign(env, this.env);
444
+ }
445
+ this.process = this.spawn(this.command, this.args, {
446
+ env,
447
+ cwd: this.cwd,
448
+ stdio: ["pipe", "pipe", "pipe"]
449
+ });
450
+ if (!this.process.stdin || !this.process.stdout) {
451
+ throw new MCPError(
452
+ "Failed to create stdio pipes",
453
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
454
+ );
455
+ }
456
+ this.process.stdout.on("data", (data) => {
457
+ this.handleData(data.toString());
458
+ });
459
+ this.process.stderr?.on("data", (data) => {
460
+ console.error(`[MCP ${this.command}] ${data.toString()}`);
461
+ });
462
+ this.process.on("error", (err) => {
463
+ const error = err;
464
+ this.emitError(new MCPError(`Process error: ${error.message}`));
465
+ });
466
+ this.process.on("exit", (...args) => {
467
+ const code = args[0];
468
+ if (this.connected) {
469
+ this.connected = false;
470
+ if (code !== 0 && code !== null) {
471
+ this.emitError(new MCPError(`Process exited with code ${code}`));
472
+ }
473
+ this.emitClose();
474
+ }
475
+ });
476
+ await new Promise((resolve, reject) => {
477
+ const timeout = setTimeout(() => {
478
+ reject(new MCPError("Process startup timeout"));
479
+ }, 1e4);
480
+ setTimeout(() => {
481
+ clearTimeout(timeout);
482
+ this.connected = true;
483
+ resolve();
484
+ }, 100);
485
+ });
486
+ } catch (error) {
487
+ throw error instanceof MCPError ? error : new MCPError(
488
+ `Failed to spawn process: ${error instanceof Error ? error.message : "Unknown error"}`,
489
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
490
+ );
491
+ }
492
+ }
493
+ /**
494
+ * Disconnect by killing the process
495
+ */
496
+ async disconnect() {
497
+ if (this.process) {
498
+ this.process.kill("SIGTERM");
499
+ this.process = void 0;
500
+ }
501
+ this.buffer = "";
502
+ this.connected = false;
503
+ this.emitClose();
504
+ }
505
+ /**
506
+ * Send a JSON-RPC message via stdin
507
+ */
508
+ async send(message) {
509
+ if (!this.connected || !this.process?.stdin) {
510
+ throw new MCPError(
511
+ "Transport not connected",
512
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
513
+ );
514
+ }
515
+ const data = JSON.stringify(message) + "\n";
516
+ return new Promise((resolve, reject) => {
517
+ const stdin = this.process.stdin;
518
+ stdin.write(data, (error) => {
519
+ if (error) {
520
+ reject(
521
+ new MCPError(
522
+ `Write error: ${error.message}`,
523
+ JSON_RPC_ERROR_CODES.INTERNAL_ERROR
524
+ )
525
+ );
526
+ } else {
527
+ resolve();
528
+ }
529
+ });
530
+ });
531
+ }
532
+ /**
533
+ * Handle incoming data from stdout
534
+ */
535
+ handleData(data) {
536
+ this.buffer += data;
537
+ const lines = this.buffer.split("\n");
538
+ this.buffer = lines.pop() ?? "";
539
+ for (const line of lines) {
540
+ if (!line.trim()) continue;
541
+ try {
542
+ const message = JSON.parse(line);
543
+ if (this.isValidJsonRpcMessage(message)) {
544
+ this.emitMessage(message);
545
+ }
546
+ } catch (error) {
547
+ console.warn("Failed to parse stdio message:", error);
548
+ }
549
+ }
550
+ }
551
+ /**
552
+ * Validate a JSON-RPC message
553
+ */
554
+ isValidJsonRpcMessage(msg) {
555
+ if (!msg || typeof msg !== "object") {
556
+ return false;
557
+ }
558
+ const m = msg;
559
+ if (m.jsonrpc !== "2.0") {
560
+ return false;
561
+ }
562
+ if ("method" in m && typeof m.method === "string") {
563
+ return true;
564
+ }
565
+ if ("id" in m && ("result" in m || "error" in m)) {
566
+ return true;
567
+ }
568
+ return false;
569
+ }
570
+ };
571
+
572
+ export { MCPClientManager, SSETransport, StdioTransport, createMCPClientManager };
573
+ //# sourceMappingURL=index.js.map
574
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mcp/client/MCPClientManager.ts","../../src/mcp/transports/SSETransport.ts","../../src/mcp/transports/StdioTransport.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * MCP Client Manager\n *\n * Manages multiple MCP client connections simultaneously.\n * Useful for connecting to multiple MCP servers and aggregating their tools.\n */\n\nimport { MCPClient, createMCPClient } from \"./MCPClient\";\nimport type {\n MCPClientConfig,\n MCPClientEvents,\n MCPClientState,\n MCPToolDefinition,\n MCPConnectionState,\n} from \"../types\";\nimport type { ToolDefinition } from \"../../core/types/tools\";\n\n/**\n * MCP Client Manager configuration for a single client\n */\nexport interface MCPManagedClientConfig extends MCPClientConfig {\n /** Enable this client (default: true) */\n enabled?: boolean;\n}\n\n/**\n * MCP Client Manager events\n */\nexport interface MCPClientManagerEvents {\n /** Called when any client's connection state changes */\n onConnectionStateChange?: (\n clientName: string,\n state: MCPConnectionState,\n ) => void;\n /** Called when any client's tools change */\n onToolsChange?: (clientName: string, tools: MCPToolDefinition[]) => void;\n /** Called when any client encounters an error */\n onError?: (clientName: string, error: Error) => void;\n /** Called when all clients are connected */\n onAllConnected?: () => void;\n /** Called when all clients are disconnected */\n onAllDisconnected?: () => void;\n}\n\n/**\n * Aggregated state for all managed clients\n */\nexport interface MCPClientManagerState {\n /** Individual client states */\n clients: Record<string, MCPClientState>;\n /** All tools from all connected clients */\n allTools: MCPToolDefinition[];\n /** Whether all enabled clients are connected */\n allConnected: boolean;\n /** Whether any client is connecting */\n anyConnecting: boolean;\n /** Whether any client has an error */\n anyError: boolean;\n /** Total number of tools across all clients */\n totalToolCount: number;\n}\n\n/**\n * MCP Client Manager\n *\n * Manages multiple MCP client connections for scenarios where you need\n * to connect to multiple MCP servers simultaneously.\n *\n * @example\n * ```typescript\n * const manager = new MCPClientManager([\n * { name: \"github\", transport: \"http\", url: \"https://mcp.github.com\" },\n * { name: \"slack\", transport: \"http\", url: \"https://mcp.slack.com\" },\n * { name: \"filesystem\", transport: \"stdio\", command: \"npx\", args: [\"-y\", \"@anthropic/filesystem-mcp-server\"] },\n * ]);\n *\n * await manager.connectAll();\n *\n * // Get all tools from all clients\n * const tools = manager.getAllToolDefinitions();\n *\n * // Call a tool on a specific client\n * const result = await manager.callTool(\"github\", \"create_issue\", { title: \"Bug\" });\n *\n * await manager.disconnectAll();\n * ```\n */\nexport class MCPClientManager {\n private clients = new Map<string, MCPClient>();\n private configs: MCPManagedClientConfig[];\n private events: MCPClientManagerEvents;\n\n constructor(\n configs: MCPManagedClientConfig[],\n events?: MCPClientManagerEvents,\n ) {\n this.configs = configs;\n this.events = events ?? {};\n }\n\n /**\n * Get the current aggregated state\n */\n getState(): MCPClientManagerState {\n const clientStates: Record<string, MCPClientState> = {};\n const allTools: MCPToolDefinition[] = [];\n let allConnected = true;\n let anyConnecting = false;\n let anyError = false;\n\n for (const config of this.configs) {\n if (config.enabled === false) continue;\n\n const client = this.clients.get(config.name);\n if (client) {\n const state = client.getState();\n clientStates[config.name] = state;\n allTools.push(...state.tools);\n\n if (state.connectionState !== \"connected\") {\n allConnected = false;\n }\n if (state.connectionState === \"connecting\") {\n anyConnecting = true;\n }\n if (state.connectionState === \"error\") {\n anyError = true;\n }\n } else {\n allConnected = false;\n }\n }\n\n return {\n clients: clientStates,\n allTools,\n allConnected,\n anyConnecting,\n anyError,\n totalToolCount: allTools.length,\n };\n }\n\n /**\n * Connect all enabled clients\n */\n async connectAll(): Promise<void> {\n const connectPromises: Promise<void>[] = [];\n\n for (const config of this.configs) {\n if (config.enabled === false) continue;\n\n const promise = this.connect(config.name).catch((error) => {\n // Log but don't fail other connections\n console.error(`Failed to connect ${config.name}:`, error);\n this.events.onError?.(\n config.name,\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n\n connectPromises.push(promise);\n }\n\n await Promise.all(connectPromises);\n\n // Check if all connected\n const state = this.getState();\n if (state.allConnected) {\n this.events.onAllConnected?.();\n }\n }\n\n /**\n * Connect a specific client\n */\n async connect(name: string): Promise<void> {\n const config = this.configs.find((c) => c.name === name);\n if (!config) {\n throw new Error(`Client \"${name}\" not found in configuration`);\n }\n\n if (config.enabled === false) {\n throw new Error(`Client \"${name}\" is disabled`);\n }\n\n // Create client if it doesn't exist\n let client = this.clients.get(name);\n if (!client) {\n client = this.createClient(config);\n this.clients.set(name, client);\n }\n\n await client.connect();\n }\n\n /**\n * Disconnect all clients\n */\n async disconnectAll(): Promise<void> {\n const disconnectPromises: Promise<void>[] = [];\n\n for (const client of this.clients.values()) {\n disconnectPromises.push(\n client.disconnect().catch((error) => {\n console.error(\"Error disconnecting client:\", error);\n }),\n );\n }\n\n await Promise.all(disconnectPromises);\n this.events.onAllDisconnected?.();\n }\n\n /**\n * Disconnect a specific client\n */\n async disconnect(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (client) {\n await client.disconnect();\n }\n }\n\n /**\n * Get a specific client\n */\n getClient(name: string): MCPClient | undefined {\n return this.clients.get(name);\n }\n\n /**\n * Get all connected clients\n */\n getConnectedClients(): MCPClient[] {\n return Array.from(this.clients.values()).filter((c) => c.isConnected());\n }\n\n /**\n * Get all tool definitions from all connected clients\n */\n getAllToolDefinitions(options?: {\n prefixToolNames?: boolean;\n }): ToolDefinition[] {\n const tools: ToolDefinition[] = [];\n\n for (const client of this.getConnectedClients()) {\n const clientTools = client.toToolDefinitions({\n prefixToolNames: options?.prefixToolNames ?? true,\n });\n tools.push(...clientTools);\n }\n\n return tools;\n }\n\n /**\n * Get tool definitions from a specific client\n */\n getToolDefinitions(\n name: string,\n options?: { prefixToolNames?: boolean },\n ): ToolDefinition[] {\n const client = this.clients.get(name);\n if (!client || !client.isConnected()) {\n return [];\n }\n\n return client.toToolDefinitions({\n prefixToolNames: options?.prefixToolNames ?? true,\n });\n }\n\n /**\n * Call a tool on a specific client\n */\n async callTool(\n clientName: string,\n toolName: string,\n args?: Record<string, unknown>,\n ): Promise<import(\"../types\").MCPToolCallResult> {\n const client = this.clients.get(clientName);\n if (!client) {\n throw new Error(`Client \"${clientName}\" not found`);\n }\n\n if (!client.isConnected()) {\n throw new Error(`Client \"${clientName}\" is not connected`);\n }\n\n return client.callTool(toolName, args);\n }\n\n /**\n * Refresh tools for all connected clients\n */\n async refreshAllTools(): Promise<void> {\n const refreshPromises: Promise<void>[] = [];\n\n for (const client of this.getConnectedClients()) {\n refreshPromises.push(\n client\n .refreshTools()\n .then(() => undefined)\n .catch((error) => {\n console.error(\"Error refreshing tools:\", error);\n }),\n );\n }\n\n await Promise.all(refreshPromises);\n }\n\n /**\n * Check if a specific client is connected\n */\n isConnected(name: string): boolean {\n const client = this.clients.get(name);\n return client?.isConnected() ?? false;\n }\n\n /**\n * Create a client with event forwarding\n */\n private createClient(config: MCPManagedClientConfig): MCPClient {\n const clientEvents: MCPClientEvents = {\n onConnectionStateChange: (state) => {\n this.events.onConnectionStateChange?.(config.name, state);\n\n // Check for all connected/disconnected\n const managerState = this.getState();\n if (state === \"connected\" && managerState.allConnected) {\n this.events.onAllConnected?.();\n }\n },\n onToolsChange: (tools) => {\n this.events.onToolsChange?.(config.name, tools);\n },\n onError: (error) => {\n this.events.onError?.(config.name, error);\n },\n };\n\n return createMCPClient(config, clientEvents);\n }\n}\n\n/**\n * Create an MCP Client Manager\n */\nexport function createMCPClientManager(\n configs: MCPManagedClientConfig[],\n events?: MCPClientManagerEvents,\n): MCPClientManager {\n return new MCPClientManager(configs, events);\n}\n","/**\n * SSE (Server-Sent Events) Transport for MCP\n *\n * Implements SSE transport for MCP servers that prefer server-push\n * communication. Sends requests via HTTP POST and receives responses\n * and notifications via SSE.\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcMessage,\n} from \"../types\";\nimport { MCPError, JSON_RPC_ERROR_CODES } from \"../types\";\nimport { BaseTransport, type SSETransportOptions } from \"./types\";\n\n/**\n * SSE Transport\n *\n * Uses HTTP POST for sending requests and Server-Sent Events for\n * receiving responses and server-initiated notifications.\n */\nexport class SSETransport extends BaseTransport {\n private url: string;\n private headers: Record<string, string>;\n private timeout: number;\n private eventSource?: EventSource;\n private messageEndpoint?: string;\n private sessionId?: string;\n\n constructor(options: SSETransportOptions) {\n super();\n this.url = options.url;\n this.headers = options.headers ?? {};\n this.timeout = options.timeout ?? 30000;\n }\n\n /**\n * Connect to the SSE endpoint\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Create EventSource for receiving messages\n // Note: EventSource doesn't support custom headers natively\n // The URL should include auth via query params if needed\n const sseUrl = new URL(this.url);\n\n // Add any session ID if we have one\n if (this.sessionId) {\n sseUrl.searchParams.set(\"sessionId\", this.sessionId);\n }\n\n this.eventSource = new EventSource(sseUrl.toString());\n\n // Handle SSE connection open\n this.eventSource.onopen = () => {\n this.connected = true;\n resolve();\n };\n\n // Handle incoming messages\n this.eventSource.onmessage = (event) => {\n this.handleSSEMessage(event.data);\n };\n\n // Handle named events\n this.eventSource.addEventListener(\"message\", (event: MessageEvent) => {\n this.handleSSEMessage(event.data);\n });\n\n // Handle endpoint event (server tells us where to send requests)\n this.eventSource.addEventListener(\"endpoint\", (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data);\n if (data.endpoint) {\n this.messageEndpoint = data.endpoint;\n }\n if (data.sessionId) {\n this.sessionId = data.sessionId;\n }\n } catch {\n // Ignore parse errors\n }\n });\n\n // Handle errors\n this.eventSource.onerror = (error) => {\n if (!this.connected) {\n reject(new MCPError(\"SSE connection failed\"));\n } else {\n this.emitError(new MCPError(\"SSE connection error\"));\n }\n };\n\n // Set a connection timeout\n setTimeout(() => {\n if (!this.connected) {\n this.eventSource?.close();\n reject(new MCPError(\"SSE connection timeout\"));\n }\n }, this.timeout);\n } catch (error) {\n reject(\n error instanceof Error\n ? error\n : new MCPError(\"Failed to create SSE connection\"),\n );\n }\n });\n }\n\n /**\n * Disconnect from the SSE endpoint\n */\n async disconnect(): Promise<void> {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = undefined;\n }\n this.messageEndpoint = undefined;\n this.sessionId = undefined;\n this.connected = false;\n this.emitClose();\n }\n\n /**\n * Send a JSON-RPC message via HTTP POST\n */\n async send(message: JsonRpcRequest | JsonRpcNotification): Promise<void> {\n if (!this.connected) {\n throw new MCPError(\n \"Transport not connected\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n // Use the endpoint provided by server, or fall back to base URL\n const endpoint = this.messageEndpoint || this.url;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...this.headers,\n };\n\n // Include session ID if available\n if (this.sessionId) {\n headers[\"Mcp-Session-Id\"] = this.sessionId;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(message),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new MCPError(\n `HTTP error: ${response.status} ${response.statusText}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n // Check for response body (some requests may have sync responses)\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const text = await response.text();\n if (text.trim()) {\n const messages = this.parseResponseText(text);\n for (const msg of messages) {\n this.emitMessage(msg);\n }\n }\n }\n\n // Main response will come via SSE\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof MCPError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new MCPError(\n \"Request timed out\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n throw new MCPError(\n `Send failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n }\n\n /**\n * Handle an SSE message\n */\n private handleSSEMessage(data: string): void {\n try {\n const messages = this.parseResponseText(data);\n for (const msg of messages) {\n this.emitMessage(msg);\n }\n } catch (error) {\n // Log but don't crash on parse errors\n console.warn(\"Failed to parse SSE message:\", error);\n }\n }\n\n /**\n * Parse response text into JSON-RPC messages\n */\n private parseResponseText(text: string): JsonRpcMessage[] {\n const trimmed = text.trim();\n if (!trimmed) {\n return [];\n }\n\n const parsed = JSON.parse(trimmed);\n\n // Check if it's a batch (array)\n if (Array.isArray(parsed)) {\n return parsed.filter((msg): msg is JsonRpcMessage =>\n this.isValidJsonRpcMessage(msg),\n );\n }\n\n // Single message\n if (this.isValidJsonRpcMessage(parsed)) {\n return [parsed];\n }\n\n return [];\n }\n\n /**\n * Validate a JSON-RPC message\n */\n private isValidJsonRpcMessage(msg: unknown): msg is JsonRpcMessage {\n if (!msg || typeof msg !== \"object\") {\n return false;\n }\n\n const m = msg as Record<string, unknown>;\n if (m.jsonrpc !== \"2.0\") {\n return false;\n }\n\n // Request or notification\n if (\"method\" in m && typeof m.method === \"string\") {\n return true;\n }\n\n // Response\n if (\"id\" in m && (\"result\" in m || \"error\" in m)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n}\n","/**\n * Stdio Transport for MCP\n *\n * Implements stdio transport for local MCP servers.\n * This transport spawns a child process and communicates via stdin/stdout.\n *\n * NOTE: This transport only works in Node.js environments (server-side).\n * It will not work in browser environments.\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcMessage,\n} from \"../types\";\nimport { MCPError, JSON_RPC_ERROR_CODES } from \"../types\";\nimport { BaseTransport, type StdioTransportOptions } from \"./types\";\n\n// Dynamic import type for Node.js child_process\ntype ChildProcess = {\n stdin: NodeJS.WritableStream | null;\n stdout: NodeJS.ReadableStream | null;\n stderr: NodeJS.ReadableStream | null;\n kill: (signal?: string) => boolean;\n on: (event: string, listener: (...args: unknown[]) => void) => void;\n};\n\ntype SpawnFunction = (\n command: string,\n args?: string[],\n options?: {\n env?: Record<string, string>;\n cwd?: string;\n stdio?: string[];\n },\n) => ChildProcess;\n\n/**\n * Stdio Transport\n *\n * Spawns a local MCP server process and communicates via stdin/stdout\n * using newline-delimited JSON.\n *\n * @example\n * ```typescript\n * const transport = new StdioTransport({\n * command: \"npx\",\n * args: [\"-y\", \"@anthropic/filesystem-mcp-server\", \"/path/to/dir\"],\n * });\n *\n * await transport.connect();\n * await transport.send({ jsonrpc: \"2.0\", method: \"initialize\", ... });\n * ```\n */\nexport class StdioTransport extends BaseTransport {\n private command: string;\n private args: string[];\n private env?: Record<string, string>;\n private cwd?: string;\n private process?: ChildProcess;\n private buffer = \"\";\n private spawn?: SpawnFunction;\n\n constructor(options: StdioTransportOptions) {\n super();\n this.command = options.command;\n this.args = options.args ?? [];\n this.env = options.env;\n this.cwd = options.cwd;\n }\n\n /**\n * Connect by spawning the MCP server process\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n // Check if we're in a Node.js environment\n if (typeof process === \"undefined\" || typeof require === \"undefined\") {\n throw new MCPError(\n \"Stdio transport is only available in Node.js environments\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n try {\n // Dynamically import child_process (only available in Node.js)\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const childProcess = require(\"child_process\");\n this.spawn = childProcess.spawn;\n\n // Build environment, filtering out undefined values\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n env[key] = value;\n }\n }\n if (this.env) {\n Object.assign(env, this.env);\n }\n\n // Spawn the MCP server process\n this.process = this.spawn!(this.command, this.args, {\n env,\n cwd: this.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (!this.process.stdin || !this.process.stdout) {\n throw new MCPError(\n \"Failed to create stdio pipes\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n // Handle stdout data\n this.process.stdout.on(\"data\", (data: Buffer) => {\n this.handleData(data.toString());\n });\n\n // Handle stderr (log for debugging)\n this.process.stderr?.on(\"data\", (data: Buffer) => {\n console.error(`[MCP ${this.command}] ${data.toString()}`);\n });\n\n // Handle process errors\n this.process.on(\"error\", (err: unknown) => {\n const error = err as Error;\n this.emitError(new MCPError(`Process error: ${error.message}`));\n });\n\n // Handle process exit\n this.process.on(\"exit\", (...args: unknown[]) => {\n const code = args[0] as number | null;\n if (this.connected) {\n this.connected = false;\n if (code !== 0 && code !== null) {\n this.emitError(new MCPError(`Process exited with code ${code}`));\n }\n this.emitClose();\n }\n });\n\n // Wait a bit for process to initialize\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new MCPError(\"Process startup timeout\"));\n }, 10000);\n\n // Consider connected once we have the process running\n // The actual MCP initialization happens at a higher level\n setTimeout(() => {\n clearTimeout(timeout);\n this.connected = true;\n resolve();\n }, 100);\n });\n } catch (error) {\n throw error instanceof MCPError\n ? error\n : new MCPError(\n `Failed to spawn process: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n }\n\n /**\n * Disconnect by killing the process\n */\n async disconnect(): Promise<void> {\n if (this.process) {\n this.process.kill(\"SIGTERM\");\n this.process = undefined;\n }\n this.buffer = \"\";\n this.connected = false;\n this.emitClose();\n }\n\n /**\n * Send a JSON-RPC message via stdin\n */\n async send(message: JsonRpcRequest | JsonRpcNotification): Promise<void> {\n if (!this.connected || !this.process?.stdin) {\n throw new MCPError(\n \"Transport not connected\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n // Serialize message with newline delimiter\n const data = JSON.stringify(message) + \"\\n\";\n\n return new Promise((resolve, reject) => {\n const stdin = this.process!.stdin as NodeJS.WritableStream;\n stdin.write(data, (error) => {\n if (error) {\n reject(\n new MCPError(\n `Write error: ${error.message}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n ),\n );\n } else {\n resolve();\n }\n });\n });\n }\n\n /**\n * Handle incoming data from stdout\n */\n private handleData(data: string): void {\n this.buffer += data;\n\n // Process complete lines (newline-delimited JSON)\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const message = JSON.parse(line);\n if (this.isValidJsonRpcMessage(message)) {\n this.emitMessage(message);\n }\n } catch (error) {\n // Log but don't crash on parse errors\n console.warn(\"Failed to parse stdio message:\", error);\n }\n }\n }\n\n /**\n * Validate a JSON-RPC message\n */\n private isValidJsonRpcMessage(msg: unknown): msg is JsonRpcMessage {\n if (!msg || typeof msg !== \"object\") {\n return false;\n }\n\n const m = msg as Record<string, unknown>;\n if (m.jsonrpc !== \"2.0\") {\n return false;\n }\n\n // Request or notification\n if (\"method\" in m && typeof m.method === \"string\") {\n return true;\n }\n\n // Response\n if (\"id\" in m && (\"result\" in m || \"error\" in m)) {\n return true;\n }\n\n return false;\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var chunkGANCV72Z_cjs = require('./chunk-GANCV72Z.cjs');
4
+ require('./chunk-JEQ2X3Z6.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "openaiProvider", {
9
+ enumerable: true,
10
+ get: function () { return chunkGANCV72Z_cjs.openaiProvider; }
11
+ });
12
+ Object.defineProperty(exports, "searchOpenAI", {
13
+ enumerable: true,
14
+ get: function () { return chunkGANCV72Z_cjs.searchOpenAI; }
15
+ });
16
+ Object.defineProperty(exports, "validateOpenAIConfig", {
17
+ enumerable: true,
18
+ get: function () { return chunkGANCV72Z_cjs.validateOpenAIConfig; }
19
+ });
20
+ //# sourceMappingURL=openai-6KTCQ7PZ.cjs.map
21
+ //# sourceMappingURL=openai-6KTCQ7PZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"openai-6KTCQ7PZ.cjs"}