@secondlayer/sdk 7.0.0 → 8.0.1

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/dist/x402.js.map DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["src/x402.ts", "src/errors.ts", "src/base.ts"],
4
- "sourcesContent": [
5
- "import {\n\ttype X402TokenSymbol,\n\tX402_TOKENS,\n\tfindX402TokenByAsset,\n} from \"@secondlayer/shared/x402\";\nimport { http, createPublicClient } from \"@secondlayer/stacks\";\nimport type { LocalAccount } from \"@secondlayer/stacks/accounts\";\nimport { getNonce } from \"@secondlayer/stacks/actions\";\nimport type { StacksChain } from \"@secondlayer/stacks/chains\";\nimport {\n\tserializeTransactionHex,\n\tsignTransactionWithAccount,\n} from \"@secondlayer/stacks/transactions\";\nimport { buildExactTransfer } from \"@secondlayer/stacks/x402\";\nimport { resolveBaseUrl } from \"./base.ts\";\n\n/**\n * Client for the x402 pay-per-request rail. Turns a 402 challenge into a signed\n * `PAYMENT-SIGNATURE` and retries — gasless (the agent signs origin-only; the\n * facilitator sponsors the STX fee) and accountless (no key/Stripe/session).\n *\n * Three layers:\n * - `withX402(fetch, opts)` — drop-in fetch that auto-pays on 402.\n * - `createX402Client(opts)` — `.get/.post` returning `{ data, payment }`.\n * - `buildSignedX402Payment` / `readX402Challenge` — primitives for custom transports.\n */\n\nexport type X402Accept = {\n\tscheme: \"exact\";\n\tnetwork: string;\n\tasset: string;\n\t/** Atomic units. */\n\tamount: string;\n\tpayTo: string;\n\tmaxTimeoutSeconds: number;\n\textra: { nonce: string };\n};\n\nexport type X402Challenge = {\n\tx402Version: number;\n\taccepts: X402Accept[];\n\terror?: string;\n};\n\n/** Decoded `PAYMENT-RESPONSE` settlement receipt. */\nexport type X402Receipt = {\n\tsuccess: boolean;\n\t/** Settlement tier: `optimistic` (served on broadcast-accept, reconciled\n\t * async) or `confirmed` (canonical). Absent on older deployments. */\n\tstate?: \"optimistic\" | \"confirmed\";\n\ttxid: string;\n\tpayer: string;\n\tnetwork: string;\n};\n\n/** Bitcoin-native first — sBTC is the compelling micropay asset; USDCx the\n * dollar peg; STX the fallback. Override via `preferAssets`. */\nexport const DEFAULT_PREFER_ASSETS: X402TokenSymbol[] = [\n\t\"sBTC\",\n\t\"USDCx\",\n\t\"STX\",\n];\n\n/** Default node for auto-resolving the payer's account nonce (`/v2/accounts`). */\nexport const DEFAULT_NONCE_NODE_URL = \"https://api.hiro.so\";\n\n/** Thrown when no offered asset is within the caller's spend guard / preferences. */\nexport class X402SpendGuardError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"X402SpendGuardError\";\n\t}\n}\n\n// btoa/atob operate on latin-1 strings, so JSON (which may hold any unicode)\n// round-trips through TextEncoder/TextDecoder. Buffer is avoided on purpose:\n// the SDK's auth path is edge-safe (see resolveApiKey's `process` guard) and\n// payments must not be the one surface that throws `Buffer is not defined`.\nfunction b64encode(value: unknown): string {\n\tconst utf8 = new TextEncoder().encode(JSON.stringify(value));\n\tlet binary = \"\";\n\tfor (const byte of utf8) binary += String.fromCharCode(byte);\n\treturn btoa(binary);\n}\n\nfunction b64decodeJson<T>(value: string): T | null {\n\ttry {\n\t\tconst binary = atob(value);\n\t\tconst utf8 = Uint8Array.from(binary, (ch) => ch.charCodeAt(0));\n\t\treturn JSON.parse(new TextDecoder().decode(utf8)) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Read the x402 challenge from a 402 response — prefer the wire header, fall\n * back to the JSON body. */\nexport async function readX402Challenge(\n\tres: Response,\n): Promise<X402Challenge | null> {\n\tconst header = res.headers.get(\"PAYMENT-REQUIRED\");\n\tif (header) {\n\t\tconst decoded = b64decodeJson<X402Challenge>(header);\n\t\tif (decoded) return decoded;\n\t}\n\ttry {\n\t\treturn (await res.clone().json()) as X402Challenge;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Read the settlement receipt from a paid 200 response. */\nexport function readX402Receipt(res: Response): X402Receipt | null {\n\tconst header = res.headers.get(\"PAYMENT-RESPONSE\");\n\treturn header ? b64decodeJson<X402Receipt>(header) : null;\n}\n\nexport type SelectOfferOptions = {\n\tpreferAssets?: X402TokenSymbol[];\n\tmaxAmountPerCall?: Partial<Record<X402TokenSymbol, bigint>>;\n};\n\n/** Choose an `accepts[]` entry by preference order, skipping any that exceed the\n * per-asset spend cap. Throws {@link X402SpendGuardError} if none qualify. */\nexport function selectOffer(\n\tchallenge: X402Challenge,\n\topts: SelectOfferOptions = {},\n): { accept: X402Accept; symbol: X402TokenSymbol } {\n\tconst prefer = opts.preferAssets ?? DEFAULT_PREFER_ASSETS;\n\tfor (const symbol of prefer) {\n\t\tconst token = X402_TOKENS[symbol];\n\t\tconst accept = challenge.accepts.find((a) => a.asset === token.asset);\n\t\tif (!accept) continue;\n\t\tconst cap = opts.maxAmountPerCall?.[symbol];\n\t\tif (cap !== undefined && BigInt(accept.amount) > cap) continue;\n\t\treturn { accept, symbol };\n\t}\n\tthrow new X402SpendGuardError(\n\t\t\"no x402 offer matched preferAssets within maxAmountPerCall\",\n\t);\n}\n\n/** Fetch the payer account's next nonce from a Stacks node (`/v2/accounts`). */\nexport async function resolveAccountNonce(\n\taddress: string,\n\tnodeUrl: string = DEFAULT_NONCE_NODE_URL,\n): Promise<number> {\n\tconst client = createPublicClient({ transport: http(nodeUrl) });\n\treturn Number(await getNonce(client, { address }));\n}\n\nexport type BuildSignedX402PaymentOptions = {\n\tchallenge: X402Challenge;\n\taccount: LocalAccount;\n\t/** The payer account's next nonce. */\n\taccountNonce: bigint | number | string;\n\t/** Preferred asset string (e.g. an sBTC/USDCx id). Defaults to the first offer. */\n\tasset?: string;\n\tchain?: StacksChain;\n};\n\n/** Build a signed, base64 `PAYMENT-SIGNATURE` header for one `accepts[]` entry. */\nexport async function buildSignedX402Payment(\n\topts: BuildSignedX402PaymentOptions,\n): Promise<{ header: string; accept: X402Accept }> {\n\tconst accept = opts.asset\n\t\t? opts.challenge.accepts.find((a) => a.asset === opts.asset)\n\t\t: opts.challenge.accepts[0];\n\tif (!accept) {\n\t\tthrow new Error(\n\t\t\t`No x402 offer${opts.asset ? ` for asset ${opts.asset}` : \"\"}`,\n\t\t);\n\t}\n\tconst token = findX402TokenByAsset(accept.asset);\n\tif (!token) throw new Error(`Unknown x402 asset: ${accept.asset}`);\n\n\tconst asset =\n\t\ttoken.contractId && token.assetName\n\t\t\t? {\n\t\t\t\t\tkind: \"sip010\" as const,\n\t\t\t\t\tcontractId: token.contractId,\n\t\t\t\t\tassetName: token.assetName,\n\t\t\t\t}\n\t\t\t: { kind: \"stx\" as const };\n\n\tconst tx = buildExactTransfer({\n\t\tasset,\n\t\tamount: BigInt(accept.amount),\n\t\tpayTo: accept.payTo,\n\t\tpayer: opts.account.address,\n\t\tpayerPublicKey: opts.account.publicKey,\n\t\taccountNonce: opts.accountNonce,\n\t\tnonce: accept.extra.nonce,\n\t\tchain: opts.chain,\n\t});\n\tconst signed = await signTransactionWithAccount(tx, opts.account);\n\n\tconst header = b64encode({\n\t\tx402Version: opts.challenge.x402Version ?? 2,\n\t\tscheme: \"exact\",\n\t\tnetwork: accept.network,\n\t\tasset: accept.asset,\n\t\tpayload: { transaction: serializeTransactionHex(signed) },\n\t\textra: { nonce: accept.extra.nonce },\n\t});\n\treturn { header, accept };\n}\n\nexport type WithX402Options = SelectOfferOptions & {\n\taccount: LocalAccount;\n\t/** Prepaid-credit token (PAYMENT-BALANCE) from a prior deposit — calls\n\t * debit the tab server-side instead of settling on-chain per call. */\n\tbalanceToken?: string;\n\t/** Autonomous treasury policy: when the tab's remaining balance (read from\n\t * X-BALANCE-REMAINING-USD) drops below `whenBelow`, deposit `usd` more in\n\t * the background (one on-chain payment) and adopt the fresh token. */\n\ttopUp?: { usd: number; whenBelow: number };\n\t/** Override the payer nonce; auto-resolved from `nodeUrl` when omitted. */\n\taccountNonce?: bigint | number | string;\n\t/** Node for auto-nonce lookup. Defaults to {@link DEFAULT_NONCE_NODE_URL}. */\n\tnodeUrl?: string;\n\tchain?: StacksChain;\n\t/** Fired just before the paid retry (the call then blocks on confirmed-tier\n\t * settle, or returns near-instantly on an optimistic surface). */\n\tonSettling?: (info: { asset: string; amount: string }) => void;\n\t/** Abort the paid retry after this long. */\n\ttimeoutMs?: number;\n};\n\nexport type X402Fetch = (\n\tinput: string | URL,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\n/**\n * Wrap a `fetch` so requests transparently pay on 402: select an offer (by\n * `preferAssets` + `maxAmountPerCall`), resolve the nonce, sign origin-only, and\n * retry once with `PAYMENT-SIGNATURE`. Returns the final `Response` (read the\n * receipt with {@link readX402Receipt}).\n *\n * @example\n * const x402fetch = withX402(fetch, { account });\n * const res = await x402fetch(\"http://127.0.0.1:3800/v1/index/events?event_type=ft_transfer\");\n */\nexport function withX402(\n\tbaseFetch: typeof fetch,\n\topts: WithX402Options,\n): X402Fetch {\n\t// Session vouchers (PAYMENT-SESSION): surfaces with session pricing hand\n\t// back a voucher on settle — replaying it lets subsequent calls ride the\n\t// paid session instead of re-paying per request. Cached per origin; the\n\t// server is authoritative (a 402 despite a voucher just restarts the\n\t// payment cycle and refreshes the cache).\n\tconst sessions = new Map<string, string>();\n\tlet balanceToken = opts.balanceToken ?? null;\n\tlet toppingUp = false;\n\tconst originOf = (input: Parameters<X402Fetch>[0]) => {\n\t\ttry {\n\t\t\treturn new URL(String(input)).origin;\n\t\t} catch {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tconst wrapped: X402Fetch = async (input, init) => {\n\t\tconst origin = originOf(input);\n\t\tconst run = (extra: Record<string, string>, signal?: AbortSignal) =>\n\t\t\tbaseFetch(input, {\n\t\t\t\t...init,\n\t\t\t\theaders: { ...(init?.headers as Record<string, string>), ...extra },\n\t\t\t\t...(signal ? { signal } : {}),\n\t\t\t});\n\n\t\t// Treasury policy: refill the tab in the background before it empties.\n\t\t// The deposit goes through this same wrapper (402 → pay → credited);\n\t\t// its response carries the fresh PAYMENT-BALANCE token.\n\t\tconst maybeTopUp = (res: Response) => {\n\t\t\tconst policy = opts.topUp;\n\t\t\tif (!policy || toppingUp || !origin) return;\n\t\t\tconst remaining = res.headers.get(\"X-BALANCE-REMAINING-USD\");\n\t\t\tif (remaining === null || Number(remaining) >= policy.whenBelow) return;\n\t\t\ttoppingUp = true;\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst dep = await wrapped(\n\t\t\t\t\t\t`${origin}/v1/x402/deposit?usd=${policy.usd}`,\n\t\t\t\t\t\t{ method: \"POST\" },\n\t\t\t\t\t);\n\t\t\t\t\tif (dep.ok) {\n\t\t\t\t\t\tconst body = (await dep.json()) as { balance_token?: string };\n\t\t\t\t\t\tif (body.balance_token) balanceToken = body.balance_token;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// next sub-threshold response retries the top-up\n\t\t\t\t} finally {\n\t\t\t\t\ttoppingUp = false;\n\t\t\t\t}\n\t\t\t})();\n\t\t};\n\n\t\tconst remember = (res: Response) => {\n\t\t\tconst voucher = res.headers.get(\"PAYMENT-SESSION\");\n\t\t\tif (voucher && origin) sessions.set(origin, voucher);\n\t\t\tmaybeTopUp(res);\n\t\t\treturn res;\n\t\t};\n\n\t\tconst cached = origin ? sessions.get(origin) : undefined;\n\t\tconst first = await run({\n\t\t\t...(cached ? { \"PAYMENT-SESSION\": cached } : {}),\n\t\t\t...(balanceToken ? { \"PAYMENT-BALANCE\": balanceToken } : {}),\n\t\t});\n\t\tif (first.status !== 402) return remember(first);\n\t\tif (cached && origin) sessions.delete(origin);\n\n\t\tconst challenge = await readX402Challenge(first);\n\t\tif (!challenge) return first;\n\n\t\tconst { accept } = selectOffer(challenge, opts);\n\t\tconst accountNonce =\n\t\t\topts.accountNonce ??\n\t\t\t(await resolveAccountNonce(opts.account.address, opts.nodeUrl));\n\t\tconst { header } = await buildSignedX402Payment({\n\t\t\tchallenge,\n\t\t\taccount: opts.account,\n\t\t\taccountNonce,\n\t\t\tasset: accept.asset,\n\t\t\tchain: opts.chain,\n\t\t});\n\n\t\topts.onSettling?.({ asset: accept.asset, amount: accept.amount });\n\t\tconst signal = opts.timeoutMs\n\t\t\t? AbortSignal.timeout(opts.timeoutMs)\n\t\t\t: undefined;\n\t\treturn remember(await run({ \"PAYMENT-SIGNATURE\": header }, signal));\n\t};\n\treturn wrapped;\n}\n\nexport type X402ClientOptions = WithX402Options & {\n\t/** Instance API. Defaults to {@link resolveBaseUrl}. */\n\tbaseUrl?: string;\n\t/** Override the underlying fetch (tests). */\n\tfetch?: typeof fetch;\n};\n\nexport type X402Result<T = unknown> = {\n\tdata: T;\n\t/** Settlement receipt, or null if the response carried none. */\n\tpayment: X402Receipt | null;\n\tresponse: Response;\n};\n\nexport type X402Client = {\n\tget<T = unknown>(\n\t\tpath: string,\n\t\to?: { query?: Record<string, string> },\n\t): Promise<X402Result<T>>;\n\tpost<T = unknown>(\n\t\tpath: string,\n\t\to?: { body?: unknown },\n\t): Promise<X402Result<T>>;\n};\n\n/**\n * A small client over {@link withX402}: `.get/.post` against `baseUrl`, returning\n * parsed JSON plus the settlement receipt.\n *\n * @example\n * const sl = createX402Client({ account, baseUrl: \"http://127.0.0.1:3800\" });\n * const { data, payment } = await sl.get(\"/v1/index/events\", { query: { event_type: \"ft_transfer\" } });\n */\nexport function createX402Client(opts: X402ClientOptions): X402Client {\n\tconst f = withX402(opts.fetch ?? fetch, opts);\n\tconst base = resolveBaseUrl(opts.baseUrl);\n\n\tasync function request<T>(\n\t\tmethod: \"GET\" | \"POST\",\n\t\tpath: string,\n\t\to: { query?: Record<string, string>; body?: unknown } = {},\n\t): Promise<X402Result<T>> {\n\t\tconst qs = o.query ? `?${new URLSearchParams(o.query).toString()}` : \"\";\n\t\tconst init: RequestInit = { method };\n\t\tif (o.body !== undefined) {\n\t\t\tinit.body = JSON.stringify(o.body);\n\t\t\tinit.headers = { \"content-type\": \"application/json\" };\n\t\t}\n\t\tconst response = await f(`${base}${path}${qs}`, init);\n\t\tconst data = (await response.json().catch(() => null)) as T;\n\t\treturn { data, payment: readX402Receipt(response), response };\n\t}\n\n\treturn {\n\t\tget: <T = unknown>(path: string, o?: { query?: Record<string, string> }) =>\n\t\t\trequest<T>(\"GET\", path, o),\n\t\tpost: <T = unknown>(path: string, o?: { body?: unknown }) =>\n\t\t\trequest<T>(\"POST\", path, o),\n\t};\n}\n\n/** Caller-supplied fetch that re-runs the request with the given extra headers. */\nexport type X402FetchFn = (\n\textraHeaders: Record<string, string>,\n) => Promise<Response>;\n\nexport type PayAndRetryOptions = Omit<WithX402Options, never> & {\n\t/** Required here (use `withX402` for auto-nonce). */\n\taccountNonce: bigint | number | string;\n};\n\n/**\n * Low-level: run a request via a caller-controlled fetch; if it 402s, pay and\n * retry once. Prefer {@link withX402} for the common case (it auto-resolves the\n * nonce + selects the asset). Kept for custom transports.\n */\nexport async function payAndRetry(\n\tdoFetch: X402FetchFn,\n\topts: PayAndRetryOptions,\n): Promise<Response> {\n\tconst first = await doFetch({});\n\tif (first.status !== 402) return first;\n\tconst challenge = await readX402Challenge(first);\n\tif (!challenge) return first;\n\tconst { accept } = selectOffer(challenge, opts);\n\tconst { header } = await buildSignedX402Payment({\n\t\tchallenge,\n\t\taccount: opts.account,\n\t\taccountNonce: opts.accountNonce,\n\t\tasset: accept.asset,\n\t\tchain: opts.chain,\n\t});\n\treturn doFetch({ \"PAYMENT-SIGNATURE\": header });\n}\n",
6
- "const DOCS_BASE = \"https://www.secondlayer.tools\";\n\n/** Options accepted by every error in the family. */\nexport interface SecondLayerErrorOptions {\n\tcause?: Error;\n\tdetails?: string;\n\t/** Stable machine-readable code (e.g. `UPGRADE_REQUIRED`). */\n\tcode?: string;\n\t/** Docs page that explains this failure and its fix. */\n\tdocsUrl?: string;\n\t/** Extra context lines appended to the message (DDL to run, next steps). */\n\tmetaMessages?: string[];\n\t/** Whether retrying the SAME request can succeed (429/5xx/network). */\n\tretryable?: boolean;\n\t/** Parsed `Retry-After`, in seconds — set on rate limits that carry it. */\n\tretryAfterSeconds?: number;\n}\n\n/**\n * Root of the SDK error family. Implements the same protocol as `BaseError`\n * in `@secondlayer/stacks` (`shortMessage`, `cause`, `toJSON`) so a failed\n * chain read and a failed platform read serialize and introspect identically.\n * It intentionally does NOT extend that class: cross-package `instanceof` is\n * unreliable under per-package bundling anyway (match on `code`/`name` across\n * packages).\n *\n * `retryable` is the signal the consume loops act on: 429/5xx/network are\n * retryable, 4xx and body-serialization failures are not.\n */\nexport class SecondLayerError extends Error {\n\toverride name = \"SecondLayerError\";\n\t/** The one-line failure, without the appended context blocks. */\n\tshortMessage: string;\n\tcode?: string;\n\tdocsUrl?: string;\n\tmetaMessages?: string[];\n\tretryable: boolean;\n\tretryAfterSeconds?: number;\n\n\tconstructor(shortMessage: string, options: SecondLayerErrorOptions = {}) {\n\t\tconst detailBlocks = [\n\t\t\t...(options.metaMessages ?? []),\n\t\t\t...(options.details ? [options.details] : []),\n\t\t\t...(options.docsUrl ? [`Docs: ${options.docsUrl}`] : []),\n\t\t];\n\t\tconst message = [\n\t\t\tshortMessage,\n\t\t\tdetailBlocks.length > 0 ? `\\n${detailBlocks.join(\"\\n\")}` : \"\",\n\t\t].join(\"\");\n\t\tsuper(message, options.cause ? { cause: options.cause } : undefined);\n\t\tthis.shortMessage = shortMessage;\n\t\tthis.code = options.code;\n\t\tthis.docsUrl = options.docsUrl;\n\t\tthis.metaMessages = options.metaMessages;\n\t\tthis.retryable = options.retryable ?? false;\n\t\tthis.retryAfterSeconds = options.retryAfterSeconds;\n\t}\n\n\t/**\n\t * Walk the cause chain. With a predicate, returns the first error matching\n\t * it (or `null`); without one, returns the deepest cause. Mirrors viem's\n\t * `error.walk()` so cross-library error handling reads the same.\n\t */\n\twalk(fn?: (err: unknown) => boolean): unknown {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: cause chains are untyped by nature\n\t\tlet err: any = this;\n\t\tlet last: unknown = this;\n\t\twhile (err != null) {\n\t\t\tif (fn?.(err)) return err;\n\t\t\tlast = err;\n\t\t\terr = err.cause;\n\t\t}\n\t\treturn fn ? null : last;\n\t}\n\n\ttoJSON(): {\n\t\tname: string;\n\t\tmessage: string;\n\t\tshortMessage: string;\n\t\tcause: string | undefined;\n\t\tcode: string | undefined;\n\t\tdocsUrl: string | undefined;\n\t\tretryable: boolean;\n\t\tretryAfterSeconds: number | undefined;\n\t} {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tshortMessage: this.shortMessage,\n\t\t\tcause: this.cause instanceof Error ? this.cause.message : undefined,\n\t\t\tcode: this.code,\n\t\t\tdocsUrl: this.docsUrl,\n\t\t\tretryable: this.retryable,\n\t\t\tretryAfterSeconds: this.retryAfterSeconds,\n\t\t};\n\t}\n}\n\n/** Retryability of an HTTP status: 429 and 5xx are transient. */\nfunction statusRetryable(status: number): boolean {\n\treturn status === 429 || status >= 500;\n}\n\n/** Docs page for a status/code pair, when one exists. */\nfunction docsFor(status: number, code?: string): string | undefined {\n\tif (code === \"UPGRADE_REQUIRED\" || status === 402)\n\t\treturn `${DOCS_BASE}/docs/authentication#pay-as-you-go-credits`;\n\tif (status === 429 || status === 401)\n\t\treturn `${DOCS_BASE}/docs/authentication`;\n\treturn undefined;\n}\n\n/**\n * Error thrown by {@link SecondLayer} when an API request fails.\n * Includes the HTTP status code for programmatic error handling.\n *\n * @example\n * ```ts\n * try {\n * await client.subgraphs.get(\"my-subgraph\");\n * } catch (err) {\n * if (err instanceof ApiError && err.status === 404) {\n * console.log(\"Subgraph not found\");\n * }\n * }\n * ```\n */\nexport class ApiError extends SecondLayerError {\n\tconstructor(\n\t\t/** HTTP status code (0 for network errors). */\n\t\tpublic status: number,\n\t\tmessage: string,\n\t\t/** Raw response body (parsed JSON if possible) — preserved for callers that need error details. */\n\t\tpublic body?: unknown,\n\t\t/** Stable machine-readable code from the API's `{error, code}` error envelope. */\n\t\tcode?: string,\n\t\toptions: SecondLayerErrorOptions = {},\n\t) {\n\t\tsuper(message, {\n\t\t\tcode,\n\t\t\tretryable: options.retryable ?? statusRetryable(status),\n\t\t\tdocsUrl: options.docsUrl ?? docsFor(status, code),\n\t\t\t...(options.cause ? { cause: options.cause } : {}),\n\t\t\t...(options.details ? { details: options.details } : {}),\n\t\t\t...(options.metaMessages ? { metaMessages: options.metaMessages } : {}),\n\t\t\t...(options.retryAfterSeconds !== undefined\n\t\t\t\t? { retryAfterSeconds: options.retryAfterSeconds }\n\t\t\t\t: {}),\n\t\t});\n\t\tthis.name = \"ApiError\";\n\t}\n}\n\n/** Thrown on a 401 — by both the platform clients and Streams. */\nexport class AuthError extends ApiError {\n\toverride readonly status = 401 as const;\n\n\tconstructor(message = \"API key invalid or expired.\") {\n\t\tsuper(401, message);\n\t\tthis.name = \"AuthError\";\n\t}\n}\n\n/** Thrown on a 429 — by both the platform clients and Streams. `retryable`,\n * with `retryAfterSeconds` parsed from the `Retry-After` header when sent. */\nexport class RateLimitError extends ApiError {\n\toverride readonly status = 429 as const;\n\n\tconstructor(\n\t\tmessage = \"Rate limited. Try again later.\",\n\t\t/** Raw `Retry-After` header value (seconds or HTTP-date). */\n\t\treadonly retryAfter?: string,\n\t) {\n\t\tsuper(429, message, undefined, undefined, {\n\t\t\tretryable: true,\n\t\t\tretryAfterSeconds: parseRetryAfter(retryAfter),\n\t\t});\n\t\tthis.name = \"RateLimitError\";\n\t}\n}\n\n/** Thrown on a 4xx the caller can fix (bad cursor, bad params). Never retried. */\nexport class ValidationError extends ApiError {\n\tconstructor(message: string, status: number, body?: unknown) {\n\t\tsuper(status, message, body, undefined, { retryable: false });\n\t\tthis.name = \"ValidationError\";\n\t}\n}\n\n/** Parse a `Retry-After` header: delta-seconds or an HTTP-date. */\nexport function parseRetryAfter(value?: string | null): number | undefined {\n\tif (!value) return undefined;\n\tconst seconds = Number(value);\n\tif (Number.isFinite(seconds) && seconds >= 0) return seconds;\n\tconst date = Date.parse(value);\n\tif (!Number.isNaN(date)) return Math.max(0, (date - Date.now()) / 1000);\n\treturn undefined;\n}\n\n/**\n * Thrown on optimistic-concurrency conflict when a deploy supplies an\n * `expectedVersion` that no longer matches the server's stored version.\n */\nexport class VersionConflictError extends ApiError {\n\tconstructor(\n\t\tpublic currentVersion: string,\n\t\tpublic expectedVersion: string,\n\t\tmessage = `Version conflict: expected ${expectedVersion}, current ${currentVersion}`,\n\t) {\n\t\tsuper(409, message, { currentVersion, expectedVersion });\n\t\tthis.name = \"VersionConflictError\";\n\t}\n}\n",
7
- "import { ApiError, AuthError, RateLimitError } from \"./errors.ts\";\n\nexport type FetchLike = (\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\nexport interface SecondLayerOptions {\n\t/** Base URL of the instance API (trailing slashes are stripped). */\n\tbaseUrl: string;\n\t/** Bearer token for authenticated requests. */\n\tapiKey?: string;\n\t/** Fetch implementation. Tests and edge runtimes can provide their own. */\n\tfetchImpl?: FetchLike;\n\t/** Public base URL for Streams bulk parquet dumps (the cold backfill plane).\n\t * Required for `streams.dumps.*`; without it the dumps client falls back to\n\t * its built-in default. */\n\tdumpsBaseUrl?: string;\n\t/** Deploy origin label sent as `x-sl-origin` (telemetry). Defaults to `cli`. */\n\torigin?: \"cli\" | \"mcp\" | \"session\";\n}\n\n/** Product default: the local one-box API. Override with `baseUrl` or `SL_API_URL`. */\nexport const LOCAL_API_URL = \"http://127.0.0.1:3800\";\n\nexport function resolveBaseUrl(explicit?: string): string {\n\tif (explicit && explicit.length > 0) return explicit.replace(/\\/+$/, \"\");\n\tif (typeof process !== \"undefined\") {\n\t\tconst fromEnv = process.env?.SL_API_URL || process.env?.SECONDLAYER_API_URL;\n\t\tif (fromEnv) return fromEnv.replace(/\\/+$/, \"\");\n\t}\n\treturn LOCAL_API_URL;\n}\n\n/** Resolve the credential a client should use. An explicit `apiKey` option\n * always wins — including an explicit `\"\"`, which is how you opt a client\n * back into keyless reads on a machine that has a key exported. Otherwise\n * fall back to `SL_API_KEY`, the single credential var shared with the CLI\n * and MCP server, so `new Index()` picks up an already-exported key instead\n * of silently running keyless and 402-ing on the first deep-history read.\n * Guarded for browsers and edge runtimes, where `process` is undefined. */\nexport function resolveApiKey(apiKey?: string): string | undefined {\n\tif (apiKey !== undefined) return apiKey;\n\tif (typeof process === \"undefined\") return undefined;\n\treturn process.env?.SL_API_KEY || undefined;\n}\n\n/** Build a query-string suffix from name→value pairs. Skips null/undefined and\n * empty values; arrays are comma-joined. Returns \"\" (never a dangling \"?\") or\n * \"?a=1&b=2\" — the one canonical builder every list endpoint shares, so the\n * empty-query guard can't be forgotten per call site. */\nexport function buildQuery(\n\tparams: Record<\n\t\tstring,\n\t\tnumber | string | boolean | readonly string[] | null | undefined\n\t>,\n): string {\n\tconst search = new URLSearchParams();\n\tfor (const [name, value] of Object.entries(params)) {\n\t\tif (value === undefined || value === null) continue;\n\t\tconst serialized = Array.isArray(value) ? value.join(\",\") : String(value);\n\t\tif (serialized.length === 0) continue;\n\t\tsearch.set(name, serialized);\n\t}\n\tconst query = search.toString();\n\treturn query ? `?${query}` : \"\";\n}\n\nexport abstract class BaseClient {\n\tprotected baseUrl: string;\n\tprotected apiKey?: string;\n\tprotected origin: \"cli\" | \"mcp\" | \"session\";\n\tprotected fetchImpl: FetchLike;\n\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tthis.baseUrl = resolveBaseUrl(options.baseUrl);\n\t\tthis.apiKey = resolveApiKey(options.apiKey);\n\t\tthis.origin = options.origin ?? \"cli\";\n\t\t// Bind the global so a bare `fetch` reference doesn't lose its Request\n\t\t// context on runtimes where fetch is a method (workerd, older Node).\n\t\tthis.fetchImpl = options.fetchImpl ?? ((...args) => fetch(...args));\n\t}\n\n\tstatic authHeaders(apiKey?: string): Record<string, string> {\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t};\n\t\tif (apiKey) {\n\t\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t\t}\n\t\treturn headers;\n\t}\n\n\tprotected async request<T>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<T> {\n\t\tconst response = await this.fetchResponse(method, path, body);\n\t\tif (response.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\t\treturn response.json() as Promise<T>;\n\t}\n\n\t/** Like `request`, but maps a 404 to `null` instead of throwing — the one\n\t * place that owns the \"absent resource\" rule for `get*` accessors. */\n\tprotected async requestOrNull<T>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<T | null> {\n\t\ttry {\n\t\t\treturn await this.request<T>(method, path, body);\n\t\t} catch (err) {\n\t\t\tif (err instanceof ApiError && err.status === 404) return null;\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprotected async requestText(\n\t\tmethod: string,\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<string> {\n\t\tconst response = await this.fetchResponse(method, path, body);\n\t\treturn response.text();\n\t}\n\n\tprivate async fetchResponse(\n\t\tmethod: string,\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<Response> {\n\t\tconst url = `${this.baseUrl}${path}`;\n\t\tconst headers = BaseClient.authHeaders(this.apiKey);\n\t\theaders[\"x-sl-origin\"] = this.origin;\n\n\t\t// Serialize the body BEFORE the network try so a body-encoding error\n\t\t// (e.g. unsupported BigInt) isn't misreported as \"Cannot reach API\".\n\t\t// BigInts are stringified — server schemas accept jsonb so the value\n\t\t// reaches the server intact, and any field that needs an actual bigint\n\t\t// at runtime is rehydrated by the consuming module (subgraph handler\n\t\t// code preserves the literal). See packages/subgraphs source-matcher\n\t\t// for the post-load shape.\n\t\tlet serializedBody: string | undefined;\n\t\tif (body !== undefined && body !== null) {\n\t\t\ttry {\n\t\t\t\tserializedBody = JSON.stringify(body, (_key, value) =>\n\t\t\t\t\ttypeof value === \"bigint\" ? value.toString() : value,\n\t\t\t\t);\n\t\t\t} catch (err) {\n\t\t\t\tconst detail = err instanceof Error ? err.message : String(err);\n\t\t\t\t// Not retryable: the same body will fail to serialize again.\n\t\t\t\tthrow new ApiError(\n\t\t\t\t\t0,\n\t\t\t\t\t`Failed to serialize request body: ${detail}`,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ retryable: false },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this.fetchImpl(url, {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tbody: serializedBody,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthrow new ApiError(\n\t\t\t\t0,\n\t\t\t\t`Cannot reach API at ${this.baseUrl}. Check your connection or try again.`,\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t{ retryable: true, cause: err instanceof Error ? err : undefined },\n\t\t\t);\n\t\t}\n\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 401) {\n\t\t\t\tthrow new AuthError();\n\t\t\t}\n\n\t\t\tif (response.status === 429) {\n\t\t\t\t// The header is preserved as `retryAfterSeconds` (not just prose) so\n\t\t\t\t// the consume loops can honor it.\n\t\t\t\tconst retryAfter = response.headers.get(\"Retry-After\");\n\t\t\t\tconst msg = retryAfter\n\t\t\t\t\t? `Rate limited. Wait ${retryAfter} seconds.`\n\t\t\t\t\t: \"Rate limited. Try again later.\";\n\t\t\t\tthrow new RateLimitError(msg, retryAfter ?? undefined);\n\t\t\t}\n\n\t\t\tif (response.status >= 500) {\n\t\t\t\tthrow new ApiError(\n\t\t\t\t\tresponse.status,\n\t\t\t\t\t`Server error. Try again or check status at ${this.baseUrl}/health`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst errorBody = await response.text();\n\t\t\tlet message = `HTTP ${response.status}`;\n\t\t\tlet parsedBody: unknown = errorBody;\n\t\t\tlet code: string | undefined;\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(errorBody);\n\t\t\t\tparsedBody = json;\n\t\t\t\tconst err = json.error ?? json.message;\n\t\t\t\tif (typeof err === \"string\") {\n\t\t\t\t\tmessage = err;\n\t\t\t\t} else if (err && typeof err === \"object\") {\n\t\t\t\t\tmessage = JSON.stringify(err);\n\t\t\t\t}\n\t\t\t\tif (typeof json.code === \"string\") {\n\t\t\t\t\tcode = json.code;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tif (errorBody) message = errorBody;\n\t\t\t}\n\t\t\tthrow new ApiError(response.status, message, parsedBody, code);\n\t\t}\n\n\t\treturn response;\n\t}\n}\n"
8
- ],
9
- "mappings": "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",
10
- "debugId": "BE9E5DFBC321406664756E2164756E21",
11
- "names": []
12
- }