@usagetap/sdk 0.9.0 → 1.0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/idempotency.ts","../src/retry.ts","../src/client.ts","../src/adapters/fetch-wrapper.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type UsageTapErrorCode =\r\n | \"USAGETAP_BROWSER_RUNTIME\"\r\n | \"USAGETAP_AUTH_ERROR\"\r\n | \"USAGETAP_BAD_REQUEST\"\r\n | \"USAGETAP_INVALID_RESPONSE\"\r\n | \"USAGETAP_NETWORK_ERROR\"\r\n | \"USAGETAP_RATE_LIMITED\"\r\n | \"USAGETAP_SERVER_ERROR\"\r\n | \"USAGETAP_RETRY_EXHAUSTED\"\r\n | \"USAGETAP_END_CALL_ERROR\";\r\n\r\nexport interface UsageTapErrorInit {\r\n status?: number;\r\n retryable?: boolean;\r\n correlationId?: string;\r\n details?: Record<string, unknown>;\r\n cause?: unknown;\r\n}\r\n\r\nexport class UsageTapError extends Error {\r\n public readonly code: UsageTapErrorCode;\r\n public readonly status?: number;\r\n public readonly retryable: boolean;\r\n public readonly correlationId?: string;\r\n public readonly details?: Record<string, unknown>;\r\n\r\n constructor(code: UsageTapErrorCode, message: string, init: UsageTapErrorInit = {}) {\r\n super(message, init.cause ? { cause: init.cause as Error } : undefined);\r\n this.name = \"UsageTapError\";\r\n this.code = code;\r\n this.status = init.status;\r\n this.retryable = init.retryable ?? false;\r\n this.correlationId = init.correlationId;\r\n this.details = init.details;\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n status: this.status,\r\n retryable: this.retryable,\r\n correlationId: this.correlationId,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport function isUsageTapError(error: unknown): error is UsageTapError {\r\n return error instanceof UsageTapError;\r\n}\r\n","export function createIdempotencyKey(): string {\r\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n const random = (): string => Math.random().toString(16).slice(2, 10);\r\n return `${random()}-${random()}`;\r\n}\r\n","import type { RetryOptions } from \"./types\";\r\n\r\nexport interface ResolvedRetryOptions {\r\n maxAttempts: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n jitterRatio: number;\r\n}\r\n\r\nconst DEFAULTS: ResolvedRetryOptions = {\r\n maxAttempts: 3,\r\n baseDelayMs: 250,\r\n maxDelayMs: 5000,\r\n jitterRatio: 0.2,\r\n};\r\n\r\nexport function resolveRetryOptions(\r\n base?: RetryOptions,\r\n override?: RetryOptions,\r\n): ResolvedRetryOptions {\r\n const merged = { ...DEFAULTS, ...base, ...override } satisfies ResolvedRetryOptions;\r\n return {\r\n maxAttempts: Math.max(1, Math.floor(merged.maxAttempts)),\r\n baseDelayMs: Math.max(0, merged.baseDelayMs),\r\n maxDelayMs: Math.max(merged.baseDelayMs, merged.maxDelayMs),\r\n jitterRatio: Math.min(Math.max(merged.jitterRatio, 0), 1),\r\n };\r\n}\r\n\r\nexport async function sleep(delayMs: number, signal?: AbortSignal): Promise<void> {\r\n if (delayMs <= 0) {\r\n signal?.throwIfAborted?.();\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, delayMs);\r\n\r\n const cleanup = (): void => {\r\n clearTimeout(timer);\r\n signal?.removeEventListener(\"abort\", onAbort);\r\n };\r\n\r\n const onAbort = (): void => {\r\n cleanup();\r\n const abortError = new Error(\"Aborted\");\r\n abortError.name = \"AbortError\";\r\n reject(abortError);\r\n };\r\n\r\n if (signal) {\r\n if (signal.aborted) {\r\n onAbort();\r\n return;\r\n }\r\n signal.addEventListener(\"abort\", onAbort, { once: true });\r\n }\r\n });\r\n}\r\n\r\nexport function computeDelay(attempt: number, options: ResolvedRetryOptions): number {\r\n const exp = options.baseDelayMs * Math.pow(2, attempt - 1);\r\n const capped = Math.min(exp, options.maxDelayMs);\r\n const jitter = capped * options.jitterRatio;\r\n const min = capped - jitter;\r\n const max = capped + jitter;\r\n return Math.max(0, Math.random() * (max - min) + min);\r\n}\r\n\r\nexport async function runWithRetry<T>(\r\n operation: (attempt: number) => Promise<T>,\r\n options: ResolvedRetryOptions,\r\n shouldRetry: (error: unknown) => boolean,\r\n onSchedule?: (attempt: number, delayMs: number, error: unknown) => void,\r\n signal?: AbortSignal,\r\n): Promise<T> {\r\n let attempt = 0;\r\n let lastError: unknown;\r\n while (attempt < options.maxAttempts) {\r\n attempt += 1;\r\n signal?.throwIfAborted?.();\r\n\r\n try {\r\n return await operation(attempt);\r\n } catch (error) {\r\n lastError = error;\r\n if (attempt >= options.maxAttempts || !shouldRetry(error)) {\r\n throw error;\r\n }\r\n const delayMs = computeDelay(attempt, options);\r\n onSchedule?.(attempt, delayMs, error);\r\n await sleep(delayMs, signal);\r\n }\r\n }\r\n\r\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\r\n}\r\n","import type {\r\n BeginCallOptions,\r\n BeginCallRequest,\r\n BeginCallResponseBody,\r\n CreateCustomerOptions,\r\n CreateCustomerRequest,\r\n CreateCustomerResponseBody,\r\n CheckUsageOptions,\r\n CheckUsageRequest,\r\n CheckUsageResponseBody,\r\n ChangePlanOptions,\r\n ChangePlanRequest,\r\n ChangePlanResponseBody,\r\n IncrementCustomMeterOptions,\r\n IncrementCustomMeterRequest,\r\n IncrementCustomMeterResponseBody,\r\n EndCallOptions,\r\n EndCallRequest,\r\n EndCallResponseBody,\r\n UsageTapClientOptions,\r\n UsageTapLogEntry,\r\n UsageTapSuccessResponse,\r\n UsageMetricEvent,\r\n WithUsageContext,\r\n WithUsageOptions,\r\n} from \"./types\";\r\nimport {\r\n UsageTapError,\r\n type UsageTapErrorCode,\r\n isUsageTapError,\r\n} from \"./errors\";\r\nimport { createIdempotencyKey } from \"./idempotency\";\r\nimport {\r\n runWithRetry,\r\n resolveRetryOptions,\r\n type ResolvedRetryOptions,\r\n} from \"./retry\";\r\nimport type { RetryOptions } from \"./types\";\r\n\r\nconst CALL_BEGIN_PATH = \"call_begin\";\r\nconst CALL_END_PATH = \"call_end\";\r\nconst CHECK_USAGE_PATH = \"customers/{customerId}/usage\";\r\nconst CREATE_CUSTOMER_PATH = \"customers\";\r\nconst CHANGE_PLAN_PATH = \"customers/{customerId}/change_plan\";\r\nconst INCREMENT_CUSTOM_METER_PATH = \"custom_meter\";\r\nconst AUTH_HEADER = \"authorization\";\r\nconst API_KEY_HEADER = \"x-api-key\";\r\nconst CORRELATION_HEADER = \"x-usage-correlation-id\";\r\nconst IDEMPOTENCY_HEADER = \"idempotency-key\";\r\nconst SDK_HEADER = \"x-usage-sdk\";\r\nconst USER_AGENT = \"UsageTapClient\";\r\nconst CANONICAL_MEDIA_TYPE = \"application/vnd.usagetap.v1+json\";\r\n\r\ndeclare const __SDK_VERSION__: string | undefined;\r\nconst SDK_VERSION =\r\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.1.0\";\r\nconst HAS_WINDOW =\r\n typeof globalThis !== \"undefined\" &&\r\n typeof (globalThis as Record<string, unknown>).window !== \"undefined\";\r\n\r\ntype HeadersDict = Record<string, string>;\r\n\r\ntype InternalRequestOptions = {\r\n signal?: AbortSignal;\r\n headers?: HeadersDict;\r\n retries?: RetryOptions;\r\n correlationId?: string;\r\n idempotencyKey?: string;\r\n};\r\n\r\ntype EnvelopeShape = {\r\n result?: {\r\n status?: string;\r\n code?: string;\r\n message?: string;\r\n timestamp?: string;\r\n };\r\n data?: unknown;\r\n error?: {\r\n code?: string;\r\n message?: string;\r\n details?: Record<string, unknown>;\r\n };\r\n correlationId?: string;\r\n};\r\n\r\nexport class UsageTapClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: URL;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultFeature?: string;\r\n private readonly defaultTags?: string[];\r\n private readonly defaultHeaders: HeadersDict;\r\n private readonly retryDefaults: ResolvedRetryOptions;\r\n private readonly idempotencyGenerator: () => string;\r\n private readonly logFn?: (entry: UsageTapLogEntry) => void;\r\n private readonly metricFn?: (event: UsageMetricEvent) => void;\r\n private readonly authHeader: typeof AUTH_HEADER | typeof API_KEY_HEADER;\r\n private readonly autoIdempotency: boolean;\r\n\r\n constructor(options: UsageTapClientOptions) {\r\n if (!options) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient options are required\"\r\n );\r\n }\r\n\r\n if (!options.apiKey) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires an apiKey\"\r\n );\r\n }\r\n\r\n if (!options.baseUrl) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires a baseUrl\"\r\n );\r\n }\r\n\r\n if (HAS_WINDOW && !options.allowBrowser) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BROWSER_RUNTIME\",\r\n \"UsageTapClient is designed for server-side environments. Pass allowBrowser=true only for testing.\"\r\n );\r\n }\r\n\r\n const fetchCandidate = options.fetchImpl ?? globalThis.fetch;\r\n if (typeof fetchCandidate !== \"function\") {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"A global fetch implementation was not found. Pass fetchImpl in UsageTapClientOptions.\"\r\n );\r\n }\r\n\r\n const normalizedBaseUrl = normalizeBaseUrl(options.baseUrl);\r\n this.baseUrl = new URL(normalizedBaseUrl);\r\n this.apiKey = options.apiKey;\r\n this.fetchImpl = wrapFetchImplementation(fetchCandidate, !options.fetchImpl);\r\n this.defaultFeature = options.defaultFeature;\r\n this.defaultTags = options.defaultTags?.length\r\n ? dedupeStrings(options.defaultTags)\r\n : undefined;\r\n this.defaultHeaders = options.headers\r\n ? normalizeHeaderDictionary(options.headers)\r\n : {};\r\n this.retryDefaults = resolveRetryOptions(options.retries);\r\n this.idempotencyGenerator =\r\n options.idempotencyGenerator ?? createIdempotencyKey;\r\n this.logFn = options.onLog;\r\n this.metricFn = options.onUsageMetric;\r\n this.authHeader = options.useApiKeyHeader ? API_KEY_HEADER : AUTH_HEADER;\r\n this.autoIdempotency = options.autoIdempotency ?? true;\r\n }\r\n\r\n async beginCall(\r\n request: BeginCallRequest,\r\n options: BeginCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<BeginCallResponseBody>> {\r\n const idempotencyKey =\r\n request.idempotencyKey ??\r\n request.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const payload: BeginCallRequest = {\r\n ...request,\r\n feature: request.feature ?? this.defaultFeature,\r\n tags: this.mergeTags(request.tags),\r\n } satisfies BeginCallRequest;\r\n if (idempotencyKey) {\r\n payload.idempotencyKey = idempotencyKey;\r\n // Also set deprecated field for backward compatibility\r\n payload.idempotency = idempotencyKey;\r\n }\r\n\r\n const response = await this.request<BeginCallResponseBody>(\r\n CALL_BEGIN_PATH,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async endCall(\r\n request: EndCallRequest,\r\n options: EndCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<EndCallResponseBody>> {\r\n if (!request?.callId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"endCall requires callId\"\r\n );\r\n }\r\n\r\n // Extract metric-only fields before sending to API\r\n const { customerId, feature, tags, ...apiPayload } = request;\r\n const response = await this.request<EndCallResponseBody>(\r\n CALL_END_PATH,\r\n apiPayload,\r\n options\r\n );\r\n\r\n // Emit usage metric for observability export\r\n this.emitUsageMetric({\r\n type: \"call_end\",\r\n timestamp: new Date().toISOString(),\r\n customerId: customerId ?? \"unknown\",\r\n callId: request.callId,\r\n feature: feature ?? this.defaultFeature,\r\n tags: tags ?? this.defaultTags,\r\n modelUsed: request.modelUsed,\r\n metrics: {\r\n inputTokens: request.inputTokens,\r\n responseTokens: request.responseTokens,\r\n cachedInputTokens: request.cachedInputTokens,\r\n reasoningTokens: request.reasoningTokens,\r\n searches: request.searches,\r\n audioSeconds: request.audioSeconds,\r\n costUsd: response.data.costUSD,\r\n },\r\n correlationId: response.correlationId,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n async checkUsage(\r\n request: CheckUsageRequest,\r\n options: CheckUsageOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CheckUsageResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"checkUsage requires customerId\"\r\n );\r\n }\r\n\r\n const path = CHECK_USAGE_PATH.replace(\r\n \"{customerId}\",\r\n encodeURIComponent(request.customerId)\r\n );\r\n const response = await this.requestGet<CheckUsageResponseBody>(\r\n path,\r\n options\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async createCustomer(\r\n request: CreateCustomerRequest,\r\n options: CreateCustomerOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CreateCustomerResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"createCustomer requires customerId\"\r\n );\r\n }\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const response = await this.request<CreateCustomerResponseBody>(\r\n CREATE_CUSTOMER_PATH,\r\n { ...request },\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async changePlan(\r\n request: ChangePlanRequest,\r\n options: ChangePlanOptions = {}\r\n ): Promise<UsageTapSuccessResponse<ChangePlanResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"changePlan requires customerId\"\r\n );\r\n }\r\n\r\n if (!request?.planId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"changePlan requires planId\"\r\n );\r\n }\r\n\r\n const path = CHANGE_PLAN_PATH.replace(\r\n \"{customerId}\",\r\n encodeURIComponent(request.customerId)\r\n );\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const payload: Record<string, unknown> = {\r\n planId: request.planId,\r\n strategy: request.strategy ?? \"IMMEDIATE_RESET\",\r\n };\r\n\r\n const response = await this.request<ChangePlanResponseBody>(\r\n path,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async incrementCustomMeter(\r\n request: IncrementCustomMeterRequest,\r\n options: IncrementCustomMeterOptions = {}\r\n ): Promise<UsageTapSuccessResponse<IncrementCustomMeterResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"incrementCustomMeter requires customerId\"\r\n );\r\n }\r\n\r\n if (!request?.meterSlot) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"incrementCustomMeter requires meterSlot\"\r\n );\r\n }\r\n\r\n if (![\"CUSTOM1\", \"CUSTOM2\"].includes(request.meterSlot)) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"meterSlot must be CUSTOM1 or CUSTOM2\"\r\n );\r\n }\r\n\r\n if (\r\n typeof request.amount !== \"number\" ||\r\n !Number.isFinite(request.amount) ||\r\n request.amount <= 0\r\n ) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"incrementCustomMeter requires a positive numeric amount\"\r\n );\r\n }\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const payload: Record<string, unknown> = {\r\n customerId: request.customerId,\r\n meterSlot: request.meterSlot,\r\n amount: request.amount,\r\n };\r\n\r\n if (request.feature) {\r\n payload.feature = request.feature;\r\n }\r\n\r\n if (request.tags && request.tags.length > 0) {\r\n payload.tags = request.tags;\r\n }\r\n\r\n if (request.metadata) {\r\n payload.metadata = request.metadata;\r\n }\r\n\r\n const response = await this.request<IncrementCustomMeterResponseBody>(\r\n INCREMENT_CUSTOM_METER_PATH,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n // Emit usage metric for observability export\r\n this.emitUsageMetric({\r\n type: \"custom_meter\",\r\n timestamp: new Date().toISOString(),\r\n customerId: request.customerId,\r\n feature: request.feature ?? this.defaultFeature,\r\n tags: request.tags ?? this.defaultTags,\r\n metrics: {\r\n customMeterSlot: request.meterSlot,\r\n customMeterAmount: request.amount,\r\n },\r\n correlationId: response.correlationId,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n async withUsage<T>(\r\n beginRequest: BeginCallRequest,\r\n handler: (context: WithUsageContext) => Promise<T>,\r\n options: WithUsageOptions = {}\r\n ): Promise<T> {\r\n const idempotencyKey =\r\n beginRequest.idempotencyKey ??\r\n beginRequest.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const beginPayload = idempotencyKey\r\n ? { ...beginRequest, idempotencyKey, idempotency: idempotencyKey }\r\n : { ...beginRequest };\r\n const beginResponse = await this.beginCall(beginPayload, options);\r\n\r\n let usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const initialStripeCustomerId =\r\n typeof beginResponse.data.stripeCustomerId === \"string\"\r\n ? beginResponse.data.stripeCustomerId\r\n : typeof beginRequest.stripeCustomerId === \"string\"\r\n ? beginRequest.stripeCustomerId\r\n : undefined;\r\n if (initialStripeCustomerId) {\r\n usage = { ...usage, stripeCustomerId: initialStripeCustomerId };\r\n }\r\n let errorPayload: EndCallRequest[\"error\"] | undefined;\r\n let handlerResult: T | undefined;\r\n let handlerError: unknown;\r\n let endCallError: unknown;\r\n\r\n const context: WithUsageContext = {\r\n begin: beginResponse,\r\n setUsage: (u) => {\r\n usage = { ...usage, ...u };\r\n },\r\n setError: (err) => {\r\n errorPayload = err;\r\n },\r\n };\r\n\r\n try {\r\n handlerResult = await handler(context);\r\n } catch (error) {\r\n handlerError = error;\r\n if (!errorPayload) {\r\n errorPayload = {\r\n code: options.defaultErrorCode ?? \"VENDOR_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n } finally {\r\n try {\r\n await this.endCall(\r\n {\r\n callId: beginResponse.data.callId,\r\n // Pass context for metric tracking\r\n customerId: beginRequest.customerId,\r\n feature: beginRequest.feature ?? this.defaultFeature,\r\n tags: beginRequest.tags ?? this.defaultTags,\r\n ...(usage as Partial<Omit<EndCallRequest, \"callId\" | \"error\">>),\r\n error: errorPayload,\r\n },\r\n {\r\n ...options,\r\n correlationId: beginResponse.correlationId,\r\n }\r\n );\r\n } catch (error) {\r\n endCallError = error;\r\n }\r\n }\r\n\r\n if (handlerError) {\r\n throw handlerError;\r\n }\r\n\r\n if (endCallError) {\r\n throw wrapEndCallError(endCallError, beginResponse.correlationId);\r\n }\r\n\r\n return handlerResult as T;\r\n }\r\n\r\n private async request<T>(\r\n path: string,\r\n payload: unknown,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const body = payload !== undefined ? JSON.stringify(payload) : undefined;\r\n const headers = this.composeHeaders(body, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"POST\",\r\n headers,\r\n body,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async requestGet<T>(\r\n path: string,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const headers = this.composeHeaders(undefined, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"GET\",\r\n headers,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async performFetch<T>(init: {\r\n url: string;\r\n method: string;\r\n headers: HeadersDict;\r\n body?: string;\r\n signal?: AbortSignal;\r\n }): Promise<UsageTapSuccessResponse<T>> {\r\n let response: Response;\r\n try {\r\n response = await this.fetchImpl(init.url, {\r\n method: init.method,\r\n headers: init.headers,\r\n body: init.body,\r\n signal: init.signal,\r\n });\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"Failed to reach UsageTap\",\r\n {\r\n retryable: true,\r\n cause: error,\r\n }\r\n );\r\n }\r\n\r\n const correlationId = response.headers.get(CORRELATION_HEADER) ?? undefined;\r\n const text = await response.text();\r\n let payload: EnvelopeShape | undefined;\r\n\r\n if (text) {\r\n try {\r\n payload = JSON.parse(text) as EnvelopeShape;\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap returned invalid JSON\",\r\n {\r\n retryable: false,\r\n correlationId,\r\n cause: error,\r\n }\r\n );\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw this.toHttpError(response.status, payload, correlationId);\r\n }\r\n\r\n if (!payload?.result || payload.result.status !== \"ACCEPTED\") {\r\n throw this.toApiError(payload, correlationId);\r\n }\r\n\r\n const resolvedCorrelation = payload.correlationId ?? correlationId;\r\n if (\r\n payload.data === undefined ||\r\n payload.data === null ||\r\n !resolvedCorrelation\r\n ) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap response missing data or correlationId\",\r\n {\r\n correlationId: resolvedCorrelation ?? correlationId,\r\n }\r\n );\r\n }\r\n\r\n return {\r\n result: {\r\n status: payload.result.status as \"ACCEPTED\",\r\n code: payload.result.code,\r\n message: payload.result.message,\r\n timestamp: payload.result.timestamp,\r\n },\r\n data: payload.data as T,\r\n correlationId: resolvedCorrelation,\r\n } satisfies UsageTapSuccessResponse<T>;\r\n }\r\n\r\n private composeHeaders(\r\n body: string | undefined,\r\n options: InternalRequestOptions\r\n ): HeadersDict {\r\n const headers: HeadersDict = {\r\n ...this.defaultHeaders,\r\n [SDK_HEADER]: `js/${SDK_VERSION}`,\r\n \"content-type\": \"application/json\",\r\n accept: CANONICAL_MEDIA_TYPE,\r\n };\r\n\r\n if (!HAS_WINDOW) {\r\n // Browsers forbid setting user-agent; only attach it server-side.\r\n headers[\"user-agent\"] = `${USER_AGENT}/${SDK_VERSION}`;\r\n }\r\n\r\n if (this.authHeader === API_KEY_HEADER) {\r\n headers[API_KEY_HEADER] = this.apiKey;\r\n } else {\r\n headers[AUTH_HEADER] = `Bearer ${this.apiKey}`;\r\n }\r\n\r\n if (options.idempotencyKey) {\r\n headers[IDEMPOTENCY_HEADER] = options.idempotencyKey;\r\n }\r\n\r\n if (options.correlationId) {\r\n headers[CORRELATION_HEADER] = options.correlationId;\r\n }\r\n\r\n if (!body) {\r\n delete headers[\"content-type\"];\r\n }\r\n\r\n if (options.headers) {\r\n Object.assign(headers, normalizeHeaderDictionary(options.headers));\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private log(entry: UsageTapLogEntry): void {\r\n this.logFn?.(entry);\r\n }\r\n\r\n private emitUsageMetric(event: UsageMetricEvent): void {\r\n try {\r\n this.metricFn?.(event);\r\n } catch {\r\n // Non-blocking: metric export errors should not fail the main request\r\n }\r\n }\r\n\r\n private mergeTags(tags?: string[]): string[] | undefined {\r\n if (!tags && !this.defaultTags) {\r\n return undefined;\r\n }\r\n\r\n const combined = [...(this.defaultTags ?? []), ...(tags ?? [])].filter(\r\n Boolean\r\n );\r\n return combined.length ? dedupeStrings(combined) : undefined;\r\n }\r\n\r\n private shouldRetry(error: unknown): boolean {\r\n if (isUsageTapError(error)) {\r\n return Boolean(error.retryable);\r\n }\r\n\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n return false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private toHttpError(\r\n status: number,\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const code = mapStatusToErrorCode(status);\r\n const retryable = isRetryableStatus(status);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n `UsageTap responded with HTTP ${status}`;\r\n\r\n return new UsageTapError(code, message, {\r\n status,\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n\r\n private toApiError(\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const normalizedCode =\r\n payload?.error?.code ?? payload?.result?.code ?? \"UNKNOWN\";\r\n const retryable = isRetryableApiCode(normalizedCode);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n \"UsageTap reported an error\";\r\n\r\n return new UsageTapError(mapApiCodeToError(normalizedCode), message, {\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n}\r\n\r\nfunction mapStatusToErrorCode(status: number): UsageTapErrorCode {\r\n if (status === 401 || status === 403) return \"USAGETAP_AUTH_ERROR\";\r\n if (status === 400 || status === 404 || status === 409)\r\n return \"USAGETAP_BAD_REQUEST\";\r\n if (status === 429) return \"USAGETAP_RATE_LIMITED\";\r\n if (status >= 500) return \"USAGETAP_SERVER_ERROR\";\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction isRetryableStatus(status: number): boolean {\r\n return (\r\n status === 408 ||\r\n status === 425 ||\r\n status === 429 ||\r\n status === 500 ||\r\n status === 502 ||\r\n status === 503 ||\r\n status === 504\r\n );\r\n}\r\n\r\nfunction isRetryableApiCode(code: string): boolean {\r\n const normalized = code.toUpperCase();\r\n return (\r\n normalized.includes(\"TRANSIENT\") ||\r\n normalized.includes(\"RETRY\") ||\r\n normalized.includes(\"TIMEOUT\") ||\r\n normalized.includes(\"THROTTLE\") ||\r\n normalized.includes(\"RATE_LIMIT\")\r\n );\r\n}\r\n\r\nfunction mapApiCodeToError(code: string): UsageTapErrorCode {\r\n const normalized = code.toUpperCase();\r\n if (normalized.includes(\"AUTH\") || normalized.includes(\"TOKEN\")) {\r\n return \"USAGETAP_AUTH_ERROR\";\r\n }\r\n if (normalized.includes(\"RATE\") || normalized.includes(\"THROTTLE\")) {\r\n return \"USAGETAP_RATE_LIMITED\";\r\n }\r\n if (normalized.includes(\"SERVER\") || normalized.includes(\"TRANSIENT\")) {\r\n return \"USAGETAP_SERVER_ERROR\";\r\n }\r\n if (\r\n normalized.includes(\"IDEMPOTENCY\") ||\r\n normalized.includes(\"VALIDATION\") ||\r\n normalized.includes(\"REQUEST\")\r\n ) {\r\n return \"USAGETAP_BAD_REQUEST\";\r\n }\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction sanitizeDetails(\r\n payload: EnvelopeShape | undefined\r\n): Record<string, unknown> | undefined {\r\n if (!payload) return undefined;\r\n const details: Record<string, unknown> = {};\r\n if (payload.result) details.result = payload.result;\r\n if (payload.error) details.error = payload.error;\r\n return Object.keys(details).length ? details : undefined;\r\n}\r\n\r\nfunction normalizeBaseUrl(baseUrl: string): string {\r\n const trimmed = baseUrl.trim();\r\n if (!trimmed) return trimmed;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction normalizeHeaderDictionary(dict: Record<string, string>): HeadersDict {\r\n return Object.keys(dict).reduce<HeadersDict>((acc, key) => {\r\n acc[key.toLowerCase()] = dict[key];\r\n return acc;\r\n }, {});\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n return Array.from(\r\n new Set(values.map((value) => value.trim()).filter(Boolean))\r\n );\r\n}\r\n\r\nfunction wrapFetchImplementation(\r\n fetchCandidate: typeof fetch,\r\n preferGlobalContext: boolean\r\n): typeof fetch {\r\n const target = preferGlobalContext ? globalThis : undefined;\r\n return ((...args: Parameters<typeof fetch>) =>\r\n target\r\n ? Reflect.apply(fetchCandidate, target, args)\r\n : fetchCandidate(...args)) as typeof fetch;\r\n}\r\n\r\nfunction wrapEndCallError(\r\n error: unknown,\r\n correlationId?: string\r\n): UsageTapError {\r\n if (isUsageTapError(error)) {\r\n return new UsageTapError(\"USAGETAP_END_CALL_ERROR\", error.message, {\r\n correlationId: error.correlationId ?? correlationId,\r\n details: error.details,\r\n cause: error,\r\n });\r\n }\r\n\r\n return new UsageTapError(\r\n \"USAGETAP_END_CALL_ERROR\",\r\n \"Failed to finalize UsageTap call\",\r\n {\r\n correlationId,\r\n cause: error,\r\n }\r\n );\r\n}\r\n","import { UsageTapClient } from \"../client\";\r\nimport type { BeginCallRequest, EndCallRequest } from \"../types\";\r\n\r\nexport interface WrapFetchContext extends Omit<BeginCallRequest, \"idempotency\"> {\r\n customerId: string;\r\n}\r\n\r\nexport interface WrapFetchOptions {\r\n /**\r\n * Context for UsageTap begin calls.\r\n * Can be overridden per-request via special headers.\r\n */\r\n defaultContext: WrapFetchContext;\r\n \r\n /**\r\n * Optional custom fetch implementation to wrap.\r\n * Defaults to global fetch.\r\n */\r\n baseFetch?: typeof fetch;\r\n \r\n /**\r\n * Generate idempotency keys automatically if not provided.\r\n * Default: true\r\n */\r\n autoIdempotency?: boolean;\r\n \r\n /**\r\n * Detect OpenAI-compatible endpoints by URL pattern.\r\n * Default: detects /v1/chat/completions and /v1/responses\r\n */\r\n isOpenAIEndpoint?: (url: string) => boolean;\r\n}\r\n\r\ninterface CallState {\r\n callId: string;\r\n correlationId?: string;\r\n usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\r\n finalized: boolean;\r\n}\r\n\r\ntype JsonRecord = Record<string, unknown>;\r\n\r\nfunction isJsonRecord(value: unknown): value is JsonRecord {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction readString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction readNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\nfunction parseJsonRecord(text: string): JsonRecord | undefined {\r\n try {\r\n const parsed = JSON.parse(text) as unknown;\r\n return isJsonRecord(parsed) ? parsed : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction parseStringArray(value: string): string[] | undefined {\r\n try {\r\n const parsed = JSON.parse(value) as unknown;\r\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\r\n return parsed;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Wraps a fetch implementation to automatically instrument OpenAI API calls\r\n * with UsageTap begin/end tracking.\r\n * \r\n * Example:\r\n * ```ts\r\n * const wrappedFetch = wrapFetch(usageTap, {\r\n * defaultContext: { customerId: \"cust_123\", feature: \"chat\" }\r\n * });\r\n * \r\n * const openai = new OpenAI({\r\n * apiKey: process.env.OPENAI_API_KEY!,\r\n * fetch: wrappedFetch,\r\n * });\r\n * ```\r\n */\r\nexport function wrapFetch(\r\n usageTap: UsageTapClient,\r\n options: WrapFetchOptions,\r\n): typeof fetch {\r\n const {\r\n defaultContext,\r\n baseFetch = globalThis.fetch,\r\n autoIdempotency = true,\r\n isOpenAIEndpoint = defaultIsOpenAIEndpoint,\r\n } = options;\r\n\r\n return async function wrappedFetch(\r\n input: string | URL | Request,\r\n init?: RequestInit,\r\n ): Promise<Response> {\r\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\r\n \r\n // Only intercept OpenAI endpoints\r\n if (!isOpenAIEndpoint(url)) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Parse request body to extract context overrides and detect streaming\r\n let body: JsonRecord | undefined;\r\n let isStreaming = false;\r\n const contextOverride: Partial<WrapFetchContext> = {};\r\n\r\n try {\r\n if (init?.body && typeof init.body === \"string\") {\r\n const parsedBody = parseJsonRecord(init.body);\r\n if (!parsedBody) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n body = parsedBody;\r\n isStreaming = parsedBody.stream === true;\r\n\r\n // Check for context overrides in special headers\r\n const headers = new Headers(init.headers);\r\n const customerIdHeader = headers.get(\"x-usagetap-customer-id\");\r\n const featureHeader = headers.get(\"x-usagetap-feature\");\r\n const tagsHeader = headers.get(\"x-usagetap-tags\");\r\n\r\n if (customerIdHeader) {\r\n contextOverride.customerId = customerIdHeader;\r\n }\r\n if (featureHeader) {\r\n contextOverride.feature = featureHeader;\r\n }\r\n if (tagsHeader) {\r\n const tags = parseStringArray(tagsHeader);\r\n if (tags) {\r\n contextOverride.tags = tags;\r\n }\r\n }\r\n }\r\n } catch {\r\n // If body parsing fails, proceed without interception\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Merge context\r\n const context: BeginCallRequest = {\r\n ...defaultContext,\r\n ...contextOverride,\r\n idempotency: autoIdempotency ? crypto.randomUUID() : undefined,\r\n };\r\n\r\n // Begin the call\r\n let callState: CallState | undefined;\r\n try {\r\n const beginResponse = await usageTap.beginCall(context);\r\n callState = {\r\n callId: beginResponse.data.callId,\r\n correlationId: beginResponse.correlationId,\r\n usage: {},\r\n finalized: false,\r\n };\r\n } catch (error) {\r\n // If begin fails, proceed with original fetch but log error\r\n console.error(\"[wrapFetch] Failed to begin call:\", error);\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Add correlation header to vendor request\r\n const modifiedInit = {\r\n ...init,\r\n headers: {\r\n ...init?.headers,\r\n \"x-usage-correlation-id\": callState.correlationId || \"\",\r\n },\r\n };\r\n\r\n // Call the vendor API\r\n try {\r\n const response = await baseFetch(input, modifiedInit);\r\n \r\n if (isStreaming) {\r\n // Wrap streaming response\r\n return wrapStreamingResponse(response, callState, usageTap);\r\n } else {\r\n // Handle non-streaming response\r\n return await wrapNonStreamingResponse(response, callState, usageTap, body);\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // Vendor call failed\r\n await finalizeCall(callState, usageTap, {\r\n code: \"VENDOR_ERROR\",\r\n message,\r\n });\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\nfunction defaultIsOpenAIEndpoint(url: string): boolean {\r\n return (\r\n url.includes(\"/v1/chat/completions\") ||\r\n url.includes(\"/v1/responses\") ||\r\n url.includes(\"/v1/embeddings\")\r\n );\r\n}\r\n\r\nasync function wrapNonStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n requestBody: JsonRecord | undefined,\r\n): Promise<Response> {\r\n // Clone response to read body\r\n const clonedResponse = response.clone();\r\n \r\n try {\r\n const parsed = await clonedResponse.json();\r\n const usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n\r\n if (isJsonRecord(parsed)) {\r\n const usageBlock = parsed.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const usageRecord = usageBlock as JsonRecord;\r\n const promptDetails = isJsonRecord(usageRecord.prompt_tokens_details)\r\n ? usageRecord.prompt_tokens_details\r\n : undefined;\r\n const promptTokens = readNumber(usageRecord.prompt_tokens ?? usageRecord.input_tokens);\r\n if (promptTokens !== undefined) {\r\n usage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageRecord.completion_tokens ?? usageRecord.output_tokens);\r\n if (completionTokens !== undefined) {\r\n usage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(\r\n usageRecord.prompt_cache_hit_tokens ??\r\n usageRecord.cache_read_input_tokens ??\r\n usageRecord.cached_tokens ??\r\n promptDetails?.cached_tokens\r\n );\r\n if (cachedTokens !== undefined) {\r\n usage.cachedInputTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageRecord.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n usage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const modelFromResponse = readString(parsed.model);\r\n if (modelFromResponse) {\r\n usage.modelUsed = modelFromResponse;\r\n }\r\n }\r\n\r\n if (!usage.modelUsed && requestBody) {\r\n const requestModel = readString(requestBody.model);\r\n if (requestModel) {\r\n usage.modelUsed = requestModel;\r\n }\r\n }\r\n\r\n // Finalize the call\r\n await finalizeCall(callState, usageTap, undefined, usage);\r\n\r\n return response;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // If we can't parse response, finalize with error\r\n await finalizeCall(callState, usageTap, {\r\n code: \"RESPONSE_PARSE_ERROR\",\r\n message,\r\n });\r\n return response;\r\n }\r\n}\r\n\r\nfunction wrapStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n): Response {\r\n if (!response.body) {\r\n // No body to stream, finalize now\r\n void finalizeCall(callState, usageTap, {\r\n code: \"NO_RESPONSE_BODY\",\r\n message: \"Streaming response has no body\",\r\n });\r\n return response;\r\n }\r\n\r\n const originalBody = response.body;\r\n const accumulatedUsage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const textDecoder = new TextDecoder();\r\n\r\n const transformStream = new TransformStream({\r\n transform(chunk: Uint8Array, controller) {\r\n controller.enqueue(chunk);\r\n \r\n // Try to parse usage from SSE data\r\n try {\r\n const text = textDecoder.decode(chunk, { stream: true });\r\n const lines = text.split(\"\\n\");\r\n \r\n for (const line of lines) {\r\n if (line.startsWith(\"data: \")) {\r\n const data = line.slice(6);\r\n if (data === \"[DONE]\") continue;\r\n \r\n const parsedRecord = parseJsonRecord(data);\r\n if (!parsedRecord) {\r\n continue;\r\n }\r\n\r\n const usageBlock = parsedRecord.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const usageRecord = usageBlock as JsonRecord;\r\n const promptDetails = isJsonRecord(usageRecord.prompt_tokens_details)\r\n ? usageRecord.prompt_tokens_details\r\n : undefined;\r\n const promptTokens = readNumber(usageRecord.prompt_tokens ?? usageRecord.input_tokens);\r\n if (promptTokens !== undefined) {\r\n accumulatedUsage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageRecord.completion_tokens ?? usageRecord.output_tokens);\r\n if (completionTokens !== undefined) {\r\n accumulatedUsage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(\r\n usageRecord.prompt_cache_hit_tokens ??\r\n usageRecord.cache_read_input_tokens ??\r\n usageRecord.cached_tokens ??\r\n promptDetails?.cached_tokens\r\n );\r\n if (cachedTokens !== undefined) {\r\n accumulatedUsage.cachedInputTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageRecord.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n accumulatedUsage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const model = readString(parsedRecord.model);\r\n if (model) {\r\n accumulatedUsage.modelUsed = model;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore decode errors\r\n }\r\n },\r\n\r\n async flush() {\r\n // Stream completed successfully\r\n await finalizeCall(callState, usageTap, undefined, accumulatedUsage);\r\n },\r\n });\r\n\r\n // Handle stream errors and cancellation\r\n const wrappedBody = originalBody.pipeThrough(transformStream);\r\n \r\n // Note: Response doesn't have signal property, abort handling happens via stream closure\r\n\r\n return new Response(wrappedBody, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: response.headers,\r\n });\r\n}\r\n\r\nasync function finalizeCall(\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n error?: { code: string; message: string },\r\n usage?: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>,\r\n): Promise<void> {\r\n if (callState.finalized) return;\r\n callState.finalized = true;\r\n\r\n try {\r\n await usageTap.endCall({\r\n callId: callState.callId,\r\n ...callState.usage,\r\n ...usage,\r\n error,\r\n });\r\n } catch (err) {\r\n console.error(\"[wrapFetch] Failed to finalize call:\", err);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/idempotency.ts","../src/retry.ts","../src/prompt-compression.ts","../src/client.ts","../src/adapters/fetch-wrapper.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type UsageTapErrorCode =\r\n | \"USAGETAP_BROWSER_RUNTIME\"\r\n | \"USAGETAP_AUTH_ERROR\"\r\n | \"USAGETAP_BAD_REQUEST\"\r\n | \"USAGETAP_INVALID_RESPONSE\"\r\n | \"USAGETAP_NETWORK_ERROR\"\r\n | \"USAGETAP_RATE_LIMITED\"\r\n | \"USAGETAP_SERVER_ERROR\"\r\n | \"USAGETAP_RETRY_EXHAUSTED\"\r\n | \"USAGETAP_END_CALL_ERROR\";\r\n\r\nexport interface UsageTapErrorInit {\r\n status?: number;\r\n retryable?: boolean;\r\n correlationId?: string;\r\n details?: Record<string, unknown>;\r\n cause?: unknown;\r\n}\r\n\r\nexport class UsageTapError extends Error {\r\n public readonly code: UsageTapErrorCode;\r\n public readonly status?: number;\r\n public readonly retryable: boolean;\r\n public readonly correlationId?: string;\r\n public readonly details?: Record<string, unknown>;\r\n\r\n constructor(code: UsageTapErrorCode, message: string, init: UsageTapErrorInit = {}) {\r\n super(message, init.cause ? { cause: init.cause as Error } : undefined);\r\n this.name = \"UsageTapError\";\r\n this.code = code;\r\n this.status = init.status;\r\n this.retryable = init.retryable ?? false;\r\n this.correlationId = init.correlationId;\r\n this.details = init.details;\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n status: this.status,\r\n retryable: this.retryable,\r\n correlationId: this.correlationId,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport function isUsageTapError(error: unknown): error is UsageTapError {\r\n return error instanceof UsageTapError;\r\n}\r\n","export function createIdempotencyKey(): string {\r\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n const random = (): string => Math.random().toString(16).slice(2, 10);\r\n return `${random()}-${random()}`;\r\n}\r\n","import type { RetryOptions } from \"./types\";\r\n\r\nexport interface ResolvedRetryOptions {\r\n maxAttempts: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n jitterRatio: number;\r\n}\r\n\r\nconst DEFAULTS: ResolvedRetryOptions = {\r\n maxAttempts: 3,\r\n baseDelayMs: 250,\r\n maxDelayMs: 5000,\r\n jitterRatio: 0.2,\r\n};\r\n\r\nexport function resolveRetryOptions(\r\n base?: RetryOptions,\r\n override?: RetryOptions,\r\n): ResolvedRetryOptions {\r\n const merged = { ...DEFAULTS, ...base, ...override } satisfies ResolvedRetryOptions;\r\n return {\r\n maxAttempts: Math.max(1, Math.floor(merged.maxAttempts)),\r\n baseDelayMs: Math.max(0, merged.baseDelayMs),\r\n maxDelayMs: Math.max(merged.baseDelayMs, merged.maxDelayMs),\r\n jitterRatio: Math.min(Math.max(merged.jitterRatio, 0), 1),\r\n };\r\n}\r\n\r\nexport async function sleep(delayMs: number, signal?: AbortSignal): Promise<void> {\r\n if (delayMs <= 0) {\r\n signal?.throwIfAborted?.();\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, delayMs);\r\n\r\n const cleanup = (): void => {\r\n clearTimeout(timer);\r\n signal?.removeEventListener(\"abort\", onAbort);\r\n };\r\n\r\n const onAbort = (): void => {\r\n cleanup();\r\n const abortError = new Error(\"Aborted\");\r\n abortError.name = \"AbortError\";\r\n reject(abortError);\r\n };\r\n\r\n if (signal) {\r\n if (signal.aborted) {\r\n onAbort();\r\n return;\r\n }\r\n signal.addEventListener(\"abort\", onAbort, { once: true });\r\n }\r\n });\r\n}\r\n\r\nexport function computeDelay(attempt: number, options: ResolvedRetryOptions): number {\r\n const exp = options.baseDelayMs * Math.pow(2, attempt - 1);\r\n const capped = Math.min(exp, options.maxDelayMs);\r\n const jitter = capped * options.jitterRatio;\r\n const min = capped - jitter;\r\n const max = capped + jitter;\r\n return Math.max(0, Math.random() * (max - min) + min);\r\n}\r\n\r\nexport async function runWithRetry<T>(\r\n operation: (attempt: number) => Promise<T>,\r\n options: ResolvedRetryOptions,\r\n shouldRetry: (error: unknown) => boolean,\r\n onSchedule?: (attempt: number, delayMs: number, error: unknown) => void,\r\n signal?: AbortSignal,\r\n): Promise<T> {\r\n let attempt = 0;\r\n let lastError: unknown;\r\n while (attempt < options.maxAttempts) {\r\n attempt += 1;\r\n signal?.throwIfAborted?.();\r\n\r\n try {\r\n return await operation(attempt);\r\n } catch (error) {\r\n lastError = error;\r\n if (attempt >= options.maxAttempts || !shouldRetry(error)) {\r\n throw error;\r\n }\r\n const delayMs = computeDelay(attempt, options);\r\n onSchedule?.(attempt, delayMs, error);\r\n await sleep(delayMs, signal);\r\n }\r\n }\r\n\r\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\r\n}\r\n","export type PromptCompressionProvider = \"heuristic\" | \"toon\" | \"thetokencompany\";\n\nexport interface PromptCompressionInput {\n input: unknown;\n provider?: PromptCompressionProvider;\n tokenCompanyApiKey?: string;\n tokenCompanyEndpoint?: string;\n fetchImpl?: typeof fetch;\n signal?: AbortSignal;\n failOpen?: boolean;\n}\n\r\nexport interface PromptCompressionResult<TInput = unknown> {\n input: TInput;\n compressedInput: unknown;\n provider: PromptCompressionProvider;\n originalCharacters: number;\n compressedCharacters: number;\n savedCharacters: number;\n originalTokens: number;\n compressedTokens: number;\n savedTokens: number;\n tokenSavingsRatio: number;\n savingsRatio: number;\n techniques: string[];\n}\n\r\nconst DEFAULT_TTC_ENDPOINT = \"https://api.thetokencompany.com/v1/compress\";\n\ntype PromptCompressionTokenCounts = {\n originalTokens: number;\n compressedTokens: number;\n savedTokens: number;\n};\n\ntype TheTokenCompanyCompressResponse = {\n output: string;\n output_tokens: number;\n input_tokens: number;\n tokens_saved: number;\n compression_ratio: number;\n};\n\nexport async function compressPrompt<TInput = unknown>(\n options: PromptCompressionInput\n): Promise<PromptCompressionResult<TInput>> {\n try {\n if (options.provider === \"thetokencompany\" || options.tokenCompanyApiKey) {\n return await compressWithTheTokenCompany(options) as PromptCompressionResult<TInput>;\n }\n\n if (options.provider === \"toon\") {\n return compressPromptToon(options.input) as PromptCompressionResult<TInput>;\n }\n\n return compressPromptHeuristic(options.input) as PromptCompressionResult<TInput>;\n } catch (error) {\n if (options.failOpen === false) {\n throw error;\n }\n return createPromptCompressionFallback(\n options.input,\n options.provider ?? (options.tokenCompanyApiKey ? \"thetokencompany\" : \"heuristic\"),\n error\n ) as PromptCompressionResult<TInput>;\n }\n}\n\nexport function compressPromptHeuristic<TInput = unknown>(\n input: TInput\n): PromptCompressionResult<TInput> {\n const original = stableStringifyInput(input);\n const techniques = new Set<string>();\n const compressedInput = compressValue(input, techniques, { allowToonString: false });\n const compressed = stableStringifyInput(compressedInput);\n const chosenInput = compressed.length <= original.length ? compressedInput : input;\n const chosen = compressed.length <= original.length ? compressed : original;\n\n if (!techniques.size) {\n techniques.add(\"no-op\");\n }\n\n return buildResult(\n input,\n chosenInput,\n \"heuristic\",\n original,\n chosen,\n Array.from(techniques)\n ) as PromptCompressionResult<TInput>;\n}\n\nexport function compressPromptToon<TInput = unknown>(\n input: TInput\n): PromptCompressionResult<TInput> {\n const original = stableStringifyInput(input);\n const compressedInput =\n typeof input === \"string\"\n ? compressText(input, new Set<string>(), { allowToonString: true })\n : encodeToon(input);\n const compressed = stableStringifyInput(compressedInput);\n\n return buildResult(input, compressedInput, \"toon\", original, compressed, [\n \"toon\",\n \"json-minify\",\n ]) as PromptCompressionResult<TInput>;\n}\n\r\nasync function compressWithTheTokenCompany(\r\n options: PromptCompressionInput\r\n): Promise<PromptCompressionResult> {\r\n if (!options.tokenCompanyApiKey) {\r\n throw new Error(\r\n \"tokenCompanyApiKey is required when provider is thetokencompany\"\r\n );\r\n }\r\n\r\n const fetchCandidate = options.fetchImpl ?? globalThis.fetch;\r\n if (typeof fetchCandidate !== \"function\") {\r\n throw new Error(\r\n \"A fetch implementation is required for The Token Company compression\"\r\n );\r\n }\r\n\r\n const original = stableStringifyInput(options.input);\r\n const heuristic = compressPromptHeuristic(options.input);\n const response = await fetchCandidate(\n options.tokenCompanyEndpoint ?? DEFAULT_TTC_ENDPOINT,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n authorization: `Bearer ${options.tokenCompanyApiKey}`,\r\n \"content-type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ input: heuristic.compressedInput }),\n signal: options.signal,\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `The Token Company compression failed with HTTP ${response.status}`\r\n );\r\n }\r\n\r\n const payload = (await response.json()) as Record<string, unknown>;\n const tokenCompanyResult = normalizeTheTokenCompanyCompressResponse(payload);\n const compressedInput =\n payload.compressedInput ??\n payload.compressed ??\n tokenCompanyResult?.output ??\n payload.output ??\n payload.text;\n if (compressedInput === undefined) {\n throw new Error(\"The Token Company response did not include compressed content\");\n }\n\n const compressed = stableStringifyInput(compressedInput);\n const tokenCounts = tokenCompanyResult\n ? {\n originalTokens: tokenCompanyResult.input_tokens,\n compressedTokens: tokenCompanyResult.output_tokens,\n savedTokens: tokenCompanyResult.tokens_saved,\n }\n : undefined;\n\n return buildResult(\n options.input,\n compressedInput,\n \"thetokencompany\",\n original,\n compressed,\n [...heuristic.techniques, \"thetokencompany\"],\n tokenCounts\n );\n}\n\nfunction normalizeTheTokenCompanyCompressResponse(\n data: Record<string, unknown>\n): TheTokenCompanyCompressResponse | undefined {\n if (\n typeof data.output !== \"string\" ||\n typeof data.output_tokens !== \"number\"\n ) {\n return undefined;\n }\n\n const inputTokens =\n typeof data.input_tokens === \"number\"\n ? data.input_tokens\n : data.original_input_tokens;\n\n if (typeof inputTokens !== \"number\") {\n return undefined;\n }\n\n const tokensSaved =\n typeof data.tokens_saved === \"number\"\n ? data.tokens_saved\n : inputTokens - data.output_tokens;\n const compressionRatio =\n typeof data.compression_ratio === \"number\"\n ? data.compression_ratio\n : data.output_tokens === 0\n ? 0\n : inputTokens / data.output_tokens;\n\n return {\n output: data.output,\n output_tokens: data.output_tokens,\n input_tokens: inputTokens,\n tokens_saved: tokensSaved,\n compression_ratio: compressionRatio,\n };\n}\n\nexport function createPromptCompressionFallback<TInput = unknown>(\n input: TInput,\n provider: PromptCompressionProvider = \"heuristic\",\n error?: unknown\n): PromptCompressionResult<TInput> {\n const original = stableStringifyInput(input);\n const techniques = [\"fallback-original\"];\n if (error) {\n techniques.push(\"compression-error\");\n }\n\n return buildResult(input, input, provider, original, original, techniques) as\n PromptCompressionResult<TInput>;\n}\n\r\nfunction buildResult(\n input: unknown,\n compressedInput: unknown,\n provider: PromptCompressionProvider,\n original: string,\n compressed: string,\n techniques: string[],\n tokenCounts?: PromptCompressionTokenCounts\n): PromptCompressionResult {\n const originalCharacters = original.length;\n const compressedCharacters = compressed.length;\n const savedCharacters = Math.max(\n 0,\n originalCharacters - compressedCharacters\n );\n const originalTokens = tokenCounts?.originalTokens ?? estimatePromptTokens(original);\n const compressedTokens = tokenCounts?.compressedTokens ?? estimatePromptTokens(compressed);\n const savedTokens = Math.max(\n 0,\n tokenCounts?.savedTokens ?? originalTokens - compressedTokens\n );\n\n return {\n input,\n compressedInput,\n provider,\n originalCharacters,\n compressedCharacters,\n savedCharacters,\n originalTokens,\n compressedTokens,\n savedTokens,\n tokenSavingsRatio: originalTokens > 0 ? savedTokens / originalTokens : 0,\n savingsRatio: originalCharacters > 0 ? savedCharacters / originalCharacters : 0,\n techniques,\n };\n}\n\nexport function estimatePromptTokens(input: unknown): number {\n const text = typeof input === \"string\" ? input : stableStringifyInput(input);\n return text.match(/[\\p{L}\\p{N}]+|[^\\s]/gu)?.length ?? 0;\n}\n\r\nfunction compressValue(\n value: unknown,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): unknown {\n if (typeof value === \"string\") return compressText(value, techniques, options);\n if (Array.isArray(value)) {\n techniques.add(\"json-minify\");\n return value.map((item) => compressValue(item, techniques, options));\n }\n if (value && typeof value === \"object\") {\n techniques.add(\"json-minify\");\n return Object.keys(value as Record<string, unknown>)\n .reduce<Record<string, unknown>>((acc, key) => {\n const child = (value as Record<string, unknown>)[key];\n if (child !== undefined) {\n acc[key] = compressValue(child, techniques, options);\n }\n return acc;\n }, {});\n }\n return value;\n}\n\nfunction compressText(\n value: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n const fencePattern = /```([\\w-]+)?\\n([\\s\\S]*?)```/g;\n const parts: string[] = [];\n let cursor = 0;\n let match: RegExpExecArray | null;\n\n while ((match = fencePattern.exec(value)) !== null) {\n const before = value.slice(cursor, match.index);\n const compressedBefore = compressPlainTextAndEmbeddedJson(\n before,\n techniques,\n options\n );\n if (compressedBefore) parts.push(compressedBefore);\n\n const lang = match[1]?.toLowerCase();\n const code = cleanCodeBlock(match[2] ?? \"\");\n const compressedCode =\n lang === \"json\" ? compressJsonText(code, techniques, options) : undefined;\n\n if (compressedCode?.format === \"toon\") {\n parts.push(`\\`\\`\\`toon\\n${compressedCode.text}\\n\\`\\`\\``);\n } else if (compressedCode?.format === \"json\") {\n parts.push(`\\`\\`\\`json\\n${compressedCode.text}\\n\\`\\`\\``);\n } else {\n if (code !== match[2]) {\n techniques.add(\"code-whitespace\");\n }\n parts.push(lang ? `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\`` : `\\`\\`\\`\\n${code}\\n\\`\\`\\``);\n }\n cursor = match.index + match[0].length;\n }\n\n const after = compressPlainTextAndEmbeddedJson(value.slice(cursor), techniques, options);\n if (after) parts.push(after);\n\n return parts.join(\"\\n\").trim();\n}\n\nfunction compressPlainText(value: string, techniques: Set<string>): string {\n const compressed = value\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line)\n .join(\"\\n\")\n .replace(/[ \\t]{2,}/g, \" \")\n .trim();\n\n if (compressed !== value.trim()) {\n techniques.add(\"text-whitespace\");\n }\n\n return compressed;\n}\n\nfunction compressPlainTextAndEmbeddedJson(\n value: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n const normalized = compressPlainText(value, techniques);\n return compressEmbeddedJson(normalized, techniques, options);\n}\n\nfunction cleanCodeBlock(code: string): string {\n const lines = code.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n while (lines.length && lines[0].trim() === \"\") lines.shift();\n while (lines.length && lines[lines.length - 1].trim() === \"\") lines.pop();\n\n const commonIndent = lines\n .filter((line) => line.trim())\n .reduce<number | undefined>((min, line) => {\n const indent = /^[ \\t]*/.exec(line)?.[0].length ?? 0;\n return min === undefined ? indent : Math.min(min, indent);\n }, undefined);\n\n return lines\n .map((line) => (commonIndent ? line.slice(commonIndent) : line))\n .join(\"\\n\")\n .replace(/[ \\t]+$/gm, \"\");\n}\n\r\nfunction stableStringifyInput(input: unknown): string {\n if (typeof input === \"string\") return input;\n return JSON.stringify(input) ?? String(input);\n}\n\ntype JsonCompressionCandidate = {\n format: \"json\" | \"toon\";\n text: string;\n};\n\nfunction compressJsonText(\n text: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): JsonCompressionCandidate | undefined {\n const parsed = safeParseJson(text);\n if (parsed === undefined) {\n return undefined;\n }\n\n const compactJson = JSON.stringify(parsed);\n const candidates: JsonCompressionCandidate[] = [\n { format: \"json\", text: compactJson },\n ];\n\n if (options.allowToonString || shouldUseToonForJson(parsed)) {\n candidates.push({ format: \"toon\", text: encodeToon(parsed) });\n }\n\n const originalLength = text.trim().length;\n const best = candidates.reduce((winner, candidate) =>\n candidate.text.length < winner.text.length ? candidate : winner\n );\n\n if (best.text.length >= originalLength) {\n return undefined;\n }\n\n techniques.add(best.format === \"toon\" ? \"embedded-json-toon\" : \"embedded-json-minify\");\n return best;\n}\n\nfunction compressEmbeddedJson(\n text: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n let result = \"\";\n let cursor = 0;\n\n while (cursor < text.length) {\n const start = findNextJsonStart(text, cursor);\n if (start < 0) {\n result += text.slice(cursor);\n break;\n }\n\n result += text.slice(cursor, start);\n const span = findBalancedJsonSpan(text, start);\n if (!span) {\n result += text[start];\n cursor = start + 1;\n continue;\n }\n\n const candidate = compressJsonText(span.text, techniques, options);\n if (candidate) {\n result += candidate.text;\n } else {\n result += span.text;\n }\n cursor = span.end;\n }\n\n return result;\n}\n\nfunction findNextJsonStart(text: string, from: number): number {\n const objectStart = text.indexOf(\"{\", from);\n const arrayStart = text.indexOf(\"[\", from);\n if (objectStart < 0) return arrayStart;\n if (arrayStart < 0) return objectStart;\n return Math.min(objectStart, arrayStart);\n}\n\nfunction findBalancedJsonSpan(\n text: string,\n start: number\n): { text: string; end: number } | undefined {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : opener === \"[\" ? \"]\" : undefined;\n if (!closer) return undefined;\n\n const stack = [closer];\n let inString = false;\n let escaped = false;\n\n for (let index = start + 1; index < text.length; index += 1) {\n const char = text[index];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === \"\\\"\") {\n inString = false;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char === \"{\" ? \"}\" : \"]\");\n continue;\n }\n\n if (char === stack[stack.length - 1]) {\n stack.pop();\n if (!stack.length) {\n const end = index + 1;\n return { text: text.slice(start, end), end };\n }\n }\n }\n\n return undefined;\n}\n\nfunction safeParseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction shouldUseToonForJson(value: unknown): boolean {\n if (Array.isArray(value)) {\n return isUniformObjectArray(value) || value.some(shouldUseToonForJson);\n }\n if (isPlainObject(value)) {\n return Object.values(value).some(shouldUseToonForJson);\n }\n return false;\n}\n\nfunction encodeToon(value: unknown, indent = 0): string {\n if (isPrimitive(value)) {\n return scalarToToon(value);\n }\n\n if (Array.isArray(value)) {\n return encodeArrayToon(value, indent);\n }\n\n if (isPlainObject(value)) {\n const lines: string[] = [];\n for (const [key, child] of Object.entries(value)) {\n lines.push(...encodePropertyToon(key, child, indent));\n }\n return lines.join(\"\\n\");\n }\n\n return scalarToToon(String(value));\n}\n\nfunction encodePropertyToon(key: string, value: unknown, indent: number): string[] {\n const prefix = \" \".repeat(indent);\n const toonKey = keyToToon(key);\n\n if (isPrimitive(value)) {\n return [`${prefix}${toonKey}: ${scalarToToon(value)}`];\n }\n\n if (Array.isArray(value)) {\n if (value.every(isPrimitive)) {\n return [`${prefix}${toonKey}[${value.length}]: ${value.map(scalarToToon).join(\",\")}`];\n }\n\n if (isUniformObjectArray(value)) {\n const fields = Object.keys(value[0] as Record<string, unknown>);\n const header = `${prefix}${toonKey}[${value.length}]{${fields.map(keyToToon).join(\",\")}}:`;\n const rows = value.map((item) =>\n `${\" \".repeat(indent + 2)}${fields.map((field) =>\n scalarToToon((item as Record<string, unknown>)[field])\n ).join(\",\")}`\n );\n return [header, ...rows];\n }\n\n return [\n `${prefix}${toonKey}[${value.length}]:`,\n ...value.flatMap((item, index) => {\n if (isPrimitive(item)) {\n return [`${\" \".repeat(indent + 2)}- ${scalarToToon(item)}`];\n }\n return [\n `${\" \".repeat(indent + 2)}- item${index}:`,\n ...encodeToon(item, indent + 4).split(\"\\n\"),\n ];\n }),\n ];\n }\n\n return [`${prefix}${toonKey}:`, ...encodeToon(value, indent + 2).split(\"\\n\")];\n}\n\nfunction encodeArrayToon(value: unknown[], indent: number): string {\n if (value.every(isPrimitive)) {\n return `[${value.length}]: ${value.map(scalarToToon).join(\",\")}`;\n }\n\n if (isUniformObjectArray(value)) {\n const fields = Object.keys(value[0] as Record<string, unknown>);\n return [\n `[${value.length}]{${fields.map(keyToToon).join(\",\")}}:`,\n ...value.map((item) =>\n `${\" \".repeat(indent + 2)}${fields.map((field) =>\n scalarToToon((item as Record<string, unknown>)[field])\n ).join(\",\")}`\n ),\n ].join(\"\\n\");\n }\n\n return value\n .flatMap((item, index) => [\n `${\" \".repeat(indent)}- item${index}:`,\n ...encodeToon(item, indent + 2).split(\"\\n\"),\n ])\n .join(\"\\n\");\n}\n\nfunction isUniformObjectArray(value: unknown[]): boolean {\n if (!value.length || !value.every(isPlainObject)) {\n return false;\n }\n\n const fields = Object.keys(value[0] as Record<string, unknown>);\n if (!fields.length) {\n return false;\n }\n\n return value.every((item) => {\n const record = item as Record<string, unknown>;\n const itemFields = Object.keys(record);\n return (\n itemFields.length === fields.length &&\n fields.every((field) => itemFields.includes(field) && isPrimitive(record[field]))\n );\n });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\nfunction keyToToon(key: string): string {\n return /^[A-Za-z_][A-Za-z0-9_-]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction scalarToToon(value: unknown): string {\n if (value === null) return \"null\";\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n const text = String(value);\n if (\n text &&\n !/^(true|false|null|-?\\d+(?:\\.\\d+)?)$/i.test(text) &&\n /^[A-Za-z0-9_./@-]+(?: [A-Za-z0-9_./@-]+)*$/.test(text)\n ) {\n return text;\n }\n\n return JSON.stringify(text);\n}\n","import type {\r\n BeginCallOptions,\r\n BeginCallRequest,\r\n BeginCallResponseBody,\r\n CreateCustomerOptions,\r\n CreateCustomerRequest,\r\n CreateCustomerResponseBody,\r\n CheckUsageOptions,\r\n CheckUsageRequest,\r\n CheckUsageResponseBody,\r\n ChangePlanOptions,\r\n ChangePlanRequest,\r\n ChangePlanResponseBody,\r\n IncrementCustomMeterOptions,\r\n IncrementCustomMeterRequest,\r\n IncrementCustomMeterResponseBody,\r\n EndCallOptions,\r\n EndCallRequest,\r\n EndCallResponseBody,\r\n UsageTapClientOptions,\r\n UsageTapLogEntry,\r\n UsageTapSuccessResponse,\r\n UsageMetricEvent,\r\n WithUsageContext,\r\n WithUsageOptions,\r\n PromptCompressionRequest,\n PromptCompressionOptions,\n PromptCompressionResponseBody,\n PromptCompressionTelemetry,\n} from \"./types\";\nimport {\r\n UsageTapError,\r\n type UsageTapErrorCode,\r\n isUsageTapError,\r\n} from \"./errors\";\r\nimport { createIdempotencyKey } from \"./idempotency\";\r\nimport {\r\n runWithRetry,\r\n resolveRetryOptions,\r\n type ResolvedRetryOptions,\r\n} from \"./retry\";\r\nimport type { RetryOptions } from \"./types\";\r\nimport {\n compressPrompt,\n createPromptCompressionFallback,\n type PromptCompressionResult,\n} from \"./prompt-compression\";\n\r\nconst CALL_BEGIN_PATH = \"call_begin\";\nconst CALL_END_PATH = \"call_end\";\nconst COMPRESS_PROMPT_PATH = \"compress_prompt\";\nconst CHECK_USAGE_PATH = \"customers/{customerId}/usage\";\nconst CREATE_CUSTOMER_PATH = \"customers\";\r\nconst CHANGE_PLAN_PATH = \"customers/{customerId}/change_plan\";\r\nconst INCREMENT_CUSTOM_METER_PATH = \"custom_meter\";\r\nconst AUTH_HEADER = \"authorization\";\r\nconst API_KEY_HEADER = \"x-api-key\";\r\nconst CORRELATION_HEADER = \"x-usage-correlation-id\";\r\nconst IDEMPOTENCY_HEADER = \"idempotency-key\";\r\nconst SDK_HEADER = \"x-usage-sdk\";\r\nconst USER_AGENT = \"UsageTapClient\";\r\nconst CANONICAL_MEDIA_TYPE = \"application/vnd.usagetap.v1+json\";\r\n\r\ndeclare const __SDK_VERSION__: string | undefined;\r\nconst SDK_VERSION =\r\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.1.0\";\r\nconst HAS_WINDOW =\r\n typeof globalThis !== \"undefined\" &&\r\n typeof (globalThis as Record<string, unknown>).window !== \"undefined\";\r\n\r\ntype HeadersDict = Record<string, string>;\r\n\r\ntype InternalRequestOptions = {\r\n signal?: AbortSignal;\r\n headers?: HeadersDict;\r\n retries?: RetryOptions;\r\n correlationId?: string;\r\n idempotencyKey?: string;\r\n};\r\n\r\ntype EnvelopeShape = {\r\n result?: {\r\n status?: string;\r\n code?: string;\r\n message?: string;\r\n timestamp?: string;\r\n };\r\n data?: unknown;\r\n error?: {\r\n code?: string;\r\n message?: string;\r\n details?: Record<string, unknown>;\r\n };\r\n correlationId?: string;\r\n};\r\n\r\nexport class UsageTapClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: URL;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultFeature?: string;\r\n private readonly defaultTags?: string[];\r\n private readonly defaultHeaders: HeadersDict;\r\n private readonly retryDefaults: ResolvedRetryOptions;\r\n private readonly idempotencyGenerator: () => string;\r\n private readonly logFn?: (entry: UsageTapLogEntry) => void;\r\n private readonly metricFn?: (event: UsageMetricEvent) => void;\r\n private readonly authHeader: typeof AUTH_HEADER | typeof API_KEY_HEADER;\r\n private readonly autoIdempotency: boolean;\r\n private readonly tokenCompanyApiKey?: string;\r\n private readonly tokenCompanyEndpoint?: string;\r\n\r\n constructor(options: UsageTapClientOptions) {\r\n if (!options) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient options are required\"\r\n );\r\n }\r\n\r\n if (!options.apiKey) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires an apiKey\"\r\n );\r\n }\r\n\r\n if (!options.baseUrl) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires a baseUrl\"\r\n );\r\n }\r\n\r\n if (HAS_WINDOW && !options.allowBrowser) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BROWSER_RUNTIME\",\r\n \"UsageTapClient is designed for server-side environments. Pass allowBrowser=true only for testing.\"\r\n );\r\n }\r\n\r\n const fetchCandidate = options.fetchImpl ?? globalThis.fetch;\r\n if (typeof fetchCandidate !== \"function\") {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"A global fetch implementation was not found. Pass fetchImpl in UsageTapClientOptions.\"\r\n );\r\n }\r\n\r\n const normalizedBaseUrl = normalizeBaseUrl(options.baseUrl);\r\n this.baseUrl = new URL(normalizedBaseUrl);\r\n this.apiKey = options.apiKey;\r\n this.fetchImpl = wrapFetchImplementation(fetchCandidate, !options.fetchImpl);\r\n this.defaultFeature = options.defaultFeature;\r\n this.defaultTags = options.defaultTags?.length\r\n ? dedupeStrings(options.defaultTags)\r\n : undefined;\r\n this.defaultHeaders = options.headers\r\n ? normalizeHeaderDictionary(options.headers)\r\n : {};\r\n this.retryDefaults = resolveRetryOptions(options.retries);\r\n this.idempotencyGenerator =\r\n options.idempotencyGenerator ?? createIdempotencyKey;\r\n this.logFn = options.onLog;\r\n this.metricFn = options.onUsageMetric;\r\n this.authHeader = options.useApiKeyHeader ? API_KEY_HEADER : AUTH_HEADER;\r\n this.autoIdempotency = options.autoIdempotency ?? true;\r\n this.tokenCompanyApiKey = options.tokenCompanyApiKey;\r\n this.tokenCompanyEndpoint = options.tokenCompanyEndpoint;\r\n }\r\n\r\n async beginCall(\r\n request: BeginCallRequest,\r\n options: BeginCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<BeginCallResponseBody>> {\r\n const idempotencyKey =\n request.idempotencyKey ??\n request.idempotency ??\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\n const payload: BeginCallRequest = {\n ...request,\n feature: request.feature ?? this.defaultFeature,\n tags: this.mergeTags(request.tags),\n } satisfies BeginCallRequest;\n if (idempotencyKey) {\r\n payload.idempotencyKey = idempotencyKey;\r\n // Also set deprecated field for backward compatibility\r\n payload.idempotency = idempotencyKey;\r\n }\r\n\r\n const response = await this.request<BeginCallResponseBody>(\r\n CALL_BEGIN_PATH,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async promptCompress(\n request: PromptCompressionRequest,\n options: PromptCompressionOptions = {}\n ): Promise<PromptCompressionResult & { callId: string }> {\n if (!request?.callId) {\n throw new UsageTapError(\n \"USAGETAP_BAD_REQUEST\",\n \"promptCompress requires callId\"\n );\n }\n\n const result = await compressPrompt({\n input: request.input,\n provider: request.provider,\n tokenCompanyApiKey: this.tokenCompanyApiKey,\n tokenCompanyEndpoint: this.tokenCompanyEndpoint,\n fetchImpl: this.fetchImpl,\n signal: options.signal,\n });\n\n try {\n await this.request<PromptCompressionResponseBody>(\n COMPRESS_PROMPT_PATH,\n {\n callId: request.callId,\n promptCompression: this.toPromptCompressionTelemetry(result),\n },\n options\n );\n\n return { ...result, callId: request.callId };\n } catch (error) {\n return {\n ...createPromptCompressionFallback(\n request.input,\n request.provider ?? result.provider,\n error\n ),\n callId: request.callId,\n };\n }\n }\n\r\n async endCall(\r\n request: EndCallRequest,\r\n options: EndCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<EndCallResponseBody>> {\r\n if (!request?.callId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"endCall requires callId\"\r\n );\r\n }\r\n\r\n // Extract metric-only fields before sending to API\r\n const { customerId, feature, tags, ...apiPayload } = request;\r\n const response = await this.request<EndCallResponseBody>(\r\n CALL_END_PATH,\r\n apiPayload,\r\n options\r\n );\r\n\r\n // Emit usage metric for observability export\r\n this.emitUsageMetric({\r\n type: \"call_end\",\r\n timestamp: new Date().toISOString(),\r\n customerId: customerId ?? \"unknown\",\r\n callId: request.callId,\r\n feature: feature ?? this.defaultFeature,\r\n tags: tags ?? this.defaultTags,\r\n modelUsed: request.modelUsed,\r\n metrics: {\r\n inputTokens: request.inputTokens,\r\n responseTokens: request.responseTokens,\r\n cachedInputTokens: request.cachedInputTokens,\r\n reasoningTokens: request.reasoningTokens,\r\n searches: request.searches,\r\n audioSeconds: request.audioSeconds,\r\n costUsd: response.data.costUSD,\r\n },\r\n correlationId: response.correlationId,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n async checkUsage(\r\n request: CheckUsageRequest,\r\n options: CheckUsageOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CheckUsageResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"checkUsage requires customerId\"\r\n );\r\n }\r\n\r\n const path = CHECK_USAGE_PATH.replace(\r\n \"{customerId}\",\r\n encodeURIComponent(request.customerId)\r\n );\r\n const response = await this.requestGet<CheckUsageResponseBody>(\r\n path,\r\n options\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async createCustomer(\r\n request: CreateCustomerRequest,\r\n options: CreateCustomerOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CreateCustomerResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"createCustomer requires customerId\"\r\n );\r\n }\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const response = await this.request<CreateCustomerResponseBody>(\r\n CREATE_CUSTOMER_PATH,\r\n { ...request },\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async changePlan(\r\n request: ChangePlanRequest,\r\n options: ChangePlanOptions = {}\r\n ): Promise<UsageTapSuccessResponse<ChangePlanResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"changePlan requires customerId\"\r\n );\r\n }\r\n\r\n if (!request?.planId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"changePlan requires planId\"\r\n );\r\n }\r\n\r\n const path = CHANGE_PLAN_PATH.replace(\r\n \"{customerId}\",\r\n encodeURIComponent(request.customerId)\r\n );\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const payload: Record<string, unknown> = {\r\n planId: request.planId,\r\n strategy: request.strategy ?? \"IMMEDIATE_RESET\",\r\n };\r\n\r\n const response = await this.request<ChangePlanResponseBody>(\r\n path,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async incrementCustomMeter(\r\n request: IncrementCustomMeterRequest,\r\n options: IncrementCustomMeterOptions = {}\r\n ): Promise<UsageTapSuccessResponse<IncrementCustomMeterResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"incrementCustomMeter requires customerId\"\r\n );\r\n }\r\n\r\n if (!request?.meterSlot) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"incrementCustomMeter requires meterSlot\"\r\n );\r\n }\r\n\r\n if (![\"CUSTOM1\", \"CUSTOM2\"].includes(request.meterSlot)) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"meterSlot must be CUSTOM1 or CUSTOM2\"\r\n );\r\n }\r\n\r\n if (\r\n typeof request.amount !== \"number\" ||\r\n !Number.isFinite(request.amount) ||\r\n request.amount <= 0\r\n ) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"incrementCustomMeter requires a positive numeric amount\"\r\n );\r\n }\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const payload: Record<string, unknown> = {\r\n customerId: request.customerId,\r\n meterSlot: request.meterSlot,\r\n amount: request.amount,\r\n };\r\n\r\n if (request.feature) {\r\n payload.feature = request.feature;\r\n }\r\n\r\n if (request.tags && request.tags.length > 0) {\r\n payload.tags = request.tags;\r\n }\r\n\r\n if (request.metadata) {\r\n payload.metadata = request.metadata;\r\n }\r\n\r\n const response = await this.request<IncrementCustomMeterResponseBody>(\r\n INCREMENT_CUSTOM_METER_PATH,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n // Emit usage metric for observability export\r\n this.emitUsageMetric({\r\n type: \"custom_meter\",\r\n timestamp: new Date().toISOString(),\r\n customerId: request.customerId,\r\n feature: request.feature ?? this.defaultFeature,\r\n tags: request.tags ?? this.defaultTags,\r\n metrics: {\r\n customMeterSlot: request.meterSlot,\r\n customMeterAmount: request.amount,\r\n },\r\n correlationId: response.correlationId,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n async withUsage<T>(\r\n beginRequest: BeginCallRequest,\r\n handler: (context: WithUsageContext) => Promise<T>,\r\n options: WithUsageOptions = {}\r\n ): Promise<T> {\r\n const idempotencyKey =\r\n beginRequest.idempotencyKey ??\r\n beginRequest.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const beginPayload = idempotencyKey\r\n ? { ...beginRequest, idempotencyKey, idempotency: idempotencyKey }\r\n : { ...beginRequest };\r\n const beginResponse = await this.beginCall(beginPayload, options);\r\n\r\n let usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const initialStripeCustomerId =\r\n typeof beginResponse.data.stripeCustomerId === \"string\"\r\n ? beginResponse.data.stripeCustomerId\r\n : typeof beginRequest.stripeCustomerId === \"string\"\r\n ? beginRequest.stripeCustomerId\r\n : undefined;\r\n if (initialStripeCustomerId) {\r\n usage = { ...usage, stripeCustomerId: initialStripeCustomerId };\r\n }\r\n let errorPayload: EndCallRequest[\"error\"] | undefined;\r\n let handlerResult: T | undefined;\r\n let handlerError: unknown;\r\n let endCallError: unknown;\r\n\r\n const context: WithUsageContext = {\r\n begin: beginResponse,\r\n setUsage: (u) => {\r\n usage = { ...usage, ...u };\r\n },\r\n setError: (err) => {\r\n errorPayload = err;\r\n },\r\n };\r\n\r\n try {\r\n handlerResult = await handler(context);\r\n } catch (error) {\r\n handlerError = error;\r\n if (!errorPayload) {\r\n errorPayload = {\r\n code: options.defaultErrorCode ?? \"VENDOR_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n } finally {\r\n try {\r\n await this.endCall(\r\n {\r\n callId: beginResponse.data.callId,\r\n // Pass context for metric tracking\r\n customerId: beginRequest.customerId,\r\n feature: beginRequest.feature ?? this.defaultFeature,\r\n tags: beginRequest.tags ?? this.defaultTags,\r\n ...(usage as Partial<Omit<EndCallRequest, \"callId\" | \"error\">>),\r\n error: errorPayload,\r\n },\r\n {\r\n ...options,\r\n correlationId: beginResponse.correlationId,\r\n }\r\n );\r\n } catch (error) {\r\n endCallError = error;\r\n }\r\n }\r\n\r\n if (handlerError) {\r\n throw handlerError;\r\n }\r\n\r\n if (endCallError) {\r\n throw wrapEndCallError(endCallError, beginResponse.correlationId);\r\n }\r\n\r\n return handlerResult as T;\r\n }\r\n\r\n private toPromptCompressionTelemetry(\n result: PromptCompressionResult\n ): PromptCompressionTelemetry {\n return {\n provider: result.provider,\n originalCharacters: result.originalCharacters,\n compressedCharacters: result.compressedCharacters,\n savedCharacters: result.savedCharacters,\n originalTokens: result.originalTokens,\n compressedTokens: result.compressedTokens,\n savedTokens: result.savedTokens,\n tokenSavingsRatio: result.tokenSavingsRatio,\n savingsRatio: result.savingsRatio,\n techniques: result.techniques,\n };\n }\r\n\r\n private async request<T>(\r\n path: string,\r\n payload: unknown,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const body = payload !== undefined ? JSON.stringify(payload) : undefined;\r\n const headers = this.composeHeaders(body, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"POST\",\r\n headers,\r\n body,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async requestGet<T>(\r\n path: string,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const headers = this.composeHeaders(undefined, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"GET\",\r\n headers,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async performFetch<T>(init: {\r\n url: string;\r\n method: string;\r\n headers: HeadersDict;\r\n body?: string;\r\n signal?: AbortSignal;\r\n }): Promise<UsageTapSuccessResponse<T>> {\r\n let response: Response;\r\n try {\r\n response = await this.fetchImpl(init.url, {\r\n method: init.method,\r\n headers: init.headers,\r\n body: init.body,\r\n signal: init.signal,\r\n });\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"Failed to reach UsageTap\",\r\n {\r\n retryable: true,\r\n cause: error,\r\n }\r\n );\r\n }\r\n\r\n const correlationId = response.headers.get(CORRELATION_HEADER) ?? undefined;\r\n const text = await response.text();\r\n let payload: EnvelopeShape | undefined;\r\n\r\n if (text) {\r\n try {\r\n payload = JSON.parse(text) as EnvelopeShape;\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap returned invalid JSON\",\r\n {\r\n retryable: false,\r\n correlationId,\r\n cause: error,\r\n }\r\n );\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw this.toHttpError(response.status, payload, correlationId);\r\n }\r\n\r\n if (!payload?.result || payload.result.status !== \"ACCEPTED\") {\r\n throw this.toApiError(payload, correlationId);\r\n }\r\n\r\n const resolvedCorrelation = payload.correlationId ?? correlationId;\r\n if (\r\n payload.data === undefined ||\r\n payload.data === null ||\r\n !resolvedCorrelation\r\n ) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap response missing data or correlationId\",\r\n {\r\n correlationId: resolvedCorrelation ?? correlationId,\r\n }\r\n );\r\n }\r\n\r\n return {\r\n result: {\r\n status: payload.result.status as \"ACCEPTED\",\r\n code: payload.result.code,\r\n message: payload.result.message,\r\n timestamp: payload.result.timestamp,\r\n },\r\n data: payload.data as T,\r\n correlationId: resolvedCorrelation,\r\n } satisfies UsageTapSuccessResponse<T>;\r\n }\r\n\r\n private composeHeaders(\r\n body: string | undefined,\r\n options: InternalRequestOptions\r\n ): HeadersDict {\r\n const headers: HeadersDict = {\r\n ...this.defaultHeaders,\r\n [SDK_HEADER]: `js/${SDK_VERSION}`,\r\n \"content-type\": \"application/json\",\r\n accept: CANONICAL_MEDIA_TYPE,\r\n };\r\n\r\n if (!HAS_WINDOW) {\r\n // Browsers forbid setting user-agent; only attach it server-side.\r\n headers[\"user-agent\"] = `${USER_AGENT}/${SDK_VERSION}`;\r\n }\r\n\r\n if (this.authHeader === API_KEY_HEADER) {\r\n headers[API_KEY_HEADER] = this.apiKey;\r\n } else {\r\n headers[AUTH_HEADER] = `Bearer ${this.apiKey}`;\r\n }\r\n\r\n if (options.idempotencyKey) {\r\n headers[IDEMPOTENCY_HEADER] = options.idempotencyKey;\r\n }\r\n\r\n if (options.correlationId) {\r\n headers[CORRELATION_HEADER] = options.correlationId;\r\n }\r\n\r\n if (!body) {\r\n delete headers[\"content-type\"];\r\n }\r\n\r\n if (options.headers) {\r\n Object.assign(headers, normalizeHeaderDictionary(options.headers));\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private log(entry: UsageTapLogEntry): void {\r\n this.logFn?.(entry);\r\n }\r\n\r\n private emitUsageMetric(event: UsageMetricEvent): void {\r\n try {\r\n this.metricFn?.(event);\r\n } catch {\r\n // Non-blocking: metric export errors should not fail the main request\r\n }\r\n }\r\n\r\n private mergeTags(tags?: string[]): string[] | undefined {\r\n if (!tags && !this.defaultTags) {\r\n return undefined;\r\n }\r\n\r\n const combined = [...(this.defaultTags ?? []), ...(tags ?? [])].filter(\r\n Boolean\r\n );\r\n return combined.length ? dedupeStrings(combined) : undefined;\r\n }\r\n\r\n private shouldRetry(error: unknown): boolean {\r\n if (isUsageTapError(error)) {\r\n return Boolean(error.retryable);\r\n }\r\n\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n return false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private toHttpError(\r\n status: number,\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const code = mapStatusToErrorCode(status);\r\n const retryable = isRetryableStatus(status);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n `UsageTap responded with HTTP ${status}`;\r\n\r\n return new UsageTapError(code, message, {\r\n status,\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n\r\n private toApiError(\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const normalizedCode =\r\n payload?.error?.code ?? payload?.result?.code ?? \"UNKNOWN\";\r\n const retryable = isRetryableApiCode(normalizedCode);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n \"UsageTap reported an error\";\r\n\r\n return new UsageTapError(mapApiCodeToError(normalizedCode), message, {\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n}\r\n\r\nfunction mapStatusToErrorCode(status: number): UsageTapErrorCode {\r\n if (status === 401 || status === 403) return \"USAGETAP_AUTH_ERROR\";\r\n if (status === 400 || status === 404 || status === 409)\r\n return \"USAGETAP_BAD_REQUEST\";\r\n if (status === 429) return \"USAGETAP_RATE_LIMITED\";\r\n if (status >= 500) return \"USAGETAP_SERVER_ERROR\";\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction isRetryableStatus(status: number): boolean {\r\n return (\r\n status === 408 ||\r\n status === 425 ||\r\n status === 429 ||\r\n status === 500 ||\r\n status === 502 ||\r\n status === 503 ||\r\n status === 504\r\n );\r\n}\r\n\r\nfunction isRetryableApiCode(code: string): boolean {\r\n const normalized = code.toUpperCase();\r\n return (\r\n normalized.includes(\"TRANSIENT\") ||\r\n normalized.includes(\"RETRY\") ||\r\n normalized.includes(\"TIMEOUT\") ||\r\n normalized.includes(\"THROTTLE\") ||\r\n normalized.includes(\"RATE_LIMIT\")\r\n );\r\n}\r\n\r\nfunction mapApiCodeToError(code: string): UsageTapErrorCode {\r\n const normalized = code.toUpperCase();\r\n if (normalized.includes(\"AUTH\") || normalized.includes(\"TOKEN\")) {\r\n return \"USAGETAP_AUTH_ERROR\";\r\n }\r\n if (normalized.includes(\"RATE\") || normalized.includes(\"THROTTLE\")) {\r\n return \"USAGETAP_RATE_LIMITED\";\r\n }\r\n if (normalized.includes(\"SERVER\") || normalized.includes(\"TRANSIENT\")) {\r\n return \"USAGETAP_SERVER_ERROR\";\r\n }\r\n if (\r\n normalized.includes(\"IDEMPOTENCY\") ||\r\n normalized.includes(\"VALIDATION\") ||\r\n normalized.includes(\"REQUEST\")\r\n ) {\r\n return \"USAGETAP_BAD_REQUEST\";\r\n }\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction sanitizeDetails(\r\n payload: EnvelopeShape | undefined\r\n): Record<string, unknown> | undefined {\r\n if (!payload) return undefined;\r\n const details: Record<string, unknown> = {};\r\n if (payload.result) details.result = payload.result;\r\n if (payload.error) details.error = payload.error;\r\n return Object.keys(details).length ? details : undefined;\r\n}\r\n\r\nfunction normalizeBaseUrl(baseUrl: string): string {\r\n const trimmed = baseUrl.trim();\r\n if (!trimmed) return trimmed;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction normalizeHeaderDictionary(dict: Record<string, string>): HeadersDict {\r\n return Object.keys(dict).reduce<HeadersDict>((acc, key) => {\r\n acc[key.toLowerCase()] = dict[key];\r\n return acc;\r\n }, {});\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n return Array.from(\r\n new Set(values.map((value) => value.trim()).filter(Boolean))\r\n );\r\n}\r\n\r\nfunction wrapFetchImplementation(\r\n fetchCandidate: typeof fetch,\r\n preferGlobalContext: boolean\r\n): typeof fetch {\r\n const target = preferGlobalContext ? globalThis : undefined;\r\n return ((...args: Parameters<typeof fetch>) =>\r\n target\r\n ? Reflect.apply(fetchCandidate, target, args)\r\n : fetchCandidate(...args)) as typeof fetch;\r\n}\r\n\r\nfunction wrapEndCallError(\r\n error: unknown,\r\n correlationId?: string\r\n): UsageTapError {\r\n if (isUsageTapError(error)) {\r\n return new UsageTapError(\"USAGETAP_END_CALL_ERROR\", error.message, {\r\n correlationId: error.correlationId ?? correlationId,\r\n details: error.details,\r\n cause: error,\r\n });\r\n }\r\n\r\n return new UsageTapError(\r\n \"USAGETAP_END_CALL_ERROR\",\r\n \"Failed to finalize UsageTap call\",\r\n {\r\n correlationId,\r\n cause: error,\r\n }\r\n );\r\n}\r\n","import { UsageTapClient } from \"../client\";\r\nimport type { BeginCallRequest, EndCallRequest } from \"../types\";\r\n\r\nexport interface WrapFetchContext extends Omit<BeginCallRequest, \"idempotency\"> {\r\n customerId: string;\r\n}\r\n\r\nexport interface WrapFetchOptions {\r\n /**\r\n * Context for UsageTap begin calls.\r\n * Can be overridden per-request via special headers.\r\n */\r\n defaultContext: WrapFetchContext;\r\n \r\n /**\r\n * Optional custom fetch implementation to wrap.\r\n * Defaults to global fetch.\r\n */\r\n baseFetch?: typeof fetch;\r\n \r\n /**\r\n * Generate idempotency keys automatically if not provided.\r\n * Default: true\r\n */\r\n autoIdempotency?: boolean;\r\n \r\n /**\r\n * Detect OpenAI-compatible endpoints by URL pattern.\r\n * Default: detects /v1/chat/completions and /v1/responses\r\n */\r\n isOpenAIEndpoint?: (url: string) => boolean;\r\n}\r\n\r\ninterface CallState {\r\n callId: string;\r\n correlationId?: string;\r\n usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\r\n finalized: boolean;\r\n}\r\n\r\ntype JsonRecord = Record<string, unknown>;\r\n\r\nfunction isJsonRecord(value: unknown): value is JsonRecord {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction readString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction readNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\nfunction parseJsonRecord(text: string): JsonRecord | undefined {\r\n try {\r\n const parsed = JSON.parse(text) as unknown;\r\n return isJsonRecord(parsed) ? parsed : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction parseStringArray(value: string): string[] | undefined {\r\n try {\r\n const parsed = JSON.parse(value) as unknown;\r\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\r\n return parsed;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Wraps a fetch implementation to automatically instrument OpenAI API calls\r\n * with UsageTap begin/end tracking.\r\n * \r\n * Example:\r\n * ```ts\r\n * const wrappedFetch = wrapFetch(usageTap, {\r\n * defaultContext: { customerId: \"cust_123\", feature: \"chat\" }\r\n * });\r\n * \r\n * const openai = new OpenAI({\r\n * apiKey: process.env.OPENAI_API_KEY!,\r\n * fetch: wrappedFetch,\r\n * });\r\n * ```\r\n */\r\nexport function wrapFetch(\r\n usageTap: UsageTapClient,\r\n options: WrapFetchOptions,\r\n): typeof fetch {\r\n const {\r\n defaultContext,\r\n baseFetch = globalThis.fetch,\r\n autoIdempotency = true,\r\n isOpenAIEndpoint = defaultIsOpenAIEndpoint,\r\n } = options;\r\n\r\n return async function wrappedFetch(\r\n input: string | URL | Request,\r\n init?: RequestInit,\r\n ): Promise<Response> {\r\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\r\n \r\n // Only intercept OpenAI endpoints\r\n if (!isOpenAIEndpoint(url)) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Parse request body to extract context overrides and detect streaming\r\n let body: JsonRecord | undefined;\r\n let isStreaming = false;\r\n const contextOverride: Partial<WrapFetchContext> = {};\r\n\r\n try {\r\n if (init?.body && typeof init.body === \"string\") {\r\n const parsedBody = parseJsonRecord(init.body);\r\n if (!parsedBody) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n body = parsedBody;\r\n isStreaming = parsedBody.stream === true;\r\n\r\n // Check for context overrides in special headers\r\n const headers = new Headers(init.headers);\r\n const customerIdHeader = headers.get(\"x-usagetap-customer-id\");\r\n const featureHeader = headers.get(\"x-usagetap-feature\");\r\n const tagsHeader = headers.get(\"x-usagetap-tags\");\r\n\r\n if (customerIdHeader) {\r\n contextOverride.customerId = customerIdHeader;\r\n }\r\n if (featureHeader) {\r\n contextOverride.feature = featureHeader;\r\n }\r\n if (tagsHeader) {\r\n const tags = parseStringArray(tagsHeader);\r\n if (tags) {\r\n contextOverride.tags = tags;\r\n }\r\n }\r\n }\r\n } catch {\r\n // If body parsing fails, proceed without interception\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Merge context\r\n const context: BeginCallRequest = {\r\n ...defaultContext,\r\n ...contextOverride,\r\n idempotency: autoIdempotency ? crypto.randomUUID() : undefined,\r\n };\r\n\r\n // Begin the call\r\n let callState: CallState | undefined;\r\n try {\r\n const beginResponse = await usageTap.beginCall(context);\r\n callState = {\r\n callId: beginResponse.data.callId,\r\n correlationId: beginResponse.correlationId,\r\n usage: {},\r\n finalized: false,\r\n };\r\n } catch (error) {\r\n // If begin fails, proceed with original fetch but log error\r\n console.error(\"[wrapFetch] Failed to begin call:\", error);\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Add correlation header to vendor request\r\n const modifiedInit = {\r\n ...init,\r\n headers: {\r\n ...init?.headers,\r\n \"x-usage-correlation-id\": callState.correlationId || \"\",\r\n },\r\n };\r\n\r\n // Call the vendor API\r\n try {\r\n const response = await baseFetch(input, modifiedInit);\r\n \r\n if (isStreaming) {\r\n // Wrap streaming response\r\n return wrapStreamingResponse(response, callState, usageTap);\r\n } else {\r\n // Handle non-streaming response\r\n return await wrapNonStreamingResponse(response, callState, usageTap, body);\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // Vendor call failed\r\n await finalizeCall(callState, usageTap, {\r\n code: \"VENDOR_ERROR\",\r\n message,\r\n });\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\nfunction defaultIsOpenAIEndpoint(url: string): boolean {\r\n return (\r\n url.includes(\"/v1/chat/completions\") ||\r\n url.includes(\"/v1/responses\") ||\r\n url.includes(\"/v1/embeddings\")\r\n );\r\n}\r\n\r\nasync function wrapNonStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n requestBody: JsonRecord | undefined,\r\n): Promise<Response> {\r\n // Clone response to read body\r\n const clonedResponse = response.clone();\r\n \r\n try {\r\n const parsed = await clonedResponse.json();\r\n const usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n\r\n if (isJsonRecord(parsed)) {\r\n const usageBlock = parsed.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const usageRecord = usageBlock as JsonRecord;\r\n const promptDetails = isJsonRecord(usageRecord.prompt_tokens_details)\r\n ? usageRecord.prompt_tokens_details\r\n : undefined;\r\n const promptTokens = readNumber(usageRecord.prompt_tokens ?? usageRecord.input_tokens);\r\n if (promptTokens !== undefined) {\r\n usage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageRecord.completion_tokens ?? usageRecord.output_tokens);\r\n if (completionTokens !== undefined) {\r\n usage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(\r\n usageRecord.prompt_cache_hit_tokens ??\r\n usageRecord.cache_read_input_tokens ??\r\n usageRecord.cached_tokens ??\r\n promptDetails?.cached_tokens\r\n );\r\n if (cachedTokens !== undefined) {\r\n usage.cachedInputTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageRecord.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n usage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const modelFromResponse = readString(parsed.model);\r\n if (modelFromResponse) {\r\n usage.modelUsed = modelFromResponse;\r\n }\r\n }\r\n\r\n if (!usage.modelUsed && requestBody) {\r\n const requestModel = readString(requestBody.model);\r\n if (requestModel) {\r\n usage.modelUsed = requestModel;\r\n }\r\n }\r\n\r\n // Finalize the call\r\n await finalizeCall(callState, usageTap, undefined, usage);\r\n\r\n return response;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // If we can't parse response, finalize with error\r\n await finalizeCall(callState, usageTap, {\r\n code: \"RESPONSE_PARSE_ERROR\",\r\n message,\r\n });\r\n return response;\r\n }\r\n}\r\n\r\nfunction wrapStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n): Response {\r\n if (!response.body) {\r\n // No body to stream, finalize now\r\n void finalizeCall(callState, usageTap, {\r\n code: \"NO_RESPONSE_BODY\",\r\n message: \"Streaming response has no body\",\r\n });\r\n return response;\r\n }\r\n\r\n const originalBody = response.body;\r\n const accumulatedUsage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const textDecoder = new TextDecoder();\r\n\r\n const transformStream = new TransformStream({\r\n transform(chunk: Uint8Array, controller) {\r\n controller.enqueue(chunk);\r\n \r\n // Try to parse usage from SSE data\r\n try {\r\n const text = textDecoder.decode(chunk, { stream: true });\r\n const lines = text.split(\"\\n\");\r\n \r\n for (const line of lines) {\r\n if (line.startsWith(\"data: \")) {\r\n const data = line.slice(6);\r\n if (data === \"[DONE]\") continue;\r\n \r\n const parsedRecord = parseJsonRecord(data);\r\n if (!parsedRecord) {\r\n continue;\r\n }\r\n\r\n const usageBlock = parsedRecord.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const usageRecord = usageBlock as JsonRecord;\r\n const promptDetails = isJsonRecord(usageRecord.prompt_tokens_details)\r\n ? usageRecord.prompt_tokens_details\r\n : undefined;\r\n const promptTokens = readNumber(usageRecord.prompt_tokens ?? usageRecord.input_tokens);\r\n if (promptTokens !== undefined) {\r\n accumulatedUsage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageRecord.completion_tokens ?? usageRecord.output_tokens);\r\n if (completionTokens !== undefined) {\r\n accumulatedUsage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(\r\n usageRecord.prompt_cache_hit_tokens ??\r\n usageRecord.cache_read_input_tokens ??\r\n usageRecord.cached_tokens ??\r\n promptDetails?.cached_tokens\r\n );\r\n if (cachedTokens !== undefined) {\r\n accumulatedUsage.cachedInputTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageRecord.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n accumulatedUsage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const model = readString(parsedRecord.model);\r\n if (model) {\r\n accumulatedUsage.modelUsed = model;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore decode errors\r\n }\r\n },\r\n\r\n async flush() {\r\n // Stream completed successfully\r\n await finalizeCall(callState, usageTap, undefined, accumulatedUsage);\r\n },\r\n });\r\n\r\n // Handle stream errors and cancellation\r\n const wrappedBody = originalBody.pipeThrough(transformStream);\r\n \r\n // Note: Response doesn't have signal property, abort handling happens via stream closure\r\n\r\n return new Response(wrappedBody, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: response.headers,\r\n });\r\n}\r\n\r\nasync function finalizeCall(\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n error?: { code: string; message: string },\r\n usage?: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>,\r\n): Promise<void> {\r\n if (callState.finalized) return;\r\n callState.finalized = true;\r\n\r\n try {\r\n await usageTap.endCall({\r\n callId: callState.callId,\r\n ...callState.usage,\r\n ...usage,\r\n error,\r\n });\r\n } catch (err) {\r\n console.error(\"[wrapFetch] Failed to finalize call:\", err);\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
1
  export { NodeResponseLike, OpenAIAdapter, OpenAIAdapterInit, OpenAIInvokeParams, OpenAIInvokeResult, OpenAIStreamParams, OpenAIStreamResult, StreamMode, StreamOpenAIRouteOptions, StreamToResponseOptions, WrapOpenAICallOptions, WrapOpenAIContext, WrapOpenAIOptions, WrapOpenAIResponseCallOptions, WrappedOpenAI, createOpenAIAdapter, pipeToResponse, streamOpenAIRoute, toNextResponse, wrapOpenAI } from '../adapters/openai.cjs';
2
2
  export { OpenRouterAdapterInit, createOpenRouterAdapter } from '../adapters/openrouter.cjs';
3
3
  import 'openai';
4
- import '../client-CuzjFxMn.cjs';
4
+ import '../client-BHNMYvlO.cjs';
@@ -1,4 +1,4 @@
1
1
  export { NodeResponseLike, OpenAIAdapter, OpenAIAdapterInit, OpenAIInvokeParams, OpenAIInvokeResult, OpenAIStreamParams, OpenAIStreamResult, StreamMode, StreamOpenAIRouteOptions, StreamToResponseOptions, WrapOpenAICallOptions, WrapOpenAIContext, WrapOpenAIOptions, WrapOpenAIResponseCallOptions, WrappedOpenAI, createOpenAIAdapter, pipeToResponse, streamOpenAIRoute, toNextResponse, wrapOpenAI } from '../adapters/openai.js';
2
2
  export { OpenRouterAdapterInit, createOpenRouterAdapter } from '../adapters/openrouter.js';
3
3
  import 'openai';
4
- import '../client-CuzjFxMn.js';
4
+ import '../client-BHNMYvlO.js';
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@usagetap/sdk",
3
- "version": "0.9.0",
3
+ "version": "1.0.0",
4
4
  "description": "UsageTap SDK core client plus optional React helpers.",
5
- "license": "UNLICENSED",
5
+ "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
8
8
  "module": "./dist/index.mjs",