@atribu/node 0.1.1 → 0.1.4

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/config.ts","../src/retry.ts","../src/version.ts","../src/runtime.ts","../src/http.ts","../src/resources/messages.ts","../src/resources/comments.ts","../src/resources/webhook-subscriptions.ts","../src/resources/webhook-deliveries.ts","../src/retry-wrapper.ts","../src/client.ts"],"names":["code","body"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Atribu error class hierarchy.\n *\n * Why typed errors: consumers need to branch on auth-failure vs rate-limit vs\n * server-error vs validation-error to decide whether to retry, refresh\n * credentials, or surface to the user. A single `Error` with a status code\n * forces every consumer to write the same `if (err.status === 401)` ladder.\n *\n * Why no automatic retries: the SDK derives a `retry` hint from status +\n * Retry-After + error code, but consumers' queue/job systems decide whether\n * to act on it. Auto-retry inside the SDK hides backpressure signals and\n * makes error budgets opaque.\n */\n\nimport type { RetryHint } from \"./retry\";\n\nexport type ApiErrorCode =\n | \"unauthorized\"\n | \"forbidden\"\n | \"insufficient_scope\"\n | \"not_found\"\n | \"invalid_parameter\"\n | \"invalid_request\"\n | \"validation_error\"\n | \"invalid_content\"\n | \"invalid_date_range\"\n | \"rate_limit_exceeded\"\n | \"connection_not_ready\"\n | \"provider_error\"\n | \"service_unavailable\"\n | \"internal_error\"\n | string;\n\nexport class AtribuError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\nexport class AtribuConfigError extends AtribuError {}\n\nexport class AtribuTransportError extends AtribuError {\n readonly cause: unknown;\n constructor(message: string, cause: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\nexport interface ApiErrorBody {\n code: ApiErrorCode;\n message: string;\n status: number;\n request_id?: string;\n}\n\nexport class AtribuApiError extends AtribuError {\n readonly code: ApiErrorCode;\n readonly status: number;\n readonly requestId: string | null;\n readonly retry: RetryHint;\n readonly responseBody: unknown;\n\n constructor(args: {\n code: ApiErrorCode;\n message: string;\n status: number;\n requestId: string | null;\n retry: RetryHint;\n responseBody: unknown;\n }) {\n super(`[${args.code}] ${args.message}`);\n this.code = args.code;\n this.status = args.status;\n this.requestId = args.requestId;\n this.retry = args.retry;\n this.responseBody = args.responseBody;\n }\n\n isRetryable(): boolean {\n return this.retry.action === \"retry\" || this.retry.action === \"retry_after\";\n }\n isAuthFailure(): boolean {\n return this.status === 401 || this.code === \"unauthorized\";\n }\n isRateLimit(): boolean {\n return this.status === 429 || this.code === \"rate_limit_exceeded\";\n }\n}\n\nexport type OauthErrorCode =\n | \"invalid_request\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unauthorized_client\"\n | \"unsupported_grant_type\"\n | \"invalid_scope\"\n | \"server_error\"\n | \"unsupported_token_type\"\n | string;\n\nexport class AtribuOauthError extends AtribuError {\n readonly code: OauthErrorCode;\n readonly status: number;\n readonly description: string | null;\n\n constructor(args: { code: OauthErrorCode; description: string | null; status: number }) {\n super(`[oauth/${args.code}] ${args.description ?? args.code}`);\n this.code = args.code;\n this.status = args.status;\n this.description = args.description;\n }\n}\n\nexport type WebhookErrorCode =\n | \"missing_signature\"\n | \"malformed_header\"\n | \"expired_timestamp\"\n | \"invalid_signature\";\n\nexport class AtribuWebhookError extends AtribuError {\n readonly code: WebhookErrorCode;\n constructor(code: WebhookErrorCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { AtribuConfigError } from \"./errors\";\n\nexport const DEFAULT_BASE_URL = \"https://www.atribu.app\";\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface AtribuClientConfig {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n userAgent?: string;\n defaultIdempotencyKeyGenerator?: () => string;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n fetch: typeof fetch;\n timeoutMs: number;\n userAgentSuffix: string | null;\n generateIdempotencyKey: () => string;\n}\n\nexport function resolveConfig(config: AtribuClientConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new AtribuConfigError(\"apiKey is required\");\n }\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new AtribuConfigError(\n \"globalThis.fetch is not available; pass a `fetch` implementation in config\",\n );\n }\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n return {\n apiKey: config.apiKey,\n baseUrl,\n fetch: fetchImpl,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n userAgentSuffix: config.userAgent ?? null,\n generateIdempotencyKey: config.defaultIdempotencyKeyGenerator ?? defaultUuid,\n };\n}\n\nfunction defaultUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n // Fallback for older runtimes — a v4-ish UUID via Math.random. Not\n // cryptographically strong; idempotency keys don't need to be.\n const hex = \"0123456789abcdef\";\n let out = \"\";\n for (let i = 0; i < 32; i++) {\n const c = Math.floor(Math.random() * 16);\n out += hex[i === 12 ? 4 : i === 16 ? (c & 0x3) | 0x8 : c];\n if (i === 7 || i === 11 || i === 15 || i === 19) out += \"-\";\n }\n return out;\n}\n","/**\n * Retry hints derived from HTTP status + headers.\n *\n * The SDK never retries automatically. It derives a hint and surfaces it on\n * AtribuApiError.retry so consumers' queue systems can decide. Hiding retry\n * logic in the SDK hides backpressure signals.\n */\n\nexport type RetryHint =\n | { action: \"retry\" }\n | { action: \"retry_after\"; retryAfterMs: number }\n | { action: \"refresh_token\" }\n | { action: \"fix_and_retry\" }\n | { action: \"do_not_retry\" };\n\nexport interface DeriveRetryInput {\n status: number;\n retryAfterHeader: string | null;\n errorCode: string | null;\n}\n\nexport function deriveRetryHint(input: DeriveRetryInput): RetryHint {\n const retryAfterMs = parseRetryAfter(input.retryAfterHeader);\n if (retryAfterMs !== null) {\n return { action: \"retry_after\", retryAfterMs };\n }\n if (input.status === 401) return { action: \"refresh_token\" };\n if (input.status === 403 || input.errorCode === \"forbidden\" || input.errorCode === \"insufficient_scope\") {\n return { action: \"do_not_retry\" };\n }\n if (input.status === 408) return { action: \"retry\" };\n if (input.status === 409) return { action: \"fix_and_retry\" };\n if (input.status === 422 || input.errorCode === \"validation_error\" || input.errorCode === \"invalid_content\") {\n return { action: \"fix_and_retry\" };\n }\n if (input.status === 429 || input.errorCode === \"rate_limit_exceeded\") {\n return { action: \"retry_after\", retryAfterMs: 1000 };\n }\n if (input.status >= 500) return { action: \"retry\" };\n if (input.status >= 400) return { action: \"fix_and_retry\" };\n return { action: \"do_not_retry\" };\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const asInt = Number(header);\n if (Number.isFinite(asInt) && asInt >= 0) return Math.round(asInt * 1000);\n const asDate = Date.parse(header);\n if (Number.isFinite(asDate)) return Math.max(0, asDate - Date.now());\n return null;\n}\n","export const SDK_VERSION = \"0.1.1\";\n","export type Runtime = \"node\" | \"bun\" | \"deno\" | \"edge\" | \"browser\" | \"unknown\";\n\ndeclare const Deno: unknown;\ndeclare const Bun: unknown;\ndeclare const EdgeRuntime: unknown;\n\nexport function detectRuntime(): Runtime {\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof EdgeRuntime !== \"undefined\") return \"edge\";\n if (\n typeof process !== \"undefined\" &&\n typeof (process as { versions?: { node?: string } }).versions?.node === \"string\"\n ) {\n return \"node\";\n }\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") return \"browser\";\n return \"unknown\";\n}\n\nexport function runtimeTag(): string {\n const rt = detectRuntime();\n if (rt === \"node\") {\n const v = (process as { versions?: { node?: string } }).versions?.node;\n return v ? `node/${v}` : \"node\";\n }\n return rt;\n}\n","/**\n * HTTP request layer.\n *\n * Single entry point for every API call: handles auth headers, timeout via\n * AbortController, idempotency-key generation, error envelope parsing, and\n * RetryHint derivation. Resources call `request()` and parse `data` from the\n * envelope.\n */\n\nimport {\n AtribuApiError,\n AtribuOauthError,\n AtribuTransportError,\n type ApiErrorBody,\n type ApiErrorCode,\n type OauthErrorCode,\n} from \"./errors\";\nimport { deriveRetryHint } from \"./retry\";\nimport { SDK_VERSION } from \"./version\";\nimport { runtimeTag } from \"./runtime\";\nimport type { ResolvedConfig } from \"./config\";\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\" | \"PUT\";\n path: string;\n query?: Record<string, string | number | boolean | undefined | null>;\n body?: unknown;\n /** Form-urlencoded body (used by /oauth/token, /oauth/revoke). */\n form?: Record<string, string>;\n /** Override the Authorization header (used by /oauth/* with client-credentials). */\n authOverride?: string;\n idempotencyKey?: string;\n signal?: AbortSignal;\n /** When true, parse 200-body as RFC 6749/7009 OAuth response shape. */\n oauthErrorShape?: boolean;\n /** When true, return raw Response without JSON parse (used by 204 / RFC 7009 empty 200). */\n expectEmpty?: boolean;\n /** Extra headers to merge. */\n headers?: Record<string, string>;\n}\n\nexport interface ApiEnvelope<T> {\n data: T;\n meta?: Record<string, unknown>;\n}\n\nconst SDK_UA = `@atribu/node/${SDK_VERSION} (${runtimeTag()})`;\n\n/**\n * Minimum surface a transport needs to be usable by resources. Lets us\n * stack RetryingHttpClient on top of HttpClient without inheritance.\n */\nexport interface HttpClientLike {\n request<T>(opts: RequestOptions): Promise<T>;\n}\n\nexport class HttpClient implements HttpClientLike {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const headers = this.buildHeaders(opts);\n\n let body: BodyInit | undefined;\n if (opts.form) {\n body = new URLSearchParams(opts.form).toString();\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n body = JSON.stringify(opts.body);\n }\n\n const userSignal = opts.signal;\n const timeoutController = new AbortController();\n const timeout = setTimeout(() => timeoutController.abort(), this.cfg.timeoutMs);\n const signal = userSignal ? mergeSignals(userSignal, timeoutController.signal) : timeoutController.signal;\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new AtribuTransportError(`Request aborted (timeout ${this.cfg.timeoutMs}ms)`, err);\n }\n throw new AtribuTransportError(\n err instanceof Error ? err.message : \"fetch failed\",\n err,\n );\n }\n clearTimeout(timeout);\n\n if (opts.expectEmpty && res.ok) {\n return undefined as T;\n }\n\n const requestId = res.headers.get(\"x-request-id\");\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (!res.ok) {\n if (opts.oauthErrorShape) {\n const { code, description } = parseOauthError(parsed);\n throw new AtribuOauthError({ code, description, status: res.status });\n }\n const body = (parsed as { error?: ApiErrorBody } | null)?.error ?? null;\n const code: ApiErrorCode = body?.code ?? `http_${res.status}`;\n const message = body?.message ?? `HTTP ${res.status}`;\n const retry = deriveRetryHint({\n status: res.status,\n retryAfterHeader: res.headers.get(\"retry-after\"),\n errorCode: code,\n });\n throw new AtribuApiError({\n code,\n message,\n status: res.status,\n requestId: requestId ?? body?.request_id ?? null,\n retry,\n responseBody: parsed,\n });\n }\n\n return parsed as T;\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.cfg.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(opts: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.cfg.userAgentSuffix\n ? `${SDK_UA} ${this.cfg.userAgentSuffix}`\n : SDK_UA,\n };\n if (opts.form) {\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n headers[\"Content-Type\"] = \"application/json\";\n }\n headers.Authorization = opts.authOverride ?? `Bearer ${this.cfg.apiKey}`;\n if (mutating(opts.method)) {\n headers[\"Idempotency-Key\"] = opts.idempotencyKey ?? this.cfg.generateIdempotencyKey();\n }\n if (opts.headers) {\n for (const [k, v] of Object.entries(opts.headers)) headers[k] = v;\n }\n return headers;\n }\n}\n\nfunction mutating(method: RequestOptions[\"method\"]): boolean {\n return method === \"POST\" || method === \"PATCH\" || method === \"PUT\" || method === \"DELETE\";\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction parseOauthError(parsed: unknown): { code: OauthErrorCode; description: string | null } {\n if (parsed && typeof parsed === \"object\") {\n const obj = parsed as { error?: unknown; error_description?: unknown };\n const code = typeof obj.error === \"string\" ? obj.error : \"server_error\";\n const description = typeof obj.error_description === \"string\" ? obj.error_description : null;\n return { code, description };\n }\n return { code: \"server_error\", description: null };\n}\n\nfunction mergeSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n if (typeof AbortSignal !== \"undefined\" && \"any\" in AbortSignal) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (AbortSignal as unknown as { any: (s: AbortSignal[]) => AbortSignal }).any([a, b]);\n }\n const c = new AbortController();\n const onA = (): void => c.abort(a.reason);\n const onB = (): void => c.abort(b.reason);\n if (a.aborted) c.abort(a.reason);\n else a.addEventListener(\"abort\", onA, { once: true });\n if (b.aborted) c.abort(b.reason);\n else b.addEventListener(\"abort\", onB, { once: true });\n return c.signal;\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype SendBody = NonNullable<\n paths[\"/api/v1/messages\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype SendResponse =\n paths[\"/api/v1/messages\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type MessageSendInput = SendBody;\nexport type MessageContent = SendBody[\"content\"];\nexport type MessageSendResponse = SendResponse[\"data\"];\n\nexport interface SendOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async send(input: MessageSendInput, opts: SendOptions = {}): Promise<MessageSendResponse> {\n const res = await this.http.request<SendResponse>({\n method: \"POST\",\n path: \"/api/v1/messages\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype PrivateReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/private-reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype ReplyResponse =\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type CommentReplyInput = ReplyBody & { comment_id: string };\nexport type CommentPrivateReplyInput = PrivateReplyBody & { comment_id: string };\nexport type CommentReplyResponse = ReplyResponse[\"data\"];\n\nexport interface CommentReplyOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class CommentsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async reply(\n input: CommentReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async privateReply(\n input: CommentPrivateReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/private-reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ListResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype CreateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype CreateResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"responses\"][201][\"content\"][\"application/json\"];\ntype UpdateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype UpdateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype RotateBody = NonNullable<\n NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"requestBody\"]\n >[\"content\"][\"application/json\"]\n>;\ntype RotateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype TestResponse =\n paths[\"/api/v1/webhooks/test/{id}\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookSubscription = ListResponse[\"data\"][number];\nexport type WebhookSubscriptionWithSecret = CreateResponse[\"data\"];\nexport type WebhookSubscriptionCreateInput = CreateBody;\nexport type WebhookSubscriptionUpdateInput = UpdateBody;\nexport type WebhookSubscriptionRotateOptions = RotateBody;\nexport type WebhookSubscriptionRotateResult = RotateResponse[\"data\"];\nexport type WebhookSubscriptionTestResult = TestResponse[\"data\"];\n\nexport interface MutationOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookSubscriptionsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async list(opts: { signal?: AbortSignal } = {}): Promise<WebhookSubscription[]> {\n const res = await this.http.request<ListResponse>({\n method: \"GET\",\n path: \"/api/v1/webhooks/subscriptions\",\n signal: opts.signal,\n });\n return res.data;\n }\n\n async create(\n input: WebhookSubscriptionCreateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionWithSecret> {\n const res = await this.http.request<CreateResponse>({\n method: \"POST\",\n path: \"/api/v1/webhooks/subscriptions\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async update(\n id: string,\n input: WebhookSubscriptionUpdateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscription> {\n const res = await this.http.request<UpdateResponse>({\n method: \"PATCH\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async delete(id: string, opts: MutationOptions = {}): Promise<void> {\n await this.http.request<void>({\n method: \"DELETE\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n expectEmpty: true,\n });\n }\n\n async rotateSecret(\n id: string,\n options: WebhookSubscriptionRotateOptions = {},\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionRotateResult> {\n const res = await this.http.request<RotateResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}/rotate-secret`,\n body: options,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async test(\n id: string,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionTestResult> {\n const res = await this.http.request<TestResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/test/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplayResponse =\n paths[\"/api/v1/webhooks/deliveries/{id}/replay\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookDeliveryReplayResult = ReplayResponse[\"data\"];\n\nexport interface ReplayOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookDeliveriesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async replay(id: string, opts: ReplayOptions = {}): Promise<WebhookDeliveryReplayResult> {\n const res = await this.http.request<ReplayResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/deliveries/${encodeURIComponent(id)}/replay`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","/**\n * Opt-in retry layer.\n *\n * Why opt-in: hiding retries inside the SDK by default obscures backpressure\n * signals and amplifies load on a failing server. Consumers that want them\n * call `.withRetry({...})`; others write their own retry logic against the\n * typed `retry` hint on AtribuApiError.\n *\n * What gets retried:\n * - `AtribuApiError` with `retry.action === \"retry\"` (5xx, 408)\n * - `AtribuApiError` with `retry.action === \"retry_after\"` (429, 503 w/\n * Retry-After) — honors retryAfterMs\n * - `AtribuTransportError` (network glitches, ECONNRESET, timeouts)\n *\n * What does NOT retry:\n * - `AtribuApiError` with `retry.action === \"do_not_retry\"` (403)\n * - `AtribuApiError` with `retry.action === \"fix_and_retry\"` (422 etc — the\n * caller's input is wrong; retrying with the same body won't help)\n * - `AtribuApiError` with `retry.action === \"refresh_token\"` (401 — needs\n * credential refresh, not a retry)\n * - `AtribuConfigError`, `AtribuWebhookError`, anything else\n */\n\nimport {\n AtribuApiError,\n AtribuTransportError,\n type AtribuError,\n} from \"./errors\";\nimport type { HttpClientLike, RequestOptions } from \"./http\";\n\nexport type BackoffStrategy = \"exponential\" | \"fixed\" | \"none\";\n\nexport interface RetryOptions {\n /**\n * Max attempts including the initial call. `maxAttempts: 3` = initial + 2\n * retries. Must be ≥ 1. Default 3.\n */\n maxAttempts?: number;\n /**\n * Backoff strategy between retries. \"exponential\" = `baseDelayMs * 2^n`\n * (capped by `maxDelayMs`). \"fixed\" = `baseDelayMs`. \"none\" = no delay.\n * Default \"exponential\".\n */\n backoff?: BackoffStrategy;\n /** Base delay between retries in ms. Default 500. */\n baseDelayMs?: number;\n /** Cap on the delay between retries. Default 30000 (30s). */\n maxDelayMs?: number;\n /**\n * Jitter factor 0..1. Multiplies the computed delay by `1 + random*jitter`\n * (jitter=0 means deterministic). Default 0.3.\n */\n jitter?: number;\n /** Inject for tests. Default `(ms) => new Promise(r => setTimeout(r, ms))`. */\n sleep?: (ms: number) => Promise<void>;\n /** Inject for jitter tests. Default Math.random. */\n random?: () => number;\n}\n\ninterface ResolvedRetry {\n maxAttempts: number;\n backoff: BackoffStrategy;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: number;\n sleep: (ms: number) => Promise<void>;\n random: () => number;\n}\n\nfunction resolveRetry(o: RetryOptions): ResolvedRetry {\n return {\n maxAttempts: Math.max(1, o.maxAttempts ?? 3),\n backoff: o.backoff ?? \"exponential\",\n baseDelayMs: Math.max(0, o.baseDelayMs ?? 500),\n maxDelayMs: Math.max(0, o.maxDelayMs ?? 30_000),\n jitter: Math.min(1, Math.max(0, o.jitter ?? 0.3)),\n sleep: o.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))),\n random: o.random ?? Math.random,\n };\n}\n\nexport class RetryingHttpClient implements HttpClientLike {\n private readonly r: ResolvedRetry;\n constructor(private readonly base: HttpClientLike, options: RetryOptions) {\n this.r = resolveRetry(options);\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 1; attempt <= this.r.maxAttempts; attempt++) {\n try {\n return await this.base.request<T>(opts);\n } catch (err) {\n lastErr = err;\n if (attempt >= this.r.maxAttempts) throw err;\n const delay = this.computeDelay(err, attempt);\n if (delay === null) throw err; // non-retryable\n if (delay > 0) await this.r.sleep(delay);\n }\n }\n throw lastErr; // unreachable\n }\n\n /**\n * Returns the delay in ms before the next attempt, or null if the error\n * is non-retryable (caller should throw immediately).\n */\n private computeDelay(err: unknown, attempt: number): number | null {\n // Transport errors (network glitches, timeouts) → backoff-based retry\n if (err instanceof AtribuTransportError) {\n return this.applyJitter(this.backoffDelay(attempt));\n }\n if (err instanceof AtribuApiError) {\n const action = err.retry.action;\n if (action === \"retry\") return this.applyJitter(this.backoffDelay(attempt));\n if (action === \"retry_after\") {\n // Honor the server's instruction exactly (no jitter on this one).\n const capped = Math.min(err.retry.retryAfterMs, this.r.maxDelayMs);\n return Math.max(0, capped);\n }\n // do_not_retry / fix_and_retry / refresh_token — caller must handle\n return null;\n }\n return null;\n }\n\n private backoffDelay(attempt: number): number {\n if (this.r.backoff === \"none\") return 0;\n if (this.r.backoff === \"fixed\") return this.r.baseDelayMs;\n // exponential: base * 2^(attempt-1), capped at maxDelayMs\n const raw = this.r.baseDelayMs * Math.pow(2, attempt - 1);\n return Math.min(raw, this.r.maxDelayMs);\n }\n\n private applyJitter(delay: number): number {\n if (this.r.jitter === 0) return delay;\n return Math.round(delay * (1 + this.r.random() * this.r.jitter));\n }\n}\n\nexport function isRetryableError(err: unknown): err is AtribuError {\n if (err instanceof AtribuTransportError) return true;\n if (err instanceof AtribuApiError) {\n return err.retry.action === \"retry\" || err.retry.action === \"retry_after\";\n }\n return false;\n}\n","import { resolveConfig, type AtribuClientConfig } from \"./config\";\nimport { HttpClient, type HttpClientLike } from \"./http\";\nimport { MessagesResource } from \"./resources/messages\";\nimport { CommentsResource } from \"./resources/comments\";\nimport { WebhookSubscriptionsResource } from \"./resources/webhook-subscriptions\";\nimport { WebhookDeliveriesResource } from \"./resources/webhook-deliveries\";\nimport { RetryingHttpClient, type RetryOptions } from \"./retry-wrapper\";\n\ninterface ResourceBundle {\n messages: MessagesResource;\n comments: CommentsResource;\n webhooks: {\n subscriptions: WebhookSubscriptionsResource;\n deliveries: WebhookDeliveriesResource;\n };\n}\n\nfunction buildResources(http: HttpClientLike): ResourceBundle {\n return {\n messages: new MessagesResource(http),\n comments: new CommentsResource(http),\n webhooks: {\n subscriptions: new WebhookSubscriptionsResource(http),\n deliveries: new WebhookDeliveriesResource(http),\n },\n };\n}\n\nexport class AtribuClient {\n readonly messages: MessagesResource;\n readonly comments: CommentsResource;\n readonly webhooks: ResourceBundle[\"webhooks\"];\n\n /** @internal — exposed for `withRetry` chaining; do not depend on this. */\n protected readonly _http: HttpClientLike;\n\n constructor(config: AtribuClientConfig) {\n this._http = new HttpClient(resolveConfig(config));\n const r = buildResources(this._http);\n this.messages = r.messages;\n this.comments = r.comments;\n this.webhooks = r.webhooks;\n }\n\n /**\n * Returns a new AtribuClient that retries on transient errors. The\n * original client is not mutated. The wrapper respects the typed\n * `retry` hint on AtribuApiError — `do_not_retry`, `fix_and_retry`,\n * and `refresh_token` are NOT retried (those need caller action, not\n * a repeat call).\n *\n * @example\n * const client = new AtribuClient({...}).withRetry({\n * maxAttempts: 3,\n * backoff: \"exponential\",\n * baseDelayMs: 500,\n * });\n * await client.messages.send({...});\n */\n withRetry(options: RetryOptions): AtribuClient {\n const wrapped = new RetryingHttpClient(this._http, options);\n return AtribuClient._fromHttp(wrapped);\n }\n\n private static _fromHttp(http: HttpClientLike): AtribuClient {\n const proto = Object.create(AtribuClient.prototype) as object;\n const r = buildResources(http);\n Object.assign(proto, {\n _http: http,\n messages: r.messages,\n comments: r.comments,\n webhooks: r.webhooks,\n });\n return proto as AtribuClient;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/retry.ts","../src/version.ts","../src/runtime.ts","../src/http.ts","../src/resources/messages.ts","../src/resources/comments.ts","../src/resources/webhook-subscriptions.ts","../src/resources/webhook-deliveries.ts","../src/retry-wrapper.ts","../src/client.ts"],"names":["code","body"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Atribu error class hierarchy.\n *\n * Why typed errors: consumers need to branch on auth-failure vs rate-limit vs\n * server-error vs validation-error to decide whether to retry, refresh\n * credentials, or surface to the user. A single `Error` with a status code\n * forces every consumer to write the same `if (err.status === 401)` ladder.\n *\n * Why no automatic retries: the SDK derives a `retry` hint from status +\n * Retry-After + error code, but consumers' queue/job systems decide whether\n * to act on it. Auto-retry inside the SDK hides backpressure signals and\n * makes error budgets opaque.\n */\n\nimport type { RetryHint } from \"./retry\";\n\nexport type ApiErrorCode =\n | \"unauthorized\"\n | \"forbidden\"\n | \"insufficient_scope\"\n | \"not_found\"\n | \"invalid_parameter\"\n | \"invalid_request\"\n | \"validation_error\"\n | \"invalid_content\"\n | \"invalid_date_range\"\n | \"rate_limit_exceeded\"\n | \"connection_not_ready\"\n | \"provider_error\"\n | \"service_unavailable\"\n | \"internal_error\"\n | string;\n\nexport class AtribuError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\nexport class AtribuConfigError extends AtribuError {}\n\nexport class AtribuTransportError extends AtribuError {\n readonly cause: unknown;\n constructor(message: string, cause: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\nexport interface ApiErrorBody {\n code: ApiErrorCode;\n message: string;\n status: number;\n request_id?: string;\n}\n\nexport class AtribuApiError extends AtribuError {\n readonly code: ApiErrorCode;\n readonly status: number;\n readonly requestId: string | null;\n readonly retry: RetryHint;\n readonly responseBody: unknown;\n\n constructor(args: {\n code: ApiErrorCode;\n message: string;\n status: number;\n requestId: string | null;\n retry: RetryHint;\n responseBody: unknown;\n }) {\n super(`[${args.code}] ${args.message}`);\n this.code = args.code;\n this.status = args.status;\n this.requestId = args.requestId;\n this.retry = args.retry;\n this.responseBody = args.responseBody;\n }\n\n isRetryable(): boolean {\n return this.retry.action === \"retry\" || this.retry.action === \"retry_after\";\n }\n isAuthFailure(): boolean {\n return this.status === 401 || this.code === \"unauthorized\";\n }\n isRateLimit(): boolean {\n return this.status === 429 || this.code === \"rate_limit_exceeded\";\n }\n}\n\nexport type OauthErrorCode =\n | \"invalid_request\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unauthorized_client\"\n | \"unsupported_grant_type\"\n | \"invalid_scope\"\n | \"server_error\"\n | \"unsupported_token_type\"\n | string;\n\nexport class AtribuOauthError extends AtribuError {\n readonly code: OauthErrorCode;\n readonly status: number;\n readonly description: string | null;\n\n constructor(args: { code: OauthErrorCode; description: string | null; status: number }) {\n super(`[oauth/${args.code}] ${args.description ?? args.code}`);\n this.code = args.code;\n this.status = args.status;\n this.description = args.description;\n }\n}\n\nexport type WebhookErrorCode =\n | \"missing_signature\"\n | \"malformed_header\"\n | \"expired_timestamp\"\n | \"invalid_signature\";\n\nexport class AtribuWebhookError extends AtribuError {\n readonly code: WebhookErrorCode;\n constructor(code: WebhookErrorCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { AtribuConfigError } from \"./errors\";\n\nexport const DEFAULT_BASE_URL = \"https://www.atribu.app\";\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface AtribuClientConfig {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n userAgent?: string;\n defaultIdempotencyKeyGenerator?: () => string;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n fetch: typeof fetch;\n timeoutMs: number;\n userAgentSuffix: string | null;\n generateIdempotencyKey: () => string;\n}\n\nexport function resolveConfig(config: AtribuClientConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new AtribuConfigError(\"apiKey is required\");\n }\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new AtribuConfigError(\n \"globalThis.fetch is not available; pass a `fetch` implementation in config\",\n );\n }\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n return {\n apiKey: config.apiKey,\n baseUrl,\n fetch: fetchImpl,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n userAgentSuffix: config.userAgent ?? null,\n generateIdempotencyKey: config.defaultIdempotencyKeyGenerator ?? defaultUuid,\n };\n}\n\nfunction defaultUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n // Fallback for older runtimes — a v4-ish UUID via Math.random. Not\n // cryptographically strong; idempotency keys don't need to be.\n const hex = \"0123456789abcdef\";\n let out = \"\";\n for (let i = 0; i < 32; i++) {\n const c = Math.floor(Math.random() * 16);\n out += hex[i === 12 ? 4 : i === 16 ? (c & 0x3) | 0x8 : c];\n if (i === 7 || i === 11 || i === 15 || i === 19) out += \"-\";\n }\n return out;\n}\n","/**\n * Retry hints derived from HTTP status + headers.\n *\n * The SDK never retries automatically. It derives a hint and surfaces it on\n * AtribuApiError.retry so consumers' queue systems can decide. Hiding retry\n * logic in the SDK hides backpressure signals.\n */\n\nexport type RetryHint =\n | { action: \"retry\" }\n | { action: \"retry_after\"; retryAfterMs: number }\n | { action: \"refresh_token\" }\n | { action: \"fix_and_retry\" }\n | { action: \"do_not_retry\" };\n\nexport interface DeriveRetryInput {\n status: number;\n retryAfterHeader: string | null;\n errorCode: string | null;\n}\n\nexport function deriveRetryHint(input: DeriveRetryInput): RetryHint {\n const retryAfterMs = parseRetryAfter(input.retryAfterHeader);\n if (retryAfterMs !== null) {\n return { action: \"retry_after\", retryAfterMs };\n }\n if (input.status === 401) return { action: \"refresh_token\" };\n if (input.status === 403 || input.errorCode === \"forbidden\" || input.errorCode === \"insufficient_scope\") {\n return { action: \"do_not_retry\" };\n }\n if (input.status === 408) return { action: \"retry\" };\n if (input.status === 409) return { action: \"fix_and_retry\" };\n if (input.status === 422 || input.errorCode === \"validation_error\" || input.errorCode === \"invalid_content\") {\n return { action: \"fix_and_retry\" };\n }\n if (input.status === 429 || input.errorCode === \"rate_limit_exceeded\") {\n return { action: \"retry_after\", retryAfterMs: 1000 };\n }\n if (input.status >= 500) return { action: \"retry\" };\n if (input.status >= 400) return { action: \"fix_and_retry\" };\n return { action: \"do_not_retry\" };\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const asInt = Number(header);\n if (Number.isFinite(asInt) && asInt >= 0) return Math.round(asInt * 1000);\n const asDate = Date.parse(header);\n if (Number.isFinite(asDate)) return Math.max(0, asDate - Date.now());\n return null;\n}\n","export const SDK_VERSION = \"0.1.4\";\n","export type Runtime = \"node\" | \"bun\" | \"deno\" | \"edge\" | \"browser\" | \"unknown\";\n\ndeclare const Deno: unknown;\ndeclare const Bun: unknown;\ndeclare const EdgeRuntime: unknown;\n\nexport function detectRuntime(): Runtime {\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof EdgeRuntime !== \"undefined\") return \"edge\";\n if (\n typeof process !== \"undefined\" &&\n typeof (process as { versions?: { node?: string } }).versions?.node === \"string\"\n ) {\n return \"node\";\n }\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") return \"browser\";\n return \"unknown\";\n}\n\nexport function runtimeTag(): string {\n const rt = detectRuntime();\n if (rt === \"node\") {\n const v = (process as { versions?: { node?: string } }).versions?.node;\n return v ? `node/${v}` : \"node\";\n }\n return rt;\n}\n","/**\n * HTTP request layer.\n *\n * Single entry point for every API call: handles auth headers, timeout via\n * AbortController, idempotency-key generation, error envelope parsing, and\n * RetryHint derivation. Resources call `request()` and parse `data` from the\n * envelope.\n */\n\nimport {\n AtribuApiError,\n AtribuOauthError,\n AtribuTransportError,\n type ApiErrorBody,\n type ApiErrorCode,\n type OauthErrorCode,\n} from \"./errors\";\nimport { deriveRetryHint } from \"./retry\";\nimport { SDK_VERSION } from \"./version\";\nimport { runtimeTag } from \"./runtime\";\nimport type { ResolvedConfig } from \"./config\";\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\" | \"PUT\";\n path: string;\n query?: Record<string, string | number | boolean | undefined | null>;\n body?: unknown;\n /** Form-urlencoded body (used by /oauth/token, /oauth/revoke). */\n form?: Record<string, string>;\n /** Override the Authorization header (used by /oauth/* with client-credentials). */\n authOverride?: string;\n idempotencyKey?: string;\n signal?: AbortSignal;\n /** When true, parse 200-body as RFC 6749/7009 OAuth response shape. */\n oauthErrorShape?: boolean;\n /** When true, return raw Response without JSON parse (used by 204 / RFC 7009 empty 200). */\n expectEmpty?: boolean;\n /** Extra headers to merge. */\n headers?: Record<string, string>;\n}\n\nexport interface ApiEnvelope<T> {\n data: T;\n meta?: Record<string, unknown>;\n}\n\nconst SDK_UA = `@atribu/node/${SDK_VERSION} (${runtimeTag()})`;\n\n/**\n * Minimum surface a transport needs to be usable by resources. Lets us\n * stack RetryingHttpClient on top of HttpClient without inheritance.\n */\nexport interface HttpClientLike {\n request<T>(opts: RequestOptions): Promise<T>;\n}\n\nexport class HttpClient implements HttpClientLike {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const headers = this.buildHeaders(opts);\n\n let body: BodyInit | undefined;\n if (opts.form) {\n body = new URLSearchParams(opts.form).toString();\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n body = JSON.stringify(opts.body);\n }\n\n const userSignal = opts.signal;\n const timeoutController = new AbortController();\n const timeout = setTimeout(() => timeoutController.abort(), this.cfg.timeoutMs);\n const signal = userSignal ? mergeSignals(userSignal, timeoutController.signal) : timeoutController.signal;\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new AtribuTransportError(`Request aborted (timeout ${this.cfg.timeoutMs}ms)`, err);\n }\n throw new AtribuTransportError(\n err instanceof Error ? err.message : \"fetch failed\",\n err,\n );\n }\n clearTimeout(timeout);\n\n if (opts.expectEmpty && res.ok) {\n return undefined as T;\n }\n\n const requestId = res.headers.get(\"x-request-id\");\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (!res.ok) {\n if (opts.oauthErrorShape) {\n const { code, description } = parseOauthError(parsed);\n throw new AtribuOauthError({ code, description, status: res.status });\n }\n const body = (parsed as { error?: ApiErrorBody } | null)?.error ?? null;\n const code: ApiErrorCode = body?.code ?? `http_${res.status}`;\n const message = body?.message ?? `HTTP ${res.status}`;\n const retry = deriveRetryHint({\n status: res.status,\n retryAfterHeader: res.headers.get(\"retry-after\"),\n errorCode: code,\n });\n throw new AtribuApiError({\n code,\n message,\n status: res.status,\n requestId: requestId ?? body?.request_id ?? null,\n retry,\n responseBody: parsed,\n });\n }\n\n return parsed as T;\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.cfg.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(opts: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.cfg.userAgentSuffix\n ? `${SDK_UA} ${this.cfg.userAgentSuffix}`\n : SDK_UA,\n };\n if (opts.form) {\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n headers[\"Content-Type\"] = \"application/json\";\n }\n headers.Authorization = opts.authOverride ?? `Bearer ${this.cfg.apiKey}`;\n if (mutating(opts.method)) {\n headers[\"Idempotency-Key\"] = opts.idempotencyKey ?? this.cfg.generateIdempotencyKey();\n }\n if (opts.headers) {\n for (const [k, v] of Object.entries(opts.headers)) headers[k] = v;\n }\n return headers;\n }\n}\n\nfunction mutating(method: RequestOptions[\"method\"]): boolean {\n return method === \"POST\" || method === \"PATCH\" || method === \"PUT\" || method === \"DELETE\";\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction parseOauthError(parsed: unknown): { code: OauthErrorCode; description: string | null } {\n if (parsed && typeof parsed === \"object\") {\n const obj = parsed as { error?: unknown; error_description?: unknown };\n const code = typeof obj.error === \"string\" ? obj.error : \"server_error\";\n const description = typeof obj.error_description === \"string\" ? obj.error_description : null;\n return { code, description };\n }\n return { code: \"server_error\", description: null };\n}\n\nfunction mergeSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n if (typeof AbortSignal !== \"undefined\" && \"any\" in AbortSignal) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (AbortSignal as unknown as { any: (s: AbortSignal[]) => AbortSignal }).any([a, b]);\n }\n const c = new AbortController();\n const onA = (): void => c.abort(a.reason);\n const onB = (): void => c.abort(b.reason);\n if (a.aborted) c.abort(a.reason);\n else a.addEventListener(\"abort\", onA, { once: true });\n if (b.aborted) c.abort(b.reason);\n else b.addEventListener(\"abort\", onB, { once: true });\n return c.signal;\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype SendBody = NonNullable<\n paths[\"/api/v1/messages\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype SendResponse =\n paths[\"/api/v1/messages\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type MessageSendInput = SendBody;\nexport type MessageContent = SendBody[\"content\"];\nexport type MessageSendResponse = SendResponse[\"data\"];\n\nexport interface SendOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async send(input: MessageSendInput, opts: SendOptions = {}): Promise<MessageSendResponse> {\n const res = await this.http.request<SendResponse>({\n method: \"POST\",\n path: \"/api/v1/messages\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype PrivateReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/private-reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype ReplyResponse =\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type CommentReplyInput = ReplyBody & { comment_id: string };\nexport type CommentPrivateReplyInput = PrivateReplyBody & { comment_id: string };\nexport type CommentReplyResponse = ReplyResponse[\"data\"];\n\nexport interface CommentReplyOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class CommentsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async reply(\n input: CommentReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async privateReply(\n input: CommentPrivateReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/private-reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ListResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype CreateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype CreateResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"responses\"][201][\"content\"][\"application/json\"];\ntype UpdateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype UpdateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype RotateBody = NonNullable<\n NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"requestBody\"]\n >[\"content\"][\"application/json\"]\n>;\ntype RotateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype TestResponse =\n paths[\"/api/v1/webhooks/test/{id}\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookSubscription = ListResponse[\"data\"][number];\nexport type WebhookSubscriptionWithSecret = CreateResponse[\"data\"];\nexport type WebhookSubscriptionCreateInput = CreateBody;\nexport type WebhookSubscriptionUpdateInput = UpdateBody;\nexport type WebhookSubscriptionRotateOptions = RotateBody;\nexport type WebhookSubscriptionRotateResult = RotateResponse[\"data\"];\nexport type WebhookSubscriptionTestResult = TestResponse[\"data\"];\n\nexport interface MutationOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookSubscriptionsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async list(opts: { signal?: AbortSignal } = {}): Promise<WebhookSubscription[]> {\n const res = await this.http.request<ListResponse>({\n method: \"GET\",\n path: \"/api/v1/webhooks/subscriptions\",\n signal: opts.signal,\n });\n return res.data;\n }\n\n async create(\n input: WebhookSubscriptionCreateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionWithSecret> {\n const res = await this.http.request<CreateResponse>({\n method: \"POST\",\n path: \"/api/v1/webhooks/subscriptions\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async update(\n id: string,\n input: WebhookSubscriptionUpdateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscription> {\n const res = await this.http.request<UpdateResponse>({\n method: \"PATCH\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async delete(id: string, opts: MutationOptions = {}): Promise<void> {\n await this.http.request<void>({\n method: \"DELETE\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n expectEmpty: true,\n });\n }\n\n async rotateSecret(\n id: string,\n options: WebhookSubscriptionRotateOptions = {},\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionRotateResult> {\n const res = await this.http.request<RotateResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}/rotate-secret`,\n body: options,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async test(\n id: string,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionTestResult> {\n const res = await this.http.request<TestResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/test/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplayResponse =\n paths[\"/api/v1/webhooks/deliveries/{id}/replay\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookDeliveryReplayResult = ReplayResponse[\"data\"];\n\nexport interface ReplayOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookDeliveriesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async replay(id: string, opts: ReplayOptions = {}): Promise<WebhookDeliveryReplayResult> {\n const res = await this.http.request<ReplayResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/deliveries/${encodeURIComponent(id)}/replay`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","/**\n * Opt-in retry layer.\n *\n * Why opt-in: hiding retries inside the SDK by default obscures backpressure\n * signals and amplifies load on a failing server. Consumers that want them\n * call `.withRetry({...})`; others write their own retry logic against the\n * typed `retry` hint on AtribuApiError.\n *\n * What gets retried:\n * - `AtribuApiError` with `retry.action === \"retry\"` (5xx, 408)\n * - `AtribuApiError` with `retry.action === \"retry_after\"` (429, 503 w/\n * Retry-After) — honors retryAfterMs\n * - `AtribuTransportError` (network glitches, ECONNRESET, timeouts)\n *\n * What does NOT retry:\n * - `AtribuApiError` with `retry.action === \"do_not_retry\"` (403)\n * - `AtribuApiError` with `retry.action === \"fix_and_retry\"` (422 etc — the\n * caller's input is wrong; retrying with the same body won't help)\n * - `AtribuApiError` with `retry.action === \"refresh_token\"` (401 — needs\n * credential refresh, not a retry)\n * - `AtribuConfigError`, `AtribuWebhookError`, anything else\n */\n\nimport {\n AtribuApiError,\n AtribuTransportError,\n type AtribuError,\n} from \"./errors\";\nimport type { HttpClientLike, RequestOptions } from \"./http\";\n\nexport type BackoffStrategy = \"exponential\" | \"fixed\" | \"none\";\n\nexport interface RetryOptions {\n /**\n * Max attempts including the initial call. `maxAttempts: 3` = initial + 2\n * retries. Must be ≥ 1. Default 3.\n */\n maxAttempts?: number;\n /**\n * Backoff strategy between retries. \"exponential\" = `baseDelayMs * 2^n`\n * (capped by `maxDelayMs`). \"fixed\" = `baseDelayMs`. \"none\" = no delay.\n * Default \"exponential\".\n */\n backoff?: BackoffStrategy;\n /** Base delay between retries in ms. Default 500. */\n baseDelayMs?: number;\n /** Cap on the delay between retries. Default 30000 (30s). */\n maxDelayMs?: number;\n /**\n * Jitter factor 0..1. Multiplies the computed delay by `1 + random*jitter`\n * (jitter=0 means deterministic). Default 0.3.\n */\n jitter?: number;\n /** Inject for tests. Default `(ms) => new Promise(r => setTimeout(r, ms))`. */\n sleep?: (ms: number) => Promise<void>;\n /** Inject for jitter tests. Default Math.random. */\n random?: () => number;\n}\n\ninterface ResolvedRetry {\n maxAttempts: number;\n backoff: BackoffStrategy;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: number;\n sleep: (ms: number) => Promise<void>;\n random: () => number;\n}\n\nfunction resolveRetry(o: RetryOptions): ResolvedRetry {\n return {\n maxAttempts: Math.max(1, o.maxAttempts ?? 3),\n backoff: o.backoff ?? \"exponential\",\n baseDelayMs: Math.max(0, o.baseDelayMs ?? 500),\n maxDelayMs: Math.max(0, o.maxDelayMs ?? 30_000),\n jitter: Math.min(1, Math.max(0, o.jitter ?? 0.3)),\n sleep: o.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))),\n random: o.random ?? Math.random,\n };\n}\n\nexport class RetryingHttpClient implements HttpClientLike {\n private readonly r: ResolvedRetry;\n constructor(private readonly base: HttpClientLike, options: RetryOptions) {\n this.r = resolveRetry(options);\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 1; attempt <= this.r.maxAttempts; attempt++) {\n try {\n return await this.base.request<T>(opts);\n } catch (err) {\n lastErr = err;\n if (attempt >= this.r.maxAttempts) throw err;\n const delay = this.computeDelay(err, attempt);\n if (delay === null) throw err; // non-retryable\n if (delay > 0) await this.r.sleep(delay);\n }\n }\n throw lastErr; // unreachable\n }\n\n /**\n * Returns the delay in ms before the next attempt, or null if the error\n * is non-retryable (caller should throw immediately).\n */\n private computeDelay(err: unknown, attempt: number): number | null {\n // Transport errors (network glitches, timeouts) → backoff-based retry\n if (err instanceof AtribuTransportError) {\n return this.applyJitter(this.backoffDelay(attempt));\n }\n if (err instanceof AtribuApiError) {\n const action = err.retry.action;\n if (action === \"retry\") return this.applyJitter(this.backoffDelay(attempt));\n if (action === \"retry_after\") {\n // Honor the server's instruction exactly (no jitter on this one).\n const capped = Math.min(err.retry.retryAfterMs, this.r.maxDelayMs);\n return Math.max(0, capped);\n }\n // do_not_retry / fix_and_retry / refresh_token — caller must handle\n return null;\n }\n return null;\n }\n\n private backoffDelay(attempt: number): number {\n if (this.r.backoff === \"none\") return 0;\n if (this.r.backoff === \"fixed\") return this.r.baseDelayMs;\n // exponential: base * 2^(attempt-1), capped at maxDelayMs\n const raw = this.r.baseDelayMs * Math.pow(2, attempt - 1);\n return Math.min(raw, this.r.maxDelayMs);\n }\n\n private applyJitter(delay: number): number {\n if (this.r.jitter === 0) return delay;\n return Math.round(delay * (1 + this.r.random() * this.r.jitter));\n }\n}\n\nexport function isRetryableError(err: unknown): err is AtribuError {\n if (err instanceof AtribuTransportError) return true;\n if (err instanceof AtribuApiError) {\n return err.retry.action === \"retry\" || err.retry.action === \"retry_after\";\n }\n return false;\n}\n","import { resolveConfig, type AtribuClientConfig } from \"./config\";\nimport { HttpClient, type HttpClientLike } from \"./http\";\nimport { MessagesResource } from \"./resources/messages\";\nimport { CommentsResource } from \"./resources/comments\";\nimport { WebhookSubscriptionsResource } from \"./resources/webhook-subscriptions\";\nimport { WebhookDeliveriesResource } from \"./resources/webhook-deliveries\";\nimport { RetryingHttpClient, type RetryOptions } from \"./retry-wrapper\";\n\ninterface ResourceBundle {\n messages: MessagesResource;\n comments: CommentsResource;\n webhooks: {\n subscriptions: WebhookSubscriptionsResource;\n deliveries: WebhookDeliveriesResource;\n };\n}\n\nfunction buildResources(http: HttpClientLike): ResourceBundle {\n return {\n messages: new MessagesResource(http),\n comments: new CommentsResource(http),\n webhooks: {\n subscriptions: new WebhookSubscriptionsResource(http),\n deliveries: new WebhookDeliveriesResource(http),\n },\n };\n}\n\nexport class AtribuClient {\n readonly messages: MessagesResource;\n readonly comments: CommentsResource;\n readonly webhooks: ResourceBundle[\"webhooks\"];\n\n /** @internal — exposed for `withRetry` chaining; do not depend on this. */\n protected readonly _http: HttpClientLike;\n\n constructor(config: AtribuClientConfig) {\n this._http = new HttpClient(resolveConfig(config));\n const r = buildResources(this._http);\n this.messages = r.messages;\n this.comments = r.comments;\n this.webhooks = r.webhooks;\n }\n\n /**\n * Returns a new AtribuClient that retries on transient errors. The\n * original client is not mutated. The wrapper respects the typed\n * `retry` hint on AtribuApiError — `do_not_retry`, `fix_and_retry`,\n * and `refresh_token` are NOT retried (those need caller action, not\n * a repeat call).\n *\n * @example\n * const client = new AtribuClient({...}).withRetry({\n * maxAttempts: 3,\n * backoff: \"exponential\",\n * baseDelayMs: 500,\n * });\n * await client.messages.send({...});\n */\n withRetry(options: RetryOptions): AtribuClient {\n const wrapped = new RetryingHttpClient(this._http, options);\n return AtribuClient._fromHttp(wrapped);\n }\n\n private static _fromHttp(http: HttpClientLike): AtribuClient {\n const proto = Object.create(AtribuClient.prototype) as object;\n const r = buildResources(http);\n Object.assign(proto, {\n _http: http,\n messages: r.messages,\n comments: r.comments,\n webhooks: r.webhooks,\n });\n return proto as AtribuClient;\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { H as HttpClientLike, p as paths, R as RequestOptions } from './api.d-BXINTQo6.cjs';
2
- import { A as AtribuError } from './errors-D3ApBz8J.cjs';
3
- export { a as ApiErrorBody, b as ApiErrorCode, c as AtribuApiError, d as AtribuConfigError, e as AtribuOauthError, f as AtribuTransportError, g as AtribuWebhookError, O as OauthErrorCode, R as RetryHint, W as WebhookErrorCode } from './errors-D3ApBz8J.cjs';
2
+ import { d as AtribuError } from './errors-BLELoojK.cjs';
3
+ export { A as ApiErrorBody, a as ApiErrorCode, b as AtribuApiError, c as AtribuConfigError, e as AtribuOauthError, f as AtribuTransportError, g as AtribuWebhookError, O as OauthErrorCode, R as RetryHint, W as WebhookErrorCode } from './errors-BLELoojK.cjs';
4
4
 
5
5
  interface AtribuClientConfig {
6
6
  apiKey: string;
@@ -189,7 +189,7 @@ declare class AtribuClient {
189
189
  private static _fromHttp;
190
190
  }
191
191
 
192
- declare const SDK_VERSION = "0.1.1";
192
+ declare const SDK_VERSION = "0.1.4";
193
193
 
194
194
  type Runtime = "node" | "bun" | "deno" | "edge" | "browser" | "unknown";
195
195
  declare function detectRuntime(): Runtime;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { H as HttpClientLike, p as paths, R as RequestOptions } from './api.d-BXINTQo6.js';
2
- import { A as AtribuError } from './errors-D3ApBz8J.js';
3
- export { a as ApiErrorBody, b as ApiErrorCode, c as AtribuApiError, d as AtribuConfigError, e as AtribuOauthError, f as AtribuTransportError, g as AtribuWebhookError, O as OauthErrorCode, R as RetryHint, W as WebhookErrorCode } from './errors-D3ApBz8J.js';
2
+ import { d as AtribuError } from './errors-BLELoojK.js';
3
+ export { A as ApiErrorBody, a as ApiErrorCode, b as AtribuApiError, c as AtribuConfigError, e as AtribuOauthError, f as AtribuTransportError, g as AtribuWebhookError, O as OauthErrorCode, R as RetryHint, W as WebhookErrorCode } from './errors-BLELoojK.js';
4
4
 
5
5
  interface AtribuClientConfig {
6
6
  apiKey: string;
@@ -189,7 +189,7 @@ declare class AtribuClient {
189
189
  private static _fromHttp;
190
190
  }
191
191
 
192
- declare const SDK_VERSION = "0.1.1";
192
+ declare const SDK_VERSION = "0.1.4";
193
193
 
194
194
  type Runtime = "node" | "bun" | "deno" | "edge" | "browser" | "unknown";
195
195
  declare function detectRuntime(): Runtime;
package/dist/index.js CHANGED
@@ -126,7 +126,7 @@ function parseRetryAfter(header) {
126
126
  }
127
127
 
128
128
  // src/version.ts
129
- var SDK_VERSION = "0.1.1";
129
+ var SDK_VERSION = "0.1.4";
130
130
 
131
131
  // src/runtime.ts
132
132
  function detectRuntime() {
@@ -154,6 +154,7 @@ var HttpClient = class {
154
154
  constructor(cfg) {
155
155
  this.cfg = cfg;
156
156
  }
157
+ cfg;
157
158
  async request(opts) {
158
159
  const url = this.buildUrl(opts.path, opts.query);
159
160
  const headers = this.buildHeaders(opts);
@@ -284,6 +285,7 @@ var MessagesResource = class {
284
285
  constructor(http) {
285
286
  this.http = http;
286
287
  }
288
+ http;
287
289
  async send(input, opts = {}) {
288
290
  const res = await this.http.request({
289
291
  method: "POST",
@@ -301,6 +303,7 @@ var CommentsResource = class {
301
303
  constructor(http) {
302
304
  this.http = http;
303
305
  }
306
+ http;
304
307
  async reply(input, opts = {}) {
305
308
  const { comment_id, ...body } = input;
306
309
  const res = await this.http.request({
@@ -330,6 +333,7 @@ var WebhookSubscriptionsResource = class {
330
333
  constructor(http) {
331
334
  this.http = http;
332
335
  }
336
+ http;
333
337
  async list(opts = {}) {
334
338
  const res = await this.http.request({
335
339
  method: "GET",
@@ -393,6 +397,7 @@ var WebhookDeliveriesResource = class {
393
397
  constructor(http) {
394
398
  this.http = http;
395
399
  }
400
+ http;
396
401
  async replay(id, opts = {}) {
397
402
  const res = await this.http.request({
398
403
  method: "POST",
@@ -421,6 +426,7 @@ var RetryingHttpClient = class {
421
426
  this.base = base;
422
427
  this.r = resolveRetry(options);
423
428
  }
429
+ base;
424
430
  r;
425
431
  async request(opts) {
426
432
  let lastErr;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/retry.ts","../src/version.ts","../src/runtime.ts","../src/http.ts","../src/resources/messages.ts","../src/resources/comments.ts","../src/resources/webhook-subscriptions.ts","../src/resources/webhook-deliveries.ts","../src/retry-wrapper.ts","../src/client.ts"],"names":["code","body"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Atribu error class hierarchy.\n *\n * Why typed errors: consumers need to branch on auth-failure vs rate-limit vs\n * server-error vs validation-error to decide whether to retry, refresh\n * credentials, or surface to the user. A single `Error` with a status code\n * forces every consumer to write the same `if (err.status === 401)` ladder.\n *\n * Why no automatic retries: the SDK derives a `retry` hint from status +\n * Retry-After + error code, but consumers' queue/job systems decide whether\n * to act on it. Auto-retry inside the SDK hides backpressure signals and\n * makes error budgets opaque.\n */\n\nimport type { RetryHint } from \"./retry\";\n\nexport type ApiErrorCode =\n | \"unauthorized\"\n | \"forbidden\"\n | \"insufficient_scope\"\n | \"not_found\"\n | \"invalid_parameter\"\n | \"invalid_request\"\n | \"validation_error\"\n | \"invalid_content\"\n | \"invalid_date_range\"\n | \"rate_limit_exceeded\"\n | \"connection_not_ready\"\n | \"provider_error\"\n | \"service_unavailable\"\n | \"internal_error\"\n | string;\n\nexport class AtribuError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\nexport class AtribuConfigError extends AtribuError {}\n\nexport class AtribuTransportError extends AtribuError {\n readonly cause: unknown;\n constructor(message: string, cause: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\nexport interface ApiErrorBody {\n code: ApiErrorCode;\n message: string;\n status: number;\n request_id?: string;\n}\n\nexport class AtribuApiError extends AtribuError {\n readonly code: ApiErrorCode;\n readonly status: number;\n readonly requestId: string | null;\n readonly retry: RetryHint;\n readonly responseBody: unknown;\n\n constructor(args: {\n code: ApiErrorCode;\n message: string;\n status: number;\n requestId: string | null;\n retry: RetryHint;\n responseBody: unknown;\n }) {\n super(`[${args.code}] ${args.message}`);\n this.code = args.code;\n this.status = args.status;\n this.requestId = args.requestId;\n this.retry = args.retry;\n this.responseBody = args.responseBody;\n }\n\n isRetryable(): boolean {\n return this.retry.action === \"retry\" || this.retry.action === \"retry_after\";\n }\n isAuthFailure(): boolean {\n return this.status === 401 || this.code === \"unauthorized\";\n }\n isRateLimit(): boolean {\n return this.status === 429 || this.code === \"rate_limit_exceeded\";\n }\n}\n\nexport type OauthErrorCode =\n | \"invalid_request\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unauthorized_client\"\n | \"unsupported_grant_type\"\n | \"invalid_scope\"\n | \"server_error\"\n | \"unsupported_token_type\"\n | string;\n\nexport class AtribuOauthError extends AtribuError {\n readonly code: OauthErrorCode;\n readonly status: number;\n readonly description: string | null;\n\n constructor(args: { code: OauthErrorCode; description: string | null; status: number }) {\n super(`[oauth/${args.code}] ${args.description ?? args.code}`);\n this.code = args.code;\n this.status = args.status;\n this.description = args.description;\n }\n}\n\nexport type WebhookErrorCode =\n | \"missing_signature\"\n | \"malformed_header\"\n | \"expired_timestamp\"\n | \"invalid_signature\";\n\nexport class AtribuWebhookError extends AtribuError {\n readonly code: WebhookErrorCode;\n constructor(code: WebhookErrorCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { AtribuConfigError } from \"./errors\";\n\nexport const DEFAULT_BASE_URL = \"https://www.atribu.app\";\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface AtribuClientConfig {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n userAgent?: string;\n defaultIdempotencyKeyGenerator?: () => string;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n fetch: typeof fetch;\n timeoutMs: number;\n userAgentSuffix: string | null;\n generateIdempotencyKey: () => string;\n}\n\nexport function resolveConfig(config: AtribuClientConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new AtribuConfigError(\"apiKey is required\");\n }\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new AtribuConfigError(\n \"globalThis.fetch is not available; pass a `fetch` implementation in config\",\n );\n }\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n return {\n apiKey: config.apiKey,\n baseUrl,\n fetch: fetchImpl,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n userAgentSuffix: config.userAgent ?? null,\n generateIdempotencyKey: config.defaultIdempotencyKeyGenerator ?? defaultUuid,\n };\n}\n\nfunction defaultUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n // Fallback for older runtimes — a v4-ish UUID via Math.random. Not\n // cryptographically strong; idempotency keys don't need to be.\n const hex = \"0123456789abcdef\";\n let out = \"\";\n for (let i = 0; i < 32; i++) {\n const c = Math.floor(Math.random() * 16);\n out += hex[i === 12 ? 4 : i === 16 ? (c & 0x3) | 0x8 : c];\n if (i === 7 || i === 11 || i === 15 || i === 19) out += \"-\";\n }\n return out;\n}\n","/**\n * Retry hints derived from HTTP status + headers.\n *\n * The SDK never retries automatically. It derives a hint and surfaces it on\n * AtribuApiError.retry so consumers' queue systems can decide. Hiding retry\n * logic in the SDK hides backpressure signals.\n */\n\nexport type RetryHint =\n | { action: \"retry\" }\n | { action: \"retry_after\"; retryAfterMs: number }\n | { action: \"refresh_token\" }\n | { action: \"fix_and_retry\" }\n | { action: \"do_not_retry\" };\n\nexport interface DeriveRetryInput {\n status: number;\n retryAfterHeader: string | null;\n errorCode: string | null;\n}\n\nexport function deriveRetryHint(input: DeriveRetryInput): RetryHint {\n const retryAfterMs = parseRetryAfter(input.retryAfterHeader);\n if (retryAfterMs !== null) {\n return { action: \"retry_after\", retryAfterMs };\n }\n if (input.status === 401) return { action: \"refresh_token\" };\n if (input.status === 403 || input.errorCode === \"forbidden\" || input.errorCode === \"insufficient_scope\") {\n return { action: \"do_not_retry\" };\n }\n if (input.status === 408) return { action: \"retry\" };\n if (input.status === 409) return { action: \"fix_and_retry\" };\n if (input.status === 422 || input.errorCode === \"validation_error\" || input.errorCode === \"invalid_content\") {\n return { action: \"fix_and_retry\" };\n }\n if (input.status === 429 || input.errorCode === \"rate_limit_exceeded\") {\n return { action: \"retry_after\", retryAfterMs: 1000 };\n }\n if (input.status >= 500) return { action: \"retry\" };\n if (input.status >= 400) return { action: \"fix_and_retry\" };\n return { action: \"do_not_retry\" };\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const asInt = Number(header);\n if (Number.isFinite(asInt) && asInt >= 0) return Math.round(asInt * 1000);\n const asDate = Date.parse(header);\n if (Number.isFinite(asDate)) return Math.max(0, asDate - Date.now());\n return null;\n}\n","export const SDK_VERSION = \"0.1.1\";\n","export type Runtime = \"node\" | \"bun\" | \"deno\" | \"edge\" | \"browser\" | \"unknown\";\n\ndeclare const Deno: unknown;\ndeclare const Bun: unknown;\ndeclare const EdgeRuntime: unknown;\n\nexport function detectRuntime(): Runtime {\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof EdgeRuntime !== \"undefined\") return \"edge\";\n if (\n typeof process !== \"undefined\" &&\n typeof (process as { versions?: { node?: string } }).versions?.node === \"string\"\n ) {\n return \"node\";\n }\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") return \"browser\";\n return \"unknown\";\n}\n\nexport function runtimeTag(): string {\n const rt = detectRuntime();\n if (rt === \"node\") {\n const v = (process as { versions?: { node?: string } }).versions?.node;\n return v ? `node/${v}` : \"node\";\n }\n return rt;\n}\n","/**\n * HTTP request layer.\n *\n * Single entry point for every API call: handles auth headers, timeout via\n * AbortController, idempotency-key generation, error envelope parsing, and\n * RetryHint derivation. Resources call `request()` and parse `data` from the\n * envelope.\n */\n\nimport {\n AtribuApiError,\n AtribuOauthError,\n AtribuTransportError,\n type ApiErrorBody,\n type ApiErrorCode,\n type OauthErrorCode,\n} from \"./errors\";\nimport { deriveRetryHint } from \"./retry\";\nimport { SDK_VERSION } from \"./version\";\nimport { runtimeTag } from \"./runtime\";\nimport type { ResolvedConfig } from \"./config\";\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\" | \"PUT\";\n path: string;\n query?: Record<string, string | number | boolean | undefined | null>;\n body?: unknown;\n /** Form-urlencoded body (used by /oauth/token, /oauth/revoke). */\n form?: Record<string, string>;\n /** Override the Authorization header (used by /oauth/* with client-credentials). */\n authOverride?: string;\n idempotencyKey?: string;\n signal?: AbortSignal;\n /** When true, parse 200-body as RFC 6749/7009 OAuth response shape. */\n oauthErrorShape?: boolean;\n /** When true, return raw Response without JSON parse (used by 204 / RFC 7009 empty 200). */\n expectEmpty?: boolean;\n /** Extra headers to merge. */\n headers?: Record<string, string>;\n}\n\nexport interface ApiEnvelope<T> {\n data: T;\n meta?: Record<string, unknown>;\n}\n\nconst SDK_UA = `@atribu/node/${SDK_VERSION} (${runtimeTag()})`;\n\n/**\n * Minimum surface a transport needs to be usable by resources. Lets us\n * stack RetryingHttpClient on top of HttpClient without inheritance.\n */\nexport interface HttpClientLike {\n request<T>(opts: RequestOptions): Promise<T>;\n}\n\nexport class HttpClient implements HttpClientLike {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const headers = this.buildHeaders(opts);\n\n let body: BodyInit | undefined;\n if (opts.form) {\n body = new URLSearchParams(opts.form).toString();\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n body = JSON.stringify(opts.body);\n }\n\n const userSignal = opts.signal;\n const timeoutController = new AbortController();\n const timeout = setTimeout(() => timeoutController.abort(), this.cfg.timeoutMs);\n const signal = userSignal ? mergeSignals(userSignal, timeoutController.signal) : timeoutController.signal;\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new AtribuTransportError(`Request aborted (timeout ${this.cfg.timeoutMs}ms)`, err);\n }\n throw new AtribuTransportError(\n err instanceof Error ? err.message : \"fetch failed\",\n err,\n );\n }\n clearTimeout(timeout);\n\n if (opts.expectEmpty && res.ok) {\n return undefined as T;\n }\n\n const requestId = res.headers.get(\"x-request-id\");\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (!res.ok) {\n if (opts.oauthErrorShape) {\n const { code, description } = parseOauthError(parsed);\n throw new AtribuOauthError({ code, description, status: res.status });\n }\n const body = (parsed as { error?: ApiErrorBody } | null)?.error ?? null;\n const code: ApiErrorCode = body?.code ?? `http_${res.status}`;\n const message = body?.message ?? `HTTP ${res.status}`;\n const retry = deriveRetryHint({\n status: res.status,\n retryAfterHeader: res.headers.get(\"retry-after\"),\n errorCode: code,\n });\n throw new AtribuApiError({\n code,\n message,\n status: res.status,\n requestId: requestId ?? body?.request_id ?? null,\n retry,\n responseBody: parsed,\n });\n }\n\n return parsed as T;\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.cfg.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(opts: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.cfg.userAgentSuffix\n ? `${SDK_UA} ${this.cfg.userAgentSuffix}`\n : SDK_UA,\n };\n if (opts.form) {\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n headers[\"Content-Type\"] = \"application/json\";\n }\n headers.Authorization = opts.authOverride ?? `Bearer ${this.cfg.apiKey}`;\n if (mutating(opts.method)) {\n headers[\"Idempotency-Key\"] = opts.idempotencyKey ?? this.cfg.generateIdempotencyKey();\n }\n if (opts.headers) {\n for (const [k, v] of Object.entries(opts.headers)) headers[k] = v;\n }\n return headers;\n }\n}\n\nfunction mutating(method: RequestOptions[\"method\"]): boolean {\n return method === \"POST\" || method === \"PATCH\" || method === \"PUT\" || method === \"DELETE\";\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction parseOauthError(parsed: unknown): { code: OauthErrorCode; description: string | null } {\n if (parsed && typeof parsed === \"object\") {\n const obj = parsed as { error?: unknown; error_description?: unknown };\n const code = typeof obj.error === \"string\" ? obj.error : \"server_error\";\n const description = typeof obj.error_description === \"string\" ? obj.error_description : null;\n return { code, description };\n }\n return { code: \"server_error\", description: null };\n}\n\nfunction mergeSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n if (typeof AbortSignal !== \"undefined\" && \"any\" in AbortSignal) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (AbortSignal as unknown as { any: (s: AbortSignal[]) => AbortSignal }).any([a, b]);\n }\n const c = new AbortController();\n const onA = (): void => c.abort(a.reason);\n const onB = (): void => c.abort(b.reason);\n if (a.aborted) c.abort(a.reason);\n else a.addEventListener(\"abort\", onA, { once: true });\n if (b.aborted) c.abort(b.reason);\n else b.addEventListener(\"abort\", onB, { once: true });\n return c.signal;\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype SendBody = NonNullable<\n paths[\"/api/v1/messages\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype SendResponse =\n paths[\"/api/v1/messages\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type MessageSendInput = SendBody;\nexport type MessageContent = SendBody[\"content\"];\nexport type MessageSendResponse = SendResponse[\"data\"];\n\nexport interface SendOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async send(input: MessageSendInput, opts: SendOptions = {}): Promise<MessageSendResponse> {\n const res = await this.http.request<SendResponse>({\n method: \"POST\",\n path: \"/api/v1/messages\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype PrivateReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/private-reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype ReplyResponse =\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type CommentReplyInput = ReplyBody & { comment_id: string };\nexport type CommentPrivateReplyInput = PrivateReplyBody & { comment_id: string };\nexport type CommentReplyResponse = ReplyResponse[\"data\"];\n\nexport interface CommentReplyOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class CommentsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async reply(\n input: CommentReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async privateReply(\n input: CommentPrivateReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/private-reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ListResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype CreateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype CreateResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"responses\"][201][\"content\"][\"application/json\"];\ntype UpdateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype UpdateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype RotateBody = NonNullable<\n NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"requestBody\"]\n >[\"content\"][\"application/json\"]\n>;\ntype RotateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype TestResponse =\n paths[\"/api/v1/webhooks/test/{id}\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookSubscription = ListResponse[\"data\"][number];\nexport type WebhookSubscriptionWithSecret = CreateResponse[\"data\"];\nexport type WebhookSubscriptionCreateInput = CreateBody;\nexport type WebhookSubscriptionUpdateInput = UpdateBody;\nexport type WebhookSubscriptionRotateOptions = RotateBody;\nexport type WebhookSubscriptionRotateResult = RotateResponse[\"data\"];\nexport type WebhookSubscriptionTestResult = TestResponse[\"data\"];\n\nexport interface MutationOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookSubscriptionsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async list(opts: { signal?: AbortSignal } = {}): Promise<WebhookSubscription[]> {\n const res = await this.http.request<ListResponse>({\n method: \"GET\",\n path: \"/api/v1/webhooks/subscriptions\",\n signal: opts.signal,\n });\n return res.data;\n }\n\n async create(\n input: WebhookSubscriptionCreateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionWithSecret> {\n const res = await this.http.request<CreateResponse>({\n method: \"POST\",\n path: \"/api/v1/webhooks/subscriptions\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async update(\n id: string,\n input: WebhookSubscriptionUpdateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscription> {\n const res = await this.http.request<UpdateResponse>({\n method: \"PATCH\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async delete(id: string, opts: MutationOptions = {}): Promise<void> {\n await this.http.request<void>({\n method: \"DELETE\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n expectEmpty: true,\n });\n }\n\n async rotateSecret(\n id: string,\n options: WebhookSubscriptionRotateOptions = {},\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionRotateResult> {\n const res = await this.http.request<RotateResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}/rotate-secret`,\n body: options,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async test(\n id: string,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionTestResult> {\n const res = await this.http.request<TestResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/test/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplayResponse =\n paths[\"/api/v1/webhooks/deliveries/{id}/replay\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookDeliveryReplayResult = ReplayResponse[\"data\"];\n\nexport interface ReplayOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookDeliveriesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async replay(id: string, opts: ReplayOptions = {}): Promise<WebhookDeliveryReplayResult> {\n const res = await this.http.request<ReplayResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/deliveries/${encodeURIComponent(id)}/replay`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","/**\n * Opt-in retry layer.\n *\n * Why opt-in: hiding retries inside the SDK by default obscures backpressure\n * signals and amplifies load on a failing server. Consumers that want them\n * call `.withRetry({...})`; others write their own retry logic against the\n * typed `retry` hint on AtribuApiError.\n *\n * What gets retried:\n * - `AtribuApiError` with `retry.action === \"retry\"` (5xx, 408)\n * - `AtribuApiError` with `retry.action === \"retry_after\"` (429, 503 w/\n * Retry-After) — honors retryAfterMs\n * - `AtribuTransportError` (network glitches, ECONNRESET, timeouts)\n *\n * What does NOT retry:\n * - `AtribuApiError` with `retry.action === \"do_not_retry\"` (403)\n * - `AtribuApiError` with `retry.action === \"fix_and_retry\"` (422 etc — the\n * caller's input is wrong; retrying with the same body won't help)\n * - `AtribuApiError` with `retry.action === \"refresh_token\"` (401 — needs\n * credential refresh, not a retry)\n * - `AtribuConfigError`, `AtribuWebhookError`, anything else\n */\n\nimport {\n AtribuApiError,\n AtribuTransportError,\n type AtribuError,\n} from \"./errors\";\nimport type { HttpClientLike, RequestOptions } from \"./http\";\n\nexport type BackoffStrategy = \"exponential\" | \"fixed\" | \"none\";\n\nexport interface RetryOptions {\n /**\n * Max attempts including the initial call. `maxAttempts: 3` = initial + 2\n * retries. Must be ≥ 1. Default 3.\n */\n maxAttempts?: number;\n /**\n * Backoff strategy between retries. \"exponential\" = `baseDelayMs * 2^n`\n * (capped by `maxDelayMs`). \"fixed\" = `baseDelayMs`. \"none\" = no delay.\n * Default \"exponential\".\n */\n backoff?: BackoffStrategy;\n /** Base delay between retries in ms. Default 500. */\n baseDelayMs?: number;\n /** Cap on the delay between retries. Default 30000 (30s). */\n maxDelayMs?: number;\n /**\n * Jitter factor 0..1. Multiplies the computed delay by `1 + random*jitter`\n * (jitter=0 means deterministic). Default 0.3.\n */\n jitter?: number;\n /** Inject for tests. Default `(ms) => new Promise(r => setTimeout(r, ms))`. */\n sleep?: (ms: number) => Promise<void>;\n /** Inject for jitter tests. Default Math.random. */\n random?: () => number;\n}\n\ninterface ResolvedRetry {\n maxAttempts: number;\n backoff: BackoffStrategy;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: number;\n sleep: (ms: number) => Promise<void>;\n random: () => number;\n}\n\nfunction resolveRetry(o: RetryOptions): ResolvedRetry {\n return {\n maxAttempts: Math.max(1, o.maxAttempts ?? 3),\n backoff: o.backoff ?? \"exponential\",\n baseDelayMs: Math.max(0, o.baseDelayMs ?? 500),\n maxDelayMs: Math.max(0, o.maxDelayMs ?? 30_000),\n jitter: Math.min(1, Math.max(0, o.jitter ?? 0.3)),\n sleep: o.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))),\n random: o.random ?? Math.random,\n };\n}\n\nexport class RetryingHttpClient implements HttpClientLike {\n private readonly r: ResolvedRetry;\n constructor(private readonly base: HttpClientLike, options: RetryOptions) {\n this.r = resolveRetry(options);\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 1; attempt <= this.r.maxAttempts; attempt++) {\n try {\n return await this.base.request<T>(opts);\n } catch (err) {\n lastErr = err;\n if (attempt >= this.r.maxAttempts) throw err;\n const delay = this.computeDelay(err, attempt);\n if (delay === null) throw err; // non-retryable\n if (delay > 0) await this.r.sleep(delay);\n }\n }\n throw lastErr; // unreachable\n }\n\n /**\n * Returns the delay in ms before the next attempt, or null if the error\n * is non-retryable (caller should throw immediately).\n */\n private computeDelay(err: unknown, attempt: number): number | null {\n // Transport errors (network glitches, timeouts) → backoff-based retry\n if (err instanceof AtribuTransportError) {\n return this.applyJitter(this.backoffDelay(attempt));\n }\n if (err instanceof AtribuApiError) {\n const action = err.retry.action;\n if (action === \"retry\") return this.applyJitter(this.backoffDelay(attempt));\n if (action === \"retry_after\") {\n // Honor the server's instruction exactly (no jitter on this one).\n const capped = Math.min(err.retry.retryAfterMs, this.r.maxDelayMs);\n return Math.max(0, capped);\n }\n // do_not_retry / fix_and_retry / refresh_token — caller must handle\n return null;\n }\n return null;\n }\n\n private backoffDelay(attempt: number): number {\n if (this.r.backoff === \"none\") return 0;\n if (this.r.backoff === \"fixed\") return this.r.baseDelayMs;\n // exponential: base * 2^(attempt-1), capped at maxDelayMs\n const raw = this.r.baseDelayMs * Math.pow(2, attempt - 1);\n return Math.min(raw, this.r.maxDelayMs);\n }\n\n private applyJitter(delay: number): number {\n if (this.r.jitter === 0) return delay;\n return Math.round(delay * (1 + this.r.random() * this.r.jitter));\n }\n}\n\nexport function isRetryableError(err: unknown): err is AtribuError {\n if (err instanceof AtribuTransportError) return true;\n if (err instanceof AtribuApiError) {\n return err.retry.action === \"retry\" || err.retry.action === \"retry_after\";\n }\n return false;\n}\n","import { resolveConfig, type AtribuClientConfig } from \"./config\";\nimport { HttpClient, type HttpClientLike } from \"./http\";\nimport { MessagesResource } from \"./resources/messages\";\nimport { CommentsResource } from \"./resources/comments\";\nimport { WebhookSubscriptionsResource } from \"./resources/webhook-subscriptions\";\nimport { WebhookDeliveriesResource } from \"./resources/webhook-deliveries\";\nimport { RetryingHttpClient, type RetryOptions } from \"./retry-wrapper\";\n\ninterface ResourceBundle {\n messages: MessagesResource;\n comments: CommentsResource;\n webhooks: {\n subscriptions: WebhookSubscriptionsResource;\n deliveries: WebhookDeliveriesResource;\n };\n}\n\nfunction buildResources(http: HttpClientLike): ResourceBundle {\n return {\n messages: new MessagesResource(http),\n comments: new CommentsResource(http),\n webhooks: {\n subscriptions: new WebhookSubscriptionsResource(http),\n deliveries: new WebhookDeliveriesResource(http),\n },\n };\n}\n\nexport class AtribuClient {\n readonly messages: MessagesResource;\n readonly comments: CommentsResource;\n readonly webhooks: ResourceBundle[\"webhooks\"];\n\n /** @internal — exposed for `withRetry` chaining; do not depend on this. */\n protected readonly _http: HttpClientLike;\n\n constructor(config: AtribuClientConfig) {\n this._http = new HttpClient(resolveConfig(config));\n const r = buildResources(this._http);\n this.messages = r.messages;\n this.comments = r.comments;\n this.webhooks = r.webhooks;\n }\n\n /**\n * Returns a new AtribuClient that retries on transient errors. The\n * original client is not mutated. The wrapper respects the typed\n * `retry` hint on AtribuApiError — `do_not_retry`, `fix_and_retry`,\n * and `refresh_token` are NOT retried (those need caller action, not\n * a repeat call).\n *\n * @example\n * const client = new AtribuClient({...}).withRetry({\n * maxAttempts: 3,\n * backoff: \"exponential\",\n * baseDelayMs: 500,\n * });\n * await client.messages.send({...});\n */\n withRetry(options: RetryOptions): AtribuClient {\n const wrapped = new RetryingHttpClient(this._http, options);\n return AtribuClient._fromHttp(wrapped);\n }\n\n private static _fromHttp(http: HttpClientLike): AtribuClient {\n const proto = Object.create(AtribuClient.prototype) as object;\n const r = buildResources(http);\n Object.assign(proto, {\n _http: http,\n messages: r.messages,\n comments: r.comments,\n webhooks: r.webhooks,\n });\n return proto as AtribuClient;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/retry.ts","../src/version.ts","../src/runtime.ts","../src/http.ts","../src/resources/messages.ts","../src/resources/comments.ts","../src/resources/webhook-subscriptions.ts","../src/resources/webhook-deliveries.ts","../src/retry-wrapper.ts","../src/client.ts"],"names":["code","body"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Atribu error class hierarchy.\n *\n * Why typed errors: consumers need to branch on auth-failure vs rate-limit vs\n * server-error vs validation-error to decide whether to retry, refresh\n * credentials, or surface to the user. A single `Error` with a status code\n * forces every consumer to write the same `if (err.status === 401)` ladder.\n *\n * Why no automatic retries: the SDK derives a `retry` hint from status +\n * Retry-After + error code, but consumers' queue/job systems decide whether\n * to act on it. Auto-retry inside the SDK hides backpressure signals and\n * makes error budgets opaque.\n */\n\nimport type { RetryHint } from \"./retry\";\n\nexport type ApiErrorCode =\n | \"unauthorized\"\n | \"forbidden\"\n | \"insufficient_scope\"\n | \"not_found\"\n | \"invalid_parameter\"\n | \"invalid_request\"\n | \"validation_error\"\n | \"invalid_content\"\n | \"invalid_date_range\"\n | \"rate_limit_exceeded\"\n | \"connection_not_ready\"\n | \"provider_error\"\n | \"service_unavailable\"\n | \"internal_error\"\n | string;\n\nexport class AtribuError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\nexport class AtribuConfigError extends AtribuError {}\n\nexport class AtribuTransportError extends AtribuError {\n readonly cause: unknown;\n constructor(message: string, cause: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\nexport interface ApiErrorBody {\n code: ApiErrorCode;\n message: string;\n status: number;\n request_id?: string;\n}\n\nexport class AtribuApiError extends AtribuError {\n readonly code: ApiErrorCode;\n readonly status: number;\n readonly requestId: string | null;\n readonly retry: RetryHint;\n readonly responseBody: unknown;\n\n constructor(args: {\n code: ApiErrorCode;\n message: string;\n status: number;\n requestId: string | null;\n retry: RetryHint;\n responseBody: unknown;\n }) {\n super(`[${args.code}] ${args.message}`);\n this.code = args.code;\n this.status = args.status;\n this.requestId = args.requestId;\n this.retry = args.retry;\n this.responseBody = args.responseBody;\n }\n\n isRetryable(): boolean {\n return this.retry.action === \"retry\" || this.retry.action === \"retry_after\";\n }\n isAuthFailure(): boolean {\n return this.status === 401 || this.code === \"unauthorized\";\n }\n isRateLimit(): boolean {\n return this.status === 429 || this.code === \"rate_limit_exceeded\";\n }\n}\n\nexport type OauthErrorCode =\n | \"invalid_request\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unauthorized_client\"\n | \"unsupported_grant_type\"\n | \"invalid_scope\"\n | \"server_error\"\n | \"unsupported_token_type\"\n | string;\n\nexport class AtribuOauthError extends AtribuError {\n readonly code: OauthErrorCode;\n readonly status: number;\n readonly description: string | null;\n\n constructor(args: { code: OauthErrorCode; description: string | null; status: number }) {\n super(`[oauth/${args.code}] ${args.description ?? args.code}`);\n this.code = args.code;\n this.status = args.status;\n this.description = args.description;\n }\n}\n\nexport type WebhookErrorCode =\n | \"missing_signature\"\n | \"malformed_header\"\n | \"expired_timestamp\"\n | \"invalid_signature\";\n\nexport class AtribuWebhookError extends AtribuError {\n readonly code: WebhookErrorCode;\n constructor(code: WebhookErrorCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { AtribuConfigError } from \"./errors\";\n\nexport const DEFAULT_BASE_URL = \"https://www.atribu.app\";\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface AtribuClientConfig {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n userAgent?: string;\n defaultIdempotencyKeyGenerator?: () => string;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n fetch: typeof fetch;\n timeoutMs: number;\n userAgentSuffix: string | null;\n generateIdempotencyKey: () => string;\n}\n\nexport function resolveConfig(config: AtribuClientConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new AtribuConfigError(\"apiKey is required\");\n }\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new AtribuConfigError(\n \"globalThis.fetch is not available; pass a `fetch` implementation in config\",\n );\n }\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n return {\n apiKey: config.apiKey,\n baseUrl,\n fetch: fetchImpl,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n userAgentSuffix: config.userAgent ?? null,\n generateIdempotencyKey: config.defaultIdempotencyKeyGenerator ?? defaultUuid,\n };\n}\n\nfunction defaultUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n // Fallback for older runtimes — a v4-ish UUID via Math.random. Not\n // cryptographically strong; idempotency keys don't need to be.\n const hex = \"0123456789abcdef\";\n let out = \"\";\n for (let i = 0; i < 32; i++) {\n const c = Math.floor(Math.random() * 16);\n out += hex[i === 12 ? 4 : i === 16 ? (c & 0x3) | 0x8 : c];\n if (i === 7 || i === 11 || i === 15 || i === 19) out += \"-\";\n }\n return out;\n}\n","/**\n * Retry hints derived from HTTP status + headers.\n *\n * The SDK never retries automatically. It derives a hint and surfaces it on\n * AtribuApiError.retry so consumers' queue systems can decide. Hiding retry\n * logic in the SDK hides backpressure signals.\n */\n\nexport type RetryHint =\n | { action: \"retry\" }\n | { action: \"retry_after\"; retryAfterMs: number }\n | { action: \"refresh_token\" }\n | { action: \"fix_and_retry\" }\n | { action: \"do_not_retry\" };\n\nexport interface DeriveRetryInput {\n status: number;\n retryAfterHeader: string | null;\n errorCode: string | null;\n}\n\nexport function deriveRetryHint(input: DeriveRetryInput): RetryHint {\n const retryAfterMs = parseRetryAfter(input.retryAfterHeader);\n if (retryAfterMs !== null) {\n return { action: \"retry_after\", retryAfterMs };\n }\n if (input.status === 401) return { action: \"refresh_token\" };\n if (input.status === 403 || input.errorCode === \"forbidden\" || input.errorCode === \"insufficient_scope\") {\n return { action: \"do_not_retry\" };\n }\n if (input.status === 408) return { action: \"retry\" };\n if (input.status === 409) return { action: \"fix_and_retry\" };\n if (input.status === 422 || input.errorCode === \"validation_error\" || input.errorCode === \"invalid_content\") {\n return { action: \"fix_and_retry\" };\n }\n if (input.status === 429 || input.errorCode === \"rate_limit_exceeded\") {\n return { action: \"retry_after\", retryAfterMs: 1000 };\n }\n if (input.status >= 500) return { action: \"retry\" };\n if (input.status >= 400) return { action: \"fix_and_retry\" };\n return { action: \"do_not_retry\" };\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const asInt = Number(header);\n if (Number.isFinite(asInt) && asInt >= 0) return Math.round(asInt * 1000);\n const asDate = Date.parse(header);\n if (Number.isFinite(asDate)) return Math.max(0, asDate - Date.now());\n return null;\n}\n","export const SDK_VERSION = \"0.1.4\";\n","export type Runtime = \"node\" | \"bun\" | \"deno\" | \"edge\" | \"browser\" | \"unknown\";\n\ndeclare const Deno: unknown;\ndeclare const Bun: unknown;\ndeclare const EdgeRuntime: unknown;\n\nexport function detectRuntime(): Runtime {\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof EdgeRuntime !== \"undefined\") return \"edge\";\n if (\n typeof process !== \"undefined\" &&\n typeof (process as { versions?: { node?: string } }).versions?.node === \"string\"\n ) {\n return \"node\";\n }\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") return \"browser\";\n return \"unknown\";\n}\n\nexport function runtimeTag(): string {\n const rt = detectRuntime();\n if (rt === \"node\") {\n const v = (process as { versions?: { node?: string } }).versions?.node;\n return v ? `node/${v}` : \"node\";\n }\n return rt;\n}\n","/**\n * HTTP request layer.\n *\n * Single entry point for every API call: handles auth headers, timeout via\n * AbortController, idempotency-key generation, error envelope parsing, and\n * RetryHint derivation. Resources call `request()` and parse `data` from the\n * envelope.\n */\n\nimport {\n AtribuApiError,\n AtribuOauthError,\n AtribuTransportError,\n type ApiErrorBody,\n type ApiErrorCode,\n type OauthErrorCode,\n} from \"./errors\";\nimport { deriveRetryHint } from \"./retry\";\nimport { SDK_VERSION } from \"./version\";\nimport { runtimeTag } from \"./runtime\";\nimport type { ResolvedConfig } from \"./config\";\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\" | \"PUT\";\n path: string;\n query?: Record<string, string | number | boolean | undefined | null>;\n body?: unknown;\n /** Form-urlencoded body (used by /oauth/token, /oauth/revoke). */\n form?: Record<string, string>;\n /** Override the Authorization header (used by /oauth/* with client-credentials). */\n authOverride?: string;\n idempotencyKey?: string;\n signal?: AbortSignal;\n /** When true, parse 200-body as RFC 6749/7009 OAuth response shape. */\n oauthErrorShape?: boolean;\n /** When true, return raw Response without JSON parse (used by 204 / RFC 7009 empty 200). */\n expectEmpty?: boolean;\n /** Extra headers to merge. */\n headers?: Record<string, string>;\n}\n\nexport interface ApiEnvelope<T> {\n data: T;\n meta?: Record<string, unknown>;\n}\n\nconst SDK_UA = `@atribu/node/${SDK_VERSION} (${runtimeTag()})`;\n\n/**\n * Minimum surface a transport needs to be usable by resources. Lets us\n * stack RetryingHttpClient on top of HttpClient without inheritance.\n */\nexport interface HttpClientLike {\n request<T>(opts: RequestOptions): Promise<T>;\n}\n\nexport class HttpClient implements HttpClientLike {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const headers = this.buildHeaders(opts);\n\n let body: BodyInit | undefined;\n if (opts.form) {\n body = new URLSearchParams(opts.form).toString();\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n body = JSON.stringify(opts.body);\n }\n\n const userSignal = opts.signal;\n const timeoutController = new AbortController();\n const timeout = setTimeout(() => timeoutController.abort(), this.cfg.timeoutMs);\n const signal = userSignal ? mergeSignals(userSignal, timeoutController.signal) : timeoutController.signal;\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new AtribuTransportError(`Request aborted (timeout ${this.cfg.timeoutMs}ms)`, err);\n }\n throw new AtribuTransportError(\n err instanceof Error ? err.message : \"fetch failed\",\n err,\n );\n }\n clearTimeout(timeout);\n\n if (opts.expectEmpty && res.ok) {\n return undefined as T;\n }\n\n const requestId = res.headers.get(\"x-request-id\");\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (!res.ok) {\n if (opts.oauthErrorShape) {\n const { code, description } = parseOauthError(parsed);\n throw new AtribuOauthError({ code, description, status: res.status });\n }\n const body = (parsed as { error?: ApiErrorBody } | null)?.error ?? null;\n const code: ApiErrorCode = body?.code ?? `http_${res.status}`;\n const message = body?.message ?? `HTTP ${res.status}`;\n const retry = deriveRetryHint({\n status: res.status,\n retryAfterHeader: res.headers.get(\"retry-after\"),\n errorCode: code,\n });\n throw new AtribuApiError({\n code,\n message,\n status: res.status,\n requestId: requestId ?? body?.request_id ?? null,\n retry,\n responseBody: parsed,\n });\n }\n\n return parsed as T;\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.cfg.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(opts: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.cfg.userAgentSuffix\n ? `${SDK_UA} ${this.cfg.userAgentSuffix}`\n : SDK_UA,\n };\n if (opts.form) {\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n } else if (opts.body !== undefined && opts.method !== \"GET\") {\n headers[\"Content-Type\"] = \"application/json\";\n }\n headers.Authorization = opts.authOverride ?? `Bearer ${this.cfg.apiKey}`;\n if (mutating(opts.method)) {\n headers[\"Idempotency-Key\"] = opts.idempotencyKey ?? this.cfg.generateIdempotencyKey();\n }\n if (opts.headers) {\n for (const [k, v] of Object.entries(opts.headers)) headers[k] = v;\n }\n return headers;\n }\n}\n\nfunction mutating(method: RequestOptions[\"method\"]): boolean {\n return method === \"POST\" || method === \"PATCH\" || method === \"PUT\" || method === \"DELETE\";\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction parseOauthError(parsed: unknown): { code: OauthErrorCode; description: string | null } {\n if (parsed && typeof parsed === \"object\") {\n const obj = parsed as { error?: unknown; error_description?: unknown };\n const code = typeof obj.error === \"string\" ? obj.error : \"server_error\";\n const description = typeof obj.error_description === \"string\" ? obj.error_description : null;\n return { code, description };\n }\n return { code: \"server_error\", description: null };\n}\n\nfunction mergeSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n if (typeof AbortSignal !== \"undefined\" && \"any\" in AbortSignal) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (AbortSignal as unknown as { any: (s: AbortSignal[]) => AbortSignal }).any([a, b]);\n }\n const c = new AbortController();\n const onA = (): void => c.abort(a.reason);\n const onB = (): void => c.abort(b.reason);\n if (a.aborted) c.abort(a.reason);\n else a.addEventListener(\"abort\", onA, { once: true });\n if (b.aborted) c.abort(b.reason);\n else b.addEventListener(\"abort\", onB, { once: true });\n return c.signal;\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype SendBody = NonNullable<\n paths[\"/api/v1/messages\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype SendResponse =\n paths[\"/api/v1/messages\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type MessageSendInput = SendBody;\nexport type MessageContent = SendBody[\"content\"];\nexport type MessageSendResponse = SendResponse[\"data\"];\n\nexport interface SendOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async send(input: MessageSendInput, opts: SendOptions = {}): Promise<MessageSendResponse> {\n const res = await this.http.request<SendResponse>({\n method: \"POST\",\n path: \"/api/v1/messages\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype PrivateReplyBody = NonNullable<\n paths[\"/api/v1/comments/{comment_id}/private-reply\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\ntype ReplyResponse =\n paths[\"/api/v1/comments/{comment_id}/reply\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type CommentReplyInput = ReplyBody & { comment_id: string };\nexport type CommentPrivateReplyInput = PrivateReplyBody & { comment_id: string };\nexport type CommentReplyResponse = ReplyResponse[\"data\"];\n\nexport interface CommentReplyOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class CommentsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async reply(\n input: CommentReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async privateReply(\n input: CommentPrivateReplyInput,\n opts: CommentReplyOptions = {},\n ): Promise<CommentReplyResponse> {\n const { comment_id, ...body } = input;\n const res = await this.http.request<ReplyResponse>({\n method: \"POST\",\n path: `/api/v1/comments/${encodeURIComponent(comment_id)}/private-reply`,\n body,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ListResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype CreateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype CreateResponse =\n paths[\"/api/v1/webhooks/subscriptions\"][\"post\"][\"responses\"][201][\"content\"][\"application/json\"];\ntype UpdateBody = NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\ntype UpdateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}\"][\"patch\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype RotateBody = NonNullable<\n NonNullable<\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"requestBody\"]\n >[\"content\"][\"application/json\"]\n>;\ntype RotateResponse =\n paths[\"/api/v1/webhooks/subscriptions/{id}/rotate-secret\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype TestResponse =\n paths[\"/api/v1/webhooks/test/{id}\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookSubscription = ListResponse[\"data\"][number];\nexport type WebhookSubscriptionWithSecret = CreateResponse[\"data\"];\nexport type WebhookSubscriptionCreateInput = CreateBody;\nexport type WebhookSubscriptionUpdateInput = UpdateBody;\nexport type WebhookSubscriptionRotateOptions = RotateBody;\nexport type WebhookSubscriptionRotateResult = RotateResponse[\"data\"];\nexport type WebhookSubscriptionTestResult = TestResponse[\"data\"];\n\nexport interface MutationOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookSubscriptionsResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async list(opts: { signal?: AbortSignal } = {}): Promise<WebhookSubscription[]> {\n const res = await this.http.request<ListResponse>({\n method: \"GET\",\n path: \"/api/v1/webhooks/subscriptions\",\n signal: opts.signal,\n });\n return res.data;\n }\n\n async create(\n input: WebhookSubscriptionCreateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionWithSecret> {\n const res = await this.http.request<CreateResponse>({\n method: \"POST\",\n path: \"/api/v1/webhooks/subscriptions\",\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async update(\n id: string,\n input: WebhookSubscriptionUpdateInput,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscription> {\n const res = await this.http.request<UpdateResponse>({\n method: \"PATCH\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n body: input,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async delete(id: string, opts: MutationOptions = {}): Promise<void> {\n await this.http.request<void>({\n method: \"DELETE\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n expectEmpty: true,\n });\n }\n\n async rotateSecret(\n id: string,\n options: WebhookSubscriptionRotateOptions = {},\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionRotateResult> {\n const res = await this.http.request<RotateResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/subscriptions/${encodeURIComponent(id)}/rotate-secret`,\n body: options,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n\n async test(\n id: string,\n opts: MutationOptions = {},\n ): Promise<WebhookSubscriptionTestResult> {\n const res = await this.http.request<TestResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/test/${encodeURIComponent(id)}`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","import type { paths } from \"../__generated__/api\";\nimport type { HttpClientLike } from \"../http\";\n\ntype ReplayResponse =\n paths[\"/api/v1/webhooks/deliveries/{id}/replay\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type WebhookDeliveryReplayResult = ReplayResponse[\"data\"];\n\nexport interface ReplayOptions {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class WebhookDeliveriesResource {\n constructor(private readonly http: HttpClientLike) {}\n\n async replay(id: string, opts: ReplayOptions = {}): Promise<WebhookDeliveryReplayResult> {\n const res = await this.http.request<ReplayResponse>({\n method: \"POST\",\n path: `/api/v1/webhooks/deliveries/${encodeURIComponent(id)}/replay`,\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n });\n return res.data;\n }\n}\n","/**\n * Opt-in retry layer.\n *\n * Why opt-in: hiding retries inside the SDK by default obscures backpressure\n * signals and amplifies load on a failing server. Consumers that want them\n * call `.withRetry({...})`; others write their own retry logic against the\n * typed `retry` hint on AtribuApiError.\n *\n * What gets retried:\n * - `AtribuApiError` with `retry.action === \"retry\"` (5xx, 408)\n * - `AtribuApiError` with `retry.action === \"retry_after\"` (429, 503 w/\n * Retry-After) — honors retryAfterMs\n * - `AtribuTransportError` (network glitches, ECONNRESET, timeouts)\n *\n * What does NOT retry:\n * - `AtribuApiError` with `retry.action === \"do_not_retry\"` (403)\n * - `AtribuApiError` with `retry.action === \"fix_and_retry\"` (422 etc — the\n * caller's input is wrong; retrying with the same body won't help)\n * - `AtribuApiError` with `retry.action === \"refresh_token\"` (401 — needs\n * credential refresh, not a retry)\n * - `AtribuConfigError`, `AtribuWebhookError`, anything else\n */\n\nimport {\n AtribuApiError,\n AtribuTransportError,\n type AtribuError,\n} from \"./errors\";\nimport type { HttpClientLike, RequestOptions } from \"./http\";\n\nexport type BackoffStrategy = \"exponential\" | \"fixed\" | \"none\";\n\nexport interface RetryOptions {\n /**\n * Max attempts including the initial call. `maxAttempts: 3` = initial + 2\n * retries. Must be ≥ 1. Default 3.\n */\n maxAttempts?: number;\n /**\n * Backoff strategy between retries. \"exponential\" = `baseDelayMs * 2^n`\n * (capped by `maxDelayMs`). \"fixed\" = `baseDelayMs`. \"none\" = no delay.\n * Default \"exponential\".\n */\n backoff?: BackoffStrategy;\n /** Base delay between retries in ms. Default 500. */\n baseDelayMs?: number;\n /** Cap on the delay between retries. Default 30000 (30s). */\n maxDelayMs?: number;\n /**\n * Jitter factor 0..1. Multiplies the computed delay by `1 + random*jitter`\n * (jitter=0 means deterministic). Default 0.3.\n */\n jitter?: number;\n /** Inject for tests. Default `(ms) => new Promise(r => setTimeout(r, ms))`. */\n sleep?: (ms: number) => Promise<void>;\n /** Inject for jitter tests. Default Math.random. */\n random?: () => number;\n}\n\ninterface ResolvedRetry {\n maxAttempts: number;\n backoff: BackoffStrategy;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: number;\n sleep: (ms: number) => Promise<void>;\n random: () => number;\n}\n\nfunction resolveRetry(o: RetryOptions): ResolvedRetry {\n return {\n maxAttempts: Math.max(1, o.maxAttempts ?? 3),\n backoff: o.backoff ?? \"exponential\",\n baseDelayMs: Math.max(0, o.baseDelayMs ?? 500),\n maxDelayMs: Math.max(0, o.maxDelayMs ?? 30_000),\n jitter: Math.min(1, Math.max(0, o.jitter ?? 0.3)),\n sleep: o.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))),\n random: o.random ?? Math.random,\n };\n}\n\nexport class RetryingHttpClient implements HttpClientLike {\n private readonly r: ResolvedRetry;\n constructor(private readonly base: HttpClientLike, options: RetryOptions) {\n this.r = resolveRetry(options);\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 1; attempt <= this.r.maxAttempts; attempt++) {\n try {\n return await this.base.request<T>(opts);\n } catch (err) {\n lastErr = err;\n if (attempt >= this.r.maxAttempts) throw err;\n const delay = this.computeDelay(err, attempt);\n if (delay === null) throw err; // non-retryable\n if (delay > 0) await this.r.sleep(delay);\n }\n }\n throw lastErr; // unreachable\n }\n\n /**\n * Returns the delay in ms before the next attempt, or null if the error\n * is non-retryable (caller should throw immediately).\n */\n private computeDelay(err: unknown, attempt: number): number | null {\n // Transport errors (network glitches, timeouts) → backoff-based retry\n if (err instanceof AtribuTransportError) {\n return this.applyJitter(this.backoffDelay(attempt));\n }\n if (err instanceof AtribuApiError) {\n const action = err.retry.action;\n if (action === \"retry\") return this.applyJitter(this.backoffDelay(attempt));\n if (action === \"retry_after\") {\n // Honor the server's instruction exactly (no jitter on this one).\n const capped = Math.min(err.retry.retryAfterMs, this.r.maxDelayMs);\n return Math.max(0, capped);\n }\n // do_not_retry / fix_and_retry / refresh_token — caller must handle\n return null;\n }\n return null;\n }\n\n private backoffDelay(attempt: number): number {\n if (this.r.backoff === \"none\") return 0;\n if (this.r.backoff === \"fixed\") return this.r.baseDelayMs;\n // exponential: base * 2^(attempt-1), capped at maxDelayMs\n const raw = this.r.baseDelayMs * Math.pow(2, attempt - 1);\n return Math.min(raw, this.r.maxDelayMs);\n }\n\n private applyJitter(delay: number): number {\n if (this.r.jitter === 0) return delay;\n return Math.round(delay * (1 + this.r.random() * this.r.jitter));\n }\n}\n\nexport function isRetryableError(err: unknown): err is AtribuError {\n if (err instanceof AtribuTransportError) return true;\n if (err instanceof AtribuApiError) {\n return err.retry.action === \"retry\" || err.retry.action === \"retry_after\";\n }\n return false;\n}\n","import { resolveConfig, type AtribuClientConfig } from \"./config\";\nimport { HttpClient, type HttpClientLike } from \"./http\";\nimport { MessagesResource } from \"./resources/messages\";\nimport { CommentsResource } from \"./resources/comments\";\nimport { WebhookSubscriptionsResource } from \"./resources/webhook-subscriptions\";\nimport { WebhookDeliveriesResource } from \"./resources/webhook-deliveries\";\nimport { RetryingHttpClient, type RetryOptions } from \"./retry-wrapper\";\n\ninterface ResourceBundle {\n messages: MessagesResource;\n comments: CommentsResource;\n webhooks: {\n subscriptions: WebhookSubscriptionsResource;\n deliveries: WebhookDeliveriesResource;\n };\n}\n\nfunction buildResources(http: HttpClientLike): ResourceBundle {\n return {\n messages: new MessagesResource(http),\n comments: new CommentsResource(http),\n webhooks: {\n subscriptions: new WebhookSubscriptionsResource(http),\n deliveries: new WebhookDeliveriesResource(http),\n },\n };\n}\n\nexport class AtribuClient {\n readonly messages: MessagesResource;\n readonly comments: CommentsResource;\n readonly webhooks: ResourceBundle[\"webhooks\"];\n\n /** @internal — exposed for `withRetry` chaining; do not depend on this. */\n protected readonly _http: HttpClientLike;\n\n constructor(config: AtribuClientConfig) {\n this._http = new HttpClient(resolveConfig(config));\n const r = buildResources(this._http);\n this.messages = r.messages;\n this.comments = r.comments;\n this.webhooks = r.webhooks;\n }\n\n /**\n * Returns a new AtribuClient that retries on transient errors. The\n * original client is not mutated. The wrapper respects the typed\n * `retry` hint on AtribuApiError — `do_not_retry`, `fix_and_retry`,\n * and `refresh_token` are NOT retried (those need caller action, not\n * a repeat call).\n *\n * @example\n * const client = new AtribuClient({...}).withRetry({\n * maxAttempts: 3,\n * backoff: \"exponential\",\n * baseDelayMs: 500,\n * });\n * await client.messages.send({...});\n */\n withRetry(options: RetryOptions): AtribuClient {\n const wrapped = new RetryingHttpClient(this._http, options);\n return AtribuClient._fromHttp(wrapped);\n }\n\n private static _fromHttp(http: HttpClientLike): AtribuClient {\n const proto = Object.create(AtribuClient.prototype) as object;\n const r = buildResources(http);\n Object.assign(proto, {\n _http: http,\n messages: r.messages,\n comments: r.comments,\n webhooks: r.webhooks,\n });\n return proto as AtribuClient;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { g as AtribuWebhookError } from '../errors-D3ApBz8J.cjs';
1
+ import { g as AtribuWebhookError } from '../errors-BLELoojK.cjs';
2
2
  import { A as AtribuWebhookEvent } from '../types-Dc6tIN_V.cjs';
3
3
 
4
4
  /**