@compose-market/sdk 0.1.0 → 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 +186 -0
  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 -89
  49. package/index.d.ts +0 -244
  50. package/index.js +0 -397
package/CHANGELOG.md ADDED
@@ -0,0 +1,43 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0
4
+
5
+ First production-shaped release. Full rewrite from the 0.1.x typed-fetch prototype.
6
+
7
+ ### Highlights
8
+
9
+ - **Modular architecture** — dedicated resource classes (`KeysResource`, `ModelsResource`, `InferenceResource`, `X402Resource`, `WebhooksResource`) over a shared `HttpClient` with lazy request execution (no double-fire when a caller does both `await` and `.asResponse()`).
10
+ - **Streaming** — `AsyncIterable<ChatCompletionChunk>` and `AsyncIterable<ResponseStreamEvent>` with `.final()` for reassembled chat completions, tool-call deltas, and reasoning deltas.
11
+ - **Typed cost receipts** — every billable call returns `{ data, receipt, requestId, response }`; streams emit a terminal `event: compose.receipt` frame; non-streaming calls carry `X-Compose-Receipt` header + `compose_receipt` JSON field.
12
+ - **Canonical Compose model card** — `sdk.models.list()` returns the flat Compose-native shape `{ modelId, name, provider, type, contextWindow, pricing, ... }` exactly as served by `api.compose.market`. `sdk.models.search()` adds cursor pagination with modality/provider/price/context filters over the full ~45k catalog.
13
+ - **x402 v2 first-class** — facilitator `supported`/`chains`/`verify`/`settle` + typed decoders for `PAYMENT-REQUIRED`, `PAYMENT-RESPONSE`, `X-Compose-Receipt`. New `sdk.x402.facilitator.chains()` enumerates live chains + USDC contract metadata.
14
+ - **Typed error tree** — `ComposeError` → `ComposeAPIError` → `BadRequestError` / `AuthenticationError` / `PermissionDeniedError` / `NotFoundError` / `ConflictError` / `UnprocessableEntityError` / `RateLimitError` / `InternalServerError` / `ComposePaymentRequiredError` / `ComposeBudgetExhaustedError`. Every error carries `code`, `status`, `details`, `requestId`, and (for 402) `paymentRequired`.
15
+ - **Webhook verification** — HMAC-SHA256, Stripe-style `X-Compose-Signature: t=...,v1=...` header, constant-time comparison.
16
+ - **Retries + timeouts + AbortSignal** — jittered exponential backoff; honors `Retry-After`; auto-generates `X-Idempotency-Key` on mutations.
17
+ - **Video job streaming** — `sdk.inference.videos.stream(id)` / `.waitUntilDone(id, { onStatus })` for SSE-driven polling.
18
+
19
+ ### Breaking changes from 0.1.x
20
+
21
+ - Package entry moved from `./index.js` to `./dist/index.js` with dual `.d.ts` + sourcemaps.
22
+ - `ComposeApiError` renamed to `ComposeAPIError` (plus typed subclasses). Error envelopes now follow the canonical `{ error: { code, message, details? } }` shape.
23
+ - `sdk.keys.getActive()` no longer returns the token. The token is returned exactly once by `sdk.keys.create()` and must be persisted by the integrator (store in `localStorage`, keychain, secret store, etc.). Calling `getActive()` returns metadata only.
24
+ - `sdk.keys.revoke()` and the new `sdk.keys.get(id)` require possession of the target key's JWT (pass via `sdk.keys.use(token)` or the constructor).
25
+ - `sdk.inference.*` entry points now return `ComposeCompletion<T>` (`{ data, receipt, requestId, response }`) instead of the raw JSON body. Use `.data` to access the parsed body.
26
+ - Streaming is now an explicit `.stream()` method (separate from `.create()`) returning `ComposeStreamIterator<Chunk, Final>`. Passing `stream: true` to `.create()` throws `BadRequestError`.
27
+
28
+ ### Tests
29
+
30
+ - **Hermetic.** Three suites: `sdk.unit.test.ts` (pure), `sdk.streaming.test.ts` (in-test synthetic SSE server), `sdk.contract.test.ts` (in-test mock HTTP server with canned responses mirroring `api.compose.market`).
31
+ - No sibling-repo imports. No Redis. No Thirdweb. No secrets. No environment variables. Runs clean from a fresh `git clone`.
32
+
33
+ ### Infrastructure prerequisites
34
+
35
+ This release aligns with Compose api/ Phase 0 changes:
36
+ - `GET /api/session` no longer returns the Compose Key token (metadata only).
37
+ - `DELETE /api/keys/:keyId` requires JWT-possession auth.
38
+ - `GET /api/keys/:keyId` added for single-key inspection.
39
+ - `GET /api/x402/facilitator/chains` added for chain metadata enumeration.
40
+ - `X-Request-Id` is set on every response; `X-Compose-Receipt` on billable responses.
41
+ - SSE streams emit named `compose.receipt`, `compose.error`, `compose.video.status` events.
42
+ - CORS is unified (allow-list + `Vary: Origin` + explicit `Expose-Headers`).
43
+ - `POST /api/payments/prepare` honors `X-Idempotency-Key` — replays return the original intent unchanged.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 compose.market
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,186 @@
1
+ # `@compose-market/sdk`
2
+
3
+ Official Compose.Market SDK: Compose Keys, x402 v2 facilitator, 45k+ model catalog, and OpenAI-shaped streaming inference with typed cost receipts.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@compose-market/sdk.svg)](https://www.npmjs.com/package/@compose-market/sdk)
6
+ [![license](https://img.shields.io/npm/l/@compose-market/sdk.svg)](./LICENSE)
7
+
8
+ Zero runtime dependencies. Works in Node 20+, Bun, Deno, Cloudflare Workers, and modern browsers.
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install @compose-market/sdk
14
+ ```
15
+
16
+ ## Quick start
17
+
18
+ ```ts
19
+ import { ComposeSDK } from "@compose-market/sdk";
20
+
21
+ // Whatever identity stack you already use produced a wallet address for
22
+ // your user. Pass it through — Compose trusts it exactly the way our
23
+ // first-party apps do.
24
+ const sdk = new ComposeSDK({
25
+ userAddress: "0x1234567890abcdef1234567890abcdef12345678",
26
+ chainId: 43114, // Avalanche C-Chain
27
+ });
28
+
29
+ // Create a 10 USDC / 24 h Compose Key. The token is returned exactly once;
30
+ // store it client-side. Subsequent calls on this SDK instance carry it
31
+ // automatically as `Authorization: Bearer compose-<jwt>`.
32
+ const session = await sdk.keys.create({
33
+ purpose: "session",
34
+ budgetUsd: 10,
35
+ durationHours: 24,
36
+ });
37
+
38
+ // Non-streaming chat completion with a cost receipt.
39
+ const { data, receipt, requestId } = await sdk.inference.chat.completions.create({
40
+ model: "gpt-4.1-mini",
41
+ messages: [{ role: "user", content: "Hello!" }],
42
+ });
43
+ console.log(data.choices[0].message.content);
44
+ console.log("Charged", receipt?.finalAmountWei, "wei");
45
+ console.log("Request id:", requestId);
46
+
47
+ // Streaming chat completion — async iterable of ChatCompletionChunk.
48
+ const stream = sdk.inference.chat.completions.stream({
49
+ model: "gpt-4.1-mini",
50
+ messages: [{ role: "user", content: "Write a haiku about Avalanche." }],
51
+ });
52
+ for await (const chunk of stream) {
53
+ process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
54
+ }
55
+ const { chatCompletion, receipt: streamReceipt } = await stream.final();
56
+ console.log("\nTotal tokens:", chatCompletion.usage.total_tokens);
57
+ console.log("Settled:", streamReceipt?.finalAmountWei, "wei", streamReceipt?.txHash);
58
+ ```
59
+
60
+ ## Capabilities
61
+
62
+ ### Compose Keys
63
+
64
+ - `sdk.keys.create({ purpose, budgetUsd, durationHours, ... })` — creates a Compose Key JWT. Requires the underlying wallet to have pre-approved USDC to the Compose treasury for the requested budget.
65
+ - `sdk.keys.getActive({ chainId? })` — returns current session metadata (budget, expiry, warnings). **Does not** return the token; the token is returned exactly once by `create()` and must be persisted by the integrator.
66
+ - `sdk.keys.list()` — lists all keys for the attached wallet.
67
+ - `sdk.keys.get(keyId)` — inspects a single key. Requires possession of that key's JWT.
68
+ - `sdk.keys.revoke(keyId)` — revokes a key. Requires possession of that key's JWT.
69
+ - `sdk.keys.use(token)` / `sdk.keys.currentToken()` / `sdk.keys.clearToken()` — in-memory token management.
70
+
71
+ ### 45k+ Model Catalog
72
+
73
+ - `sdk.models.list()` — curated ~612-model set, canonical Compose shape (`{ modelId, name, provider, type, contextWindow, pricing, input, output, ... }`).
74
+ - `sdk.models.listAll()` — full ~45k catalog.
75
+ - `sdk.models.search({ q, modality, provider, priceMaxPerMTok, contextWindowMin, streaming, cursor, limit })` — cursor-paginated search.
76
+ - `sdk.models.get(modelId)` — single model details.
77
+ - `sdk.models.getParams(modelId)` — optional per-model parameters for image/video generation.
78
+
79
+ ### Inference
80
+
81
+ Every billable call resolves to `{ data, receipt, requestId, response }`. The receipt is also available as an SSE `event: compose.receipt` frame on streaming calls and as a `X-Compose-Receipt` base64-url header on all billable responses.
82
+
83
+ - `sdk.inference.chat.completions.create(params)` / `.stream(params)` — OpenAI Chat Completions with typed tool-call delta aggregation and `reasoning_content` deltas.
84
+ - `sdk.inference.responses.create(params)` / `.stream(params)` / `.get(id)` / `.inputItems(id)` / `.cancel(id)` — OpenAI Responses API.
85
+ - `sdk.inference.embeddings.create(params)`.
86
+ - `sdk.inference.images.generate(params)` / `.edit(params)`.
87
+ - `sdk.inference.audio.speech(params)` — returns the raw audio `Response`.
88
+ - `sdk.inference.audio.transcriptions(params)` — multipart/form-data when `file` is a Blob/File/Uint8Array; JSON+base64 when `file` is a string.
89
+ - `sdk.inference.videos.generate(params)` / `.get(id)` / `.stream(id)` / `.waitUntilDone(id, { onStatus })` — async video job polling via SSE.
90
+
91
+ ### x402
92
+
93
+ - `sdk.x402.facilitator.supported()` — enumerate schemes + CAIP-2 networks the facilitator is configured for.
94
+ - `sdk.x402.facilitator.chains()` — full chain metadata (USDC contract, explorer, testnet flag).
95
+ - `sdk.x402.facilitator.verify(body)` / `.settle(body)` — direct facilitator access.
96
+ - `sdk.x402.decodePaymentRequired(headerValue)` / `.decodePaymentResponse(headerValue)` / `.decodeReceipt(headerValue)` — typed base64-url decoders for the three x402 v2 headers.
97
+
98
+ ### Webhooks
99
+
100
+ - `sdk.webhooks.verify({ body, signature, secret })` — HMAC-SHA256 signature verification (constant-time).
101
+ - `sdk.webhooks.constructEvent({ body, signature, secret })` — verify + parse into a typed event. Throws on invalid signatures.
102
+
103
+ ## Error model
104
+
105
+ Typed error hierarchy — every error derives from `ComposeError` and has a stable `code` matching the canonical server enum.
106
+
107
+ ```ts
108
+ import {
109
+ ComposeError,
110
+ ComposeAPIError,
111
+ ComposePaymentRequiredError,
112
+ ComposeBudgetExhaustedError,
113
+ AuthenticationError,
114
+ PermissionDeniedError,
115
+ NotFoundError,
116
+ RateLimitError,
117
+ ComposeConnectionError,
118
+ ComposeTimeoutError,
119
+ } from "@compose-market/sdk";
120
+
121
+ try {
122
+ await sdk.inference.chat.completions.create({ /* ... */ });
123
+ } catch (err) {
124
+ if (err instanceof ComposePaymentRequiredError) {
125
+ console.log("x402 payment required:", err.paymentRequired);
126
+ } else if (err instanceof RateLimitError) {
127
+ console.log("Retry after", err.retryAfter, "seconds");
128
+ } else {
129
+ throw err;
130
+ }
131
+ }
132
+ ```
133
+
134
+ ## Streaming events
135
+
136
+ The SDK surfaces every SSE event the Compose gateway emits:
137
+
138
+ - Standard OpenAI chunks (`chat.completion.chunk`, `response.output_text.delta`, `response.completed`).
139
+ - **Reasoning deltas** — `reasoning_content` in chat chunks, `response.reasoning.delta` in responses streams.
140
+ - **Tool-call deltas** — assembled across chunks into a typed `ChatCompletionMessageToolCall[]`.
141
+ - **`compose.receipt`** — terminal settlement receipt with tx hash, line items, platform fee.
142
+ - **`compose.error`** — structured stream errors when the upstream fails mid-flight.
143
+ - **`compose.video.status`** — video job progress updates on `videos.stream(id)`.
144
+
145
+ ## Retries, timeouts, AbortSignal
146
+
147
+ ```ts
148
+ const sdk = new ComposeSDK({
149
+ timeoutMs: 30_000,
150
+ retry: {
151
+ maxRetries: 3,
152
+ initialDelayMs: 500,
153
+ maxDelayMs: 8_000,
154
+ jitter: true,
155
+ },
156
+ });
157
+
158
+ const controller = new AbortController();
159
+ setTimeout(() => controller.abort(), 5_000);
160
+ await sdk.inference.chat.completions.create(
161
+ { model: "gpt-4.1-mini", messages: [{ role: "user", content: "..." }] },
162
+ { signal: controller.signal },
163
+ );
164
+ ```
165
+
166
+ The SDK auto-retries 408 / 409 / 425 / 429 / 5xx responses and transient network errors, honors `Retry-After` from 429 responses, and auto-generates an `X-Idempotency-Key` on mutating calls so retries are safe against the Compose facilitator.
167
+
168
+ ## Supported chains (v1.0)
169
+
170
+ - **Avalanche C-Chain** (`eip155:43114`)
171
+ - **Avalanche Fuji testnet** (`eip155:43113`)
172
+
173
+ Solana support ships in v1.1. Enumerate live chains with `sdk.x402.facilitator.chains()`.
174
+
175
+ ## What this SDK is NOT
176
+
177
+ - Not a wallet. The SDK never prompts for a signature, never creates a smart account, never runs KYC. Identity is whatever you already have.
178
+ - Not a retry-forever loop on payment-required errors. 402 responses are surfaced as typed errors; the caller decides what to do next.
179
+ - Not a Thirdweb/Privy/Clerk/Auth0 adapter. It's transport-agnostic on purpose — integrators bring whatever identity stack they already use.
180
+
181
+ Not bundled:
182
+ - No wallet client, no identity provider, no auth SDK. Bring the wallet address your stack produced and keep the rest of your infrastructure unchanged.
183
+
184
+ ## License
185
+
186
+ MIT
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Compose Market SDK — typed error hierarchy.
3
+ *
4
+ * Every error raised by the SDK derives from `ComposeError`. Callers can
5
+ * discriminate via `instanceof` (e.g. `err instanceof ComposePaymentRequiredError`)
6
+ * or via `err.code`, which always matches the canonical server error enum.
7
+ */
8
+ import type { ComposeErrorCode, ComposeReceipt, PaymentRequired } from "./types/index.js";
9
+ export declare class ComposeError extends Error {
10
+ readonly code: ComposeErrorCode;
11
+ readonly status?: number;
12
+ readonly details?: Record<string, unknown>;
13
+ readonly requestId?: string;
14
+ readonly headers?: Record<string, string>;
15
+ readonly body?: unknown;
16
+ constructor(input: {
17
+ code: ComposeErrorCode;
18
+ message: string;
19
+ status?: number;
20
+ details?: Record<string, unknown>;
21
+ requestId?: string;
22
+ headers?: Record<string, string>;
23
+ body?: unknown;
24
+ });
25
+ }
26
+ export declare class ComposeAPIError extends ComposeError {
27
+ constructor(input: {
28
+ code: ComposeErrorCode;
29
+ message: string;
30
+ status: number;
31
+ details?: Record<string, unknown>;
32
+ requestId?: string;
33
+ headers?: Record<string, string>;
34
+ body?: unknown;
35
+ });
36
+ }
37
+ export declare class BadRequestError extends ComposeAPIError {
38
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
39
+ code?: ComposeErrorCode;
40
+ });
41
+ }
42
+ export declare class AuthenticationError extends ComposeAPIError {
43
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
44
+ code?: ComposeErrorCode;
45
+ });
46
+ }
47
+ export declare class PermissionDeniedError extends ComposeAPIError {
48
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
49
+ code?: ComposeErrorCode;
50
+ });
51
+ }
52
+ export declare class NotFoundError extends ComposeAPIError {
53
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
54
+ code?: ComposeErrorCode;
55
+ });
56
+ }
57
+ export declare class ConflictError extends ComposeAPIError {
58
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
59
+ code?: ComposeErrorCode;
60
+ });
61
+ }
62
+ export declare class UnprocessableEntityError extends ComposeAPIError {
63
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
64
+ code?: ComposeErrorCode;
65
+ });
66
+ }
67
+ export declare class RateLimitError extends ComposeAPIError {
68
+ readonly retryAfter?: number;
69
+ constructor(input: Omit<ConstructorParameters<typeof ComposeAPIError>[0], "status" | "code"> & {
70
+ code?: ComposeErrorCode;
71
+ retryAfter?: number;
72
+ });
73
+ }
74
+ export declare class InternalServerError extends ComposeAPIError {
75
+ constructor(input: {
76
+ code?: ComposeErrorCode;
77
+ message: string;
78
+ status?: number;
79
+ details?: Record<string, unknown>;
80
+ requestId?: string;
81
+ headers?: Record<string, string>;
82
+ body?: unknown;
83
+ });
84
+ }
85
+ export declare class ComposePaymentRequiredError extends ComposeAPIError {
86
+ readonly paymentRequired: PaymentRequired | null;
87
+ readonly paymentRequiredHeader: string | null;
88
+ constructor(input: {
89
+ code?: ComposeErrorCode;
90
+ message: string;
91
+ details?: Record<string, unknown>;
92
+ requestId?: string;
93
+ headers?: Record<string, string>;
94
+ body?: unknown;
95
+ paymentRequired: PaymentRequired | null;
96
+ paymentRequiredHeader: string | null;
97
+ });
98
+ }
99
+ export declare class ComposeBudgetExhaustedError extends ComposeAPIError {
100
+ constructor(input: {
101
+ message: string;
102
+ details?: Record<string, unknown>;
103
+ requestId?: string;
104
+ headers?: Record<string, string>;
105
+ body?: unknown;
106
+ });
107
+ }
108
+ export declare class ComposeConnectionError extends ComposeError {
109
+ readonly cause?: unknown;
110
+ constructor(input: {
111
+ message: string;
112
+ cause?: unknown;
113
+ requestId?: string;
114
+ });
115
+ }
116
+ export declare class ComposeTimeoutError extends ComposeError {
117
+ constructor(input: {
118
+ message: string;
119
+ requestId?: string;
120
+ });
121
+ }
122
+ export interface ComposeCallFailure {
123
+ code: ComposeErrorCode;
124
+ message: string;
125
+ details?: Record<string, unknown>;
126
+ receipt?: ComposeReceipt;
127
+ }
128
+ /**
129
+ * Internal constructor: build the most specific error from a parsed HTTP
130
+ * response. Used by the HTTP client before the response is handed back to
131
+ * callers.
132
+ */
133
+ export declare function buildApiError(input: {
134
+ status: number;
135
+ code: ComposeErrorCode;
136
+ message: string;
137
+ details?: Record<string, unknown>;
138
+ requestId?: string;
139
+ headers?: Record<string, string>;
140
+ body?: unknown;
141
+ paymentRequired?: PaymentRequired | null;
142
+ paymentRequiredHeader?: string | null;
143
+ retryAfter?: number;
144
+ }): ComposeAPIError;
145
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/errors.js ADDED
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Compose Market SDK — typed error hierarchy.
3
+ *
4
+ * Every error raised by the SDK derives from `ComposeError`. Callers can
5
+ * discriminate via `instanceof` (e.g. `err instanceof ComposePaymentRequiredError`)
6
+ * or via `err.code`, which always matches the canonical server error enum.
7
+ */
8
+ export class ComposeError extends Error {
9
+ code;
10
+ status;
11
+ details;
12
+ requestId;
13
+ headers;
14
+ body;
15
+ constructor(input) {
16
+ super(input.message);
17
+ this.name = "ComposeError";
18
+ this.code = input.code;
19
+ this.status = input.status;
20
+ this.details = input.details;
21
+ this.requestId = input.requestId;
22
+ this.headers = input.headers;
23
+ this.body = input.body;
24
+ }
25
+ }
26
+ export class ComposeAPIError extends ComposeError {
27
+ constructor(input) {
28
+ super(input);
29
+ this.name = "ComposeAPIError";
30
+ }
31
+ }
32
+ export class BadRequestError extends ComposeAPIError {
33
+ constructor(input) {
34
+ super({ code: input.code ?? "validation_error", ...input, status: 400 });
35
+ this.name = "BadRequestError";
36
+ }
37
+ }
38
+ export class AuthenticationError extends ComposeAPIError {
39
+ constructor(input) {
40
+ super({ code: input.code ?? "authentication_failed", ...input, status: 401 });
41
+ this.name = "AuthenticationError";
42
+ }
43
+ }
44
+ export class PermissionDeniedError extends ComposeAPIError {
45
+ constructor(input) {
46
+ super({ code: input.code ?? "forbidden", ...input, status: 403 });
47
+ this.name = "PermissionDeniedError";
48
+ }
49
+ }
50
+ export class NotFoundError extends ComposeAPIError {
51
+ constructor(input) {
52
+ super({ code: input.code ?? "not_found", ...input, status: 404 });
53
+ this.name = "NotFoundError";
54
+ }
55
+ }
56
+ export class ConflictError extends ComposeAPIError {
57
+ constructor(input) {
58
+ super({ code: input.code ?? "conflict", ...input, status: 409 });
59
+ this.name = "ConflictError";
60
+ }
61
+ }
62
+ export class UnprocessableEntityError extends ComposeAPIError {
63
+ constructor(input) {
64
+ super({ code: input.code ?? "validation_error", ...input, status: 422 });
65
+ this.name = "UnprocessableEntityError";
66
+ }
67
+ }
68
+ export class RateLimitError extends ComposeAPIError {
69
+ retryAfter;
70
+ constructor(input) {
71
+ super({ code: input.code ?? "rate_limited", ...input, status: 429 });
72
+ this.name = "RateLimitError";
73
+ this.retryAfter = input.retryAfter;
74
+ }
75
+ }
76
+ export class InternalServerError extends ComposeAPIError {
77
+ constructor(input) {
78
+ super({ code: input.code ?? "internal_error", status: input.status ?? 500, message: input.message, details: input.details, requestId: input.requestId, headers: input.headers, body: input.body });
79
+ this.name = "InternalServerError";
80
+ }
81
+ }
82
+ export class ComposePaymentRequiredError extends ComposeAPIError {
83
+ paymentRequired;
84
+ paymentRequiredHeader;
85
+ constructor(input) {
86
+ super({ code: input.code ?? "payment_required", ...input, status: 402 });
87
+ this.name = "ComposePaymentRequiredError";
88
+ this.paymentRequired = input.paymentRequired;
89
+ this.paymentRequiredHeader = input.paymentRequiredHeader;
90
+ }
91
+ }
92
+ export class ComposeBudgetExhaustedError extends ComposeAPIError {
93
+ constructor(input) {
94
+ super({ code: "budget_exhausted", ...input, status: 402 });
95
+ this.name = "ComposeBudgetExhaustedError";
96
+ }
97
+ }
98
+ export class ComposeConnectionError extends ComposeError {
99
+ cause;
100
+ constructor(input) {
101
+ super({ code: "network_error", ...input });
102
+ this.name = "ComposeConnectionError";
103
+ this.cause = input.cause;
104
+ }
105
+ }
106
+ export class ComposeTimeoutError extends ComposeError {
107
+ constructor(input) {
108
+ super({ code: "timeout", ...input });
109
+ this.name = "ComposeTimeoutError";
110
+ }
111
+ }
112
+ /**
113
+ * Internal constructor: build the most specific error from a parsed HTTP
114
+ * response. Used by the HTTP client before the response is handed back to
115
+ * callers.
116
+ */
117
+ export function buildApiError(input) {
118
+ const base = {
119
+ code: input.code,
120
+ message: input.message,
121
+ details: input.details,
122
+ requestId: input.requestId,
123
+ headers: input.headers,
124
+ body: input.body,
125
+ };
126
+ if (input.status === 402) {
127
+ if (input.code === "budget_exhausted") {
128
+ return new ComposeBudgetExhaustedError(base);
129
+ }
130
+ return new ComposePaymentRequiredError({
131
+ ...base,
132
+ paymentRequired: input.paymentRequired ?? null,
133
+ paymentRequiredHeader: input.paymentRequiredHeader ?? null,
134
+ });
135
+ }
136
+ if (input.status === 400)
137
+ return new BadRequestError(base);
138
+ if (input.status === 401)
139
+ return new AuthenticationError(base);
140
+ if (input.status === 403)
141
+ return new PermissionDeniedError(base);
142
+ if (input.status === 404)
143
+ return new NotFoundError(base);
144
+ if (input.status === 409)
145
+ return new ConflictError(base);
146
+ if (input.status === 422)
147
+ return new UnprocessableEntityError(base);
148
+ if (input.status === 429)
149
+ return new RateLimitError({ ...base, retryAfter: input.retryAfter });
150
+ return new InternalServerError({ ...base, status: input.status });
151
+ }
152
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
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