@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.
Files changed (78) hide show
  1. package/README.md +282 -0
  2. package/dist/agent-loop/agent-loop.d.ts +54 -0
  3. package/dist/agent-loop/agent-loop.d.ts.map +1 -0
  4. package/dist/agent-loop/agent-loop.js +328 -0
  5. package/dist/agent-loop/agent-loop.js.map +1 -0
  6. package/dist/agent-loop/decision-handler.d.ts +37 -0
  7. package/dist/agent-loop/decision-handler.d.ts.map +1 -0
  8. package/dist/agent-loop/decision-handler.js +91 -0
  9. package/dist/agent-loop/decision-handler.js.map +1 -0
  10. package/dist/agent-loop/llm-adapters/anthropic.d.ts +10 -0
  11. package/dist/agent-loop/llm-adapters/anthropic.d.ts.map +1 -0
  12. package/dist/agent-loop/llm-adapters/anthropic.js +60 -0
  13. package/dist/agent-loop/llm-adapters/anthropic.js.map +1 -0
  14. package/dist/agent-loop/llm-adapters/openai.d.ts +11 -0
  15. package/dist/agent-loop/llm-adapters/openai.d.ts.map +1 -0
  16. package/dist/agent-loop/llm-adapters/openai.js +54 -0
  17. package/dist/agent-loop/llm-adapters/openai.js.map +1 -0
  18. package/dist/agent-loop/llm-cost-tracker.d.ts +21 -0
  19. package/dist/agent-loop/llm-cost-tracker.d.ts.map +1 -0
  20. package/dist/agent-loop/llm-cost-tracker.js +63 -0
  21. package/dist/agent-loop/llm-cost-tracker.js.map +1 -0
  22. package/dist/agent-loop/model-router.d.ts +35 -0
  23. package/dist/agent-loop/model-router.d.ts.map +1 -0
  24. package/dist/agent-loop/model-router.js +55 -0
  25. package/dist/agent-loop/model-router.js.map +1 -0
  26. package/dist/agent-loop/telemetry-reporter.d.ts +60 -0
  27. package/dist/agent-loop/telemetry-reporter.d.ts.map +1 -0
  28. package/dist/agent-loop/telemetry-reporter.js +78 -0
  29. package/dist/agent-loop/telemetry-reporter.js.map +1 -0
  30. package/dist/agent-loop/types.d.ts +125 -0
  31. package/dist/agent-loop/types.d.ts.map +1 -0
  32. package/dist/agent-loop/types.js +10 -0
  33. package/dist/agent-loop/types.js.map +1 -0
  34. package/dist/agent-loop/webhook-receiver.d.ts +22 -0
  35. package/dist/agent-loop/webhook-receiver.d.ts.map +1 -0
  36. package/dist/agent-loop/webhook-receiver.js +145 -0
  37. package/dist/agent-loop/webhook-receiver.js.map +1 -0
  38. package/dist/auth/onboarding.d.ts +12 -0
  39. package/dist/auth/onboarding.d.ts.map +1 -0
  40. package/dist/auth/onboarding.js +51 -0
  41. package/dist/auth/onboarding.js.map +1 -0
  42. package/dist/auth/token-store.d.ts +44 -0
  43. package/dist/auth/token-store.d.ts.map +1 -0
  44. package/dist/auth/token-store.js +67 -0
  45. package/dist/auth/token-store.js.map +1 -0
  46. package/dist/client/http-client.d.ts +22 -0
  47. package/dist/client/http-client.d.ts.map +1 -0
  48. package/dist/client/http-client.js +127 -0
  49. package/dist/client/http-client.js.map +1 -0
  50. package/dist/errors/agent-sdk-error.d.ts +13 -0
  51. package/dist/errors/agent-sdk-error.d.ts.map +1 -0
  52. package/dist/errors/agent-sdk-error.js +17 -0
  53. package/dist/errors/agent-sdk-error.js.map +1 -0
  54. package/dist/errors/error-codes.d.ts +2 -0
  55. package/dist/errors/error-codes.d.ts.map +1 -0
  56. package/dist/errors/error-codes.js +3 -0
  57. package/dist/errors/error-codes.js.map +1 -0
  58. package/dist/index.d.ts +34 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +63 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/mcp/mcp-client.d.ts +184 -0
  63. package/dist/mcp/mcp-client.d.ts.map +1 -0
  64. package/dist/mcp/mcp-client.js +469 -0
  65. package/dist/mcp/mcp-client.js.map +1 -0
  66. package/dist/streaming/sse-event-stream.d.ts +58 -0
  67. package/dist/streaming/sse-event-stream.d.ts.map +1 -0
  68. package/dist/streaming/sse-event-stream.js +263 -0
  69. package/dist/streaming/sse-event-stream.js.map +1 -0
  70. package/dist/types.d.ts +151 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +3 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/utils/retry.d.ts +30 -0
  75. package/dist/utils/retry.d.ts.map +1 -0
  76. package/dist/utils/retry.js +85 -0
  77. package/dist/utils/retry.js.map +1 -0
  78. package/package.json +68 -0
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ /**
3
+ * SseEventStream — lightweight SSE consumer.
4
+ *
5
+ * Parses the text/event-stream protocol and emits typed events via
6
+ * an async iterator or a callback-based subscribe API.
7
+ *
8
+ * Usage (async iterator):
9
+ * const stream = new SseEventStream(endpoint, apiKey);
10
+ * for await (const event of stream) {
11
+ * handleEvent(event);
12
+ * }
13
+ *
14
+ * Usage (callback):
15
+ * const unsub = stream.subscribe((event) => { ... }, onError);
16
+ * // later:
17
+ * unsub();
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.SseEventStream = void 0;
21
+ const agent_sdk_error_1 = require("../errors/agent-sdk-error");
22
+ class SseEventStream {
23
+ endpoint;
24
+ apiKey;
25
+ reconnectDelayMs;
26
+ maxReconnectDelayMs;
27
+ maxReconnects;
28
+ jitterFactor;
29
+ fetchFn;
30
+ closed = false;
31
+ reconnectCount = 0;
32
+ lastEventId;
33
+ constructor(endpoint, apiKey, options) {
34
+ this.endpoint = endpoint;
35
+ this.apiKey = apiKey;
36
+ this.reconnectDelayMs = options?.reconnectDelayMs ?? 2000;
37
+ this.maxReconnectDelayMs = options?.maxReconnectDelayMs ?? 30_000;
38
+ this.maxReconnects = options?.maxReconnects ?? 0; // 0 = unlimited
39
+ this.jitterFactor = options?.jitterFactor ?? 0.25;
40
+ this.fetchFn = options?.fetchFn ?? fetch;
41
+ }
42
+ close() {
43
+ this.closed = true;
44
+ }
45
+ /**
46
+ * Subscribe with a callback. Returns an unsubscribe function.
47
+ */
48
+ subscribe(onEvent, onError) {
49
+ let active = true;
50
+ const run = async () => {
51
+ try {
52
+ for await (const event of this) {
53
+ if (!active)
54
+ break;
55
+ onEvent(event);
56
+ }
57
+ }
58
+ catch (err) {
59
+ if (active) {
60
+ onError?.(err);
61
+ }
62
+ }
63
+ };
64
+ void run();
65
+ return () => {
66
+ active = false;
67
+ this.close();
68
+ };
69
+ }
70
+ [Symbol.asyncIterator]() {
71
+ return this.createIterator();
72
+ }
73
+ createIterator() {
74
+ const queue = [];
75
+ const resolvers = [];
76
+ let done = false;
77
+ let error = null;
78
+ const push = (event) => {
79
+ if (resolvers.length > 0) {
80
+ const resolve = resolvers.shift();
81
+ resolve({ value: event, done: false });
82
+ }
83
+ else {
84
+ queue.push(event);
85
+ }
86
+ };
87
+ const finish = (err) => {
88
+ done = true;
89
+ error = err ?? null;
90
+ for (const resolve of resolvers) {
91
+ if (err) {
92
+ resolve({ value: undefined, done: true });
93
+ }
94
+ else {
95
+ resolve({ value: undefined, done: true });
96
+ }
97
+ }
98
+ resolvers.length = 0;
99
+ };
100
+ // Start consuming in background
101
+ void this.consume(push, finish);
102
+ return {
103
+ next() {
104
+ if (queue.length > 0) {
105
+ return Promise.resolve({ value: queue.shift(), done: false });
106
+ }
107
+ if (done) {
108
+ if (error) {
109
+ return Promise.reject(error);
110
+ }
111
+ return Promise.resolve({ value: undefined, done: true });
112
+ }
113
+ return new Promise((resolve) => {
114
+ resolvers.push(resolve);
115
+ });
116
+ },
117
+ return() {
118
+ finish();
119
+ return Promise.resolve({ value: undefined, done: true });
120
+ },
121
+ };
122
+ }
123
+ async consume(push, finish) {
124
+ while (!this.closed) {
125
+ try {
126
+ await this.readStream(push);
127
+ // Clean close from server
128
+ if (this.reconnectDelayMs === 0)
129
+ break;
130
+ if (this.maxReconnects > 0 && this.reconnectCount >= this.maxReconnects)
131
+ break;
132
+ }
133
+ catch (err) {
134
+ if (this.closed)
135
+ break;
136
+ if (this.reconnectDelayMs === 0)
137
+ break;
138
+ if (this.maxReconnects > 0 && this.reconnectCount >= this.maxReconnects) {
139
+ finish(err);
140
+ return;
141
+ }
142
+ }
143
+ if (this.closed)
144
+ break;
145
+ if (this.reconnectDelayMs === 0)
146
+ break;
147
+ this.reconnectCount++;
148
+ // Exponential backoff with jitter, capped at maxReconnectDelayMs
149
+ const baseDelay = Math.min(this.reconnectDelayMs * Math.pow(2, Math.min(this.reconnectCount - 1, 10)), this.maxReconnectDelayMs);
150
+ const jitter = baseDelay * this.jitterFactor * (Math.random() * 2 - 1);
151
+ const delay = Math.max(0, baseDelay + jitter);
152
+ await this.sleep(delay);
153
+ }
154
+ finish();
155
+ }
156
+ async readStream(push) {
157
+ const headers = {
158
+ Authorization: `Bearer ${this.apiKey}`,
159
+ Accept: "text/event-stream",
160
+ "Cache-Control": "no-cache",
161
+ };
162
+ if (this.lastEventId) {
163
+ headers["Last-Event-ID"] = this.lastEventId;
164
+ }
165
+ const response = await this.fetchFn(this.endpoint, {
166
+ method: "GET",
167
+ headers,
168
+ });
169
+ if (!response.ok) {
170
+ throw new agent_sdk_error_1.AgentSdkError({
171
+ code: response.status === 401 || response.status === 403
172
+ ? "provider_auth_error"
173
+ : "execution_error",
174
+ status: response.status,
175
+ message: `SSE stream error: HTTP ${response.status}`,
176
+ });
177
+ }
178
+ if (!response.body) {
179
+ throw new agent_sdk_error_1.AgentSdkError({
180
+ code: "invalid_response",
181
+ message: "SSE response has no body",
182
+ });
183
+ }
184
+ const reader = response.body.getReader();
185
+ const decoder = new TextDecoder();
186
+ let buffer = "";
187
+ // Current event fields
188
+ let eventType = "message";
189
+ let dataLines = [];
190
+ let eventId;
191
+ try {
192
+ while (true) {
193
+ const { done, value } = await reader.read();
194
+ if (done || this.closed)
195
+ break;
196
+ buffer += decoder.decode(value, { stream: true });
197
+ const lines = buffer.split("\n");
198
+ buffer = lines.pop() ?? "";
199
+ for (const rawLine of lines) {
200
+ const line = rawLine.replace(/\r$/, "");
201
+ if (line === "") {
202
+ // Dispatch event
203
+ if (dataLines.length > 0) {
204
+ const rawData = dataLines.join("\n");
205
+ let parsedData = rawData;
206
+ try {
207
+ parsedData = JSON.parse(rawData);
208
+ }
209
+ catch {
210
+ // keep as string
211
+ }
212
+ push({ event: eventType, data: parsedData, id: eventId });
213
+ }
214
+ // Reset
215
+ eventType = "message";
216
+ dataLines = [];
217
+ eventId = undefined;
218
+ continue;
219
+ }
220
+ if (line.startsWith(":")) {
221
+ // Comment — ignore
222
+ continue;
223
+ }
224
+ const colonIdx = line.indexOf(":");
225
+ let field;
226
+ let fieldValue;
227
+ if (colonIdx === -1) {
228
+ field = line;
229
+ fieldValue = "";
230
+ }
231
+ else {
232
+ field = line.slice(0, colonIdx);
233
+ fieldValue = line.slice(colonIdx + 1).replace(/^ /, "");
234
+ }
235
+ switch (field) {
236
+ case "event":
237
+ eventType = fieldValue;
238
+ break;
239
+ case "data":
240
+ dataLines.push(fieldValue);
241
+ break;
242
+ case "id":
243
+ eventId = fieldValue;
244
+ this.lastEventId = fieldValue;
245
+ break;
246
+ case "retry": {
247
+ // Server-sent reconnect hint — ignore for now
248
+ break;
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+ finally {
255
+ reader.releaseLock();
256
+ }
257
+ }
258
+ sleep(ms) {
259
+ return new Promise((resolve) => globalThis.setTimeout(resolve, ms));
260
+ }
261
+ }
262
+ exports.SseEventStream = SseEventStream;
263
+ //# sourceMappingURL=sse-event-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-event-stream.js","sourceRoot":"","sources":["../../src/streaming/sse-event-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ export type AgentOnboardingMode = "siwe" | "walletless" | "legacy";
2
+ export type AgentScope = "read" | "trade" | "manage";
3
+ export type ProvisionedBot = {
4
+ botId: string;
5
+ publicId: string;
6
+ name: string;
7
+ };
8
+ export type ProvisionedMcp = {
9
+ endpoint: string;
10
+ apiKey?: string;
11
+ keyPrefix?: string;
12
+ keyId?: string;
13
+ };
14
+ export type ProvisionedBaseWallet = {
15
+ chainId: number;
16
+ custodialWallet?: {
17
+ address: string;
18
+ walletId?: string;
19
+ chainId?: number;
20
+ };
21
+ };
22
+ export type IdentityAccess = {
23
+ token: string;
24
+ tokenType: "Bearer";
25
+ expiresIn: number;
26
+ expiresAt: string;
27
+ kid: string;
28
+ issuer: string;
29
+ /** Scope granted at onboarding. "manage" is never issued at onboarding time. */
30
+ scope: "read" | "trade";
31
+ };
32
+ export type OnboardingResponse = {
33
+ /**
34
+ * Legacy flag from canonical API envelopes.
35
+ * SDK unwraps `{ success, data }`, so this is typically undefined.
36
+ */
37
+ success?: boolean;
38
+ bot: ProvisionedBot;
39
+ mcp: ProvisionedMcp;
40
+ base: ProvisionedBaseWallet;
41
+ onboardingInstructions?: string;
42
+ onboarding?: {
43
+ mode: AgentOnboardingMode;
44
+ chainId: number;
45
+ registryVerified: boolean;
46
+ identityProvider?: string;
47
+ };
48
+ identityAccess?: IdentityAccess;
49
+ };
50
+ export type SiweNonceResponse = {
51
+ message: string;
52
+ nonce?: string;
53
+ issuedAt?: string;
54
+ expiresAt?: string;
55
+ };
56
+ export type OnboardWithSiweInput = {
57
+ message: string;
58
+ signature: string;
59
+ agentId: string;
60
+ /** Optional existing bot binding target (owned bot id). */
61
+ botId?: string;
62
+ /** Requested MCP key scope. Defaults to "trade" if omitted. */
63
+ scope?: "read" | "trade";
64
+ };
65
+ export type OnboardWithIdentityInput = {
66
+ provider: string;
67
+ identityToken: string;
68
+ agentId: string;
69
+ /** Optional existing bot binding target (owned bot id). */
70
+ botId?: string;
71
+ chainId?: number;
72
+ /** Requested MCP key scope. Defaults to "trade" if omitted. */
73
+ scope?: "read" | "trade";
74
+ };
75
+ export type RequestSiweNonceInput = {
76
+ address: string;
77
+ chainId: number;
78
+ domain: string;
79
+ uri: string;
80
+ statement?: string;
81
+ };
82
+ export type RevokeIdentityTokenInput = {
83
+ jti: string;
84
+ ttlSeconds?: number;
85
+ };
86
+ export type IdentityTokenRevokeStatusInput = {
87
+ jti: string;
88
+ };
89
+ export type IdentityTokenRevokeResponse = {
90
+ revoked: boolean;
91
+ jti: string;
92
+ };
93
+ export type McpTool = {
94
+ name: string;
95
+ description?: string;
96
+ inputSchema?: Record<string, unknown>;
97
+ };
98
+ export type McpListToolsResponse = {
99
+ tools: McpTool[];
100
+ };
101
+ export type McpTextContent = {
102
+ type: "text";
103
+ text: string;
104
+ };
105
+ export type McpCallToolResponse = {
106
+ content: McpTextContent[];
107
+ isError?: boolean;
108
+ };
109
+ /** Structured response from agent mode LLM calls */
110
+ export type AgentResponse = {
111
+ answer: string;
112
+ confidence: number;
113
+ sources?: string[];
114
+ tool_calls?: Array<{
115
+ tool_name: string;
116
+ result: unknown;
117
+ success: boolean;
118
+ }>;
119
+ follow_up_suggestions?: string[];
120
+ };
121
+ /** x-balchemy extension fields present in MCP tools/list entries */
122
+ export type McpToolExtensions = {
123
+ 'x-balchemy-category'?: string;
124
+ 'x-balchemy-data-contract'?: string;
125
+ 'x-balchemy-requires-scope'?: string;
126
+ 'x-balchemy-rate-limit'?: string;
127
+ };
128
+ /** Extended MCP tool with balchemy metadata from the tools/list response */
129
+ export type McpToolWithMetadata = McpTool & {
130
+ extensions?: McpToolExtensions;
131
+ };
132
+ export type AgentSdkConfig = {
133
+ /**
134
+ * Base URL for the Balchemy API, including the `/api` path segment.
135
+ *
136
+ * The SDK appends endpoint paths (e.g. `/public/erc8004/onboarding/identity`)
137
+ * directly to this value, so it must NOT have a trailing slash.
138
+ *
139
+ * @example
140
+ * // Local development
141
+ * apiBaseUrl: "http://localhost:3000/api"
142
+ *
143
+ * @example
144
+ * // Production
145
+ * apiBaseUrl: "https://api.balchemy.ai/api"
146
+ */
147
+ apiBaseUrl: string;
148
+ timeoutMs?: number;
149
+ fetchFn?: typeof fetch;
150
+ };
151
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Retry utility with exponential backoff + jitter.
3
+ *
4
+ * Retries only on transient errors (network_error, execution_error ≥500,
5
+ * rate_limit_error with Retry-After support).
6
+ *
7
+ * Usage:
8
+ * const result = await withRetry(() => fetch(...), { maxAttempts: 3 });
9
+ */
10
+ export type RetryOptions = {
11
+ /** Maximum number of total attempts (including the first). Default: 3 */
12
+ maxAttempts?: number;
13
+ /** Base delay in ms for exponential backoff. Default: 200 */
14
+ baseDelayMs?: number;
15
+ /** Maximum delay cap in ms. Default: 5000 */
16
+ maxDelayMs?: number;
17
+ /** Whether to add random jitter (±25%). Default: true */
18
+ jitter?: boolean;
19
+ /** Override the sleep function — useful in tests. */
20
+ sleepFn?: (ms: number) => Promise<void>;
21
+ /** Optional retry predicate for endpoint/error-aware policies. */
22
+ shouldRetry?: (error: unknown, context: RetryDecisionContext) => boolean;
23
+ };
24
+ export type RetryDecisionContext = {
25
+ attempt: number;
26
+ maxAttempts: number;
27
+ };
28
+ export declare function defaultShouldRetry(error: unknown): boolean;
29
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
30
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,MAAM,YAAY,GAAG;IACzB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,kEAAkE;IAClE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;CAC1E,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM1D;AAwBD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CAsDZ"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Retry utility with exponential backoff + jitter.
4
+ *
5
+ * Retries only on transient errors (network_error, execution_error ≥500,
6
+ * rate_limit_error with Retry-After support).
7
+ *
8
+ * Usage:
9
+ * const result = await withRetry(() => fetch(...), { maxAttempts: 3 });
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.defaultShouldRetry = defaultShouldRetry;
13
+ exports.withRetry = withRetry;
14
+ const agent_sdk_error_1 = require("../errors/agent-sdk-error");
15
+ const RETRYABLE_CODES = new Set([
16
+ "network_error",
17
+ "execution_error",
18
+ "rate_limit_error",
19
+ ]);
20
+ function defaultShouldRetry(error) {
21
+ if (error instanceof agent_sdk_error_1.AgentSdkError) {
22
+ return RETRYABLE_CODES.has(error.code);
23
+ }
24
+ // Plain Error (e.g. AbortError on timeout) — always retry
25
+ return error instanceof Error;
26
+ }
27
+ function computeDelay(attempt, baseDelayMs, maxDelayMs, jitter) {
28
+ // Exponential: base * 2^attempt (attempt 0-indexed)
29
+ const exponential = Math.min(baseDelayMs * 2 ** attempt, maxDelayMs);
30
+ if (!jitter) {
31
+ return exponential;
32
+ }
33
+ // ±25% uniform jitter
34
+ const spread = exponential * 0.25;
35
+ return Math.round(exponential - spread + Math.random() * spread * 2);
36
+ }
37
+ const defaultSleep = (ms) => new Promise((resolve) => {
38
+ // globalThis.setTimeout is available in both Node.js and browser environments
39
+ globalThis.setTimeout(resolve, ms);
40
+ });
41
+ async function withRetry(fn, options) {
42
+ const maxAttempts = options?.maxAttempts ?? 3;
43
+ const baseDelayMs = options?.baseDelayMs ?? 200;
44
+ const maxDelayMs = options?.maxDelayMs ?? 5000;
45
+ const jitter = options?.jitter ?? true;
46
+ const sleepFn = options?.sleepFn ?? defaultSleep;
47
+ const shouldRetry = options?.shouldRetry ??
48
+ ((error) => defaultShouldRetry(error));
49
+ let lastError;
50
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
51
+ try {
52
+ return await fn();
53
+ }
54
+ catch (error) {
55
+ lastError = error;
56
+ const isLastAttempt = attempt === maxAttempts - 1;
57
+ if (isLastAttempt ||
58
+ !shouldRetry(error, {
59
+ attempt,
60
+ maxAttempts,
61
+ })) {
62
+ throw error;
63
+ }
64
+ // If rate-limited with a Retry-After hint, respect it (capped)
65
+ let delayMs = computeDelay(attempt, baseDelayMs, maxDelayMs, jitter);
66
+ if (error instanceof agent_sdk_error_1.AgentSdkError &&
67
+ error.code === "rate_limit_error" &&
68
+ typeof error.details === "object" &&
69
+ error.details !== null) {
70
+ const details = error.details;
71
+ const retryAfterSec = typeof details["retry-after"] === "number"
72
+ ? details["retry-after"]
73
+ : typeof details["retryAfter"] === "number"
74
+ ? details["retryAfter"]
75
+ : null;
76
+ if (retryAfterSec !== null) {
77
+ delayMs = Math.min(retryAfterSec * 1000, maxDelayMs);
78
+ }
79
+ }
80
+ await sleepFn(delayMs);
81
+ }
82
+ }
83
+ throw lastError;
84
+ }
85
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@balchemyai/agent-sdk",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "private": false,
6
+ "description": "Balchemy external AI agent onboarding + MCP SDK — ERC-8004 onboarding, Solana/EVM trading, 100 tools via MCP",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "CHANGELOG.md",
20
+ "docs"
21
+ ],
22
+ "keywords": [
23
+ "balchemy",
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "ai-agent",
27
+ "erc8004",
28
+ "solana",
29
+ "evm",
30
+ "base",
31
+ "crypto",
32
+ "trading",
33
+ "onboarding",
34
+ "defi",
35
+ "wallet",
36
+ "typescript"
37
+ ],
38
+ "homepage": "https://balchemy.ai",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/balchemy/balchemy-agent",
42
+ "directory": "packages/sdk"
43
+ },
44
+ "bugs": {
45
+ "url": "https://github.com/balchemy/balchemy-agent/issues"
46
+ },
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.json",
52
+ "typecheck": "tsc --noEmit -p tsconfig.json",
53
+ "test": "jest",
54
+ "test:cov": "jest --coverage",
55
+ "prepublishOnly": "pnpm run typecheck && pnpm run build"
56
+ },
57
+ "dependencies": {
58
+ "js-yaml": "^4.1.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/jest": "^30.0.0",
62
+ "@types/js-yaml": "^4.0.9",
63
+ "@types/node": "22.17.2",
64
+ "jest": "^30.0.0",
65
+ "ts-jest": "^29.3.4",
66
+ "typescript": "5.8.3"
67
+ }
68
+ }