@clocknext/sdk 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/index.cjs +1 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -15
- package/dist/index.d.ts +4 -15
- package/dist/index.js +1 -23
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -163,9 +163,9 @@ const cnk = new ClockNext({ apiKey, mode: "sync" });
|
|
|
163
163
|
> the server prices inline do you get `{ queued: false, usageLog }`. Branch on
|
|
164
164
|
> `queued`; never assume `usageLog` is populated.
|
|
165
165
|
>
|
|
166
|
-
> To
|
|
167
|
-
>
|
|
168
|
-
>
|
|
166
|
+
> To confirm a signal landed, read it back with `signals.list({ customerId })`.
|
|
167
|
+
> There is no way to price a signal without recording it — send one against a
|
|
168
|
+
> **sandbox** organisation instead.
|
|
169
169
|
|
|
170
170
|
> In `async` mode, server-side rejections (e.g. insufficient allowance, `422`)
|
|
171
171
|
> surface via the `onError` hook or `flush()`, not from the `track()` call.
|
package/dist/index.cjs
CHANGED
|
@@ -230,7 +230,7 @@ function sleep(ms) {
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
// src/http.ts
|
|
233
|
-
var SDK_VERSION = "0.
|
|
233
|
+
var SDK_VERSION = "0.11.0" ;
|
|
234
234
|
var Transport = class {
|
|
235
235
|
constructor(cfg) {
|
|
236
236
|
this.cfg = cfg;
|
|
@@ -967,28 +967,6 @@ var Signals = class {
|
|
|
967
967
|
...handles(res)
|
|
968
968
|
};
|
|
969
969
|
}
|
|
970
|
-
/**
|
|
971
|
-
* Validate + price a signal WITHOUT recording it (server `dryRun`). Returns
|
|
972
|
-
* the projected usage log so an integration can preflight before sending real
|
|
973
|
-
* traffic — no inbox row, wallet / outcome writes, or webhooks fire.
|
|
974
|
-
*
|
|
975
|
-
* Only the model-priced kinds support this. A dry run is not offered for unit
|
|
976
|
-
* reports or composite completions, and the server REJECTS the flag on those
|
|
977
|
-
* routes rather than accepting and ignoring it — which is why there is no
|
|
978
|
-
* dry-run path through `unit()` or `completeComposite()`.
|
|
979
|
-
*/
|
|
980
|
-
async verify(signal) {
|
|
981
|
-
const body = signalToWire(signal);
|
|
982
|
-
body.dryRun = true;
|
|
983
|
-
const res = await this.transport.request({
|
|
984
|
-
method: "POST",
|
|
985
|
-
path: SIGNAL_PATHS[signal.type],
|
|
986
|
-
body,
|
|
987
|
-
// A dry run writes nothing, so it is always safe to retry.
|
|
988
|
-
retry: true
|
|
989
|
-
});
|
|
990
|
-
return res.usageLog ?? null;
|
|
991
|
-
}
|
|
992
970
|
/** Meter a named credit. `POST /api/v1/signal/credit`. */
|
|
993
971
|
credit(input, opts) {
|
|
994
972
|
return this.track({ ...input, type: "credit" }, opts);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/queue.ts","../src/flusher.ts","../src/errors.ts","../src/retry.ts","../src/http.ts","../src/resources/composites.ts","../src/resources/credits.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/idempotency.ts","../src/resources/signals.ts","../src/resources/units.ts","../src/resources/webhooks.ts","../src/resources/workspace.ts","../src/client.ts"],"names":["message"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ClockNextConfig, FetchLike, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://payments.clocknext.com\";\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 throw new Error(\"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 Error(\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 onError: config.onError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop,\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 /** Buffer one signal. Drops (with onDrop) when closed or the queue is full. */\n enqueue(item: QueuedSignal): void {\n if (this.closed) {\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return;\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;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\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 /**\n * Send everything currently buffered. Overlapping calls share the single\n * in-progress drain, so total in-flight sends never exceed `maxConcurrency`.\n */\n flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (!this.draining) {\n this.draining = this.drain().finally(() => {\n this.draining = null;\n });\n }\n return this.draining;\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 });\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 }\n}\n","/**\n * Typed error hierarchy. The server returns `{ ok: false, error }` with a\n * meaningful HTTP status; we map that status to a class so callers can branch\n * on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒ ignore,\n * it's queued) rather than string-matching messages.\n */\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 constructor(\n message: string,\n opts: { status?: number; retryable?: boolean } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.retryable = opts.retryable ?? false;\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/** 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 — insufficient credits / units / outcomes for the call. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict. */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(message: string, opts: { retryAfterMs?: number } = {}) {\n super(message, { status: 429, retryable: true });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string) {\n super(message, { retryable: true });\n }\n}\n\n/**\n * Maps a server response (status + parsed `error` message) to a typed error.\n * 422 is split into AllowanceError vs PlanError by sniffing the message, since\n * the server uses the same status for both.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n retryAfterMs?: number,\n): ClockNextError {\n const msg = message || `Request failed with status ${status}.`;\n const opts = { status };\n\n if (status === 400) return new ValidationError(msg, opts);\n if (status === 401) return new AuthError(msg, opts);\n if (status === 404) return new NotFoundError(msg, 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(msg, { ...opts, retryable: true });\n if (status === 409) return new ConflictError(msg, { ...opts, retryable: true });\n if (status === 422) {\n return /insufficient/i.test(msg)\n ? new AllowanceError(msg, opts)\n : new PlanError(msg, opts);\n }\n if (status === 429) return new RateLimitError(msg, { retryAfterMs });\n if (status >= 500) return new ServerError(msg, { ...opts, retryable: true });\n return new ClockNextError(msg, opts);\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\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);\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 // Two envelope shapes coexist during the v1 migration:\n // new: { statusCode, statusDetail: { status, message }, result }\n // old: { ok: boolean, error?, ...payload }\n const obj = (json ?? {}) as Record<string, unknown>;\n const isNew = typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isNew) {\n const detail = obj.statusDetail as\n | { status?: string; message?: 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 }\n\n // Old envelope.\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(res.status, message, parseRetryAfter(res.headers));\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","import type { Transport } from \"../http.js\";\nimport type { Composite, CreateCompositeInput } from \"../types.js\";\n\n/**\n * The `composites` resource — manage the org's composite *catalogue*: the\n * bundles of credits / outcomes / units that are grouped under one tag and\n * sold on a plan as a single thing. `/api/v1/composites`.\n *\n * Two things live elsewhere, deliberately:\n * • Tagging a signal into a composite occurrence is `composite: { ref, value }`\n * on the signal itself (see `signals.credit()` / `.outcome()` / `.unit()`).\n * • Closing an occurrence — the moment it is billed — is\n * `signals.completeComposite()`.\n *\n * This resource only defines what composites EXIST. Creating one prices it but\n * charges nobody: an invoice is built from plan components, never from a\n * catalogue entry, so a composite starts costing money only once a plan sells\n * it (`quantity × price`, frozen into the purchase at buy time).\n */\nexport class Composites {\n constructor(private readonly transport: Transport) {}\n\n /** List composites. Pass `{ active: true }` for only the ones a signal can\n * still be tagged with — the default list INCLUDES archived ones, which\n * keep every row they already own. */\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: {\n active: params.active === undefined ? undefined : String(params.active),\n },\n });\n return res.composites;\n }\n\n /** Create a composite. `POST /api/v1/composites`. */\n async create(input: CreateCompositeInput): Promise<Composite> {\n const res = await this.transport.request<{ composite: Composite }>({\n method: \"POST\",\n path: \"/api/v1/composites\",\n body: input,\n });\n return res.composite;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateCreditInput,\n Credit,\n CreditDetail,\n UpdateCreditInput,\n} from \"../types.js\";\n\n/**\n * The `credits` resource — manage the org's credit *types* (the catalog). A\n * credit's stable `agentKey` is what you pass to `signals.credit()` when\n * recording usage against it. `/api/v1/credits`.\n */\nexport class Credits {\n constructor(private readonly transport: Transport) {}\n\n /** List credit types. Pass `{ active: true }` to only return active ones. */\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: params.active === undefined ? undefined : String(params.active) },\n });\n return res.credits;\n }\n\n /** Create a credit type; returns the created credit. `POST /api/v1/credits`. */\n async create(input: CreateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"POST\",\n path: \"/api/v1/credits\",\n body: input,\n });\n return res.credit;\n }\n\n /** Fetch one credit type with usage stats. `GET /api/v1/credits/:id`. */\n async get(id: string): Promise<CreditDetail> {\n const res = await this.transport.request<{ credit: CreditDetail }>({\n method: \"GET\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n return res.credit;\n }\n\n /** Update a credit type's definition; returns the updated credit. `PATCH /api/v1/credits/:id`. */\n async update(id: string, input: UpdateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.credit;\n }\n\n /** Activate or deactivate a credit type. */\n async setActive(id: string, isActive: boolean): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.credit;\n }\n\n /** Delete a credit type. Refused while a customer is linked to it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n AddMemberInput,\n ApiCustomer,\n CreateCustomerInput,\n CreditAdjustInput,\n CreditBalance,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n Member,\n MemberProfile,\n OutcomeAdjustInput,\n OutcomeBalance,\n RemovedMember,\n UnitAdjustInput,\n UnitBalance,\n UpdateMemberInput,\n UsageList,\n WalletEntryInput,\n WalletList,\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 (usage / 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 & { ok: true }>({\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 /** 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 /** A customer's usage history. `GET /api/v1/usage?customerId=`. */\n async usage(id: string, params: { limit?: number } = {}): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: `/api/v1/usage`,\n query: { customerId: id, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\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 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 // --- 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 // --- Wallet & billing config --------------------------------------------\n\n /** The customer's wallet balance + transactions. `GET …/:id/wallet`. */\n wallet(id: string, params: { limit?: number } = {}): Promise<WalletList> {\n return this.transport.request<WalletList>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n query: { limit: params.limit },\n });\n }\n\n /**\n * Record a manual wallet entry (top-up or deduction). `amount` is always\n * positive; the sign comes from `type`. `POST …/:id/wallet`.\n */\n async addWalletEntry(\n id: string,\n input: WalletEntryInput,\n ): Promise<{ transaction: WalletTransaction; balanceUsd: number }> {\n return this.transport.request<{\n transaction: WalletTransaction;\n balanceUsd: number;\n }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n body: input,\n });\n }\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. `POST …/:id/credits/adjust`. */\n async adjustCredit(id: string, input: CreditAdjustInput): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/credits/adjust`,\n body: input,\n });\n }\n\n /** Grant or claw back an outcome balance. Returns the remaining balance. */\n async adjustOutcome(\n id: string,\n input: OutcomeAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/outcomes/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\n }\n\n /** Grant or claw back a unit balance. Returns the remaining balance. */\n async adjustUnit(\n id: string,\n input: UnitAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/units/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\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 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 type { Transport } from \"../http.js\";\nimport type {\n CreateOutcomeInput,\n Outcome,\n OutcomeDetail,\n UpdateOutcomeInput,\n} from \"../types.js\";\n\n/**\n * The `outcomes` resource — manage the org's outcome *types* (the catalog). An\n * outcome is a multi-step workflow. `/api/v1/outcomes`.\n *\n * Two distinct kinds of agent key, in separate namespaces, each unique per\n * organisation — do not conflate them:\n * - the OUTCOME's own `agentKey`, REQUIRED on `create()` and `update()`, which\n * names the outcome itself in the catalogue;\n * - each STEP's `agentKey`, which is what you pass to `signals.outcome()` to\n * report usage and to the outcome-adjust API.\n */\nexport class Outcomes {\n constructor(private readonly transport: Transport) {}\n\n /** List outcome types. Pass `{ active: true }` to only return active ones. */\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: params.active === undefined ? undefined : String(params.active) },\n });\n return res.outcomes;\n }\n\n /** Create an outcome type with its steps. `POST /api/v1/outcomes`. */\n async create(input: CreateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"POST\",\n path: \"/api/v1/outcomes\",\n body: input,\n });\n return res.outcome;\n }\n\n /** Fetch one outcome type with steps + stats. `GET /api/v1/outcomes/:id`. */\n async get(id: string): Promise<OutcomeDetail> {\n const res = await this.transport.request<{ outcome: OutcomeDetail }>({\n method: \"GET\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n return res.outcome;\n }\n\n /** Update an outcome type's definition. `PATCH /api/v1/outcomes/:id`. */\n async update(id: string, input: UpdateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.outcome;\n }\n\n /** Activate or deactivate an outcome type; returns the updated outcome. */\n async setActive(id: string, isActive: boolean): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.outcome;\n }\n\n /** Delete an outcome type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\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 type { Transport } from \"../http.js\";\nimport type {\n CreatePlanInput,\n Plan,\n PlanDetail,\n UpdatePlanInput,\n} from \"../types.js\";\n\n/**\n * The `plans` resource — define and manage the billing plans customers\n * subscribe to. Each plan is a set of entitlement components (wallet / credit /\n * outcome / unit / flat) billed on a cycle. `/api/v1/plans`.\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 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: params.active === undefined ? undefined : String(params.active) },\n });\n return res.plans;\n }\n\n /** Create a plan. `POST /api/v1/plans`. */\n async create(input: CreatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"POST\",\n path: \"/api/v1/plans\",\n body: input,\n });\n return res.plan;\n }\n\n /** Fetch one plan with aggregate subscriber/invoice stats. `GET /api/v1/plans/:id`. */\n async get(id: string): Promise<PlanDetail> {\n const res = await this.transport.request<{ plan: PlanDetail }>({\n method: \"GET\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n return res.plan;\n }\n\n /** Replace a plan's definition (components + settings). `PATCH /api/v1/plans/:id`. */\n async update(id: string, input: UpdatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.plan;\n }\n\n /** Activate or deactivate a plan without rewriting it. */\n async setActive(id: string, isActive: boolean): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.plan;\n }\n\n /** Delete a plan. Refused once any customer has purchased it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\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 * 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 type { Flusher } from \"../flusher.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n CompositeCompletionInput,\n CompositeCompletionResult,\n CreditInput,\n OutcomeInput,\n ResolvedConfig,\n SerializedUnitUsage,\n SerializedUsageLog,\n Signal,\n SignalType,\n TrackResult,\n UnitInput,\n UnitTrackResult,\n UnitUsageList,\n UsageList,\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 composite completions are not part of the `Signal` union\n * (no 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\";\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 customerId: signal.customerId,\n // `usage` is required on all three model-priced kinds. input/output are\n // always sent; `cacheTokens` only when provided (the server defaults 0).\n usage: {\n model: signal.model,\n inputTokens: t.input,\n outputTokens: t.output,\n ...(t.cache != null ? { cacheTokens: t.cache } : {}),\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`; `complete` ends the run.\n if (signal.type === \"outcome\") {\n body.runId = signal.runId;\n if (signal.complete != null) body.complete = signal.complete;\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 `{ queued: true }`. Pass `{ wait: true }` (or construct the\n * client in `sync` mode) to await the request.\n *\n * Awaiting the request does NOT guarantee a priced result. The server writes\n * every signal to a durable inbox and then hands it to a worker, so it answers\n * `202` and `track()` resolves `{ queued: true, messageId, rawId, usageLog:\n * null }` — accepted and impossible to lose, but not yet billed. Only when the\n * server prices inline do you get `{ queued: false, usageLog }`. Branch on\n * `queued`; never assume `usageLog`.\n *\n * `verify()` is the way to validate and price a signal synchronously, and\n * `list()` is how you confirm one actually landed.\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 if (body.idempotencyKey == null) body.idempotencyKey = newKey();\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 this.flusher.enqueue({ path, body, signal });\n return { queued: true };\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 });\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 return {\n queued: res.queued === true,\n usageLog: res.usageLog ?? null,\n ...handles(res),\n };\n }\n\n /**\n * Validate + price a signal WITHOUT recording it (server `dryRun`). Returns\n * the projected usage log so an integration can preflight before sending real\n * traffic — no inbox row, wallet / outcome writes, or webhooks fire.\n *\n * Only the model-priced kinds support this. A dry run is not offered for unit\n * reports or composite completions, and the server REJECTS the flag on those\n * routes rather than accepting and ignoring it — which is why there is no\n * dry-run path through `unit()` or `completeComposite()`.\n */\n async verify(signal: Signal): Promise<SerializedUsageLog | null> {\n const body = signalToWire(signal);\n body.dryRun = true;\n const res = await this.transport.request<{\n dryRun: boolean;\n usageLog: SerializedUsageLog | null;\n }>({\n method: \"POST\",\n path: SIGNAL_PATHS[signal.type],\n body,\n // A dry run writes nothing, so it is always safe to retry.\n retry: true,\n });\n return res.usageLog ?? null;\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 * Recent usage logs + totals for a customer. `GET /api/v1/usage`.\n *\n * Still the legacy path, deliberately. The `/api/v1/signal/*` family is\n * POST-only — it replaced how usage is INGESTED, not how it is read — so\n * `GET /api/v1/usage` has no successor and is not deprecated. It is also the\n * only way to prove a signal landed, which matters more now that ingestion\n * answers `202` for everything.\n */\n async list(params: {\n customerId: string;\n limit?: number;\n }): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/usage\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\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 res = await this.transport.request<\n SignalResponse & { unitUsage?: SerializedUnitUsage }\n >({\n method: \"POST\",\n path: UNIT_PATH,\n body: {\n customerId: input.customerId,\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 // 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: input.idempotencyKey ?? newKey(),\n },\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n return {\n queued: res.queued === true,\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 * An OUTCOME never needs this — its own `complete: true` closes its run and\n * the matching occurrence together. Credits and units have no \"done\" signal\n * of their own, so this is theirs.\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 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 body: {\n customerId: input.customerId,\n composite: { [input.composite.ref]: input.composite.value },\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: input.idempotencyKey ?? newKey(),\n },\n retry: true,\n });\n return {\n queued: res.queued === true,\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 * A customer's unit balances + recent unit events. `GET /api/v1/units`.\n *\n * Legacy path for the same reason as {@link list}: the signal family is\n * POST-only, so the read side has no successor and is not deprecated.\n */\n unitUsage(params: {\n customerId: string;\n limit?: number;\n }): Promise<UnitUsageList> {\n return this.transport.request<UnitUsageList>({\n method: \"GET\",\n path: \"/api/v1/units\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateUnitInput,\n Unit,\n UnitDetail,\n UpdateUnitInput,\n} from \"../types.js\";\n\n/**\n * The `units` resource — manage the org's unit *types* (the catalog): named,\n * quantity-priced meters (FLAT / SLAB / VOLUME). Record consumption against a\n * unit with `signals.unit()`. `/api/v1/units-catalog`.\n */\nexport class Units {\n constructor(private readonly transport: Transport) {}\n\n /** List unit types. Pass `{ active: true }` to only return active ones. */\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-catalog\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.units;\n }\n\n /** Create a unit type. `POST /api/v1/units-catalog`. */\n async create(input: CreateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"POST\",\n path: \"/api/v1/units-catalog\",\n body: input,\n });\n return res.unit;\n }\n\n /** Fetch one unit type with stats. `GET /api/v1/units-catalog/:id`. */\n async get(id: string): Promise<UnitDetail> {\n const res = await this.transport.request<{ unit: UnitDetail }>({\n method: \"GET\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n return res.unit;\n }\n\n /** Update a unit type's definition. `PATCH /api/v1/units-catalog/:id`. */\n async update(id: string, input: UpdateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.unit;\n }\n\n /** Activate or deactivate a unit type. */\n async setActive(id: string, isActive: boolean): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.unit;\n }\n\n /** Delete a unit type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { ThresholdKind, UpsertWebhookInput, Webhook } from \"../types.js\";\n\n/**\n * The `webhooks` resource — threshold alerts. At most one webhook per kind\n * (CREDIT / OUTCOME / WALLET); posting a kind again upserts it. `/api/v1/webhooks`.\n */\nexport class Webhooks {\n constructor(private readonly transport: Transport) {}\n\n /** List configured webhooks. `GET /api/v1/webhooks`. */\n async list(): Promise<Webhook[]> {\n const res = await this.transport.request<{ webhooks: Webhook[] }>({\n method: \"GET\",\n path: \"/api/v1/webhooks\",\n });\n return res.webhooks;\n }\n\n /** Create or replace the webhook for a kind. `POST /api/v1/webhooks`. */\n async upsert(input: UpsertWebhookInput): Promise<Webhook> {\n const res = await this.transport.request<{ webhook: Webhook }>({\n method: \"POST\",\n path: \"/api/v1/webhooks\",\n body: input,\n });\n return res.webhook;\n }\n\n /** Delete the webhook for a kind (idempotent). `DELETE /api/v1/webhooks/:kind`. */\n async delete(kind: ThresholdKind): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/webhooks/${encodeURIComponent(kind)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { Model, WorkspaceIdentity } from \"../types.js\";\n\n/**\n * The `workspace` resource — read-only introspection of the org behind the API\n * key. Grounds an integration (which workspace, and is it `sandbox` or `live`?)\n * and lists the models it may meter against. `/api/v1/me`, `/api/v1/models`.\n */\nexport class Workspace {\n constructor(private readonly transport: Transport) {}\n\n /** Identify the org + key behind the request, incl. `sandbox` | `live`. */\n me(): Promise<WorkspaceIdentity> {\n return this.transport.request<WorkspaceIdentity>({\n method: \"GET\",\n path: \"/api/v1/me\",\n });\n }\n\n /** The org's enabled models with live prices. `{ active: true }` returns only\n * the models that can be metered right now. */\n async models(params: { active?: boolean } = {}): Promise<Model[]> {\n const res = await this.transport.request<{ models: Model[] }>({\n method: \"GET\",\n path: \"/api/v1/models\",\n query: {\n active: params.active === undefined ? undefined : String(params.active),\n },\n });\n return res.models;\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 { Webhooks } from \"./resources/webhooks.js\";\nimport { Workspace } from \"./resources/workspace.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.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 + read usage signals (credit / wallet / outcome / unit). */\n readonly signals: Signals;\n /** Manage customers, their members, wallet, and balances. */\n readonly customers: Customers;\n /** Define and manage billing plans. */\n readonly plans: Plans;\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 /** Manage the credit-type catalog. */\n readonly credits: Credits;\n /** Manage the composite catalog — bundles billed as one thing. */\n readonly composites: Composites;\n /** Manage the outcome-type catalog. */\n readonly outcomes: Outcomes;\n /** Manage the unit-type catalog. */\n readonly units: Units;\n /** Configure threshold webhooks. */\n readonly webhooks: Webhooks;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n /** Identify the workspace (sandbox/live) + list its models. `/me`, `/models`. */\n readonly workspace: Workspace;\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.purchases = new Purchases(transport);\n this.invoices = new Invoices(transport);\n this.payments = new Payments(transport);\n this.credits = new Credits(transport);\n this.composites = new Composites(transport);\n this.outcomes = new Outcomes(transport);\n this.units = new Units(transport);\n this.webhooks = new Webhooks(transport);\n this.portal = new Portal(transport);\n this.workspace = new Workspace(transport);\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/config.ts","../src/queue.ts","../src/flusher.ts","../src/errors.ts","../src/retry.ts","../src/http.ts","../src/resources/composites.ts","../src/resources/credits.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/idempotency.ts","../src/resources/signals.ts","../src/resources/units.ts","../src/resources/webhooks.ts","../src/resources/workspace.ts","../src/client.ts"],"names":["message"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ClockNextConfig, FetchLike, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://payments.clocknext.com\";\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 throw new Error(\"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 Error(\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 onError: config.onError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop,\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 /** Buffer one signal. Drops (with onDrop) when closed or the queue is full. */\n enqueue(item: QueuedSignal): void {\n if (this.closed) {\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return;\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;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\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 /**\n * Send everything currently buffered. Overlapping calls share the single\n * in-progress drain, so total in-flight sends never exceed `maxConcurrency`.\n */\n flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (!this.draining) {\n this.draining = this.drain().finally(() => {\n this.draining = null;\n });\n }\n return this.draining;\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 });\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 }\n}\n","/**\n * Typed error hierarchy. The server returns `{ ok: false, error }` with a\n * meaningful HTTP status; we map that status to a class so callers can branch\n * on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒ ignore,\n * it's queued) rather than string-matching messages.\n */\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 constructor(\n message: string,\n opts: { status?: number; retryable?: boolean } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.retryable = opts.retryable ?? false;\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/** 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 — insufficient credits / units / outcomes for the call. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict. */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(message: string, opts: { retryAfterMs?: number } = {}) {\n super(message, { status: 429, retryable: true });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string) {\n super(message, { retryable: true });\n }\n}\n\n/**\n * Maps a server response (status + parsed `error` message) to a typed error.\n * 422 is split into AllowanceError vs PlanError by sniffing the message, since\n * the server uses the same status for both.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n retryAfterMs?: number,\n): ClockNextError {\n const msg = message || `Request failed with status ${status}.`;\n const opts = { status };\n\n if (status === 400) return new ValidationError(msg, opts);\n if (status === 401) return new AuthError(msg, opts);\n if (status === 404) return new NotFoundError(msg, 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(msg, { ...opts, retryable: true });\n if (status === 409) return new ConflictError(msg, { ...opts, retryable: true });\n if (status === 422) {\n return /insufficient/i.test(msg)\n ? new AllowanceError(msg, opts)\n : new PlanError(msg, opts);\n }\n if (status === 429) return new RateLimitError(msg, { retryAfterMs });\n if (status >= 500) return new ServerError(msg, { ...opts, retryable: true });\n return new ClockNextError(msg, opts);\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\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);\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 // Two envelope shapes coexist during the v1 migration:\n // new: { statusCode, statusDetail: { status, message }, result }\n // old: { ok: boolean, error?, ...payload }\n const obj = (json ?? {}) as Record<string, unknown>;\n const isNew = typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isNew) {\n const detail = obj.statusDetail as\n | { status?: string; message?: 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 }\n\n // Old envelope.\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(res.status, message, parseRetryAfter(res.headers));\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","import type { Transport } from \"../http.js\";\nimport type { Composite, CreateCompositeInput } from \"../types.js\";\n\n/**\n * The `composites` resource — manage the org's composite *catalogue*: the\n * bundles of credits / outcomes / units that are grouped under one tag and\n * sold on a plan as a single thing. `/api/v1/composites`.\n *\n * Two things live elsewhere, deliberately:\n * • Tagging a signal into a composite occurrence is `composite: { ref, value }`\n * on the signal itself (see `signals.credit()` / `.outcome()` / `.unit()`).\n * • Closing an occurrence — the moment it is billed — is\n * `signals.completeComposite()`.\n *\n * This resource only defines what composites EXIST. Creating one prices it but\n * charges nobody: an invoice is built from plan components, never from a\n * catalogue entry, so a composite starts costing money only once a plan sells\n * it (`quantity × price`, frozen into the purchase at buy time).\n */\nexport class Composites {\n constructor(private readonly transport: Transport) {}\n\n /** List composites. Pass `{ active: true }` for only the ones a signal can\n * still be tagged with — the default list INCLUDES archived ones, which\n * keep every row they already own. */\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: {\n active: params.active === undefined ? undefined : String(params.active),\n },\n });\n return res.composites;\n }\n\n /** Create a composite. `POST /api/v1/composites`. */\n async create(input: CreateCompositeInput): Promise<Composite> {\n const res = await this.transport.request<{ composite: Composite }>({\n method: \"POST\",\n path: \"/api/v1/composites\",\n body: input,\n });\n return res.composite;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateCreditInput,\n Credit,\n CreditDetail,\n UpdateCreditInput,\n} from \"../types.js\";\n\n/**\n * The `credits` resource — manage the org's credit *types* (the catalog). A\n * credit's stable `agentKey` is what you pass to `signals.credit()` when\n * recording usage against it. `/api/v1/credits`.\n */\nexport class Credits {\n constructor(private readonly transport: Transport) {}\n\n /** List credit types. Pass `{ active: true }` to only return active ones. */\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: params.active === undefined ? undefined : String(params.active) },\n });\n return res.credits;\n }\n\n /** Create a credit type; returns the created credit. `POST /api/v1/credits`. */\n async create(input: CreateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"POST\",\n path: \"/api/v1/credits\",\n body: input,\n });\n return res.credit;\n }\n\n /** Fetch one credit type with usage stats. `GET /api/v1/credits/:id`. */\n async get(id: string): Promise<CreditDetail> {\n const res = await this.transport.request<{ credit: CreditDetail }>({\n method: \"GET\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n return res.credit;\n }\n\n /** Update a credit type's definition; returns the updated credit. `PATCH /api/v1/credits/:id`. */\n async update(id: string, input: UpdateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.credit;\n }\n\n /** Activate or deactivate a credit type. */\n async setActive(id: string, isActive: boolean): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.credit;\n }\n\n /** Delete a credit type. Refused while a customer is linked to it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n AddMemberInput,\n ApiCustomer,\n CreateCustomerInput,\n CreditAdjustInput,\n CreditBalance,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n Member,\n MemberProfile,\n OutcomeAdjustInput,\n OutcomeBalance,\n RemovedMember,\n UnitAdjustInput,\n UnitBalance,\n UpdateMemberInput,\n UsageList,\n WalletEntryInput,\n WalletList,\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 (usage / 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 & { ok: true }>({\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 /** 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 /** A customer's usage history. `GET /api/v1/usage?customerId=`. */\n async usage(id: string, params: { limit?: number } = {}): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: `/api/v1/usage`,\n query: { customerId: id, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\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 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 // --- 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 // --- Wallet & billing config --------------------------------------------\n\n /** The customer's wallet balance + transactions. `GET …/:id/wallet`. */\n wallet(id: string, params: { limit?: number } = {}): Promise<WalletList> {\n return this.transport.request<WalletList>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n query: { limit: params.limit },\n });\n }\n\n /**\n * Record a manual wallet entry (top-up or deduction). `amount` is always\n * positive; the sign comes from `type`. `POST …/:id/wallet`.\n */\n async addWalletEntry(\n id: string,\n input: WalletEntryInput,\n ): Promise<{ transaction: WalletTransaction; balanceUsd: number }> {\n return this.transport.request<{\n transaction: WalletTransaction;\n balanceUsd: number;\n }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n body: input,\n });\n }\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. `POST …/:id/credits/adjust`. */\n async adjustCredit(id: string, input: CreditAdjustInput): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/credits/adjust`,\n body: input,\n });\n }\n\n /** Grant or claw back an outcome balance. Returns the remaining balance. */\n async adjustOutcome(\n id: string,\n input: OutcomeAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/outcomes/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\n }\n\n /** Grant or claw back a unit balance. Returns the remaining balance. */\n async adjustUnit(\n id: string,\n input: UnitAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/units/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\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 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 type { Transport } from \"../http.js\";\nimport type {\n CreateOutcomeInput,\n Outcome,\n OutcomeDetail,\n UpdateOutcomeInput,\n} from \"../types.js\";\n\n/**\n * The `outcomes` resource — manage the org's outcome *types* (the catalog). An\n * outcome is a multi-step workflow. `/api/v1/outcomes`.\n *\n * Two distinct kinds of agent key, in separate namespaces, each unique per\n * organisation — do not conflate them:\n * - the OUTCOME's own `agentKey`, REQUIRED on `create()` and `update()`, which\n * names the outcome itself in the catalogue;\n * - each STEP's `agentKey`, which is what you pass to `signals.outcome()` to\n * report usage and to the outcome-adjust API.\n */\nexport class Outcomes {\n constructor(private readonly transport: Transport) {}\n\n /** List outcome types. Pass `{ active: true }` to only return active ones. */\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: params.active === undefined ? undefined : String(params.active) },\n });\n return res.outcomes;\n }\n\n /** Create an outcome type with its steps. `POST /api/v1/outcomes`. */\n async create(input: CreateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"POST\",\n path: \"/api/v1/outcomes\",\n body: input,\n });\n return res.outcome;\n }\n\n /** Fetch one outcome type with steps + stats. `GET /api/v1/outcomes/:id`. */\n async get(id: string): Promise<OutcomeDetail> {\n const res = await this.transport.request<{ outcome: OutcomeDetail }>({\n method: \"GET\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n return res.outcome;\n }\n\n /** Update an outcome type's definition. `PATCH /api/v1/outcomes/:id`. */\n async update(id: string, input: UpdateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.outcome;\n }\n\n /** Activate or deactivate an outcome type; returns the updated outcome. */\n async setActive(id: string, isActive: boolean): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.outcome;\n }\n\n /** Delete an outcome type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\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 type { Transport } from \"../http.js\";\nimport type {\n CreatePlanInput,\n Plan,\n PlanDetail,\n UpdatePlanInput,\n} from \"../types.js\";\n\n/**\n * The `plans` resource — define and manage the billing plans customers\n * subscribe to. Each plan is a set of entitlement components (wallet / credit /\n * outcome / unit / flat) billed on a cycle. `/api/v1/plans`.\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 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: params.active === undefined ? undefined : String(params.active) },\n });\n return res.plans;\n }\n\n /** Create a plan. `POST /api/v1/plans`. */\n async create(input: CreatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"POST\",\n path: \"/api/v1/plans\",\n body: input,\n });\n return res.plan;\n }\n\n /** Fetch one plan with aggregate subscriber/invoice stats. `GET /api/v1/plans/:id`. */\n async get(id: string): Promise<PlanDetail> {\n const res = await this.transport.request<{ plan: PlanDetail }>({\n method: \"GET\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n return res.plan;\n }\n\n /** Replace a plan's definition (components + settings). `PATCH /api/v1/plans/:id`. */\n async update(id: string, input: UpdatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.plan;\n }\n\n /** Activate or deactivate a plan without rewriting it. */\n async setActive(id: string, isActive: boolean): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.plan;\n }\n\n /** Delete a plan. Refused once any customer has purchased it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\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 * 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 type { Flusher } from \"../flusher.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n CompositeCompletionInput,\n CompositeCompletionResult,\n CreditInput,\n OutcomeInput,\n ResolvedConfig,\n SerializedUnitUsage,\n Signal,\n SignalType,\n TrackResult,\n UnitInput,\n UnitTrackResult,\n UnitUsageList,\n UsageList,\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 composite completions are not part of the `Signal` union\n * (no 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\";\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 customerId: signal.customerId,\n // `usage` is required on all three model-priced kinds. input/output are\n // always sent; `cacheTokens` only when provided (the server defaults 0).\n usage: {\n model: signal.model,\n inputTokens: t.input,\n outputTokens: t.output,\n ...(t.cache != null ? { cacheTokens: t.cache } : {}),\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`; `complete` ends the run.\n if (signal.type === \"outcome\") {\n body.runId = signal.runId;\n if (signal.complete != null) body.complete = signal.complete;\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 `{ queued: true }`. Pass `{ wait: true }` (or construct the\n * client in `sync` mode) to await the request.\n *\n * Awaiting the request does NOT guarantee a priced result. The server writes\n * every signal to a durable inbox and then hands it to a worker, so it answers\n * `202` and `track()` resolves `{ queued: true, messageId, rawId, usageLog:\n * null }` — accepted and impossible to lose, but not yet billed. Only when the\n * server prices inline do you get `{ queued: false, usageLog }`. Branch on\n * `queued`; never assume `usageLog`.\n *\n * `list()` is how you confirm one actually landed — and, ingestion being\n * asynchronous, the only way to.\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 if (body.idempotencyKey == null) body.idempotencyKey = newKey();\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 this.flusher.enqueue({ path, body, signal });\n return { queued: true };\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 });\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 return {\n queued: res.queued === true,\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 * Recent usage logs + totals for a customer. `GET /api/v1/usage`.\n *\n * Still the legacy path, deliberately. The `/api/v1/signal/*` family is\n * POST-only — it replaced how usage is INGESTED, not how it is read — so\n * `GET /api/v1/usage` has no successor and is not deprecated. It is also the\n * only way to prove a signal landed, which matters more now that ingestion\n * answers `202` for everything.\n */\n async list(params: {\n customerId: string;\n limit?: number;\n }): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/usage\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\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 res = await this.transport.request<\n SignalResponse & { unitUsage?: SerializedUnitUsage }\n >({\n method: \"POST\",\n path: UNIT_PATH,\n body: {\n customerId: input.customerId,\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 // 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: input.idempotencyKey ?? newKey(),\n },\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n return {\n queued: res.queued === true,\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 * An OUTCOME never needs this — its own `complete: true` closes its run and\n * the matching occurrence together. Credits and units have no \"done\" signal\n * of their own, so this is theirs.\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 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 body: {\n customerId: input.customerId,\n composite: { [input.composite.ref]: input.composite.value },\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: input.idempotencyKey ?? newKey(),\n },\n retry: true,\n });\n return {\n queued: res.queued === true,\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 * A customer's unit balances + recent unit events. `GET /api/v1/units`.\n *\n * Legacy path for the same reason as {@link list}: the signal family is\n * POST-only, so the read side has no successor and is not deprecated.\n */\n unitUsage(params: {\n customerId: string;\n limit?: number;\n }): Promise<UnitUsageList> {\n return this.transport.request<UnitUsageList>({\n method: \"GET\",\n path: \"/api/v1/units\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateUnitInput,\n Unit,\n UnitDetail,\n UpdateUnitInput,\n} from \"../types.js\";\n\n/**\n * The `units` resource — manage the org's unit *types* (the catalog): named,\n * quantity-priced meters (FLAT / SLAB / VOLUME). Record consumption against a\n * unit with `signals.unit()`. `/api/v1/units-catalog`.\n */\nexport class Units {\n constructor(private readonly transport: Transport) {}\n\n /** List unit types. Pass `{ active: true }` to only return active ones. */\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-catalog\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.units;\n }\n\n /** Create a unit type. `POST /api/v1/units-catalog`. */\n async create(input: CreateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"POST\",\n path: \"/api/v1/units-catalog\",\n body: input,\n });\n return res.unit;\n }\n\n /** Fetch one unit type with stats. `GET /api/v1/units-catalog/:id`. */\n async get(id: string): Promise<UnitDetail> {\n const res = await this.transport.request<{ unit: UnitDetail }>({\n method: \"GET\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n return res.unit;\n }\n\n /** Update a unit type's definition. `PATCH /api/v1/units-catalog/:id`. */\n async update(id: string, input: UpdateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.unit;\n }\n\n /** Activate or deactivate a unit type. */\n async setActive(id: string, isActive: boolean): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.unit;\n }\n\n /** Delete a unit type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { ThresholdKind, UpsertWebhookInput, Webhook } from \"../types.js\";\n\n/**\n * The `webhooks` resource — threshold alerts. At most one webhook per kind\n * (CREDIT / OUTCOME / WALLET); posting a kind again upserts it. `/api/v1/webhooks`.\n */\nexport class Webhooks {\n constructor(private readonly transport: Transport) {}\n\n /** List configured webhooks. `GET /api/v1/webhooks`. */\n async list(): Promise<Webhook[]> {\n const res = await this.transport.request<{ webhooks: Webhook[] }>({\n method: \"GET\",\n path: \"/api/v1/webhooks\",\n });\n return res.webhooks;\n }\n\n /** Create or replace the webhook for a kind. `POST /api/v1/webhooks`. */\n async upsert(input: UpsertWebhookInput): Promise<Webhook> {\n const res = await this.transport.request<{ webhook: Webhook }>({\n method: \"POST\",\n path: \"/api/v1/webhooks\",\n body: input,\n });\n return res.webhook;\n }\n\n /** Delete the webhook for a kind (idempotent). `DELETE /api/v1/webhooks/:kind`. */\n async delete(kind: ThresholdKind): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/webhooks/${encodeURIComponent(kind)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { Model, WorkspaceIdentity } from \"../types.js\";\n\n/**\n * The `workspace` resource — read-only introspection of the org behind the API\n * key. Grounds an integration (which workspace, and is it `sandbox` or `live`?)\n * and lists the models it may meter against. `/api/v1/me`, `/api/v1/models`.\n */\nexport class Workspace {\n constructor(private readonly transport: Transport) {}\n\n /** Identify the org + key behind the request, incl. `sandbox` | `live`. */\n me(): Promise<WorkspaceIdentity> {\n return this.transport.request<WorkspaceIdentity>({\n method: \"GET\",\n path: \"/api/v1/me\",\n });\n }\n\n /** The org's enabled models with live prices. `{ active: true }` returns only\n * the models that can be metered right now. */\n async models(params: { active?: boolean } = {}): Promise<Model[]> {\n const res = await this.transport.request<{ models: Model[] }>({\n method: \"GET\",\n path: \"/api/v1/models\",\n query: {\n active: params.active === undefined ? undefined : String(params.active),\n },\n });\n return res.models;\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 { Webhooks } from \"./resources/webhooks.js\";\nimport { Workspace } from \"./resources/workspace.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.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 + read usage signals (credit / wallet / outcome / unit). */\n readonly signals: Signals;\n /** Manage customers, their members, wallet, and balances. */\n readonly customers: Customers;\n /** Define and manage billing plans. */\n readonly plans: Plans;\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 /** Manage the credit-type catalog. */\n readonly credits: Credits;\n /** Manage the composite catalog — bundles billed as one thing. */\n readonly composites: Composites;\n /** Manage the outcome-type catalog. */\n readonly outcomes: Outcomes;\n /** Manage the unit-type catalog. */\n readonly units: Units;\n /** Configure threshold webhooks. */\n readonly webhooks: Webhooks;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n /** Identify the workspace (sandbox/live) + list its models. `/me`, `/models`. */\n readonly workspace: Workspace;\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.purchases = new Purchases(transport);\n this.invoices = new Invoices(transport);\n this.payments = new Payments(transport);\n this.credits = new Credits(transport);\n this.composites = new Composites(transport);\n this.outcomes = new Outcomes(transport);\n this.units = new Units(transport);\n this.webhooks = new Webhooks(transport);\n this.portal = new Portal(transport);\n this.workspace = new Workspace(transport);\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"]}
|