@compose-market/sdk 0.1.1 → 0.2.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 (50) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +21 -0
  3. package/README.md +158 -35
  4. package/dist/errors.d.ts +145 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/errors.js +152 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/http.d.ts +98 -0
  9. package/dist/http.d.ts.map +1 -0
  10. package/dist/http.js +350 -0
  11. package/dist/http.js.map +1 -0
  12. package/dist/index.d.ts +104 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +137 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/resources/inference.d.ts +161 -0
  17. package/dist/resources/inference.d.ts.map +1 -0
  18. package/dist/resources/inference.js +710 -0
  19. package/dist/resources/inference.js.map +1 -0
  20. package/dist/resources/keys.d.ts +50 -0
  21. package/dist/resources/keys.d.ts.map +1 -0
  22. package/dist/resources/keys.js +154 -0
  23. package/dist/resources/keys.js.map +1 -0
  24. package/dist/resources/models.d.ts +26 -0
  25. package/dist/resources/models.d.ts.map +1 -0
  26. package/dist/resources/models.js +52 -0
  27. package/dist/resources/models.js.map +1 -0
  28. package/dist/resources/webhooks.d.ts +27 -0
  29. package/dist/resources/webhooks.d.ts.map +1 -0
  30. package/dist/resources/webhooks.js +78 -0
  31. package/dist/resources/webhooks.js.map +1 -0
  32. package/dist/resources/x402.d.ts +37 -0
  33. package/dist/resources/x402.d.ts.map +1 -0
  34. package/dist/resources/x402.js +72 -0
  35. package/dist/resources/x402.js.map +1 -0
  36. package/dist/streaming/receipt.d.ts +25 -0
  37. package/dist/streaming/receipt.d.ts.map +1 -0
  38. package/dist/streaming/receipt.js +92 -0
  39. package/dist/streaming/receipt.js.map +1 -0
  40. package/dist/streaming/sse.d.ts +29 -0
  41. package/dist/streaming/sse.d.ts.map +1 -0
  42. package/dist/streaming/sse.js +125 -0
  43. package/dist/streaming/sse.js.map +1 -0
  44. package/dist/types/index.d.ts +497 -0
  45. package/dist/types/index.d.ts.map +1 -0
  46. package/dist/types/index.js +10 -0
  47. package/dist/types/index.js.map +1 -0
  48. package/package.json +30 -20
  49. package/index.d.ts +0 -244
  50. package/index.js +0 -397
package/dist/http.d.ts ADDED
@@ -0,0 +1,98 @@
1
+ /**
2
+ * HTTP client core for the Compose Market SDK.
3
+ *
4
+ * Responsibilities:
5
+ * - Build canonical headers (Authorization / x-session-user-address / x-chain-id /
6
+ * PAYMENT-SIGNATURE / x-x402-max-amount-wei / x-idempotency-key / User-Agent).
7
+ * - Apply retries with exponential backoff + jitter (default 2 retries, honor
8
+ * Retry-After).
9
+ * - Attach an AbortSignal for caller-driven cancellation and an internal
10
+ * timeout.
11
+ * - Parse error envelopes + PaymentRequired into typed error classes.
12
+ * - Return an `APIPromise<T>` that exposes `.asResponse()` and `.withResponse()`
13
+ * so callers can read headers (receipts, request-id, tx hash) without parsing.
14
+ *
15
+ * Zero runtime dependencies. Uses the platform `fetch`.
16
+ */
17
+ export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
18
+ export interface RetryPolicy {
19
+ maxRetries: number;
20
+ initialDelayMs: number;
21
+ maxDelayMs: number;
22
+ jitter: boolean;
23
+ }
24
+ export interface HttpClientOptions {
25
+ baseUrl: string;
26
+ fetch: FetchLike;
27
+ timeoutMs: number;
28
+ defaultHeaders: Record<string, string>;
29
+ retry: RetryPolicy;
30
+ userAgent: string;
31
+ logger?: {
32
+ debug?: (msg: string, meta?: Record<string, unknown>) => void;
33
+ warn?: (msg: string, meta?: Record<string, unknown>) => void;
34
+ error?: (msg: string, meta?: Record<string, unknown>) => void;
35
+ };
36
+ }
37
+ export interface HeaderBagInput {
38
+ authJwt?: string;
39
+ composeKey?: string | null;
40
+ walletAddress?: string | null;
41
+ chainId?: number | null;
42
+ paymentSignature?: string;
43
+ x402MaxAmountWei?: string;
44
+ idempotencyKey?: string;
45
+ composeRunId?: string;
46
+ requestId?: string;
47
+ extra?: Record<string, string | undefined>;
48
+ }
49
+ export interface RequestOptions {
50
+ method: string;
51
+ path: string;
52
+ query?: Record<string, string | number | boolean | null | undefined>;
53
+ body?: unknown;
54
+ bodyType?: "json" | "form-data" | "raw";
55
+ rawBody?: BodyInit;
56
+ headers?: HeaderBagInput;
57
+ /** Override for streaming responses — skip JSON parsing. */
58
+ expectStream?: boolean;
59
+ signal?: AbortSignal;
60
+ /** Caller-provided per-call timeout (ms). */
61
+ timeoutMs?: number;
62
+ /** Caller-provided per-call retry policy. */
63
+ retry?: Partial<RetryPolicy>;
64
+ /**
65
+ * Treat this call as NOT retryable on network errors; useful for non-
66
+ * idempotent mutations the caller knows should only be attempted once.
67
+ */
68
+ doNotRetry?: boolean;
69
+ }
70
+ export interface APIPromise<T> extends PromiseLike<T> {
71
+ /** Return the raw `Response` without consuming the body. */
72
+ asResponse(): Promise<Response>;
73
+ /** Return `{ data, response }` with the parsed body and raw response. */
74
+ withResponse(): Promise<{
75
+ data: T;
76
+ response: Response;
77
+ }>;
78
+ /** Standard promise `catch`. */
79
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
80
+ /** Standard promise `finally`. */
81
+ finally(onfinally?: (() => void) | null): Promise<T>;
82
+ }
83
+ export declare function buildHeaders(input: HeaderBagInput & {
84
+ defaultHeaders: Record<string, string>;
85
+ userAgent: string;
86
+ bodyType?: "json" | "form-data" | "raw";
87
+ }): Headers;
88
+ export declare class HttpClient {
89
+ private readonly options;
90
+ constructor(options: HttpClientOptions);
91
+ request<T>(config: RequestOptions): APIPromise<T>;
92
+ private execute;
93
+ private computeBackoff;
94
+ private encodeBody;
95
+ private parseResponseBody;
96
+ private safeReadJson;
97
+ }
98
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/http.js ADDED
@@ -0,0 +1,350 @@
1
+ /**
2
+ * HTTP client core for the Compose Market SDK.
3
+ *
4
+ * Responsibilities:
5
+ * - Build canonical headers (Authorization / x-session-user-address / x-chain-id /
6
+ * PAYMENT-SIGNATURE / x-x402-max-amount-wei / x-idempotency-key / User-Agent).
7
+ * - Apply retries with exponential backoff + jitter (default 2 retries, honor
8
+ * Retry-After).
9
+ * - Attach an AbortSignal for caller-driven cancellation and an internal
10
+ * timeout.
11
+ * - Parse error envelopes + PaymentRequired into typed error classes.
12
+ * - Return an `APIPromise<T>` that exposes `.asResponse()` and `.withResponse()`
13
+ * so callers can read headers (receipts, request-id, tx hash) without parsing.
14
+ *
15
+ * Zero runtime dependencies. Uses the platform `fetch`.
16
+ */
17
+ import { BadRequestError, buildApiError, ComposeConnectionError, ComposeTimeoutError, RateLimitError, } from "./errors.js";
18
+ const RETRYABLE_STATUSES = new Set([408, 409, 425, 429, 500, 502, 503, 504]);
19
+ function delay(ms, signal) {
20
+ return new Promise((resolve, reject) => {
21
+ const timer = setTimeout(() => {
22
+ signal?.removeEventListener("abort", onAbort);
23
+ resolve();
24
+ }, ms);
25
+ const onAbort = () => {
26
+ clearTimeout(timer);
27
+ reject(new ComposeTimeoutError({ message: "request aborted" }));
28
+ };
29
+ if (signal) {
30
+ if (signal.aborted) {
31
+ clearTimeout(timer);
32
+ reject(new ComposeTimeoutError({ message: "request aborted" }));
33
+ return;
34
+ }
35
+ signal.addEventListener("abort", onAbort, { once: true });
36
+ }
37
+ });
38
+ }
39
+ function combineSignals(a, b) {
40
+ if (!a)
41
+ return b ?? new AbortController().signal;
42
+ if (!b)
43
+ return a;
44
+ const controller = new AbortController();
45
+ const forward = () => controller.abort();
46
+ if (a.aborted || b.aborted)
47
+ controller.abort();
48
+ a.addEventListener("abort", forward, { once: true });
49
+ b.addEventListener("abort", forward, { once: true });
50
+ return controller.signal;
51
+ }
52
+ function buildQueryString(query) {
53
+ if (!query)
54
+ return "";
55
+ const params = new URLSearchParams();
56
+ for (const [key, value] of Object.entries(query)) {
57
+ if (value === undefined || value === null)
58
+ continue;
59
+ params.append(key, String(value));
60
+ }
61
+ const encoded = params.toString();
62
+ return encoded.length > 0 ? `?${encoded}` : "";
63
+ }
64
+ function normalizeWalletAddress(value) {
65
+ const trimmed = value.trim().toLowerCase();
66
+ if (!/^0x[a-f0-9]{40}$/.test(trimmed)) {
67
+ throw new BadRequestError({ message: "wallet address must be a valid 0x-prefixed EVM address" });
68
+ }
69
+ return trimmed;
70
+ }
71
+ export function buildHeaders(input) {
72
+ const headers = new Headers();
73
+ for (const [key, value] of Object.entries(input.defaultHeaders)) {
74
+ headers.set(key, value);
75
+ }
76
+ if (input.bodyType === "json") {
77
+ headers.set("Content-Type", "application/json");
78
+ }
79
+ // For "form-data" we let the runtime set the multipart boundary; we do not
80
+ // set Content-Type manually. For "raw" the caller sets it.
81
+ if (input.authJwt) {
82
+ headers.set("Authorization", `Bearer ${input.authJwt}`);
83
+ }
84
+ else if (input.composeKey) {
85
+ headers.set("Authorization", `Bearer ${input.composeKey}`);
86
+ }
87
+ if (input.walletAddress) {
88
+ headers.set("x-session-user-address", normalizeWalletAddress(input.walletAddress));
89
+ }
90
+ if (typeof input.chainId === "number" && Number.isInteger(input.chainId) && input.chainId > 0) {
91
+ headers.set("x-chain-id", String(input.chainId));
92
+ }
93
+ if (input.paymentSignature) {
94
+ headers.set("PAYMENT-SIGNATURE", input.paymentSignature);
95
+ }
96
+ if (input.x402MaxAmountWei) {
97
+ headers.set("x-x402-max-amount-wei", input.x402MaxAmountWei);
98
+ }
99
+ if (input.idempotencyKey) {
100
+ headers.set("x-idempotency-key", input.idempotencyKey);
101
+ }
102
+ if (input.composeRunId) {
103
+ headers.set("x-compose-run-id", input.composeRunId);
104
+ }
105
+ if (input.requestId) {
106
+ headers.set("x-request-id", input.requestId);
107
+ }
108
+ headers.set("User-Agent", input.userAgent);
109
+ if (input.extra) {
110
+ for (const [key, value] of Object.entries(input.extra)) {
111
+ if (typeof value === "string" && value.length > 0) {
112
+ headers.set(key, value);
113
+ }
114
+ }
115
+ }
116
+ return headers;
117
+ }
118
+ function parseErrorBody(body) {
119
+ if (body && typeof body === "object") {
120
+ const envelope = body;
121
+ if (envelope.error && typeof envelope.error === "object") {
122
+ return {
123
+ code: envelope.error.code || "internal_error",
124
+ message: typeof envelope.error.message === "string" ? envelope.error.message : "Request failed",
125
+ details: envelope.error.details,
126
+ };
127
+ }
128
+ // Raw PaymentRequired body served directly as the 402 body (the x402
129
+ // core facilitator spec shape). Infer `payment_required` as the code.
130
+ const pr = body;
131
+ if (pr.x402Version === 2 && Array.isArray(pr.accepts)) {
132
+ const rawError = typeof pr.error === "string" ? pr.error : "Payment required";
133
+ return { code: "payment_required", message: rawError };
134
+ }
135
+ // Legacy shapes
136
+ const legacy = body;
137
+ if (typeof legacy.error === "string") {
138
+ return { code: (typeof legacy.code === "string" ? legacy.code : "internal_error"), message: legacy.error };
139
+ }
140
+ if (typeof legacy.message === "string") {
141
+ return { code: "internal_error", message: legacy.message };
142
+ }
143
+ }
144
+ return { code: "internal_error", message: "Request failed" };
145
+ }
146
+ function extractPaymentRequired(body, header) {
147
+ if (typeof header === "string" && header.length > 0) {
148
+ try {
149
+ const normalized = header.replace(/-/g, "+").replace(/_/g, "/");
150
+ const padding = normalized.length % 4 === 0 ? "" : "=".repeat(4 - (normalized.length % 4));
151
+ const decoded = typeof globalThis.atob === "function"
152
+ ? globalThis.atob(normalized + padding)
153
+ : Buffer.from(normalized + padding, "base64").toString("utf-8");
154
+ const bytes = new Uint8Array(decoded.length);
155
+ for (let i = 0; i < decoded.length; i += 1)
156
+ bytes[i] = decoded.charCodeAt(i);
157
+ const text = new TextDecoder("utf-8").decode(bytes);
158
+ const parsed = JSON.parse(text);
159
+ if (parsed && parsed.x402Version === 2 && Array.isArray(parsed.accepts)) {
160
+ return parsed;
161
+ }
162
+ }
163
+ catch {
164
+ // fall through
165
+ }
166
+ }
167
+ if (body && typeof body === "object") {
168
+ const record = body;
169
+ if (record.x402Version === 2 && Array.isArray(record.accepts) && record.resource) {
170
+ return record;
171
+ }
172
+ }
173
+ return null;
174
+ }
175
+ export class HttpClient {
176
+ options;
177
+ constructor(options) {
178
+ this.options = options;
179
+ }
180
+ request(config) {
181
+ // The promise is built lazily: `execute()` only runs when the caller
182
+ // awaits (or calls `.asResponse()` / `.withResponse()`). Awaiting the
183
+ // wrapper directly consumes the body; calling `.asResponse()` leaves
184
+ // the body intact so the caller can stream it.
185
+ let cachedJson = null;
186
+ let cachedStream = null;
187
+ const runJson = () => {
188
+ if (!cachedJson)
189
+ cachedJson = this.execute(config);
190
+ return cachedJson;
191
+ };
192
+ const runStream = () => {
193
+ if (!cachedStream)
194
+ cachedStream = this.execute({ ...config, expectStream: true });
195
+ return cachedStream;
196
+ };
197
+ const wrapper = {
198
+ then: (onFulfilled, onRejected) => runJson().then(({ data }) => data).then(onFulfilled, onRejected),
199
+ catch: (onRejected) => runJson().then(({ data }) => data).catch(onRejected),
200
+ finally: (onFinally) => runJson().then(({ data }) => data).finally(onFinally),
201
+ asResponse: async () => (await runStream()).response,
202
+ withResponse: async () => runJson(),
203
+ };
204
+ return wrapper;
205
+ }
206
+ async execute(config) {
207
+ const query = buildQueryString(config.query);
208
+ const url = `${this.options.baseUrl}${config.path}${query}`;
209
+ const bodyType = config.bodyType
210
+ ?? (config.rawBody !== undefined ? "raw" : "json");
211
+ const retry = { ...this.options.retry, ...(config.retry ?? {}) };
212
+ const timeoutMs = config.timeoutMs ?? this.options.timeoutMs;
213
+ const headers = buildHeaders({
214
+ ...(config.headers ?? {}),
215
+ defaultHeaders: this.options.defaultHeaders,
216
+ userAgent: this.options.userAgent,
217
+ bodyType,
218
+ });
219
+ const body = this.encodeBody(config, bodyType);
220
+ let attempt = 0;
221
+ let lastError = null;
222
+ while (true) {
223
+ attempt += 1;
224
+ const attemptController = new AbortController();
225
+ const timeoutHandle = setTimeout(() => attemptController.abort(), timeoutMs);
226
+ const signal = combineSignals(config.signal, attemptController.signal);
227
+ let response;
228
+ try {
229
+ response = await this.options.fetch(url, {
230
+ method: config.method,
231
+ headers,
232
+ body,
233
+ signal,
234
+ });
235
+ }
236
+ catch (fetchError) {
237
+ clearTimeout(timeoutHandle);
238
+ const isAbort = signal.aborted || (fetchError instanceof Error && (fetchError.name === "AbortError" || fetchError.message.includes("aborted")));
239
+ if (isAbort && config.signal?.aborted) {
240
+ throw new ComposeTimeoutError({ message: "request aborted" });
241
+ }
242
+ if (isAbort) {
243
+ lastError = new ComposeTimeoutError({
244
+ message: `request timed out after ${timeoutMs}ms`,
245
+ });
246
+ }
247
+ else {
248
+ lastError = new ComposeConnectionError({
249
+ message: fetchError instanceof Error ? fetchError.message : String(fetchError),
250
+ cause: fetchError,
251
+ });
252
+ }
253
+ if (config.doNotRetry || attempt > retry.maxRetries)
254
+ throw lastError;
255
+ await delay(this.computeBackoff(attempt, retry), config.signal);
256
+ continue;
257
+ }
258
+ clearTimeout(timeoutHandle);
259
+ if (response.ok) {
260
+ const data = config.expectStream ? undefined : await this.parseResponseBody(response);
261
+ return { data, response };
262
+ }
263
+ const errorBody = await this.safeReadJson(response);
264
+ const parsed = parseErrorBody(errorBody);
265
+ const requestId = response.headers.get("x-request-id") ?? response.headers.get("X-Request-Id") ?? undefined;
266
+ const retryAfterHeader = response.headers.get("retry-after");
267
+ const retryAfter = retryAfterHeader ? Math.max(0, parseInt(retryAfterHeader, 10)) : undefined;
268
+ const paymentRequired = response.status === 402
269
+ ? extractPaymentRequired(errorBody, response.headers.get("payment-required") ?? response.headers.get("PAYMENT-REQUIRED"))
270
+ : null;
271
+ const apiError = buildApiError({
272
+ status: response.status,
273
+ code: parsed.code,
274
+ message: parsed.message,
275
+ details: parsed.details,
276
+ requestId: requestId ?? undefined,
277
+ headers: headersToRecord(response.headers),
278
+ body: errorBody,
279
+ paymentRequired,
280
+ paymentRequiredHeader: response.headers.get("payment-required") ?? response.headers.get("PAYMENT-REQUIRED"),
281
+ retryAfter,
282
+ });
283
+ const isRetryable = RETRYABLE_STATUSES.has(response.status) && !config.doNotRetry;
284
+ if (isRetryable && attempt <= retry.maxRetries) {
285
+ const wait = apiError instanceof RateLimitError && apiError.retryAfter
286
+ ? apiError.retryAfter * 1000
287
+ : this.computeBackoff(attempt, retry);
288
+ await delay(wait, config.signal);
289
+ continue;
290
+ }
291
+ throw apiError;
292
+ }
293
+ }
294
+ computeBackoff(attempt, retry) {
295
+ const base = Math.min(retry.initialDelayMs * (2 ** (attempt - 1)), retry.maxDelayMs);
296
+ if (!retry.jitter)
297
+ return base;
298
+ // Full jitter — uniformly between 0 and base.
299
+ return Math.random() * base;
300
+ }
301
+ encodeBody(config, bodyType) {
302
+ if (config.method === "GET" || config.method === "HEAD")
303
+ return undefined;
304
+ if (config.rawBody !== undefined)
305
+ return config.rawBody;
306
+ if (bodyType === "json" && config.body !== undefined)
307
+ return JSON.stringify(config.body);
308
+ return undefined;
309
+ }
310
+ async parseResponseBody(response) {
311
+ const contentType = response.headers.get("content-type") || "";
312
+ if (contentType.includes("application/json")) {
313
+ const text = await response.text();
314
+ if (!text)
315
+ return undefined;
316
+ return JSON.parse(text);
317
+ }
318
+ if (contentType.startsWith("text/")) {
319
+ return (await response.text());
320
+ }
321
+ // Binary responses (audio/speech, etc.) return the raw Response via
322
+ // asResponse(); the generic T is set to undefined for callers who do
323
+ // not ask for the Response directly.
324
+ return undefined;
325
+ }
326
+ async safeReadJson(response) {
327
+ try {
328
+ const text = await response.text();
329
+ if (!text)
330
+ return null;
331
+ try {
332
+ return JSON.parse(text);
333
+ }
334
+ catch {
335
+ return text;
336
+ }
337
+ }
338
+ catch {
339
+ return null;
340
+ }
341
+ }
342
+ }
343
+ function headersToRecord(headers) {
344
+ const record = {};
345
+ headers.forEach((value, key) => {
346
+ record[key] = value;
347
+ });
348
+ return record;
349
+ }
350
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * `@compose-market/sdk` — Official SDK for Compose Market.
3
+ *
4
+ * Exposes the canonical header contract (`Authorization: Bearer compose-<jwt>`,
5
+ * `x-session-user-address`, `x-chain-id`) that powers Compose's first-party
6
+ * apps (web/, mesh/) and lets any third-party integrator embed:
7
+ *
8
+ * - Compose Key lifecycle (create / list / get / revoke, session metadata)
9
+ * - 45k+ model catalog (list / listAll / search / get / getParams)
10
+ * - OpenAI-shaped inference (chat.completions, responses, embeddings, images,
11
+ * audio.speech, audio.transcriptions, videos) with full SSE streaming and
12
+ * typed tool-call deltas + reasoning deltas.
13
+ * - x402 facilitator access (supported / chains / verify / settle) and typed
14
+ * decoders for PAYMENT-REQUIRED, PAYMENT-RESPONSE, X-Compose-Receipt.
15
+ * - Webhook signature verification (HMAC-SHA256, Stripe-style header).
16
+ *
17
+ * Design:
18
+ * - Zero runtime dependencies. Uses platform `fetch`, WebCrypto, TextDecoder,
19
+ * ReadableStream. Works in Node 20+, Bun, Deno, Cloudflare Workers, browsers.
20
+ * - Identity is whatever the integrator already has. The SDK does NOT call a
21
+ * wallet, does NOT request signatures, does NOT run KYC. The end-user's
22
+ * wallet address — produced by whatever auth stack the integrator already
23
+ * uses — is trusted in the same exact way our first-party apps trust it —
24
+ * via the `x-session-user-address` header. The Compose Key JWT returned by
25
+ * `keys.create(...)` is the real cryptographic identity from that point on.
26
+ * - Every billable call returns a `ComposeCompletion<T>` carrying the parsed
27
+ * body, the settlement receipt (if any), the request id, and the raw
28
+ * Response so integrators can read non-standard headers without parsing.
29
+ */
30
+ import { type FetchLike, type HttpClientOptions, type RetryPolicy } from "./http.js";
31
+ import { KeysResource } from "./resources/keys.js";
32
+ import { ModelsResource } from "./resources/models.js";
33
+ import { InferenceResource } from "./resources/inference.js";
34
+ import { X402Resource } from "./resources/x402.js";
35
+ import { WebhooksResource } from "./resources/webhooks.js";
36
+ export * from "./types/index.js";
37
+ export * from "./errors.js";
38
+ export type { APIPromise, HeaderBagInput, HttpClientOptions, RequestOptions, RetryPolicy, } from "./http.js";
39
+ export type { ComposeCallOptions, ComposeCompletion, ChatCompletionFinalResult, ResponsesStreamFinalResult, ComposeStreamIterator, } from "./resources/inference.js";
40
+ export type { ComposeWebhookEvent, VerifyWebhookInput, } from "./resources/webhooks.js";
41
+ export { decodeReceiptHeader, extractReceiptFromResponse, parseReceiptEvent } from "./streaming/receipt.js";
42
+ export { parseSSEStream } from "./streaming/sse.js";
43
+ export declare const SDK_VERSION = "1.0.0";
44
+ export interface ComposeSDKOptions {
45
+ /** API base URL. Defaults to `https://api.compose.market`. */
46
+ baseUrl?: string;
47
+ /** Custom fetch implementation. Defaults to the global `fetch`. */
48
+ fetch?: FetchLike;
49
+ /**
50
+ * End-user wallet address. Whatever identity stack you already use produced
51
+ * this address — pass it through. The SDK relays it exactly as our
52
+ * first-party apps do, and does not care how you obtained it.
53
+ */
54
+ userAddress?: string;
55
+ /**
56
+ * Chain id. Must be one of the facilitator-configured chains. Call
57
+ * `sdk.x402.facilitator.chains()` to enumerate supported chains + USDC
58
+ * contracts at runtime.
59
+ */
60
+ chainId?: number;
61
+ /**
62
+ * A previously-issued Compose Key JWT. The SDK stores this in-memory and
63
+ * attaches it as `Authorization: Bearer compose-<jwt>` on every call.
64
+ */
65
+ composeKey?: string;
66
+ /** Default timeout for each HTTP call, in milliseconds. Default 60_000. */
67
+ timeoutMs?: number;
68
+ /** Retry policy applied to transient errors (5xx, 429, network). */
69
+ retry?: Partial<RetryPolicy>;
70
+ /** Headers merged into every request. */
71
+ defaultHeaders?: Record<string, string>;
72
+ /**
73
+ * `User-Agent` suffix so Compose analytics can distinguish integrators.
74
+ * The base string is `@compose-market/sdk/<version>`.
75
+ */
76
+ userAgent?: string;
77
+ /** Optional debug/logging hooks. */
78
+ logger?: HttpClientOptions["logger"];
79
+ }
80
+ export declare class ComposeSDK {
81
+ readonly keys: KeysResource;
82
+ readonly models: ModelsResource;
83
+ readonly inference: InferenceResource;
84
+ readonly x402: X402Resource;
85
+ readonly webhooks: WebhooksResource;
86
+ readonly wallets: {
87
+ attach: (input: {
88
+ address: string;
89
+ chainId: number;
90
+ }) => void;
91
+ current: () => {
92
+ address: string | null;
93
+ chainId: number | null;
94
+ };
95
+ clear: () => void;
96
+ };
97
+ private readonly http;
98
+ private walletAddress;
99
+ private chainId;
100
+ private composeKey;
101
+ constructor(options?: ComposeSDKOptions);
102
+ }
103
+ export default ComposeSDK;
104
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,YAAY,EACR,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,WAAW,GACd,MAAM,WAAW,CAAC;AACnB,YAAY,EACR,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACR,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAC9B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;CACxC;AA6BD,qBAAa,UAAU;IACnB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEpC,QAAQ,CAAC,OAAO,EAAE;QACd,MAAM,EAAE,CAAC,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAC9D,OAAO,EAAE,MAAM;YAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;QAClE,KAAK,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC;IAEF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAgB;gBAEtB,OAAO,GAAE,iBAAsB;CA+D9C;AAED,eAAe,UAAU,CAAC"}