@ragable/sdk 0.6.4 → 0.6.6

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/request-client.ts","../src/shift.ts","../src/sse.ts","../src/agents.ts","../src/transport.ts","../src/browser-postgrest.ts","../src/auth-storage.ts","../src/auth.ts","../src/browser.ts","../src/rag.ts","../src/index.ts"],"sourcesContent":["/**\n * Native `fetch` must not be called as a detached reference (`const f = fetch; f(url)`),\n * or the browser throws **Illegal invocation**. Use this for defaults and for `options.fetch`.\n */\nexport function bindFetch(custom?: typeof fetch): typeof fetch {\n return (input, init) => {\n const f = custom ?? globalThis.fetch;\n return f.call(globalThis, input as RequestInfo, init);\n };\n}\n\n/** Default hosted API (`…/api`) when `baseUrl` is omitted (browser + server clients). */\nexport const DEFAULT_RAGABLE_API_BASE =\n \"https://ragable-341305259977.asia-southeast1.run.app/api\";\n\nexport interface RagableClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport type RequestOptions = Omit<RequestInit, \"body\"> & {\n body?: unknown;\n};\n\nexport abstract class RagableSdkError extends Error {\n abstract readonly __type: string;\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n // Native `Error.message` is non-enumerable — `{...err}`, `JSON.stringify({...err})`, and some\n // loggers show `{}`. Redefine so spreads and plain serialization keep `message`.\n Object.defineProperty(this, \"message\", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: message,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n __type: this.__type,\n };\n }\n}\n\nexport class RagableError extends RagableSdkError {\n readonly __type = \"RagableError\" as const;\n readonly status: number;\n readonly body: unknown;\n readonly code: string | undefined;\n readonly details: string | undefined;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.status = status;\n this.body = body;\n this.code =\n body && typeof body === \"object\"\n ? typeof (body as Record<string, unknown>).code === \"string\"\n ? ((body as Record<string, unknown>).code as string)\n : typeof (body as Record<string, unknown>).code === \"number\"\n ? String((body as Record<string, unknown>).code)\n : undefined\n : undefined;\n this.details =\n body && typeof body === \"object\"\n ? typeof (body as Record<string, unknown>).details === \"string\"\n ? ((body as Record<string, unknown>).details as string)\n : undefined\n : undefined;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n status: this.status,\n body: this.body,\n code: this.code,\n details: this.details,\n };\n }\n\n /** Stable string for logs — avoids `{}` when coercing or stringifying. */\n override toString(): string {\n const bits = [`${this.name}: ${this.message}`];\n if (this.status) bits.push(`status=${this.status}`);\n if (this.code) bits.push(`code=${this.code}`);\n return bits.join(\" · \");\n }\n}\n\n/** Safe one-line log for any thrown value (catch blocks, TanStack Query). */\nexport function formatSdkError(err: unknown): string {\n if (err instanceof RagableError) {\n return `${err.message} (HTTP ${err.status}${err.code ? `, ${err.code}` : \"\"})`;\n }\n if (err instanceof RagableSdkError) {\n return err.message;\n }\n if (err instanceof Error) {\n return err.message || err.name;\n }\n if (typeof err === \"string\") return err;\n if (err && typeof err === \"object\") {\n try {\n const s = JSON.stringify(err);\n if (s !== \"{}\") return s;\n return \"Unknown error (empty object — avoid `{...error}` spread; use error.message or formatSdkError)\";\n } catch {\n /* fall through */\n }\n }\n return String(err);\n}\n\n/**\n * Human-readable line for a PostgREST `{ data, error }` error (or any thrown value).\n * Use in UI instead of `JSON.stringify(error)` or template strings on unknown errors.\n */\nexport function formatPostgrestError(error: unknown): string {\n return formatSdkError(error);\n}\n\nexport class RagableNetworkError extends RagableSdkError {\n readonly __type = \"RagableNetworkError\" as const;\n readonly cause: unknown;\n constructor(message: string, cause?: unknown) {\n super(message);\n this.cause = cause;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n cause: this.cause instanceof Error ? this.cause.message : this.cause,\n };\n }\n}\n\nexport class RagableAbortError extends RagableSdkError {\n readonly __type = \"RagableAbortError\" as const;\n constructor(message = \"Request aborted\") {\n super(message);\n }\n}\n\nexport class RagableTimeoutError extends RagableSdkError {\n readonly __type = \"RagableTimeoutError\" as const;\n readonly timeoutMs: number;\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.timeoutMs = timeoutMs;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n timeoutMs: this.timeoutMs,\n };\n }\n}\n\nexport function extractErrorMessage(payload: unknown, fallback: string) {\n if (payload && typeof payload === \"object\") {\n if (\"error\" in payload && typeof payload.error === \"string\") {\n return payload.error;\n }\n if (\"message\" in payload && typeof payload.message === \"string\") {\n return payload.message;\n }\n }\n\n if (typeof payload === \"string\" && payload.length > 0) {\n return payload;\n }\n\n return fallback || \"Request failed\";\n}\n\nexport class RagableRequestClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly defaultHeaders: HeadersInit | undefined;\n\n constructor(options: RagableClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_RAGABLE_API_BASE;\n this.fetchImpl = bindFetch(options.fetch);\n this.defaultHeaders = options.headers;\n }\n\n toUrl(path: string) {\n const normalizedBase = this.baseUrl.replace(/\\/+$/, \"\");\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.rawFetch(path, options);\n const payload = await this.parseResponseBody(response);\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n /**\n * Low-level fetch with API key and JSON body encoding. Caller handles status and body.\n */\n async rawFetch(path: string, options: RequestOptions = {}): Promise<Response> {\n const headers = new Headers(this.defaultHeaders);\n headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\n let body = options.body;\n if (body !== undefined && !isBodyInit(body)) {\n headers.set(\"Content-Type\", \"application/json\");\n body = JSON.stringify(body);\n }\n\n return this.fetchImpl(this.toUrl(path), {\n ...options,\n headers,\n body: body as BodyInit | undefined,\n });\n }\n\n private async parseResponseBody(response: Response): Promise<unknown> {\n if (response.status === 204) {\n return null;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n\n return response.text();\n }\n}\n\nexport function isBodyInit(value: unknown): value is BodyInit {\n return (\n typeof value === \"string\" ||\n value instanceof Blob ||\n value instanceof FormData ||\n value instanceof URLSearchParams ||\n value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value)\n );\n}\n","import { RagableRequestClient } from \"./request-client\";\n\nexport interface ShiftIndex {\n id: string;\n name: string;\n description: string | null;\n dimensions: number;\n embeddingModel: string;\n status: string;\n entryCount?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ShiftEntry {\n id: string;\n content: string;\n metadata: unknown;\n chunkIndex: number;\n createdAt: string;\n}\n\nexport interface ShiftSearchResult {\n content: string;\n score: number;\n metadata: unknown;\n}\n\nexport interface ShiftCreateIndexParams {\n name: string;\n description?: string;\n dimensions?: number;\n embeddingModel?: string;\n}\n\nexport interface ShiftUpdateIndexParams {\n name?: string;\n description?: string;\n}\n\nexport interface ShiftAddDocumentParams {\n content: string;\n metadata?: Record<string, unknown>;\n chunkSize?: number;\n chunkOverlap?: number;\n}\n\nexport type ShiftUploadableFile = Blob | ArrayBuffer | Uint8Array;\n\nexport interface ShiftUploadFileParams {\n file: ShiftUploadableFile;\n fileName?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n chunkSize?: number;\n chunkOverlap?: number;\n}\n\nexport interface ShiftListEntriesParams {\n take?: number;\n skip?: number;\n}\n\nexport interface ShiftSearchParams {\n query: string;\n topK?: number;\n}\n\nexport interface ShiftIngestResponse {\n chunksCreated: number;\n entries: string[];\n extractedText?: string;\n message?: string;\n}\n\nexport interface ShiftListEntriesResponse {\n entries: ShiftEntry[];\n total: number;\n}\n\nexport class ShiftClient {\n readonly indexes: {\n list: () => Promise<{ indexes: ShiftIndex[] }>;\n create: (params: ShiftCreateIndexParams) => Promise<ShiftIndex>;\n get: (indexId: string) => Promise<ShiftIndex>;\n update: (indexId: string, params: ShiftUpdateIndexParams) => Promise<ShiftIndex>;\n delete: (indexId: string) => Promise<{ success: true }>;\n };\n\n readonly documents: {\n create: (\n indexId: string,\n params: ShiftAddDocumentParams,\n ) => Promise<ShiftIngestResponse>;\n upload: (\n indexId: string,\n params: ShiftUploadFileParams,\n ) => Promise<ShiftIngestResponse>;\n };\n\n readonly entries: {\n list: (\n indexId: string,\n params?: ShiftListEntriesParams,\n ) => Promise<ShiftListEntriesResponse>;\n delete: (indexId: string, entryId: string) => Promise<{ success: true }>;\n };\n\n constructor(private readonly client: RagableRequestClient) {\n this.indexes = {\n list: async () => {\n return this.client.request<{ indexes: ShiftIndex[] }>(\"/v1/shift/indexes\");\n },\n create: async (params) => {\n return this.client.request<ShiftIndex>(\"/v1/shift/indexes\", {\n method: \"POST\",\n body: params,\n });\n },\n get: async (indexId) => {\n return this.client.request<ShiftIndex>(`/v1/shift/indexes/${indexId}`);\n },\n update: async (indexId, params) => {\n return this.client.request<ShiftIndex>(`/v1/shift/indexes/${indexId}`, {\n method: \"PUT\",\n body: params,\n });\n },\n delete: async (indexId) => {\n return this.client.request<{ success: true }>(\n `/v1/shift/indexes/${indexId}`,\n {\n method: \"DELETE\",\n },\n );\n },\n };\n\n this.documents = {\n create: async (indexId, params) => {\n return this.client.request<ShiftIngestResponse>(\n `/v1/shift/indexes/${indexId}/documents`,\n {\n method: \"POST\",\n body: params,\n },\n );\n },\n upload: async (indexId, params) => {\n const formData = new FormData();\n const fileName = resolveUploadFileName(params);\n const contentType = resolveUploadContentType(params);\n const file = normalizeUploadFile(params.file, contentType);\n\n formData.set(\"file\", file, fileName);\n\n if (params.metadata) {\n formData.set(\"metadata\", JSON.stringify(params.metadata));\n }\n if (typeof params.chunkSize === \"number\") {\n formData.set(\"chunkSize\", String(params.chunkSize));\n }\n if (typeof params.chunkOverlap === \"number\") {\n formData.set(\"chunkOverlap\", String(params.chunkOverlap));\n }\n\n return this.client.request<ShiftIngestResponse>(\n `/v1/shift/indexes/${indexId}/files`,\n {\n method: \"POST\",\n body: formData,\n },\n );\n },\n };\n\n this.entries = {\n list: async (indexId, params = {}) => {\n const search = new URLSearchParams();\n if (typeof params.take === \"number\") {\n search.set(\"take\", String(params.take));\n }\n if (typeof params.skip === \"number\") {\n search.set(\"skip\", String(params.skip));\n }\n\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n return this.client.request<ShiftListEntriesResponse>(\n `/v1/shift/indexes/${indexId}/entries${suffix}`,\n );\n },\n delete: async (indexId, entryId) => {\n return this.client.request<{ success: true }>(\n `/v1/shift/indexes/${indexId}/entries/${entryId}`,\n {\n method: \"DELETE\",\n },\n );\n },\n };\n }\n\n async search(indexId: string, params: ShiftSearchParams) {\n return this.client.request<{ results: ShiftSearchResult[] }>(\n `/v1/shift/indexes/${indexId}/search`,\n {\n method: \"POST\",\n body: params,\n },\n );\n }\n}\n\nfunction resolveUploadFileName(params: ShiftUploadFileParams) {\n if (params.fileName) {\n return params.fileName;\n }\n\n if (isNamedBlob(params.file)) {\n return params.file.name;\n }\n\n return \"upload.bin\";\n}\n\nfunction resolveUploadContentType(params: ShiftUploadFileParams) {\n if (params.contentType) {\n return params.contentType;\n }\n\n if (params.file instanceof Blob && params.file.type) {\n return params.file.type;\n }\n\n return \"application/octet-stream\";\n}\n\nfunction normalizeUploadFile(file: ShiftUploadableFile, contentType: string) {\n if (file instanceof Blob) {\n return file;\n }\n\n if (file instanceof Uint8Array) {\n return new Blob([toArrayBuffer(file)], { type: contentType });\n }\n\n return new Blob([file], { type: contentType });\n}\n\nfunction isNamedBlob(value: ShiftUploadableFile): value is Blob & { name: string } {\n return value instanceof Blob && \"name\" in value && typeof value.name === \"string\";\n}\n\nfunction toArrayBuffer(value: Uint8Array) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(value);\n return copy.buffer;\n}\n","/**\n * Shared SSE parsing for `data: {json}` lines (Ragable agent streams).\n */\nexport type SseJsonEvent = Record<string, unknown> & { type: string };\n\nexport async function parseMaybeJsonBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n try {\n return await response.text();\n } catch {\n return null;\n }\n}\n\nexport function parseSseDataLine(line: string): SseJsonEvent | null {\n const dataPrefix = \"data: \";\n if (!line.startsWith(dataPrefix)) {\n return null;\n }\n const json = line.slice(dataPrefix.length).trim();\n if (json.length === 0 || json === \"[DONE]\") {\n return null;\n }\n try {\n return JSON.parse(json) as SseJsonEvent;\n } catch {\n return null;\n }\n}\n\n/**\n * Read an SSE body and yield parsed `data:` JSON objects (double-newline framed).\n */\nexport async function* readSseStream(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseJsonEvent, void, undefined> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n for (const line of block.split(\"\\n\")) {\n const evt = parseSseDataLine(line);\n if (evt) {\n yield evt;\n }\n }\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n\n if (buffer.trim().length > 0) {\n for (const line of buffer.split(\"\\n\")) {\n const evt = parseSseDataLine(line);\n if (evt) {\n yield evt;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import {\n extractErrorMessage,\n RagableError,\n RagableRequestClient,\n} from \"./request-client\";\nimport { parseMaybeJsonBody, readSseStream } from \"./sse\";\n\nexport interface AgentSummary {\n id: string;\n name: string;\n description: string | null;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentChatMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AgentChatParams {\n message: string;\n history?: AgentChatMessage[];\n}\n\n/** Mirrors backend ExecutionResult JSON shape (traces are opaque in the SDK). */\nexport interface AgentChatResult {\n response: string;\n traces: unknown[];\n totalDurationMs: number;\n httpResponse?: unknown;\n}\n\n/**\n * Loose SSE event from POST /v1/agents/:id/chat/stream — narrows with `type` at runtime.\n */\nexport type AgentStreamEvent = Record<string, unknown> & { type: string };\n\nexport class AgentsClient {\n constructor(private readonly client: RagableRequestClient) {}\n\n async list(): Promise<{ agents: AgentSummary[] }> {\n return this.client.request(\"/v1/agents\");\n }\n\n async get(agentId: string): Promise<AgentSummary> {\n return this.client.request(`/v1/agents/${agentId}`);\n }\n\n async chat(\n agentId: string,\n params: AgentChatParams,\n ): Promise<AgentChatResult> {\n return this.client.request<AgentChatResult>(`/v1/agents/${agentId}/chat`, {\n method: \"POST\",\n body: {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n },\n });\n }\n\n /**\n * Stream agent execution as SSE (`data: {json}` lines). Yields parsed JSON objects.\n */\n async *chatStream(\n agentId: string,\n params: AgentChatParams,\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\n const response = await this.client.rawFetch(\n `/v1/agents/${agentId}/chat/stream`,\n {\n method: \"POST\",\n body: {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n },\n },\n );\n\n if (!response.ok) {\n const payload = await parseMaybeJsonBody(response);\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n const body = response.body;\n if (!body) {\n return;\n }\n\n yield* readSseStream(body);\n }\n}\n","import {\n bindFetch,\n RagableAbortError,\n RagableError,\n RagableNetworkError,\n RagableTimeoutError,\n extractErrorMessage,\n} from \"./request-client\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\" | \"HEAD\";\n\nexport interface RetryOptions {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n retryOn: number[];\n respectRetryAfter: boolean;\n}\n\nexport interface TransportOptions {\n fetch?: typeof fetch;\n headers?: HeadersInit;\n retry?: Partial<RetryOptions>;\n timeoutMs?: number;\n onRequest?: (req: TransportRequest) => void;\n onResponse?: (req: TransportRequest, res: Response, durationMs: number) => void;\n onRetry?: (req: TransportRequest, attempt: number, delayMs: number, reason: string) => void;\n}\n\nexport interface TransportRequest {\n url: string;\n method: HttpMethod;\n headers: Headers;\n body?: BodyInit;\n signal?: AbortSignal;\n idempotencyKey?: string;\n retry?: Partial<RetryOptions>;\n timeoutMs?: number;\n}\n\n// ─── Defaults ────────────────────────────────────────────────────────────────\n\nconst DEFAULT_RETRY: RetryOptions = {\n maxRetries: 3,\n baseDelayMs: 200,\n maxDelayMs: 5_000,\n retryOn: [408, 425, 429, 502, 503, 504],\n respectRetryAfter: true,\n};\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction jitteredDelay(base: number, attempt: number, max: number): number {\n const exp = Math.min(base * 2 ** attempt, max);\n return Math.round(exp * (0.5 + Math.random() * 0.5));\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const seconds = Number(header);\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const date = Date.parse(header);\n if (Number.isFinite(date)) return Math.max(0, date - Date.now());\n return null;\n}\n\nlet _uuidCounter = 0;\nexport function generateIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n _uuidCounter++;\n return `idk-${Date.now()}-${_uuidCounter}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction requestCacheKey(req: TransportRequest): string {\n return `${req.method}:${req.url}`;\n}\n\n// ─── Transport ───────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly fetchImpl: typeof fetch;\n private readonly defaultHeaders: HeadersInit | undefined;\n private readonly defaultRetry: RetryOptions;\n private readonly defaultTimeoutMs: number;\n private readonly onRequest?: TransportOptions[\"onRequest\"];\n private readonly onResponse?: TransportOptions[\"onResponse\"];\n private readonly onRetry?: TransportOptions[\"onRetry\"];\n\n private readonly inflightGets = new Map<string, Promise<Response>>();\n\n private _refreshHandler: (() => Promise<string | null>) | null = null;\n\n constructor(options: TransportOptions = {}) {\n this.fetchImpl = bindFetch(options.fetch);\n this.defaultHeaders = options.headers;\n this.defaultRetry = { ...DEFAULT_RETRY, ...options.retry };\n this.defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.onRequest = options.onRequest;\n this.onResponse = options.onResponse;\n this.onRetry = options.onRetry;\n }\n\n setRefreshHandler(handler: (() => Promise<string | null>) | null): void {\n this._refreshHandler = handler;\n }\n\n async execute(req: TransportRequest): Promise<Response> {\n if (req.method === \"GET\") {\n const key = requestCacheKey(req);\n const existing = this.inflightGets.get(key);\n if (existing) return existing;\n const promise = this._executeWithRetry(req).finally(() => {\n this.inflightGets.delete(key);\n });\n this.inflightGets.set(key, promise);\n return promise;\n }\n return this._executeWithRetry(req);\n }\n\n private async _executeWithRetry(req: TransportRequest): Promise<Response> {\n const retryOpts: RetryOptions = {\n ...this.defaultRetry,\n ...req.retry,\n };\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n\n const headers = new Headers(this.defaultHeaders);\n req.headers.forEach((v, k) => headers.set(k, v));\n if (req.idempotencyKey) {\n headers.set(\"Idempotency-Key\", req.idempotencyKey);\n }\n\n const finalReq: TransportRequest = { ...req, headers };\n\n this.onRequest?.(finalReq);\n\n let lastError: unknown;\n const maxAttempts = 1 + retryOpts.maxRetries;\n let did401Refresh = false;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await this._singleFetch(finalReq, timeoutMs);\n\n if (response.status === 401 && this._refreshHandler && !did401Refresh) {\n did401Refresh = true;\n const newToken = await this._refreshHandler();\n if (newToken) {\n finalReq.headers.set(\"Authorization\", `Bearer ${newToken}`);\n attempt--;\n continue;\n }\n }\n\n if (!response.ok && retryOpts.retryOn.includes(response.status) && attempt < maxAttempts - 1) {\n let delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\n if (retryOpts.respectRetryAfter) {\n const ra = parseRetryAfter(response.headers.get(\"retry-after\"));\n if (ra !== null) delayMs = Math.min(ra, retryOpts.maxDelayMs);\n }\n this.onRetry?.(finalReq, attempt + 1, delayMs, `HTTP ${response.status}`);\n await sleep(delayMs);\n continue;\n }\n\n return response;\n } catch (e) {\n if (e instanceof RagableAbortError || e instanceof RagableTimeoutError) {\n throw e;\n }\n lastError = e;\n if (attempt < maxAttempts - 1) {\n const delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\n this.onRetry?.(finalReq, attempt + 1, delayMs, (e as Error).message);\n await sleep(delayMs);\n continue;\n }\n }\n }\n\n throw lastError instanceof RagableNetworkError\n ? lastError\n : new RagableNetworkError(\n (lastError as Error)?.message ?? \"Network request failed\",\n lastError,\n );\n }\n\n private async _singleFetch(req: TransportRequest, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const signals: AbortSignal[] = [controller.signal];\n if (req.signal) signals.push(req.signal);\n\n const combinedSignal = signals.length === 1\n ? controller.signal\n : AbortSignal.any\n ? AbortSignal.any(signals)\n : controller.signal;\n\n if (req.signal?.aborted) {\n throw new RagableAbortError();\n }\n\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const externalAbortHandler = req.signal\n ? () => controller.abort()\n : null;\n if (externalAbortHandler && req.signal) {\n req.signal.addEventListener(\"abort\", externalAbortHandler, { once: true });\n }\n\n const start = Date.now();\n try {\n const response = await this.fetchImpl(req.url, {\n method: req.method,\n headers: req.headers,\n body: req.body,\n signal: combinedSignal,\n });\n this.onResponse?.(req, response, Date.now() - start);\n return response;\n } catch (e) {\n if ((e as Error).name === \"AbortError\") {\n if (req.signal?.aborted) throw new RagableAbortError();\n throw new RagableTimeoutError(timeoutMs);\n }\n throw new RagableNetworkError((e as Error).message, e);\n } finally {\n clearTimeout(timer);\n if (externalAbortHandler && req.signal) {\n req.signal.removeEventListener(\"abort\", externalAbortHandler);\n }\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function parseTransportResponse<T>(response: Response): Promise<T> {\n if (response.status === 204) return null as T;\n const text = await response.text();\n if (!text) return null as T;\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n if (!response.ok) {\n throw new RagableError(text.slice(0, 200), response.status, null);\n }\n return text as T;\n }\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n return payload as T;\n}\n","import { RagableError, RagableSdkError } from \"./request-client\";\nimport type {\n ColumnName,\n ColumnValue,\n DefaultRagableDatabase,\n RagableDatabase,\n RagableTableNames,\n TableInsertRow,\n TableRow,\n TableUpdatePatch,\n} from \"./database-schema\";\nimport { generateIdempotencyKey } from \"./transport\";\n\n// ─── Legacy types kept for backward compat (raw SQL path) ────────────────────\n\n/** @deprecated Kept for backward compat with `database.query()`. Not used by PostgREST path. */\nexport interface BrowserSqlExecParams {\n databaseInstanceId: string;\n sql: string;\n params?: unknown[];\n readOnly?: boolean;\n timeoutMs?: number;\n rowLimit?: number;\n}\n\n/** @deprecated Kept for backward compat with `database.query()`. Not used by PostgREST path. */\nexport interface BrowserSqlExecResult<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> {\n command: string;\n rowCount: number;\n truncated: boolean;\n rows: Row[];\n}\n\n/** @deprecated Use PostgRESTFetch instead. Kept for `database.query()` backward compat. */\nexport type RunQuery = <\n R extends Record<string, unknown> = Record<string, unknown>,\n>(\n p: BrowserSqlExecParams,\n) => Promise<BrowserSqlExecResult<R>>;\n\n// ─── PostgREST HTTP transport ────────────────────────────────────────────────\n\nexport interface PostgRESTFetchParams {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n table: string;\n searchParams: URLSearchParams;\n body?: unknown;\n headers?: Record<string, string>;\n databaseInstanceId: string;\n signal?: AbortSignal;\n idempotencyKey?: string;\n}\n\nexport type PostgRESTFetch = (\n params: PostgRESTFetchParams,\n) => Promise<Response>;\n\n// ─── Result types ────────────────────────────────────────────────────────────\n\nexport type PostgrestResult<T> =\n | {\n data: T;\n error: null;\n }\n | {\n data: null;\n error: RagableError;\n };\n\nexport async function asPostgrestResponse<T>(\n fn: () => Promise<T>,\n): Promise<PostgrestResult<T>> {\n try {\n const data = await fn();\n return { data, error: null };\n } catch (e) {\n let err: RagableError;\n if (e instanceof RagableError) {\n err = e;\n } else if (e instanceof RagableSdkError) {\n err = new RagableError(e.message, 0, { originalError: e.__type, cause: e.message });\n } else {\n const message =\n e instanceof Error ? e.message : typeof e === \"string\" ? e : \"Unknown error\";\n err = new RagableError(message, 0, null);\n }\n return { data: null, error: err };\n }\n}\n\n// ─── PostgREST filter operators ──────────────────────────────────────────────\n\ntype FilterOp = \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"like\" | \"ilike\" | \"is\" | \"in\";\n\ninterface Filter {\n op: FilterOp;\n column: string;\n value: unknown;\n}\n\nfunction encodeFilterValue(op: FilterOp, value: unknown): string {\n if (op === \"is\") return `is.${value}`;\n if (op === \"in\") {\n const vals = value as unknown[];\n return `in.(${vals.map(String).join(\",\")})`;\n }\n return `${op}.${value}`;\n}\n\n// ─── Response parsing helpers ────────────────────────────────────────────────\n\nfunction extractPostgRESTErrorMessage(\n payload: unknown,\n status: number,\n statusText: string,\n): string {\n const st = (statusText ?? \"\").trim();\n if (typeof payload !== \"object\" || payload === null) {\n return st || `HTTP ${status}`;\n }\n const p = payload as Record<string, unknown>;\n const raw = p.message ?? p.error ?? p.hint;\n let msg: string;\n if (typeof raw === \"string\") {\n msg = raw;\n } else if (typeof raw === \"number\" || typeof raw === \"boolean\") {\n msg = String(raw);\n } else if (raw !== null && raw !== undefined && typeof raw === \"object\") {\n msg = JSON.stringify(raw);\n } else {\n msg = st || `HTTP ${status}`;\n }\n msg = msg.trim();\n if (!msg) return st || `HTTP ${status}`;\n return msg;\n}\n\nasync function parsePostgRESTResponse<T>(response: Response): Promise<T> {\n if (response.status === 204) return null as T;\n\n const text = await response.text();\n if (!text) return null as T;\n\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n throw new RagableError(\n `PostgREST response parse error: ${text.slice(0, 200)}`,\n response.status,\n null,\n );\n }\n\n if (!response.ok) {\n const msg = extractPostgRESTErrorMessage(payload, response.status, response.statusText);\n throw new RagableError(msg, response.status, payload);\n }\n\n return payload as T;\n}\n\n// ─── Shared filter mixin ─────────────────────────────────────────────────────\n\ntype FilterableBuilder<\n D extends RagableDatabase,\n T extends RagableTableNames<D>,\n Self,\n> = {\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): Self;\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): Self;\n match(query: Partial<TableRow<D, T>>): Self;\n};\n\nfunction addFilterMethods<\n D extends RagableDatabase,\n T extends RagableTableNames<D>,\n B extends { filters: Filter[] },\n>(builder: B): B & FilterableBuilder<D, T, B> {\n const b = builder as B & FilterableBuilder<D, T, B>;\n for (const op of [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\", \"like\", \"ilike\"] as const) {\n (b as Record<string, unknown>)[op] = function (column: string, value: unknown) {\n b.filters.push({ op, column, value });\n return b;\n };\n }\n (b as Record<string, unknown>).is = function (column: string, value: null | boolean) {\n b.filters.push({ op: \"is\", column, value });\n return b;\n };\n (b as Record<string, unknown>).in = function (column: string, values: unknown[]) {\n b.filters.push({ op: \"in\", column, value: values });\n return b;\n };\n (b as Record<string, unknown>).match = function (query: Record<string, unknown>) {\n for (const [col, val] of Object.entries(query)) {\n if (val === null) {\n b.filters.push({ op: \"is\", column: col, value: null });\n } else {\n b.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return b;\n };\n return b;\n}\n\n// ─── SELECT builder ──────────────────────────────────────────────────────────\n\nexport class PostgrestSelectBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n D extends RagableDatabase = DefaultRagableDatabase,\n T extends RagableTableNames<D> = RagableTableNames<D>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n filters: Filter[] = [];\n private _limit?: number;\n private _offset?: number;\n private _order?: { column: string; ascending: boolean; nullsFirst?: boolean };\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly columns: string,\n ) {\n addFilterMethods<D, T, this>(this);\n }\n\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"eq\", column: column as string, value });\n return this;\n }\n\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"neq\", column: column as string, value });\n return this;\n }\n\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gt\", column: column as string, value });\n return this;\n }\n\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gte\", column: column as string, value });\n return this;\n }\n\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lt\", column: column as string, value });\n return this;\n }\n\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lte\", column: column as string, value });\n return this;\n }\n\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"like\", column: column as string, value });\n return this;\n }\n\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"ilike\", column: column as string, value });\n return this;\n }\n\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): this {\n this.filters.push({ op: \"is\", column: column as string, value });\n return this;\n }\n\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): this {\n this.filters.push({ op: \"in\", column: column as string, value: values });\n return this;\n }\n\n match(query: Partial<TableRow<D, T>>): this {\n for (const [col, val] of Object.entries(query as Record<string, unknown>)) {\n if (val === null) {\n this.filters.push({ op: \"is\", column: col, value: null });\n } else {\n this.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return this;\n }\n\n limit(n: number): this {\n this._limit = n;\n return this;\n }\n\n offset(n: number): this {\n this._offset = n;\n return this;\n }\n\n range(from: number, to: number): this {\n this._offset = from;\n this._limit = to - from + 1;\n return this;\n }\n\n order(\n column: ColumnName<D, T>,\n options?: { ascending?: boolean; nullsFirst?: boolean },\n ): this {\n this._order = {\n column: column as string,\n ascending: options?.ascending !== false,\n nullsFirst: options?.nullsFirst,\n };\n return this;\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n private buildSearchParams(): URLSearchParams {\n const sp = new URLSearchParams();\n if (this.columns && this.columns !== \"*\") {\n sp.set(\"select\", this.columns);\n }\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n if (this._order) {\n let orderStr = `${this._order.column}.${this._order.ascending ? \"asc\" : \"desc\"}`;\n if (this._order.nullsFirst === true) orderStr += \".nullsfirst\";\n else if (this._order.nullsFirst === false) orderStr += \".nullslast\";\n sp.set(\"order\", orderStr);\n }\n if (this._limit != null) {\n sp.set(\"limit\", String(Math.max(0, Math.floor(this._limit))));\n }\n if (this._offset != null && this._offset > 0) {\n sp.set(\"offset\", String(Math.max(0, Math.floor(this._offset))));\n }\n return sp;\n }\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n const response = await this.pgFetch({\n method: \"GET\",\n table: this.table,\n searchParams: this.buildSearchParams(),\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return asPostgrestResponse(async () => {\n const sp = this.buildSearchParams();\n const response = await this.pgFetch({\n method: \"GET\",\n table: this.table,\n searchParams: sp,\n headers: { Accept: \"application/vnd.pgrst.object+json\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n });\n return parsePostgRESTResponse<Row>(response);\n });\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n return asPostgrestResponse(async () => {\n const response = await this.pgFetch({\n method: \"GET\",\n table: this.table,\n searchParams: this.buildSearchParams(),\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n });\n const rows = await parsePostgRESTResponse<Row[]>(response);\n if (rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0] ?? null;\n });\n }\n}\n\n// ─── INSERT builders ─────────────────────────────────────────────────────────\n\nexport class PostgrestInsertRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly rows: Record<string, unknown>[],\n ) {}\n\n select(columns = \"*\"): PostgrestInsertReturningBuilder<Row> {\n return new PostgrestInsertReturningBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n this.rows,\n columns,\n this._signal,\n );\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n if (this.rows.length === 0) return null;\n const body = this.rows.length === 1 ? this.rows[0] : this.rows;\n const response = await this.pgFetch({\n method: \"POST\",\n table: this.table,\n searchParams: new URLSearchParams(),\n body,\n headers: { Prefer: \"return=minimal\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n await parsePostgRESTResponse<null>(response);\n return null;\n });\n }\n}\n\nexport class PostgrestInsertReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly rows: Record<string, unknown>[],\n private readonly returning: string,\n private readonly _signal?: AbortSignal,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n if (this.rows.length === 0) return [];\n const body = this.rows.length === 1 ? this.rows[0] : this.rows;\n const sp = new URLSearchParams();\n if (this.returning && this.returning !== \"*\") {\n sp.set(\"select\", this.returning);\n }\n const response = await this.pgFetch({\n method: \"POST\",\n table: this.table,\n searchParams: sp,\n body,\n headers: { Prefer: \"return=representation\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0]!;\n });\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0] ?? null;\n });\n }\n}\n\n// ─── UPDATE builders ─────────────────────────────────────────────────────────\n\nexport class PostgrestUpdateRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n D extends RagableDatabase = DefaultRagableDatabase,\n T extends RagableTableNames<D> = RagableTableNames<D>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n filters: Filter[] = [];\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly patch: Record<string, unknown>,\n ) {}\n\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"eq\", column: column as string, value });\n return this;\n }\n\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"neq\", column: column as string, value });\n return this;\n }\n\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gt\", column: column as string, value });\n return this;\n }\n\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gte\", column: column as string, value });\n return this;\n }\n\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lt\", column: column as string, value });\n return this;\n }\n\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lte\", column: column as string, value });\n return this;\n }\n\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"like\", column: column as string, value });\n return this;\n }\n\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"ilike\", column: column as string, value });\n return this;\n }\n\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): this {\n this.filters.push({ op: \"is\", column: column as string, value });\n return this;\n }\n\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): this {\n this.filters.push({ op: \"in\", column: column as string, value: values });\n return this;\n }\n\n match(query: Partial<TableRow<D, T>>): this {\n for (const [col, val] of Object.entries(query as Record<string, unknown>)) {\n if (val === null) {\n this.filters.push({ op: \"is\", column: col, value: null });\n } else {\n this.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return this;\n }\n\n select(columns = \"*\"): PostgrestUpdateReturningBuilder<Row> {\n return new PostgrestUpdateReturningBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n this.patch,\n this.filters,\n columns,\n this._signal,\n );\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private buildSearchParams(): URLSearchParams {\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n return sp;\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n const keys = Object.keys(this.patch);\n if (keys.length === 0) {\n throw new RagableError(\"Empty update payload\", 400, null);\n }\n const response = await this.pgFetch({\n method: \"PATCH\",\n table: this.table,\n searchParams: this.buildSearchParams(),\n body: this.patch,\n headers: { Prefer: \"return=minimal\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n await parsePostgRESTResponse<null>(response);\n return null;\n });\n }\n}\n\nexport class PostgrestUpdateReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly patch: Record<string, unknown>,\n private readonly filters: Filter[],\n private readonly returning: string,\n private readonly _signal?: AbortSignal,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n const keys = Object.keys(this.patch);\n if (keys.length === 0) {\n throw new RagableError(\"Empty update payload\", 400, null);\n }\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n if (this.returning && this.returning !== \"*\") {\n sp.set(\"select\", this.returning);\n }\n const response = await this.pgFetch({\n method: \"PATCH\",\n table: this.table,\n searchParams: sp,\n body: this.patch,\n headers: { Prefer: \"return=representation\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0]!;\n });\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0] ?? null;\n });\n }\n}\n\n// ─── DELETE builders ─────────────────────────────────────────────────────────\n\nexport class PostgrestDeleteRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n D extends RagableDatabase = DefaultRagableDatabase,\n T extends RagableTableNames<D> = RagableTableNames<D>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n filters: Filter[] = [];\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n ) {}\n\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"eq\", column: column as string, value });\n return this;\n }\n\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"neq\", column: column as string, value });\n return this;\n }\n\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gt\", column: column as string, value });\n return this;\n }\n\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gte\", column: column as string, value });\n return this;\n }\n\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lt\", column: column as string, value });\n return this;\n }\n\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lte\", column: column as string, value });\n return this;\n }\n\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"like\", column: column as string, value });\n return this;\n }\n\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"ilike\", column: column as string, value });\n return this;\n }\n\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): this {\n this.filters.push({ op: \"is\", column: column as string, value });\n return this;\n }\n\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): this {\n this.filters.push({ op: \"in\", column: column as string, value: values });\n return this;\n }\n\n match(query: Partial<TableRow<D, T>>): this {\n for (const [col, val] of Object.entries(query as Record<string, unknown>)) {\n if (val === null) {\n this.filters.push({ op: \"is\", column: col, value: null });\n } else {\n this.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return this;\n }\n\n select(columns = \"*\"): PostgrestDeleteReturningBuilder<Row> {\n return new PostgrestDeleteReturningBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n this.filters,\n columns,\n this._signal,\n );\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n const response = await this.pgFetch({\n method: \"DELETE\",\n table: this.table,\n searchParams: sp,\n headers: { Prefer: \"return=minimal\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n await parsePostgRESTResponse<null>(response);\n return null;\n });\n }\n}\n\nexport class PostgrestDeleteReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly filters: Filter[],\n private readonly returning: string,\n private readonly _signal?: AbortSignal,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n if (this.returning && this.returning !== \"*\") {\n sp.set(\"select\", this.returning);\n }\n const response = await this.pgFetch({\n method: \"DELETE\",\n table: this.table,\n searchParams: sp,\n headers: { Prefer: \"return=representation\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0]!;\n });\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0] ?? null;\n });\n }\n}\n\n// ─── UPSERT builders ─────────────────────────────────────────────────────────\n\nexport interface PostgrestUpsertOptions {\n onConflict: string;\n ignoreDuplicates?: boolean;\n}\n\nexport class PostgrestUpsertRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly rows: Record<string, unknown>[],\n private readonly onConflict: string,\n private readonly ignoreDuplicates: boolean,\n ) {}\n\n select(columns = \"*\"): PostgrestUpsertReturningBuilder<Row> {\n return new PostgrestUpsertReturningBuilder(this, columns);\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n await this.runUpsert(\"return=minimal\", null);\n return null;\n });\n }\n\n async runUpsert(\n prefer: string,\n selectCols: string | null,\n ): Promise<Row[]> {\n if (this.rows.length === 0) return [];\n\n const body = this.rows.length === 1 ? this.rows[0] : this.rows;\n const sp = new URLSearchParams();\n sp.set(\"on_conflict\", this.onConflict);\n if (selectCols && selectCols !== \"*\") {\n sp.set(\"select\", selectCols);\n }\n\n const resolution = this.ignoreDuplicates\n ? \"resolution=ignore-duplicates\"\n : \"resolution=merge-duplicates\";\n\n const response = await this.pgFetch({\n method: \"POST\",\n table: this.table,\n searchParams: sp,\n body,\n headers: { Prefer: `${prefer},${resolution}` },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n\n if (prefer.includes(\"return=minimal\")) {\n await parsePostgRESTResponse<null>(response);\n return [];\n }\n\n return parsePostgRESTResponse<Row[]>(response);\n }\n}\n\nexport class PostgrestUpsertReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly root: PostgrestUpsertRootBuilder<Row>,\n private readonly returning: string,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n return this.root.runUpsert(\"return=representation\", this.returning);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0]!;\n });\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n return asPostgrestResponse(async () => {\n const { data, error } = await this.executeMany();\n if (error) throw error;\n const rows = data ?? [];\n if (rows.length > 1) {\n throw new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n );\n }\n return rows[0] ?? null;\n });\n }\n}\n\n// ─── Table entry point ───────────────────────────────────────────────────────\n\nexport class PostgrestTableApi<\n Database extends RagableDatabase = DefaultRagableDatabase,\n TableName extends RagableTableNames<Database> = RagableTableNames<Database>,\n> {\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: TableName extends string ? string : string,\n ) {}\n\n select(columns = \"*\"): PostgrestSelectBuilder<TableRow<Database, TableName>, Database, TableName> {\n return new PostgrestSelectBuilder<TableRow<Database, TableName>, Database, TableName>(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n columns,\n );\n }\n\n insert(\n values:\n | TableInsertRow<Database, TableName>\n | TableInsertRow<Database, TableName>[],\n ...rest: unknown[]\n ): PostgrestInsertRootBuilder<TableRow<Database, TableName>> {\n if (rest.length > 0) {\n throw new RagableError(\n \".insert() accepts only one argument: the row object or an array of rows. \" +\n \"Do not pass readOnly, options, or a second object — those apply only to database.query({ sql, readOnly }). \" +\n \"PostgREST inserts are writes by default.\",\n 400,\n { code: \"SDK_INSERT_EXTRA_ARGS\" },\n );\n }\n const rows = (Array.isArray(values) ? values : [values]) as Record<\n string,\n unknown\n >[];\n return new PostgrestInsertRootBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n rows,\n );\n }\n\n update(\n patch: TableUpdatePatch<Database, TableName>,\n ): PostgrestUpdateRootBuilder<TableRow<Database, TableName>, Database, TableName> {\n return new PostgrestUpdateRootBuilder<TableRow<Database, TableName>, Database, TableName>(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n patch as Record<string, unknown>,\n );\n }\n\n delete(): PostgrestDeleteRootBuilder<TableRow<Database, TableName>, Database, TableName> {\n return new PostgrestDeleteRootBuilder<TableRow<Database, TableName>, Database, TableName>(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n );\n }\n\n upsert(\n values:\n | TableInsertRow<Database, TableName>\n | TableInsertRow<Database, TableName>[],\n options: PostgrestUpsertOptions,\n ): PostgrestUpsertRootBuilder<TableRow<Database, TableName>> {\n const rows = (Array.isArray(values) ? values : [values]) as Record<\n string,\n unknown\n >[];\n return new PostgrestUpsertRootBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n rows,\n options.onConflict,\n options.ignoreDuplicates === true,\n );\n }\n}\n","// ─── SessionStorage interface ────────────────────────────────────────────────\n\nexport interface SessionStorage {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\n// ─── Adapters ────────────────────────────────────────────────────────────────\n\nexport class LocalStorageAdapter implements SessionStorage {\n getItem(key: string): string | null {\n try {\n return globalThis.localStorage.getItem(key);\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n globalThis.localStorage.setItem(key, value);\n } catch { /* quota exceeded or blocked — best effort */ }\n }\n\n removeItem(key: string): void {\n try {\n globalThis.localStorage.removeItem(key);\n } catch { /* noop */ }\n }\n}\n\nexport class SessionStorageAdapter implements SessionStorage {\n getItem(key: string): string | null {\n try {\n return globalThis.sessionStorage.getItem(key);\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n globalThis.sessionStorage.setItem(key, value);\n } catch { /* noop */ }\n }\n\n removeItem(key: string): void {\n try {\n globalThis.sessionStorage.removeItem(key);\n } catch { /* noop */ }\n }\n}\n\nexport class MemoryStorageAdapter implements SessionStorage {\n private store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n}\n\nexport class CookieStorageAdapter implements SessionStorage {\n constructor(\n private readonly maxAge = 30 * 24 * 60 * 60,\n private readonly path = \"/\",\n private readonly sameSite: \"Lax\" | \"Strict\" | \"None\" = \"Lax\",\n ) {}\n\n getItem(key: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie\n .split(\"; \")\n .find((c) => c.startsWith(`${encodeURIComponent(key)}=`));\n if (!match) return null;\n return decodeURIComponent(match.split(\"=\").slice(1).join(\"=\"));\n }\n\n setItem(key: string, value: string): void {\n if (typeof document === \"undefined\") return;\n const parts = [\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`,\n `path=${this.path}`,\n `max-age=${this.maxAge}`,\n `SameSite=${this.sameSite}`,\n ];\n if (this.sameSite === \"None\") parts.push(\"Secure\");\n document.cookie = parts.join(\"; \");\n }\n\n removeItem(key: string): void {\n if (typeof document === \"undefined\") return;\n document.cookie = `${encodeURIComponent(key)}=; path=${this.path}; max-age=0`;\n }\n}\n\n// ─── Default storage detection ───────────────────────────────────────────────\n\nexport function detectStorage(): SessionStorage {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.localStorage !== \"undefined\") {\n try {\n const testKey = \"__ragable_test__\";\n globalThis.localStorage.setItem(testKey, \"1\");\n globalThis.localStorage.removeItem(testKey);\n return new LocalStorageAdapter();\n } catch { /* blocked */ }\n }\n return new MemoryStorageAdapter();\n}\n\n// ─── BroadcastChannel helper ─────────────────────────────────────────────────\n\nexport type AuthBroadcastMessage =\n | { type: \"SESSION_UPDATED\"; payload: string }\n | { type: \"SESSION_REMOVED\" };\n\nexport class AuthBroadcastChannel {\n private channel: BroadcastChannel | null = null;\n\n constructor(channelName: string) {\n if (typeof BroadcastChannel !== \"undefined\") {\n try {\n this.channel = new BroadcastChannel(channelName);\n } catch { /* unsupported */ }\n }\n }\n\n onMessage(cb: (msg: AuthBroadcastMessage) => void): void {\n if (this.channel) {\n this.channel.onmessage = (e: MessageEvent) => {\n const data = e.data as AuthBroadcastMessage;\n if (data && typeof data.type === \"string\") {\n cb(data);\n }\n };\n }\n }\n\n postSessionUpdated(serialized: string): void {\n this.channel?.postMessage({ type: \"SESSION_UPDATED\", payload: serialized } satisfies AuthBroadcastMessage);\n }\n\n postSessionRemoved(): void {\n this.channel?.postMessage({ type: \"SESSION_REMOVED\" } satisfies AuthBroadcastMessage);\n }\n\n close(): void {\n this.channel?.close();\n this.channel = null;\n }\n}\n","import {\n bindFetch,\n extractErrorMessage,\n RagableError,\n} from \"./request-client\";\nimport type {\n SessionStorage,\n} from \"./auth-storage\";\nimport {\n AuthBroadcastChannel,\n detectStorage,\n} from \"./auth-storage\";\nimport {\n asPostgrestResponse,\n type PostgrestResult,\n} from \"./browser-postgrest\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type AuthChangeEvent =\n | \"INITIAL_SESSION\"\n | \"SIGNED_IN\"\n | \"SIGNED_OUT\"\n | \"TOKEN_REFRESHED\"\n | \"USER_UPDATED\";\n\nexport interface AuthSession<\n U extends Record<string, unknown> = Record<string, unknown>,\n> {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n expires_at: number;\n token_type: \"bearer\";\n user: U;\n}\n\nexport interface AuthOptions {\n persistSession?: boolean;\n autoRefreshToken?: boolean;\n storage?: SessionStorage;\n storageKey?: string;\n refreshSkewSeconds?: number;\n debug?: boolean;\n}\n\nexport interface RagableAuthConfig {\n baseUrl: string;\n authGroupId: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n auth?: AuthOptions;\n}\n\ntype AuthListener<U extends Record<string, unknown>> = (\n event: AuthChangeEvent,\n session: AuthSession<U> | null,\n) => void;\n\ninterface Subscription {\n id: string;\n unsubscribe: () => void;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction parseExpiresInSeconds(raw: string | number): number {\n if (typeof raw === \"number\") return raw;\n const s = raw.trim().toLowerCase();\n const m = /^(\\d+)([smhd])?$/.exec(s);\n if (m) {\n const n = Number(m[1]);\n const u = m[2] ?? \"s\";\n const mult =\n u === \"s\" ? 1 : u === \"m\" ? 60 : u === \"h\" ? 3600 : u === \"d\" ? 86400 : 1;\n return n * mult;\n }\n const asNum = Number(s);\n return Number.isFinite(asNum) ? asNum : 0;\n}\n\nasync function parseJsonOrThrow<T>(response: Response): Promise<T> {\n const text = await response.text();\n let payload: unknown;\n try {\n payload = text ? JSON.parse(text) : null;\n } catch {\n throw new RagableError(`Response parse error: ${text.slice(0, 200)}`, response.status, null);\n }\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n return payload as T;\n}\n\nlet _subCounter = 0;\n\n// ─── RagableAuth ─────────────────────────────────────────────────────────────\n\nexport class RagableAuth<\n U extends Record<string, unknown> = Record<string, unknown>,\n> {\n private readonly fetchImpl: typeof fetch;\n private readonly baseUrl: string;\n private readonly authGroupId: string;\n private readonly defaultHeaders: HeadersInit | undefined;\n private readonly persistSession: boolean;\n private readonly autoRefreshToken: boolean;\n private readonly storage: SessionStorage;\n private readonly storageKey: string;\n private readonly refreshSkewSeconds: number;\n private readonly debug: boolean;\n\n private currentSession: AuthSession<U> | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private refreshPromise: Promise<AuthSession<U> | null> | null = null;\n private listeners = new Map<string, AuthListener<U>>();\n private broadcast: AuthBroadcastChannel | null = null;\n private visibilityHandler: (() => void) | null = null;\n private initialized = false;\n\n constructor(config: RagableAuthConfig) {\n this.baseUrl = config.baseUrl;\n this.authGroupId = config.authGroupId;\n this.fetchImpl = bindFetch(config.fetch);\n this.defaultHeaders = config.headers;\n\n const auth = config.auth ?? {};\n this.persistSession = auth.persistSession !== false;\n this.autoRefreshToken = auth.autoRefreshToken !== false;\n this.storage = auth.storage ?? detectStorage();\n this.storageKey = auth.storageKey ?? `ragable.session.${this.authGroupId}`;\n this.refreshSkewSeconds = auth.refreshSkewSeconds ?? 60;\n this.debug = auth.debug ?? false;\n\n this.broadcast = new AuthBroadcastChannel(`ragable-auth-${this.authGroupId}`);\n this.broadcast.onMessage((msg) => {\n if (msg.type === \"SESSION_UPDATED\") {\n try {\n const session = JSON.parse(msg.payload) as AuthSession<U>;\n this.currentSession = session;\n this.scheduleRefresh(session);\n this.emit(\"TOKEN_REFRESHED\", session);\n } catch { /* ignore bad data from other tab */ }\n } else if (msg.type === \"SESSION_REMOVED\") {\n this.currentSession = null;\n this.clearRefreshTimer();\n this.emit(\"SIGNED_OUT\", null);\n }\n });\n\n this.setupVisibilityListener();\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.debug(\"[RagableAuth]\", ...args);\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n async initialize(): Promise<AuthSession<U> | null> {\n if (this.initialized) return this.currentSession;\n this.initialized = true;\n if (this.persistSession) {\n try {\n const raw = await this.storage.getItem(this.storageKey);\n if (raw) {\n const session = JSON.parse(raw) as AuthSession<U>;\n if (session.expires_at && session.expires_at > nowSeconds()) {\n this.currentSession = session;\n this.scheduleRefresh(session);\n this.log(\"Restored session from storage\");\n } else if (session.refresh_token) {\n this.log(\"Stored session expired, attempting refresh\");\n const refreshed = await this._doRefresh(session.refresh_token);\n if (refreshed) {\n this.currentSession = refreshed;\n }\n }\n }\n } catch (e) {\n this.log(\"Failed to restore session\", e);\n }\n }\n this.emit(\"INITIAL_SESSION\", this.currentSession);\n return this.currentSession;\n }\n\n // ── Auth methods ───────────────────────────────────────────────────────────\n\n async signUp(credentials: {\n email: string;\n password: string;\n options?: { data?: Record<string, unknown> };\n }): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\n return asPostgrestResponse(async () => {\n const name =\n typeof credentials.options?.data?.name === \"string\"\n ? credentials.options.data.name\n : undefined;\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/register\", \"POST\", {\n email: credentials.email,\n password: credentials.password,\n ...(name !== undefined ? { name } : {}),\n });\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return { user: session.user, session };\n });\n }\n\n async signInWithPassword(credentials: {\n email: string;\n password: string;\n }): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\n return asPostgrestResponse(async () => {\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/login\", \"POST\", {\n email: credentials.email,\n password: credentials.password,\n });\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return { user: session.user, session };\n });\n }\n\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{ error: null }> {\n this.currentSession = null;\n this.clearRefreshTimer();\n if (this.persistSession) {\n await this.storage.removeItem(this.storageKey);\n }\n this.broadcast?.postSessionRemoved();\n this.emit(\"SIGNED_OUT\", null);\n return { error: null };\n }\n\n async refreshSession(\n refreshToken?: string,\n ): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\n return asPostgrestResponse(async () => {\n const token = refreshToken ?? this.currentSession?.refresh_token;\n if (!token) throw new RagableError(\"No refresh token available\", 401, null);\n const session = await this.singleFlightRefresh(token);\n if (!session) throw new RagableError(\"Refresh failed\", 401, null);\n return { session, user: session.user };\n });\n }\n\n async getSession(): Promise<PostgrestResult<{ session: AuthSession<U> | null }>> {\n if (!this.initialized) await this.initialize();\n return { data: { session: this.currentSession }, error: null };\n }\n\n async getUser(): Promise<PostgrestResult<{ user: U }>> {\n return asPostgrestResponse(async () => {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\n });\n }\n\n async setSession(tokens: {\n access_token: string;\n refresh_token: string;\n }): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\n return asPostgrestResponse(async () => {\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", tokens.access_token);\n const decoded = decodeJwtExpiry(tokens.access_token);\n const expiresIn = decoded ? decoded - nowSeconds() : 3600;\n const session: AuthSession<U> = {\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n expires_in: expiresIn,\n expires_at: nowSeconds() + expiresIn,\n token_type: \"bearer\",\n user: me.user,\n };\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return { session, user: me.user };\n });\n }\n\n async updateUser(attributes: {\n email?: string;\n password?: string;\n data?: { name?: string | null };\n }): Promise<PostgrestResult<{ user: U }>> {\n return asPostgrestResponse(async () => {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, {\n ...(attributes.password !== undefined ? { password: attributes.password } : {}),\n ...(attributes.data?.name !== undefined ? { name: attributes.data.name } : {}),\n });\n if (this.currentSession) {\n this.currentSession = { ...this.currentSession, user: result.user };\n await this.persistCurrentSession();\n }\n this.emit(\"USER_UPDATED\", this.currentSession);\n return result;\n });\n }\n\n // ── Event subscription ─────────────────────────────────────────────────────\n\n onAuthStateChange(\n callback: AuthListener<U>,\n ): { data: { subscription: Subscription } } {\n _subCounter++;\n const id = `sub-${_subCounter}`;\n this.listeners.set(id, callback);\n const unsubscribe = () => {\n this.listeners.delete(id);\n };\n return { data: { subscription: { id, unsubscribe } } };\n }\n\n // ── Accessors ──────────────────────────────────────────────────────────────\n\n getAccessToken(): string | null {\n return this.currentSession?.access_token ?? null;\n }\n\n getCurrentSession(): AuthSession<U> | null {\n return this.currentSession;\n }\n\n // ── Back-compat: raw Ragable auth methods ──────────────────────────────────\n\n async register(body: {\n email: string;\n password: string;\n name?: string;\n }): Promise<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }> {\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/register\", \"POST\", body);\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return raw;\n }\n\n async login(body: {\n email: string;\n password: string;\n }): Promise<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }> {\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/login\", \"POST\", body);\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return raw;\n }\n\n async refresh(body: { refreshToken: string }): Promise<{\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }> {\n return this.fetchAuth(\"/refresh\", \"POST\", body);\n }\n\n async getMe(): Promise<{ user: U }> {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\n }\n\n async updateMe(body: {\n name?: string | null;\n password?: string;\n }): Promise<{ user: U }> {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, body);\n if (this.currentSession) {\n this.currentSession = { ...this.currentSession, user: result.user };\n await this.persistCurrentSession();\n }\n this.emit(\"USER_UPDATED\", this.currentSession);\n return result;\n }\n\n // ── Cleanup ────────────────────────────────────────────────────────────────\n\n destroy(): void {\n this.clearRefreshTimer();\n this.broadcast?.close();\n this.listeners.clear();\n if (this.visibilityHandler && typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n }\n\n // ─── Internal ──────────────────────────────────────────────────────────────\n\n private authPrefix(): string {\n return `/auth-groups/${this.authGroupId}/auth`;\n }\n\n private toUrl(path: string): string {\n return `${this.baseUrl}${this.authPrefix()}${path}`;\n }\n\n private baseHeaders(json: boolean): Headers {\n const h = new Headers(this.defaultHeaders);\n if (json) h.set(\"Content-Type\", \"application/json\");\n return h;\n }\n\n private async fetchAuth<T>(\n path: string,\n method: \"GET\" | \"POST\" | \"PATCH\",\n body?: unknown,\n ): Promise<T> {\n const headers = this.baseHeaders(body !== undefined);\n const response = await this.fetchImpl(this.toUrl(path), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n return parseJsonOrThrow<T>(response);\n }\n\n private async fetchAuthWithBearer<T>(\n path: string,\n method: \"GET\" | \"POST\" | \"PATCH\",\n token: string,\n body?: unknown,\n ): Promise<T> {\n const headers = this.baseHeaders(body !== undefined);\n headers.set(\"Authorization\", `Bearer ${token}`);\n const response = await this.fetchImpl(this.toUrl(path), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n return parseJsonOrThrow<T>(response);\n }\n\n private rawToSession(raw: {\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }): AuthSession<U> {\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\n return {\n access_token: raw.accessToken,\n refresh_token: raw.refreshToken,\n expires_in: expiresIn,\n expires_at: nowSeconds() + expiresIn,\n token_type: \"bearer\",\n user: raw.user,\n };\n }\n\n private async setSessionInternal(\n session: AuthSession<U>,\n event: AuthChangeEvent,\n ): Promise<void> {\n this.currentSession = session;\n await this.persistCurrentSession();\n this.broadcast?.postSessionUpdated(JSON.stringify(session));\n this.scheduleRefresh(session);\n this.emit(event, session);\n }\n\n private async persistCurrentSession(): Promise<void> {\n if (!this.persistSession || !this.currentSession) return;\n try {\n await this.storage.setItem(this.storageKey, JSON.stringify(this.currentSession));\n } catch (e) {\n this.log(\"Failed to persist session\", e);\n }\n }\n\n private emit(event: AuthChangeEvent, session: AuthSession<U> | null): void {\n this.log(event, session?.user);\n for (const cb of this.listeners.values()) {\n try {\n cb(event, session);\n } catch (e) {\n this.log(\"Listener threw\", e);\n }\n }\n }\n\n // ─── Refresh scheduling ────────────────────────────────────────────────────\n\n private scheduleRefresh(session: AuthSession<U>): void {\n this.clearRefreshTimer();\n if (!this.autoRefreshToken) return;\n const secondsUntilExpiry = session.expires_at - nowSeconds();\n const refreshIn = Math.max(0, secondsUntilExpiry - this.refreshSkewSeconds);\n this.log(`Scheduling refresh in ${refreshIn}s`);\n this.refreshTimer = setTimeout(() => {\n this.singleFlightRefresh(session.refresh_token).catch((e) => {\n this.log(\"Scheduled refresh failed\", e);\n });\n }, refreshIn * 1000);\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer !== null) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n async singleFlightRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\n if (this.refreshPromise) return this.refreshPromise;\n this.refreshPromise = this._doRefresh(refreshToken).finally(() => {\n this.refreshPromise = null;\n });\n return this.refreshPromise;\n }\n\n private async _doRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\n try {\n const raw = await this.fetchAuth<{\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/refresh\", \"POST\", { refreshToken });\n\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", raw.accessToken);\n\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\n const session: AuthSession<U> = {\n access_token: raw.accessToken,\n refresh_token: raw.refreshToken,\n expires_in: expiresIn,\n expires_at: nowSeconds() + expiresIn,\n token_type: \"bearer\",\n user: me.user,\n };\n\n await this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n return session;\n } catch (e) {\n this.log(\"Refresh failed\", e);\n return null;\n }\n }\n\n // ─── Visibility listener ───────────────────────────────────────────────────\n\n private setupVisibilityListener(): void {\n if (typeof document === \"undefined\") return;\n this.visibilityHandler = () => {\n if (document.visibilityState === \"visible\" && this.currentSession) {\n const secondsUntilExpiry = this.currentSession.expires_at - nowSeconds();\n if (secondsUntilExpiry <= this.refreshSkewSeconds) {\n this.singleFlightRefresh(this.currentSession.refresh_token).catch(() => {});\n } else {\n this.scheduleRefresh(this.currentSession);\n }\n } else {\n this.clearRefreshTimer();\n }\n };\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n}\n\nfunction nowSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nfunction decodeJwtExpiry(jwt: string): number | null {\n try {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\")));\n return typeof payload.exp === \"number\" ? payload.exp : null;\n } catch {\n return null;\n }\n}\n","import {\n bindFetch,\n DEFAULT_RAGABLE_API_BASE,\n extractErrorMessage,\n RagableError,\n} from \"./request-client\";\nimport type { AgentChatParams, AgentStreamEvent } from \"./agents\";\nimport type {\n DefaultRagableDatabase,\n RagableDatabase,\n RagableTableNames,\n} from \"./database-schema\";\nimport { parseMaybeJsonBody, readSseStream } from \"./sse\";\nimport {\n PostgrestTableApi,\n type PostgRESTFetch,\n type PostgRESTFetchParams,\n type PostgrestResult,\n} from \"./browser-postgrest\";\nimport {\n RagableAuth,\n type AuthChangeEvent,\n type AuthOptions,\n type AuthSession,\n} from \"./auth\";\nimport { Transport, type TransportOptions } from \"./transport\";\n\nexport function normalizeBrowserApiBase(baseUrl?: string): string {\n const trimmed = (baseUrl ?? DEFAULT_RAGABLE_API_BASE)\n .trim()\n .replace(/\\/+$/, \"\");\n return trimmed.endsWith(\"/api\") ? trimmed : `${trimmed}/api`;\n}\n\nexport type BrowserDataAuthMode = \"user\" | \"publicAnon\" | \"admin\";\n\nexport interface RagableBrowserClientOptions {\n organizationId: string;\n authGroupId?: string;\n databaseInstanceId?: string;\n dataAuth?: BrowserDataAuthMode;\n dataStaticKey?: string;\n getDataStaticKey?: () => string | null | Promise<string | null>;\n getAccessToken?: () => string | null | Promise<string | null>;\n baseUrl?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n auth?: AuthOptions;\n transport?: Partial<TransportOptions>;\n}\n\nfunction requireAuthGroupId(options: RagableBrowserClientOptions): string {\n const id = options.authGroupId?.trim();\n if (!id) {\n throw new RagableError(\n \"authGroupId is required for auth and database methods on the browser client\",\n 400,\n { code: \"SDK_MISSING_AUTH_GROUP_ID\" },\n );\n }\n return id;\n}\n\nasync function requireAccessToken(\n options: RagableBrowserClientOptions,\n ragableAuth: RagableAuth | null,\n): Promise<string> {\n if (ragableAuth) {\n const token = ragableAuth.getAccessToken();\n if (token) return token;\n }\n const getter = options.getAccessToken;\n if (getter) {\n const token = await getter();\n if (token?.trim()) return token.trim();\n }\n throw new RagableError(\n \"No access token available. Sign in first with auth.signInWithPassword() or provide getAccessToken callback.\",\n 401,\n { code: \"SDK_NO_ACCESS_TOKEN\" },\n );\n}\n\nasync function resolveDatabaseAuthBearer(\n options: RagableBrowserClientOptions,\n ragableAuth: RagableAuth | null,\n): Promise<string> {\n const mode: BrowserDataAuthMode = options.dataAuth ?? \"user\";\n if (mode === \"user\") {\n return requireAccessToken(options, ragableAuth);\n }\n const fromGetter = options.getDataStaticKey\n ? await options.getDataStaticKey()\n : null;\n const key = (fromGetter?.trim() || options.dataStaticKey?.trim()) ?? \"\";\n if (!key) {\n throw new RagableError(\n mode === \"publicAnon\"\n ? \"dataAuth publicAnon requires getDataStaticKey or dataStaticKey\"\n : \"dataAuth admin requires getDataStaticKey or dataStaticKey\",\n 400,\n { code: \"SDK_MISSING_STATIC_KEY\" },\n );\n }\n return key;\n}\n\nasync function parseJsonOrThrow<T>(response: Response): Promise<T> {\n const payload = await parseMaybeJsonBody(response);\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n return payload as T;\n}\n\n// ─── Session types (kept for back-compat) ────────────────────────────────────\n\nexport interface BrowserAuthSession<\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n user: AuthUser;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n}\n\nexport interface BrowserAuthTokens {\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n}\n\nexport interface SupabaseCompatSession<\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n token_type: \"bearer\";\n user: AuthUser;\n}\n\nexport type { PostgrestResult };\n\n// ─── RagableBrowserAuthClient (back-compat shim) ─────────────────────────────\n\nexport class RagableBrowserAuthClient<\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n constructor(\n _options: RagableBrowserClientOptions,\n private readonly ragableAuth: RagableAuth<AuthUser> | null = null,\n ) {}\n\n private get auth(): RagableAuth<AuthUser> {\n if (!this.ragableAuth) {\n throw new Error(\"Auth not initialized — provide authGroupId to enable auth\");\n }\n return this.ragableAuth;\n }\n\n async signUp(credentials: {\n email: string;\n password: string;\n options?: { data?: Record<string, unknown> };\n }): Promise<\n PostgrestResult<{\n user: AuthUser;\n session: SupabaseCompatSession<AuthUser>;\n }>\n > {\n const result = await this.auth.signUp(credentials);\n if (result.error) return { data: null, error: result.error };\n const session = result.data!.session;\n return {\n data: {\n user: session.user,\n session: {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_in: session.expires_in,\n token_type: \"bearer\",\n user: session.user,\n },\n },\n error: null,\n };\n }\n\n async signInWithPassword(credentials: {\n email: string;\n password: string;\n }): Promise<\n PostgrestResult<{\n user: AuthUser;\n session: SupabaseCompatSession<AuthUser>;\n }>\n > {\n const result = await this.auth.signInWithPassword(credentials);\n if (result.error) return { data: null, error: result.error };\n const session = result.data!.session;\n return {\n data: {\n user: session.user,\n session: {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_in: session.expires_in,\n token_type: \"bearer\",\n user: session.user,\n },\n },\n error: null,\n };\n }\n\n async refreshSession(refreshToken: string): Promise<\n PostgrestResult<{ session: SupabaseCompatSession<AuthUser>; user: AuthUser }>\n > {\n const result = await this.auth.refreshSession(refreshToken);\n if (result.error) return { data: null, error: result.error };\n const session = result.data!.session;\n return {\n data: {\n user: session.user,\n session: {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_in: session.expires_in,\n token_type: \"bearer\",\n user: session.user,\n },\n },\n error: null,\n };\n }\n\n async getUser(): Promise<PostgrestResult<{ user: AuthUser }>> {\n return this.auth.getUser();\n }\n\n async updateUser(attributes: {\n email?: string;\n password?: string;\n data?: { name?: string | null };\n }): Promise<PostgrestResult<{ user: AuthUser }>> {\n return this.auth.updateUser(attributes);\n }\n\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{\n error: null;\n }> {\n return this.auth.signOut(_options);\n }\n\n async register(body: {\n email: string;\n password: string;\n name?: string;\n }): Promise<BrowserAuthSession<AuthUser>> {\n return this.auth.register(body);\n }\n\n async login(body: {\n email: string;\n password: string;\n }): Promise<BrowserAuthSession<AuthUser>> {\n return this.auth.login(body);\n }\n\n async refresh(body: { refreshToken: string }): Promise<BrowserAuthTokens> {\n return this.auth.refresh(body);\n }\n\n async getMe(): Promise<{ user: AuthUser }> {\n return this.auth.getMe();\n }\n\n async updateMe(body: {\n name?: string | null;\n password?: string;\n }): Promise<{ user: AuthUser }> {\n return this.auth.updateMe(body);\n }\n\n onAuthStateChange(\n callback: (event: AuthChangeEvent, session: AuthSession<AuthUser> | null) => void,\n ): { data: { subscription: { id: string; unsubscribe: () => void } } } {\n return this.auth.onAuthStateChange(callback);\n }\n\n getSession(): Promise<PostgrestResult<{ session: AuthSession<AuthUser> | null }>> {\n return this.auth.getSession();\n }\n}\n\n// ─── SQL query types ─────────────────────────────────────────────────────────\n\nexport interface BrowserSqlQueryParams {\n databaseInstanceId?: string;\n sql: string;\n params?: unknown[];\n readOnly?: boolean;\n timeoutMs?: number;\n rowLimit?: number;\n}\n\nexport interface BrowserSqlQueryResult<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> {\n command: string;\n rowCount: number;\n truncated: boolean;\n rows: Row[];\n}\n\n// ─── Database client ─────────────────────────────────────────────────────────\n\nexport class RagableBrowserDatabaseClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n> {\n private readonly fetchImpl: typeof fetch;\n\n constructor(\n private readonly options: RagableBrowserClientOptions,\n private readonly ragableAuth: RagableAuth | null = null,\n private readonly postgrestFrom?: <T extends RagableTableNames<Database>>(\n table: T,\n databaseInstanceId?: string,\n ) => PostgrestTableApi<Database, T>,\n ) {\n this.fetchImpl = bindFetch(options.fetch);\n }\n\n /**\n * PostgREST fluent API — same as `client.from('table')`.\n * Use either the root client or `database` for Supabase-style table access; `database.query()` is raw SQL only.\n */\n from<TableName extends RagableTableNames<Database>>(\n table: TableName,\n databaseInstanceId?: string,\n ): PostgrestTableApi<Database, TableName> {\n if (!this.postgrestFrom) {\n throw new RagableError(\n \"database.from() is only available on the client from createBrowserClient().\",\n 500,\n { code: \"SDK_DATABASE_FROM_UNAVAILABLE\" },\n );\n }\n return this.postgrestFrom(table, databaseInstanceId);\n }\n\n private toUrl(path: string): string {\n return `${normalizeBrowserApiBase(this.options.baseUrl)}${path.startsWith(\"/\") ? path : `/${path}`}`;\n }\n\n async query<Row extends Record<string, unknown> = Record<string, unknown>>(\n params: BrowserSqlQueryParams,\n ): Promise<BrowserSqlQueryResult<Row>> {\n const gid = requireAuthGroupId(this.options);\n const token = await resolveDatabaseAuthBearer(this.options, this.ragableAuth);\n const databaseInstanceId =\n params.databaseInstanceId?.trim() ||\n this.options.databaseInstanceId?.trim();\n if (!databaseInstanceId) {\n throw new Error(\n \"database.query requires databaseInstanceId in the request or on createBrowserClient({ databaseInstanceId })\",\n );\n }\n const headers = this.baseHeaders();\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"Content-Type\", \"application/json\");\n const readOnly =\n (this.options.dataAuth ?? \"user\") === \"publicAnon\"\n ? true\n : params.readOnly !== false;\n const response = await this.fetchImpl(\n this.toUrl(`/auth-groups/${gid}/data/query`),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n databaseInstanceId,\n sql: params.sql,\n ...(params.params !== undefined ? { params: params.params } : {}),\n readOnly,\n ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),\n ...(params.rowLimit !== undefined ? { rowLimit: params.rowLimit } : {}),\n }),\n },\n );\n return parseJsonOrThrow(response);\n }\n\n private baseHeaders(): Headers {\n return new Headers(this.options.headers);\n }\n}\n\n// ─── Agents client ───────────────────────────────────────────────────────────\n\nexport class RagableBrowserAgentsClient {\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: RagableBrowserClientOptions) {\n this.fetchImpl = bindFetch(options.fetch);\n }\n\n private toUrl(path: string): string {\n return `${normalizeBrowserApiBase(this.options.baseUrl)}${path.startsWith(\"/\") ? path : `/${path}`}`;\n }\n\n async *chatStream(\n agentId: string,\n params: AgentPublicChatParams,\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\n const orgId = this.options.organizationId;\n const body: Record<string, unknown> = {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n ...(params.triggerSubtype !== undefined\n ? { triggerSubtype: params.triggerSubtype }\n : {}),\n ...(params.triggerNodeId !== undefined\n ? { triggerNodeId: params.triggerNodeId }\n : {}),\n };\n\n const headers = new Headers(this.options.headers);\n headers.set(\"Content-Type\", \"application/json\");\n\n const response = await this.fetchImpl(\n this.toUrl(`/public/organizations/${orgId}/agents/${agentId}/chat/stream`),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const payload = await parseMaybeJsonBody(response);\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n const streamBody = response.body;\n if (!streamBody) {\n return;\n }\n\n yield* readSseStream(streamBody);\n }\n}\n\nexport interface AgentPublicChatParams extends AgentChatParams {\n triggerSubtype?: string;\n triggerNodeId?: string;\n}\n\n// ─── Main browser client ─────────────────────────────────────────────────────\n\nexport class RagableBrowser<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly agents: RagableBrowserAgentsClient;\n readonly auth: RagableBrowserAuthClient<AuthUser>;\n readonly database: RagableBrowserDatabaseClient<Database>;\n readonly transport: Transport;\n private readonly options: RagableBrowserClientOptions;\n private readonly _ragableAuth: RagableAuth<AuthUser> | null;\n\n constructor(options: RagableBrowserClientOptions) {\n this.options = options;\n\n this.transport = new Transport({\n fetch: options.fetch,\n headers: options.headers,\n ...options.transport,\n });\n\n if (options.authGroupId) {\n this._ragableAuth = new RagableAuth<AuthUser>({\n baseUrl: normalizeBrowserApiBase(options.baseUrl),\n authGroupId: options.authGroupId,\n fetch: options.fetch,\n headers: options.headers,\n auth: options.auth,\n });\n\n this.transport.setRefreshHandler(async () => {\n const session = await this._ragableAuth!.singleFlightRefresh(\n this._ragableAuth!.getCurrentSession()?.refresh_token ?? \"\",\n );\n return session?.access_token ?? null;\n });\n\n if (!options.getAccessToken) {\n this._ragableAuth.initialize().catch(() => {});\n }\n } else {\n this._ragableAuth = null;\n }\n\n this.agents = new RagableBrowserAgentsClient(options);\n this.auth = new RagableBrowserAuthClient<AuthUser>(options, this._ragableAuth);\n this.database = new RagableBrowserDatabaseClient<Database>(\n options,\n this._ragableAuth as RagableAuth | null,\n (table, databaseInstanceId) => this.from(table, databaseInstanceId),\n );\n }\n\n from<TableName extends RagableTableNames<Database>>(\n table: TableName,\n databaseInstanceId?: string,\n ): PostgrestTableApi<Database, TableName> {\n const id =\n databaseInstanceId?.trim() || this.options.databaseInstanceId?.trim();\n if (!id) {\n throw new RagableError(\n \"RagableBrowser.from() requires databaseInstanceId in client options or as the second argument\",\n 400,\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\n );\n }\n const gid = requireAuthGroupId(this.options);\n const ragableAuth = this._ragableAuth;\n const opts = this.options;\n const transport = this.transport;\n const pgFetch: PostgRESTFetch = async (params: PostgRESTFetchParams) => {\n const token = await resolveDatabaseAuthBearer(opts, ragableAuth as RagableAuth | null);\n const baseUrl = normalizeBrowserApiBase(opts.baseUrl);\n const qs = params.searchParams.toString();\n const url = `${baseUrl}/auth-groups/${gid}/data/rest/${params.table}${qs ? `?${qs}` : \"\"}`;\n\n const headers = new Headers(opts.headers);\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"X-Database-Instance-Id\", params.databaseInstanceId);\n if (params.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (params.headers) {\n for (const [k, v] of Object.entries(params.headers)) {\n headers.set(k, v);\n }\n }\n\n return transport.execute({\n url,\n method: params.method,\n headers,\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\n signal: params.signal,\n idempotencyKey: params.idempotencyKey,\n });\n };\n return new PostgrestTableApi<Database, TableName>(pgFetch, id, table);\n }\n\n destroy(): void {\n this._ragableAuth?.destroy();\n }\n}\n\nexport function createBrowserClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser> {\n return new RagableBrowser<Database, AuthUser>(options);\n}\n\nexport const createRagableBrowserClient = createBrowserClient;\n","import type {\n ShiftAddDocumentParams,\n ShiftIngestResponse,\n ShiftSearchParams,\n ShiftSearchResult,\n ShiftUploadFileParams,\n} from \"./shift\";\n\n/** Minimal client surface for {@link createRagPipeline} (implemented by {@link Ragable}). */\nexport interface RagClientForPipeline {\n shift: {\n documents: {\n create: (\n indexId: string,\n params: ShiftAddDocumentParams,\n ) => Promise<ShiftIngestResponse>;\n upload: (\n indexId: string,\n params: ShiftUploadFileParams,\n ) => Promise<ShiftIngestResponse>;\n };\n search: (\n indexId: string,\n params: ShiftSearchParams,\n ) => Promise<{ results: ShiftSearchResult[] }>;\n };\n}\n\nexport interface FormatContextOptions {\n /** Prepended before numbered passages (default: \"Relevant passages:\\\\n\") */\n header?: string;\n /** Joiner between passages (default: \"\\\\n\\\\n\") */\n separator?: string;\n /** Omit results with similarity score below this (default: no filter) */\n minScore?: number;\n /** Truncate total context string to this UTF-16 length (default: no limit) */\n maxChars?: number;\n /** Include similarity score in each block (default: false) */\n includeScores?: boolean;\n}\n\nexport interface RagPipelineOptions {\n indexId: string;\n}\n\nexport type RetrieveParams = ShiftSearchParams & {\n format?: FormatContextOptions;\n};\n\nexport interface RagPipeline {\n readonly indexId: string;\n ingestText(params: ShiftAddDocumentParams): Promise<ShiftIngestResponse>;\n ingestFile(params: ShiftUploadFileParams): Promise<ShiftIngestResponse>;\n search(params: ShiftSearchParams): Promise<{ results: ShiftSearchResult[] }>;\n retrieve(params: RetrieveParams): Promise<{\n results: ShiftSearchResult[];\n context: string;\n }>;\n}\n\n/**\n * Turn vector search hits into a single block of text for system prompts or RAG user messages.\n */\nexport function formatRetrievalContext(\n results: ShiftSearchResult[],\n options: FormatContextOptions = {},\n): string {\n const header = options.header ?? \"Relevant passages:\\n\";\n const separator = options.separator ?? \"\\n\\n\";\n const minScore = options.minScore;\n\n let filtered = results;\n if (typeof minScore === \"number\") {\n filtered = results.filter((r) => r.score >= minScore);\n }\n\n const blocks = filtered.map((r, i) => {\n const scoreSuffix =\n options.includeScores === true ? ` (score: ${r.score.toFixed(4)})` : \"\";\n return `[${i + 1}]${scoreSuffix}\\n${r.content.trim()}`;\n });\n\n let text = (blocks.length > 0 ? header : \"\") + blocks.join(separator);\n\n if (typeof options.maxChars === \"number\" && text.length > options.maxChars) {\n text = text.slice(0, options.maxChars).trimEnd() + \"\\n…\";\n }\n\n return text;\n}\n\n/**\n * High-level RAG helpers bound to one Shift index: ingest, search, retrieve with prompt-ready context.\n */\nexport function createRagPipeline(\n client: RagClientForPipeline,\n options: RagPipelineOptions,\n): RagPipeline {\n const { indexId } = options;\n\n return {\n indexId,\n\n ingestText(params) {\n return client.shift.documents.create(indexId, params);\n },\n\n ingestFile(params) {\n return client.shift.documents.upload(indexId, params);\n },\n\n search(params) {\n return client.shift.search(indexId, params);\n },\n\n async retrieve(params) {\n const { format: formatOpts, ...searchParams } = params;\n const { results } = await client.shift.search(indexId, searchParams);\n const context = formatRetrievalContext(results, formatOpts ?? {});\n return { results, context };\n },\n };\n}\n","export type {\n ColumnName,\n ColumnValue,\n DefaultRagableDatabase,\n Json,\n RagableDatabase,\n RagableTableDefinition,\n RagableTableNames,\n TableInsertRow,\n TableRow,\n TableUpdatePatch,\n Tables,\n TablesInsert,\n TablesUpdate,\n} from \"./database-schema\";\n\nexport type { RagableClientOptions, RequestOptions } from \"./request-client\";\nexport {\n bindFetch,\n DEFAULT_RAGABLE_API_BASE,\n extractErrorMessage,\n formatSdkError,\n formatPostgrestError,\n RagableAbortError,\n RagableError,\n RagableNetworkError,\n RagableSdkError,\n RagableTimeoutError,\n RagableRequestClient,\n} from \"./request-client\";\n\nexport type {\n ShiftAddDocumentParams,\n ShiftCreateIndexParams,\n ShiftEntry,\n ShiftIndex,\n ShiftIngestResponse,\n ShiftListEntriesParams,\n ShiftListEntriesResponse,\n ShiftSearchParams,\n ShiftSearchResult,\n ShiftUpdateIndexParams,\n ShiftUploadableFile,\n ShiftUploadFileParams,\n} from \"./shift\";\nexport { ShiftClient } from \"./shift\";\n\nexport type {\n AgentChatMessage,\n AgentChatParams,\n AgentChatResult,\n AgentStreamEvent,\n AgentSummary,\n} from \"./agents\";\nexport { AgentsClient } from \"./agents\";\n\nexport type {\n AgentPublicChatParams,\n BrowserAuthSession,\n BrowserAuthTokens,\n BrowserDataAuthMode,\n BrowserSqlQueryParams,\n BrowserSqlQueryResult,\n PostgrestResult,\n RagableBrowserClientOptions,\n SupabaseCompatSession,\n} from \"./browser\";\nexport {\n createBrowserClient,\n createRagableBrowserClient,\n normalizeBrowserApiBase,\n RagableBrowser,\n RagableBrowserAgentsClient,\n RagableBrowserAuthClient,\n RagableBrowserDatabaseClient,\n} from \"./browser\";\n\nexport type {\n BrowserSqlExecParams,\n BrowserSqlExecResult,\n PostgRESTFetch,\n PostgRESTFetchParams,\n PostgrestUpsertOptions,\n RunQuery,\n} from \"./browser-postgrest\";\nexport {\n asPostgrestResponse,\n PostgrestDeleteReturningBuilder,\n PostgrestDeleteRootBuilder,\n PostgrestInsertReturningBuilder,\n PostgrestInsertRootBuilder,\n PostgrestSelectBuilder,\n PostgrestTableApi,\n PostgrestUpdateReturningBuilder,\n PostgrestUpdateRootBuilder,\n PostgrestUpsertReturningBuilder,\n PostgrestUpsertRootBuilder,\n} from \"./browser-postgrest\";\n\nexport type { SseJsonEvent } from \"./sse\";\nexport { parseSseDataLine, readSseStream } from \"./sse\";\n\nexport type {\n FormatContextOptions,\n RagClientForPipeline,\n RagPipeline,\n RagPipelineOptions,\n RetrieveParams,\n} from \"./rag\";\nexport { createRagPipeline, formatRetrievalContext } from \"./rag\";\n\n// ─── New modules ─────────────────────────────────────────────────────────────\n\nexport type {\n HttpMethod,\n RetryOptions,\n TransportOptions,\n TransportRequest,\n} from \"./transport\";\nexport { generateIdempotencyKey, Transport, parseTransportResponse } from \"./transport\";\n\nexport type {\n SessionStorage,\n AuthBroadcastMessage,\n} from \"./auth-storage\";\nexport {\n AuthBroadcastChannel,\n CookieStorageAdapter,\n detectStorage,\n LocalStorageAdapter,\n MemoryStorageAdapter,\n SessionStorageAdapter,\n} from \"./auth-storage\";\n\nexport type {\n AuthChangeEvent,\n AuthOptions,\n AuthSession,\n RagableAuthConfig,\n} from \"./auth\";\nexport { RagableAuth } from \"./auth\";\n\n// ─── Top-level client classes ────────────────────────────────────────────────\n\nimport { AgentsClient } from \"./agents\";\nimport {\n createBrowserClient,\n normalizeBrowserApiBase,\n RagableBrowser,\n type RagableBrowserClientOptions,\n} from \"./browser\";\nimport type { DefaultRagableDatabase, RagableDatabase } from \"./database-schema\";\nimport {\n RagableRequestClient,\n type RagableClientOptions,\n} from \"./request-client\";\nimport { ShiftClient } from \"./shift\";\n\nexport class Ragable {\n readonly shift: ShiftClient;\n readonly agents: AgentsClient;\n readonly infrastructure: {\n shift: ShiftClient;\n };\n\n constructor(options: RagableClientOptions) {\n const client = new RagableRequestClient(options);\n this.shift = new ShiftClient(client);\n this.agents = new AgentsClient(client);\n this.infrastructure = {\n shift: this.shift,\n };\n }\n}\n\nfunction isServerClientOptions(o: unknown): o is RagableClientOptions {\n return (\n typeof o === \"object\" &&\n o !== null &&\n \"apiKey\" in o &&\n typeof (o as RagableClientOptions).apiKey === \"string\" &&\n (o as RagableClientOptions).apiKey.length > 0\n );\n}\n\nexport function createClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(\n url: string,\n options: Omit<RagableBrowserClientOptions, \"baseUrl\">,\n): RagableBrowser<Database, AuthUser>;\nexport function createClient(options: RagableClientOptions): Ragable;\nexport function createClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser>;\nexport function createClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(\n urlOrOptions: string | RagableClientOptions | RagableBrowserClientOptions,\n browserOptions?: Omit<RagableBrowserClientOptions, \"baseUrl\">,\n): Ragable | RagableBrowser<Database, AuthUser> {\n if (typeof urlOrOptions === \"string\") {\n if (!browserOptions) {\n throw new Error(\n \"createClient(url, options) requires options with at least organizationId\",\n );\n }\n const raw = urlOrOptions.trim().replace(/\\/+$/, \"\");\n const baseUrl = raw.endsWith(\"/api\") ? raw : `${raw}/api`;\n return createBrowserClient<Database, AuthUser>({\n ...browserOptions,\n baseUrl: normalizeBrowserApiBase(baseUrl),\n });\n }\n if (isServerClientOptions(urlOrOptions)) {\n return new Ragable(urlOrOptions);\n }\n if (\n typeof urlOrOptions === \"object\" &&\n urlOrOptions !== null &&\n \"organizationId\" in urlOrOptions &&\n typeof (urlOrOptions as RagableBrowserClientOptions).organizationId ===\n \"string\"\n ) {\n return createBrowserClient<Database, AuthUser>(\n urlOrOptions as RagableBrowserClientOptions,\n );\n }\n throw new Error(\n \"createClient(options) requires apiKey (server) or organizationId (browser)\",\n );\n}\n\nexport function createRagableServerClient(options: RagableClientOptions) {\n return new Ragable(options);\n}\n"],"mappings":"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","names":["parseJsonOrThrow"]}
1
+ {"version":3,"sources":["../src/request-client.ts","../src/shift.ts","../src/sse.ts","../src/agents.ts","../src/transport.ts","../src/browser-postgrest.ts","../src/auth-storage.ts","../src/auth.ts","../src/browser.ts","../src/rag.ts","../src/index.ts"],"sourcesContent":["/**\n * Native `fetch` must not be called as a detached reference (`const f = fetch; f(url)`),\n * or the browser throws **Illegal invocation**. Use this for defaults and for `options.fetch`.\n */\nexport function bindFetch(custom?: typeof fetch): typeof fetch {\n return (input, init) => {\n const f = custom ?? globalThis.fetch;\n return f.call(globalThis, input as RequestInfo, init);\n };\n}\n\n/** Default hosted API (`…/api`) when `baseUrl` is omitted (browser + server clients). */\nexport const DEFAULT_RAGABLE_API_BASE =\n \"https://ragable-341305259977.asia-southeast1.run.app/api\";\n\nexport interface RagableClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport type RequestOptions = Omit<RequestInit, \"body\"> & {\n body?: unknown;\n};\n\nexport abstract class RagableSdkError extends Error {\n abstract readonly __type: string;\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n // Native `Error.message` is non-enumerable — `{...err}`, `JSON.stringify({...err})`, and some\n // loggers show `{}`. Redefine so spreads and plain serialization keep `message`.\n Object.defineProperty(this, \"message\", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: message,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n __type: this.__type,\n };\n }\n}\n\nexport class RagableError extends RagableSdkError {\n readonly __type = \"RagableError\" as const;\n readonly status: number;\n readonly body: unknown;\n readonly code: string | undefined;\n readonly details: string | undefined;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.status = status;\n this.body = body;\n this.code =\n body && typeof body === \"object\"\n ? typeof (body as Record<string, unknown>).code === \"string\"\n ? ((body as Record<string, unknown>).code as string)\n : typeof (body as Record<string, unknown>).code === \"number\"\n ? String((body as Record<string, unknown>).code)\n : undefined\n : undefined;\n this.details =\n body && typeof body === \"object\"\n ? typeof (body as Record<string, unknown>).details === \"string\"\n ? ((body as Record<string, unknown>).details as string)\n : undefined\n : undefined;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n status: this.status,\n body: this.body,\n code: this.code,\n details: this.details,\n };\n }\n\n /** Stable string for logs — avoids `{}` when coercing or stringifying. */\n override toString(): string {\n const bits = [`${this.name}: ${this.message}`];\n if (this.status) bits.push(`status=${this.status}`);\n if (this.code) bits.push(`code=${this.code}`);\n return bits.join(\" · \");\n }\n}\n\n/** Safe one-line log for any thrown value (catch blocks, TanStack Query). */\nexport function formatSdkError(err: unknown): string {\n if (err instanceof RagableError) {\n return `${err.message} (HTTP ${err.status}${err.code ? `, ${err.code}` : \"\"})`;\n }\n if (err instanceof RagableSdkError) {\n return err.message;\n }\n if (err instanceof Error) {\n return err.message || err.name;\n }\n if (typeof err === \"string\") return err;\n if (err && typeof err === \"object\") {\n try {\n const s = JSON.stringify(err);\n if (s !== \"{}\") return s;\n return \"Unknown error (empty object — avoid `{...error}` spread; use error.message or formatSdkError)\";\n } catch {\n /* fall through */\n }\n }\n return String(err);\n}\n\n/**\n * Human-readable line for a PostgREST `{ data, error }` error (or any thrown value).\n * Use in UI instead of `JSON.stringify(error)` or template strings on unknown errors.\n */\nexport function formatPostgrestError(error: unknown): string {\n return formatSdkError(error);\n}\n\nexport class RagableNetworkError extends RagableSdkError {\n readonly __type = \"RagableNetworkError\" as const;\n readonly cause: unknown;\n constructor(message: string, cause?: unknown) {\n super(message);\n this.cause = cause;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n cause: this.cause instanceof Error ? this.cause.message : this.cause,\n };\n }\n}\n\nexport class RagableAbortError extends RagableSdkError {\n readonly __type = \"RagableAbortError\" as const;\n constructor(message = \"Request aborted\") {\n super(message);\n }\n}\n\nexport class RagableTimeoutError extends RagableSdkError {\n readonly __type = \"RagableTimeoutError\" as const;\n readonly timeoutMs: number;\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.timeoutMs = timeoutMs;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n timeoutMs: this.timeoutMs,\n };\n }\n}\n\nexport function extractErrorMessage(payload: unknown, fallback: string) {\n if (payload && typeof payload === \"object\") {\n if (\"error\" in payload && typeof payload.error === \"string\") {\n return payload.error;\n }\n if (\"message\" in payload && typeof payload.message === \"string\") {\n return payload.message;\n }\n }\n\n if (typeof payload === \"string\" && payload.length > 0) {\n return payload;\n }\n\n return fallback || \"Request failed\";\n}\n\nexport class RagableRequestClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly defaultHeaders: HeadersInit | undefined;\n\n constructor(options: RagableClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_RAGABLE_API_BASE;\n this.fetchImpl = bindFetch(options.fetch);\n this.defaultHeaders = options.headers;\n }\n\n toUrl(path: string) {\n const normalizedBase = this.baseUrl.replace(/\\/+$/, \"\");\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.rawFetch(path, options);\n const payload = await this.parseResponseBody(response);\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n /**\n * Low-level fetch with API key and JSON body encoding. Caller handles status and body.\n */\n async rawFetch(path: string, options: RequestOptions = {}): Promise<Response> {\n const headers = new Headers(this.defaultHeaders);\n headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\n let body = options.body;\n if (body !== undefined && !isBodyInit(body)) {\n headers.set(\"Content-Type\", \"application/json\");\n body = JSON.stringify(body);\n }\n\n return this.fetchImpl(this.toUrl(path), {\n ...options,\n headers,\n body: body as BodyInit | undefined,\n });\n }\n\n private async parseResponseBody(response: Response): Promise<unknown> {\n if (response.status === 204) {\n return null;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n\n return response.text();\n }\n}\n\nexport function isBodyInit(value: unknown): value is BodyInit {\n return (\n typeof value === \"string\" ||\n value instanceof Blob ||\n value instanceof FormData ||\n value instanceof URLSearchParams ||\n value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value)\n );\n}\n","import { RagableRequestClient } from \"./request-client\";\n\nexport interface ShiftIndex {\n id: string;\n name: string;\n description: string | null;\n dimensions: number;\n embeddingModel: string;\n status: string;\n entryCount?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ShiftEntry {\n id: string;\n content: string;\n metadata: unknown;\n chunkIndex: number;\n createdAt: string;\n}\n\nexport interface ShiftSearchResult {\n content: string;\n score: number;\n metadata: unknown;\n}\n\nexport interface ShiftCreateIndexParams {\n name: string;\n description?: string;\n dimensions?: number;\n embeddingModel?: string;\n}\n\nexport interface ShiftUpdateIndexParams {\n name?: string;\n description?: string;\n}\n\nexport interface ShiftAddDocumentParams {\n content: string;\n metadata?: Record<string, unknown>;\n chunkSize?: number;\n chunkOverlap?: number;\n}\n\nexport type ShiftUploadableFile = Blob | ArrayBuffer | Uint8Array;\n\nexport interface ShiftUploadFileParams {\n file: ShiftUploadableFile;\n fileName?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n chunkSize?: number;\n chunkOverlap?: number;\n}\n\nexport interface ShiftListEntriesParams {\n take?: number;\n skip?: number;\n}\n\nexport interface ShiftSearchParams {\n query: string;\n topK?: number;\n}\n\nexport interface ShiftIngestResponse {\n chunksCreated: number;\n entries: string[];\n extractedText?: string;\n message?: string;\n}\n\nexport interface ShiftListEntriesResponse {\n entries: ShiftEntry[];\n total: number;\n}\n\nexport class ShiftClient {\n readonly indexes: {\n list: () => Promise<{ indexes: ShiftIndex[] }>;\n create: (params: ShiftCreateIndexParams) => Promise<ShiftIndex>;\n get: (indexId: string) => Promise<ShiftIndex>;\n update: (indexId: string, params: ShiftUpdateIndexParams) => Promise<ShiftIndex>;\n delete: (indexId: string) => Promise<{ success: true }>;\n };\n\n readonly documents: {\n create: (\n indexId: string,\n params: ShiftAddDocumentParams,\n ) => Promise<ShiftIngestResponse>;\n upload: (\n indexId: string,\n params: ShiftUploadFileParams,\n ) => Promise<ShiftIngestResponse>;\n };\n\n readonly entries: {\n list: (\n indexId: string,\n params?: ShiftListEntriesParams,\n ) => Promise<ShiftListEntriesResponse>;\n delete: (indexId: string, entryId: string) => Promise<{ success: true }>;\n };\n\n constructor(private readonly client: RagableRequestClient) {\n this.indexes = {\n list: async () => {\n return this.client.request<{ indexes: ShiftIndex[] }>(\"/v1/shift/indexes\");\n },\n create: async (params) => {\n return this.client.request<ShiftIndex>(\"/v1/shift/indexes\", {\n method: \"POST\",\n body: params,\n });\n },\n get: async (indexId) => {\n return this.client.request<ShiftIndex>(`/v1/shift/indexes/${indexId}`);\n },\n update: async (indexId, params) => {\n return this.client.request<ShiftIndex>(`/v1/shift/indexes/${indexId}`, {\n method: \"PUT\",\n body: params,\n });\n },\n delete: async (indexId) => {\n return this.client.request<{ success: true }>(\n `/v1/shift/indexes/${indexId}`,\n {\n method: \"DELETE\",\n },\n );\n },\n };\n\n this.documents = {\n create: async (indexId, params) => {\n return this.client.request<ShiftIngestResponse>(\n `/v1/shift/indexes/${indexId}/documents`,\n {\n method: \"POST\",\n body: params,\n },\n );\n },\n upload: async (indexId, params) => {\n const formData = new FormData();\n const fileName = resolveUploadFileName(params);\n const contentType = resolveUploadContentType(params);\n const file = normalizeUploadFile(params.file, contentType);\n\n formData.set(\"file\", file, fileName);\n\n if (params.metadata) {\n formData.set(\"metadata\", JSON.stringify(params.metadata));\n }\n if (typeof params.chunkSize === \"number\") {\n formData.set(\"chunkSize\", String(params.chunkSize));\n }\n if (typeof params.chunkOverlap === \"number\") {\n formData.set(\"chunkOverlap\", String(params.chunkOverlap));\n }\n\n return this.client.request<ShiftIngestResponse>(\n `/v1/shift/indexes/${indexId}/files`,\n {\n method: \"POST\",\n body: formData,\n },\n );\n },\n };\n\n this.entries = {\n list: async (indexId, params = {}) => {\n const search = new URLSearchParams();\n if (typeof params.take === \"number\") {\n search.set(\"take\", String(params.take));\n }\n if (typeof params.skip === \"number\") {\n search.set(\"skip\", String(params.skip));\n }\n\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n return this.client.request<ShiftListEntriesResponse>(\n `/v1/shift/indexes/${indexId}/entries${suffix}`,\n );\n },\n delete: async (indexId, entryId) => {\n return this.client.request<{ success: true }>(\n `/v1/shift/indexes/${indexId}/entries/${entryId}`,\n {\n method: \"DELETE\",\n },\n );\n },\n };\n }\n\n async search(indexId: string, params: ShiftSearchParams) {\n return this.client.request<{ results: ShiftSearchResult[] }>(\n `/v1/shift/indexes/${indexId}/search`,\n {\n method: \"POST\",\n body: params,\n },\n );\n }\n}\n\nfunction resolveUploadFileName(params: ShiftUploadFileParams) {\n if (params.fileName) {\n return params.fileName;\n }\n\n if (isNamedBlob(params.file)) {\n return params.file.name;\n }\n\n return \"upload.bin\";\n}\n\nfunction resolveUploadContentType(params: ShiftUploadFileParams) {\n if (params.contentType) {\n return params.contentType;\n }\n\n if (params.file instanceof Blob && params.file.type) {\n return params.file.type;\n }\n\n return \"application/octet-stream\";\n}\n\nfunction normalizeUploadFile(file: ShiftUploadableFile, contentType: string) {\n if (file instanceof Blob) {\n return file;\n }\n\n if (file instanceof Uint8Array) {\n return new Blob([toArrayBuffer(file)], { type: contentType });\n }\n\n return new Blob([file], { type: contentType });\n}\n\nfunction isNamedBlob(value: ShiftUploadableFile): value is Blob & { name: string } {\n return value instanceof Blob && \"name\" in value && typeof value.name === \"string\";\n}\n\nfunction toArrayBuffer(value: Uint8Array) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(value);\n return copy.buffer;\n}\n","/**\n * Shared SSE parsing for `data: {json}` lines (Ragable agent streams).\n */\nexport type SseJsonEvent = Record<string, unknown> & { type: string };\n\nexport async function parseMaybeJsonBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n try {\n return await response.text();\n } catch {\n return null;\n }\n}\n\nexport function parseSseDataLine(line: string): SseJsonEvent | null {\n const dataPrefix = \"data: \";\n if (!line.startsWith(dataPrefix)) {\n return null;\n }\n const json = line.slice(dataPrefix.length).trim();\n if (json.length === 0 || json === \"[DONE]\") {\n return null;\n }\n try {\n return JSON.parse(json) as SseJsonEvent;\n } catch {\n return null;\n }\n}\n\n/**\n * Read an SSE body and yield parsed `data:` JSON objects (double-newline framed).\n */\nexport async function* readSseStream(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseJsonEvent, void, undefined> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n for (const line of block.split(\"\\n\")) {\n const evt = parseSseDataLine(line);\n if (evt) {\n yield evt;\n }\n }\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n\n if (buffer.trim().length > 0) {\n for (const line of buffer.split(\"\\n\")) {\n const evt = parseSseDataLine(line);\n if (evt) {\n yield evt;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import {\n extractErrorMessage,\n RagableError,\n RagableRequestClient,\n} from \"./request-client\";\nimport { parseMaybeJsonBody, readSseStream } from \"./sse\";\n\nexport interface AgentSummary {\n id: string;\n name: string;\n description: string | null;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentChatMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AgentChatParams {\n message: string;\n history?: AgentChatMessage[];\n}\n\n/** Mirrors backend ExecutionResult JSON shape (traces are opaque in the SDK). */\nexport interface AgentChatResult {\n response: string;\n traces: unknown[];\n totalDurationMs: number;\n httpResponse?: unknown;\n}\n\n/**\n * Loose SSE event from POST /v1/agents/:id/chat/stream — narrows with `type` at runtime.\n */\nexport type AgentStreamEvent = Record<string, unknown> & { type: string };\n\nexport class AgentsClient {\n constructor(private readonly client: RagableRequestClient) {}\n\n async list(): Promise<{ agents: AgentSummary[] }> {\n return this.client.request(\"/v1/agents\");\n }\n\n async get(agentId: string): Promise<AgentSummary> {\n return this.client.request(`/v1/agents/${agentId}`);\n }\n\n async chat(\n agentId: string,\n params: AgentChatParams,\n ): Promise<AgentChatResult> {\n return this.client.request<AgentChatResult>(`/v1/agents/${agentId}/chat`, {\n method: \"POST\",\n body: {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n },\n });\n }\n\n /**\n * Stream agent execution as SSE (`data: {json}` lines). Yields parsed JSON objects.\n */\n async *chatStream(\n agentId: string,\n params: AgentChatParams,\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\n const response = await this.client.rawFetch(\n `/v1/agents/${agentId}/chat/stream`,\n {\n method: \"POST\",\n body: {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n },\n },\n );\n\n if (!response.ok) {\n const payload = await parseMaybeJsonBody(response);\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n const body = response.body;\n if (!body) {\n return;\n }\n\n yield* readSseStream(body);\n }\n}\n","import {\n bindFetch,\n RagableAbortError,\n RagableError,\n RagableNetworkError,\n RagableTimeoutError,\n extractErrorMessage,\n} from \"./request-client\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\" | \"HEAD\";\n\nexport interface RetryOptions {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n retryOn: number[];\n respectRetryAfter: boolean;\n}\n\nexport interface TransportOptions {\n fetch?: typeof fetch;\n headers?: HeadersInit;\n retry?: Partial<RetryOptions>;\n timeoutMs?: number;\n onRequest?: (req: TransportRequest) => void;\n onResponse?: (req: TransportRequest, res: Response, durationMs: number) => void;\n onRetry?: (req: TransportRequest, attempt: number, delayMs: number, reason: string) => void;\n}\n\nexport interface TransportRequest {\n url: string;\n method: HttpMethod;\n headers: Headers;\n body?: BodyInit;\n signal?: AbortSignal;\n idempotencyKey?: string;\n retry?: Partial<RetryOptions>;\n timeoutMs?: number;\n}\n\n// ─── Defaults ────────────────────────────────────────────────────────────────\n\nconst DEFAULT_RETRY: RetryOptions = {\n maxRetries: 3,\n baseDelayMs: 200,\n maxDelayMs: 5_000,\n retryOn: [408, 425, 429, 502, 503, 504],\n respectRetryAfter: true,\n};\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction jitteredDelay(base: number, attempt: number, max: number): number {\n const exp = Math.min(base * 2 ** attempt, max);\n return Math.round(exp * (0.5 + Math.random() * 0.5));\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const seconds = Number(header);\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const date = Date.parse(header);\n if (Number.isFinite(date)) return Math.max(0, date - Date.now());\n return null;\n}\n\nlet _uuidCounter = 0;\nexport function generateIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n _uuidCounter++;\n return `idk-${Date.now()}-${_uuidCounter}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction requestCacheKey(req: TransportRequest): string {\n return `${req.method}:${req.url}`;\n}\n\n// ─── Transport ───────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly fetchImpl: typeof fetch;\n private readonly defaultHeaders: HeadersInit | undefined;\n private readonly defaultRetry: RetryOptions;\n private readonly defaultTimeoutMs: number;\n private readonly onRequest?: TransportOptions[\"onRequest\"];\n private readonly onResponse?: TransportOptions[\"onResponse\"];\n private readonly onRetry?: TransportOptions[\"onRetry\"];\n\n private readonly inflightGets = new Map<string, Promise<Response>>();\n\n private _refreshHandler: (() => Promise<string | null>) | null = null;\n\n constructor(options: TransportOptions = {}) {\n this.fetchImpl = bindFetch(options.fetch);\n this.defaultHeaders = options.headers;\n this.defaultRetry = { ...DEFAULT_RETRY, ...options.retry };\n this.defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.onRequest = options.onRequest;\n this.onResponse = options.onResponse;\n this.onRetry = options.onRetry;\n }\n\n setRefreshHandler(handler: (() => Promise<string | null>) | null): void {\n this._refreshHandler = handler;\n }\n\n async execute(req: TransportRequest): Promise<Response> {\n if (req.method === \"GET\") {\n const key = requestCacheKey(req);\n const existing = this.inflightGets.get(key);\n if (existing) return existing;\n const promise = this._executeWithRetry(req).finally(() => {\n this.inflightGets.delete(key);\n });\n this.inflightGets.set(key, promise);\n return promise;\n }\n return this._executeWithRetry(req);\n }\n\n private async _executeWithRetry(req: TransportRequest): Promise<Response> {\n const retryOpts: RetryOptions = {\n ...this.defaultRetry,\n ...req.retry,\n };\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n\n const headers = new Headers(this.defaultHeaders);\n req.headers.forEach((v, k) => headers.set(k, v));\n if (req.idempotencyKey) {\n headers.set(\"Idempotency-Key\", req.idempotencyKey);\n }\n\n const finalReq: TransportRequest = { ...req, headers };\n\n this.onRequest?.(finalReq);\n\n let lastError: unknown;\n const maxAttempts = 1 + retryOpts.maxRetries;\n let did401Refresh = false;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await this._singleFetch(finalReq, timeoutMs);\n\n if (response.status === 401 && this._refreshHandler && !did401Refresh) {\n did401Refresh = true;\n const newToken = await this._refreshHandler();\n if (newToken) {\n finalReq.headers.set(\"Authorization\", `Bearer ${newToken}`);\n attempt--;\n continue;\n }\n }\n\n if (!response.ok && retryOpts.retryOn.includes(response.status) && attempt < maxAttempts - 1) {\n let delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\n if (retryOpts.respectRetryAfter) {\n const ra = parseRetryAfter(response.headers.get(\"retry-after\"));\n if (ra !== null) delayMs = Math.min(ra, retryOpts.maxDelayMs);\n }\n this.onRetry?.(finalReq, attempt + 1, delayMs, `HTTP ${response.status}`);\n await sleep(delayMs);\n continue;\n }\n\n return response;\n } catch (e) {\n if (e instanceof RagableAbortError || e instanceof RagableTimeoutError) {\n throw e;\n }\n lastError = e;\n if (attempt < maxAttempts - 1) {\n const delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\n this.onRetry?.(finalReq, attempt + 1, delayMs, (e as Error).message);\n await sleep(delayMs);\n continue;\n }\n }\n }\n\n throw lastError instanceof RagableNetworkError\n ? lastError\n : new RagableNetworkError(\n (lastError as Error)?.message ?? \"Network request failed\",\n lastError,\n );\n }\n\n private async _singleFetch(req: TransportRequest, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const signals: AbortSignal[] = [controller.signal];\n if (req.signal) signals.push(req.signal);\n\n const combinedSignal = signals.length === 1\n ? controller.signal\n : AbortSignal.any\n ? AbortSignal.any(signals)\n : controller.signal;\n\n if (req.signal?.aborted) {\n throw new RagableAbortError();\n }\n\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const externalAbortHandler = req.signal\n ? () => controller.abort()\n : null;\n if (externalAbortHandler && req.signal) {\n req.signal.addEventListener(\"abort\", externalAbortHandler, { once: true });\n }\n\n const start = Date.now();\n try {\n const response = await this.fetchImpl(req.url, {\n method: req.method,\n headers: req.headers,\n body: req.body,\n signal: combinedSignal,\n });\n this.onResponse?.(req, response, Date.now() - start);\n return response;\n } catch (e) {\n if ((e as Error).name === \"AbortError\") {\n if (req.signal?.aborted) throw new RagableAbortError();\n throw new RagableTimeoutError(timeoutMs);\n }\n throw new RagableNetworkError((e as Error).message, e);\n } finally {\n clearTimeout(timer);\n if (externalAbortHandler && req.signal) {\n req.signal.removeEventListener(\"abort\", externalAbortHandler);\n }\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function parseTransportResponse<T>(response: Response): Promise<T> {\n if (response.status === 204) return null as T;\n const text = await response.text();\n if (!text) return null as T;\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n if (!response.ok) {\n throw new RagableError(text.slice(0, 200), response.status, null);\n }\n return text as T;\n }\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n return payload as T;\n}\n","import { RagableError, RagableSdkError } from \"./request-client\";\nimport type {\n ColumnName,\n ColumnValue,\n DefaultRagableDatabase,\n RagableDatabase,\n RagableTableNames,\n TableInsertRow,\n TableRow,\n TableUpdatePatch,\n} from \"./database-schema\";\nimport { generateIdempotencyKey } from \"./transport\";\n\n// ─── Legacy types kept for backward compat (raw SQL path) ────────────────────\n\n/** @deprecated Kept for backward compat with `database.query()`. Not used by PostgREST path. */\nexport interface BrowserSqlExecParams {\n databaseInstanceId: string;\n sql: string;\n params?: unknown[];\n readOnly?: boolean;\n timeoutMs?: number;\n rowLimit?: number;\n}\n\n/** @deprecated Kept for backward compat with `database.query()`. Not used by PostgREST path. */\nexport interface BrowserSqlExecResult<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> {\n command: string;\n rowCount: number;\n truncated: boolean;\n rows: Row[];\n}\n\n/** @deprecated Use PostgRESTFetch instead. Kept for `database.query()` backward compat. */\nexport type RunQuery = <\n R extends Record<string, unknown> = Record<string, unknown>,\n>(\n p: BrowserSqlExecParams,\n) => Promise<BrowserSqlExecResult<R>>;\n\n// ─── PostgREST HTTP transport ────────────────────────────────────────────────\n\nexport interface PostgRESTFetchParams {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n table: string;\n searchParams: URLSearchParams;\n body?: unknown;\n headers?: Record<string, string>;\n databaseInstanceId: string;\n signal?: AbortSignal;\n idempotencyKey?: string;\n}\n\nexport type PostgRESTFetch = (\n params: PostgRESTFetchParams,\n) => Promise<Response>;\n\n// ─── Result types ────────────────────────────────────────────────────────────\n\nexport type PostgrestResult<T> =\n | {\n data: T;\n error: null;\n }\n | {\n data: null;\n error: RagableError;\n };\n\nexport async function asPostgrestResponse<T>(\n fn: () => Promise<T>,\n): Promise<PostgrestResult<T>> {\n try {\n const data = await fn();\n return { data, error: null };\n } catch (e) {\n let err: RagableError;\n if (e instanceof RagableError) {\n err = e;\n } else if (e instanceof RagableSdkError) {\n err = new RagableError(e.message, 0, { originalError: e.__type, cause: e.message });\n } else {\n const message =\n e instanceof Error ? e.message : typeof e === \"string\" ? e : \"Unknown error\";\n err = new RagableError(message, 0, null);\n }\n return { data: null, error: err };\n }\n}\n\n// ─── PostgREST filter operators ──────────────────────────────────────────────\n\ntype FilterOp = \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"like\" | \"ilike\" | \"is\" | \"in\";\n\ninterface Filter {\n op: FilterOp;\n column: string;\n value: unknown;\n}\n\nfunction encodeFilterValue(op: FilterOp, value: unknown): string {\n if (op === \"is\") return `is.${value}`;\n if (op === \"in\") {\n const vals = value as unknown[];\n return `in.(${vals.map(String).join(\",\")})`;\n }\n return `${op}.${value}`;\n}\n\n// ─── Response parsing helpers ────────────────────────────────────────────────\n\nfunction extractPostgRESTErrorMessage(\n payload: unknown,\n status: number,\n statusText: string,\n): string {\n const st = (statusText ?? \"\").trim();\n if (typeof payload !== \"object\" || payload === null) {\n return st || `HTTP ${status}`;\n }\n const p = payload as Record<string, unknown>;\n const raw = p.message ?? p.error ?? p.hint;\n let msg: string;\n if (typeof raw === \"string\") {\n msg = raw;\n } else if (typeof raw === \"number\" || typeof raw === \"boolean\") {\n msg = String(raw);\n } else if (raw !== null && raw !== undefined && typeof raw === \"object\") {\n msg = JSON.stringify(raw);\n } else {\n msg = st || `HTTP ${status}`;\n }\n msg = msg.trim();\n if (!msg) return st || `HTTP ${status}`;\n return msg;\n}\n\nasync function parsePostgRESTResponse<T>(response: Response): Promise<T> {\n if (response.status === 204) return null as T;\n\n const text = await response.text();\n if (!text) return null as T;\n\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n throw new RagableError(\n `PostgREST response parse error: ${text.slice(0, 200)}`,\n response.status,\n null,\n );\n }\n\n if (!response.ok) {\n const msg = extractPostgRESTErrorMessage(payload, response.status, response.statusText);\n throw new RagableError(msg, response.status, payload);\n }\n\n return payload as T;\n}\n\n// ─── Shared filter mixin ─────────────────────────────────────────────────────\n\ntype FilterableBuilder<\n D extends RagableDatabase,\n T extends RagableTableNames<D>,\n Self,\n> = {\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): Self;\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): Self;\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): Self;\n match(query: Partial<TableRow<D, T>>): Self;\n};\n\nfunction addFilterMethods<\n D extends RagableDatabase,\n T extends RagableTableNames<D>,\n B extends { filters: Filter[] },\n>(builder: B): B & FilterableBuilder<D, T, B> {\n const b = builder as B & FilterableBuilder<D, T, B>;\n for (const op of [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\", \"like\", \"ilike\"] as const) {\n (b as Record<string, unknown>)[op] = function (column: string, value: unknown) {\n b.filters.push({ op, column, value });\n return b;\n };\n }\n (b as Record<string, unknown>).is = function (column: string, value: null | boolean) {\n b.filters.push({ op: \"is\", column, value });\n return b;\n };\n (b as Record<string, unknown>).in = function (column: string, values: unknown[]) {\n b.filters.push({ op: \"in\", column, value: values });\n return b;\n };\n (b as Record<string, unknown>).match = function (query: Record<string, unknown>) {\n for (const [col, val] of Object.entries(query)) {\n if (val === null) {\n b.filters.push({ op: \"is\", column: col, value: null });\n } else {\n b.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return b;\n };\n return b;\n}\n\n// ─── SELECT builder ──────────────────────────────────────────────────────────\n\nexport class PostgrestSelectBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n D extends RagableDatabase = DefaultRagableDatabase,\n T extends RagableTableNames<D> = RagableTableNames<D>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n filters: Filter[] = [];\n private _limit?: number;\n private _offset?: number;\n private _order?: { column: string; ascending: boolean; nullsFirst?: boolean };\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly columns: string,\n ) {\n addFilterMethods<D, T, this>(this);\n }\n\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"eq\", column: column as string, value });\n return this;\n }\n\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"neq\", column: column as string, value });\n return this;\n }\n\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gt\", column: column as string, value });\n return this;\n }\n\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gte\", column: column as string, value });\n return this;\n }\n\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lt\", column: column as string, value });\n return this;\n }\n\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lte\", column: column as string, value });\n return this;\n }\n\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"like\", column: column as string, value });\n return this;\n }\n\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"ilike\", column: column as string, value });\n return this;\n }\n\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): this {\n this.filters.push({ op: \"is\", column: column as string, value });\n return this;\n }\n\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): this {\n this.filters.push({ op: \"in\", column: column as string, value: values });\n return this;\n }\n\n match(query: Partial<TableRow<D, T>>): this {\n for (const [col, val] of Object.entries(query as Record<string, unknown>)) {\n if (val === null) {\n this.filters.push({ op: \"is\", column: col, value: null });\n } else {\n this.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return this;\n }\n\n limit(n: number): this {\n this._limit = n;\n return this;\n }\n\n offset(n: number): this {\n this._offset = n;\n return this;\n }\n\n range(from: number, to: number): this {\n this._offset = from;\n this._limit = to - from + 1;\n return this;\n }\n\n order(\n column: ColumnName<D, T>,\n options?: { ascending?: boolean; nullsFirst?: boolean },\n ): this {\n this._order = {\n column: column as string,\n ascending: options?.ascending !== false,\n nullsFirst: options?.nullsFirst,\n };\n return this;\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n private buildSearchParams(): URLSearchParams {\n const sp = new URLSearchParams();\n if (this.columns && this.columns !== \"*\") {\n sp.set(\"select\", this.columns);\n }\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n if (this._order) {\n let orderStr = `${this._order.column}.${this._order.ascending ? \"asc\" : \"desc\"}`;\n if (this._order.nullsFirst === true) orderStr += \".nullsfirst\";\n else if (this._order.nullsFirst === false) orderStr += \".nullslast\";\n sp.set(\"order\", orderStr);\n }\n if (this._limit != null) {\n sp.set(\"limit\", String(Math.max(0, Math.floor(this._limit))));\n }\n if (this._offset != null && this._offset > 0) {\n sp.set(\"offset\", String(Math.max(0, Math.floor(this._offset))));\n }\n return sp;\n }\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n const response = await this.pgFetch({\n method: \"GET\",\n table: this.table,\n searchParams: this.buildSearchParams(),\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return asPostgrestResponse(async () => {\n const sp = this.buildSearchParams();\n const response = await this.pgFetch({\n method: \"GET\",\n table: this.table,\n searchParams: sp,\n headers: { Accept: \"application/vnd.pgrst.object+json\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n });\n return parsePostgRESTResponse<Row>(response);\n });\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0] ?? null, error: null };\n }\n}\n\n// ─── INSERT builders ─────────────────────────────────────────────────────────\n\n/**\n * Awaitable `{ data: null, error }` chain when `.insert()` is called with invalid extra\n * arguments — matches Supabase-style result shapes without throwing.\n */\nexport class PostgrestInsertSdkErrorRoot<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n constructor(private readonly error: RagableError) {}\n\n select(_columns = \"*\"): PostgrestInsertSdkErrorReturning<Row> {\n return new PostgrestInsertSdkErrorReturning(this.error);\n }\n\n abortSignal(_signal: AbortSignal): this {\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return Promise.resolve({ data: null, error: this.error }).then(onfulfilled, onrejected);\n }\n}\n\nexport class PostgrestInsertSdkErrorReturning<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(private readonly error: RagableError) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return Promise.resolve({ data: null, error: this.error }).then(onfulfilled, onrejected);\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n return { data: null, error: this.error };\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n return { data: null, error: this.error };\n }\n}\n\nexport class PostgrestInsertRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly rows: Record<string, unknown>[],\n ) {}\n\n select(columns = \"*\"): PostgrestInsertReturningBuilder<Row> {\n return new PostgrestInsertReturningBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n this.rows,\n columns,\n this._signal,\n );\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n if (this.rows.length === 0) return null;\n const body = this.rows.length === 1 ? this.rows[0] : this.rows;\n const response = await this.pgFetch({\n method: \"POST\",\n table: this.table,\n searchParams: new URLSearchParams(),\n body,\n headers: { Prefer: \"return=minimal\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n await parsePostgRESTResponse<null>(response);\n return null;\n });\n }\n}\n\nexport class PostgrestInsertReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly rows: Record<string, unknown>[],\n private readonly returning: string,\n private readonly _signal?: AbortSignal,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n if (this.rows.length === 0) return [];\n const body = this.rows.length === 1 ? this.rows[0] : this.rows;\n const sp = new URLSearchParams();\n if (this.returning && this.returning !== \"*\") {\n sp.set(\"select\", this.returning);\n }\n const response = await this.pgFetch({\n method: \"POST\",\n table: this.table,\n searchParams: sp,\n body,\n headers: { Prefer: \"return=representation\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0]!, error: null };\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0] ?? null, error: null };\n }\n}\n\n// ─── UPDATE builders ─────────────────────────────────────────────────────────\n\nexport class PostgrestUpdateRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n D extends RagableDatabase = DefaultRagableDatabase,\n T extends RagableTableNames<D> = RagableTableNames<D>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n filters: Filter[] = [];\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly patch: Record<string, unknown>,\n ) {}\n\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"eq\", column: column as string, value });\n return this;\n }\n\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"neq\", column: column as string, value });\n return this;\n }\n\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gt\", column: column as string, value });\n return this;\n }\n\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gte\", column: column as string, value });\n return this;\n }\n\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lt\", column: column as string, value });\n return this;\n }\n\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lte\", column: column as string, value });\n return this;\n }\n\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"like\", column: column as string, value });\n return this;\n }\n\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"ilike\", column: column as string, value });\n return this;\n }\n\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): this {\n this.filters.push({ op: \"is\", column: column as string, value });\n return this;\n }\n\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): this {\n this.filters.push({ op: \"in\", column: column as string, value: values });\n return this;\n }\n\n match(query: Partial<TableRow<D, T>>): this {\n for (const [col, val] of Object.entries(query as Record<string, unknown>)) {\n if (val === null) {\n this.filters.push({ op: \"is\", column: col, value: null });\n } else {\n this.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return this;\n }\n\n select(columns = \"*\"): PostgrestUpdateReturningBuilder<Row> {\n return new PostgrestUpdateReturningBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n this.patch,\n this.filters,\n columns,\n this._signal,\n );\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private buildSearchParams(): URLSearchParams {\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n return sp;\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n const keys = Object.keys(this.patch);\n if (keys.length === 0) {\n throw new RagableError(\"Empty update payload\", 400, null);\n }\n const response = await this.pgFetch({\n method: \"PATCH\",\n table: this.table,\n searchParams: this.buildSearchParams(),\n body: this.patch,\n headers: { Prefer: \"return=minimal\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n await parsePostgRESTResponse<null>(response);\n return null;\n });\n }\n}\n\nexport class PostgrestUpdateReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly patch: Record<string, unknown>,\n private readonly filters: Filter[],\n private readonly returning: string,\n private readonly _signal?: AbortSignal,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n const keys = Object.keys(this.patch);\n if (keys.length === 0) {\n throw new RagableError(\"Empty update payload\", 400, null);\n }\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n if (this.returning && this.returning !== \"*\") {\n sp.set(\"select\", this.returning);\n }\n const response = await this.pgFetch({\n method: \"PATCH\",\n table: this.table,\n searchParams: sp,\n body: this.patch,\n headers: { Prefer: \"return=representation\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0]!, error: null };\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0] ?? null, error: null };\n }\n}\n\n// ─── DELETE builders ─────────────────────────────────────────────────────────\n\nexport class PostgrestDeleteRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n D extends RagableDatabase = DefaultRagableDatabase,\n T extends RagableTableNames<D> = RagableTableNames<D>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n filters: Filter[] = [];\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n ) {}\n\n eq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"eq\", column: column as string, value });\n return this;\n }\n\n neq<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"neq\", column: column as string, value });\n return this;\n }\n\n gt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gt\", column: column as string, value });\n return this;\n }\n\n gte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"gte\", column: column as string, value });\n return this;\n }\n\n lt<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lt\", column: column as string, value });\n return this;\n }\n\n lte<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"lte\", column: column as string, value });\n return this;\n }\n\n like<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"like\", column: column as string, value });\n return this;\n }\n\n ilike<C extends ColumnName<D, T>>(column: C, value: ColumnValue<D, T, C>): this {\n this.filters.push({ op: \"ilike\", column: column as string, value });\n return this;\n }\n\n is<C extends ColumnName<D, T>>(column: C, value: null | boolean): this {\n this.filters.push({ op: \"is\", column: column as string, value });\n return this;\n }\n\n in<C extends ColumnName<D, T>>(column: C, values: ColumnValue<D, T, C>[]): this {\n this.filters.push({ op: \"in\", column: column as string, value: values });\n return this;\n }\n\n match(query: Partial<TableRow<D, T>>): this {\n for (const [col, val] of Object.entries(query as Record<string, unknown>)) {\n if (val === null) {\n this.filters.push({ op: \"is\", column: col, value: null });\n } else {\n this.filters.push({ op: \"eq\", column: col, value: val });\n }\n }\n return this;\n }\n\n select(columns = \"*\"): PostgrestDeleteReturningBuilder<Row> {\n return new PostgrestDeleteReturningBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n this.filters,\n columns,\n this._signal,\n );\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n const response = await this.pgFetch({\n method: \"DELETE\",\n table: this.table,\n searchParams: sp,\n headers: { Prefer: \"return=minimal\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n await parsePostgRESTResponse<null>(response);\n return null;\n });\n }\n}\n\nexport class PostgrestDeleteReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly filters: Filter[],\n private readonly returning: string,\n private readonly _signal?: AbortSignal,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n const sp = new URLSearchParams();\n for (const f of this.filters) {\n sp.append(f.column, encodeFilterValue(f.op, f.value));\n }\n if (this.returning && this.returning !== \"*\") {\n sp.set(\"select\", this.returning);\n }\n const response = await this.pgFetch({\n method: \"DELETE\",\n table: this.table,\n searchParams: sp,\n headers: { Prefer: \"return=representation\" },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n return parsePostgRESTResponse<Row[]>(response);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0]!, error: null };\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0] ?? null, error: null };\n }\n}\n\n// ─── UPSERT builders ─────────────────────────────────────────────────────────\n\nexport interface PostgrestUpsertOptions {\n onConflict: string;\n ignoreDuplicates?: boolean;\n}\n\nexport class PostgrestUpsertRootBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<null>>\n{\n private _signal?: AbortSignal;\n\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: string,\n private readonly rows: Record<string, unknown>[],\n private readonly onConflict: string,\n private readonly ignoreDuplicates: boolean,\n ) {}\n\n select(columns = \"*\"): PostgrestUpsertReturningBuilder<Row> {\n return new PostgrestUpsertReturningBuilder(this, columns);\n }\n\n abortSignal(signal: AbortSignal): this {\n this._signal = signal;\n return this;\n }\n\n then<TResult1 = PostgrestResult<null>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<null>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeNoReturn().then(onfulfilled, onrejected);\n }\n\n private async executeNoReturn(): Promise<PostgrestResult<null>> {\n return asPostgrestResponse(async () => {\n await this.runUpsert(\"return=minimal\", null);\n return null;\n });\n }\n\n async runUpsert(\n prefer: string,\n selectCols: string | null,\n ): Promise<Row[]> {\n if (this.rows.length === 0) return [];\n\n const body = this.rows.length === 1 ? this.rows[0] : this.rows;\n const sp = new URLSearchParams();\n sp.set(\"on_conflict\", this.onConflict);\n if (selectCols && selectCols !== \"*\") {\n sp.set(\"select\", selectCols);\n }\n\n const resolution = this.ignoreDuplicates\n ? \"resolution=ignore-duplicates\"\n : \"resolution=merge-duplicates\";\n\n const response = await this.pgFetch({\n method: \"POST\",\n table: this.table,\n searchParams: sp,\n body,\n headers: { Prefer: `${prefer},${resolution}` },\n databaseInstanceId: this.databaseInstanceId,\n signal: this._signal,\n idempotencyKey: generateIdempotencyKey(),\n });\n\n if (prefer.includes(\"return=minimal\")) {\n await parsePostgRESTResponse<null>(response);\n return [];\n }\n\n return parsePostgRESTResponse<Row[]>(response);\n }\n}\n\nexport class PostgrestUpsertReturningBuilder<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> implements PromiseLike<PostgrestResult<Row[]>>\n{\n constructor(\n private readonly root: PostgrestUpsertRootBuilder<Row>,\n private readonly returning: string,\n ) {}\n\n then<TResult1 = PostgrestResult<Row[]>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResult<Row[]>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n return this.executeMany().then(onfulfilled, onrejected);\n }\n\n private async executeMany(): Promise<PostgrestResult<Row[]>> {\n return asPostgrestResponse(async () => {\n return this.root.runUpsert(\"return=representation\", this.returning);\n });\n }\n\n async single(): Promise<PostgrestResult<Row>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length === 0 || rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0]!, error: null };\n }\n\n async maybeSingle(): Promise<PostgrestResult<Row | null>> {\n const many = await this.executeMany();\n if (many.error) return { data: null, error: many.error };\n const rows = many.data ?? [];\n if (rows.length > 1) {\n return {\n data: null,\n error: new RagableError(\n \"JSON object requested, multiple (or no) rows returned\",\n 406,\n { code: \"PGRST116\" },\n ),\n };\n }\n return { data: rows[0] ?? null, error: null };\n }\n}\n\n// ─── Table entry point ───────────────────────────────────────────────────────\n\nexport class PostgrestTableApi<\n Database extends RagableDatabase = DefaultRagableDatabase,\n TableName extends RagableTableNames<Database> = RagableTableNames<Database>,\n> {\n constructor(\n private readonly pgFetch: PostgRESTFetch,\n private readonly databaseInstanceId: string,\n private readonly table: TableName extends string ? string : string,\n ) {}\n\n select(columns = \"*\"): PostgrestSelectBuilder<TableRow<Database, TableName>, Database, TableName> {\n return new PostgrestSelectBuilder<TableRow<Database, TableName>, Database, TableName>(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n columns,\n );\n }\n\n insert(\n values:\n | TableInsertRow<Database, TableName>\n | TableInsertRow<Database, TableName>[],\n ...rest: unknown[]\n ): PostgrestInsertRootBuilder<TableRow<Database, TableName>> {\n if (rest.length > 0) {\n const err = new RagableError(\n \".insert() accepts only one argument: the row object or an array of rows. \" +\n \"Do not pass readOnly, options, or a second object — those apply only to database.query({ sql, readOnly }). \" +\n \"PostgREST inserts are writes by default.\",\n 400,\n { code: \"SDK_INSERT_EXTRA_ARGS\" },\n );\n return new PostgrestInsertSdkErrorRoot<TableRow<Database, TableName>>(\n err,\n ) as unknown as PostgrestInsertRootBuilder<TableRow<Database, TableName>>;\n }\n const rows = (Array.isArray(values) ? values : [values]) as Record<\n string,\n unknown\n >[];\n return new PostgrestInsertRootBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n rows,\n );\n }\n\n update(\n patch: TableUpdatePatch<Database, TableName>,\n ): PostgrestUpdateRootBuilder<TableRow<Database, TableName>, Database, TableName> {\n return new PostgrestUpdateRootBuilder<TableRow<Database, TableName>, Database, TableName>(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n patch as Record<string, unknown>,\n );\n }\n\n delete(): PostgrestDeleteRootBuilder<TableRow<Database, TableName>, Database, TableName> {\n return new PostgrestDeleteRootBuilder<TableRow<Database, TableName>, Database, TableName>(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n );\n }\n\n upsert(\n values:\n | TableInsertRow<Database, TableName>\n | TableInsertRow<Database, TableName>[],\n options: PostgrestUpsertOptions,\n ): PostgrestUpsertRootBuilder<TableRow<Database, TableName>> {\n const rows = (Array.isArray(values) ? values : [values]) as Record<\n string,\n unknown\n >[];\n return new PostgrestUpsertRootBuilder(\n this.pgFetch,\n this.databaseInstanceId,\n this.table,\n rows,\n options.onConflict,\n options.ignoreDuplicates === true,\n );\n }\n}\n","// ─── SessionStorage interface ────────────────────────────────────────────────\n\nexport interface SessionStorage {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\n// ─── Adapters ────────────────────────────────────────────────────────────────\n\nexport class LocalStorageAdapter implements SessionStorage {\n getItem(key: string): string | null {\n try {\n return globalThis.localStorage.getItem(key);\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n globalThis.localStorage.setItem(key, value);\n } catch { /* quota exceeded or blocked — best effort */ }\n }\n\n removeItem(key: string): void {\n try {\n globalThis.localStorage.removeItem(key);\n } catch { /* noop */ }\n }\n}\n\nexport class SessionStorageAdapter implements SessionStorage {\n getItem(key: string): string | null {\n try {\n return globalThis.sessionStorage.getItem(key);\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n globalThis.sessionStorage.setItem(key, value);\n } catch { /* noop */ }\n }\n\n removeItem(key: string): void {\n try {\n globalThis.sessionStorage.removeItem(key);\n } catch { /* noop */ }\n }\n}\n\nexport class MemoryStorageAdapter implements SessionStorage {\n private store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n}\n\nexport class CookieStorageAdapter implements SessionStorage {\n constructor(\n private readonly maxAge = 30 * 24 * 60 * 60,\n private readonly path = \"/\",\n private readonly sameSite: \"Lax\" | \"Strict\" | \"None\" = \"Lax\",\n ) {}\n\n getItem(key: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie\n .split(\"; \")\n .find((c) => c.startsWith(`${encodeURIComponent(key)}=`));\n if (!match) return null;\n return decodeURIComponent(match.split(\"=\").slice(1).join(\"=\"));\n }\n\n setItem(key: string, value: string): void {\n if (typeof document === \"undefined\") return;\n const parts = [\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`,\n `path=${this.path}`,\n `max-age=${this.maxAge}`,\n `SameSite=${this.sameSite}`,\n ];\n if (this.sameSite === \"None\") parts.push(\"Secure\");\n document.cookie = parts.join(\"; \");\n }\n\n removeItem(key: string): void {\n if (typeof document === \"undefined\") return;\n document.cookie = `${encodeURIComponent(key)}=; path=${this.path}; max-age=0`;\n }\n}\n\n// ─── Default storage detection ───────────────────────────────────────────────\n\nexport function detectStorage(): SessionStorage {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.localStorage !== \"undefined\") {\n try {\n const testKey = \"__ragable_test__\";\n globalThis.localStorage.setItem(testKey, \"1\");\n globalThis.localStorage.removeItem(testKey);\n return new LocalStorageAdapter();\n } catch { /* blocked */ }\n }\n return new MemoryStorageAdapter();\n}\n\n// ─── BroadcastChannel helper ─────────────────────────────────────────────────\n\nexport type AuthBroadcastMessage =\n | { type: \"SESSION_UPDATED\"; payload: string }\n | { type: \"SESSION_REMOVED\" };\n\nexport class AuthBroadcastChannel {\n private channel: BroadcastChannel | null = null;\n\n constructor(channelName: string) {\n if (typeof BroadcastChannel !== \"undefined\") {\n try {\n this.channel = new BroadcastChannel(channelName);\n } catch { /* unsupported */ }\n }\n }\n\n onMessage(cb: (msg: AuthBroadcastMessage) => void): void {\n if (this.channel) {\n this.channel.onmessage = (e: MessageEvent) => {\n const data = e.data as AuthBroadcastMessage;\n if (data && typeof data.type === \"string\") {\n cb(data);\n }\n };\n }\n }\n\n postSessionUpdated(serialized: string): void {\n this.channel?.postMessage({ type: \"SESSION_UPDATED\", payload: serialized } satisfies AuthBroadcastMessage);\n }\n\n postSessionRemoved(): void {\n this.channel?.postMessage({ type: \"SESSION_REMOVED\" } satisfies AuthBroadcastMessage);\n }\n\n close(): void {\n this.channel?.close();\n this.channel = null;\n }\n}\n","import {\n bindFetch,\n extractErrorMessage,\n RagableError,\n} from \"./request-client\";\nimport type {\n SessionStorage,\n} from \"./auth-storage\";\nimport {\n AuthBroadcastChannel,\n detectStorage,\n} from \"./auth-storage\";\nimport {\n asPostgrestResponse,\n type PostgrestResult,\n} from \"./browser-postgrest\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type AuthChangeEvent =\n | \"INITIAL_SESSION\"\n | \"SIGNED_IN\"\n | \"SIGNED_OUT\"\n | \"TOKEN_REFRESHED\"\n | \"USER_UPDATED\";\n\nexport interface AuthSession<\n U extends Record<string, unknown> = Record<string, unknown>,\n> {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n expires_at: number;\n token_type: \"bearer\";\n user: U;\n}\n\nexport interface AuthOptions {\n persistSession?: boolean;\n autoRefreshToken?: boolean;\n storage?: SessionStorage;\n storageKey?: string;\n refreshSkewSeconds?: number;\n debug?: boolean;\n}\n\nexport interface RagableAuthConfig {\n baseUrl: string;\n authGroupId: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n auth?: AuthOptions;\n}\n\ntype AuthListener<U extends Record<string, unknown>> = (\n event: AuthChangeEvent,\n session: AuthSession<U> | null,\n) => void;\n\ninterface Subscription {\n id: string;\n unsubscribe: () => void;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction parseExpiresInSeconds(raw: string | number): number {\n if (typeof raw === \"number\") return raw;\n const s = raw.trim().toLowerCase();\n const m = /^(\\d+)([smhd])?$/.exec(s);\n if (m) {\n const n = Number(m[1]);\n const u = m[2] ?? \"s\";\n const mult =\n u === \"s\" ? 1 : u === \"m\" ? 60 : u === \"h\" ? 3600 : u === \"d\" ? 86400 : 1;\n return n * mult;\n }\n const asNum = Number(s);\n return Number.isFinite(asNum) ? asNum : 0;\n}\n\nasync function parseJsonOrThrow<T>(response: Response): Promise<T> {\n const text = await response.text();\n let payload: unknown;\n try {\n payload = text ? JSON.parse(text) : null;\n } catch {\n throw new RagableError(`Response parse error: ${text.slice(0, 200)}`, response.status, null);\n }\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n return payload as T;\n}\n\nlet _subCounter = 0;\n\n// ─── RagableAuth ─────────────────────────────────────────────────────────────\n\nexport class RagableAuth<\n U extends Record<string, unknown> = Record<string, unknown>,\n> {\n private readonly fetchImpl: typeof fetch;\n private readonly baseUrl: string;\n private readonly authGroupId: string;\n private readonly defaultHeaders: HeadersInit | undefined;\n private readonly persistSession: boolean;\n private readonly autoRefreshToken: boolean;\n private readonly storage: SessionStorage;\n private readonly storageKey: string;\n private readonly refreshSkewSeconds: number;\n private readonly debug: boolean;\n\n private currentSession: AuthSession<U> | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private refreshPromise: Promise<AuthSession<U> | null> | null = null;\n private listeners = new Map<string, AuthListener<U>>();\n private broadcast: AuthBroadcastChannel | null = null;\n private visibilityHandler: (() => void) | null = null;\n private initialized = false;\n\n constructor(config: RagableAuthConfig) {\n this.baseUrl = config.baseUrl;\n this.authGroupId = config.authGroupId;\n this.fetchImpl = bindFetch(config.fetch);\n this.defaultHeaders = config.headers;\n\n const auth = config.auth ?? {};\n this.persistSession = auth.persistSession !== false;\n this.autoRefreshToken = auth.autoRefreshToken !== false;\n this.storage = auth.storage ?? detectStorage();\n this.storageKey = auth.storageKey ?? `ragable.session.${this.authGroupId}`;\n this.refreshSkewSeconds = auth.refreshSkewSeconds ?? 60;\n this.debug = auth.debug ?? false;\n\n this.broadcast = new AuthBroadcastChannel(`ragable-auth-${this.authGroupId}`);\n this.broadcast.onMessage((msg) => {\n if (msg.type === \"SESSION_UPDATED\") {\n try {\n const session = JSON.parse(msg.payload) as AuthSession<U>;\n this.currentSession = session;\n this.scheduleRefresh(session);\n this.emit(\"TOKEN_REFRESHED\", session);\n } catch { /* ignore bad data from other tab */ }\n } else if (msg.type === \"SESSION_REMOVED\") {\n this.currentSession = null;\n this.clearRefreshTimer();\n this.emit(\"SIGNED_OUT\", null);\n }\n });\n\n this.setupVisibilityListener();\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.debug(\"[RagableAuth]\", ...args);\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n async initialize(): Promise<AuthSession<U> | null> {\n if (this.initialized) return this.currentSession;\n this.initialized = true;\n if (this.persistSession) {\n try {\n const raw = await this.storage.getItem(this.storageKey);\n if (raw) {\n const session = JSON.parse(raw) as AuthSession<U>;\n if (session.expires_at && session.expires_at > nowSeconds()) {\n this.currentSession = session;\n this.scheduleRefresh(session);\n this.log(\"Restored session from storage\");\n } else if (session.refresh_token) {\n this.log(\"Stored session expired, attempting refresh\");\n const refreshed = await this._doRefresh(session.refresh_token);\n if (refreshed) {\n this.currentSession = refreshed;\n }\n }\n }\n } catch (e) {\n this.log(\"Failed to restore session\", e);\n }\n }\n this.emit(\"INITIAL_SESSION\", this.currentSession);\n return this.currentSession;\n }\n\n // ── Auth methods ───────────────────────────────────────────────────────────\n\n async signUp(credentials: {\n email: string;\n password: string;\n options?: { data?: Record<string, unknown> };\n }): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\n return asPostgrestResponse(async () => {\n const name =\n typeof credentials.options?.data?.name === \"string\"\n ? credentials.options.data.name\n : undefined;\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/register\", \"POST\", {\n email: credentials.email,\n password: credentials.password,\n ...(name !== undefined ? { name } : {}),\n });\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return { user: session.user, session };\n });\n }\n\n async signInWithPassword(credentials: {\n email: string;\n password: string;\n }): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\n return asPostgrestResponse(async () => {\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/login\", \"POST\", {\n email: credentials.email,\n password: credentials.password,\n });\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return { user: session.user, session };\n });\n }\n\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{ error: null }> {\n this.currentSession = null;\n this.clearRefreshTimer();\n if (this.persistSession) {\n await this.storage.removeItem(this.storageKey);\n }\n this.broadcast?.postSessionRemoved();\n this.emit(\"SIGNED_OUT\", null);\n return { error: null };\n }\n\n async refreshSession(\n refreshToken?: string,\n ): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\n return asPostgrestResponse(async () => {\n const token = refreshToken ?? this.currentSession?.refresh_token;\n if (!token) throw new RagableError(\"No refresh token available\", 401, null);\n const session = await this.singleFlightRefresh(token);\n if (!session) throw new RagableError(\"Refresh failed\", 401, null);\n return { session, user: session.user };\n });\n }\n\n async getSession(): Promise<PostgrestResult<{ session: AuthSession<U> | null }>> {\n if (!this.initialized) await this.initialize();\n return { data: { session: this.currentSession }, error: null };\n }\n\n async getUser(): Promise<PostgrestResult<{ user: U }>> {\n return asPostgrestResponse(async () => {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\n });\n }\n\n async setSession(tokens: {\n access_token: string;\n refresh_token: string;\n }): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\n return asPostgrestResponse(async () => {\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", tokens.access_token);\n const decoded = decodeJwtExpiry(tokens.access_token);\n const expiresIn = decoded ? decoded - nowSeconds() : 3600;\n const session: AuthSession<U> = {\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n expires_in: expiresIn,\n expires_at: nowSeconds() + expiresIn,\n token_type: \"bearer\",\n user: me.user,\n };\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return { session, user: me.user };\n });\n }\n\n async updateUser(attributes: {\n email?: string;\n password?: string;\n data?: { name?: string | null };\n }): Promise<PostgrestResult<{ user: U }>> {\n return asPostgrestResponse(async () => {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, {\n ...(attributes.password !== undefined ? { password: attributes.password } : {}),\n ...(attributes.data?.name !== undefined ? { name: attributes.data.name } : {}),\n });\n if (this.currentSession) {\n this.currentSession = { ...this.currentSession, user: result.user };\n await this.persistCurrentSession();\n }\n this.emit(\"USER_UPDATED\", this.currentSession);\n return result;\n });\n }\n\n // ── Event subscription ─────────────────────────────────────────────────────\n\n onAuthStateChange(\n callback: AuthListener<U>,\n ): { data: { subscription: Subscription } } {\n _subCounter++;\n const id = `sub-${_subCounter}`;\n this.listeners.set(id, callback);\n const unsubscribe = () => {\n this.listeners.delete(id);\n };\n return { data: { subscription: { id, unsubscribe } } };\n }\n\n // ── Accessors ──────────────────────────────────────────────────────────────\n\n getAccessToken(): string | null {\n return this.currentSession?.access_token ?? null;\n }\n\n getCurrentSession(): AuthSession<U> | null {\n return this.currentSession;\n }\n\n // ── Back-compat: raw Ragable auth methods ──────────────────────────────────\n\n async register(body: {\n email: string;\n password: string;\n name?: string;\n }): Promise<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }> {\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/register\", \"POST\", body);\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return raw;\n }\n\n async login(body: {\n email: string;\n password: string;\n }): Promise<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }> {\n const raw = await this.fetchAuth<{\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/login\", \"POST\", body);\n const session = this.rawToSession(raw);\n await this.setSessionInternal(session, \"SIGNED_IN\");\n return raw;\n }\n\n async refresh(body: { refreshToken: string }): Promise<{\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }> {\n return this.fetchAuth(\"/refresh\", \"POST\", body);\n }\n\n async getMe(): Promise<{ user: U }> {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\n }\n\n async updateMe(body: {\n name?: string | null;\n password?: string;\n }): Promise<{ user: U }> {\n const token = this.currentSession?.access_token;\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, body);\n if (this.currentSession) {\n this.currentSession = { ...this.currentSession, user: result.user };\n await this.persistCurrentSession();\n }\n this.emit(\"USER_UPDATED\", this.currentSession);\n return result;\n }\n\n // ── Cleanup ────────────────────────────────────────────────────────────────\n\n destroy(): void {\n this.clearRefreshTimer();\n this.broadcast?.close();\n this.listeners.clear();\n if (this.visibilityHandler && typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n }\n\n // ─── Internal ──────────────────────────────────────────────────────────────\n\n private authPrefix(): string {\n return `/auth-groups/${this.authGroupId}/auth`;\n }\n\n private toUrl(path: string): string {\n return `${this.baseUrl}${this.authPrefix()}${path}`;\n }\n\n private baseHeaders(json: boolean): Headers {\n const h = new Headers(this.defaultHeaders);\n if (json) h.set(\"Content-Type\", \"application/json\");\n return h;\n }\n\n private async fetchAuth<T>(\n path: string,\n method: \"GET\" | \"POST\" | \"PATCH\",\n body?: unknown,\n ): Promise<T> {\n const headers = this.baseHeaders(body !== undefined);\n const response = await this.fetchImpl(this.toUrl(path), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n return parseJsonOrThrow<T>(response);\n }\n\n private async fetchAuthWithBearer<T>(\n path: string,\n method: \"GET\" | \"POST\" | \"PATCH\",\n token: string,\n body?: unknown,\n ): Promise<T> {\n const headers = this.baseHeaders(body !== undefined);\n headers.set(\"Authorization\", `Bearer ${token}`);\n const response = await this.fetchImpl(this.toUrl(path), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n return parseJsonOrThrow<T>(response);\n }\n\n private rawToSession(raw: {\n user: U;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }): AuthSession<U> {\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\n return {\n access_token: raw.accessToken,\n refresh_token: raw.refreshToken,\n expires_in: expiresIn,\n expires_at: nowSeconds() + expiresIn,\n token_type: \"bearer\",\n user: raw.user,\n };\n }\n\n private async setSessionInternal(\n session: AuthSession<U>,\n event: AuthChangeEvent,\n ): Promise<void> {\n this.currentSession = session;\n await this.persistCurrentSession();\n this.broadcast?.postSessionUpdated(JSON.stringify(session));\n this.scheduleRefresh(session);\n this.emit(event, session);\n }\n\n private async persistCurrentSession(): Promise<void> {\n if (!this.persistSession || !this.currentSession) return;\n try {\n await this.storage.setItem(this.storageKey, JSON.stringify(this.currentSession));\n } catch (e) {\n this.log(\"Failed to persist session\", e);\n }\n }\n\n private emit(event: AuthChangeEvent, session: AuthSession<U> | null): void {\n this.log(event, session?.user);\n for (const cb of this.listeners.values()) {\n try {\n cb(event, session);\n } catch (e) {\n this.log(\"Listener threw\", e);\n }\n }\n }\n\n // ─── Refresh scheduling ────────────────────────────────────────────────────\n\n private scheduleRefresh(session: AuthSession<U>): void {\n this.clearRefreshTimer();\n if (!this.autoRefreshToken) return;\n const secondsUntilExpiry = session.expires_at - nowSeconds();\n const refreshIn = Math.max(0, secondsUntilExpiry - this.refreshSkewSeconds);\n this.log(`Scheduling refresh in ${refreshIn}s`);\n this.refreshTimer = setTimeout(() => {\n this.singleFlightRefresh(session.refresh_token).catch((e) => {\n this.log(\"Scheduled refresh failed\", e);\n });\n }, refreshIn * 1000);\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer !== null) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n async singleFlightRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\n if (this.refreshPromise) return this.refreshPromise;\n this.refreshPromise = this._doRefresh(refreshToken).finally(() => {\n this.refreshPromise = null;\n });\n return this.refreshPromise;\n }\n\n private async _doRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\n try {\n const raw = await this.fetchAuth<{\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n }>(\"/refresh\", \"POST\", { refreshToken });\n\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", raw.accessToken);\n\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\n const session: AuthSession<U> = {\n access_token: raw.accessToken,\n refresh_token: raw.refreshToken,\n expires_in: expiresIn,\n expires_at: nowSeconds() + expiresIn,\n token_type: \"bearer\",\n user: me.user,\n };\n\n await this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n return session;\n } catch (e) {\n this.log(\"Refresh failed\", e);\n return null;\n }\n }\n\n // ─── Visibility listener ───────────────────────────────────────────────────\n\n private setupVisibilityListener(): void {\n if (typeof document === \"undefined\") return;\n this.visibilityHandler = () => {\n if (document.visibilityState === \"visible\" && this.currentSession) {\n const secondsUntilExpiry = this.currentSession.expires_at - nowSeconds();\n if (secondsUntilExpiry <= this.refreshSkewSeconds) {\n this.singleFlightRefresh(this.currentSession.refresh_token).catch(() => {});\n } else {\n this.scheduleRefresh(this.currentSession);\n }\n } else {\n this.clearRefreshTimer();\n }\n };\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n}\n\nfunction nowSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nfunction decodeJwtExpiry(jwt: string): number | null {\n try {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\")));\n return typeof payload.exp === \"number\" ? payload.exp : null;\n } catch {\n return null;\n }\n}\n","import {\n bindFetch,\n DEFAULT_RAGABLE_API_BASE,\n extractErrorMessage,\n RagableError,\n} from \"./request-client\";\nimport type { AgentChatParams, AgentStreamEvent } from \"./agents\";\nimport type {\n DefaultRagableDatabase,\n RagableDatabase,\n RagableTableNames,\n} from \"./database-schema\";\nimport { parseMaybeJsonBody, readSseStream } from \"./sse\";\nimport {\n asPostgrestResponse,\n PostgrestTableApi,\n type PostgRESTFetch,\n type PostgRESTFetchParams,\n type PostgrestResult,\n} from \"./browser-postgrest\";\nimport {\n RagableAuth,\n type AuthChangeEvent,\n type AuthOptions,\n type AuthSession,\n} from \"./auth\";\nimport { Transport, type TransportOptions } from \"./transport\";\n\nexport function normalizeBrowserApiBase(baseUrl?: string): string {\n const trimmed = (baseUrl ?? DEFAULT_RAGABLE_API_BASE)\n .trim()\n .replace(/\\/+$/, \"\");\n return trimmed.endsWith(\"/api\") ? trimmed : `${trimmed}/api`;\n}\n\nexport type BrowserDataAuthMode = \"user\" | \"publicAnon\" | \"admin\";\n\nexport interface RagableBrowserClientOptions {\n organizationId: string;\n authGroupId?: string;\n databaseInstanceId?: string;\n dataAuth?: BrowserDataAuthMode;\n dataStaticKey?: string;\n getDataStaticKey?: () => string | null | Promise<string | null>;\n getAccessToken?: () => string | null | Promise<string | null>;\n baseUrl?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n auth?: AuthOptions;\n transport?: Partial<TransportOptions>;\n}\n\nfunction requireAuthGroupId(options: RagableBrowserClientOptions): string {\n const id = options.authGroupId?.trim();\n if (!id) {\n throw new RagableError(\n \"authGroupId is required for auth and database methods on the browser client\",\n 400,\n { code: \"SDK_MISSING_AUTH_GROUP_ID\" },\n );\n }\n return id;\n}\n\nasync function requireAccessToken(\n options: RagableBrowserClientOptions,\n ragableAuth: RagableAuth | null,\n): Promise<string> {\n if (ragableAuth) {\n const token = ragableAuth.getAccessToken();\n if (token) return token;\n }\n const getter = options.getAccessToken;\n if (getter) {\n const token = await getter();\n if (token?.trim()) return token.trim();\n }\n throw new RagableError(\n \"No access token available. Sign in first with auth.signInWithPassword() or provide getAccessToken callback.\",\n 401,\n { code: \"SDK_NO_ACCESS_TOKEN\" },\n );\n}\n\nasync function resolveDatabaseAuthBearer(\n options: RagableBrowserClientOptions,\n ragableAuth: RagableAuth | null,\n): Promise<string> {\n const mode: BrowserDataAuthMode = options.dataAuth ?? \"user\";\n if (mode === \"user\") {\n return requireAccessToken(options, ragableAuth);\n }\n const fromGetter = options.getDataStaticKey\n ? await options.getDataStaticKey()\n : null;\n const key = (fromGetter?.trim() || options.dataStaticKey?.trim()) ?? \"\";\n if (!key) {\n throw new RagableError(\n mode === \"publicAnon\"\n ? \"dataAuth publicAnon requires getDataStaticKey or dataStaticKey\"\n : \"dataAuth admin requires getDataStaticKey or dataStaticKey\",\n 400,\n { code: \"SDK_MISSING_STATIC_KEY\" },\n );\n }\n return key;\n}\n\n// ─── Session types (kept for back-compat) ────────────────────────────────────\n\nexport interface BrowserAuthSession<\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n user: AuthUser;\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n}\n\nexport interface BrowserAuthTokens {\n accessToken: string;\n refreshToken: string;\n expiresIn: string;\n}\n\nexport interface SupabaseCompatSession<\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n token_type: \"bearer\";\n user: AuthUser;\n}\n\nexport type { PostgrestResult };\n\n// ─── RagableBrowserAuthClient (back-compat shim) ─────────────────────────────\n\nexport class RagableBrowserAuthClient<\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n constructor(\n _options: RagableBrowserClientOptions,\n private readonly ragableAuth: RagableAuth<AuthUser> | null = null,\n ) {}\n\n private get auth(): RagableAuth<AuthUser> {\n if (!this.ragableAuth) {\n throw new Error(\"Auth not initialized — provide authGroupId to enable auth\");\n }\n return this.ragableAuth;\n }\n\n async signUp(credentials: {\n email: string;\n password: string;\n options?: { data?: Record<string, unknown> };\n }): Promise<\n PostgrestResult<{\n user: AuthUser;\n session: SupabaseCompatSession<AuthUser>;\n }>\n > {\n const result = await this.auth.signUp(credentials);\n if (result.error) return { data: null, error: result.error };\n const session = result.data!.session;\n return {\n data: {\n user: session.user,\n session: {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_in: session.expires_in,\n token_type: \"bearer\",\n user: session.user,\n },\n },\n error: null,\n };\n }\n\n async signInWithPassword(credentials: {\n email: string;\n password: string;\n }): Promise<\n PostgrestResult<{\n user: AuthUser;\n session: SupabaseCompatSession<AuthUser>;\n }>\n > {\n const result = await this.auth.signInWithPassword(credentials);\n if (result.error) return { data: null, error: result.error };\n const session = result.data!.session;\n return {\n data: {\n user: session.user,\n session: {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_in: session.expires_in,\n token_type: \"bearer\",\n user: session.user,\n },\n },\n error: null,\n };\n }\n\n async refreshSession(refreshToken: string): Promise<\n PostgrestResult<{ session: SupabaseCompatSession<AuthUser>; user: AuthUser }>\n > {\n const result = await this.auth.refreshSession(refreshToken);\n if (result.error) return { data: null, error: result.error };\n const session = result.data!.session;\n return {\n data: {\n user: session.user,\n session: {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_in: session.expires_in,\n token_type: \"bearer\",\n user: session.user,\n },\n },\n error: null,\n };\n }\n\n async getUser(): Promise<PostgrestResult<{ user: AuthUser }>> {\n return this.auth.getUser();\n }\n\n async updateUser(attributes: {\n email?: string;\n password?: string;\n data?: { name?: string | null };\n }): Promise<PostgrestResult<{ user: AuthUser }>> {\n return this.auth.updateUser(attributes);\n }\n\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{\n error: null;\n }> {\n return this.auth.signOut(_options);\n }\n\n async register(body: {\n email: string;\n password: string;\n name?: string;\n }): Promise<BrowserAuthSession<AuthUser>> {\n return this.auth.register(body);\n }\n\n async login(body: {\n email: string;\n password: string;\n }): Promise<BrowserAuthSession<AuthUser>> {\n return this.auth.login(body);\n }\n\n async refresh(body: { refreshToken: string }): Promise<BrowserAuthTokens> {\n return this.auth.refresh(body);\n }\n\n async getMe(): Promise<{ user: AuthUser }> {\n return this.auth.getMe();\n }\n\n async updateMe(body: {\n name?: string | null;\n password?: string;\n }): Promise<{ user: AuthUser }> {\n return this.auth.updateMe(body);\n }\n\n onAuthStateChange(\n callback: (event: AuthChangeEvent, session: AuthSession<AuthUser> | null) => void,\n ): { data: { subscription: { id: string; unsubscribe: () => void } } } {\n return this.auth.onAuthStateChange(callback);\n }\n\n getSession(): Promise<PostgrestResult<{ session: AuthSession<AuthUser> | null }>> {\n return this.auth.getSession();\n }\n}\n\n// ─── SQL query types ─────────────────────────────────────────────────────────\n\nexport interface BrowserSqlQueryParams {\n databaseInstanceId?: string;\n sql: string;\n params?: unknown[];\n readOnly?: boolean;\n timeoutMs?: number;\n rowLimit?: number;\n}\n\nexport interface BrowserSqlQueryResult<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> {\n command: string;\n rowCount: number;\n truncated: boolean;\n rows: Row[];\n}\n\n// ─── Database client ─────────────────────────────────────────────────────────\n\nexport class RagableBrowserDatabaseClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n> {\n private readonly fetchImpl: typeof fetch;\n private _transport: Transport | null = null;\n\n constructor(\n private readonly options: RagableBrowserClientOptions,\n private readonly ragableAuth: RagableAuth | null = null,\n ) {\n this.fetchImpl = bindFetch(options.fetch);\n }\n\n /** @internal Called by RagableBrowser to share the Transport instance. */\n _setTransport(transport: Transport): void {\n this._transport = transport;\n }\n\n from<TableName extends RagableTableNames<Database>>(\n table: TableName,\n databaseInstanceId?: string,\n ): PostgrestTableApi<Database, TableName> {\n const id =\n databaseInstanceId?.trim() || this.options.databaseInstanceId?.trim() || \"\";\n const ragableAuth = this.ragableAuth;\n const opts = this.options;\n const transport = this._transport;\n const fetchImpl = this.fetchImpl;\n\n const pgFetch: PostgRESTFetch = async (params: PostgRESTFetchParams) => {\n if (!params.databaseInstanceId?.trim()) {\n throw new RagableError(\n \"database.from() requires databaseInstanceId in client options or as the second argument\",\n 400,\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\n );\n }\n const gid = requireAuthGroupId(opts);\n const token = await resolveDatabaseAuthBearer(opts, ragableAuth);\n const baseUrl = normalizeBrowserApiBase(opts.baseUrl);\n const qs = params.searchParams.toString();\n const url = `${baseUrl}/auth-groups/${gid}/data/rest/${params.table}${qs ? `?${qs}` : \"\"}`;\n\n const headers = new Headers(opts.headers);\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"X-Database-Instance-Id\", params.databaseInstanceId);\n if (params.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (params.headers) {\n for (const [k, v] of Object.entries(params.headers)) {\n headers.set(k, v);\n }\n }\n\n if (transport) {\n return transport.execute({\n url,\n method: params.method,\n headers,\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\n signal: params.signal,\n idempotencyKey: params.idempotencyKey,\n });\n }\n\n return fetchImpl(url, {\n method: params.method,\n headers,\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\n signal: params.signal,\n });\n };\n return new PostgrestTableApi<Database, TableName>(pgFetch, id, table);\n }\n\n private toUrl(path: string): string {\n return `${normalizeBrowserApiBase(this.options.baseUrl)}${path.startsWith(\"/\") ? path : `/${path}`}`;\n }\n\n async query<Row extends Record<string, unknown> = Record<string, unknown>>(\n params: BrowserSqlQueryParams,\n ): Promise<PostgrestResult<BrowserSqlQueryResult<Row>>> {\n return asPostgrestResponse(async () => {\n const gid = requireAuthGroupId(this.options);\n const token = await resolveDatabaseAuthBearer(this.options, this.ragableAuth);\n const databaseInstanceId =\n params.databaseInstanceId?.trim() ||\n this.options.databaseInstanceId?.trim();\n if (!databaseInstanceId) {\n throw new RagableError(\n \"database.query requires databaseInstanceId in the request or on createBrowserClient({ databaseInstanceId })\",\n 400,\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\n );\n }\n const headers = this.baseHeaders();\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"Content-Type\", \"application/json\");\n const readOnly =\n (this.options.dataAuth ?? \"user\") === \"publicAnon\"\n ? true\n : params.readOnly !== false;\n const response = await this.fetchImpl(\n this.toUrl(`/auth-groups/${gid}/data/query`),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n databaseInstanceId,\n sql: params.sql,\n ...(params.params !== undefined ? { params: params.params } : {}),\n readOnly,\n ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),\n ...(params.rowLimit !== undefined ? { rowLimit: params.rowLimit } : {}),\n }),\n },\n );\n const payload = await parseMaybeJsonBody(response);\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n return payload as BrowserSqlQueryResult<Row>;\n });\n }\n\n private baseHeaders(): Headers {\n return new Headers(this.options.headers);\n }\n}\n\n// ─── Agents client ───────────────────────────────────────────────────────────\n\nexport class RagableBrowserAgentsClient {\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: RagableBrowserClientOptions) {\n this.fetchImpl = bindFetch(options.fetch);\n }\n\n private toUrl(path: string): string {\n return `${normalizeBrowserApiBase(this.options.baseUrl)}${path.startsWith(\"/\") ? path : `/${path}`}`;\n }\n\n async *chatStream(\n agentId: string,\n params: AgentPublicChatParams,\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\n const orgId = this.options.organizationId;\n const body: Record<string, unknown> = {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n ...(params.triggerSubtype !== undefined\n ? { triggerSubtype: params.triggerSubtype }\n : {}),\n ...(params.triggerNodeId !== undefined\n ? { triggerNodeId: params.triggerNodeId }\n : {}),\n };\n\n const headers = new Headers(this.options.headers);\n headers.set(\"Content-Type\", \"application/json\");\n\n const response = await this.fetchImpl(\n this.toUrl(`/public/organizations/${orgId}/agents/${agentId}/chat/stream`),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const payload = await parseMaybeJsonBody(response);\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n const streamBody = response.body;\n if (!streamBody) {\n return;\n }\n\n yield* readSseStream(streamBody);\n }\n}\n\nexport interface AgentPublicChatParams extends AgentChatParams {\n triggerSubtype?: string;\n triggerNodeId?: string;\n}\n\n// ─── Main browser client ─────────────────────────────────────────────────────\n\nexport class RagableBrowser<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly agents: RagableBrowserAgentsClient;\n readonly auth: RagableBrowserAuthClient<AuthUser>;\n readonly database: RagableBrowserDatabaseClient<Database>;\n readonly transport: Transport;\n private readonly _ragableAuth: RagableAuth<AuthUser> | null;\n\n constructor(options: RagableBrowserClientOptions) {\n this.transport = new Transport({\n fetch: options.fetch,\n headers: options.headers,\n ...options.transport,\n });\n\n if (options.authGroupId) {\n this._ragableAuth = new RagableAuth<AuthUser>({\n baseUrl: normalizeBrowserApiBase(options.baseUrl),\n authGroupId: options.authGroupId,\n fetch: options.fetch,\n headers: options.headers,\n auth: options.auth,\n });\n\n this.transport.setRefreshHandler(async () => {\n const session = await this._ragableAuth!.singleFlightRefresh(\n this._ragableAuth!.getCurrentSession()?.refresh_token ?? \"\",\n );\n return session?.access_token ?? null;\n });\n\n if (!options.getAccessToken) {\n this._ragableAuth.initialize().catch(() => {});\n }\n } else {\n this._ragableAuth = null;\n }\n\n this.agents = new RagableBrowserAgentsClient(options);\n this.auth = new RagableBrowserAuthClient<AuthUser>(options, this._ragableAuth);\n this.database = new RagableBrowserDatabaseClient<Database>(\n options,\n this._ragableAuth as RagableAuth | null,\n );\n this.database._setTransport(this.transport);\n }\n\n /** Delegates to `database.from()`. Kept for back-compat — prefer `database.from()`. */\n from<TableName extends RagableTableNames<Database>>(\n table: TableName,\n databaseInstanceId?: string,\n ): PostgrestTableApi<Database, TableName> {\n return this.database.from(table, databaseInstanceId);\n }\n\n destroy(): void {\n this._ragableAuth?.destroy();\n }\n}\n\nexport function createBrowserClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser> {\n return new RagableBrowser<Database, AuthUser>(options);\n}\n\nexport const createRagableBrowserClient = createBrowserClient;\n","import type {\n ShiftAddDocumentParams,\n ShiftIngestResponse,\n ShiftSearchParams,\n ShiftSearchResult,\n ShiftUploadFileParams,\n} from \"./shift\";\n\n/** Minimal client surface for {@link createRagPipeline} (implemented by {@link Ragable}). */\nexport interface RagClientForPipeline {\n shift: {\n documents: {\n create: (\n indexId: string,\n params: ShiftAddDocumentParams,\n ) => Promise<ShiftIngestResponse>;\n upload: (\n indexId: string,\n params: ShiftUploadFileParams,\n ) => Promise<ShiftIngestResponse>;\n };\n search: (\n indexId: string,\n params: ShiftSearchParams,\n ) => Promise<{ results: ShiftSearchResult[] }>;\n };\n}\n\nexport interface FormatContextOptions {\n /** Prepended before numbered passages (default: \"Relevant passages:\\\\n\") */\n header?: string;\n /** Joiner between passages (default: \"\\\\n\\\\n\") */\n separator?: string;\n /** Omit results with similarity score below this (default: no filter) */\n minScore?: number;\n /** Truncate total context string to this UTF-16 length (default: no limit) */\n maxChars?: number;\n /** Include similarity score in each block (default: false) */\n includeScores?: boolean;\n}\n\nexport interface RagPipelineOptions {\n indexId: string;\n}\n\nexport type RetrieveParams = ShiftSearchParams & {\n format?: FormatContextOptions;\n};\n\nexport interface RagPipeline {\n readonly indexId: string;\n ingestText(params: ShiftAddDocumentParams): Promise<ShiftIngestResponse>;\n ingestFile(params: ShiftUploadFileParams): Promise<ShiftIngestResponse>;\n search(params: ShiftSearchParams): Promise<{ results: ShiftSearchResult[] }>;\n retrieve(params: RetrieveParams): Promise<{\n results: ShiftSearchResult[];\n context: string;\n }>;\n}\n\n/**\n * Turn vector search hits into a single block of text for system prompts or RAG user messages.\n */\nexport function formatRetrievalContext(\n results: ShiftSearchResult[],\n options: FormatContextOptions = {},\n): string {\n const header = options.header ?? \"Relevant passages:\\n\";\n const separator = options.separator ?? \"\\n\\n\";\n const minScore = options.minScore;\n\n let filtered = results;\n if (typeof minScore === \"number\") {\n filtered = results.filter((r) => r.score >= minScore);\n }\n\n const blocks = filtered.map((r, i) => {\n const scoreSuffix =\n options.includeScores === true ? ` (score: ${r.score.toFixed(4)})` : \"\";\n return `[${i + 1}]${scoreSuffix}\\n${r.content.trim()}`;\n });\n\n let text = (blocks.length > 0 ? header : \"\") + blocks.join(separator);\n\n if (typeof options.maxChars === \"number\" && text.length > options.maxChars) {\n text = text.slice(0, options.maxChars).trimEnd() + \"\\n…\";\n }\n\n return text;\n}\n\n/**\n * High-level RAG helpers bound to one Shift index: ingest, search, retrieve with prompt-ready context.\n */\nexport function createRagPipeline(\n client: RagClientForPipeline,\n options: RagPipelineOptions,\n): RagPipeline {\n const { indexId } = options;\n\n return {\n indexId,\n\n ingestText(params) {\n return client.shift.documents.create(indexId, params);\n },\n\n ingestFile(params) {\n return client.shift.documents.upload(indexId, params);\n },\n\n search(params) {\n return client.shift.search(indexId, params);\n },\n\n async retrieve(params) {\n const { format: formatOpts, ...searchParams } = params;\n const { results } = await client.shift.search(indexId, searchParams);\n const context = formatRetrievalContext(results, formatOpts ?? {});\n return { results, context };\n },\n };\n}\n","export type {\n ColumnName,\n ColumnValue,\n DefaultRagableDatabase,\n Json,\n RagableDatabase,\n RagableTableDefinition,\n RagableTableNames,\n TableInsertRow,\n TableRow,\n TableUpdatePatch,\n Tables,\n TablesInsert,\n TablesUpdate,\n} from \"./database-schema\";\n\nexport type { RagableClientOptions, RequestOptions } from \"./request-client\";\nexport {\n bindFetch,\n DEFAULT_RAGABLE_API_BASE,\n extractErrorMessage,\n formatSdkError,\n formatPostgrestError,\n RagableAbortError,\n RagableError,\n RagableNetworkError,\n RagableSdkError,\n RagableTimeoutError,\n RagableRequestClient,\n} from \"./request-client\";\n\nexport type {\n ShiftAddDocumentParams,\n ShiftCreateIndexParams,\n ShiftEntry,\n ShiftIndex,\n ShiftIngestResponse,\n ShiftListEntriesParams,\n ShiftListEntriesResponse,\n ShiftSearchParams,\n ShiftSearchResult,\n ShiftUpdateIndexParams,\n ShiftUploadableFile,\n ShiftUploadFileParams,\n} from \"./shift\";\nexport { ShiftClient } from \"./shift\";\n\nexport type {\n AgentChatMessage,\n AgentChatParams,\n AgentChatResult,\n AgentStreamEvent,\n AgentSummary,\n} from \"./agents\";\nexport { AgentsClient } from \"./agents\";\n\nexport type {\n AgentPublicChatParams,\n BrowserAuthSession,\n BrowserAuthTokens,\n BrowserDataAuthMode,\n BrowserSqlQueryParams,\n BrowserSqlQueryResult,\n PostgrestResult,\n RagableBrowserClientOptions,\n SupabaseCompatSession,\n} from \"./browser\";\nexport {\n createBrowserClient,\n createRagableBrowserClient,\n normalizeBrowserApiBase,\n RagableBrowser,\n RagableBrowserAgentsClient,\n RagableBrowserAuthClient,\n RagableBrowserDatabaseClient,\n} from \"./browser\";\n\nexport type {\n BrowserSqlExecParams,\n BrowserSqlExecResult,\n PostgRESTFetch,\n PostgRESTFetchParams,\n PostgrestUpsertOptions,\n RunQuery,\n} from \"./browser-postgrest\";\nexport {\n asPostgrestResponse,\n PostgrestDeleteReturningBuilder,\n PostgrestDeleteRootBuilder,\n PostgrestInsertReturningBuilder,\n PostgrestInsertRootBuilder,\n PostgrestInsertSdkErrorReturning,\n PostgrestInsertSdkErrorRoot,\n PostgrestSelectBuilder,\n PostgrestTableApi,\n PostgrestUpdateReturningBuilder,\n PostgrestUpdateRootBuilder,\n PostgrestUpsertReturningBuilder,\n PostgrestUpsertRootBuilder,\n} from \"./browser-postgrest\";\n\nexport type { SseJsonEvent } from \"./sse\";\nexport { parseSseDataLine, readSseStream } from \"./sse\";\n\nexport type {\n FormatContextOptions,\n RagClientForPipeline,\n RagPipeline,\n RagPipelineOptions,\n RetrieveParams,\n} from \"./rag\";\nexport { createRagPipeline, formatRetrievalContext } from \"./rag\";\n\n// ─── New modules ─────────────────────────────────────────────────────────────\n\nexport type {\n HttpMethod,\n RetryOptions,\n TransportOptions,\n TransportRequest,\n} from \"./transport\";\nexport { generateIdempotencyKey, Transport, parseTransportResponse } from \"./transport\";\n\nexport type {\n SessionStorage,\n AuthBroadcastMessage,\n} from \"./auth-storage\";\nexport {\n AuthBroadcastChannel,\n CookieStorageAdapter,\n detectStorage,\n LocalStorageAdapter,\n MemoryStorageAdapter,\n SessionStorageAdapter,\n} from \"./auth-storage\";\n\nexport type {\n AuthChangeEvent,\n AuthOptions,\n AuthSession,\n RagableAuthConfig,\n} from \"./auth\";\nexport { RagableAuth } from \"./auth\";\n\n// ─── Top-level client classes ────────────────────────────────────────────────\n\nimport { AgentsClient } from \"./agents\";\nimport {\n createBrowserClient,\n normalizeBrowserApiBase,\n RagableBrowser,\n type RagableBrowserClientOptions,\n} from \"./browser\";\nimport type { DefaultRagableDatabase, RagableDatabase } from \"./database-schema\";\nimport {\n RagableRequestClient,\n type RagableClientOptions,\n} from \"./request-client\";\nimport { ShiftClient } from \"./shift\";\n\nexport class Ragable {\n readonly shift: ShiftClient;\n readonly agents: AgentsClient;\n readonly infrastructure: {\n shift: ShiftClient;\n };\n\n constructor(options: RagableClientOptions) {\n const client = new RagableRequestClient(options);\n this.shift = new ShiftClient(client);\n this.agents = new AgentsClient(client);\n this.infrastructure = {\n shift: this.shift,\n };\n }\n}\n\nfunction isServerClientOptions(o: unknown): o is RagableClientOptions {\n return (\n typeof o === \"object\" &&\n o !== null &&\n \"apiKey\" in o &&\n typeof (o as RagableClientOptions).apiKey === \"string\" &&\n (o as RagableClientOptions).apiKey.length > 0\n );\n}\n\nexport function createClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(\n url: string,\n options: Omit<RagableBrowserClientOptions, \"baseUrl\">,\n): RagableBrowser<Database, AuthUser>;\nexport function createClient(options: RagableClientOptions): Ragable;\nexport function createClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser>;\nexport function createClient<\n Database extends RagableDatabase = DefaultRagableDatabase,\n AuthUser extends Record<string, unknown> = Record<string, unknown>,\n>(\n urlOrOptions: string | RagableClientOptions | RagableBrowserClientOptions,\n browserOptions?: Omit<RagableBrowserClientOptions, \"baseUrl\">,\n): Ragable | RagableBrowser<Database, AuthUser> {\n if (typeof urlOrOptions === \"string\") {\n if (!browserOptions) {\n throw new Error(\n \"createClient(url, options) requires options with at least organizationId\",\n );\n }\n const raw = urlOrOptions.trim().replace(/\\/+$/, \"\");\n const baseUrl = raw.endsWith(\"/api\") ? raw : `${raw}/api`;\n return createBrowserClient<Database, AuthUser>({\n ...browserOptions,\n baseUrl: normalizeBrowserApiBase(baseUrl),\n });\n }\n if (isServerClientOptions(urlOrOptions)) {\n return new Ragable(urlOrOptions);\n }\n if (\n typeof urlOrOptions === \"object\" &&\n urlOrOptions !== null &&\n \"organizationId\" in urlOrOptions &&\n typeof (urlOrOptions as RagableBrowserClientOptions).organizationId ===\n \"string\"\n ) {\n return createBrowserClient<Database, AuthUser>(\n urlOrOptions as RagableBrowserClientOptions,\n );\n }\n throw new Error(\n \"createClient(options) requires apiKey (server) or organizationId (browser)\",\n );\n}\n\nexport function createRagableServerClient(options: RagableClientOptions) {\n return new Ragable(options);\n}\n"],"mappings":"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","names":[]}