@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.
- package/README.md +42 -0
- package/dist/{ThreadManager-JT0sqSSD.d.ts → ThreadManager-Dkp_eLty.d.ts} +1 -1
- package/dist/{ThreadManager-CUq5Ocu2.d.cts → ThreadManager-LfFRhr4e.d.cts} +1 -1
- package/dist/anthropic-6F5GRE3B.js +4 -0
- package/dist/anthropic-6F5GRE3B.js.map +1 -0
- package/dist/anthropic-DGalr_Fw.d.cts +17 -0
- package/dist/anthropic-DkCEDYOt.d.ts +17 -0
- package/dist/anthropic-NMTRABEH.cjs +21 -0
- package/dist/anthropic-NMTRABEH.cjs.map +1 -0
- package/dist/brave-DdnWb7Gb.d.cts +17 -0
- package/dist/brave-DsI9n7Wr.d.ts +17 -0
- package/dist/brave-OYKCOZEM.cjs +21 -0
- package/dist/brave-OYKCOZEM.cjs.map +1 -0
- package/dist/brave-XSASGGH2.js +4 -0
- package/dist/brave-XSASGGH2.js.map +1 -0
- package/dist/chunk-2FAWEBZS.cjs +88 -0
- package/dist/chunk-2FAWEBZS.cjs.map +1 -0
- package/dist/chunk-53UGJNHN.js +92 -0
- package/dist/chunk-53UGJNHN.js.map +1 -0
- package/dist/chunk-6T5XXJEP.cjs +80 -0
- package/dist/chunk-6T5XXJEP.cjs.map +1 -0
- package/dist/chunk-7K7HZMP4.cjs +1170 -0
- package/dist/chunk-7K7HZMP4.cjs.map +1 -0
- package/dist/chunk-7W7QLZNC.js +72 -0
- package/dist/chunk-7W7QLZNC.js.map +1 -0
- package/dist/{chunk-JM7PB2LP.js → chunk-7XFFRV7D.js} +10 -66
- package/dist/chunk-7XFFRV7D.js.map +1 -0
- package/dist/chunk-ASV6JLYG.cjs +99 -0
- package/dist/chunk-ASV6JLYG.cjs.map +1 -0
- package/dist/chunk-BH7MNDWW.js +1152 -0
- package/dist/chunk-BH7MNDWW.js.map +1 -0
- package/dist/chunk-BKO7DSPU.js +67 -0
- package/dist/chunk-BKO7DSPU.js.map +1 -0
- package/dist/chunk-CBAHCI4R.cjs +76 -0
- package/dist/chunk-CBAHCI4R.cjs.map +1 -0
- package/dist/chunk-CEKAYA2Q.cjs +74 -0
- package/dist/chunk-CEKAYA2Q.cjs.map +1 -0
- package/dist/chunk-CEOMTQTP.js +85 -0
- package/dist/chunk-CEOMTQTP.js.map +1 -0
- package/dist/chunk-DABZYCVX.js +84 -0
- package/dist/chunk-DABZYCVX.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-G4SF2PNQ.js +33 -0
- package/dist/chunk-G4SF2PNQ.js.map +1 -0
- package/dist/chunk-GANCV72Z.cjs +110 -0
- package/dist/chunk-GANCV72Z.cjs.map +1 -0
- package/dist/{chunk-BLSI67J6.cjs → chunk-H5XMKBBA.cjs} +425 -30
- package/dist/chunk-H5XMKBBA.cjs.map +1 -0
- package/dist/{chunk-CJ7UWN2Y.js → chunk-IXFV6AW6.js} +397 -7
- package/dist/chunk-IXFV6AW6.js.map +1 -0
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
- package/dist/chunk-JO4BHPAD.cjs +40 -0
- package/dist/chunk-JO4BHPAD.cjs.map +1 -0
- package/dist/chunk-MEBXW75C.cjs +89 -0
- package/dist/chunk-MEBXW75C.cjs.map +1 -0
- package/dist/chunk-MNDGIW47.js +76 -0
- package/dist/chunk-MNDGIW47.js.map +1 -0
- package/dist/chunk-PPFHA6IL.js +83 -0
- package/dist/chunk-PPFHA6IL.js.map +1 -0
- package/dist/chunk-RQ74USYU.js +128 -0
- package/dist/chunk-RQ74USYU.js.map +1 -0
- package/dist/chunk-TXLIY7GF.cjs +132 -0
- package/dist/chunk-TXLIY7GF.cjs.map +1 -0
- package/dist/chunk-UIWFYMAO.cjs +82 -0
- package/dist/chunk-UIWFYMAO.cjs.map +1 -0
- package/dist/{chunk-4PRWNAXQ.cjs → chunk-UOWLKFXK.cjs} +27 -89
- package/dist/chunk-UOWLKFXK.cjs.map +1 -0
- package/dist/chunk-VD74IPKB.js +106 -0
- package/dist/chunk-VD74IPKB.js.map +1 -0
- package/dist/chunk-W73FBYIH.cjs +87 -0
- package/dist/chunk-W73FBYIH.cjs.map +1 -0
- package/dist/chunk-XGITAEXU.js +93 -0
- package/dist/chunk-XGITAEXU.js.map +1 -0
- package/dist/chunk-XWOHNY3F.cjs +96 -0
- package/dist/chunk-XWOHNY3F.cjs.map +1 -0
- package/dist/chunk-ZPYQDMUX.js +79 -0
- package/dist/chunk-ZPYQDMUX.js.map +1 -0
- package/dist/core/index.cjs +156 -84
- package/dist/core/index.d.cts +16 -4
- package/dist/core/index.d.ts +16 -4
- package/dist/core/index.js +13 -1
- package/dist/exa-72KFY5A7.cjs +21 -0
- package/dist/exa-72KFY5A7.cjs.map +1 -0
- package/dist/exa-Dp9U-WTc.d.ts +17 -0
- package/dist/exa-NNVPBC2M.js +4 -0
- package/dist/exa-NNVPBC2M.js.map +1 -0
- package/dist/exa-jJSPhyUW.d.cts +17 -0
- package/dist/google-CHU2yycE.d.cts +17 -0
- package/dist/google-CTEK6SV2.js +4 -0
- package/dist/google-CTEK6SV2.js.map +1 -0
- package/dist/google-Da8IQxaI.d.ts +17 -0
- package/dist/google-IIUXFFVF.cjs +21 -0
- package/dist/google-IIUXFFVF.cjs.map +1 -0
- package/dist/index-2VtgKM8S.d.cts +206 -0
- package/dist/index-pWEH7pUE.d.ts +206 -0
- package/dist/mcp/index.cjs +670 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +779 -0
- package/dist/mcp/index.d.ts +779 -0
- package/dist/mcp/index.js +574 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/openai-6KTCQ7PZ.cjs +21 -0
- package/dist/openai-6KTCQ7PZ.cjs.map +1 -0
- package/dist/openai-7W2PCNW5.js +4 -0
- package/dist/openai-7W2PCNW5.js.map +1 -0
- package/dist/openai-Cam8hF4f.d.ts +17 -0
- package/dist/openai-HVSCuXgO.d.cts +17 -0
- package/dist/react/index.cjs +75 -42
- package/dist/react/index.d.cts +270 -45
- package/dist/react/index.d.ts +270 -45
- package/dist/react/index.js +15 -2
- package/dist/searxng-AXLVGY7Z.js +4 -0
- package/dist/searxng-AXLVGY7Z.js.map +1 -0
- package/dist/searxng-EJKNY236.cjs +21 -0
- package/dist/searxng-EJKNY236.cjs.map +1 -0
- package/dist/searxng-K0qtY9vp.d.ts +17 -0
- package/dist/searxng-QGOte_Gq.d.cts +17 -0
- package/dist/serper-3JYJHJX6.js +4 -0
- package/dist/serper-3JYJHJX6.js.map +1 -0
- package/dist/serper-63FT4AOL.cjs +21 -0
- package/dist/serper-63FT4AOL.cjs.map +1 -0
- package/dist/serper-7Czya3PW.d.ts +17 -0
- package/dist/serper-JzdaSnS9.d.cts +17 -0
- package/dist/styles.css +38 -0
- package/dist/tavily-AWFP4RM7.cjs +21 -0
- package/dist/tavily-AWFP4RM7.cjs.map +1 -0
- package/dist/tavily-C8cXXojE.d.cts +17 -0
- package/dist/tavily-CIWAAZPH.js +4 -0
- package/dist/tavily-CIWAAZPH.js.map +1 -0
- package/dist/tavily-DdSGVgkE.d.ts +17 -0
- package/dist/themes/catppuccin.css +2 -0
- package/dist/themes/claude.css +2 -0
- package/dist/themes/linear.css +2 -0
- package/dist/themes/modern-minimal.css +2 -0
- package/dist/themes/posthog.css +2 -0
- package/dist/themes/supabase.css +2 -0
- package/dist/themes/twitter.css +2 -0
- package/dist/themes/vercel.css +2 -0
- package/dist/tools/anthropic/index.cjs +61 -0
- package/dist/tools/anthropic/index.cjs.map +1 -0
- package/dist/tools/anthropic/index.d.cts +67 -0
- package/dist/tools/anthropic/index.d.ts +67 -0
- package/dist/tools/anthropic/index.js +56 -0
- package/dist/tools/anthropic/index.js.map +1 -0
- package/dist/tools/brave/index.cjs +85 -0
- package/dist/tools/brave/index.cjs.map +1 -0
- package/dist/tools/brave/index.d.cts +91 -0
- package/dist/tools/brave/index.d.ts +91 -0
- package/dist/tools/brave/index.js +80 -0
- package/dist/tools/brave/index.js.map +1 -0
- package/dist/tools/exa/index.cjs +90 -0
- package/dist/tools/exa/index.cjs.map +1 -0
- package/dist/tools/exa/index.d.cts +92 -0
- package/dist/tools/exa/index.d.ts +92 -0
- package/dist/tools/exa/index.js +85 -0
- package/dist/tools/exa/index.js.map +1 -0
- package/dist/tools/google/index.cjs +81 -0
- package/dist/tools/google/index.cjs.map +1 -0
- package/dist/tools/google/index.d.cts +81 -0
- package/dist/tools/google/index.d.ts +81 -0
- package/dist/tools/google/index.js +76 -0
- package/dist/tools/google/index.js.map +1 -0
- package/dist/tools/openai/index.cjs +83 -0
- package/dist/tools/openai/index.cjs.map +1 -0
- package/dist/tools/openai/index.d.cts +84 -0
- package/dist/tools/openai/index.d.ts +84 -0
- package/dist/tools/openai/index.js +78 -0
- package/dist/tools/openai/index.js.map +1 -0
- package/dist/tools/searxng/index.cjs +85 -0
- package/dist/tools/searxng/index.cjs.map +1 -0
- package/dist/tools/searxng/index.d.cts +91 -0
- package/dist/tools/searxng/index.d.ts +91 -0
- package/dist/tools/searxng/index.js +80 -0
- package/dist/tools/searxng/index.js.map +1 -0
- package/dist/tools/serper/index.cjs +85 -0
- package/dist/tools/serper/index.cjs.map +1 -0
- package/dist/tools/serper/index.d.cts +91 -0
- package/dist/tools/serper/index.d.ts +91 -0
- package/dist/tools/serper/index.js +80 -0
- package/dist/tools/serper/index.js.map +1 -0
- package/dist/tools/tavily/index.cjs +91 -0
- package/dist/tools/tavily/index.cjs.map +1 -0
- package/dist/tools/tavily/index.d.cts +95 -0
- package/dist/tools/tavily/index.d.ts +95 -0
- package/dist/tools/tavily/index.js +86 -0
- package/dist/tools/tavily/index.js.map +1 -0
- package/dist/tools/web-search/index.cjs +31 -0
- package/dist/tools/web-search/index.cjs.map +1 -0
- package/dist/tools/web-search/index.d.cts +3 -0
- package/dist/tools/web-search/index.d.ts +3 -0
- package/dist/tools/web-search/index.js +14 -0
- package/dist/tools/web-search/index.js.map +1 -0
- package/dist/{types-BtAaOV07.d.cts → tools-DDWrco4h.d.cts} +43 -367
- package/dist/{types-BtAaOV07.d.ts → tools-DDWrco4h.d.ts} +43 -367
- package/dist/types-B20VCJXL.d.cts +347 -0
- package/dist/types-B20VCJXL.d.ts +347 -0
- package/dist/types-Cizh9K_f.d.ts +441 -0
- package/dist/types-DG2ya08y.d.cts +367 -0
- package/dist/types-DG2ya08y.d.ts +367 -0
- package/dist/types-DjSfYNKj.d.cts +441 -0
- package/dist/types-ZguuKEs_.d.cts +127 -0
- package/dist/types-ZguuKEs_.d.ts +127 -0
- package/dist/ui/index.cjs +1075 -148
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.d.cts +410 -4
- package/dist/ui/index.d.ts +410 -4
- package/dist/ui/index.js +1007 -96
- package/dist/ui/index.js.map +1 -1
- package/package.json +52 -2
- package/dist/chunk-4PRWNAXQ.cjs.map +0 -1
- package/dist/chunk-BLSI67J6.cjs.map +0 -1
- package/dist/chunk-CJ7UWN2Y.js.map +0 -1
- package/dist/chunk-JM7PB2LP.js.map +0 -1
|
@@ -0,0 +1,670 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJO4BHPAD_cjs = require('../chunk-JO4BHPAD.cjs');
|
|
4
|
+
var chunk7K7HZMP4_cjs = require('../chunk-7K7HZMP4.cjs');
|
|
5
|
+
var chunkJEQ2X3Z6_cjs = require('../chunk-JEQ2X3Z6.cjs');
|
|
6
|
+
|
|
7
|
+
// src/mcp/client/MCPClientManager.ts
|
|
8
|
+
var MCPClientManager = class {
|
|
9
|
+
constructor(configs, events) {
|
|
10
|
+
this.clients = /* @__PURE__ */ new Map();
|
|
11
|
+
this.configs = configs;
|
|
12
|
+
this.events = events ?? {};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get the current aggregated state
|
|
16
|
+
*/
|
|
17
|
+
getState() {
|
|
18
|
+
const clientStates = {};
|
|
19
|
+
const allTools = [];
|
|
20
|
+
let allConnected = true;
|
|
21
|
+
let anyConnecting = false;
|
|
22
|
+
let anyError = false;
|
|
23
|
+
for (const config of this.configs) {
|
|
24
|
+
if (config.enabled === false) continue;
|
|
25
|
+
const client = this.clients.get(config.name);
|
|
26
|
+
if (client) {
|
|
27
|
+
const state = client.getState();
|
|
28
|
+
clientStates[config.name] = state;
|
|
29
|
+
allTools.push(...state.tools);
|
|
30
|
+
if (state.connectionState !== "connected") {
|
|
31
|
+
allConnected = false;
|
|
32
|
+
}
|
|
33
|
+
if (state.connectionState === "connecting") {
|
|
34
|
+
anyConnecting = true;
|
|
35
|
+
}
|
|
36
|
+
if (state.connectionState === "error") {
|
|
37
|
+
anyError = true;
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
allConnected = false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
clients: clientStates,
|
|
45
|
+
allTools,
|
|
46
|
+
allConnected,
|
|
47
|
+
anyConnecting,
|
|
48
|
+
anyError,
|
|
49
|
+
totalToolCount: allTools.length
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Connect all enabled clients
|
|
54
|
+
*/
|
|
55
|
+
async connectAll() {
|
|
56
|
+
const connectPromises = [];
|
|
57
|
+
for (const config of this.configs) {
|
|
58
|
+
if (config.enabled === false) continue;
|
|
59
|
+
const promise = this.connect(config.name).catch((error) => {
|
|
60
|
+
console.error(`Failed to connect ${config.name}:`, error);
|
|
61
|
+
this.events.onError?.(
|
|
62
|
+
config.name,
|
|
63
|
+
error instanceof Error ? error : new Error(String(error))
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
connectPromises.push(promise);
|
|
67
|
+
}
|
|
68
|
+
await Promise.all(connectPromises);
|
|
69
|
+
const state = this.getState();
|
|
70
|
+
if (state.allConnected) {
|
|
71
|
+
this.events.onAllConnected?.();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Connect a specific client
|
|
76
|
+
*/
|
|
77
|
+
async connect(name) {
|
|
78
|
+
const config = this.configs.find((c) => c.name === name);
|
|
79
|
+
if (!config) {
|
|
80
|
+
throw new Error(`Client "${name}" not found in configuration`);
|
|
81
|
+
}
|
|
82
|
+
if (config.enabled === false) {
|
|
83
|
+
throw new Error(`Client "${name}" is disabled`);
|
|
84
|
+
}
|
|
85
|
+
let client = this.clients.get(name);
|
|
86
|
+
if (!client) {
|
|
87
|
+
client = this.createClient(config);
|
|
88
|
+
this.clients.set(name, client);
|
|
89
|
+
}
|
|
90
|
+
await client.connect();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Disconnect all clients
|
|
94
|
+
*/
|
|
95
|
+
async disconnectAll() {
|
|
96
|
+
const disconnectPromises = [];
|
|
97
|
+
for (const client of this.clients.values()) {
|
|
98
|
+
disconnectPromises.push(
|
|
99
|
+
client.disconnect().catch((error) => {
|
|
100
|
+
console.error("Error disconnecting client:", error);
|
|
101
|
+
})
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
await Promise.all(disconnectPromises);
|
|
105
|
+
this.events.onAllDisconnected?.();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Disconnect a specific client
|
|
109
|
+
*/
|
|
110
|
+
async disconnect(name) {
|
|
111
|
+
const client = this.clients.get(name);
|
|
112
|
+
if (client) {
|
|
113
|
+
await client.disconnect();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get a specific client
|
|
118
|
+
*/
|
|
119
|
+
getClient(name) {
|
|
120
|
+
return this.clients.get(name);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get all connected clients
|
|
124
|
+
*/
|
|
125
|
+
getConnectedClients() {
|
|
126
|
+
return Array.from(this.clients.values()).filter((c) => c.isConnected());
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get all tool definitions from all connected clients
|
|
130
|
+
*/
|
|
131
|
+
getAllToolDefinitions(options) {
|
|
132
|
+
const tools = [];
|
|
133
|
+
for (const client of this.getConnectedClients()) {
|
|
134
|
+
const clientTools = client.toToolDefinitions({
|
|
135
|
+
prefixToolNames: options?.prefixToolNames ?? true
|
|
136
|
+
});
|
|
137
|
+
tools.push(...clientTools);
|
|
138
|
+
}
|
|
139
|
+
return tools;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get tool definitions from a specific client
|
|
143
|
+
*/
|
|
144
|
+
getToolDefinitions(name, options) {
|
|
145
|
+
const client = this.clients.get(name);
|
|
146
|
+
if (!client || !client.isConnected()) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
return client.toToolDefinitions({
|
|
150
|
+
prefixToolNames: options?.prefixToolNames ?? true
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Call a tool on a specific client
|
|
155
|
+
*/
|
|
156
|
+
async callTool(clientName, toolName, args) {
|
|
157
|
+
const client = this.clients.get(clientName);
|
|
158
|
+
if (!client) {
|
|
159
|
+
throw new Error(`Client "${clientName}" not found`);
|
|
160
|
+
}
|
|
161
|
+
if (!client.isConnected()) {
|
|
162
|
+
throw new Error(`Client "${clientName}" is not connected`);
|
|
163
|
+
}
|
|
164
|
+
return client.callTool(toolName, args);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Refresh tools for all connected clients
|
|
168
|
+
*/
|
|
169
|
+
async refreshAllTools() {
|
|
170
|
+
const refreshPromises = [];
|
|
171
|
+
for (const client of this.getConnectedClients()) {
|
|
172
|
+
refreshPromises.push(
|
|
173
|
+
client.refreshTools().then(() => void 0).catch((error) => {
|
|
174
|
+
console.error("Error refreshing tools:", error);
|
|
175
|
+
})
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
await Promise.all(refreshPromises);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if a specific client is connected
|
|
182
|
+
*/
|
|
183
|
+
isConnected(name) {
|
|
184
|
+
const client = this.clients.get(name);
|
|
185
|
+
return client?.isConnected() ?? false;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create a client with event forwarding
|
|
189
|
+
*/
|
|
190
|
+
createClient(config) {
|
|
191
|
+
const clientEvents = {
|
|
192
|
+
onConnectionStateChange: (state) => {
|
|
193
|
+
this.events.onConnectionStateChange?.(config.name, state);
|
|
194
|
+
const managerState = this.getState();
|
|
195
|
+
if (state === "connected" && managerState.allConnected) {
|
|
196
|
+
this.events.onAllConnected?.();
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
onToolsChange: (tools) => {
|
|
200
|
+
this.events.onToolsChange?.(config.name, tools);
|
|
201
|
+
},
|
|
202
|
+
onError: (error) => {
|
|
203
|
+
this.events.onError?.(config.name, error);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
return chunk7K7HZMP4_cjs.createMCPClient(config, clientEvents);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
function createMCPClientManager(configs, events) {
|
|
210
|
+
return new MCPClientManager(configs, events);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// src/mcp/transports/SSETransport.ts
|
|
214
|
+
var SSETransport = class extends chunk7K7HZMP4_cjs.BaseTransport {
|
|
215
|
+
constructor(options) {
|
|
216
|
+
super();
|
|
217
|
+
this.url = options.url;
|
|
218
|
+
this.headers = options.headers ?? {};
|
|
219
|
+
this.timeout = options.timeout ?? 3e4;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Connect to the SSE endpoint
|
|
223
|
+
*/
|
|
224
|
+
async connect() {
|
|
225
|
+
if (this.connected) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
return new Promise((resolve, reject) => {
|
|
229
|
+
try {
|
|
230
|
+
const sseUrl = new URL(this.url);
|
|
231
|
+
if (this.sessionId) {
|
|
232
|
+
sseUrl.searchParams.set("sessionId", this.sessionId);
|
|
233
|
+
}
|
|
234
|
+
this.eventSource = new EventSource(sseUrl.toString());
|
|
235
|
+
this.eventSource.onopen = () => {
|
|
236
|
+
this.connected = true;
|
|
237
|
+
resolve();
|
|
238
|
+
};
|
|
239
|
+
this.eventSource.onmessage = (event) => {
|
|
240
|
+
this.handleSSEMessage(event.data);
|
|
241
|
+
};
|
|
242
|
+
this.eventSource.addEventListener("message", (event) => {
|
|
243
|
+
this.handleSSEMessage(event.data);
|
|
244
|
+
});
|
|
245
|
+
this.eventSource.addEventListener("endpoint", (event) => {
|
|
246
|
+
try {
|
|
247
|
+
const data = JSON.parse(event.data);
|
|
248
|
+
if (data.endpoint) {
|
|
249
|
+
this.messageEndpoint = data.endpoint;
|
|
250
|
+
}
|
|
251
|
+
if (data.sessionId) {
|
|
252
|
+
this.sessionId = data.sessionId;
|
|
253
|
+
}
|
|
254
|
+
} catch {
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
this.eventSource.onerror = (error) => {
|
|
258
|
+
if (!this.connected) {
|
|
259
|
+
reject(new chunk7K7HZMP4_cjs.MCPError("SSE connection failed"));
|
|
260
|
+
} else {
|
|
261
|
+
this.emitError(new chunk7K7HZMP4_cjs.MCPError("SSE connection error"));
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
setTimeout(() => {
|
|
265
|
+
if (!this.connected) {
|
|
266
|
+
this.eventSource?.close();
|
|
267
|
+
reject(new chunk7K7HZMP4_cjs.MCPError("SSE connection timeout"));
|
|
268
|
+
}
|
|
269
|
+
}, this.timeout);
|
|
270
|
+
} catch (error) {
|
|
271
|
+
reject(
|
|
272
|
+
error instanceof Error ? error : new chunk7K7HZMP4_cjs.MCPError("Failed to create SSE connection")
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Disconnect from the SSE endpoint
|
|
279
|
+
*/
|
|
280
|
+
async disconnect() {
|
|
281
|
+
if (this.eventSource) {
|
|
282
|
+
this.eventSource.close();
|
|
283
|
+
this.eventSource = void 0;
|
|
284
|
+
}
|
|
285
|
+
this.messageEndpoint = void 0;
|
|
286
|
+
this.sessionId = void 0;
|
|
287
|
+
this.connected = false;
|
|
288
|
+
this.emitClose();
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Send a JSON-RPC message via HTTP POST
|
|
292
|
+
*/
|
|
293
|
+
async send(message) {
|
|
294
|
+
if (!this.connected) {
|
|
295
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
296
|
+
"Transport not connected",
|
|
297
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
const endpoint = this.messageEndpoint || this.url;
|
|
301
|
+
const headers = {
|
|
302
|
+
"Content-Type": "application/json",
|
|
303
|
+
Accept: "application/json",
|
|
304
|
+
...this.headers
|
|
305
|
+
};
|
|
306
|
+
if (this.sessionId) {
|
|
307
|
+
headers["Mcp-Session-Id"] = this.sessionId;
|
|
308
|
+
}
|
|
309
|
+
const controller = new AbortController();
|
|
310
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
311
|
+
try {
|
|
312
|
+
const response = await fetch(endpoint, {
|
|
313
|
+
method: "POST",
|
|
314
|
+
headers,
|
|
315
|
+
body: JSON.stringify(message),
|
|
316
|
+
signal: controller.signal
|
|
317
|
+
});
|
|
318
|
+
clearTimeout(timeoutId);
|
|
319
|
+
if (!response.ok) {
|
|
320
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
321
|
+
`HTTP error: ${response.status} ${response.statusText}`,
|
|
322
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
const contentType = response.headers.get("content-type");
|
|
326
|
+
if (contentType?.includes("application/json")) {
|
|
327
|
+
const text = await response.text();
|
|
328
|
+
if (text.trim()) {
|
|
329
|
+
const messages = this.parseResponseText(text);
|
|
330
|
+
for (const msg of messages) {
|
|
331
|
+
this.emitMessage(msg);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
} catch (error) {
|
|
336
|
+
clearTimeout(timeoutId);
|
|
337
|
+
if (error instanceof chunk7K7HZMP4_cjs.MCPError) {
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
341
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
342
|
+
"Request timed out",
|
|
343
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
347
|
+
`Send failed: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
348
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Handle an SSE message
|
|
354
|
+
*/
|
|
355
|
+
handleSSEMessage(data) {
|
|
356
|
+
try {
|
|
357
|
+
const messages = this.parseResponseText(data);
|
|
358
|
+
for (const msg of messages) {
|
|
359
|
+
this.emitMessage(msg);
|
|
360
|
+
}
|
|
361
|
+
} catch (error) {
|
|
362
|
+
console.warn("Failed to parse SSE message:", error);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Parse response text into JSON-RPC messages
|
|
367
|
+
*/
|
|
368
|
+
parseResponseText(text) {
|
|
369
|
+
const trimmed = text.trim();
|
|
370
|
+
if (!trimmed) {
|
|
371
|
+
return [];
|
|
372
|
+
}
|
|
373
|
+
const parsed = JSON.parse(trimmed);
|
|
374
|
+
if (Array.isArray(parsed)) {
|
|
375
|
+
return parsed.filter(
|
|
376
|
+
(msg) => this.isValidJsonRpcMessage(msg)
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
if (this.isValidJsonRpcMessage(parsed)) {
|
|
380
|
+
return [parsed];
|
|
381
|
+
}
|
|
382
|
+
return [];
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Validate a JSON-RPC message
|
|
386
|
+
*/
|
|
387
|
+
isValidJsonRpcMessage(msg) {
|
|
388
|
+
if (!msg || typeof msg !== "object") {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
const m = msg;
|
|
392
|
+
if (m.jsonrpc !== "2.0") {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
if ("method" in m && typeof m.method === "string") {
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
if ("id" in m && ("result" in m || "error" in m)) {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Get the current session ID
|
|
405
|
+
*/
|
|
406
|
+
getSessionId() {
|
|
407
|
+
return this.sessionId;
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// src/mcp/transports/StdioTransport.ts
|
|
412
|
+
var StdioTransport = class extends chunk7K7HZMP4_cjs.BaseTransport {
|
|
413
|
+
constructor(options) {
|
|
414
|
+
super();
|
|
415
|
+
this.buffer = "";
|
|
416
|
+
this.command = options.command;
|
|
417
|
+
this.args = options.args ?? [];
|
|
418
|
+
this.env = options.env;
|
|
419
|
+
this.cwd = options.cwd;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Connect by spawning the MCP server process
|
|
423
|
+
*/
|
|
424
|
+
async connect() {
|
|
425
|
+
if (this.connected) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (typeof process === "undefined" || typeof chunkJEQ2X3Z6_cjs.__require === "undefined") {
|
|
429
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
430
|
+
"Stdio transport is only available in Node.js environments",
|
|
431
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
try {
|
|
435
|
+
const childProcess = chunkJEQ2X3Z6_cjs.__require("child_process");
|
|
436
|
+
this.spawn = childProcess.spawn;
|
|
437
|
+
const env = {};
|
|
438
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
439
|
+
if (value !== void 0) {
|
|
440
|
+
env[key] = value;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (this.env) {
|
|
444
|
+
Object.assign(env, this.env);
|
|
445
|
+
}
|
|
446
|
+
this.process = this.spawn(this.command, this.args, {
|
|
447
|
+
env,
|
|
448
|
+
cwd: this.cwd,
|
|
449
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
450
|
+
});
|
|
451
|
+
if (!this.process.stdin || !this.process.stdout) {
|
|
452
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
453
|
+
"Failed to create stdio pipes",
|
|
454
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
this.process.stdout.on("data", (data) => {
|
|
458
|
+
this.handleData(data.toString());
|
|
459
|
+
});
|
|
460
|
+
this.process.stderr?.on("data", (data) => {
|
|
461
|
+
console.error(`[MCP ${this.command}] ${data.toString()}`);
|
|
462
|
+
});
|
|
463
|
+
this.process.on("error", (err) => {
|
|
464
|
+
const error = err;
|
|
465
|
+
this.emitError(new chunk7K7HZMP4_cjs.MCPError(`Process error: ${error.message}`));
|
|
466
|
+
});
|
|
467
|
+
this.process.on("exit", (...args) => {
|
|
468
|
+
const code = args[0];
|
|
469
|
+
if (this.connected) {
|
|
470
|
+
this.connected = false;
|
|
471
|
+
if (code !== 0 && code !== null) {
|
|
472
|
+
this.emitError(new chunk7K7HZMP4_cjs.MCPError(`Process exited with code ${code}`));
|
|
473
|
+
}
|
|
474
|
+
this.emitClose();
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
await new Promise((resolve, reject) => {
|
|
478
|
+
const timeout = setTimeout(() => {
|
|
479
|
+
reject(new chunk7K7HZMP4_cjs.MCPError("Process startup timeout"));
|
|
480
|
+
}, 1e4);
|
|
481
|
+
setTimeout(() => {
|
|
482
|
+
clearTimeout(timeout);
|
|
483
|
+
this.connected = true;
|
|
484
|
+
resolve();
|
|
485
|
+
}, 100);
|
|
486
|
+
});
|
|
487
|
+
} catch (error) {
|
|
488
|
+
throw error instanceof chunk7K7HZMP4_cjs.MCPError ? error : new chunk7K7HZMP4_cjs.MCPError(
|
|
489
|
+
`Failed to spawn process: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
490
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Disconnect by killing the process
|
|
496
|
+
*/
|
|
497
|
+
async disconnect() {
|
|
498
|
+
if (this.process) {
|
|
499
|
+
this.process.kill("SIGTERM");
|
|
500
|
+
this.process = void 0;
|
|
501
|
+
}
|
|
502
|
+
this.buffer = "";
|
|
503
|
+
this.connected = false;
|
|
504
|
+
this.emitClose();
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Send a JSON-RPC message via stdin
|
|
508
|
+
*/
|
|
509
|
+
async send(message) {
|
|
510
|
+
if (!this.connected || !this.process?.stdin) {
|
|
511
|
+
throw new chunk7K7HZMP4_cjs.MCPError(
|
|
512
|
+
"Transport not connected",
|
|
513
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
const data = JSON.stringify(message) + "\n";
|
|
517
|
+
return new Promise((resolve, reject) => {
|
|
518
|
+
const stdin = this.process.stdin;
|
|
519
|
+
stdin.write(data, (error) => {
|
|
520
|
+
if (error) {
|
|
521
|
+
reject(
|
|
522
|
+
new chunk7K7HZMP4_cjs.MCPError(
|
|
523
|
+
`Write error: ${error.message}`,
|
|
524
|
+
chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES.INTERNAL_ERROR
|
|
525
|
+
)
|
|
526
|
+
);
|
|
527
|
+
} else {
|
|
528
|
+
resolve();
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Handle incoming data from stdout
|
|
535
|
+
*/
|
|
536
|
+
handleData(data) {
|
|
537
|
+
this.buffer += data;
|
|
538
|
+
const lines = this.buffer.split("\n");
|
|
539
|
+
this.buffer = lines.pop() ?? "";
|
|
540
|
+
for (const line of lines) {
|
|
541
|
+
if (!line.trim()) continue;
|
|
542
|
+
try {
|
|
543
|
+
const message = JSON.parse(line);
|
|
544
|
+
if (this.isValidJsonRpcMessage(message)) {
|
|
545
|
+
this.emitMessage(message);
|
|
546
|
+
}
|
|
547
|
+
} catch (error) {
|
|
548
|
+
console.warn("Failed to parse stdio message:", error);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Validate a JSON-RPC message
|
|
554
|
+
*/
|
|
555
|
+
isValidJsonRpcMessage(msg) {
|
|
556
|
+
if (!msg || typeof msg !== "object") {
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
const m = msg;
|
|
560
|
+
if (m.jsonrpc !== "2.0") {
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
if ("method" in m && typeof m.method === "string") {
|
|
564
|
+
return true;
|
|
565
|
+
}
|
|
566
|
+
if ("id" in m && ("result" in m || "error" in m)) {
|
|
567
|
+
return true;
|
|
568
|
+
}
|
|
569
|
+
return false;
|
|
570
|
+
}
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
Object.defineProperty(exports, "DEFAULT_MCP_UI_SANDBOX", {
|
|
574
|
+
enumerable: true,
|
|
575
|
+
get: function () { return chunkJO4BHPAD_cjs.DEFAULT_MCP_UI_SANDBOX; }
|
|
576
|
+
});
|
|
577
|
+
Object.defineProperty(exports, "RESTRICTED_MCP_UI_SANDBOX", {
|
|
578
|
+
enumerable: true,
|
|
579
|
+
get: function () { return chunkJO4BHPAD_cjs.RESTRICTED_MCP_UI_SANDBOX; }
|
|
580
|
+
});
|
|
581
|
+
Object.defineProperty(exports, "isMCPUIIntent", {
|
|
582
|
+
enumerable: true,
|
|
583
|
+
get: function () { return chunkJO4BHPAD_cjs.isMCPUIIntent; }
|
|
584
|
+
});
|
|
585
|
+
Object.defineProperty(exports, "isMCPUIMessage", {
|
|
586
|
+
enumerable: true,
|
|
587
|
+
get: function () { return chunkJO4BHPAD_cjs.isMCPUIMessage; }
|
|
588
|
+
});
|
|
589
|
+
Object.defineProperty(exports, "isMCPUIResourceContent", {
|
|
590
|
+
enumerable: true,
|
|
591
|
+
get: function () { return chunkJO4BHPAD_cjs.isMCPUIResourceContent; }
|
|
592
|
+
});
|
|
593
|
+
Object.defineProperty(exports, "parseMCPUIMessage", {
|
|
594
|
+
enumerable: true,
|
|
595
|
+
get: function () { return chunkJO4BHPAD_cjs.parseMCPUIMessage; }
|
|
596
|
+
});
|
|
597
|
+
Object.defineProperty(exports, "BaseTransport", {
|
|
598
|
+
enumerable: true,
|
|
599
|
+
get: function () { return chunk7K7HZMP4_cjs.BaseTransport; }
|
|
600
|
+
});
|
|
601
|
+
Object.defineProperty(exports, "DEFAULT_CLIENT_CAPABILITIES", {
|
|
602
|
+
enumerable: true,
|
|
603
|
+
get: function () { return chunk7K7HZMP4_cjs.DEFAULT_CLIENT_CAPABILITIES; }
|
|
604
|
+
});
|
|
605
|
+
Object.defineProperty(exports, "DEFAULT_CLIENT_INFO", {
|
|
606
|
+
enumerable: true,
|
|
607
|
+
get: function () { return chunk7K7HZMP4_cjs.DEFAULT_CLIENT_INFO; }
|
|
608
|
+
});
|
|
609
|
+
Object.defineProperty(exports, "HttpTransport", {
|
|
610
|
+
enumerable: true,
|
|
611
|
+
get: function () { return chunk7K7HZMP4_cjs.HttpTransport; }
|
|
612
|
+
});
|
|
613
|
+
Object.defineProperty(exports, "JSON_RPC_ERROR_CODES", {
|
|
614
|
+
enumerable: true,
|
|
615
|
+
get: function () { return chunk7K7HZMP4_cjs.JSON_RPC_ERROR_CODES; }
|
|
616
|
+
});
|
|
617
|
+
Object.defineProperty(exports, "JsonRpcHandler", {
|
|
618
|
+
enumerable: true,
|
|
619
|
+
get: function () { return chunk7K7HZMP4_cjs.JsonRpcHandler; }
|
|
620
|
+
});
|
|
621
|
+
Object.defineProperty(exports, "MCPClient", {
|
|
622
|
+
enumerable: true,
|
|
623
|
+
get: function () { return chunk7K7HZMP4_cjs.MCPClient; }
|
|
624
|
+
});
|
|
625
|
+
Object.defineProperty(exports, "MCPError", {
|
|
626
|
+
enumerable: true,
|
|
627
|
+
get: function () { return chunk7K7HZMP4_cjs.MCPError; }
|
|
628
|
+
});
|
|
629
|
+
Object.defineProperty(exports, "MCPToolAdapter", {
|
|
630
|
+
enumerable: true,
|
|
631
|
+
get: function () { return chunk7K7HZMP4_cjs.MCPToolAdapter; }
|
|
632
|
+
});
|
|
633
|
+
Object.defineProperty(exports, "MCP_METHODS", {
|
|
634
|
+
enumerable: true,
|
|
635
|
+
get: function () { return chunk7K7HZMP4_cjs.MCP_METHODS; }
|
|
636
|
+
});
|
|
637
|
+
Object.defineProperty(exports, "MCP_PROTOCOL_VERSION", {
|
|
638
|
+
enumerable: true,
|
|
639
|
+
get: function () { return chunk7K7HZMP4_cjs.MCP_PROTOCOL_VERSION; }
|
|
640
|
+
});
|
|
641
|
+
Object.defineProperty(exports, "createInitializeParams", {
|
|
642
|
+
enumerable: true,
|
|
643
|
+
get: function () { return chunk7K7HZMP4_cjs.createInitializeParams; }
|
|
644
|
+
});
|
|
645
|
+
Object.defineProperty(exports, "createMCPClient", {
|
|
646
|
+
enumerable: true,
|
|
647
|
+
get: function () { return chunk7K7HZMP4_cjs.createMCPClient; }
|
|
648
|
+
});
|
|
649
|
+
Object.defineProperty(exports, "createToolCallParams", {
|
|
650
|
+
enumerable: true,
|
|
651
|
+
get: function () { return chunk7K7HZMP4_cjs.createToolCallParams; }
|
|
652
|
+
});
|
|
653
|
+
Object.defineProperty(exports, "createToolsListParams", {
|
|
654
|
+
enumerable: true,
|
|
655
|
+
get: function () { return chunk7K7HZMP4_cjs.createToolsListParams; }
|
|
656
|
+
});
|
|
657
|
+
Object.defineProperty(exports, "mcpToolToDefinition", {
|
|
658
|
+
enumerable: true,
|
|
659
|
+
get: function () { return chunk7K7HZMP4_cjs.mcpToolToDefinition; }
|
|
660
|
+
});
|
|
661
|
+
Object.defineProperty(exports, "mcpToolsToDefinitions", {
|
|
662
|
+
enumerable: true,
|
|
663
|
+
get: function () { return chunk7K7HZMP4_cjs.mcpToolsToDefinitions; }
|
|
664
|
+
});
|
|
665
|
+
exports.MCPClientManager = MCPClientManager;
|
|
666
|
+
exports.SSETransport = SSETransport;
|
|
667
|
+
exports.StdioTransport = StdioTransport;
|
|
668
|
+
exports.createMCPClientManager = createMCPClientManager;
|
|
669
|
+
//# sourceMappingURL=index.cjs.map
|
|
670
|
+
//# sourceMappingURL=index.cjs.map
|