@balchemyai/agent-sdk 0.1.0
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 +282 -0
- package/dist/agent-loop/agent-loop.d.ts +54 -0
- package/dist/agent-loop/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop/agent-loop.js +328 -0
- package/dist/agent-loop/agent-loop.js.map +1 -0
- package/dist/agent-loop/decision-handler.d.ts +37 -0
- package/dist/agent-loop/decision-handler.d.ts.map +1 -0
- package/dist/agent-loop/decision-handler.js +91 -0
- package/dist/agent-loop/decision-handler.js.map +1 -0
- package/dist/agent-loop/llm-adapters/anthropic.d.ts +10 -0
- package/dist/agent-loop/llm-adapters/anthropic.d.ts.map +1 -0
- package/dist/agent-loop/llm-adapters/anthropic.js +60 -0
- package/dist/agent-loop/llm-adapters/anthropic.js.map +1 -0
- package/dist/agent-loop/llm-adapters/openai.d.ts +11 -0
- package/dist/agent-loop/llm-adapters/openai.d.ts.map +1 -0
- package/dist/agent-loop/llm-adapters/openai.js +54 -0
- package/dist/agent-loop/llm-adapters/openai.js.map +1 -0
- package/dist/agent-loop/llm-cost-tracker.d.ts +21 -0
- package/dist/agent-loop/llm-cost-tracker.d.ts.map +1 -0
- package/dist/agent-loop/llm-cost-tracker.js +63 -0
- package/dist/agent-loop/llm-cost-tracker.js.map +1 -0
- package/dist/agent-loop/model-router.d.ts +35 -0
- package/dist/agent-loop/model-router.d.ts.map +1 -0
- package/dist/agent-loop/model-router.js +55 -0
- package/dist/agent-loop/model-router.js.map +1 -0
- package/dist/agent-loop/telemetry-reporter.d.ts +60 -0
- package/dist/agent-loop/telemetry-reporter.d.ts.map +1 -0
- package/dist/agent-loop/telemetry-reporter.js +78 -0
- package/dist/agent-loop/telemetry-reporter.js.map +1 -0
- package/dist/agent-loop/types.d.ts +125 -0
- package/dist/agent-loop/types.d.ts.map +1 -0
- package/dist/agent-loop/types.js +10 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/agent-loop/webhook-receiver.d.ts +22 -0
- package/dist/agent-loop/webhook-receiver.d.ts.map +1 -0
- package/dist/agent-loop/webhook-receiver.js +145 -0
- package/dist/agent-loop/webhook-receiver.js.map +1 -0
- package/dist/auth/onboarding.d.ts +12 -0
- package/dist/auth/onboarding.d.ts.map +1 -0
- package/dist/auth/onboarding.js +51 -0
- package/dist/auth/onboarding.js.map +1 -0
- package/dist/auth/token-store.d.ts +44 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +67 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/client/http-client.d.ts +22 -0
- package/dist/client/http-client.d.ts.map +1 -0
- package/dist/client/http-client.js +127 -0
- package/dist/client/http-client.js.map +1 -0
- package/dist/errors/agent-sdk-error.d.ts +13 -0
- package/dist/errors/agent-sdk-error.d.ts.map +1 -0
- package/dist/errors/agent-sdk-error.js +17 -0
- package/dist/errors/agent-sdk-error.js.map +1 -0
- package/dist/errors/error-codes.d.ts +2 -0
- package/dist/errors/error-codes.d.ts.map +1 -0
- package/dist/errors/error-codes.js +3 -0
- package/dist/errors/error-codes.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mcp-client.d.ts +184 -0
- package/dist/mcp/mcp-client.d.ts.map +1 -0
- package/dist/mcp/mcp-client.js +469 -0
- package/dist/mcp/mcp-client.js.map +1 -0
- package/dist/streaming/sse-event-stream.d.ts +58 -0
- package/dist/streaming/sse-event-stream.d.ts.map +1 -0
- package/dist/streaming/sse-event-stream.js +263 -0
- package/dist/streaming/sse-event-stream.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/retry.d.ts +30 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +85 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.connectMcp = exports.BalchemyMcpClient = void 0;
|
|
4
|
+
exports.getToolText = getToolText;
|
|
5
|
+
exports.parseToolJson = parseToolJson;
|
|
6
|
+
exports.isToolError = isToolError;
|
|
7
|
+
const agent_sdk_error_1 = require("../errors/agent-sdk-error");
|
|
8
|
+
const retry_1 = require("../utils/retry");
|
|
9
|
+
// ── Typed tool call helpers ───────────────────────────────────────────────────
|
|
10
|
+
/** Extract typed text from a tool call response. Returns empty string on error. */
|
|
11
|
+
function getToolText(response) {
|
|
12
|
+
const first = response.content.find((c) => c.type === "text");
|
|
13
|
+
return first?.text ?? "";
|
|
14
|
+
}
|
|
15
|
+
/** Parse a tool call response text as JSON. Returns null if not valid JSON. */
|
|
16
|
+
function parseToolJson(response) {
|
|
17
|
+
const text = getToolText(response);
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(text);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Returns true if the tool response indicates an error. */
|
|
26
|
+
function isToolError(response) {
|
|
27
|
+
return response.isError === true;
|
|
28
|
+
}
|
|
29
|
+
// ── Client ───────────────────────────────────────────────────────────────────
|
|
30
|
+
class BalchemyMcpClient {
|
|
31
|
+
endpoint;
|
|
32
|
+
apiKey;
|
|
33
|
+
timeoutMs;
|
|
34
|
+
fetchFn;
|
|
35
|
+
retryOptions;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
this.endpoint = config.endpoint;
|
|
38
|
+
this.apiKey = config.apiKey;
|
|
39
|
+
this.timeoutMs = config.timeoutMs ?? 15_000;
|
|
40
|
+
this.fetchFn = config.fetchFn ?? fetch;
|
|
41
|
+
this.retryOptions = config.retry ?? { maxAttempts: 3 };
|
|
42
|
+
}
|
|
43
|
+
async listTools() {
|
|
44
|
+
return this.rpc("tools/list", {});
|
|
45
|
+
}
|
|
46
|
+
async callTool(name, argumentsPayload) {
|
|
47
|
+
return this.rpc("tools/call", {
|
|
48
|
+
name,
|
|
49
|
+
arguments: argumentsPayload,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Lightweight health check using the `/health` endpoint.
|
|
54
|
+
* Returns `true` if the API key is valid and MCP is enabled.
|
|
55
|
+
* Falls back to `listTools()` if the health endpoint returns 404
|
|
56
|
+
* (e.g. backend not yet upgraded).
|
|
57
|
+
*/
|
|
58
|
+
async ping() {
|
|
59
|
+
try {
|
|
60
|
+
const health = await this.healthCheck();
|
|
61
|
+
return health.ok;
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
// If backend does not yet have /health, fall back to listTools.
|
|
65
|
+
if (err instanceof agent_sdk_error_1.AgentSdkError &&
|
|
66
|
+
(err.status === 404 || err.status === 405)) {
|
|
67
|
+
const tools = await this.listTools();
|
|
68
|
+
return Array.isArray(tools.tools);
|
|
69
|
+
}
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Call the lightweight `/health` endpoint for this MCP principal.
|
|
75
|
+
* Throws `AgentSdkError` if unauthorized or not found.
|
|
76
|
+
*/
|
|
77
|
+
async healthCheck() {
|
|
78
|
+
const healthUrl = `${this.endpoint}/health`;
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timeout = globalThis.setTimeout(() => controller.abort(), this.timeoutMs);
|
|
81
|
+
try {
|
|
82
|
+
const response = await this.fetchFn(healthUrl, {
|
|
83
|
+
method: "GET",
|
|
84
|
+
headers: {
|
|
85
|
+
Accept: "application/json",
|
|
86
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
87
|
+
},
|
|
88
|
+
signal: controller.signal,
|
|
89
|
+
});
|
|
90
|
+
const raw = await response.text();
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
let message = `MCP health check failed with status ${response.status}`;
|
|
93
|
+
try {
|
|
94
|
+
const parsed = JSON.parse(raw);
|
|
95
|
+
if (typeof parsed.error === "string") {
|
|
96
|
+
message = parsed.error;
|
|
97
|
+
}
|
|
98
|
+
else if (parsed.error?.message) {
|
|
99
|
+
message = parsed.error.message;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// ignore parse errors — use default message
|
|
104
|
+
}
|
|
105
|
+
const code = response.status === 401
|
|
106
|
+
? "auth_error"
|
|
107
|
+
: response.status === 429
|
|
108
|
+
? "rate_limit_error"
|
|
109
|
+
: "execution_error";
|
|
110
|
+
throw new agent_sdk_error_1.AgentSdkError({ code, status: response.status, message });
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
return JSON.parse(raw);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
117
|
+
code: "invalid_response",
|
|
118
|
+
status: response.status,
|
|
119
|
+
message: "Invalid JSON in health response",
|
|
120
|
+
details: raw,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error instanceof agent_sdk_error_1.AgentSdkError) {
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
const message = error instanceof Error ? error.message : "MCP health check failed";
|
|
129
|
+
throw new agent_sdk_error_1.AgentSdkError({ code: "network_error", message, details: error });
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
globalThis.clearTimeout(timeout);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Send multiple tool calls in a single JSON-RPC batch request.
|
|
137
|
+
*
|
|
138
|
+
* The MCP server processes the batch array and returns an array of
|
|
139
|
+
* responses in the same order. Each result is individually marked
|
|
140
|
+
* `success: true | false` — a single failed tool does not abort the batch.
|
|
141
|
+
*
|
|
142
|
+
* NOTE: JSON-RPC batch support requires backend MCP SDK >= 1.x.
|
|
143
|
+
* Use `callToolsParallel()` for automatic fallback on unsupported servers.
|
|
144
|
+
*/
|
|
145
|
+
async callToolsBatch(calls) {
|
|
146
|
+
if (calls.length === 0) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
const ids = calls.map((_, i) => `batch-${i}-${Date.now()}`);
|
|
150
|
+
const batchBody = calls.map((call, i) => ({
|
|
151
|
+
jsonrpc: "2.0",
|
|
152
|
+
id: ids[i],
|
|
153
|
+
method: "tools/call",
|
|
154
|
+
params: { name: call.name, arguments: call.arguments },
|
|
155
|
+
}));
|
|
156
|
+
const controller = new AbortController();
|
|
157
|
+
const timeout = globalThis.setTimeout(() => controller.abort(), this.timeoutMs);
|
|
158
|
+
try {
|
|
159
|
+
const response = await this.fetchFn(this.endpoint, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: {
|
|
162
|
+
"Content-Type": "application/json",
|
|
163
|
+
Accept: "application/json, text/event-stream",
|
|
164
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
165
|
+
},
|
|
166
|
+
body: JSON.stringify(batchBody),
|
|
167
|
+
signal: controller.signal,
|
|
168
|
+
});
|
|
169
|
+
const raw = await response.text();
|
|
170
|
+
if (!raw) {
|
|
171
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
172
|
+
code: "invalid_response",
|
|
173
|
+
status: response.status,
|
|
174
|
+
message: "Empty batch MCP response",
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
const normalized = this.extractSsePayload(raw);
|
|
178
|
+
let parsed;
|
|
179
|
+
try {
|
|
180
|
+
parsed = JSON.parse(normalized);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
184
|
+
code: "invalid_response",
|
|
185
|
+
status: response.status,
|
|
186
|
+
message: "Invalid JSON-RPC batch response",
|
|
187
|
+
details: raw,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Normalize: server may return a single object if batch has 1 item.
|
|
191
|
+
const responses = Array.isArray(parsed) ? parsed : [parsed];
|
|
192
|
+
return calls.map((call, i) => {
|
|
193
|
+
// Match by id; fall back to positional if server reorders.
|
|
194
|
+
const envelope = responses.find((r) => typeof r === "object" && r !== null && r.id === ids[i]) ?? responses[i];
|
|
195
|
+
if (!envelope) {
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
name: call.name,
|
|
199
|
+
index: i,
|
|
200
|
+
error: new agent_sdk_error_1.AgentSdkError({
|
|
201
|
+
code: "invalid_response",
|
|
202
|
+
message: `Missing batch response for tool "${call.name}" at index ${i}`,
|
|
203
|
+
}),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (this.isJsonRpcError(envelope)) {
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
name: call.name,
|
|
210
|
+
index: i,
|
|
211
|
+
error: new agent_sdk_error_1.AgentSdkError({
|
|
212
|
+
code: "execution_error",
|
|
213
|
+
status: response.status,
|
|
214
|
+
message: envelope.error.message,
|
|
215
|
+
details: envelope.error.data,
|
|
216
|
+
}),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
success: true,
|
|
221
|
+
name: call.name,
|
|
222
|
+
index: i,
|
|
223
|
+
result: envelope.result,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (error instanceof agent_sdk_error_1.AgentSdkError) {
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
const message = error instanceof Error ? error.message : "MCP batch request failed";
|
|
232
|
+
throw new agent_sdk_error_1.AgentSdkError({ code: "network_error", message, details: error });
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
globalThis.clearTimeout(timeout);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Execute multiple tool calls with best-effort parallelism.
|
|
240
|
+
*
|
|
241
|
+
* Tries `callToolsBatch()` first (single HTTP round-trip). If the server
|
|
242
|
+
* returns a non-batch-compatible error, falls back to running individual
|
|
243
|
+
* `callTool()` calls in parallel via `Promise.allSettled`.
|
|
244
|
+
*
|
|
245
|
+
* The fallback path maps `PromiseSettledResult` to `McpBatchToolCallResult`
|
|
246
|
+
* so callers always get the same shape regardless of the path taken.
|
|
247
|
+
*/
|
|
248
|
+
async callToolsParallel(calls) {
|
|
249
|
+
if (calls.length === 0) {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
return await this.callToolsBatch(calls);
|
|
254
|
+
}
|
|
255
|
+
catch (batchError) {
|
|
256
|
+
// Fallback: individual parallel calls via Promise.allSettled.
|
|
257
|
+
// This path is taken if the server does not support JSON-RPC batch.
|
|
258
|
+
const settled = await Promise.allSettled(calls.map((call) => this.callTool(call.name, call.arguments)));
|
|
259
|
+
return settled.map((outcome, i) => {
|
|
260
|
+
const call = calls[i];
|
|
261
|
+
if (outcome.status === "fulfilled") {
|
|
262
|
+
return { success: true, name: call.name, index: i, result: outcome.value };
|
|
263
|
+
}
|
|
264
|
+
const raw = outcome.reason;
|
|
265
|
+
const error = raw instanceof agent_sdk_error_1.AgentSdkError
|
|
266
|
+
? raw
|
|
267
|
+
: new agent_sdk_error_1.AgentSdkError({
|
|
268
|
+
code: "execution_error",
|
|
269
|
+
message: raw instanceof Error ? raw.message : "Tool call failed",
|
|
270
|
+
details: raw,
|
|
271
|
+
});
|
|
272
|
+
return { success: false, name: call.name, index: i, error };
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// ── Typed convenience methods ───────────────────────────────────────────
|
|
277
|
+
/** Natural language query via ask_bot. Use `chat_id` to maintain conversation continuity. */
|
|
278
|
+
async askBot(args) {
|
|
279
|
+
return this.callTool("ask_bot", args);
|
|
280
|
+
}
|
|
281
|
+
/** Direct NLP trade command (regex parser, bypasses LLM). For structured trades, prefer `agentExecute()`. */
|
|
282
|
+
async tradeCommand(args) {
|
|
283
|
+
return this.callTool("trade_command", args);
|
|
284
|
+
}
|
|
285
|
+
/** High-level agent execution endpoint. Returns structured envelope with intent/result/metadata. Preferred over `tradeCommand()` for programmatic use. */
|
|
286
|
+
async agentExecute(args) {
|
|
287
|
+
return this.callTool("agent_execute", args);
|
|
288
|
+
}
|
|
289
|
+
/** High-level agent research endpoint. */
|
|
290
|
+
async agentResearch(args) {
|
|
291
|
+
return this.callTool("agent_research", args);
|
|
292
|
+
}
|
|
293
|
+
/** High-level portfolio/state snapshot endpoint. */
|
|
294
|
+
async agentPortfolio() {
|
|
295
|
+
return this.callTool("agent_portfolio", {});
|
|
296
|
+
}
|
|
297
|
+
/** High-level runtime/auth status endpoint. */
|
|
298
|
+
async agentStatus() {
|
|
299
|
+
return this.callTool("agent_status", {});
|
|
300
|
+
}
|
|
301
|
+
/** High-level agent config endpoint (get/update). */
|
|
302
|
+
async agentConfig(args) {
|
|
303
|
+
return this.callTool("agent_config", args);
|
|
304
|
+
}
|
|
305
|
+
/** EVM swap quote (read-only). */
|
|
306
|
+
async evmQuote(args) {
|
|
307
|
+
return this.callTool("trading_evm_quote", {
|
|
308
|
+
chainId: 8453,
|
|
309
|
+
...args,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* EVM swap execution.
|
|
314
|
+
* By default `submit=false` (pending order) — pass `submit: true` to execute on-chain.
|
|
315
|
+
*/
|
|
316
|
+
async evmSwap(args) {
|
|
317
|
+
return this.callTool("trading_evm_swap", {
|
|
318
|
+
chainId: 8453,
|
|
319
|
+
submit: false,
|
|
320
|
+
...args,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/** Solana Jupiter swap quote (read-only). Requires `MCP_EXPOSE_GRANULAR_TOOLS=true`. */
|
|
324
|
+
async solanaQuote(args) {
|
|
325
|
+
return this.callTool("trading_solana_jupiter_quote", args);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Solana Jupiter swap execution. Requires `MCP_EXPOSE_GRANULAR_TOOLS=true`.
|
|
329
|
+
* By default `submit=false` (pending order) — pass `submit: true` to execute on-chain.
|
|
330
|
+
*/
|
|
331
|
+
async solanaSwap(args) {
|
|
332
|
+
return this.callTool("trading_solana_jupiter_swap", {
|
|
333
|
+
submit: false,
|
|
334
|
+
...args,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Read an MCP resource by URI (JSON-RPC `resources/read`).
|
|
339
|
+
* Returns the raw contents array. Callers extract `.text` from the first item.
|
|
340
|
+
*/
|
|
341
|
+
async readResource(uri) {
|
|
342
|
+
const result = await this.rpc('resources/read', { uri });
|
|
343
|
+
return result.contents ?? [];
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* @deprecated Seed pool is disabled. Fund custodial wallet via dashboard or on-chain transfer.
|
|
347
|
+
* Kept for backward compatibility; always throws a deterministic SDK error.
|
|
348
|
+
*/
|
|
349
|
+
async requestSeed(args) {
|
|
350
|
+
void args;
|
|
351
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
352
|
+
code: "execution_error",
|
|
353
|
+
message: "agent_seed_request is disabled. Fund custodial wallet via dashboard or on-chain transfer.",
|
|
354
|
+
details: {
|
|
355
|
+
tool: "agent_seed_request",
|
|
356
|
+
disabled: true,
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
// ── Internal ─────────────────────────────────────────────────────────────
|
|
361
|
+
async rpc(method, params) {
|
|
362
|
+
return (0, retry_1.withRetry)(async () => {
|
|
363
|
+
const controller = new AbortController();
|
|
364
|
+
const timeout = globalThis.setTimeout(() => controller.abort(), this.timeoutMs);
|
|
365
|
+
try {
|
|
366
|
+
const response = await this.fetchFn(this.endpoint, {
|
|
367
|
+
method: "POST",
|
|
368
|
+
headers: {
|
|
369
|
+
"Content-Type": "application/json",
|
|
370
|
+
Accept: "application/json, text/event-stream",
|
|
371
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
372
|
+
},
|
|
373
|
+
body: JSON.stringify({
|
|
374
|
+
jsonrpc: "2.0",
|
|
375
|
+
id: crypto.randomUUID(),
|
|
376
|
+
method,
|
|
377
|
+
params,
|
|
378
|
+
}),
|
|
379
|
+
signal: controller.signal,
|
|
380
|
+
});
|
|
381
|
+
const payload = await this.parseJsonRpc(response);
|
|
382
|
+
if (this.isJsonRpcError(payload)) {
|
|
383
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
384
|
+
code: "execution_error",
|
|
385
|
+
status: response.status,
|
|
386
|
+
message: payload.error.message,
|
|
387
|
+
details: payload.error.data,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
return payload.result;
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
if (error instanceof agent_sdk_error_1.AgentSdkError) {
|
|
394
|
+
throw error;
|
|
395
|
+
}
|
|
396
|
+
const message = error instanceof Error ? error.message : "MCP request failed";
|
|
397
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
398
|
+
code: "network_error",
|
|
399
|
+
message,
|
|
400
|
+
details: error,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
finally {
|
|
404
|
+
globalThis.clearTimeout(timeout);
|
|
405
|
+
}
|
|
406
|
+
}, this.resolveRetryOptions(method));
|
|
407
|
+
}
|
|
408
|
+
resolveRetryOptions(method) {
|
|
409
|
+
const configuredShouldRetry = this.retryOptions.shouldRetry;
|
|
410
|
+
return {
|
|
411
|
+
...this.retryOptions,
|
|
412
|
+
shouldRetry: (error, context) => {
|
|
413
|
+
if (configuredShouldRetry) {
|
|
414
|
+
return configuredShouldRetry(error, context);
|
|
415
|
+
}
|
|
416
|
+
if (method === "tools/call" &&
|
|
417
|
+
error instanceof agent_sdk_error_1.AgentSdkError &&
|
|
418
|
+
error.code === "execution_error") {
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
return (0, retry_1.defaultShouldRetry)(error);
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
async parseJsonRpc(response) {
|
|
426
|
+
const raw = await response.text();
|
|
427
|
+
if (!raw) {
|
|
428
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
429
|
+
code: "invalid_response",
|
|
430
|
+
status: response.status,
|
|
431
|
+
message: "Empty MCP response",
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
const normalized = this.extractSsePayload(raw);
|
|
435
|
+
try {
|
|
436
|
+
return JSON.parse(normalized);
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
throw new agent_sdk_error_1.AgentSdkError({
|
|
440
|
+
code: "invalid_response",
|
|
441
|
+
status: response.status,
|
|
442
|
+
message: "Invalid JSON-RPC payload",
|
|
443
|
+
details: raw,
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
extractSsePayload(raw) {
|
|
448
|
+
const lines = raw
|
|
449
|
+
.split("\n")
|
|
450
|
+
.map((line) => line.trim())
|
|
451
|
+
.filter((line) => line.startsWith("data:"));
|
|
452
|
+
if (lines.length === 0) {
|
|
453
|
+
return raw;
|
|
454
|
+
}
|
|
455
|
+
const last = lines[lines.length - 1];
|
|
456
|
+
return last.replace(/^data:\s*/, "");
|
|
457
|
+
}
|
|
458
|
+
isJsonRpcError(payload) {
|
|
459
|
+
return (typeof payload === "object" &&
|
|
460
|
+
payload !== null &&
|
|
461
|
+
"error" in payload);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
exports.BalchemyMcpClient = BalchemyMcpClient;
|
|
465
|
+
const connectMcp = (config) => {
|
|
466
|
+
return new BalchemyMcpClient(config);
|
|
467
|
+
};
|
|
468
|
+
exports.connectMcp = connectMcp;
|
|
469
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SseEventStream — lightweight SSE consumer.
|
|
3
|
+
*
|
|
4
|
+
* Parses the text/event-stream protocol and emits typed events via
|
|
5
|
+
* an async iterator or a callback-based subscribe API.
|
|
6
|
+
*
|
|
7
|
+
* Usage (async iterator):
|
|
8
|
+
* const stream = new SseEventStream(endpoint, apiKey);
|
|
9
|
+
* for await (const event of stream) {
|
|
10
|
+
* handleEvent(event);
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* Usage (callback):
|
|
14
|
+
* const unsub = stream.subscribe((event) => { ... }, onError);
|
|
15
|
+
* // later:
|
|
16
|
+
* unsub();
|
|
17
|
+
*/
|
|
18
|
+
export type SseEvent = {
|
|
19
|
+
event: string;
|
|
20
|
+
data: unknown;
|
|
21
|
+
id?: string;
|
|
22
|
+
};
|
|
23
|
+
export type SseStreamOptions = {
|
|
24
|
+
/** Reconnect delay in ms after an unexpected close. 0 = no reconnect. Default: 2000 */
|
|
25
|
+
reconnectDelayMs?: number;
|
|
26
|
+
/** Max reconnect delay cap in ms (for exponential backoff). Default: 30000 */
|
|
27
|
+
maxReconnectDelayMs?: number;
|
|
28
|
+
/** Max reconnect attempts. 0 = unlimited. Default: 0 (unlimited) */
|
|
29
|
+
maxReconnects?: number;
|
|
30
|
+
/** Jitter factor (0-1). Adds randomness to reconnect delay. Default: 0.25 */
|
|
31
|
+
jitterFactor?: number;
|
|
32
|
+
/** Optional fetch override (useful in tests). */
|
|
33
|
+
fetchFn?: typeof fetch;
|
|
34
|
+
};
|
|
35
|
+
export declare class SseEventStream implements AsyncIterable<SseEvent> {
|
|
36
|
+
private readonly endpoint;
|
|
37
|
+
private readonly apiKey;
|
|
38
|
+
private readonly reconnectDelayMs;
|
|
39
|
+
private readonly maxReconnectDelayMs;
|
|
40
|
+
private readonly maxReconnects;
|
|
41
|
+
private readonly jitterFactor;
|
|
42
|
+
private readonly fetchFn;
|
|
43
|
+
private closed;
|
|
44
|
+
private reconnectCount;
|
|
45
|
+
private lastEventId;
|
|
46
|
+
constructor(endpoint: string, apiKey: string, options?: SseStreamOptions);
|
|
47
|
+
close(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Subscribe with a callback. Returns an unsubscribe function.
|
|
50
|
+
*/
|
|
51
|
+
subscribe(onEvent: (event: SseEvent) => void, onError?: (err: unknown) => void): () => void;
|
|
52
|
+
[Symbol.asyncIterator](): AsyncIterator<SseEvent>;
|
|
53
|
+
private createIterator;
|
|
54
|
+
private consume;
|
|
55
|
+
private readStream;
|
|
56
|
+
private sleep;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=sse-event-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-event-stream.d.ts","sourceRoot":"","sources":["../../src/streaming/sse-event-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC;AAEF,qBAAa,cAAe,YAAW,aAAa,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,WAAW,CAAqB;gBAE5B,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAUxE,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,SAAS,CACP,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EAClC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC/B,MAAM,IAAI;IAwBb,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC;IAIjD,OAAO,CAAC,cAAc;YAqDR,OAAO;YAmCP,UAAU;IAgHxB,OAAO,CAAC,KAAK;CAGd"}
|