@clocknext/sdk 0.20.0 → 0.20.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/README.md +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/webhooks.ts +3 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/queue.ts","../src/flusher.ts","../src/retry.ts","../src/http.ts","../src/filters.ts","../src/resources/composites.ts","../src/resources/credits.ts","../src/idempotency.ts","../src/resources/customers.ts","../src/resources/invoices.ts","../src/resources/outcomes.ts","../src/resources/payments.ts","../src/resources/plans.ts","../src/resources/portal.ts","../src/resources/purchases.ts","../src/customer-ref.ts","../src/resources/signals.ts","../src/resources/units.ts","../src/resources/taxes.ts","../src/webhooks.ts","../src/client.ts"],"names":["message","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Typed error hierarchy. The server returns `{ statusCode, statusDetail, result }`\n * with a meaningful HTTP status; we map that status to a class so callers can\n * branch on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒\n * ignore, it's queued) rather than string-matching messages.\n */\n\n/** Machine-readable failure code, when the server sends one\n * (`statusDetail.code`). Preferred over any message heuristic. */\nexport type ClockNextErrorCode =\n | \"ALLOWANCE_EXHAUSTED\"\n | \"PLAN_REJECTED\"\n | \"IDEMPOTENCY_UNRESOLVED\"\n | \"WEBHOOK_SIGNATURE_INVALID\"\n | (string & {});\n\nexport class ClockNextError extends Error {\n /** HTTP status, when the failure came from a server response. */\n readonly status?: number;\n /** Whether the SDK considers this failure worth retrying. */\n readonly retryable: boolean;\n /**\n * The server's machine-readable code, when it sent one. Branch on this in\n * preference to `.message`, which is human copy and may be reworded.\n */\n readonly code?: ClockNextErrorCode;\n /**\n * The idempotency key of the request that failed, for metering calls.\n *\n * This is what makes a dead-letter retry safe: re-send the failed signal with\n * this SAME key and the server deduplicates it instead of billing twice. A\n * fresh key would double-bill, so never generate one when replaying.\n */\n readonly idempotencyKey?: string;\n\n constructor(\n message: string,\n opts: {\n status?: number;\n retryable?: boolean;\n code?: ClockNextErrorCode;\n idempotencyKey?: string;\n } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.retryable = opts.retryable ?? false;\n this.code = opts.code;\n this.idempotencyKey = opts.idempotencyKey;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — missing / invalid / expired API key. */\nexport class AuthError extends ClockNextError {}\n\n/** 403 — the key is valid but cannot perform this operation. */\nexport class ForbiddenError extends ClockNextError {}\n\n/** 400 — malformed request / schema validation failure. */\nexport class ValidationError extends ClockNextError {}\n\n/** 404 — unknown customer (also returned for cross-org access). */\nexport class NotFoundError extends ClockNextError {}\n\n/** 422 — no active plan, meter not in plan, model not enabled, member missing. */\nexport class PlanError extends ClockNextError {}\n\n/** 422 — the entitlement ran out: no credits / units / outcomes / composite\n * slots left. Distinct from {@link PlanError} because the fix is different —\n * this one is a top-up or an upsell, not a configuration change. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict. Almost always permanent (an archived customer); only the\n * idempotency-resolution conflict is transient, and only that one retries. */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(\n message: string,\n opts: { retryAfterMs?: number; idempotencyKey?: string } = {},\n ) {\n super(message, {\n status: 429,\n retryable: true,\n idempotencyKey: opts.idempotencyKey,\n });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** A webhook request failed verification (`webhooks.constructEvent`): missing or\n * malformed signature header, wrong secret or altered body, a timestamp outside\n * the tolerance, or a body that is not a ClockNext event. Answer 400. */\nexport class WebhookSignatureError extends ClockNextError {\n constructor(message: string) {\n super(message, { status: 400, retryable: false, code: \"WEBHOOK_SIGNATURE_INVALID\" });\n }\n}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string, opts: { idempotencyKey?: string } = {}) {\n super(message, { retryable: true, idempotencyKey: opts.idempotencyKey });\n }\n}\n\n/**\n * Wire field path → the SDK field the caller actually wrote.\n *\n * The server validates the WIRE body and names the offending path in its 400\n * (`usage.inputTokens: Expected number…`). But the SDK groups those fields\n * differently — `tokens: { input, output, cache, cacheWrite }` — so the path it reports\n * names something that does not exist anywhere in this SDK's API. A caller\n * (human or LLM) then searches their own code for `usage.inputTokens`, finds\n * nothing, and has no next move.\n *\n * Rewriting the path closes that loop: the error names the property the caller\n * typed. Ordered longest-first so `usage.model` is rewritten before a bare\n * `usage` prefix could shadow it.\n */\nconst FIELD_PATHS: ReadonlyArray<readonly [RegExp, string]> = [\n [/\\busage\\.inputTokens\\b/g, \"tokens.input\"],\n [/\\busage\\.outputTokens\\b/g, \"tokens.output\"],\n [/\\busage\\.cacheTokens\\b/g, \"tokens.cache\"],\n [/\\busage\\.cacheWriteTokens\\b/g, \"tokens.cacheWrite\"],\n [/\\busage\\.model\\b/g, \"model\"],\n // A missing/invalid `usage` block as a whole: the caller's equivalent is\n // `tokens` (plus `model`, which the SDK hoists to the top level).\n [/^usage:/, \"tokens:\"],\n];\n\n/** Rewrite wire field paths in a validation message to SDK field paths. */\nexport function translateFieldPaths(message: string): string {\n let out = message;\n for (const [pattern, replacement] of FIELD_PATHS) {\n out = out.replace(pattern, replacement);\n }\n return out;\n}\n\n/**\n * Whether a 422 means \"the entitlement ran out\" rather than \"the plan does not\n * allow this\".\n *\n * Both share a status, so they have to be told apart from the body. Prefer the\n * server's `code`; fall back to matching the exhaustion messages the signal\n * engine actually emits:\n *\n * No <name> outcomes remaining for this customer. Top up the allowance, …\n * No allowance left for \"<unit>\" — N of M remaining. Top up the balance, …\n * No slots left in composite \"<name>\" — all N are claimed for this cycle.\n *\n * Note what is NOT here: `insufficient`. Earlier versions of this SDK tested\n * for that word alone, and it appears nowhere in the ClockNext API — so\n * `AllowanceError` was unreachable and every exhaustion arrived as a\n * `PlanError`. The word is kept in the pattern only so a future rewording\n * toward it still classifies, never as the sole test.\n */\nconst ALLOWANCE_MESSAGE =\n /\\binsufficient\\b|\\bno allowance left\\b|\\bno slots left\\b|\\boutcomes remaining\\b|\\btop up the (?:allowance|balance)\\b|\\bbelow zero\\b/i;\n\n/** The adjust API's 422 for an idempotency key reused with a DIFFERENT\n * request. A conflict, not a plan problem — and never worth retrying. */\nconst IDEMPOTENCY_KEY_REUSED = /\\bidempotency key was already used\\b/i;\n\nexport function isAllowanceFailure(message: string, code?: string): boolean {\n if (code) return code === \"ALLOWANCE_EXHAUSTED\";\n return ALLOWANCE_MESSAGE.test(message);\n}\n\n/**\n * The one 409 that is worth retrying.\n *\n * Every other conflict this API returns is `Customer \"<id>\" is archived.` —\n * permanent, and retrying it only burns `retry.maxAttempts` rounds of backoff\n * before failing anyway. This one is a lost race while resolving an idempotent\n * replay, and it does clear.\n */\nconst TRANSIENT_CONFLICT = /could not resolve the idempotent request/i;\n\n/**\n * Maps a server response to a typed error.\n *\n * `code` is the server's machine-readable failure code when it sent one; it\n * takes precedence over every message heuristic below.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n retryAfterMs?: number,\n meta: { code?: ClockNextErrorCode; idempotencyKey?: string } = {},\n): ClockNextError {\n const raw = message || `Request failed with status ${status}.`;\n const { code, idempotencyKey } = meta;\n const opts = { status, code, idempotencyKey };\n\n if (status === 400) {\n // Only validation messages carry wire field paths worth rewriting.\n return new ValidationError(translateFieldPaths(raw), opts);\n }\n if (status === 401) return new AuthError(raw, opts);\n if (status === 403) return new ForbiddenError(raw, opts);\n if (status === 404) return new NotFoundError(raw, opts);\n // 408 Request Timeout — transient; the request never produced a result, so\n // a retry is safe.\n if (status === 408) return new ClockNextError(raw, { ...opts, retryable: true });\n if (status === 409) {\n return new ConflictError(raw, {\n ...opts,\n retryable:\n code === \"IDEMPOTENCY_UNRESOLVED\" || TRANSIENT_CONFLICT.test(raw),\n });\n }\n if (status === 422) {\n if (IDEMPOTENCY_KEY_REUSED.test(raw)) {\n return new ConflictError(raw, { ...opts, retryable: false });\n }\n return isAllowanceFailure(raw, code)\n ? new AllowanceError(raw, opts)\n : new PlanError(raw, opts);\n }\n if (status === 429) return new RateLimitError(raw, { retryAfterMs, idempotencyKey });\n if (status >= 500) return new ServerError(raw, { ...opts, retryable: true });\n return new ClockNextError(raw, opts);\n}\n","import { ValidationError } from \"./errors.js\";\nimport type {\n ClockNextConfig,\n DropReason,\n FetchLike,\n ResolvedConfig,\n Signal,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://payments.clocknext.com\";\n\n/**\n * Default failure reporters.\n *\n * In the default `async` mode a signal is sent by the background flusher, long\n * after `signals.credit()` resolved `{ status: \"buffered\" }`. There is no\n * promise left to reject into, so a failed REQUEST — a bad API key, an\n * unreachable host, a timeout — has nowhere to surface except these hooks.\n *\n * They do not cover a signal the server accepted (`202`) and then refused while\n * pricing it: that request succeeded as far as this SDK can tell. Those\n * rejections are recorded on the workspace's signal log in the ClockNext\n * dashboard, which is owner-only by design.\n *\n * They used to default to nothing at all, which meant a misconfigured\n * integration compiled, ran, returned success-shaped results, and metered\n * NOTHING, with not one line of output to say so. A billing client whose\n * default is silent data loss has its defaults inverted, so failures are now\n * reported on `console.error` unless the caller takes ownership by supplying\n * their own hook.\n *\n * Pass `onError: () => {}` to silence them deliberately.\n */\nfunction defaultOnError(error: unknown, signal?: Signal): void {\n const what = signal ? `${signal.type} signal` : \"request\";\n const who = signal ? ` customer=${signal.customerId}` : \"\";\n const key =\n signal?.idempotencyKey != null\n ? ` idempotencyKey=${signal.idempotencyKey}`\n : \"\";\n console.error(\n `[clocknext] ${what} permanently failed and was NOT recorded.${who}${key}`,\n error,\n );\n console.error(\n \"[clocknext] Pass `onError` to handle this yourself, or `onError: () => {}` to silence it.\",\n );\n}\n\n/** Drops that never reach `onError` — nothing was sent, so there is no send\n * failure to report. `send_failed` is skipped here because the error hook has\n * already reported it. */\nfunction defaultOnDrop(signal: Signal, reason: DropReason): void {\n if (reason === \"send_failed\") return;\n const why =\n reason === \"queue_full\"\n ? \"the local queue is full — raise `batch.maxQueueSize` or flush more often\"\n : \"the client is closed — this signal was tracked after `close()`\";\n console.error(\n `[clocknext] dropped a ${signal.type} signal without sending it: ${why}.`,\n `customer=${signal.customerId}`,\n );\n}\n\n/** Use `value` only if it's a finite number `>= min`; otherwise fall back. */\nfunction num(value: number | undefined, fallback: number, min: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= min\n ? value\n : fallback;\n}\n\n/** Applies defaults and validates required config. */\nexport function resolveConfig(config: ClockNextConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n // A ClockNextError, not a bare Error: a caller wrapping setup in\n // `catch (e) { if (e instanceof ClockNextError) … }` should not have this\n // one class of failure escape the net.\n throw new ValidationError(\"ClockNext: `apiKey` is required.\");\n }\n\n const fetchImpl: FetchLike | undefined =\n config.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? (globalThis.fetch.bind(globalThis) as FetchLike)\n : undefined);\n if (!fetchImpl) {\n throw new ValidationError(\n \"ClockNext: no global `fetch` found. Use Node 18+, or pass a `fetch` implementation.\",\n );\n }\n\n return {\n apiKey: config.apiKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n mode: config.mode ?? \"async\",\n timeoutMs: num(config.timeoutMs, 10_000, 1),\n batch: {\n maxSize: num(config.batch?.maxSize, 20, 1),\n maxIntervalMs: num(config.batch?.maxIntervalMs, 2000, 0),\n maxConcurrency: num(config.batch?.maxConcurrency, 5, 1),\n maxQueueSize: num(config.batch?.maxQueueSize, 10_000, 1),\n },\n retry: {\n maxAttempts: num(config.retry?.maxAttempts, 5, 1),\n baseDelayMs: num(config.retry?.baseDelayMs, 200, 0),\n maxDelayMs: num(config.retry?.maxDelayMs, 10_000, 0),\n },\n fetch: fetchImpl,\n logger: config.logger ?? {},\n // Both default to loud. See the note above `defaultOnError`.\n onError: config.onError ?? defaultOnError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop ?? defaultOnDrop,\n };\n}\n","import type { Signal } from \"./types.js\";\n\n/** One buffered, wire-ready signal awaiting a background flush. */\nexport interface QueuedSignal {\n /**\n * The route this signal posts to (`/api/v1/signal/credit` etc.), decided by\n * `track()` when the signal was buffered.\n *\n * It is stored per item rather than fixed on the Flusher because each meter\n * now has its own endpoint. A single hardcoded path was fine when everything\n * went to `/api/v1/usage`; keeping one would have meant async mode silently\n * posting to the deprecated route while sync mode used the new ones.\n */\n path: string;\n /** The exact JSON body to POST. */\n body: Record<string, unknown>;\n /** The original signal — passed to onError/onDrop hooks. */\n signal: Signal;\n}\n\n/**\n * Internal buffer seam. Currently in-memory only — this interface exists so a\n * durable (disk/Redis/SQLite) implementation can be slotted in later without\n * touching the Flusher. It is NOT part of the public API and is not yet\n * injectable; don't rely on it externally.\n */\nexport interface QueueStore {\n push(item: QueuedSignal): void;\n /** Remove and return up to `n` items (FIFO). */\n take(n: number): QueuedSignal[];\n size(): number;\n}\n\nexport class InMemoryQueue implements QueueStore {\n private items: QueuedSignal[] = [];\n\n push(item: QueuedSignal): void {\n this.items.push(item);\n }\n\n take(n: number): QueuedSignal[] {\n return this.items.splice(0, n);\n }\n\n size(): number {\n return this.items.length;\n }\n}\n","import type { Transport } from \"./http.js\";\nimport { InMemoryQueue, type QueueStore, type QueuedSignal } from \"./queue.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Background send engine for async-mode signals. Buffers wire-ready signals and\n * flushes them when the buffer reaches `maxSize` OR every `maxIntervalMs`,\n * whichever comes first — the Segment/Amberflo pattern. The Transport owns\n * retries; `close()` drains and awaits in-flight sends so a serverless process\n * can flush before it freezes.\n */\nexport class Flusher {\n private readonly queue: QueueStore = new InMemoryQueue();\n private timer: ReturnType<typeof setTimeout> | null = null;\n private draining: Promise<void> | null = null;\n private closed = false;\n\n constructor(\n private readonly transport: Transport,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /**\n * Buffer one signal. Drops (with onDrop) when closed or the queue is full.\n * Returns whether it was actually buffered, so `track()` can report a drop\n * honestly instead of answering \"buffered\" for a signal it threw away.\n */\n enqueue(item: QueuedSignal): boolean {\n if (this.closed) {\n // Not `send_failed` — nothing was ever sent. Reporting a send failure for\n // a signal that never left the buffer sends a caller looking for a\n // network problem that does not exist.\n this.cfg.onDrop?.(item.signal, \"closed\");\n return false;\n }\n if (this.queue.size() >= this.cfg.batch.maxQueueSize) {\n this.cfg.logger.warn?.(\"[clocknext] queue full — dropping signal\");\n this.cfg.onDrop?.(item.signal, \"queue_full\");\n return false;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\n return true;\n }\n\n /** Arm the interval timer if it isn't already running. */\n private arm(): void {\n if (this.timer || this.closed) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.cfg.batch.maxIntervalMs);\n // Don't keep the event loop alive just for the flush timer.\n (this.timer as { unref?: () => void }).unref?.();\n }\n\n /** Cancel the interval timer if one is armed. */\n private clearTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Send everything buffered at the moment this resolves.\n *\n * Overlapping calls CHAIN onto the in-flight drain rather than sharing it.\n * Sharing looks equivalent and is not: a drain that has already passed its\n * final `size() > 0` check cannot see a signal enqueued a moment later, so\n * handing that same promise back would resolve `flush()` — and therefore\n * `close()` — with the buffer non-empty. Since `close()` has already set\n * `closed`, `arm()` will not re-arm, and the timer it did arm is `unref`'d,\n * so the process is free to exit and that signal is simply lost. Chaining\n * guarantees at least one full drain begins after this call.\n *\n * Concurrency is unaffected: drains run one after another, and each one\n * sends at most `maxConcurrency` signals at a time.\n */\n flush(): Promise<void> {\n this.clearTimer();\n // A prior drain that rejected must not poison the chain, hence the catch.\n const prior = this.draining ?? Promise.resolve();\n const tracked: Promise<void> = prior\n .catch(() => {})\n .then(() => this.drain())\n .finally(() => {\n if (this.draining === tracked) this.draining = null;\n });\n this.draining = tracked;\n return tracked;\n }\n\n /** Drain the buffer in concurrency-bounded waves until it's empty. */\n private async drain(): Promise<void> {\n let sent = 0;\n while (this.queue.size() > 0) {\n const wave = this.queue.take(this.cfg.batch.maxConcurrency);\n const results = await Promise.all(wave.map((item) => this.send(item)));\n sent += results.filter(Boolean).length;\n }\n if (sent > 0) this.cfg.onFlush?.(sent);\n }\n\n /** Send one item; never throws — failures surface via onError/onDrop. */\n private async send(item: QueuedSignal): Promise<boolean> {\n try {\n await this.transport.request({\n method: \"POST\",\n // Per-item, not per-Flusher: one route per meter. See `QueuedSignal`.\n path: item.path,\n body: item.body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n // Rides onto any thrown error so `onError` can replay this exact\n // signal without minting a new key (which would bill it twice).\n idempotencyKey:\n typeof item.body.idempotencyKey === \"string\"\n ? item.body.idempotencyKey\n : undefined,\n });\n return true;\n } catch (error) {\n this.cfg.onError?.(error, item.signal);\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return false;\n }\n }\n\n get size(): number {\n return this.queue.size();\n }\n\n /** Flush remaining signals, then refuse further enqueues. */\n async close(): Promise<void> {\n this.closed = true;\n await this.flush();\n // Nothing can be enqueued now, so the buffer is empty for good and a timer\n // armed just before close has nothing left to do. Clearing it lets a\n // process exit immediately instead of waiting on a stray handle.\n this.clearTimer();\n }\n}\n","import { ClockNextError } from \"./errors.js\";\n\n/**\n * Retry classification + backoff. Mirrors the convergent industry policy\n * (Stripe / Stainless clients): retry transient transport failures\n * (network, timeout, 408/409/429/5xx); never retry deterministic 4xx\n * (400/401/404 and 422 validation/plan/allowance). Exponential backoff with\n * equal jitter, honoring a server `Retry-After`. The Transport additionally\n * gates retries by request safety (GET/DELETE, or a write that explicitly\n * opts in).\n */\n\n/** Whether an error should be retried. NetworkError/Server/RateLimit/Conflict\n * carry `retryable: true`; everything else is permanent. */\nexport function isRetryable(error: unknown): boolean {\n return error instanceof ClockNextError && error.retryable;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) and `retry-after-ms` headers. */\nexport function parseRetryAfter(headers: Headers): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms) {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const ra = headers.get(\"retry-after\");\n if (ra) {\n const secs = Number(ra);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(ra);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/**\n * Backoff for a given attempt (1-based). Exponential `base * 2^(attempt-1)`,\n * capped at `maxDelayMs`, with equal jitter (×[0.5, 1.0]). A server-provided\n * `retryAfterMs` overrides the computed value.\n */\nexport function computeBackoff(\n attempt: number,\n opts: { baseDelayMs: number; maxDelayMs: number },\n retryAfterMs?: number,\n rand: () => number = Math.random,\n): number {\n if (retryAfterMs != null) return Math.min(retryAfterMs, opts.maxDelayMs);\n const raw = opts.baseDelayMs * Math.pow(2, Math.max(0, attempt - 1));\n const capped = Math.min(raw, opts.maxDelayMs);\n // Equal jitter: a random point in [0.5, 1.0] of the capped delay.\n return Math.round(capped * (0.5 + rand() * 0.5));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { NetworkError, RateLimitError, errorFromResponse } from \"./errors.js\";\nimport { computeBackoff, isRetryable, parseRetryAfter, sleep } from \"./retry.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Injected from package.json at build time (see tsup `define`) so it can't\n * drift. Falls back to a dev marker when run un-bundled (tests, ts-node).\n */\ndeclare const __SDK_VERSION__: string | undefined;\nconst SDK_VERSION =\n typeof __SDK_VERSION__ !== \"undefined\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n path: string;\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n /**\n * Whether this call may be auto-retried on a transient failure. Defaults to\n * method-based safety: reads (GET), idempotent replaces (PUT), and DELETE are\n * replay-safe. Non-idempotent writes (POST/PATCH) default to NOT retried so a\n * transient failure can't duplicate the write; callers that tolerate a retry\n * opt in explicitly.\n */\n retry?: boolean;\n /**\n * The idempotency key carried in this request's body, for metering calls.\n *\n * Copied onto any error thrown, so a caller handling a permanent failure can\n * replay the signal with the SAME key instead of minting a fresh one — which\n * would defeat server-side dedup and bill twice. See\n * `ClockNextError.idempotencyKey`.\n */\n idempotencyKey?: string;\n}\n\n/**\n * The single HTTP seam. Builds the authenticated request, enforces a timeout,\n * unwraps the `{ ok, ... }` envelope, maps failures to typed errors, and retries\n * transient ones with backoff + jitter.\n */\nexport class Transport {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T = unknown>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n // Reads, idempotent PUT replaces, and DELETE are replay-safe by default;\n // non-idempotent writes are retried only when the caller opts in (e.g.\n // best-effort metering signals).\n const replaySafe =\n opts.method === \"GET\" ||\n opts.method === \"PUT\" ||\n opts.method === \"DELETE\";\n const allowRetry = opts.retry ?? replaySafe;\n const maxAttempts = allowRetry ? this.cfg.retry.maxAttempts : 1;\n\n let attempt = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n attempt++;\n try {\n return await this.once<T>(url, opts);\n } catch (error) {\n const canRetry = attempt < maxAttempts && isRetryable(error);\n if (!canRetry) throw error;\n const retryAfterMs =\n error instanceof RateLimitError ? error.retryAfterMs : undefined;\n const delayMs = computeBackoff(attempt, this.cfg.retry, retryAfterMs);\n this.cfg.onRetry?.({ attempt, delayMs, error });\n this.cfg.logger.debug?.(\n `[clocknext] retry ${attempt}/${maxAttempts - 1} in ${delayMs}ms`,\n error instanceof Error ? error.message : error,\n );\n await sleep(delayMs);\n }\n }\n }\n\n /** One attempt: fetch + timeout + envelope/status handling. */\n private async once<T>(url: string, opts: RequestOptions): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.cfg.timeoutMs);\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers: this.headers(opts),\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: controller.signal,\n });\n } catch (err) {\n const message =\n controller.signal.aborted\n ? `Request to ${opts.path} timed out after ${this.cfg.timeoutMs}ms.`\n : `Network error calling ${opts.path}: ${\n err instanceof Error ? err.message : String(err)\n }`;\n throw new NetworkError(message, { idempotencyKey: opts.idempotencyKey });\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let json: unknown = undefined;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n // Non-JSON body — only an error if the status is also bad.\n }\n }\n\n // Every `/api/v1` route answers through `v1Success`/`v1Error`:\n // { statusCode, statusDetail: { status, message, code? }, result }\n // The `{ ok, error, ...payload }` shape below is a defensive fallback for a\n // route that has not been migrated (or a proxy that rewrites the body), not\n // a contract the current API still speaks.\n const obj = (json ?? {}) as Record<string, unknown>;\n const meta = { idempotencyKey: opts.idempotencyKey };\n const isEnveloped =\n typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isEnveloped) {\n const detail = obj.statusDetail as\n | { status?: string; message?: string; code?: string }\n | undefined;\n if (res.ok && detail?.status === \"SUCCESS\") {\n return ((obj.result as T | undefined) ?? ({} as T));\n }\n const message =\n detail?.message ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(res.status, message, parseRetryAfter(res.headers), {\n ...meta,\n code: detail?.code,\n });\n }\n\n const envelope = obj as { ok?: boolean; error?: string };\n if (res.ok && envelope.ok !== false) {\n return envelope as T;\n }\n const message =\n envelope.error ?? text ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(\n res.status,\n message,\n parseRetryAfter(res.headers),\n meta,\n );\n }\n\n private headers(opts: RequestOptions): Record<string, string> {\n const h: Record<string, string> = {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n \"User-Agent\": `clocknext-sdk-js/${SDK_VERSION}`,\n };\n if (opts.body !== undefined) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n ): string {\n // baseUrl already has trailing slashes stripped in resolveConfig.\n let url = `${this.cfg.baseUrl}${path}`;\n if (query) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== \"\") params.set(k, String(v));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n return url;\n }\n}\n","/**\n * The `active` list filter, used by `plans.list()`.\n *\n * The API offers exactly ONE filter: `?active=true` narrows a list to active\n * rows. There is no inactive-only parameter — the server tests\n * `searchParams.get(\"active\") === \"true\"` and returns everything otherwise.\n *\n * That made `{ active: false }` a trap. It reads as \"only the archived ones\",\n * but it serialised to `active=false`, failed the server's equality test, and\n * returned EVERY row — including all the active ones the caller was trying to\n * exclude. The opposite of the request, with no error to notice.\n *\n * Rather than leave a boolean whose `false` branch means the reverse of what it\n * says, `false` is honoured here instead: the query parameter is omitted and\n * the active rows are filtered out client-side. Omitting `active` entirely\n * still means \"everything\", which is the API's own default.\n */\n\n/** The `active` query value to send: only `true` narrows server-side. */\nexport function activeQuery(active?: boolean): string | undefined {\n return active === true ? \"true\" : undefined;\n}\n\n/**\n * Apply the half of the filter the API cannot do. A no-op unless `active` is\n * explicitly `false`, in which case only archived rows survive.\n */\nexport function filterByActive<T extends { isActive: boolean }>(\n rows: T[],\n active?: boolean,\n): T[] {\n return active === false ? rows.filter((row) => !row.isActive) : rows;\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { Composite, CreateCompositeInput, UpdateCompositeInput } from \"../types.js\";\n\n/**\n * The `composites` resource — several credits / outcomes / units grouped under\n * one tag (`refId`) and billed as ONE thing per completed occurrence.\n * `/api/v1/composites`.\n *\n * Creating a composite charges nobody: it only bills once a plan sells it as\n * a `PRICING_METRIC` entitlement (`plans.create()` with its `compositeId`).\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire a\n * composite with `archive()` (new signals stop resolving to it; its history is\n * kept); `unarchive()` brings it back.\n */\nexport class Composites {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Composite[]> {\n const res = await this.transport.request<{ composites: Composite[] }>({\n method: \"GET\",\n path: \"/api/v1/composites\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.composites, params.active);\n }\n\n /** One composite's configuration. */\n async get(id: string): Promise<Composite> {\n const res = await this.transport.request<{ composite: Composite }>({\n method: \"GET\",\n path: `/api/v1/composites/${encodeURIComponent(id)}`,\n });\n return res.composite;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateCompositeInput): Promise<Composite> {\n const res = await this.transport.request<{ created: true; composite: Composite }>({\n method: \"POST\",\n path: \"/api/v1/composites\",\n body: input,\n });\n return res.composite;\n }\n\n /** PARTIAL update: only the fields you send change. `entitlements`, when\n * sent, is the complete new set. Renaming `refId` cuts live traffic over at\n * once — ship the new tag to your callers first. */\n async update(id: string, input: UpdateCompositeInput): Promise<Composite> {\n const res = await this.transport.request<{ updated: true; composite: Composite }>({\n method: \"PATCH\",\n path: `/api/v1/composites/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.composite;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Composite> {\n const res = await this.transport.request<{ archived: true; composite: Composite }>({\n method: \"POST\",\n path: `/api/v1/composites/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.composite;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Composite> {\n const res = await this.transport.request<{ unarchived: true; composite: Composite }>({\n method: \"POST\",\n path: `/api/v1/composites/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.composite;\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateCreditInput, Credit, UpdateCreditInput } from \"../types.js\";\n\n/**\n * The `credits` resource — the token-metered credits your product draws down\n * by `agentKey`. `/api/v1/credits`.\n *\n * Pricing is never typed in: `create()` takes a `modelBundle` (one line per\n * model, each with `averageTokensPerLLMCall` and its input / output / cache /\n * cacheWrite split) and the server works out `basePrice` and\n * `pricePerCredit` from the models' live prices.\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire a\n * credit with `archive()`; `unarchive()` brings it back unchanged.\n */\nexport class Credits {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Credit[]> {\n const res = await this.transport.request<{ credits: Credit[] }>({\n method: \"GET\",\n path: \"/api/v1/credits\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.credits, params.active);\n }\n\n /** One credit's configuration. */\n async get(id: string): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"GET\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n return res.credit;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ created: true; credit: Credit }>({\n method: \"POST\",\n path: \"/api/v1/credits\",\n body: input,\n });\n return res.credit;\n }\n\n /** PARTIAL update: only the fields you send change. Send `modelBundle` to\n * re-price; leave it out to keep the stored base price. */\n async update(id: string, input: UpdateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ updated: true; credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.credit;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Credit> {\n const res = await this.transport.request<{ archived: true; credit: Credit }>({\n method: \"POST\",\n path: `/api/v1/credits/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.credit;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Credit> {\n const res = await this.transport.request<{ unarchived: true; credit: Credit }>({\n method: \"POST\",\n path: `/api/v1/credits/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.credit;\n }\n}\n","/**\n * Idempotency-key generation for usage signals.\n *\n * Every signal carries an idempotency key so that a retry — whether a\n * Transport-level replay of one send, or a re-flush of the buffered body — is\n * deduplicated on the server instead of recording a second, double-billed\n * event. The server keys `RawUsageLog` on `(organizationId, idempotencyKey)`\n * and replays the original result on a repeat.\n *\n * The key is generated ONCE, before the signal is buffered or sent, and the\n * same key rides every retry of that signal (see ARCHITECTURE AD-4). A caller\n * may instead supply their own key on the signal — a stable id for the logical\n * event — to also dedup across process restarts / at-least-once redelivery,\n * which an in-memory auto-generated key cannot survive.\n */\n\n/**\n * A fresh idempotency key. A UUID v4 when the runtime exposes Web Crypto\n * (Node ≥ 18, browsers, edge runtimes), with a non-cryptographic fallback for\n * exotic runtimes that lack it. The value is opaque to the server — only its\n * uniqueness matters, not its randomness quality.\n */\nexport function newKey(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (typeof c?.randomUUID === \"function\") return c.randomUUID();\n // Fallback: an RFC-4122-shaped v4 from Math.random. Uniqueness (not security)\n // is all that's required for deduplication.\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import type { Transport } from \"../http.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n AddMemberInput,\n AdjustResult,\n ApiCustomer,\n CompositeAdjustInput,\n CreateCustomerInput,\n CreditAdjustInput,\n CreditBalance,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n Member,\n MemberProfile,\n OutcomeAdjustInput,\n OutcomeBalance,\n RecurringGrantInput,\n RecurringGrantResult,\n RemovedMember,\n UnitAdjustInput,\n UnitBalance,\n UpdateMemberInput,\n WalletAdjustInput,\n WalletAlert,\n WalletLedgerPage,\n WalletLedgerParams,\n WalletTransaction,\n} from \"../types.js\";\n\n/**\n * The `customers` resource — full CRUD over the org's customers plus the\n * read-only insight endpoints (balances / plan). Every call is scoped\n * to the API key's organisation server-side; a customer in another org\n * resolves as a NotFoundError.\n */\nexport class Customers {\n constructor(private readonly transport: Transport) {}\n\n /** Create a customer. `POST /api/v1/customers`. */\n async create(input: CreateCustomerInput): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"POST\",\n path: \"/api/v1/customers\",\n body: input,\n });\n return res.customer;\n }\n\n /** List customers, most-recent first (cursor-paginated). `GET /api/v1/customers`. */\n async list(params: {\n limit?: number;\n q?: string;\n cursor?: string;\n } = {}): Promise<CustomerList> {\n const res = await this.transport.request<CustomerList>({\n method: \"GET\",\n path: \"/api/v1/customers\",\n query: { limit: params.limit, q: params.q, cursor: params.cursor },\n });\n return { customers: res.customers, nextCursor: res.nextCursor };\n }\n\n /**\n * Async iterator over ALL customers, transparently following the cursor.\n * `for await (const c of cnk.customers.iterate()) { … }`\n */\n async *iterate(params: { limit?: number; q?: string } = {}): AsyncGenerator<\n ApiCustomer\n > {\n let cursor: string | undefined;\n do {\n const page = await this.list({ ...params, cursor });\n for (const c of page.customers) yield c;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n /** Fetch one customer. `GET /api/v1/customers/:id`. */\n async get(id: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial). `PATCH /api/v1/customers/:id`. */\n async update(\n id: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.customer;\n }\n\n /**\n * Fetch one customer by YOUR id for them (its `externalId`), instead of\n * ours. Same result as {@link get}. `GET /api/v1/customers/ext/:externalId`.\n * An unknown external id is a `NotFoundError`; only active customers match.\n */\n async getByExternalId(externalId: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial), addressed by its `externalId`. Same body as\n * {@link update}. `PATCH /api/v1/customers/ext/:externalId`. */\n async updateByExternalId(\n externalId: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}`,\n body: input,\n });\n return res.customer;\n }\n\n /** {@link delete}, addressing the customer by its `externalId`.\n * `DELETE /api/v1/customers/ext/:externalId`. */\n async deleteByExternalId(externalId: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}`,\n });\n }\n\n /** Delete a customer (members, invitations, usage logs cascade). */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n }\n\n /** Wallet / credit / outcome / unit balances. `GET …/:id/balances`. */\n balances(id: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/balances`,\n });\n }\n\n /**\n * One page of the customer's wallet ledger — every movement of wallet\n * money, newest first — plus both wallet balances. Cursor-paginated: pass\n * back `nextCursor` as `cursor`. `GET /api/v1/customers/:id/wallet`.\n */\n wallet(id: string, params: WalletLedgerParams = {}): Promise<WalletLedgerPage> {\n return this.walletPage(`/api/v1/customers/${encodeURIComponent(id)}/wallet`, params);\n }\n\n /** {@link wallet}, addressing the customer by its `externalId`.\n * `GET /api/v1/customers/ext/:externalId/wallet`. */\n walletByExternalId(\n externalId: string,\n params: WalletLedgerParams = {},\n ): Promise<WalletLedgerPage> {\n return this.walletPage(\n `/api/v1/customers/ext/${encodeURIComponent(externalId)}/wallet`,\n params,\n );\n }\n\n /**\n * Async iterator over the customer's WHOLE wallet ledger, newest first,\n * following the cursor. `params.cursor` is ignored.\n * `for await (const t of cnk.customers.iterateWallet(id)) { … }`\n */\n async *iterateWallet(\n id: string,\n params: Omit<WalletLedgerParams, \"cursor\"> = {},\n ): AsyncGenerator<WalletTransaction> {\n let cursor: string | undefined;\n do {\n const page = await this.wallet(id, { ...params, cursor });\n for (const t of page.transactions) yield t;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n private walletPage(path: string, params: WalletLedgerParams): Promise<WalletLedgerPage> {\n return this.transport.request<WalletLedgerPage>({\n method: \"GET\",\n path,\n query: {\n limit: params.limit,\n cursor: params.cursor,\n from: params.from,\n to: params.to,\n },\n });\n }\n\n /** {@link balances}, addressing the customer by its `externalId`.\n * `GET /api/v1/customers/ext/:externalId/balances`. */\n balancesByExternalId(externalId: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}/balances`,\n });\n }\n\n /**\n * One credit balance for a customer, matched by `creditId` or `creditName`;\n * `null` when the customer has no plan or no matching credit. Convenience\n * over `balances()` + `Array.find` — it fetches the FULL balances under the\n * hood (there is no server-side scoped read), so prefer `balances()` when you\n * need several rows from the same customer.\n */\n async creditBalance(\n customerId: string,\n match: { creditId?: string; creditName?: string },\n ): Promise<CreditBalance | null> {\n const { credits } = await this.balances(customerId);\n return (\n credits.find(\n (c) =>\n (match.creditId != null && c.creditId === match.creditId) ||\n (match.creditName != null && c.creditName === match.creditName),\n ) ?? null\n );\n }\n\n /** One outcome balance for a customer, matched by `outcomeId` or\n * `outcomeName`; `null` when absent. See {@link creditBalance} for the\n * fetch-then-filter caveat. */\n async outcomeBalance(\n customerId: string,\n match: { outcomeId?: string; outcomeName?: string },\n ): Promise<OutcomeBalance | null> {\n const { outcomes } = await this.balances(customerId);\n return (\n outcomes.find(\n (o) =>\n (match.outcomeId != null && o.outcomeId === match.outcomeId) ||\n (match.outcomeName != null && o.outcomeName === match.outcomeName),\n ) ?? null\n );\n }\n\n /** One unit balance for a customer, matched by `unitId` or `unitName`;\n * `null` when absent. See {@link creditBalance} for the fetch-then-filter\n * caveat. */\n async unitBalance(\n customerId: string,\n match: { unitId?: string; unitName?: string },\n ): Promise<UnitBalance | null> {\n const { units } = await this.balances(customerId);\n return (\n units.find(\n (u) =>\n (match.unitId != null && u.unitId === match.unitId) ||\n (match.unitName != null && u.unitName === match.unitName),\n ) ?? null\n );\n }\n\n /** The customer's current plan. `GET …/:id/plan`. */\n plan(id: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/plan`,\n });\n }\n\n /** {@link plan}, addressing the customer by its `externalId`.\n * `GET /api/v1/customers/ext/:externalId/plan`. */\n planByExternalId(externalId: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}/plan`,\n });\n }\n\n // --- Members -------------------------------------------------------------\n\n /** List a customer's members. `GET …/:id/members`. */\n async listMembers(id: string): Promise<Member[]> {\n const res = await this.transport.request<{ members: Member[] }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n });\n return res.members;\n }\n\n /** Add a member to a customer. Duplicate `email` → ConflictError. */\n async addMember(id: string, input: AddMemberInput): Promise<MemberProfile> {\n const res = await this.transport.request<{ member: MemberProfile }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n body: input,\n });\n return res.member;\n }\n\n /** Update a member's profile. Duplicate `email` → ConflictError. `PATCH …/:id/members/:memberId`. */\n async updateMember(\n id: string,\n memberId: string,\n input: UpdateMemberInput,\n ): Promise<MemberProfile> {\n const res = await this.transport.request<{ member: MemberProfile }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n body: input,\n });\n return res.member;\n }\n\n /** Remove a member from a customer, returning who was removed. `DELETE …/:id/members/:memberId`. */\n async removeMember(id: string, memberId: string): Promise<RemovedMember> {\n const res = await this.transport.request<{ removed: true; member: RemovedMember }>({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n });\n return res.member;\n }\n\n // --- Billing config -----------------------------------------------------\n\n // Note: a customer's currency is set through `update(id, { currencyCode })`\n // (PATCH …/:id) — there is no separate currency endpoint. Credit-type\n // assignment has no public API.\n\n // --- Balance adjustments -------------------------------------------------\n\n /** Grant or claw back a credit balance. The credit must be a prepaid part of\n * the customer's current plan. Pass `idempotencyKey` to make it safe to\n * retry. `POST …/:id/credits/adjust`. */\n adjustCredit(id: string, input: CreditAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/credits/adjust`, input);\n }\n\n /** Grant or claw back an outcome balance. The outcome must be a prepaid part\n * of the customer's current plan. `POST …/:id/outcomes/adjust`. */\n adjustOutcome(id: string, input: OutcomeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/outcomes/adjust`, input);\n }\n\n /** Grant or claw back a unit balance. The unit must be a prepaid part of the\n * customer's current plan. `POST …/:id/units/adjust`. */\n adjustUnit(id: string, input: UnitAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/units/adjust`, input);\n }\n\n /** Grant or claw back slots on a customer's ADVANCE composite pool for the\n * current billing cycle. `remaining` is the resulting slot count.\n * `POST …/:id/composites/adjust`. */\n adjustComposite(id: string, input: CompositeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/composites/adjust`, input);\n }\n\n /**\n * Top up (positive `delta`) or draw down (negative `delta`) a customer's\n * wallet, in USD — allowed whatever the customer's plan. `remaining` is the\n * resulting USD balance. No `agentKey` — a customer has exactly one wallet.\n * Pass `pool: \"reserved\"` to move the Reserved Wallet instead (then\n * `remaining` is its balance). `POST …/:id/wallet/adjust`.\n */\n adjustWallet(id: string, input: WalletAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/wallet/adjust`, input);\n }\n\n /** {@link adjustCredit}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/credits/adjust`. */\n adjustCreditByExternalId(id: string, input: CreditAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/credits/adjust`, input);\n }\n\n /** {@link adjustOutcome}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/outcomes/adjust`. */\n adjustOutcomeByExternalId(id: string, input: OutcomeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/outcomes/adjust`, input);\n }\n\n /** {@link adjustUnit}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/units/adjust`. */\n adjustUnitByExternalId(id: string, input: UnitAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/units/adjust`, input);\n }\n\n /** {@link adjustComposite}, addressing the customer by its `externalId`\n * (`id` here). `POST /api/v1/customers/ext/:externalId/composites/adjust`. */\n adjustCompositeByExternalId(id: string, input: CompositeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/composites/adjust`, input);\n }\n\n /** {@link adjustWallet}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/wallet/adjust`. */\n adjustWalletByExternalId(id: string, input: WalletAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/wallet/adjust`, input);\n }\n\n /**\n * Set (a number of 0 or more, USD) or clear (`null`) a customer's low-balance\n * alert level. At or below it the `wallet.balance.drop` webhook fires for this\n * customer, whatever the endpoint's own threshold is; a customer without a\n * level falls back to each endpoint's threshold. Returns the saved level.\n * Idempotent (a PUT), so it retries safely. `PUT …/:id/wallet/alert`.\n */\n setWalletAlert(id: string, threshold: number | null): Promise<WalletAlert> {\n return this.walletAlert(`/api/v1/customers/${encodeURIComponent(id)}/wallet/alert`, threshold);\n }\n\n /** {@link setWalletAlert}, addressing the customer by its `externalId` (`id`\n * here). `PUT /api/v1/customers/ext/:externalId/wallet/alert`. */\n setWalletAlertByExternalId(id: string, threshold: number | null): Promise<WalletAlert> {\n return this.walletAlert(\n `/api/v1/customers/ext/${encodeURIComponent(id)}/wallet/alert`,\n threshold,\n );\n }\n\n private walletAlert(path: string, threshold: number | null): Promise<WalletAlert> {\n return this.transport.request<WalletAlert>({\n method: \"PUT\",\n path,\n body: { threshold },\n });\n }\n\n /**\n * The one body behind all ten adjust calls.\n *\n * Every adjustment carries an idempotency key — the caller's, or one\n * generated here ONCE per call, exactly like signals. The server\n * deduplicates on it, so a transient failure is safe to retry: the same key\n * rides every attempt, and a retry of one that already landed comes back as\n * `replayed: true` instead of adjusting again. The key is also copied onto\n * any thrown error (`error.idempotencyKey`) so the caller can replay safely.\n */\n private async adjust(\n path: string,\n input:\n | CreditAdjustInput\n | OutcomeAdjustInput\n | UnitAdjustInput\n | CompositeAdjustInput\n | WalletAdjustInput,\n ): Promise<AdjustResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<{\n remaining: number;\n replayed?: boolean;\n adjustedAt?: string;\n customerArchived?: boolean;\n }>({\n method: \"POST\",\n path,\n idempotencyKey,\n body: { ...input, idempotencyKey },\n retry: true,\n });\n\n const result: AdjustResult = {\n remaining: res.remaining,\n replayed: res.replayed === true,\n customerArchived: res.customerArchived === true,\n };\n if (result.replayed && typeof res.adjustedAt === \"string\") {\n result.adjustedAt = res.adjustedAt;\n }\n return result;\n }\n\n // --- Recurring grants ----------------------------------------------------\n\n /**\n * Change how much a customer is granted every billing cycle (wallet top-up,\n * credits, outcomes, units or a composite pool). Any increase or decrease\n * applies to their current balance immediately. `PUT …/:id/recurring-grant`.\n */\n async updateRecurringGrant(\n id: string,\n input: RecurringGrantInput,\n ): Promise<RecurringGrantResult> {\n const res = await this.transport.request<\n RecurringGrantResult & { updated: true }\n >({\n method: \"PUT\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/recurring-grant`,\n body: input,\n });\n return toRecurringGrantResult(res);\n }\n\n /** {@link updateRecurringGrant}, addressing the customer by its\n * `externalId`. `PUT /api/v1/customers/ext/:externalId/recurring-grant`. */\n async updateRecurringGrantByExternalId(\n externalId: string,\n input: RecurringGrantInput,\n ): Promise<RecurringGrantResult> {\n const res = await this.transport.request<\n RecurringGrantResult & { updated: true }\n >({\n method: \"PUT\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}/recurring-grant`,\n body: input,\n });\n return toRecurringGrantResult(res);\n }\n}\n\n/** Drop the response's `updated: true` marker, keeping `balanceUsd` only when\n * the server sent it (wallet grants). */\nfunction toRecurringGrantResult(res: RecurringGrantResult): RecurringGrantResult {\n return {\n kind: res.kind,\n quantity: res.quantity,\n ...(res.balanceUsd !== undefined ? { balanceUsd: res.balanceUsd } : {}),\n };\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n InvoiceDetail,\n InvoiceListRow,\n InvoiceStatus,\n PayLink,\n} from \"../types.js\";\n\n/**\n * The `invoices` resource — read-only. Invoices are generated by the billing\n * engine from purchases; you list them, read one, or mint a hosted pay link for\n * an OPEN invoice. `/api/v1/invoices`.\n */\nexport class Invoices {\n constructor(private readonly transport: Transport) {}\n\n /** List invoices, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: InvoiceStatus; limit?: number } = {},\n ): Promise<InvoiceListRow[]> {\n const res = await this.transport.request<{ invoices: InvoiceListRow[] }>({\n method: \"GET\",\n path: \"/api/v1/invoices\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.invoices;\n }\n\n /** Fetch one full invoice + its plan snapshot. `GET /api/v1/invoices/:id`. */\n get(id: string): Promise<InvoiceDetail> {\n return this.transport.request<InvoiceDetail>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}`,\n });\n }\n\n /**\n * Mint a hosted pay link for an OPEN invoice. PAID/VOID/AUTO_CLOSED invoices are rejected\n * with a `ConflictError`. `GET /api/v1/invoices/:id/pay-link`.\n */\n payLink(id: string): Promise<PayLink> {\n return this.transport.request<PayLink>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}/pay-link`,\n });\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateOutcomeInput, Outcome, OutcomeWithSteps, UpdateOutcomeInput } from \"../types.js\";\n\n/**\n * The `outcomes` resource — multi-step deliverables billed per completed\n * outcome. `/api/v1/outcomes`.\n *\n * `list()` and every write return the outcome without its steps; `get()`\n * returns it with every step in full (ids included). Each new step is priced\n * from its own `modelBundle`, on the server.\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire an\n * outcome with `archive()`; `unarchive()` brings it back unchanged.\n */\nexport class Outcomes {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Outcome[]> {\n const res = await this.transport.request<{ outcomes: Outcome[] }>({\n method: \"GET\",\n path: \"/api/v1/outcomes\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.outcomes, params.active);\n }\n\n /** One outcome's configuration, with every step in full. */\n async get(id: string): Promise<OutcomeWithSteps> {\n const res = await this.transport.request<{ outcome: OutcomeWithSteps }>({\n method: \"GET\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n return res.outcome;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ created: true; outcome: Outcome }>({\n method: \"POST\",\n path: \"/api/v1/outcomes\",\n body: input,\n });\n return res.outcome;\n }\n\n /** PARTIAL update: only the fields you send change. Leave `steps` out to\n * leave the steps alone; send it and it is the complete list — pass each\n * existing step's `id` (or its same `agentKey`) to keep it. */\n async update(id: string, input: UpdateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ updated: true; outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.outcome;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Outcome> {\n const res = await this.transport.request<{ archived: true; outcome: Outcome }>({\n method: \"POST\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.outcome;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Outcome> {\n const res = await this.transport.request<{ unarchived: true; outcome: Outcome }>({\n method: \"POST\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.outcome;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PaymentDetail, PaymentRow } from \"../types.js\";\n\n/**\n * The `payments` resource — read-only. A payment is a PAID invoice; the `id`\n * used here is that underlying invoice id. `/api/v1/payments`.\n */\nexport class Payments {\n constructor(private readonly transport: Transport) {}\n\n /** List payments (paid invoices), most-recent first. Filter by customer. */\n async list(\n params: { customerId?: string; limit?: number } = {},\n ): Promise<PaymentRow[]> {\n const res = await this.transport.request<{ payments: PaymentRow[] }>({\n method: \"GET\",\n path: \"/api/v1/payments\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return res.payments;\n }\n\n /** Fetch one payment + its plan snapshot. `GET /api/v1/payments/:id`. */\n get(id: string): Promise<PaymentDetail> {\n return this.transport.request<PaymentDetail>({\n method: \"GET\",\n path: `/api/v1/payments/${encodeURIComponent(id)}`,\n });\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreatePlanInput, Plan, UpdatePlanInput } from \"../types.js\";\n\n/**\n * The `plans` resource — the billing plans customers subscribe to. Each plan\n * is a set of `entitlements` (wallet / credit / outcome / unit / composite /\n * flat lines) billed on a cycle. `/api/v1/plans`.\n *\n * A plan's currency is the workspace's primary currency; it can't be chosen.\n * There is no `delete()` — the API never deletes plans, so customers already\n * on one keep what they bought. Retire a plan with `archive()`; `unarchive()`\n * makes it purchasable again.\n */\nexport class Plans {\n constructor(private readonly transport: Transport) {}\n\n /** List plans, oldest-first. Pass `{ active: true }` to only return active plans.\n * `{ active: false }` returns only archived ones; omitting it returns\n * both. See `activeQuery` — the API itself only supports `true`. */\n async list(params: { active?: boolean } = {}): Promise<Plan[]> {\n const res = await this.transport.request<{ plans: Plan[] }>({\n method: \"GET\",\n path: \"/api/v1/plans\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.plans, params.active);\n }\n\n /** One plan's configuration. */\n async get(id: string): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"GET\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n return res.plan;\n }\n\n /** Create a plan. It starts active. Not retried on failure — a retry could\n * create a second plan. */\n async create(input: CreatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ created: true; plan: Plan }>({\n method: \"POST\",\n path: \"/api/v1/plans\",\n body: input,\n });\n return res.plan;\n }\n\n /** PARTIAL update: only the fields you send change. `entitlements`, when\n * sent, is the complete new list — the list `get()` returned can be sent\n * back as it is. Changes apply to new purchases only. */\n async update(id: string, input: UpdatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ updated: true; plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.plan;\n }\n\n /** Retire a plan (`isActive` → false): it can't be bought any more; customers\n * already on it are unaffected. Safe to retry. */\n async archive(id: string): Promise<Plan> {\n const res = await this.transport.request<{ archived: true; plan: Plan }>({\n method: \"POST\",\n path: `/api/v1/plans/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.plan;\n }\n\n /** Make an archived plan purchasable again (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Plan> {\n const res = await this.transport.request<{ unarchived: true; plan: Plan }>({\n method: \"POST\",\n path: `/api/v1/plans/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.plan;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PortalToken, PortalTokenInput } from \"../types.js\";\n\n/**\n * The `portal` resource — mint a short-lived embed token for one of your\n * customers, then render `<iframe src=\".../portal/embed?token=<token>\">`. The\n * HS256 signing secret never leaves ClockNext; your backend only needs its API\n * key. `POST /api/v1/portal/token`.\n */\nexport class Portal {\n constructor(private readonly transport: Transport) {}\n\n async createToken(input: PortalTokenInput): Promise<PortalToken> {\n const res = await this.transport.request<\n { token: string; expiresAt: number; expiresIn: number }\n >({\n method: \"POST\",\n path: \"/api/v1/portal/token\",\n body: {\n customerId: input.customerId,\n ttlSeconds: input.ttlSeconds,\n memberEmail: input.memberEmail,\n },\n });\n return {\n token: res.token,\n expiresAt: res.expiresAt,\n expiresIn: res.expiresIn,\n };\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreatePurchaseInput,\n Purchase,\n PurchaseDetail,\n PurchaseStatus,\n} from \"../types.js\";\n\n/**\n * The `purchases` resource — a purchase is a customer's subscription to a plan.\n * Creating one auto-cancels the customer's existing scheduled/active purchase\n * (this is also how you \"change plan\"). `/api/v1/purchases`.\n */\nexport class Purchases {\n constructor(private readonly transport: Transport) {}\n\n /** List purchases, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: PurchaseStatus; limit?: number } = {},\n ): Promise<Purchase[]> {\n const res = await this.transport.request<{ purchases: Purchase[] }>({\n method: \"GET\",\n path: \"/api/v1/purchases\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.purchases;\n }\n\n /** Subscribe a customer to a plan. `POST /api/v1/purchases`. */\n async create(input: CreatePurchaseInput): Promise<Purchase> {\n const res = await this.transport.request<{ purchase: Purchase }>({\n method: \"POST\",\n path: \"/api/v1/purchases\",\n body: input,\n });\n return res.purchase;\n }\n\n /** Fetch one purchase. `GET /api/v1/purchases/:id`. */\n async get(id: string): Promise<PurchaseDetail> {\n const res = await this.transport.request<{ purchase: PurchaseDetail }>({\n method: \"GET\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n });\n return res.purchase;\n }\n\n /**\n * Turn automatic billing on or off for a purchase. When pausing, an optional\n * `pauseReason` is recorded. `PATCH /api/v1/purchases/:id`.\n */\n async setAutoPayment(\n id: string,\n autoPayment: boolean,\n opts: { pauseReason?: string } = {},\n ): Promise<{ autoPayment: boolean }> {\n return this.transport.request<{ autoPayment: boolean }>({\n method: \"PATCH\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n body: { autoPayment, pauseReason: opts.pauseReason },\n });\n }\n\n /** Cancel a purchase (voids any open invoice). `POST /api/v1/purchases/:id/cancel`. */\n async cancel(id: string): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}/cancel`,\n });\n }\n}\n","/**\n * The customer half of a request body: `customerId` and/or `externalId`,\n * each only when set. Both are forwarded as given — the server applies the\n * precedence (`customerId` wins), so the SDK never second-guesses it.\n */\nexport function customerRefToWire(ref: {\n customerId?: string;\n externalId?: string;\n}): { customerId?: string; externalId?: string } {\n return {\n ...(ref.customerId != null ? { customerId: ref.customerId } : {}),\n ...(ref.externalId != null ? { externalId: ref.externalId } : {}),\n };\n}\n","import type { Transport } from \"../http.js\";\nimport type { Flusher } from \"../flusher.js\";\nimport { customerRefToWire } from \"../customer-ref.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n CompositeCompletionInput,\n CompositeCompletionResult,\n CreditInput,\n OutcomeCompletionInput,\n OutcomeCompletionResult,\n OutcomeInput,\n ResolvedConfig,\n SerializedUnitUsage,\n Signal,\n SignalType,\n TrackResult,\n UnitInput,\n UnitTrackResult,\n UsageLogListParams,\n UsageLogPage,\n UsageLogLookupResult,\n WalletInput,\n} from \"../types.js\";\n\n/**\n * Which route each signal type posts to.\n *\n * This map IS the migration off `POST /api/v1/usage`. The signal's `type` no\n * longer travels in the body — it picks the URL, and the server reads the\n * meter off the path. That is the server's design, not a convenience: a body\n * can neither omit the meter nor contradict it, so the whole class of \"the\n * `type` field said credit but the fields describe a unit\" bug is gone.\n *\n * `type` stays on the SDK's own `Signal` objects because it is still the\n * discriminator callers write and TypeScript narrows on. It just stops being\n * something we send.\n */\nconst SIGNAL_PATHS: Record<SignalType, string> = {\n credit: \"/api/v1/signal/credit\",\n outcome: \"/api/v1/signal/outcome\",\n wallet: \"/api/v1/signal/wallet\",\n};\n\n/** Unit reports and completion pings are not part of the `Signal` union (no\n * model, no tokens), so they carry their paths separately. */\nconst UNIT_PATH = \"/api/v1/signal/unit\";\nconst COMPOSITE_COMPLETE_PATH = \"/api/v1/signal/composite/complete\";\nconst OUTCOME_COMPLETE_PATH = \"/api/v1/signal/outcome/complete\";\nconst USAGE_LOG_PATH = \"/api/v1/signal/usage-log\";\nconst USAGE_LOG_LOOKUP_PATH = \"/api/v1/signal/usage-log/lookup\";\n\n/**\n * Builds the request body for a typed Signal.\n *\n * Two grouping changes from the pre-0.10 `POST /api/v1/usage` body, both of\n * which the server now requires:\n *\n * usage: { model, inputTokens, outputTokens, cacheTokens }\n * composite: { \"<refId>\": \"<value>\" }\n *\n * `usage` collects the four fields describing one LLM call. `composite` is the\n * more consequential one: the tag used to sit at the TOP LEVEL under its own\n * caller-defined property name, which meant a composite called `model` or\n * `status` shadowed a real ingest field. Nested, the two namespaces are\n * separate and that collision is impossible.\n *\n * The route is NOT part of this body — see {@link SIGNAL_PATHS}.\n */\nexport function signalToWire(signal: Signal): Record<string, unknown> {\n const t = signal.tokens;\n const body: Record<string, unknown> = {\n ...customerRefToWire(signal),\n // `usage` is required on all three model-priced kinds. input/output are\n // always sent; `cacheTokens` / `cacheWriteTokens` only when provided (the\n // server defaults each to 0).\n usage: {\n model: signal.model,\n inputTokens: t.input,\n outputTokens: t.output,\n ...(t.cache != null ? { cacheTokens: t.cache } : {}),\n ...(t.cacheWrite != null ? { cacheWriteTokens: t.cacheWrite } : {}),\n },\n };\n if (signal.member) body.member = signal.member;\n if (signal.custom) body.custom = signal.custom;\n\n // credit + outcome both resolve their target via the stable `agentKey`.\n // A wallet signal has none: it meters money at the model's cost rather than\n // a named entitlement.\n if (signal.type === \"credit\" || signal.type === \"outcome\") {\n body.agentKey = signal.agentKey;\n }\n\n // Outcome runs are grouped by `runId`. Ending the run is NOT a flag on this\n // body: `POST /api/v1/signal/outcome` (what this body is sent to) accepts\n // ONLY the step shape and rejects one that also carries `complete` — see\n // `signals.completeOutcome()`, its own dedicated route.\n if (signal.type === \"outcome\") {\n body.runId = signal.runId;\n }\n\n // Composite tag, nested under its `refId`. Never set for wallet — the server\n // accepts and ignores one there, but sending it would only imply a rollup\n // that will not exist.\n if (signal.type !== \"wallet\" && signal.composite) {\n body.composite = { [signal.composite.ref]: signal.composite.value };\n }\n\n // A caller-supplied idempotency key is forwarded verbatim; `track()` fills in\n // an auto-generated one when none was given.\n if (signal.idempotencyKey) body.idempotencyKey = signal.idempotencyKey;\n return body;\n}\n\n/** The fields every `/api/v1/signal/*` response may carry. */\ninterface SignalResponse {\n queued?: boolean;\n messageId?: string;\n rawId?: string;\n}\n\n/** Copy the two durability handles onto a result, each only when present. */\nfunction handles(res: SignalResponse) {\n return {\n ...(res.messageId != null ? { messageId: res.messageId } : {}),\n ...(res.rawId != null ? { rawId: res.rawId } : {}),\n };\n}\n\n/**\n * The `signals` resource: record usage signals and read them back.\n *\n * In async mode (default), `track()` buffers the signal locally and returns\n * immediately with `{ status: \"buffered\" }`. Pass `{ wait: true }` (or\n * construct the client in `sync` mode) to await the request instead.\n *\n * Awaiting the request does NOT mean waiting for a price, and deliberately so.\n * The server writes every signal to a durable inbox and hands it to a worker,\n * answering `202` — so `track()` resolves `{ status: \"accepted\", messageId,\n * rawId, usageLog: null }`: impossible to lose, not yet billed. Only when the\n * server prices inline do you get `{ status: \"recorded\", usageLog }`. Branch on\n * `status`; never assume `usageLog`.\n *\n * Nothing here ever blocks a request thread on billing. That is the point: a\n * meter that makes the caller wait for pricing has moved your billing system\n * onto your product's critical path.\n *\n * Because of that, a signal the server later REJECTS (unknown `agentKey`, a\n * model the org has not enabled, no active plan) cannot come back through this\n * promise — and does not reach `onError` either, since from here that request\n * succeeded. Such a rejection has no programmatic channel at all: it is\n * recorded on the workspace's signal log in the ClockNext dashboard, which is\n * owner-only by design.\n *\n * `list()` is the partial check available from code. It returns priced usage\n * logs with a `status`, so it confirms a signal landed and whether pricing\n * succeeded — but a signal refused BEFORE pricing never becomes a usage log\n * and does not appear there.\n */\nexport class Signals {\n constructor(\n private readonly transport: Transport,\n private readonly flusher: Flusher,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /**\n * Record one usage signal, to the route its `type` selects:\n * `POST /api/v1/signal/credit` | `/signal/outcome` | `/signal/wallet`.\n *\n * Returns as soon as the signal is buffered (async mode) or the request has\n * been answered (`{ wait: true }` / sync mode). See {@link TrackResult}: a\n * resolved promise means \"accepted\", which is not the same as \"billed\".\n */\n async track(\n signal: Signal,\n opts: { wait?: boolean } = {},\n ): Promise<TrackResult> {\n const body = signalToWire(signal);\n // Assign the idempotency key ONCE, here — before the signal is buffered or\n // sent — so the SAME key rides every retry (Transport-level replay AND a\n // re-flush of the buffered body). That is what makes a retried signal\n // dedup server-side instead of double-recording (see idempotency.ts, AD-4).\n const idempotencyKey =\n typeof body.idempotencyKey === \"string\" ? body.idempotencyKey : newKey();\n body.idempotencyKey = idempotencyKey;\n\n // The key is stamped back onto the SIGNAL, not just the body, because the\n // signal is what `onError`/`onDrop` receive. Without this, a caller writing\n // the documented dead-letter path — catch the drop, persist it, resend\n // later — would resend with a freshly generated key, and the server would\n // treat it as a second event and bill it twice. The one mechanism that\n // prevents duplicates has to be reachable from the one hook that handles\n // failures.\n const tracked: Signal = { ...signal, idempotencyKey };\n\n const path = SIGNAL_PATHS[signal.type];\n\n const sendNow = opts.wait || this.cfg.mode === \"sync\";\n if (!sendNow) {\n // The path is buffered WITH the body. The flusher used to hardcode one\n // endpoint for everything; now that each meter has its own, a buffered\n // signal has to remember where it was going or async mode would quietly\n // keep posting to a route sync mode has already left behind.\n // A closed client or a full queue discards the signal. Saying\n // \"buffered\" there would hand back a success-shaped result for a\n // billable event that no longer exists.\n const buffered = this.flusher.enqueue({ path, body, signal: tracked });\n return buffered\n ? { status: \"buffered\", queued: true }\n : { status: \"dropped\", queued: false };\n }\n\n const res = await this.transport.request<\n SignalResponse & { usageLog?: TrackResult[\"usageLog\"] }\n >({\n method: \"POST\",\n path,\n body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n idempotencyKey,\n });\n // The server answers one of two ways for a real record, and we must not\n // flatten them: `202 { queued: true, messageId, rawId }` when it hands the\n // signal to its durable queue (priced later by a worker — no log yet), or\n // `200 { usageLog, rawId }` when it prices inline. Either way `rawId` is\n // the handle on a written, unlosable row.\n const queued = res.queued === true;\n return {\n status: queued ? \"accepted\" : \"recorded\",\n queued,\n usageLog: res.usageLog ?? null,\n ...handles(res),\n };\n }\n\n /** Meter a named credit. `POST /api/v1/signal/credit`. */\n credit(input: CreditInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"credit\" }, opts);\n }\n\n /** Debit the customer's wallet at model cost. `POST /api/v1/signal/wallet`. */\n wallet(input: WalletInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"wallet\" }, opts);\n }\n\n /** Advance one step of an outcome workflow. `POST /api/v1/signal/outcome`. */\n outcome(\n input: OutcomeInput,\n opts?: { wait?: boolean },\n ): Promise<TrackResult> {\n return this.track({ ...input, type: \"outcome\" }, opts);\n }\n\n /**\n * Close ONE outcome run — declares the workflow finished and bills it. The\n * outcome mirror of {@link Signals.completeComposite}, on its own dedicated\n * route: `POST /api/v1/signal/outcome/complete`.\n *\n * An outcome bills per COMPLETION, never per step, and `signals.outcome()`\n * never closes one — it accepts only the step shape. Declaring the workflow\n * finished is always this separate, explicit, contentless call.\n *\n * This closes the RUN only. If a step of this run also carried a\n * `composite`, that occurrence stays open and unbilled until you separately\n * call {@link Signals.completeComposite} — the two completions are\n * independent, and neither implies the other.\n *\n * Sent immediately, never buffered. A genuinely second, independent call for\n * an already-closed run is a PERMANENT error (it would bill the run twice),\n * not a safe no-op — see {@link OutcomeCompletionResult}.\n */\n async completeOutcome(\n input: OutcomeCompletionInput,\n ): Promise<OutcomeCompletionResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<\n SignalResponse & {\n status?: \"COMPLETED\" | \"ALREADY_COMPLETED\";\n usageLog?: OutcomeCompletionResult[\"usageLog\"];\n }\n >({\n method: \"POST\",\n path: OUTCOME_COMPLETE_PATH,\n idempotencyKey,\n body: {\n ...customerRefToWire(input),\n runId: input.runId,\n ...(input.member ? { member: input.member } : {}),\n ...(input.custom ? { custom: input.custom } : {}),\n idempotencyKey,\n },\n retry: true,\n });\n const queued = res.queued === true;\n return {\n delivery: queued ? \"accepted\" : \"recorded\",\n queued,\n ...(res.status != null ? { status: res.status } : {}),\n usageLog: res.usageLog ?? null,\n ...handles(res),\n };\n }\n\n /**\n * Record one unit-metered event (a fixed-price meter with no tokens),\n * addressed to a catalog unit by its `agentKey`. Sent immediately — unit\n * events are not buffered. `POST /api/v1/signal/unit`.\n *\n * Two things changed with the move off `POST /api/v1/units`, and both show up\n * in the return type. The route is now durable (the report lands in an inbox\n * before it is priced, so a failure parks as Pending and can be retried\n * instead of losing a billable event) and it answers `202` when it queues —\n * so this resolves {@link UnitTrackResult}, not a bare `{ unitUsage }`.\n * Branch on `queued`.\n */\n async unit(input: UnitInput): Promise<UnitTrackResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<\n SignalResponse & { unitUsage?: SerializedUnitUsage }\n >({\n method: \"POST\",\n path: UNIT_PATH,\n idempotencyKey,\n body: {\n ...customerRefToWire(input),\n agentKey: input.agentKey,\n ...(input.quantity != null ? { quantity: input.quantity } : {}),\n ...(input.member ? { member: input.member } : {}),\n ...(input.composite\n ? { composite: { [input.composite.ref]: input.composite.value } }\n : {}),\n ...(input.custom ? { custom: input.custom } : {}),\n // Assigned HERE, before the send, so the SAME key rides every\n // transport-level retry below. Without it a single 500 followed by a\n // success is TWO un-keyed reports, and the server dedups on the key —\n // so it bills the allowance down twice, up to `retry.maxAttempts`\n // times. The route gained idempotency precisely to stop that; not\n // using it by default would leave the double-charge reachable from the\n // client instead of the server.\n idempotencyKey,\n },\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n const queued = res.queued === true;\n return {\n status: queued ? \"accepted\" : \"recorded\",\n queued,\n unitUsage: res.unitUsage ?? null,\n ...handles(res),\n };\n }\n\n /**\n * Close ONE occurrence of a composite — a distinct tag value.\n * `POST /api/v1/signal/composite/complete`.\n *\n * A composite bundles several credits / outcomes / units and is billed as one\n * thing. The occurrence opens on the first tagged signal and costs nothing;\n * this call is the moment it is billed. Only your code knows when the\n * workflow ended, so this is a DECLARATION, not a hint: tagged signals may\n * arrive in any order and the occurrence stays open and unbilled until you\n * say otherwise. Put it on the line before your own `return`.\n *\n * EVERY composite needs this, outcome-backed ones included. `completeOutcome()`\n * closes its RUN and nothing else — it does not close the composite\n * occurrence the run was tagged into, whatever mix of credits, outcomes and\n * units that composite wraps. (Earlier versions of this SDK documented the\n * opposite. Believing it means the occurrence stays ONGOING forever and is\n * never billed, so if you tag outcome signals with a `composite`, you must\n * still call this.)\n *\n * Closing twice is safe: the second call answers `ALREADY_COMPLETED` and\n * cannot bill again. Calling it EARLY is also safe — before every entitlement\n * the composite is restricted to has reported, or while an ADVANCE pool is\n * full — the server parks the ping and applies it when the blocker clears,\n * rather than failing it.\n */\n async completeComposite(\n input: CompositeCompletionInput,\n ): Promise<CompositeCompletionResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<\n SignalResponse & {\n status?: \"COMPLETED\" | \"ALREADY_COMPLETED\";\n composite?: CompositeCompletionResult[\"composite\"];\n value?: string | null;\n }\n >({\n method: \"POST\",\n path: COMPOSITE_COMPLETE_PATH,\n idempotencyKey,\n body: {\n ...customerRefToWire(input),\n composite: { [input.composite.ref]: input.composite.value },\n ...(input.custom ? { custom: input.custom } : {}),\n // Auto-assigned like the others. A retry here could not double-BILL\n // even without it — closing a closed occurrence is a server-side\n // no-op — but that safety comes from occurrence-level dedup, not from\n // idempotency, and an un-keyed replay still writes a redundant inbox\n // row. Keying it collapses the retry into the one attempt it is.\n idempotencyKey,\n },\n retry: true,\n });\n const queued = res.queued === true;\n return {\n delivery: queued ? \"accepted\" : \"recorded\",\n queued,\n ...(res.status != null ? { status: res.status } : {}),\n ...(res.composite !== undefined ? { composite: res.composite } : {}),\n ...(res.value !== undefined ? { value: res.value } : {}),\n ...handles(res),\n };\n }\n\n /**\n * One customer's usage history, merged from every meter kind — credit,\n * outcome, unit, wallet, and completed composite occurrences — into one\n * feed sorted by time. `GET /api/v1/signal/usage-log`. Exactly the same\n * rows the customer portal's own \"Usage logs\" table shows, so a caller can\n * build against this instead of the portal UI.\n *\n * Cursor-paginated, NOT page-numbered: `limit` + `cursor` in, `nextCursor`\n * out. Omit `cursor` for the first page; pass the previous page's\n * `nextCursor` back to fetch the next one, and stop once it comes back\n * `null`. Unlike offset pagination, the cost of a page never grows with how\n * deep you've paged — each page only asks for rows strictly before the\n * cursor's position.\n *\n * Read-only; unlike {@link track}/{@link unit}/etc., there is nothing to\n * buffer or retry here.\n */\n usageLog(params: UsageLogListParams): Promise<UsageLogPage> {\n return this.transport.request<UsageLogPage>({\n method: \"GET\",\n path: USAGE_LOG_PATH,\n query: {\n customerId: params.customerId,\n limit: params.limit,\n cursor: params.cursor,\n from: params.from,\n to: params.to,\n },\n });\n }\n\n /**\n * Fetches up to 10 usage-log rows by id, in one call.\n * `GET /api/v1/signal/usage-log/lookup`.\n *\n * Built for linking a wallet debit to its usage: pass the `usageLogId`s\n * from `customers.wallet()` instead of paging through\n * {@link usageLog}. Scoped to your org, not to one customer — every row\n * carries its own `customerId`.\n *\n * Rows come back in the order of `ids`; duplicates are removed. Ids that\n * match nothing in your org are listed in `notFound`. More than 10\n * distinct ids is a 400.\n */\n lookupUsageLogs(ids: string[]): Promise<UsageLogLookupResult> {\n return this.transport.request<UsageLogLookupResult>({\n method: \"GET\",\n path: USAGE_LOG_LOOKUP_PATH,\n query: { ids: ids.join(\",\") },\n });\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateUnitInput, Unit, UpdateUnitInput } from \"../types.js\";\n\n/**\n * The `units` resource — fixed-price, non-LLM events (uploads, seats, API\n * calls), priced FLAT, SLAB or VOLUME. `/api/v1/units`.\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire a\n * unit with `archive()`; `unarchive()` brings it back unchanged.\n */\nexport class Units {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Unit[]> {\n const res = await this.transport.request<{ units: Unit[] }>({\n method: \"GET\",\n path: \"/api/v1/units\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.units, params.active);\n }\n\n /** One unit's configuration. */\n async get(id: string): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"GET\",\n path: `/api/v1/units/${encodeURIComponent(id)}`,\n });\n return res.unit;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ created: true; unit: Unit }>({\n method: \"POST\",\n path: \"/api/v1/units\",\n body: input,\n });\n return res.unit;\n }\n\n /** PARTIAL update: only the fields you send change. `tiers`, when sent, is\n * the complete new tier list. */\n async update(id: string, input: UpdateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ updated: true; unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.unit;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Unit> {\n const res = await this.transport.request<{ archived: true; unit: Unit }>({\n method: \"POST\",\n path: `/api/v1/units/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.unit;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Unit> {\n const res = await this.transport.request<{ unarchived: true; unit: Unit }>({\n method: \"POST\",\n path: `/api/v1/units/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.unit;\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateTaxInput, Tax, UpdateTaxInput } from \"../types.js\";\n\n/**\n * The `taxes` resource — the tax rates charged to customers by billing\n * country (the same rates as Settings → Taxes). `/api/v1/taxes`.\n *\n * Every active tax for a customer's country is applied to their invoices and\n * portal purchases automatically. There is no `delete()`, `archive()` or\n * `unarchive()` — archiving and restoring a tax is done in the dashboard.\n */\nexport class Taxes {\n constructor(private readonly transport: Transport) {}\n\n /** List them, oldest first. `{ active: true }` returns only active ones,\n * `{ active: false }` only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Tax[]> {\n const res = await this.transport.request<{ taxes: Tax[] }>({\n method: \"GET\",\n path: \"/api/v1/taxes\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.taxes, params.active);\n }\n\n /** One tax. */\n async get(id: string): Promise<Tax> {\n const res = await this.transport.request<{ tax: Tax }>({\n method: \"GET\",\n path: `/api/v1/taxes/${encodeURIComponent(id)}`,\n });\n return res.tax;\n }\n\n /** Create one. It starts active. Two active taxes can't share a name\n * (ignoring case) in the same country — that's a `ConflictError`. Not\n * retried on failure — a retry could create a second row. */\n async create(input: CreateTaxInput): Promise<Tax> {\n const res = await this.transport.request<{ created: true; tax: Tax }>({\n method: \"POST\",\n path: \"/api/v1/taxes\",\n body: input,\n });\n return res.tax;\n }\n\n /** PARTIAL update: only the fields you send change. Archived taxes can be\n * edited and stay archived. Only invoices issued afterwards use the new\n * values. */\n async update(id: string, input: UpdateTaxInput): Promise<Tax> {\n const res = await this.transport.request<{ updated: true; tax: Tax }>({\n method: \"PATCH\",\n path: `/api/v1/taxes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.tax;\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookSignatureError } from \"./errors.js\";\n\n/**\n * Receiving ClockNext webhooks.\n *\n * ClockNext POSTs a signed JSON event to each endpoint you register in the\n * dashboard (Settings → Webhooks). Two events exist today:\n *\n * wallet.balance.update a customer's MAIN wallet balance moved (credit or\n * debit). Invoice settlements and the Reserved\n * Wallet do not fire it.\n * wallet.balance.drop a debit took the balance from above a level to at\n * or below it. The level is the customer's own alert\n * level (`customers.setWalletAlert`) when they have\n * one, otherwise the endpoint's threshold. Fires once\n * per drop through the level, not on every debit while\n * the balance stays under it.\n *\n * Verify every request before trusting it — {@link constructWebhookEvent} does\n * that and returns the typed event. It needs the RAW request body: parsing the\n * JSON and re-serialising it changes the bytes and the signature will not match.\n *\n * Delivery is at-least-once: a non-2xx answer (or a timeout past 5s) is retried\n * with the SAME event `id`, so de-duplicate on `id`.\n */\n\n/** Events ClockNext sends today. New event types may be added later — ignore\n * any `event_type` you do not recognise (and still answer 2xx). */\nexport type WebhookEventType = \"wallet.balance.update\" | \"wallet.balance.drop\";\n\n/**\n * The `source` a `wallet.balance.update` event carries: the STORED ledger\n * source, which is coarser than `WalletTransactionSource` on the ledger API.\n * Do not compare the two — the ledger API reports `SUBSCRIPTION`, `RENEWAL`,\n * `API`, … where the webhook says `TOPUP` or `ADJUSTMENT`.\n *\n * `SETTLE` is part of the type but `wallet.balance.update` does not fire for it.\n */\nexport type WebhookWalletSource = \"TOPUP\" | \"USAGE\" | \"SETTLE\" | \"ADJUSTMENT\";\n\n/** The customer a wallet event is about. */\nexport interface WebhookCustomer {\n id: string;\n name: string;\n}\n\n/** Fields on every event. Field names are snake_case, exactly as sent. */\ninterface WebhookEventBase<T extends WebhookEventType, D> {\n /** `evt_…`. Identical across retries of one delivery — de-duplicate on it. */\n id: string;\n event_type: T;\n /** ISO-8601 time the event was created. */\n triggered_at: string;\n data: D;\n}\n\n/** `data` of `wallet.balance.update`. Balances are USD. */\nexport interface WalletBalanceUpdateData {\n customer: WebhookCustomer;\n source: WebhookWalletSource;\n previous_balance: number;\n current_balance: number;\n currency_code: \"usd\";\n}\n\n/** `data` of `wallet.balance.drop`. Balances and `threshold` are USD. */\nexport interface WalletBalanceDropData {\n customer: WebhookCustomer;\n /** The level that was crossed: the customer's own alert level, else the\n * endpoint's threshold. */\n threshold: number;\n previous_balance: number;\n current_balance: number;\n currency_code: \"usd\";\n}\n\nexport type WalletBalanceUpdateEvent = WebhookEventBase<\n \"wallet.balance.update\",\n WalletBalanceUpdateData\n>;\nexport type WalletBalanceDropEvent = WebhookEventBase<\n \"wallet.balance.drop\",\n WalletBalanceDropData\n>;\n\n/** Any event ClockNext sends. Narrow on `event_type`. */\nexport type WebhookEvent = WalletBalanceUpdateEvent | WalletBalanceDropEvent;\n\nexport interface ConstructEventOptions {\n /** Reject an event whose signed timestamp is further than this from now, in\n * either direction (replay protection). Default 300 (5 minutes). Pass 0 to\n * skip the check — only do that in tests. */\n toleranceSeconds?: number;\n /** Override \"now\" (unix seconds). For tests. */\n now?: number;\n}\n\n/** Header ClockNext puts the signature in. Node lower-cases header names. */\nexport const WEBHOOK_SIGNATURE_HEADER = \"x-clocknext-signature\";\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\n/**\n * Signs a body the way ClockNext does: `t=<unix_seconds>,v1=<hex hmac>`, the\n * HMAC-SHA256 of `${timestamp}.${rawBody}` under the endpoint secret. Exported\n * so you can sign a fixture in your own receiver's tests.\n */\nexport function signWebhookPayload(\n secret: string,\n rawBody: string | Buffer,\n timestamp: number,\n): string {\n const hmac = createHmac(\"sha256\", secret)\n .update(`${timestamp}.`)\n .update(rawBody)\n .digest(\"hex\");\n return `t=${timestamp},v1=${hmac}`;\n}\n\nfunction parseHeader(header: string): { t: number; v1: string[] } {\n let t: number | undefined;\n const v1: string[] = [];\n for (const part of header.split(\",\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) continue;\n const k = part.slice(0, eq).trim();\n const v = part.slice(eq + 1).trim();\n if (k === \"t\") {\n if (/^\\d+$/.test(v)) t = Number(v);\n } else if (k === \"v1\") {\n v1.push(v);\n }\n }\n if (t === undefined || v1.length === 0) {\n throw new WebhookSignatureError(\n \"Malformed x-clocknext-signature header: expected `t=<unix_seconds>,v1=<hex>`.\",\n );\n }\n return { t, v1 };\n}\n\nfunction safeEqualHex(expectedHex: string, givenHex: string): boolean {\n const expected = Buffer.from(expectedHex, \"hex\");\n const given = Buffer.from(givenHex, \"hex\");\n // timingSafeEqual throws on a length mismatch, so compare lengths first.\n // A non-hex or wrong-length value can never be a valid HMAC-SHA256.\n return given.length === expected.length && timingSafeEqual(expected, given);\n}\n\n/**\n * Verifies a ClockNext webhook request and returns the typed event.\n *\n * ```ts\n * app.post(\"/clocknext\", express.raw({ type: \"application/json\" }), (req, res) => {\n * let event;\n * try {\n * event = constructWebhookEvent(\n * req.body, // the raw Buffer, NOT parsed JSON\n * req.header(\"x-clocknext-signature\"),\n * process.env.CLOCKNEXT_WEBHOOK_SECRET!,\n * );\n * } catch {\n * return res.sendStatus(400);\n * }\n * if (event.event_type === \"wallet.balance.drop\") { … }\n * res.sendStatus(200);\n * });\n * ```\n *\n * @throws {WebhookSignatureError} header missing or malformed, signature does\n * not match, timestamp outside the tolerance, or the body is not a JSON event.\n */\nexport function constructWebhookEvent(\n rawBody: string | Buffer,\n signatureHeader: string | null | undefined,\n secret: string,\n options: ConstructEventOptions = {},\n): WebhookEvent {\n if (typeof rawBody !== \"string\" && !Buffer.isBuffer(rawBody)) {\n throw new WebhookSignatureError(\n \"Webhook body must be the raw request body (string or Buffer), not parsed JSON. \" +\n \"With Express use express.raw({ type: 'application/json' }).\",\n );\n }\n if (!secret) {\n throw new WebhookSignatureError(\"A webhook secret is required.\");\n }\n if (!signatureHeader) {\n throw new WebhookSignatureError(\"Missing x-clocknext-signature header.\");\n }\n\n const { t, v1 } = parseHeader(signatureHeader);\n\n // Recompute from the same `${t}.${body}` and accept any listed `v1`, so a\n // future signing-key rotation that sends two signatures keeps working.\n const expected = signWebhookPayload(secret, rawBody, t).split(\"v1=\")[1]!;\n if (!v1.some((candidate) => safeEqualHex(expected, candidate))) {\n throw new WebhookSignatureError(\n \"Webhook signature does not match. Check the secret and that the body is the unmodified raw body.\",\n );\n }\n\n const tolerance = options.toleranceSeconds ?? DEFAULT_TOLERANCE_SECONDS;\n if (tolerance > 0) {\n const now = options.now ?? Math.floor(Date.now() / 1000);\n if (Math.abs(now - t) > tolerance) {\n throw new WebhookSignatureError(\n `Webhook timestamp is outside the ${tolerance}s tolerance — possible replay.`,\n );\n }\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawBody.toString());\n } catch {\n throw new WebhookSignatureError(\"Webhook body is not valid JSON.\");\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as { id?: unknown }).id !== \"string\" ||\n typeof (parsed as { event_type?: unknown }).event_type !== \"string\"\n ) {\n throw new WebhookSignatureError(\"Webhook body is not a ClockNext event.\");\n }\n return parsed as WebhookEvent;\n}\n\n/** `cnk.webhooks` — the same verifier as {@link constructWebhookEvent}, for\n * callers who already hold a client. Needs no network and no API key use. */\nexport class Webhooks {\n /** See {@link constructWebhookEvent}. */\n constructEvent(\n rawBody: string | Buffer,\n signatureHeader: string | null | undefined,\n secret: string,\n options?: ConstructEventOptions,\n ): WebhookEvent {\n return constructWebhookEvent(rawBody, signatureHeader, secret, options);\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport { Flusher } from \"./flusher.js\";\nimport { Transport } from \"./http.js\";\nimport { Composites } from \"./resources/composites.js\";\nimport { Credits } from \"./resources/credits.js\";\nimport { Customers } from \"./resources/customers.js\";\nimport { Invoices } from \"./resources/invoices.js\";\nimport { Outcomes } from \"./resources/outcomes.js\";\nimport { Payments } from \"./resources/payments.js\";\nimport { Plans } from \"./resources/plans.js\";\nimport { Portal } from \"./resources/portal.js\";\nimport { Purchases } from \"./resources/purchases.js\";\nimport { Signals } from \"./resources/signals.js\";\nimport { Units } from \"./resources/units.js\";\nimport { Taxes } from \"./resources/taxes.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.js\";\nimport { Webhooks } from \"./webhooks.js\";\n\n/**\n * The ClockNext client.\n *\n * ```ts\n * const cnk = new ClockNext({ apiKey: process.env.CLOCKNEXT_API_KEY! });\n *\n * await cnk.signals.credit({\n * customerId: \"cus_123\",\n * model: \"gpt-4o\", // catalog model id\n * agentKey: \"api_credit\", // the credit's stable agent key\n * tokens: { input: 1200, output: 340 },\n * });\n *\n * // before a serverless function returns / on shutdown:\n * await cnk.flush();\n * ```\n */\nexport class ClockNext {\n /** Record usage signals (credit / wallet / outcome / unit) and read the usage log. */\n readonly signals: Signals;\n /** Manage customers, their members, and balances. */\n readonly customers: Customers;\n /** Billing plans: list, get, create, update, archive, unarchive. */\n readonly plans: Plans;\n /** Credits: list, get, create, update, archive, unarchive (no delete). */\n readonly credits: Credits;\n /** Outcomes: list, get, create, update, archive, unarchive (no delete). */\n readonly outcomes: Outcomes;\n /** Units: list, get, create, update, archive, unarchive (no delete). */\n readonly units: Units;\n /** Composites: list, get, create, update, archive, unarchive (no delete). */\n readonly composites: Composites;\n /** Tax rates by country: list, get, create, update (archive in the dashboard). */\n readonly taxes: Taxes;\n /** Subscribe customers to plans (purchases). */\n readonly purchases: Purchases;\n /** Read invoices and mint hosted pay links. */\n readonly invoices: Invoices;\n /** Read payments (paid invoices). */\n readonly payments: Payments;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n\n /** Verify incoming ClockNext webhooks (`wallet.balance.update` / `.drop`). */\n readonly webhooks: Webhooks;\n\n private readonly cfg: ResolvedConfig;\n private readonly flusher: Flusher;\n\n constructor(config: ClockNextConfig) {\n this.cfg = resolveConfig(config);\n\n if (typeof window !== \"undefined\") {\n this.cfg.logger.warn?.(\n \"[clocknext] Running in a browser exposes your secret API key. Use this SDK only on a server/backend.\",\n );\n }\n\n const transport = new Transport(this.cfg);\n this.flusher = new Flusher(transport, this.cfg);\n this.signals = new Signals(transport, this.flusher, this.cfg);\n this.customers = new Customers(transport);\n this.plans = new Plans(transport);\n this.credits = new Credits(transport);\n this.outcomes = new Outcomes(transport);\n this.units = new Units(transport);\n this.composites = new Composites(transport);\n this.taxes = new Taxes(transport);\n this.purchases = new Purchases(transport);\n this.invoices = new Invoices(transport);\n this.payments = new Payments(transport);\n this.portal = new Portal(transport);\n this.webhooks = new Webhooks();\n }\n\n /** Number of signals currently buffered (async mode). */\n get pending(): number {\n return this.flusher.size;\n }\n\n /** Force-send all buffered signals now. Await before a serverless return. */\n flush(): Promise<void> {\n return this.flusher.flush();\n }\n\n /** Flush and stop the background timer. Call on graceful shutdown. */\n close(): Promise<void> {\n return this.flusher.close();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/queue.ts","../src/flusher.ts","../src/retry.ts","../src/http.ts","../src/filters.ts","../src/resources/composites.ts","../src/resources/credits.ts","../src/idempotency.ts","../src/resources/customers.ts","../src/resources/invoices.ts","../src/resources/outcomes.ts","../src/resources/payments.ts","../src/resources/plans.ts","../src/resources/portal.ts","../src/resources/purchases.ts","../src/customer-ref.ts","../src/resources/signals.ts","../src/resources/units.ts","../src/resources/taxes.ts","../src/webhooks.ts","../src/client.ts"],"names":["message","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Typed error hierarchy. The server returns `{ statusCode, statusDetail, result }`\n * with a meaningful HTTP status; we map that status to a class so callers can\n * branch on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒\n * ignore, it's queued) rather than string-matching messages.\n */\n\n/** Machine-readable failure code, when the server sends one\n * (`statusDetail.code`). Preferred over any message heuristic. */\nexport type ClockNextErrorCode =\n | \"ALLOWANCE_EXHAUSTED\"\n | \"PLAN_REJECTED\"\n | \"IDEMPOTENCY_UNRESOLVED\"\n | \"WEBHOOK_SIGNATURE_INVALID\"\n | (string & {});\n\nexport class ClockNextError extends Error {\n /** HTTP status, when the failure came from a server response. */\n readonly status?: number;\n /** Whether the SDK considers this failure worth retrying. */\n readonly retryable: boolean;\n /**\n * The server's machine-readable code, when it sent one. Branch on this in\n * preference to `.message`, which is human copy and may be reworded.\n */\n readonly code?: ClockNextErrorCode;\n /**\n * The idempotency key of the request that failed, for metering calls.\n *\n * This is what makes a dead-letter retry safe: re-send the failed signal with\n * this SAME key and the server deduplicates it instead of billing twice. A\n * fresh key would double-bill, so never generate one when replaying.\n */\n readonly idempotencyKey?: string;\n\n constructor(\n message: string,\n opts: {\n status?: number;\n retryable?: boolean;\n code?: ClockNextErrorCode;\n idempotencyKey?: string;\n } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.retryable = opts.retryable ?? false;\n this.code = opts.code;\n this.idempotencyKey = opts.idempotencyKey;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — missing / invalid / expired API key. */\nexport class AuthError extends ClockNextError {}\n\n/** 403 — the key is valid but cannot perform this operation. */\nexport class ForbiddenError extends ClockNextError {}\n\n/** 400 — malformed request / schema validation failure. */\nexport class ValidationError extends ClockNextError {}\n\n/** 404 — unknown customer (also returned for cross-org access). */\nexport class NotFoundError extends ClockNextError {}\n\n/** 422 — no active plan, meter not in plan, model not enabled, member missing. */\nexport class PlanError extends ClockNextError {}\n\n/** 422 — the entitlement ran out: no credits / units / outcomes / composite\n * slots left. Distinct from {@link PlanError} because the fix is different —\n * this one is a top-up or an upsell, not a configuration change. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict. Almost always permanent (an archived customer); only the\n * idempotency-resolution conflict is transient, and only that one retries. */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(\n message: string,\n opts: { retryAfterMs?: number; idempotencyKey?: string } = {},\n ) {\n super(message, {\n status: 429,\n retryable: true,\n idempotencyKey: opts.idempotencyKey,\n });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** A webhook request failed verification (`webhooks.constructEvent`): missing or\n * malformed signature header, wrong secret or altered body, a timestamp outside\n * the tolerance, or a body that is not a ClockNext event. Answer 400. */\nexport class WebhookSignatureError extends ClockNextError {\n constructor(message: string) {\n super(message, { status: 400, retryable: false, code: \"WEBHOOK_SIGNATURE_INVALID\" });\n }\n}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string, opts: { idempotencyKey?: string } = {}) {\n super(message, { retryable: true, idempotencyKey: opts.idempotencyKey });\n }\n}\n\n/**\n * Wire field path → the SDK field the caller actually wrote.\n *\n * The server validates the WIRE body and names the offending path in its 400\n * (`usage.inputTokens: Expected number…`). But the SDK groups those fields\n * differently — `tokens: { input, output, cache, cacheWrite }` — so the path it reports\n * names something that does not exist anywhere in this SDK's API. A caller\n * (human or LLM) then searches their own code for `usage.inputTokens`, finds\n * nothing, and has no next move.\n *\n * Rewriting the path closes that loop: the error names the property the caller\n * typed. Ordered longest-first so `usage.model` is rewritten before a bare\n * `usage` prefix could shadow it.\n */\nconst FIELD_PATHS: ReadonlyArray<readonly [RegExp, string]> = [\n [/\\busage\\.inputTokens\\b/g, \"tokens.input\"],\n [/\\busage\\.outputTokens\\b/g, \"tokens.output\"],\n [/\\busage\\.cacheTokens\\b/g, \"tokens.cache\"],\n [/\\busage\\.cacheWriteTokens\\b/g, \"tokens.cacheWrite\"],\n [/\\busage\\.model\\b/g, \"model\"],\n // A missing/invalid `usage` block as a whole: the caller's equivalent is\n // `tokens` (plus `model`, which the SDK hoists to the top level).\n [/^usage:/, \"tokens:\"],\n];\n\n/** Rewrite wire field paths in a validation message to SDK field paths. */\nexport function translateFieldPaths(message: string): string {\n let out = message;\n for (const [pattern, replacement] of FIELD_PATHS) {\n out = out.replace(pattern, replacement);\n }\n return out;\n}\n\n/**\n * Whether a 422 means \"the entitlement ran out\" rather than \"the plan does not\n * allow this\".\n *\n * Both share a status, so they have to be told apart from the body. Prefer the\n * server's `code`; fall back to matching the exhaustion messages the signal\n * engine actually emits:\n *\n * No <name> outcomes remaining for this customer. Top up the allowance, …\n * No allowance left for \"<unit>\" — N of M remaining. Top up the balance, …\n * No slots left in composite \"<name>\" — all N are claimed for this cycle.\n *\n * Note what is NOT here: `insufficient`. Earlier versions of this SDK tested\n * for that word alone, and it appears nowhere in the ClockNext API — so\n * `AllowanceError` was unreachable and every exhaustion arrived as a\n * `PlanError`. The word is kept in the pattern only so a future rewording\n * toward it still classifies, never as the sole test.\n */\nconst ALLOWANCE_MESSAGE =\n /\\binsufficient\\b|\\bno allowance left\\b|\\bno slots left\\b|\\boutcomes remaining\\b|\\btop up the (?:allowance|balance)\\b|\\bbelow zero\\b/i;\n\n/** The adjust API's 422 for an idempotency key reused with a DIFFERENT\n * request. A conflict, not a plan problem — and never worth retrying. */\nconst IDEMPOTENCY_KEY_REUSED = /\\bidempotency key was already used\\b/i;\n\nexport function isAllowanceFailure(message: string, code?: string): boolean {\n if (code) return code === \"ALLOWANCE_EXHAUSTED\";\n return ALLOWANCE_MESSAGE.test(message);\n}\n\n/**\n * The one 409 that is worth retrying.\n *\n * Every other conflict this API returns is `Customer \"<id>\" is archived.` —\n * permanent, and retrying it only burns `retry.maxAttempts` rounds of backoff\n * before failing anyway. This one is a lost race while resolving an idempotent\n * replay, and it does clear.\n */\nconst TRANSIENT_CONFLICT = /could not resolve the idempotent request/i;\n\n/**\n * Maps a server response to a typed error.\n *\n * `code` is the server's machine-readable failure code when it sent one; it\n * takes precedence over every message heuristic below.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n retryAfterMs?: number,\n meta: { code?: ClockNextErrorCode; idempotencyKey?: string } = {},\n): ClockNextError {\n const raw = message || `Request failed with status ${status}.`;\n const { code, idempotencyKey } = meta;\n const opts = { status, code, idempotencyKey };\n\n if (status === 400) {\n // Only validation messages carry wire field paths worth rewriting.\n return new ValidationError(translateFieldPaths(raw), opts);\n }\n if (status === 401) return new AuthError(raw, opts);\n if (status === 403) return new ForbiddenError(raw, opts);\n if (status === 404) return new NotFoundError(raw, opts);\n // 408 Request Timeout — transient; the request never produced a result, so\n // a retry is safe.\n if (status === 408) return new ClockNextError(raw, { ...opts, retryable: true });\n if (status === 409) {\n return new ConflictError(raw, {\n ...opts,\n retryable:\n code === \"IDEMPOTENCY_UNRESOLVED\" || TRANSIENT_CONFLICT.test(raw),\n });\n }\n if (status === 422) {\n if (IDEMPOTENCY_KEY_REUSED.test(raw)) {\n return new ConflictError(raw, { ...opts, retryable: false });\n }\n return isAllowanceFailure(raw, code)\n ? new AllowanceError(raw, opts)\n : new PlanError(raw, opts);\n }\n if (status === 429) return new RateLimitError(raw, { retryAfterMs, idempotencyKey });\n if (status >= 500) return new ServerError(raw, { ...opts, retryable: true });\n return new ClockNextError(raw, opts);\n}\n","import { ValidationError } from \"./errors.js\";\nimport type {\n ClockNextConfig,\n DropReason,\n FetchLike,\n ResolvedConfig,\n Signal,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://payments.clocknext.com\";\n\n/**\n * Default failure reporters.\n *\n * In the default `async` mode a signal is sent by the background flusher, long\n * after `signals.credit()` resolved `{ status: \"buffered\" }`. There is no\n * promise left to reject into, so a failed REQUEST — a bad API key, an\n * unreachable host, a timeout — has nowhere to surface except these hooks.\n *\n * They do not cover a signal the server accepted (`202`) and then refused while\n * pricing it: that request succeeded as far as this SDK can tell. Those\n * rejections are recorded on the workspace's signal log in the ClockNext\n * dashboard, which is owner-only by design.\n *\n * They used to default to nothing at all, which meant a misconfigured\n * integration compiled, ran, returned success-shaped results, and metered\n * NOTHING, with not one line of output to say so. A billing client whose\n * default is silent data loss has its defaults inverted, so failures are now\n * reported on `console.error` unless the caller takes ownership by supplying\n * their own hook.\n *\n * Pass `onError: () => {}` to silence them deliberately.\n */\nfunction defaultOnError(error: unknown, signal?: Signal): void {\n const what = signal ? `${signal.type} signal` : \"request\";\n const who = signal ? ` customer=${signal.customerId}` : \"\";\n const key =\n signal?.idempotencyKey != null\n ? ` idempotencyKey=${signal.idempotencyKey}`\n : \"\";\n console.error(\n `[clocknext] ${what} permanently failed and was NOT recorded.${who}${key}`,\n error,\n );\n console.error(\n \"[clocknext] Pass `onError` to handle this yourself, or `onError: () => {}` to silence it.\",\n );\n}\n\n/** Drops that never reach `onError` — nothing was sent, so there is no send\n * failure to report. `send_failed` is skipped here because the error hook has\n * already reported it. */\nfunction defaultOnDrop(signal: Signal, reason: DropReason): void {\n if (reason === \"send_failed\") return;\n const why =\n reason === \"queue_full\"\n ? \"the local queue is full — raise `batch.maxQueueSize` or flush more often\"\n : \"the client is closed — this signal was tracked after `close()`\";\n console.error(\n `[clocknext] dropped a ${signal.type} signal without sending it: ${why}.`,\n `customer=${signal.customerId}`,\n );\n}\n\n/** Use `value` only if it's a finite number `>= min`; otherwise fall back. */\nfunction num(value: number | undefined, fallback: number, min: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= min\n ? value\n : fallback;\n}\n\n/** Applies defaults and validates required config. */\nexport function resolveConfig(config: ClockNextConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n // A ClockNextError, not a bare Error: a caller wrapping setup in\n // `catch (e) { if (e instanceof ClockNextError) … }` should not have this\n // one class of failure escape the net.\n throw new ValidationError(\"ClockNext: `apiKey` is required.\");\n }\n\n const fetchImpl: FetchLike | undefined =\n config.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? (globalThis.fetch.bind(globalThis) as FetchLike)\n : undefined);\n if (!fetchImpl) {\n throw new ValidationError(\n \"ClockNext: no global `fetch` found. Use Node 18+, or pass a `fetch` implementation.\",\n );\n }\n\n return {\n apiKey: config.apiKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n mode: config.mode ?? \"async\",\n timeoutMs: num(config.timeoutMs, 10_000, 1),\n batch: {\n maxSize: num(config.batch?.maxSize, 20, 1),\n maxIntervalMs: num(config.batch?.maxIntervalMs, 2000, 0),\n maxConcurrency: num(config.batch?.maxConcurrency, 5, 1),\n maxQueueSize: num(config.batch?.maxQueueSize, 10_000, 1),\n },\n retry: {\n maxAttempts: num(config.retry?.maxAttempts, 5, 1),\n baseDelayMs: num(config.retry?.baseDelayMs, 200, 0),\n maxDelayMs: num(config.retry?.maxDelayMs, 10_000, 0),\n },\n fetch: fetchImpl,\n logger: config.logger ?? {},\n // Both default to loud. See the note above `defaultOnError`.\n onError: config.onError ?? defaultOnError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop ?? defaultOnDrop,\n };\n}\n","import type { Signal } from \"./types.js\";\n\n/** One buffered, wire-ready signal awaiting a background flush. */\nexport interface QueuedSignal {\n /**\n * The route this signal posts to (`/api/v1/signal/credit` etc.), decided by\n * `track()` when the signal was buffered.\n *\n * It is stored per item rather than fixed on the Flusher because each meter\n * now has its own endpoint. A single hardcoded path was fine when everything\n * went to `/api/v1/usage`; keeping one would have meant async mode silently\n * posting to the deprecated route while sync mode used the new ones.\n */\n path: string;\n /** The exact JSON body to POST. */\n body: Record<string, unknown>;\n /** The original signal — passed to onError/onDrop hooks. */\n signal: Signal;\n}\n\n/**\n * Internal buffer seam. Currently in-memory only — this interface exists so a\n * durable (disk/Redis/SQLite) implementation can be slotted in later without\n * touching the Flusher. It is NOT part of the public API and is not yet\n * injectable; don't rely on it externally.\n */\nexport interface QueueStore {\n push(item: QueuedSignal): void;\n /** Remove and return up to `n` items (FIFO). */\n take(n: number): QueuedSignal[];\n size(): number;\n}\n\nexport class InMemoryQueue implements QueueStore {\n private items: QueuedSignal[] = [];\n\n push(item: QueuedSignal): void {\n this.items.push(item);\n }\n\n take(n: number): QueuedSignal[] {\n return this.items.splice(0, n);\n }\n\n size(): number {\n return this.items.length;\n }\n}\n","import type { Transport } from \"./http.js\";\nimport { InMemoryQueue, type QueueStore, type QueuedSignal } from \"./queue.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Background send engine for async-mode signals. Buffers wire-ready signals and\n * flushes them when the buffer reaches `maxSize` OR every `maxIntervalMs`,\n * whichever comes first — the Segment/Amberflo pattern. The Transport owns\n * retries; `close()` drains and awaits in-flight sends so a serverless process\n * can flush before it freezes.\n */\nexport class Flusher {\n private readonly queue: QueueStore = new InMemoryQueue();\n private timer: ReturnType<typeof setTimeout> | null = null;\n private draining: Promise<void> | null = null;\n private closed = false;\n\n constructor(\n private readonly transport: Transport,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /**\n * Buffer one signal. Drops (with onDrop) when closed or the queue is full.\n * Returns whether it was actually buffered, so `track()` can report a drop\n * honestly instead of answering \"buffered\" for a signal it threw away.\n */\n enqueue(item: QueuedSignal): boolean {\n if (this.closed) {\n // Not `send_failed` — nothing was ever sent. Reporting a send failure for\n // a signal that never left the buffer sends a caller looking for a\n // network problem that does not exist.\n this.cfg.onDrop?.(item.signal, \"closed\");\n return false;\n }\n if (this.queue.size() >= this.cfg.batch.maxQueueSize) {\n this.cfg.logger.warn?.(\"[clocknext] queue full — dropping signal\");\n this.cfg.onDrop?.(item.signal, \"queue_full\");\n return false;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\n return true;\n }\n\n /** Arm the interval timer if it isn't already running. */\n private arm(): void {\n if (this.timer || this.closed) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.cfg.batch.maxIntervalMs);\n // Don't keep the event loop alive just for the flush timer.\n (this.timer as { unref?: () => void }).unref?.();\n }\n\n /** Cancel the interval timer if one is armed. */\n private clearTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Send everything buffered at the moment this resolves.\n *\n * Overlapping calls CHAIN onto the in-flight drain rather than sharing it.\n * Sharing looks equivalent and is not: a drain that has already passed its\n * final `size() > 0` check cannot see a signal enqueued a moment later, so\n * handing that same promise back would resolve `flush()` — and therefore\n * `close()` — with the buffer non-empty. Since `close()` has already set\n * `closed`, `arm()` will not re-arm, and the timer it did arm is `unref`'d,\n * so the process is free to exit and that signal is simply lost. Chaining\n * guarantees at least one full drain begins after this call.\n *\n * Concurrency is unaffected: drains run one after another, and each one\n * sends at most `maxConcurrency` signals at a time.\n */\n flush(): Promise<void> {\n this.clearTimer();\n // A prior drain that rejected must not poison the chain, hence the catch.\n const prior = this.draining ?? Promise.resolve();\n const tracked: Promise<void> = prior\n .catch(() => {})\n .then(() => this.drain())\n .finally(() => {\n if (this.draining === tracked) this.draining = null;\n });\n this.draining = tracked;\n return tracked;\n }\n\n /** Drain the buffer in concurrency-bounded waves until it's empty. */\n private async drain(): Promise<void> {\n let sent = 0;\n while (this.queue.size() > 0) {\n const wave = this.queue.take(this.cfg.batch.maxConcurrency);\n const results = await Promise.all(wave.map((item) => this.send(item)));\n sent += results.filter(Boolean).length;\n }\n if (sent > 0) this.cfg.onFlush?.(sent);\n }\n\n /** Send one item; never throws — failures surface via onError/onDrop. */\n private async send(item: QueuedSignal): Promise<boolean> {\n try {\n await this.transport.request({\n method: \"POST\",\n // Per-item, not per-Flusher: one route per meter. See `QueuedSignal`.\n path: item.path,\n body: item.body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n // Rides onto any thrown error so `onError` can replay this exact\n // signal without minting a new key (which would bill it twice).\n idempotencyKey:\n typeof item.body.idempotencyKey === \"string\"\n ? item.body.idempotencyKey\n : undefined,\n });\n return true;\n } catch (error) {\n this.cfg.onError?.(error, item.signal);\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return false;\n }\n }\n\n get size(): number {\n return this.queue.size();\n }\n\n /** Flush remaining signals, then refuse further enqueues. */\n async close(): Promise<void> {\n this.closed = true;\n await this.flush();\n // Nothing can be enqueued now, so the buffer is empty for good and a timer\n // armed just before close has nothing left to do. Clearing it lets a\n // process exit immediately instead of waiting on a stray handle.\n this.clearTimer();\n }\n}\n","import { ClockNextError } from \"./errors.js\";\n\n/**\n * Retry classification + backoff. Mirrors the convergent industry policy\n * (Stripe / Stainless clients): retry transient transport failures\n * (network, timeout, 408/409/429/5xx); never retry deterministic 4xx\n * (400/401/404 and 422 validation/plan/allowance). Exponential backoff with\n * equal jitter, honoring a server `Retry-After`. The Transport additionally\n * gates retries by request safety (GET/DELETE, or a write that explicitly\n * opts in).\n */\n\n/** Whether an error should be retried. NetworkError/Server/RateLimit/Conflict\n * carry `retryable: true`; everything else is permanent. */\nexport function isRetryable(error: unknown): boolean {\n return error instanceof ClockNextError && error.retryable;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) and `retry-after-ms` headers. */\nexport function parseRetryAfter(headers: Headers): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms) {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const ra = headers.get(\"retry-after\");\n if (ra) {\n const secs = Number(ra);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(ra);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/**\n * Backoff for a given attempt (1-based). Exponential `base * 2^(attempt-1)`,\n * capped at `maxDelayMs`, with equal jitter (×[0.5, 1.0]). A server-provided\n * `retryAfterMs` overrides the computed value.\n */\nexport function computeBackoff(\n attempt: number,\n opts: { baseDelayMs: number; maxDelayMs: number },\n retryAfterMs?: number,\n rand: () => number = Math.random,\n): number {\n if (retryAfterMs != null) return Math.min(retryAfterMs, opts.maxDelayMs);\n const raw = opts.baseDelayMs * Math.pow(2, Math.max(0, attempt - 1));\n const capped = Math.min(raw, opts.maxDelayMs);\n // Equal jitter: a random point in [0.5, 1.0] of the capped delay.\n return Math.round(capped * (0.5 + rand() * 0.5));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { NetworkError, RateLimitError, errorFromResponse } from \"./errors.js\";\nimport { computeBackoff, isRetryable, parseRetryAfter, sleep } from \"./retry.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Injected from package.json at build time (see tsup `define`) so it can't\n * drift. Falls back to a dev marker when run un-bundled (tests, ts-node).\n */\ndeclare const __SDK_VERSION__: string | undefined;\nconst SDK_VERSION =\n typeof __SDK_VERSION__ !== \"undefined\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n path: string;\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n /**\n * Whether this call may be auto-retried on a transient failure. Defaults to\n * method-based safety: reads (GET), idempotent replaces (PUT), and DELETE are\n * replay-safe. Non-idempotent writes (POST/PATCH) default to NOT retried so a\n * transient failure can't duplicate the write; callers that tolerate a retry\n * opt in explicitly.\n */\n retry?: boolean;\n /**\n * The idempotency key carried in this request's body, for metering calls.\n *\n * Copied onto any error thrown, so a caller handling a permanent failure can\n * replay the signal with the SAME key instead of minting a fresh one — which\n * would defeat server-side dedup and bill twice. See\n * `ClockNextError.idempotencyKey`.\n */\n idempotencyKey?: string;\n}\n\n/**\n * The single HTTP seam. Builds the authenticated request, enforces a timeout,\n * unwraps the `{ ok, ... }` envelope, maps failures to typed errors, and retries\n * transient ones with backoff + jitter.\n */\nexport class Transport {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T = unknown>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n // Reads, idempotent PUT replaces, and DELETE are replay-safe by default;\n // non-idempotent writes are retried only when the caller opts in (e.g.\n // best-effort metering signals).\n const replaySafe =\n opts.method === \"GET\" ||\n opts.method === \"PUT\" ||\n opts.method === \"DELETE\";\n const allowRetry = opts.retry ?? replaySafe;\n const maxAttempts = allowRetry ? this.cfg.retry.maxAttempts : 1;\n\n let attempt = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n attempt++;\n try {\n return await this.once<T>(url, opts);\n } catch (error) {\n const canRetry = attempt < maxAttempts && isRetryable(error);\n if (!canRetry) throw error;\n const retryAfterMs =\n error instanceof RateLimitError ? error.retryAfterMs : undefined;\n const delayMs = computeBackoff(attempt, this.cfg.retry, retryAfterMs);\n this.cfg.onRetry?.({ attempt, delayMs, error });\n this.cfg.logger.debug?.(\n `[clocknext] retry ${attempt}/${maxAttempts - 1} in ${delayMs}ms`,\n error instanceof Error ? error.message : error,\n );\n await sleep(delayMs);\n }\n }\n }\n\n /** One attempt: fetch + timeout + envelope/status handling. */\n private async once<T>(url: string, opts: RequestOptions): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.cfg.timeoutMs);\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers: this.headers(opts),\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: controller.signal,\n });\n } catch (err) {\n const message =\n controller.signal.aborted\n ? `Request to ${opts.path} timed out after ${this.cfg.timeoutMs}ms.`\n : `Network error calling ${opts.path}: ${\n err instanceof Error ? err.message : String(err)\n }`;\n throw new NetworkError(message, { idempotencyKey: opts.idempotencyKey });\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let json: unknown = undefined;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n // Non-JSON body — only an error if the status is also bad.\n }\n }\n\n // Every `/api/v1` route answers through `v1Success`/`v1Error`:\n // { statusCode, statusDetail: { status, message, code? }, result }\n // The `{ ok, error, ...payload }` shape below is a defensive fallback for a\n // route that has not been migrated (or a proxy that rewrites the body), not\n // a contract the current API still speaks.\n const obj = (json ?? {}) as Record<string, unknown>;\n const meta = { idempotencyKey: opts.idempotencyKey };\n const isEnveloped =\n typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isEnveloped) {\n const detail = obj.statusDetail as\n | { status?: string; message?: string; code?: string }\n | undefined;\n if (res.ok && detail?.status === \"SUCCESS\") {\n return ((obj.result as T | undefined) ?? ({} as T));\n }\n const message =\n detail?.message ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(res.status, message, parseRetryAfter(res.headers), {\n ...meta,\n code: detail?.code,\n });\n }\n\n const envelope = obj as { ok?: boolean; error?: string };\n if (res.ok && envelope.ok !== false) {\n return envelope as T;\n }\n const message =\n envelope.error ?? text ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(\n res.status,\n message,\n parseRetryAfter(res.headers),\n meta,\n );\n }\n\n private headers(opts: RequestOptions): Record<string, string> {\n const h: Record<string, string> = {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n \"User-Agent\": `clocknext-sdk-js/${SDK_VERSION}`,\n };\n if (opts.body !== undefined) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n ): string {\n // baseUrl already has trailing slashes stripped in resolveConfig.\n let url = `${this.cfg.baseUrl}${path}`;\n if (query) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== \"\") params.set(k, String(v));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n return url;\n }\n}\n","/**\n * The `active` list filter, used by `plans.list()`.\n *\n * The API offers exactly ONE filter: `?active=true` narrows a list to active\n * rows. There is no inactive-only parameter — the server tests\n * `searchParams.get(\"active\") === \"true\"` and returns everything otherwise.\n *\n * That made `{ active: false }` a trap. It reads as \"only the archived ones\",\n * but it serialised to `active=false`, failed the server's equality test, and\n * returned EVERY row — including all the active ones the caller was trying to\n * exclude. The opposite of the request, with no error to notice.\n *\n * Rather than leave a boolean whose `false` branch means the reverse of what it\n * says, `false` is honoured here instead: the query parameter is omitted and\n * the active rows are filtered out client-side. Omitting `active` entirely\n * still means \"everything\", which is the API's own default.\n */\n\n/** The `active` query value to send: only `true` narrows server-side. */\nexport function activeQuery(active?: boolean): string | undefined {\n return active === true ? \"true\" : undefined;\n}\n\n/**\n * Apply the half of the filter the API cannot do. A no-op unless `active` is\n * explicitly `false`, in which case only archived rows survive.\n */\nexport function filterByActive<T extends { isActive: boolean }>(\n rows: T[],\n active?: boolean,\n): T[] {\n return active === false ? rows.filter((row) => !row.isActive) : rows;\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { Composite, CreateCompositeInput, UpdateCompositeInput } from \"../types.js\";\n\n/**\n * The `composites` resource — several credits / outcomes / units grouped under\n * one tag (`refId`) and billed as ONE thing per completed occurrence.\n * `/api/v1/composites`.\n *\n * Creating a composite charges nobody: it only bills once a plan sells it as\n * a `PRICING_METRIC` entitlement (`plans.create()` with its `compositeId`).\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire a\n * composite with `archive()` (new signals stop resolving to it; its history is\n * kept); `unarchive()` brings it back.\n */\nexport class Composites {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Composite[]> {\n const res = await this.transport.request<{ composites: Composite[] }>({\n method: \"GET\",\n path: \"/api/v1/composites\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.composites, params.active);\n }\n\n /** One composite's configuration. */\n async get(id: string): Promise<Composite> {\n const res = await this.transport.request<{ composite: Composite }>({\n method: \"GET\",\n path: `/api/v1/composites/${encodeURIComponent(id)}`,\n });\n return res.composite;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateCompositeInput): Promise<Composite> {\n const res = await this.transport.request<{ created: true; composite: Composite }>({\n method: \"POST\",\n path: \"/api/v1/composites\",\n body: input,\n });\n return res.composite;\n }\n\n /** PARTIAL update: only the fields you send change. `entitlements`, when\n * sent, is the complete new set. Renaming `refId` cuts live traffic over at\n * once — ship the new tag to your callers first. */\n async update(id: string, input: UpdateCompositeInput): Promise<Composite> {\n const res = await this.transport.request<{ updated: true; composite: Composite }>({\n method: \"PATCH\",\n path: `/api/v1/composites/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.composite;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Composite> {\n const res = await this.transport.request<{ archived: true; composite: Composite }>({\n method: \"POST\",\n path: `/api/v1/composites/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.composite;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Composite> {\n const res = await this.transport.request<{ unarchived: true; composite: Composite }>({\n method: \"POST\",\n path: `/api/v1/composites/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.composite;\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateCreditInput, Credit, UpdateCreditInput } from \"../types.js\";\n\n/**\n * The `credits` resource — the token-metered credits your product draws down\n * by `agentKey`. `/api/v1/credits`.\n *\n * Pricing is never typed in: `create()` takes a `modelBundle` (one line per\n * model, each with `averageTokensPerLLMCall` and its input / output / cache /\n * cacheWrite split) and the server works out `basePrice` and\n * `pricePerCredit` from the models' live prices.\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire a\n * credit with `archive()`; `unarchive()` brings it back unchanged.\n */\nexport class Credits {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Credit[]> {\n const res = await this.transport.request<{ credits: Credit[] }>({\n method: \"GET\",\n path: \"/api/v1/credits\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.credits, params.active);\n }\n\n /** One credit's configuration. */\n async get(id: string): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"GET\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n return res.credit;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ created: true; credit: Credit }>({\n method: \"POST\",\n path: \"/api/v1/credits\",\n body: input,\n });\n return res.credit;\n }\n\n /** PARTIAL update: only the fields you send change. Send `modelBundle` to\n * re-price; leave it out to keep the stored base price. */\n async update(id: string, input: UpdateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ updated: true; credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.credit;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Credit> {\n const res = await this.transport.request<{ archived: true; credit: Credit }>({\n method: \"POST\",\n path: `/api/v1/credits/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.credit;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Credit> {\n const res = await this.transport.request<{ unarchived: true; credit: Credit }>({\n method: \"POST\",\n path: `/api/v1/credits/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.credit;\n }\n}\n","/**\n * Idempotency-key generation for usage signals.\n *\n * Every signal carries an idempotency key so that a retry — whether a\n * Transport-level replay of one send, or a re-flush of the buffered body — is\n * deduplicated on the server instead of recording a second, double-billed\n * event. The server keys `RawUsageLog` on `(organizationId, idempotencyKey)`\n * and replays the original result on a repeat.\n *\n * The key is generated ONCE, before the signal is buffered or sent, and the\n * same key rides every retry of that signal (see ARCHITECTURE AD-4). A caller\n * may instead supply their own key on the signal — a stable id for the logical\n * event — to also dedup across process restarts / at-least-once redelivery,\n * which an in-memory auto-generated key cannot survive.\n */\n\n/**\n * A fresh idempotency key. A UUID v4 when the runtime exposes Web Crypto\n * (Node ≥ 18, browsers, edge runtimes), with a non-cryptographic fallback for\n * exotic runtimes that lack it. The value is opaque to the server — only its\n * uniqueness matters, not its randomness quality.\n */\nexport function newKey(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (typeof c?.randomUUID === \"function\") return c.randomUUID();\n // Fallback: an RFC-4122-shaped v4 from Math.random. Uniqueness (not security)\n // is all that's required for deduplication.\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import type { Transport } from \"../http.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n AddMemberInput,\n AdjustResult,\n ApiCustomer,\n CompositeAdjustInput,\n CreateCustomerInput,\n CreditAdjustInput,\n CreditBalance,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n Member,\n MemberProfile,\n OutcomeAdjustInput,\n OutcomeBalance,\n RecurringGrantInput,\n RecurringGrantResult,\n RemovedMember,\n UnitAdjustInput,\n UnitBalance,\n UpdateMemberInput,\n WalletAdjustInput,\n WalletAlert,\n WalletLedgerPage,\n WalletLedgerParams,\n WalletTransaction,\n} from \"../types.js\";\n\n/**\n * The `customers` resource — full CRUD over the org's customers plus the\n * read-only insight endpoints (balances / plan). Every call is scoped\n * to the API key's organisation server-side; a customer in another org\n * resolves as a NotFoundError.\n */\nexport class Customers {\n constructor(private readonly transport: Transport) {}\n\n /** Create a customer. `POST /api/v1/customers`. */\n async create(input: CreateCustomerInput): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"POST\",\n path: \"/api/v1/customers\",\n body: input,\n });\n return res.customer;\n }\n\n /** List customers, most-recent first (cursor-paginated). `GET /api/v1/customers`. */\n async list(params: {\n limit?: number;\n q?: string;\n cursor?: string;\n } = {}): Promise<CustomerList> {\n const res = await this.transport.request<CustomerList>({\n method: \"GET\",\n path: \"/api/v1/customers\",\n query: { limit: params.limit, q: params.q, cursor: params.cursor },\n });\n return { customers: res.customers, nextCursor: res.nextCursor };\n }\n\n /**\n * Async iterator over ALL customers, transparently following the cursor.\n * `for await (const c of cnk.customers.iterate()) { … }`\n */\n async *iterate(params: { limit?: number; q?: string } = {}): AsyncGenerator<\n ApiCustomer\n > {\n let cursor: string | undefined;\n do {\n const page = await this.list({ ...params, cursor });\n for (const c of page.customers) yield c;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n /** Fetch one customer. `GET /api/v1/customers/:id`. */\n async get(id: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial). `PATCH /api/v1/customers/:id`. */\n async update(\n id: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.customer;\n }\n\n /**\n * Fetch one customer by YOUR id for them (its `externalId`), instead of\n * ours. Same result as {@link get}. `GET /api/v1/customers/ext/:externalId`.\n * An unknown external id is a `NotFoundError`; only active customers match.\n */\n async getByExternalId(externalId: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial), addressed by its `externalId`. Same body as\n * {@link update}. `PATCH /api/v1/customers/ext/:externalId`. */\n async updateByExternalId(\n externalId: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}`,\n body: input,\n });\n return res.customer;\n }\n\n /** {@link delete}, addressing the customer by its `externalId`.\n * `DELETE /api/v1/customers/ext/:externalId`. */\n async deleteByExternalId(externalId: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}`,\n });\n }\n\n /** Delete a customer (members, invitations, usage logs cascade). */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n }\n\n /** Wallet / credit / outcome / unit balances. `GET …/:id/balances`. */\n balances(id: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/balances`,\n });\n }\n\n /**\n * One page of the customer's wallet ledger — every movement of wallet\n * money, newest first — plus both wallet balances. Cursor-paginated: pass\n * back `nextCursor` as `cursor`. `GET /api/v1/customers/:id/wallet`.\n */\n wallet(id: string, params: WalletLedgerParams = {}): Promise<WalletLedgerPage> {\n return this.walletPage(`/api/v1/customers/${encodeURIComponent(id)}/wallet`, params);\n }\n\n /** {@link wallet}, addressing the customer by its `externalId`.\n * `GET /api/v1/customers/ext/:externalId/wallet`. */\n walletByExternalId(\n externalId: string,\n params: WalletLedgerParams = {},\n ): Promise<WalletLedgerPage> {\n return this.walletPage(\n `/api/v1/customers/ext/${encodeURIComponent(externalId)}/wallet`,\n params,\n );\n }\n\n /**\n * Async iterator over the customer's WHOLE wallet ledger, newest first,\n * following the cursor. `params.cursor` is ignored.\n * `for await (const t of cnk.customers.iterateWallet(id)) { … }`\n */\n async *iterateWallet(\n id: string,\n params: Omit<WalletLedgerParams, \"cursor\"> = {},\n ): AsyncGenerator<WalletTransaction> {\n let cursor: string | undefined;\n do {\n const page = await this.wallet(id, { ...params, cursor });\n for (const t of page.transactions) yield t;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n private walletPage(path: string, params: WalletLedgerParams): Promise<WalletLedgerPage> {\n return this.transport.request<WalletLedgerPage>({\n method: \"GET\",\n path,\n query: {\n limit: params.limit,\n cursor: params.cursor,\n from: params.from,\n to: params.to,\n },\n });\n }\n\n /** {@link balances}, addressing the customer by its `externalId`.\n * `GET /api/v1/customers/ext/:externalId/balances`. */\n balancesByExternalId(externalId: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}/balances`,\n });\n }\n\n /**\n * One credit balance for a customer, matched by `creditId` or `creditName`;\n * `null` when the customer has no plan or no matching credit. Convenience\n * over `balances()` + `Array.find` — it fetches the FULL balances under the\n * hood (there is no server-side scoped read), so prefer `balances()` when you\n * need several rows from the same customer.\n */\n async creditBalance(\n customerId: string,\n match: { creditId?: string; creditName?: string },\n ): Promise<CreditBalance | null> {\n const { credits } = await this.balances(customerId);\n return (\n credits.find(\n (c) =>\n (match.creditId != null && c.creditId === match.creditId) ||\n (match.creditName != null && c.creditName === match.creditName),\n ) ?? null\n );\n }\n\n /** One outcome balance for a customer, matched by `outcomeId` or\n * `outcomeName`; `null` when absent. See {@link creditBalance} for the\n * fetch-then-filter caveat. */\n async outcomeBalance(\n customerId: string,\n match: { outcomeId?: string; outcomeName?: string },\n ): Promise<OutcomeBalance | null> {\n const { outcomes } = await this.balances(customerId);\n return (\n outcomes.find(\n (o) =>\n (match.outcomeId != null && o.outcomeId === match.outcomeId) ||\n (match.outcomeName != null && o.outcomeName === match.outcomeName),\n ) ?? null\n );\n }\n\n /** One unit balance for a customer, matched by `unitId` or `unitName`;\n * `null` when absent. See {@link creditBalance} for the fetch-then-filter\n * caveat. */\n async unitBalance(\n customerId: string,\n match: { unitId?: string; unitName?: string },\n ): Promise<UnitBalance | null> {\n const { units } = await this.balances(customerId);\n return (\n units.find(\n (u) =>\n (match.unitId != null && u.unitId === match.unitId) ||\n (match.unitName != null && u.unitName === match.unitName),\n ) ?? null\n );\n }\n\n /** The customer's current plan. `GET …/:id/plan`. */\n plan(id: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/plan`,\n });\n }\n\n /** {@link plan}, addressing the customer by its `externalId`.\n * `GET /api/v1/customers/ext/:externalId/plan`. */\n planByExternalId(externalId: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}/plan`,\n });\n }\n\n // --- Members -------------------------------------------------------------\n\n /** List a customer's members. `GET …/:id/members`. */\n async listMembers(id: string): Promise<Member[]> {\n const res = await this.transport.request<{ members: Member[] }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n });\n return res.members;\n }\n\n /** Add a member to a customer. Duplicate `email` → ConflictError. */\n async addMember(id: string, input: AddMemberInput): Promise<MemberProfile> {\n const res = await this.transport.request<{ member: MemberProfile }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n body: input,\n });\n return res.member;\n }\n\n /** Update a member's profile. Duplicate `email` → ConflictError. `PATCH …/:id/members/:memberId`. */\n async updateMember(\n id: string,\n memberId: string,\n input: UpdateMemberInput,\n ): Promise<MemberProfile> {\n const res = await this.transport.request<{ member: MemberProfile }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n body: input,\n });\n return res.member;\n }\n\n /** Remove a member from a customer, returning who was removed. `DELETE …/:id/members/:memberId`. */\n async removeMember(id: string, memberId: string): Promise<RemovedMember> {\n const res = await this.transport.request<{ removed: true; member: RemovedMember }>({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n });\n return res.member;\n }\n\n // --- Billing config -----------------------------------------------------\n\n // Note: a customer's currency is set through `update(id, { currencyCode })`\n // (PATCH …/:id) — there is no separate currency endpoint. Credit-type\n // assignment has no public API.\n\n // --- Balance adjustments -------------------------------------------------\n\n /** Grant or claw back a credit balance. The credit must be a prepaid part of\n * the customer's current plan. Pass `idempotencyKey` to make it safe to\n * retry. `POST …/:id/credits/adjust`. */\n adjustCredit(id: string, input: CreditAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/credits/adjust`, input);\n }\n\n /** Grant or claw back an outcome balance. The outcome must be a prepaid part\n * of the customer's current plan. `POST …/:id/outcomes/adjust`. */\n adjustOutcome(id: string, input: OutcomeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/outcomes/adjust`, input);\n }\n\n /** Grant or claw back a unit balance. The unit must be a prepaid part of the\n * customer's current plan. `POST …/:id/units/adjust`. */\n adjustUnit(id: string, input: UnitAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/units/adjust`, input);\n }\n\n /** Grant or claw back slots on a customer's ADVANCE composite pool for the\n * current billing cycle. `remaining` is the resulting slot count.\n * `POST …/:id/composites/adjust`. */\n adjustComposite(id: string, input: CompositeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/composites/adjust`, input);\n }\n\n /**\n * Top up (positive `delta`) or draw down (negative `delta`) a customer's\n * wallet, in USD — allowed whatever the customer's plan. `remaining` is the\n * resulting USD balance. No `agentKey` — a customer has exactly one wallet.\n * Pass `pool: \"reserved\"` to move the Reserved Wallet instead (then\n * `remaining` is its balance). `POST …/:id/wallet/adjust`.\n */\n adjustWallet(id: string, input: WalletAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/${encodeURIComponent(id)}/wallet/adjust`, input);\n }\n\n /** {@link adjustCredit}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/credits/adjust`. */\n adjustCreditByExternalId(id: string, input: CreditAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/credits/adjust`, input);\n }\n\n /** {@link adjustOutcome}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/outcomes/adjust`. */\n adjustOutcomeByExternalId(id: string, input: OutcomeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/outcomes/adjust`, input);\n }\n\n /** {@link adjustUnit}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/units/adjust`. */\n adjustUnitByExternalId(id: string, input: UnitAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/units/adjust`, input);\n }\n\n /** {@link adjustComposite}, addressing the customer by its `externalId`\n * (`id` here). `POST /api/v1/customers/ext/:externalId/composites/adjust`. */\n adjustCompositeByExternalId(id: string, input: CompositeAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/composites/adjust`, input);\n }\n\n /** {@link adjustWallet}, addressing the customer by its `externalId` (`id`\n * here). `POST /api/v1/customers/ext/:externalId/wallet/adjust`. */\n adjustWalletByExternalId(id: string, input: WalletAdjustInput): Promise<AdjustResult> {\n return this.adjust(`/api/v1/customers/ext/${encodeURIComponent(id)}/wallet/adjust`, input);\n }\n\n /**\n * Set (a number of 0 or more, USD) or clear (`null`) a customer's low-balance\n * alert level. At or below it the `wallet.balance.drop` webhook fires for this\n * customer, whatever the endpoint's own threshold is; a customer without a\n * level falls back to each endpoint's threshold. Returns the saved level.\n * Idempotent (a PUT), so it retries safely. `PUT …/:id/wallet/alert`.\n */\n setWalletAlert(id: string, threshold: number | null): Promise<WalletAlert> {\n return this.walletAlert(`/api/v1/customers/${encodeURIComponent(id)}/wallet/alert`, threshold);\n }\n\n /** {@link setWalletAlert}, addressing the customer by its `externalId` (`id`\n * here). `PUT /api/v1/customers/ext/:externalId/wallet/alert`. */\n setWalletAlertByExternalId(id: string, threshold: number | null): Promise<WalletAlert> {\n return this.walletAlert(\n `/api/v1/customers/ext/${encodeURIComponent(id)}/wallet/alert`,\n threshold,\n );\n }\n\n private walletAlert(path: string, threshold: number | null): Promise<WalletAlert> {\n return this.transport.request<WalletAlert>({\n method: \"PUT\",\n path,\n body: { threshold },\n });\n }\n\n /**\n * The one body behind all ten adjust calls.\n *\n * Every adjustment carries an idempotency key — the caller's, or one\n * generated here ONCE per call, exactly like signals. The server\n * deduplicates on it, so a transient failure is safe to retry: the same key\n * rides every attempt, and a retry of one that already landed comes back as\n * `replayed: true` instead of adjusting again. The key is also copied onto\n * any thrown error (`error.idempotencyKey`) so the caller can replay safely.\n */\n private async adjust(\n path: string,\n input:\n | CreditAdjustInput\n | OutcomeAdjustInput\n | UnitAdjustInput\n | CompositeAdjustInput\n | WalletAdjustInput,\n ): Promise<AdjustResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<{\n remaining: number;\n replayed?: boolean;\n adjustedAt?: string;\n customerArchived?: boolean;\n }>({\n method: \"POST\",\n path,\n idempotencyKey,\n body: { ...input, idempotencyKey },\n retry: true,\n });\n\n const result: AdjustResult = {\n remaining: res.remaining,\n replayed: res.replayed === true,\n customerArchived: res.customerArchived === true,\n };\n if (result.replayed && typeof res.adjustedAt === \"string\") {\n result.adjustedAt = res.adjustedAt;\n }\n return result;\n }\n\n // --- Recurring grants ----------------------------------------------------\n\n /**\n * Change how much a customer is granted every billing cycle (wallet top-up,\n * credits, outcomes, units or a composite pool). Any increase or decrease\n * applies to their current balance immediately. `PUT …/:id/recurring-grant`.\n */\n async updateRecurringGrant(\n id: string,\n input: RecurringGrantInput,\n ): Promise<RecurringGrantResult> {\n const res = await this.transport.request<\n RecurringGrantResult & { updated: true }\n >({\n method: \"PUT\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/recurring-grant`,\n body: input,\n });\n return toRecurringGrantResult(res);\n }\n\n /** {@link updateRecurringGrant}, addressing the customer by its\n * `externalId`. `PUT /api/v1/customers/ext/:externalId/recurring-grant`. */\n async updateRecurringGrantByExternalId(\n externalId: string,\n input: RecurringGrantInput,\n ): Promise<RecurringGrantResult> {\n const res = await this.transport.request<\n RecurringGrantResult & { updated: true }\n >({\n method: \"PUT\",\n path: `/api/v1/customers/ext/${encodeURIComponent(externalId)}/recurring-grant`,\n body: input,\n });\n return toRecurringGrantResult(res);\n }\n}\n\n/** Drop the response's `updated: true` marker, keeping `balanceUsd` only when\n * the server sent it (wallet grants). */\nfunction toRecurringGrantResult(res: RecurringGrantResult): RecurringGrantResult {\n return {\n kind: res.kind,\n quantity: res.quantity,\n ...(res.balanceUsd !== undefined ? { balanceUsd: res.balanceUsd } : {}),\n };\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n InvoiceDetail,\n InvoiceListRow,\n InvoiceStatus,\n PayLink,\n} from \"../types.js\";\n\n/**\n * The `invoices` resource — read-only. Invoices are generated by the billing\n * engine from purchases; you list them, read one, or mint a hosted pay link for\n * an OPEN invoice. `/api/v1/invoices`.\n */\nexport class Invoices {\n constructor(private readonly transport: Transport) {}\n\n /** List invoices, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: InvoiceStatus; limit?: number } = {},\n ): Promise<InvoiceListRow[]> {\n const res = await this.transport.request<{ invoices: InvoiceListRow[] }>({\n method: \"GET\",\n path: \"/api/v1/invoices\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.invoices;\n }\n\n /** Fetch one full invoice + its plan snapshot. `GET /api/v1/invoices/:id`. */\n get(id: string): Promise<InvoiceDetail> {\n return this.transport.request<InvoiceDetail>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}`,\n });\n }\n\n /**\n * Mint a hosted pay link for an OPEN invoice. PAID/VOID/AUTO_CLOSED invoices are rejected\n * with a `ConflictError`. `GET /api/v1/invoices/:id/pay-link`.\n */\n payLink(id: string): Promise<PayLink> {\n return this.transport.request<PayLink>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}/pay-link`,\n });\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateOutcomeInput, Outcome, OutcomeWithSteps, UpdateOutcomeInput } from \"../types.js\";\n\n/**\n * The `outcomes` resource — multi-step deliverables billed per completed\n * outcome. `/api/v1/outcomes`.\n *\n * `list()` and every write return the outcome without its steps; `get()`\n * returns it with every step in full (ids included). Each new step is priced\n * from its own `modelBundle`, on the server.\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire an\n * outcome with `archive()`; `unarchive()` brings it back unchanged.\n */\nexport class Outcomes {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Outcome[]> {\n const res = await this.transport.request<{ outcomes: Outcome[] }>({\n method: \"GET\",\n path: \"/api/v1/outcomes\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.outcomes, params.active);\n }\n\n /** One outcome's configuration, with every step in full. */\n async get(id: string): Promise<OutcomeWithSteps> {\n const res = await this.transport.request<{ outcome: OutcomeWithSteps }>({\n method: \"GET\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n return res.outcome;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ created: true; outcome: Outcome }>({\n method: \"POST\",\n path: \"/api/v1/outcomes\",\n body: input,\n });\n return res.outcome;\n }\n\n /** PARTIAL update: only the fields you send change. Leave `steps` out to\n * leave the steps alone; send it and it is the complete list — pass each\n * existing step's `id` (or its same `agentKey`) to keep it. */\n async update(id: string, input: UpdateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ updated: true; outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.outcome;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Outcome> {\n const res = await this.transport.request<{ archived: true; outcome: Outcome }>({\n method: \"POST\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.outcome;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Outcome> {\n const res = await this.transport.request<{ unarchived: true; outcome: Outcome }>({\n method: \"POST\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.outcome;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PaymentDetail, PaymentRow } from \"../types.js\";\n\n/**\n * The `payments` resource — read-only. A payment is a PAID invoice; the `id`\n * used here is that underlying invoice id. `/api/v1/payments`.\n */\nexport class Payments {\n constructor(private readonly transport: Transport) {}\n\n /** List payments (paid invoices), most-recent first. Filter by customer. */\n async list(\n params: { customerId?: string; limit?: number } = {},\n ): Promise<PaymentRow[]> {\n const res = await this.transport.request<{ payments: PaymentRow[] }>({\n method: \"GET\",\n path: \"/api/v1/payments\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return res.payments;\n }\n\n /** Fetch one payment + its plan snapshot. `GET /api/v1/payments/:id`. */\n get(id: string): Promise<PaymentDetail> {\n return this.transport.request<PaymentDetail>({\n method: \"GET\",\n path: `/api/v1/payments/${encodeURIComponent(id)}`,\n });\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreatePlanInput, Plan, UpdatePlanInput } from \"../types.js\";\n\n/**\n * The `plans` resource — the billing plans customers subscribe to. Each plan\n * is a set of `entitlements` (wallet / credit / outcome / unit / composite /\n * flat lines) billed on a cycle. `/api/v1/plans`.\n *\n * A plan's currency is the workspace's primary currency; it can't be chosen.\n * There is no `delete()` — the API never deletes plans, so customers already\n * on one keep what they bought. Retire a plan with `archive()`; `unarchive()`\n * makes it purchasable again.\n */\nexport class Plans {\n constructor(private readonly transport: Transport) {}\n\n /** List plans, oldest-first. Pass `{ active: true }` to only return active plans.\n * `{ active: false }` returns only archived ones; omitting it returns\n * both. See `activeQuery` — the API itself only supports `true`. */\n async list(params: { active?: boolean } = {}): Promise<Plan[]> {\n const res = await this.transport.request<{ plans: Plan[] }>({\n method: \"GET\",\n path: \"/api/v1/plans\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.plans, params.active);\n }\n\n /** One plan's configuration. */\n async get(id: string): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"GET\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n return res.plan;\n }\n\n /** Create a plan. It starts active. Not retried on failure — a retry could\n * create a second plan. */\n async create(input: CreatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ created: true; plan: Plan }>({\n method: \"POST\",\n path: \"/api/v1/plans\",\n body: input,\n });\n return res.plan;\n }\n\n /** PARTIAL update: only the fields you send change. `entitlements`, when\n * sent, is the complete new list — the list `get()` returned can be sent\n * back as it is. Changes apply to new purchases only. */\n async update(id: string, input: UpdatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ updated: true; plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.plan;\n }\n\n /** Retire a plan (`isActive` → false): it can't be bought any more; customers\n * already on it are unaffected. Safe to retry. */\n async archive(id: string): Promise<Plan> {\n const res = await this.transport.request<{ archived: true; plan: Plan }>({\n method: \"POST\",\n path: `/api/v1/plans/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.plan;\n }\n\n /** Make an archived plan purchasable again (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Plan> {\n const res = await this.transport.request<{ unarchived: true; plan: Plan }>({\n method: \"POST\",\n path: `/api/v1/plans/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.plan;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PortalToken, PortalTokenInput } from \"../types.js\";\n\n/**\n * The `portal` resource — mint a short-lived embed token for one of your\n * customers, then render `<iframe src=\".../portal/embed?token=<token>\">`. The\n * HS256 signing secret never leaves ClockNext; your backend only needs its API\n * key. `POST /api/v1/portal/token`.\n */\nexport class Portal {\n constructor(private readonly transport: Transport) {}\n\n async createToken(input: PortalTokenInput): Promise<PortalToken> {\n const res = await this.transport.request<\n { token: string; expiresAt: number; expiresIn: number }\n >({\n method: \"POST\",\n path: \"/api/v1/portal/token\",\n body: {\n customerId: input.customerId,\n ttlSeconds: input.ttlSeconds,\n memberEmail: input.memberEmail,\n },\n });\n return {\n token: res.token,\n expiresAt: res.expiresAt,\n expiresIn: res.expiresIn,\n };\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreatePurchaseInput,\n Purchase,\n PurchaseDetail,\n PurchaseStatus,\n} from \"../types.js\";\n\n/**\n * The `purchases` resource — a purchase is a customer's subscription to a plan.\n * Creating one auto-cancels the customer's existing scheduled/active purchase\n * (this is also how you \"change plan\"). `/api/v1/purchases`.\n */\nexport class Purchases {\n constructor(private readonly transport: Transport) {}\n\n /** List purchases, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: PurchaseStatus; limit?: number } = {},\n ): Promise<Purchase[]> {\n const res = await this.transport.request<{ purchases: Purchase[] }>({\n method: \"GET\",\n path: \"/api/v1/purchases\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.purchases;\n }\n\n /** Subscribe a customer to a plan. `POST /api/v1/purchases`. */\n async create(input: CreatePurchaseInput): Promise<Purchase> {\n const res = await this.transport.request<{ purchase: Purchase }>({\n method: \"POST\",\n path: \"/api/v1/purchases\",\n body: input,\n });\n return res.purchase;\n }\n\n /** Fetch one purchase. `GET /api/v1/purchases/:id`. */\n async get(id: string): Promise<PurchaseDetail> {\n const res = await this.transport.request<{ purchase: PurchaseDetail }>({\n method: \"GET\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n });\n return res.purchase;\n }\n\n /**\n * Turn automatic billing on or off for a purchase. When pausing, an optional\n * `pauseReason` is recorded. `PATCH /api/v1/purchases/:id`.\n */\n async setAutoPayment(\n id: string,\n autoPayment: boolean,\n opts: { pauseReason?: string } = {},\n ): Promise<{ autoPayment: boolean }> {\n return this.transport.request<{ autoPayment: boolean }>({\n method: \"PATCH\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n body: { autoPayment, pauseReason: opts.pauseReason },\n });\n }\n\n /** Cancel a purchase (voids any open invoice). `POST /api/v1/purchases/:id/cancel`. */\n async cancel(id: string): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}/cancel`,\n });\n }\n}\n","/**\n * The customer half of a request body: `customerId` and/or `externalId`,\n * each only when set. Both are forwarded as given — the server applies the\n * precedence (`customerId` wins), so the SDK never second-guesses it.\n */\nexport function customerRefToWire(ref: {\n customerId?: string;\n externalId?: string;\n}): { customerId?: string; externalId?: string } {\n return {\n ...(ref.customerId != null ? { customerId: ref.customerId } : {}),\n ...(ref.externalId != null ? { externalId: ref.externalId } : {}),\n };\n}\n","import type { Transport } from \"../http.js\";\nimport type { Flusher } from \"../flusher.js\";\nimport { customerRefToWire } from \"../customer-ref.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n CompositeCompletionInput,\n CompositeCompletionResult,\n CreditInput,\n OutcomeCompletionInput,\n OutcomeCompletionResult,\n OutcomeInput,\n ResolvedConfig,\n SerializedUnitUsage,\n Signal,\n SignalType,\n TrackResult,\n UnitInput,\n UnitTrackResult,\n UsageLogListParams,\n UsageLogPage,\n UsageLogLookupResult,\n WalletInput,\n} from \"../types.js\";\n\n/**\n * Which route each signal type posts to.\n *\n * This map IS the migration off `POST /api/v1/usage`. The signal's `type` no\n * longer travels in the body — it picks the URL, and the server reads the\n * meter off the path. That is the server's design, not a convenience: a body\n * can neither omit the meter nor contradict it, so the whole class of \"the\n * `type` field said credit but the fields describe a unit\" bug is gone.\n *\n * `type` stays on the SDK's own `Signal` objects because it is still the\n * discriminator callers write and TypeScript narrows on. It just stops being\n * something we send.\n */\nconst SIGNAL_PATHS: Record<SignalType, string> = {\n credit: \"/api/v1/signal/credit\",\n outcome: \"/api/v1/signal/outcome\",\n wallet: \"/api/v1/signal/wallet\",\n};\n\n/** Unit reports and completion pings are not part of the `Signal` union (no\n * model, no tokens), so they carry their paths separately. */\nconst UNIT_PATH = \"/api/v1/signal/unit\";\nconst COMPOSITE_COMPLETE_PATH = \"/api/v1/signal/composite/complete\";\nconst OUTCOME_COMPLETE_PATH = \"/api/v1/signal/outcome/complete\";\nconst USAGE_LOG_PATH = \"/api/v1/signal/usage-log\";\nconst USAGE_LOG_LOOKUP_PATH = \"/api/v1/signal/usage-log/lookup\";\n\n/**\n * Builds the request body for a typed Signal.\n *\n * Two grouping changes from the pre-0.10 `POST /api/v1/usage` body, both of\n * which the server now requires:\n *\n * usage: { model, inputTokens, outputTokens, cacheTokens }\n * composite: { \"<refId>\": \"<value>\" }\n *\n * `usage` collects the four fields describing one LLM call. `composite` is the\n * more consequential one: the tag used to sit at the TOP LEVEL under its own\n * caller-defined property name, which meant a composite called `model` or\n * `status` shadowed a real ingest field. Nested, the two namespaces are\n * separate and that collision is impossible.\n *\n * The route is NOT part of this body — see {@link SIGNAL_PATHS}.\n */\nexport function signalToWire(signal: Signal): Record<string, unknown> {\n const t = signal.tokens;\n const body: Record<string, unknown> = {\n ...customerRefToWire(signal),\n // `usage` is required on all three model-priced kinds. input/output are\n // always sent; `cacheTokens` / `cacheWriteTokens` only when provided (the\n // server defaults each to 0).\n usage: {\n model: signal.model,\n inputTokens: t.input,\n outputTokens: t.output,\n ...(t.cache != null ? { cacheTokens: t.cache } : {}),\n ...(t.cacheWrite != null ? { cacheWriteTokens: t.cacheWrite } : {}),\n },\n };\n if (signal.member) body.member = signal.member;\n if (signal.custom) body.custom = signal.custom;\n\n // credit + outcome both resolve their target via the stable `agentKey`.\n // A wallet signal has none: it meters money at the model's cost rather than\n // a named entitlement.\n if (signal.type === \"credit\" || signal.type === \"outcome\") {\n body.agentKey = signal.agentKey;\n }\n\n // Outcome runs are grouped by `runId`. Ending the run is NOT a flag on this\n // body: `POST /api/v1/signal/outcome` (what this body is sent to) accepts\n // ONLY the step shape and rejects one that also carries `complete` — see\n // `signals.completeOutcome()`, its own dedicated route.\n if (signal.type === \"outcome\") {\n body.runId = signal.runId;\n }\n\n // Composite tag, nested under its `refId`. Never set for wallet — the server\n // accepts and ignores one there, but sending it would only imply a rollup\n // that will not exist.\n if (signal.type !== \"wallet\" && signal.composite) {\n body.composite = { [signal.composite.ref]: signal.composite.value };\n }\n\n // A caller-supplied idempotency key is forwarded verbatim; `track()` fills in\n // an auto-generated one when none was given.\n if (signal.idempotencyKey) body.idempotencyKey = signal.idempotencyKey;\n return body;\n}\n\n/** The fields every `/api/v1/signal/*` response may carry. */\ninterface SignalResponse {\n queued?: boolean;\n messageId?: string;\n rawId?: string;\n}\n\n/** Copy the two durability handles onto a result, each only when present. */\nfunction handles(res: SignalResponse) {\n return {\n ...(res.messageId != null ? { messageId: res.messageId } : {}),\n ...(res.rawId != null ? { rawId: res.rawId } : {}),\n };\n}\n\n/**\n * The `signals` resource: record usage signals and read them back.\n *\n * In async mode (default), `track()` buffers the signal locally and returns\n * immediately with `{ status: \"buffered\" }`. Pass `{ wait: true }` (or\n * construct the client in `sync` mode) to await the request instead.\n *\n * Awaiting the request does NOT mean waiting for a price, and deliberately so.\n * The server writes every signal to a durable inbox and hands it to a worker,\n * answering `202` — so `track()` resolves `{ status: \"accepted\", messageId,\n * rawId, usageLog: null }`: impossible to lose, not yet billed. Only when the\n * server prices inline do you get `{ status: \"recorded\", usageLog }`. Branch on\n * `status`; never assume `usageLog`.\n *\n * Nothing here ever blocks a request thread on billing. That is the point: a\n * meter that makes the caller wait for pricing has moved your billing system\n * onto your product's critical path.\n *\n * Because of that, a signal the server later REJECTS (unknown `agentKey`, a\n * model the org has not enabled, no active plan) cannot come back through this\n * promise — and does not reach `onError` either, since from here that request\n * succeeded. Such a rejection has no programmatic channel at all: it is\n * recorded on the workspace's signal log in the ClockNext dashboard, which is\n * owner-only by design.\n *\n * `list()` is the partial check available from code. It returns priced usage\n * logs with a `status`, so it confirms a signal landed and whether pricing\n * succeeded — but a signal refused BEFORE pricing never becomes a usage log\n * and does not appear there.\n */\nexport class Signals {\n constructor(\n private readonly transport: Transport,\n private readonly flusher: Flusher,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /**\n * Record one usage signal, to the route its `type` selects:\n * `POST /api/v1/signal/credit` | `/signal/outcome` | `/signal/wallet`.\n *\n * Returns as soon as the signal is buffered (async mode) or the request has\n * been answered (`{ wait: true }` / sync mode). See {@link TrackResult}: a\n * resolved promise means \"accepted\", which is not the same as \"billed\".\n */\n async track(\n signal: Signal,\n opts: { wait?: boolean } = {},\n ): Promise<TrackResult> {\n const body = signalToWire(signal);\n // Assign the idempotency key ONCE, here — before the signal is buffered or\n // sent — so the SAME key rides every retry (Transport-level replay AND a\n // re-flush of the buffered body). That is what makes a retried signal\n // dedup server-side instead of double-recording (see idempotency.ts, AD-4).\n const idempotencyKey =\n typeof body.idempotencyKey === \"string\" ? body.idempotencyKey : newKey();\n body.idempotencyKey = idempotencyKey;\n\n // The key is stamped back onto the SIGNAL, not just the body, because the\n // signal is what `onError`/`onDrop` receive. Without this, a caller writing\n // the documented dead-letter path — catch the drop, persist it, resend\n // later — would resend with a freshly generated key, and the server would\n // treat it as a second event and bill it twice. The one mechanism that\n // prevents duplicates has to be reachable from the one hook that handles\n // failures.\n const tracked: Signal = { ...signal, idempotencyKey };\n\n const path = SIGNAL_PATHS[signal.type];\n\n const sendNow = opts.wait || this.cfg.mode === \"sync\";\n if (!sendNow) {\n // The path is buffered WITH the body. The flusher used to hardcode one\n // endpoint for everything; now that each meter has its own, a buffered\n // signal has to remember where it was going or async mode would quietly\n // keep posting to a route sync mode has already left behind.\n // A closed client or a full queue discards the signal. Saying\n // \"buffered\" there would hand back a success-shaped result for a\n // billable event that no longer exists.\n const buffered = this.flusher.enqueue({ path, body, signal: tracked });\n return buffered\n ? { status: \"buffered\", queued: true }\n : { status: \"dropped\", queued: false };\n }\n\n const res = await this.transport.request<\n SignalResponse & { usageLog?: TrackResult[\"usageLog\"] }\n >({\n method: \"POST\",\n path,\n body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n idempotencyKey,\n });\n // The server answers one of two ways for a real record, and we must not\n // flatten them: `202 { queued: true, messageId, rawId }` when it hands the\n // signal to its durable queue (priced later by a worker — no log yet), or\n // `200 { usageLog, rawId }` when it prices inline. Either way `rawId` is\n // the handle on a written, unlosable row.\n const queued = res.queued === true;\n return {\n status: queued ? \"accepted\" : \"recorded\",\n queued,\n usageLog: res.usageLog ?? null,\n ...handles(res),\n };\n }\n\n /** Meter a named credit. `POST /api/v1/signal/credit`. */\n credit(input: CreditInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"credit\" }, opts);\n }\n\n /** Debit the customer's wallet at model cost. `POST /api/v1/signal/wallet`. */\n wallet(input: WalletInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"wallet\" }, opts);\n }\n\n /** Advance one step of an outcome workflow. `POST /api/v1/signal/outcome`. */\n outcome(\n input: OutcomeInput,\n opts?: { wait?: boolean },\n ): Promise<TrackResult> {\n return this.track({ ...input, type: \"outcome\" }, opts);\n }\n\n /**\n * Close ONE outcome run — declares the workflow finished and bills it. The\n * outcome mirror of {@link Signals.completeComposite}, on its own dedicated\n * route: `POST /api/v1/signal/outcome/complete`.\n *\n * An outcome bills per COMPLETION, never per step, and `signals.outcome()`\n * never closes one — it accepts only the step shape. Declaring the workflow\n * finished is always this separate, explicit, contentless call.\n *\n * This closes the RUN only. If a step of this run also carried a\n * `composite`, that occurrence stays open and unbilled until you separately\n * call {@link Signals.completeComposite} — the two completions are\n * independent, and neither implies the other.\n *\n * Sent immediately, never buffered. A genuinely second, independent call for\n * an already-closed run is a PERMANENT error (it would bill the run twice),\n * not a safe no-op — see {@link OutcomeCompletionResult}.\n */\n async completeOutcome(\n input: OutcomeCompletionInput,\n ): Promise<OutcomeCompletionResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<\n SignalResponse & {\n status?: \"COMPLETED\" | \"ALREADY_COMPLETED\";\n usageLog?: OutcomeCompletionResult[\"usageLog\"];\n }\n >({\n method: \"POST\",\n path: OUTCOME_COMPLETE_PATH,\n idempotencyKey,\n body: {\n ...customerRefToWire(input),\n runId: input.runId,\n ...(input.member ? { member: input.member } : {}),\n ...(input.custom ? { custom: input.custom } : {}),\n idempotencyKey,\n },\n retry: true,\n });\n const queued = res.queued === true;\n return {\n delivery: queued ? \"accepted\" : \"recorded\",\n queued,\n ...(res.status != null ? { status: res.status } : {}),\n usageLog: res.usageLog ?? null,\n ...handles(res),\n };\n }\n\n /**\n * Record one unit-metered event (a fixed-price meter with no tokens),\n * addressed to a catalog unit by its `agentKey`. Sent immediately — unit\n * events are not buffered. `POST /api/v1/signal/unit`.\n *\n * Two things changed with the move off `POST /api/v1/units`, and both show up\n * in the return type. The route is now durable (the report lands in an inbox\n * before it is priced, so a failure parks as Pending and can be retried\n * instead of losing a billable event) and it answers `202` when it queues —\n * so this resolves {@link UnitTrackResult}, not a bare `{ unitUsage }`.\n * Branch on `queued`.\n */\n async unit(input: UnitInput): Promise<UnitTrackResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<\n SignalResponse & { unitUsage?: SerializedUnitUsage }\n >({\n method: \"POST\",\n path: UNIT_PATH,\n idempotencyKey,\n body: {\n ...customerRefToWire(input),\n agentKey: input.agentKey,\n ...(input.quantity != null ? { quantity: input.quantity } : {}),\n ...(input.member ? { member: input.member } : {}),\n ...(input.composite\n ? { composite: { [input.composite.ref]: input.composite.value } }\n : {}),\n ...(input.custom ? { custom: input.custom } : {}),\n // Assigned HERE, before the send, so the SAME key rides every\n // transport-level retry below. Without it a single 500 followed by a\n // success is TWO un-keyed reports, and the server dedups on the key —\n // so it bills the allowance down twice, up to `retry.maxAttempts`\n // times. The route gained idempotency precisely to stop that; not\n // using it by default would leave the double-charge reachable from the\n // client instead of the server.\n idempotencyKey,\n },\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n const queued = res.queued === true;\n return {\n status: queued ? \"accepted\" : \"recorded\",\n queued,\n unitUsage: res.unitUsage ?? null,\n ...handles(res),\n };\n }\n\n /**\n * Close ONE occurrence of a composite — a distinct tag value.\n * `POST /api/v1/signal/composite/complete`.\n *\n * A composite bundles several credits / outcomes / units and is billed as one\n * thing. The occurrence opens on the first tagged signal and costs nothing;\n * this call is the moment it is billed. Only your code knows when the\n * workflow ended, so this is a DECLARATION, not a hint: tagged signals may\n * arrive in any order and the occurrence stays open and unbilled until you\n * say otherwise. Put it on the line before your own `return`.\n *\n * EVERY composite needs this, outcome-backed ones included. `completeOutcome()`\n * closes its RUN and nothing else — it does not close the composite\n * occurrence the run was tagged into, whatever mix of credits, outcomes and\n * units that composite wraps. (Earlier versions of this SDK documented the\n * opposite. Believing it means the occurrence stays ONGOING forever and is\n * never billed, so if you tag outcome signals with a `composite`, you must\n * still call this.)\n *\n * Closing twice is safe: the second call answers `ALREADY_COMPLETED` and\n * cannot bill again. Calling it EARLY is also safe — before every entitlement\n * the composite is restricted to has reported, or while an ADVANCE pool is\n * full — the server parks the ping and applies it when the blocker clears,\n * rather than failing it.\n */\n async completeComposite(\n input: CompositeCompletionInput,\n ): Promise<CompositeCompletionResult> {\n const idempotencyKey = input.idempotencyKey ?? newKey();\n const res = await this.transport.request<\n SignalResponse & {\n status?: \"COMPLETED\" | \"ALREADY_COMPLETED\";\n composite?: CompositeCompletionResult[\"composite\"];\n value?: string | null;\n }\n >({\n method: \"POST\",\n path: COMPOSITE_COMPLETE_PATH,\n idempotencyKey,\n body: {\n ...customerRefToWire(input),\n composite: { [input.composite.ref]: input.composite.value },\n ...(input.custom ? { custom: input.custom } : {}),\n // Auto-assigned like the others. A retry here could not double-BILL\n // even without it — closing a closed occurrence is a server-side\n // no-op — but that safety comes from occurrence-level dedup, not from\n // idempotency, and an un-keyed replay still writes a redundant inbox\n // row. Keying it collapses the retry into the one attempt it is.\n idempotencyKey,\n },\n retry: true,\n });\n const queued = res.queued === true;\n return {\n delivery: queued ? \"accepted\" : \"recorded\",\n queued,\n ...(res.status != null ? { status: res.status } : {}),\n ...(res.composite !== undefined ? { composite: res.composite } : {}),\n ...(res.value !== undefined ? { value: res.value } : {}),\n ...handles(res),\n };\n }\n\n /**\n * One customer's usage history, merged from every meter kind — credit,\n * outcome, unit, wallet, and completed composite occurrences — into one\n * feed sorted by time. `GET /api/v1/signal/usage-log`. Exactly the same\n * rows the customer portal's own \"Usage logs\" table shows, so a caller can\n * build against this instead of the portal UI.\n *\n * Cursor-paginated, NOT page-numbered: `limit` + `cursor` in, `nextCursor`\n * out. Omit `cursor` for the first page; pass the previous page's\n * `nextCursor` back to fetch the next one, and stop once it comes back\n * `null`. Unlike offset pagination, the cost of a page never grows with how\n * deep you've paged — each page only asks for rows strictly before the\n * cursor's position.\n *\n * Read-only; unlike {@link track}/{@link unit}/etc., there is nothing to\n * buffer or retry here.\n */\n usageLog(params: UsageLogListParams): Promise<UsageLogPage> {\n return this.transport.request<UsageLogPage>({\n method: \"GET\",\n path: USAGE_LOG_PATH,\n query: {\n customerId: params.customerId,\n limit: params.limit,\n cursor: params.cursor,\n from: params.from,\n to: params.to,\n },\n });\n }\n\n /**\n * Fetches up to 10 usage-log rows by id, in one call.\n * `GET /api/v1/signal/usage-log/lookup`.\n *\n * Built for linking a wallet debit to its usage: pass the `usageLogId`s\n * from `customers.wallet()` instead of paging through\n * {@link usageLog}. Scoped to your org, not to one customer — every row\n * carries its own `customerId`.\n *\n * Rows come back in the order of `ids`; duplicates are removed. Ids that\n * match nothing in your org are listed in `notFound`. More than 10\n * distinct ids is a 400.\n */\n lookupUsageLogs(ids: string[]): Promise<UsageLogLookupResult> {\n return this.transport.request<UsageLogLookupResult>({\n method: \"GET\",\n path: USAGE_LOG_LOOKUP_PATH,\n query: { ids: ids.join(\",\") },\n });\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateUnitInput, Unit, UpdateUnitInput } from \"../types.js\";\n\n/**\n * The `units` resource — fixed-price, non-LLM events (uploads, seats, API\n * calls), priced FLAT, SLAB or VOLUME. `/api/v1/units`.\n *\n * There is no `delete()` — the API never deletes catalogue items. Retire a\n * unit with `archive()`; `unarchive()` brings it back unchanged.\n */\nexport class Units {\n constructor(private readonly transport: Transport) {}\n\n /** List them. `{ active: true }` returns only active ones, `{ active: false }`\n * only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Unit[]> {\n const res = await this.transport.request<{ units: Unit[] }>({\n method: \"GET\",\n path: \"/api/v1/units\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.units, params.active);\n }\n\n /** One unit's configuration. */\n async get(id: string): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"GET\",\n path: `/api/v1/units/${encodeURIComponent(id)}`,\n });\n return res.unit;\n }\n\n /** Create one. It starts active. Not retried on failure — a retry could\n * create a second row. */\n async create(input: CreateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ created: true; unit: Unit }>({\n method: \"POST\",\n path: \"/api/v1/units\",\n body: input,\n });\n return res.unit;\n }\n\n /** PARTIAL update: only the fields you send change. `tiers`, when sent, is\n * the complete new tier list. */\n async update(id: string, input: UpdateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ updated: true; unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.unit;\n }\n\n /** Retire it (`isActive` → false). Nothing is deleted. Safe to retry. */\n async archive(id: string): Promise<Unit> {\n const res = await this.transport.request<{ archived: true; unit: Unit }>({\n method: \"POST\",\n path: `/api/v1/units/${encodeURIComponent(id)}/archive`,\n retry: true,\n });\n return res.unit;\n }\n\n /** Bring an archived one back (`isActive` → true). Safe to retry. */\n async unarchive(id: string): Promise<Unit> {\n const res = await this.transport.request<{ unarchived: true; unit: Unit }>({\n method: \"POST\",\n path: `/api/v1/units/${encodeURIComponent(id)}/unarchive`,\n retry: true,\n });\n return res.unit;\n }\n}\n","import { activeQuery, filterByActive } from \"../filters.js\";\nimport type { Transport } from \"../http.js\";\nimport type { CreateTaxInput, Tax, UpdateTaxInput } from \"../types.js\";\n\n/**\n * The `taxes` resource — the tax rates charged to customers by billing\n * country (the same rates as Settings → Taxes). `/api/v1/taxes`.\n *\n * Every active tax for a customer's country is applied to their invoices and\n * portal purchases automatically. There is no `delete()`, `archive()` or\n * `unarchive()` — archiving and restoring a tax is done in the dashboard.\n */\nexport class Taxes {\n constructor(private readonly transport: Transport) {}\n\n /** List them, oldest first. `{ active: true }` returns only active ones,\n * `{ active: false }` only archived ones; omit it for both. */\n async list(params: { active?: boolean } = {}): Promise<Tax[]> {\n const res = await this.transport.request<{ taxes: Tax[] }>({\n method: \"GET\",\n path: \"/api/v1/taxes\",\n query: { active: activeQuery(params.active) },\n });\n return filterByActive(res.taxes, params.active);\n }\n\n /** One tax. */\n async get(id: string): Promise<Tax> {\n const res = await this.transport.request<{ tax: Tax }>({\n method: \"GET\",\n path: `/api/v1/taxes/${encodeURIComponent(id)}`,\n });\n return res.tax;\n }\n\n /** Create one. It starts active. Two active taxes can't share a name\n * (ignoring case) in the same country — that's a `ConflictError`. Not\n * retried on failure — a retry could create a second row. */\n async create(input: CreateTaxInput): Promise<Tax> {\n const res = await this.transport.request<{ created: true; tax: Tax }>({\n method: \"POST\",\n path: \"/api/v1/taxes\",\n body: input,\n });\n return res.tax;\n }\n\n /** PARTIAL update: only the fields you send change. Archived taxes can be\n * edited and stay archived. Only invoices issued afterwards use the new\n * values. */\n async update(id: string, input: UpdateTaxInput): Promise<Tax> {\n const res = await this.transport.request<{ updated: true; tax: Tax }>({\n method: \"PATCH\",\n path: `/api/v1/taxes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.tax;\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookSignatureError } from \"./errors.js\";\n\n/**\n * Receiving ClockNext webhooks.\n *\n * ClockNext POSTs a signed JSON event to each endpoint you register in the\n * dashboard (Settings → Webhooks). Two events exist today:\n *\n * wallet.balance.update a customer's MAIN wallet balance moved (credit or\n * debit). Invoice settlements and the Reserved\n * Wallet do not fire it.\n * wallet.balance.drop a debit took the balance from above a level to at\n * or below it. The level is the customer's own alert\n * level (`customers.setWalletAlert`) when they have\n * one, otherwise the endpoint's threshold. Fires once\n * per drop through the level, not on every debit while\n * the balance stays under it.\n *\n * Verify every request before trusting it — {@link constructWebhookEvent} does\n * that and returns the typed event. It needs the RAW request body: parsing the\n * JSON and re-serialising it changes the bytes and the signature will not match.\n *\n * Delivery is at-least-once: a non-2xx answer (or a timeout past 5s) is retried\n * with the SAME event `id`, so de-duplicate on `id`.\n */\n\n/** Events ClockNext sends today. New event types may be added later — ignore\n * any `event_type` you do not recognise (and still answer 2xx). */\nexport type WebhookEventType = \"wallet.balance.update\" | \"wallet.balance.drop\";\n\n/**\n * The `source` a `wallet.balance.update` event carries: the STORED ledger\n * source, which is coarser than `WalletTransactionSource` on the ledger API.\n * Do not compare the two — the ledger API reports `SUBSCRIPTION`, `RENEWAL`,\n * `API`, … where the webhook says `TOPUP` or `ADJUSTMENT`.\n *\n * The ledger also has a `SETTLE` source (an invoice being paid off), but\n * `wallet.balance.update` is never sent for it, so it is not in this type.\n */\nexport type WebhookWalletSource = \"TOPUP\" | \"USAGE\" | \"ADJUSTMENT\";\n\n/** The customer a wallet event is about. */\nexport interface WebhookCustomer {\n id: string;\n name: string;\n}\n\n/** Fields on every event. Field names are snake_case, exactly as sent. */\ninterface WebhookEventBase<T extends WebhookEventType, D> {\n /** `evt_…`. Identical across retries of one delivery — de-duplicate on it. */\n id: string;\n event_type: T;\n /** ISO-8601 time the event was created. */\n triggered_at: string;\n data: D;\n}\n\n/** `data` of `wallet.balance.update`. Balances are USD. */\nexport interface WalletBalanceUpdateData {\n customer: WebhookCustomer;\n source: WebhookWalletSource;\n previous_balance: number;\n current_balance: number;\n currency_code: \"usd\";\n}\n\n/** `data` of `wallet.balance.drop`. Balances and `threshold` are USD. */\nexport interface WalletBalanceDropData {\n customer: WebhookCustomer;\n /** The level that was crossed: the customer's own alert level, else the\n * endpoint's threshold. */\n threshold: number;\n previous_balance: number;\n current_balance: number;\n currency_code: \"usd\";\n}\n\nexport type WalletBalanceUpdateEvent = WebhookEventBase<\n \"wallet.balance.update\",\n WalletBalanceUpdateData\n>;\nexport type WalletBalanceDropEvent = WebhookEventBase<\n \"wallet.balance.drop\",\n WalletBalanceDropData\n>;\n\n/** Any event ClockNext sends. Narrow on `event_type`. */\nexport type WebhookEvent = WalletBalanceUpdateEvent | WalletBalanceDropEvent;\n\nexport interface ConstructEventOptions {\n /** Reject an event whose signed timestamp is further than this from now, in\n * either direction (replay protection). Default 300 (5 minutes). Pass 0 to\n * skip the check — only do that in tests. */\n toleranceSeconds?: number;\n /** Override \"now\" (unix seconds). For tests. */\n now?: number;\n}\n\n/** Header ClockNext puts the signature in. Node lower-cases header names. */\nexport const WEBHOOK_SIGNATURE_HEADER = \"x-clocknext-signature\";\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\n/**\n * Signs a body the way ClockNext does: `t=<unix_seconds>,v1=<hex hmac>`, the\n * HMAC-SHA256 of `${timestamp}.${rawBody}` under the endpoint secret. Exported\n * so you can sign a fixture in your own receiver's tests.\n */\nexport function signWebhookPayload(\n secret: string,\n rawBody: string | Buffer,\n timestamp: number,\n): string {\n const hmac = createHmac(\"sha256\", secret)\n .update(`${timestamp}.`)\n .update(rawBody)\n .digest(\"hex\");\n return `t=${timestamp},v1=${hmac}`;\n}\n\nfunction parseHeader(header: string): { t: number; v1: string[] } {\n let t: number | undefined;\n const v1: string[] = [];\n for (const part of header.split(\",\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) continue;\n const k = part.slice(0, eq).trim();\n const v = part.slice(eq + 1).trim();\n if (k === \"t\") {\n if (/^\\d+$/.test(v)) t = Number(v);\n } else if (k === \"v1\") {\n v1.push(v);\n }\n }\n if (t === undefined || v1.length === 0) {\n throw new WebhookSignatureError(\n \"Malformed x-clocknext-signature header: expected `t=<unix_seconds>,v1=<hex>`.\",\n );\n }\n return { t, v1 };\n}\n\nfunction safeEqualHex(expectedHex: string, givenHex: string): boolean {\n const expected = Buffer.from(expectedHex, \"hex\");\n const given = Buffer.from(givenHex, \"hex\");\n // timingSafeEqual throws on a length mismatch, so compare lengths first.\n // A non-hex or wrong-length value can never be a valid HMAC-SHA256.\n return given.length === expected.length && timingSafeEqual(expected, given);\n}\n\n/**\n * Verifies a ClockNext webhook request and returns the typed event.\n *\n * ```ts\n * app.post(\"/clocknext\", express.raw({ type: \"application/json\" }), (req, res) => {\n * let event;\n * try {\n * event = constructWebhookEvent(\n * req.body, // the raw Buffer, NOT parsed JSON\n * req.header(\"x-clocknext-signature\"),\n * process.env.CLOCKNEXT_WEBHOOK_SECRET!,\n * );\n * } catch {\n * return res.sendStatus(400);\n * }\n * if (event.event_type === \"wallet.balance.drop\") { … }\n * res.sendStatus(200);\n * });\n * ```\n *\n * @throws {WebhookSignatureError} header missing or malformed, signature does\n * not match, timestamp outside the tolerance, or the body is not a JSON event.\n */\nexport function constructWebhookEvent(\n rawBody: string | Buffer,\n signatureHeader: string | null | undefined,\n secret: string,\n options: ConstructEventOptions = {},\n): WebhookEvent {\n if (typeof rawBody !== \"string\" && !Buffer.isBuffer(rawBody)) {\n throw new WebhookSignatureError(\n \"Webhook body must be the raw request body (string or Buffer), not parsed JSON. \" +\n \"With Express use express.raw({ type: 'application/json' }).\",\n );\n }\n if (!secret) {\n throw new WebhookSignatureError(\"A webhook secret is required.\");\n }\n if (!signatureHeader) {\n throw new WebhookSignatureError(\"Missing x-clocknext-signature header.\");\n }\n\n const { t, v1 } = parseHeader(signatureHeader);\n\n // Recompute from the same `${t}.${body}` and accept any listed `v1`, so a\n // future signing-key rotation that sends two signatures keeps working.\n const expected = signWebhookPayload(secret, rawBody, t).split(\"v1=\")[1]!;\n if (!v1.some((candidate) => safeEqualHex(expected, candidate))) {\n throw new WebhookSignatureError(\n \"Webhook signature does not match. Check the secret and that the body is the unmodified raw body.\",\n );\n }\n\n const tolerance = options.toleranceSeconds ?? DEFAULT_TOLERANCE_SECONDS;\n if (tolerance > 0) {\n const now = options.now ?? Math.floor(Date.now() / 1000);\n if (Math.abs(now - t) > tolerance) {\n throw new WebhookSignatureError(\n `Webhook timestamp is outside the ${tolerance}s tolerance — possible replay.`,\n );\n }\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawBody.toString());\n } catch {\n throw new WebhookSignatureError(\"Webhook body is not valid JSON.\");\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as { id?: unknown }).id !== \"string\" ||\n typeof (parsed as { event_type?: unknown }).event_type !== \"string\"\n ) {\n throw new WebhookSignatureError(\"Webhook body is not a ClockNext event.\");\n }\n return parsed as WebhookEvent;\n}\n\n/** `cnk.webhooks` — the same verifier as {@link constructWebhookEvent}, for\n * callers who already hold a client. Needs no network and no API key use. */\nexport class Webhooks {\n /** See {@link constructWebhookEvent}. */\n constructEvent(\n rawBody: string | Buffer,\n signatureHeader: string | null | undefined,\n secret: string,\n options?: ConstructEventOptions,\n ): WebhookEvent {\n return constructWebhookEvent(rawBody, signatureHeader, secret, options);\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport { Flusher } from \"./flusher.js\";\nimport { Transport } from \"./http.js\";\nimport { Composites } from \"./resources/composites.js\";\nimport { Credits } from \"./resources/credits.js\";\nimport { Customers } from \"./resources/customers.js\";\nimport { Invoices } from \"./resources/invoices.js\";\nimport { Outcomes } from \"./resources/outcomes.js\";\nimport { Payments } from \"./resources/payments.js\";\nimport { Plans } from \"./resources/plans.js\";\nimport { Portal } from \"./resources/portal.js\";\nimport { Purchases } from \"./resources/purchases.js\";\nimport { Signals } from \"./resources/signals.js\";\nimport { Units } from \"./resources/units.js\";\nimport { Taxes } from \"./resources/taxes.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.js\";\nimport { Webhooks } from \"./webhooks.js\";\n\n/**\n * The ClockNext client.\n *\n * ```ts\n * const cnk = new ClockNext({ apiKey: process.env.CLOCKNEXT_API_KEY! });\n *\n * await cnk.signals.credit({\n * customerId: \"cus_123\",\n * model: \"gpt-4o\", // catalog model id\n * agentKey: \"api_credit\", // the credit's stable agent key\n * tokens: { input: 1200, output: 340 },\n * });\n *\n * // before a serverless function returns / on shutdown:\n * await cnk.flush();\n * ```\n */\nexport class ClockNext {\n /** Record usage signals (credit / wallet / outcome / unit) and read the usage log. */\n readonly signals: Signals;\n /** Manage customers, their members, and balances. */\n readonly customers: Customers;\n /** Billing plans: list, get, create, update, archive, unarchive. */\n readonly plans: Plans;\n /** Credits: list, get, create, update, archive, unarchive (no delete). */\n readonly credits: Credits;\n /** Outcomes: list, get, create, update, archive, unarchive (no delete). */\n readonly outcomes: Outcomes;\n /** Units: list, get, create, update, archive, unarchive (no delete). */\n readonly units: Units;\n /** Composites: list, get, create, update, archive, unarchive (no delete). */\n readonly composites: Composites;\n /** Tax rates by country: list, get, create, update (archive in the dashboard). */\n readonly taxes: Taxes;\n /** Subscribe customers to plans (purchases). */\n readonly purchases: Purchases;\n /** Read invoices and mint hosted pay links. */\n readonly invoices: Invoices;\n /** Read payments (paid invoices). */\n readonly payments: Payments;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n\n /** Verify incoming ClockNext webhooks (`wallet.balance.update` / `.drop`). */\n readonly webhooks: Webhooks;\n\n private readonly cfg: ResolvedConfig;\n private readonly flusher: Flusher;\n\n constructor(config: ClockNextConfig) {\n this.cfg = resolveConfig(config);\n\n if (typeof window !== \"undefined\") {\n this.cfg.logger.warn?.(\n \"[clocknext] Running in a browser exposes your secret API key. Use this SDK only on a server/backend.\",\n );\n }\n\n const transport = new Transport(this.cfg);\n this.flusher = new Flusher(transport, this.cfg);\n this.signals = new Signals(transport, this.flusher, this.cfg);\n this.customers = new Customers(transport);\n this.plans = new Plans(transport);\n this.credits = new Credits(transport);\n this.outcomes = new Outcomes(transport);\n this.units = new Units(transport);\n this.composites = new Composites(transport);\n this.taxes = new Taxes(transport);\n this.purchases = new Purchases(transport);\n this.invoices = new Invoices(transport);\n this.payments = new Payments(transport);\n this.portal = new Portal(transport);\n this.webhooks = new Webhooks();\n }\n\n /** Number of signals currently buffered (async mode). */\n get pending(): number {\n return this.flusher.size;\n }\n\n /** Force-send all buffered signals now. Await before a serverless return. */\n flush(): Promise<void> {\n return this.flusher.flush();\n }\n\n /** Flush and stop the background timer. Call on graceful shutdown. */\n close(): Promise<void> {\n return this.flusher.close();\n }\n}\n"]}
|