@ragable/sdk 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +349 -529
- package/dist/index.d.ts +349 -529
- package/dist/index.js +663 -514
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +656 -506
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/request-client.ts","../src/shift.ts","../src/agent-stream.ts","../src/agent-chat-ui.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/storage.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Native `fetch` must not be called as a detached reference (`const f = fetch; f(url)`),\r\n * or the browser throws **Illegal invocation**. Use this for defaults and for `options.fetch`.\r\n */\r\nexport function bindFetch(custom?: typeof fetch): typeof fetch {\r\n return (input, init) => {\r\n const f = custom ?? globalThis.fetch;\r\n return f.call(globalThis, input as RequestInfo, init);\r\n };\r\n}\r\n\r\n/** Hosted Ragable HTTP API base (`…/api`) — used by all SDK clients (not configurable). */\r\nexport const DEFAULT_RAGABLE_API_BASE =\r\n \"https://ragable-341305259977.asia-southeast1.run.app/api\";\r\n\r\nexport interface RagableClientOptions {\r\n apiKey: string;\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n}\r\n\r\nexport type RequestOptions = Omit<RequestInit, \"body\"> & {\r\n body?: unknown;\r\n};\r\n\r\nexport abstract class RagableSdkError extends Error {\r\n abstract readonly __type: string;\r\n constructor(message: string) {\r\n super(message);\r\n this.name = this.constructor.name;\r\n // Native `Error.message` is non-enumerable — `{...err}`, `JSON.stringify({...err})`, and some\r\n // loggers show `{}`. Redefine so spreads and plain serialization keep `message`.\r\n Object.defineProperty(this, \"message\", {\r\n configurable: true,\r\n enumerable: true,\r\n writable: true,\r\n value: message,\r\n });\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n __type: this.__type,\r\n };\r\n }\r\n}\r\n\r\nexport class RagableError extends RagableSdkError {\r\n readonly __type = \"RagableError\" as const;\r\n readonly status: number;\r\n readonly body: unknown;\r\n readonly code: string | undefined;\r\n readonly details: string | undefined;\r\n\r\n constructor(message: string, status: number, body: unknown) {\r\n super(message);\r\n this.status = status;\r\n this.body = body;\r\n this.code =\r\n body && typeof body === \"object\"\r\n ? typeof (body as Record<string, unknown>).code === \"string\"\r\n ? ((body as Record<string, unknown>).code as string)\r\n : typeof (body as Record<string, unknown>).code === \"number\"\r\n ? String((body as Record<string, unknown>).code)\r\n : undefined\r\n : undefined;\r\n this.details =\r\n body && typeof body === \"object\"\r\n ? typeof (body as Record<string, unknown>).details === \"string\"\r\n ? ((body as Record<string, unknown>).details as string)\r\n : undefined\r\n : undefined;\r\n }\r\n\r\n override toJSON(): Record<string, unknown> {\r\n return {\r\n ...super.toJSON(),\r\n status: this.status,\r\n body: this.body,\r\n code: this.code,\r\n details: this.details,\r\n };\r\n }\r\n\r\n /** Stable string for logs — avoids `{}` when coercing or stringifying. */\r\n override toString(): string {\r\n const bits = [`${this.name}: ${this.message}`];\r\n if (this.status) bits.push(`status=${this.status}`);\r\n if (this.code) bits.push(`code=${this.code}`);\r\n return bits.join(\" · \");\r\n }\r\n}\r\n\r\n/** Safe one-line log for any thrown value (catch blocks, TanStack Query). */\r\nexport function formatSdkError(err: unknown): string {\r\n if (err instanceof RagableError) {\r\n return `${err.message} (HTTP ${err.status}${err.code ? `, ${err.code}` : \"\"})`;\r\n }\r\n if (err instanceof RagableSdkError) {\r\n return err.message;\r\n }\r\n if (err instanceof Error) {\r\n return err.message || err.name;\r\n }\r\n if (typeof err === \"string\") return err;\r\n if (err && typeof err === \"object\") {\r\n try {\r\n const s = JSON.stringify(err);\r\n if (s !== \"{}\") return s;\r\n return \"Unknown error (empty object — avoid `{...error}` spread; use error.message or formatSdkError)\";\r\n } catch {\r\n /* fall through */\r\n }\r\n }\r\n return String(err);\r\n}\r\n\r\n/**\r\n * Human-readable line for a PostgREST `{ data, error }` error (or any thrown value).\r\n * Use in UI instead of `JSON.stringify(error)` or template strings on unknown errors.\r\n */\r\nexport function formatPostgrestError(error: unknown): string {\r\n return formatSdkError(error);\r\n}\r\n\r\nexport class RagableNetworkError extends RagableSdkError {\r\n readonly __type = \"RagableNetworkError\" as const;\r\n readonly cause: unknown;\r\n constructor(message: string, cause?: unknown) {\r\n super(message);\r\n this.cause = cause;\r\n }\r\n\r\n override toJSON(): Record<string, unknown> {\r\n return {\r\n ...super.toJSON(),\r\n cause: this.cause instanceof Error ? this.cause.message : this.cause,\r\n };\r\n }\r\n}\r\n\r\nexport class RagableAbortError extends RagableSdkError {\r\n readonly __type = \"RagableAbortError\" as const;\r\n constructor(message = \"Request aborted\") {\r\n super(message);\r\n }\r\n}\r\n\r\nexport class RagableTimeoutError extends RagableSdkError {\r\n readonly __type = \"RagableTimeoutError\" as const;\r\n readonly timeoutMs: number;\r\n constructor(timeoutMs: number) {\r\n super(`Request timed out after ${timeoutMs}ms`);\r\n this.timeoutMs = timeoutMs;\r\n }\r\n\r\n override toJSON(): Record<string, unknown> {\r\n return {\r\n ...super.toJSON(),\r\n timeoutMs: this.timeoutMs,\r\n };\r\n }\r\n}\r\n\r\nexport function extractErrorMessage(payload: unknown, fallback: string) {\r\n if (payload && typeof payload === \"object\") {\r\n if (\"error\" in payload && typeof payload.error === \"string\") {\r\n return payload.error;\r\n }\r\n if (\"message\" in payload && typeof payload.message === \"string\") {\r\n return payload.message;\r\n }\r\n }\r\n\r\n if (typeof payload === \"string\" && payload.length > 0) {\r\n return payload;\r\n }\r\n\r\n return fallback || \"Request failed\";\r\n}\r\n\r\nexport class RagableRequestClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultHeaders: HeadersInit | undefined;\r\n\r\n constructor(options: RagableClientOptions) {\r\n this.apiKey = options.apiKey;\r\n this.baseUrl = DEFAULT_RAGABLE_API_BASE.replace(/\\/+$/, \"\");\r\n this.fetchImpl = bindFetch(options.fetch);\r\n this.defaultHeaders = options.headers;\r\n }\r\n\r\n toUrl(path: string) {\r\n const normalizedBase = this.baseUrl.replace(/\\/+$/, \"\");\r\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${normalizedBase}${normalizedPath}`;\r\n }\r\n\r\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\r\n const response = await this.rawFetch(path, options);\r\n const payload = await this.parseResponseBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n return payload as T;\r\n }\r\n\r\n /**\r\n * Low-level fetch with API key and JSON body encoding. Caller handles status and body.\r\n */\r\n async rawFetch(path: string, options: RequestOptions = {}): Promise<Response> {\r\n const headers = new Headers(this.defaultHeaders);\r\n headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\r\n\r\n let body = options.body;\r\n if (body !== undefined && !isBodyInit(body)) {\r\n headers.set(\"Content-Type\", \"application/json\");\r\n body = JSON.stringify(body);\r\n }\r\n\r\n return this.fetchImpl(this.toUrl(path), {\r\n ...options,\r\n headers,\r\n body: body as BodyInit | undefined,\r\n });\r\n }\r\n\r\n private async parseResponseBody(response: Response): Promise<unknown> {\r\n if (response.status === 204) {\r\n return null;\r\n }\r\n\r\n const contentType = response.headers.get(\"content-type\") ?? \"\";\r\n if (contentType.includes(\"application/json\")) {\r\n return response.json();\r\n }\r\n\r\n return response.text();\r\n }\r\n}\r\n\r\nexport function isBodyInit(value: unknown): value is BodyInit {\r\n return (\r\n typeof value === \"string\" ||\r\n value instanceof Blob ||\r\n value instanceof FormData ||\r\n value instanceof URLSearchParams ||\r\n value instanceof ArrayBuffer ||\r\n ArrayBuffer.isView(value)\r\n );\r\n}\r\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","import type { AgentStreamEvent } from \"./agents\";\nimport { RagableAbortError, RagableError } from \"./request-client\";\n\n/**\n * First SSE frame for website project agents (`POST …/agents/:name/chat/stream`).\n */\nexport interface AgentStreamAgentInfoEvent {\n type: \"agent:info\";\n name: string;\n agent_name: string;\n}\n\n/** Payload on the terminal `done` event (matches backend {@link AgentChatResult} + usage fields). */\nexport interface AgentChatStreamDonePayload {\n response: string;\n traces: unknown[];\n totalDurationMs: number;\n httpResponse?: unknown;\n inputTokens?: number;\n outputTokens?: number;\n cachedPromptTokens?: number;\n cacheCreationInputTokens?: number;\n completionProviders?: string[];\n creditsCharged?: number;\n agentSteps?: number;\n finishReason?: string | null;\n stopReason?: string | null;\n turnMessages?: unknown;\n promptTokensEstimated?: number;\n contextWindow?: number;\n}\n\n/**\n * Resolved outcome after the stream finishes. `assistantText` is the concatenation of\n * all `token` deltas; `response` is the server’s final string from `done` (authoritative).\n */\nexport interface AgentChatStreamResult extends AgentChatStreamDonePayload {\n assistantText: string;\n reasoningText: string;\n}\n\nexport interface AgentChatStreamHandlers {\n /** Every parsed SSE object (including `ping`, `node:*`, etc.). */\n onEvent?: (event: AgentStreamEvent) => void;\n onAgentInfo?: (info: AgentStreamAgentInfoEvent) => void;\n onToken?: (token: string, ctx: { nodeId: string }) => void;\n onReasoningToken?: (token: string, ctx: { nodeId: string }) => void;\n onToolCall?: (ctx: {\n nodeId: string;\n toolName: string;\n args: unknown;\n }) => void;\n onToolArgsUpdate?: (ctx: {\n nodeId: string;\n args: Record<string, unknown>;\n }) => void;\n onToolResult?: (ctx: {\n nodeId: string;\n toolName: string;\n durationMs: number;\n result?: string;\n }) => void;\n onNodeStart?: (ctx: {\n nodeId: string;\n nodeType: string;\n label: string;\n }) => void;\n onNodeComplete?: (ctx: {\n nodeId: string;\n output: unknown;\n durationMs: number;\n }) => void;\n onNodeError?: (ctx: { nodeId: string; error: string }) => void;\n /** Backend heartbeat — safe to ignore in UI. */\n onPing?: () => void;\n /** Fired when the server emits `done` (before {@link onComplete}). */\n onDone?: (payload: AgentChatStreamDonePayload) => void;\n /**\n * Always called on successful completion (after `done`). Not called if the stream\n * errors or ends without `done`.\n */\n onComplete?: (result: AgentChatStreamResult) => void;\n onError?: (error: unknown) => void;\n}\n\nexport interface RunAgentChatStreamOptions {\n /**\n * Abort while consuming events (in addition to any `signal` on the HTTP request).\n * Stops reading and throws {@link RagableAbortError}.\n */\n signal?: AbortSignal;\n}\n\nfunction assertAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new RagableAbortError();\n }\n}\n\nfunction asString(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction asNumber(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction asUnknownArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\n/** Narrow `done` events from a loose {@link AgentStreamEvent}. */\nexport function parseAgentStreamDone(\n e: AgentStreamEvent,\n): AgentChatStreamDonePayload | null {\n if (e.type !== \"done\") return null;\n return {\n response: asString(e[\"response\"]),\n traces: asUnknownArray(e[\"traces\"]),\n totalDurationMs: asNumber(e[\"totalDurationMs\"]),\n ...(e[\"httpResponse\"] !== undefined\n ? { httpResponse: e[\"httpResponse\"] }\n : {}),\n ...(typeof e[\"inputTokens\"] === \"number\"\n ? { inputTokens: e[\"inputTokens\"] }\n : {}),\n ...(typeof e[\"outputTokens\"] === \"number\"\n ? { outputTokens: e[\"outputTokens\"] }\n : {}),\n ...(typeof e[\"cachedPromptTokens\"] === \"number\"\n ? { cachedPromptTokens: e[\"cachedPromptTokens\"] }\n : {}),\n ...(typeof e[\"cacheCreationInputTokens\"] === \"number\"\n ? { cacheCreationInputTokens: e[\"cacheCreationInputTokens\"] }\n : {}),\n ...(Array.isArray(e[\"completionProviders\"])\n ? {\n completionProviders: e[\"completionProviders\"].map((x) => String(x)),\n }\n : {}),\n ...(typeof e[\"creditsCharged\"] === \"number\"\n ? { creditsCharged: e[\"creditsCharged\"] }\n : {}),\n ...(typeof e[\"agentSteps\"] === \"number\"\n ? { agentSteps: e[\"agentSteps\"] }\n : {}),\n ...(e[\"finishReason\"] !== undefined\n ? { finishReason: e[\"finishReason\"] as string | null }\n : {}),\n ...(e[\"stopReason\"] !== undefined\n ? { stopReason: e[\"stopReason\"] as string | null }\n : {}),\n ...(e[\"turnMessages\"] !== undefined\n ? { turnMessages: e[\"turnMessages\"] }\n : {}),\n ...(typeof e[\"promptTokensEstimated\"] === \"number\"\n ? { promptTokensEstimated: e[\"promptTokensEstimated\"] }\n : {}),\n ...(typeof e[\"contextWindow\"] === \"number\"\n ? { contextWindow: e[\"contextWindow\"] }\n : {}),\n };\n}\n\n/** @public Parse the initial `agent:info` SSE frame (website project agents). */\nexport function parseAgentStreamAgentInfo(\n e: AgentStreamEvent,\n): AgentStreamAgentInfoEvent | null {\n if (e.type !== \"agent:info\") return null;\n return {\n type: \"agent:info\",\n name: asString(e[\"name\"]),\n agent_name: asString(e[\"agent_name\"]),\n };\n}\n\nfunction parseAgentInfo(\n e: AgentStreamEvent,\n): AgentStreamAgentInfoEvent | null {\n return parseAgentStreamAgentInfo(e);\n}\n\n/**\n * Consume a Ragable agent SSE stream with callbacks and return the final result.\n *\n * For the same segment model as dashboard `AgentChat` (`streamingSegments` /\n * `streamingContent`), use {@link runAgentChatStreamForUi} or\n * `client.agents.runChatUiByName` instead.\n *\n * Typical low-level chat (string accumulation only):\n *\n * ```ts\n * const result = await client.agents.runChatStreamByName(\"support\", {\n * message: input,\n * history,\n * signal: ac.signal,\n * }, {\n * onToken: (t) => setReply((s) => s + t),\n * });\n * ```\n *\n * Lower-level (same client, manual iterator):\n *\n * ```ts\n * const result = await runAgentChatStream(\n * client.agents.chatStreamByName(\"support\", { message, signal }),\n * { onToken: (t) => append(t) },\n * { signal },\n * );\n * ```\n */\nexport async function runAgentChatStream(\n source: AsyncIterable<AgentStreamEvent>,\n handlers: AgentChatStreamHandlers = {},\n options: RunAgentChatStreamOptions = {},\n): Promise<AgentChatStreamResult> {\n const { signal } = options;\n let assistantText = \"\";\n let reasoningText = \"\";\n let donePayload: AgentChatStreamDonePayload | null = null;\n\n try {\n for await (const event of source) {\n assertAborted(signal);\n handlers.onEvent?.(event);\n\n const info = parseAgentInfo(event);\n if (info) {\n handlers.onAgentInfo?.(info);\n continue;\n }\n\n switch (event.type) {\n case \"ping\":\n handlers.onPing?.();\n break;\n case \"token\": {\n const nodeId = asString(event[\"nodeId\"], \"__self__\");\n const token = asString(event[\"token\"]);\n assistantText += token;\n handlers.onToken?.(token, { nodeId });\n break;\n }\n case \"reasoning_token\": {\n const nodeId = asString(event[\"nodeId\"], \"__self__\");\n const token = asString(event[\"token\"]);\n reasoningText += token;\n handlers.onReasoningToken?.(token, { nodeId });\n break;\n }\n case \"tool:call\":\n handlers.onToolCall?.({\n nodeId: asString(event[\"nodeId\"]),\n toolName: asString(event[\"toolName\"]),\n args: event[\"args\"],\n });\n break;\n case \"tool:args_update\": {\n const raw = event[\"args\"];\n const args =\n raw !== null && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n handlers.onToolArgsUpdate?.({\n nodeId: asString(event[\"nodeId\"]),\n args,\n });\n break;\n }\n case \"tool:result\":\n handlers.onToolResult?.({\n nodeId: asString(event[\"nodeId\"]),\n toolName: asString(event[\"toolName\"]),\n durationMs: asNumber(event[\"durationMs\"]),\n ...(typeof event[\"result\"] === \"string\"\n ? { result: event[\"result\"] }\n : {}),\n });\n break;\n case \"node:start\":\n handlers.onNodeStart?.({\n nodeId: asString(event[\"nodeId\"]),\n nodeType: asString(event[\"nodeType\"]),\n label: asString(event[\"label\"]),\n });\n break;\n case \"node:complete\":\n handlers.onNodeComplete?.({\n nodeId: asString(event[\"nodeId\"]),\n output: event[\"output\"],\n durationMs: asNumber(event[\"durationMs\"]),\n });\n break;\n case \"node:error\":\n handlers.onNodeError?.({\n nodeId: asString(event[\"nodeId\"]),\n error: asString(event[\"error\"]),\n });\n break;\n case \"done\": {\n const parsed = parseAgentStreamDone(event);\n if (parsed) {\n donePayload = parsed;\n handlers.onDone?.(parsed);\n }\n break;\n }\n default:\n break;\n }\n }\n } catch (err) {\n handlers.onError?.(err);\n throw err;\n }\n\n if (!donePayload) {\n const err = new RagableError(\n \"Agent stream ended without a done event\",\n 502,\n { code: \"SDK_AGENT_STREAM_INCOMPLETE\" },\n );\n handlers.onError?.(err);\n throw err;\n }\n\n const result: AgentChatStreamResult = {\n ...donePayload,\n assistantText,\n reasoningText,\n };\n handlers.onComplete?.(result);\n return result;\n}\n\n/**\n * Like {@link runAgentChatStream} but resolves with `null` if the stream ends without `done`\n * instead of throwing. Errors other than incomplete stream are still thrown.\n */\nexport async function runAgentChatStreamLenient(\n source: AsyncIterable<AgentStreamEvent>,\n handlers: AgentChatStreamHandlers = {},\n options: RunAgentChatStreamOptions = {},\n): Promise<AgentChatStreamResult | null> {\n try {\n return await runAgentChatStream(source, handlers, options);\n } catch (e) {\n if (\n e instanceof RagableError &&\n e.code === \"SDK_AGENT_STREAM_INCOMPLETE\"\n ) {\n return null;\n }\n throw e;\n }\n}\n\n/** True when {@link runAgentChatStream} stopped because no `done` event arrived. */\nexport function isIncompleteAgentStreamError(e: unknown): boolean {\n return e instanceof RagableError && e.code === \"SDK_AGENT_STREAM_INCOMPLETE\";\n}\n","/**\n * UI-oriented agent streaming — folds wire events into the same segment model as\n * `app/web/src/components/AgentChat.tsx` (`StreamSegment`), matching the reducers in\n * `useEngineIDEAgent` / `useIDEAgent` (tool gating, coalesced text/reasoning, etc.).\n */\n\nimport type { AgentStreamEvent } from \"./agents\";\nimport type {\n AgentChatStreamDonePayload,\n AgentStreamAgentInfoEvent,\n RunAgentChatStreamOptions,\n} from \"./agent-stream\";\nimport {\n parseAgentStreamAgentInfo,\n parseAgentStreamDone,\n} from \"./agent-stream\";\nimport { RagableAbortError, RagableError } from \"./request-client\";\n\n/**\n * Chat UI segments — structural parity with `StreamSegment` in dashboard `AgentChat`.\n */\nexport type AgentChatUiSegment =\n | { type: \"text\"; content: string }\n | { type: \"reasoning\"; content: string }\n | {\n type: \"tool\";\n id: string;\n toolName: string;\n status: \"started\" | \"completed\";\n durationMs?: number;\n args?: Record<string, unknown>;\n result?: string;\n }\n | {\n type: \"context_summarized\";\n step: number;\n mode?: \"llm\" | \"heuristic\" | \"llm+heuristic\" | \"aggressive\";\n reason?: \"soft_limit\" | \"forced\";\n tokensRemovedEstimate?: number;\n estimatedTokensAfter?: number;\n }\n | {\n type: \"llm_step\";\n step: number;\n inputTokens: number;\n outputTokens: number;\n cachedPromptTokens?: number;\n cacheCreationInputTokens?: number;\n creditsEstimated: number;\n apiCostUsd?: number;\n provider?: string;\n }\n | { type: \"stop_reason\"; content: string; finishReason: string };\n\n/** Assistant row to append to chat history (add your own `id`). */\nexport interface AgentChatUiAssistantMessage {\n role: \"ai\";\n content: string;\n segments?: AgentChatUiSegment[];\n usage?: {\n inputTokens: number;\n outputTokens: number;\n creditsCharged: number;\n cachedPromptTokens?: number;\n cacheCreationInputTokens?: number;\n };\n durationMs?: number;\n finishReason?: string | null;\n completionProviders?: string[];\n agentSteps?: number;\n}\n\nexport interface AgentChatUiStreamResult {\n /** Segments immediately before `done` (no trailing `stop_reason`). */\n segmentsMidTurn: AgentChatUiSegment[];\n /** Final segments including optional `stop_reason` from `done`. */\n segments: AgentChatUiSegment[];\n /** Persisted assistant message — matches dashboard `ChatMessageData` for `ai` (except `id`). */\n message: AgentChatUiAssistantMessage;\n done: AgentChatStreamDonePayload;\n}\n\nexport interface AgentChatStreamUiHandlers {\n /**\n * Live segment list — pass to `AgentChat` as `streamingSegments` (or your own renderer).\n */\n onSegments?: (segments: AgentChatUiSegment[]) => void;\n /**\n * Plain assistant text — mirrors dashboard `streamingContent` (text channel only).\n */\n onStreamingText?: (text: string) => void;\n onAgentInfo?: (info: AgentStreamAgentInfoEvent) => void;\n onEvent?: (event: AgentStreamEvent) => void;\n onDone?: (payload: AgentChatStreamDonePayload) => void;\n onComplete?: (result: AgentChatUiStreamResult) => void;\n onError?: (error: unknown) => void;\n}\n\nfunction asString(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction asNumber(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction assertAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new RagableAbortError();\n }\n}\n\nfunction recordFromUnknown(v: unknown): Record<string, unknown> {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n return { ...(v as Record<string, unknown>) };\n }\n return {};\n}\n\nfunction lastToolBlocksStream(\n last: AgentChatUiSegment | undefined,\n): boolean {\n return last?.type === \"tool\" && last.status === \"started\";\n}\n\nfunction toolSegmentId(event: AgentStreamEvent): string {\n const nid = event[\"nodeId\"];\n if (typeof nid === \"string\" && nid.length > 0) return nid;\n const tn = event[\"toolName\"];\n if (typeof tn === \"string\" && tn.length > 0) return tn;\n return \"__tool__\";\n}\n\nfunction normalizeContextSummarizedMode(\n m: unknown,\n): \"llm\" | \"heuristic\" | \"llm+heuristic\" | \"aggressive\" | undefined {\n if (\n m === \"llm\" ||\n m === \"heuristic\" ||\n m === \"llm+heuristic\" ||\n m === \"aggressive\"\n ) {\n return m;\n }\n return undefined;\n}\n\nfunction normalizeContextSummarizedReason(\n r: unknown,\n): \"soft_limit\" | \"forced\" | undefined {\n if (r === \"soft_limit\" || r === \"forced\") return r;\n return undefined;\n}\n\nfunction foldContextSummarized(\n prev: AgentChatUiSegment[],\n event: AgentStreamEvent,\n): AgentChatUiSegment[] {\n const step = asNumber(event[\"step\"], 0);\n const mode = normalizeContextSummarizedMode(event[\"mode\"]);\n const reason = normalizeContextSummarizedReason(event[\"reason\"]);\n const tro = event[\"tokensRemovedEstimate\"];\n const eta = event[\"estimatedTokensAfter\"];\n return [\n ...prev,\n {\n type: \"context_summarized\",\n step,\n ...(mode ? { mode } : {}),\n ...(reason ? { reason } : {}),\n ...(typeof tro === \"number\" && tro > 0\n ? { tokensRemovedEstimate: tro }\n : {}),\n ...(typeof eta === \"number\" && eta > 0\n ? { estimatedTokensAfter: eta }\n : {}),\n },\n ];\n}\n\n/** Concatenate `text` segments (ignores reasoning/tools). */\nexport function collectAssistantTextFromUiSegments(\n segments: AgentChatUiSegment[],\n): string {\n return segments\n .filter((s): s is { type: \"text\"; content: string } => s.type === \"text\")\n .map((s) => s.content)\n .join(\"\");\n}\n\n/**\n * Pure fold: one SSE event → next segment list. Matches `useEngineIDEAgent` / `useIDEAgent`\n * behavior for token gating while a tool is in the `started` state.\n */\nexport function foldAgentStreamIntoUiSegments(\n prev: AgentChatUiSegment[],\n event: AgentStreamEvent,\n): AgentChatUiSegment[] {\n switch (event.type) {\n case \"token\": {\n const last = prev[prev.length - 1];\n if (lastToolBlocksStream(last)) return prev;\n const token = asString(event[\"token\"]);\n if (!token) return prev;\n if (last?.type === \"text\") {\n return [\n ...prev.slice(0, -1),\n { type: \"text\", content: last.content + token },\n ];\n }\n return [...prev, { type: \"text\", content: token }];\n }\n case \"reasoning_token\": {\n const last = prev[prev.length - 1];\n if (lastToolBlocksStream(last)) return prev;\n const token = asString(event[\"token\"]);\n if (!token) return prev;\n if (last?.type === \"reasoning\") {\n return [\n ...prev.slice(0, -1),\n { type: \"reasoning\", content: last.content + token },\n ];\n }\n return [...prev, { type: \"reasoning\", content: token }];\n }\n case \"tool:call\": {\n const id = toolSegmentId(event);\n const toolName = asString(event[\"toolName\"], \"tool\");\n const argsRaw = event[\"args\"];\n const args =\n argsRaw !== null &&\n typeof argsRaw === \"object\" &&\n !Array.isArray(argsRaw)\n ? (argsRaw as Record<string, unknown>)\n : undefined;\n return [\n ...prev,\n {\n type: \"tool\",\n id,\n toolName,\n status: \"started\",\n ...(args !== undefined ? { args } : {}),\n },\n ];\n }\n case \"tool:args_update\": {\n const nodeId = asString(event[\"nodeId\"]);\n const patch = recordFromUnknown(event[\"args\"]);\n return prev.map((seg) => {\n if (seg.type !== \"tool\" || seg.id !== nodeId) return seg;\n const merged = { ...recordFromUnknown(seg.args), ...patch };\n return {\n ...seg,\n args: merged,\n };\n });\n }\n case \"tool:result\": {\n const nodeId = asString(event[\"nodeId\"]);\n const toolName =\n asString(event[\"toolName\"]) || asString(event[\"nodeId\"]);\n const durationMs =\n typeof event[\"durationMs\"] === \"number\" ? event[\"durationMs\"] : undefined;\n const resultStr =\n typeof event[\"result\"] === \"string\" ? event[\"result\"] : undefined;\n\n let idx = -1;\n if (nodeId) {\n for (let i = prev.length - 1; i >= 0; i--) {\n const s = prev[i]!;\n if (\n s.type === \"tool\" &&\n s.status === \"started\" &&\n s.id === nodeId\n ) {\n idx = i;\n break;\n }\n }\n }\n if (idx < 0 && toolName) {\n for (let i = prev.length - 1; i >= 0; i--) {\n const s = prev[i]!;\n if (\n s.type === \"tool\" &&\n s.status === \"started\" &&\n s.toolName === toolName\n ) {\n idx = i;\n break;\n }\n }\n }\n if (idx < 0) return prev;\n const next = [...prev];\n const seg = next[idx]!;\n if (seg.type !== \"tool\") return prev;\n next[idx] = {\n ...seg,\n status: \"completed\",\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(resultStr !== undefined ? { result: resultStr } : {}),\n };\n return next;\n }\n case \"context_summarized\":\n return foldContextSummarized(prev, event);\n case \"llm_step\": {\n return [\n ...prev,\n {\n type: \"llm_step\",\n step: Number(event[\"step\"]),\n inputTokens: Number(event[\"inputTokens\"] ?? 0),\n outputTokens: Number(event[\"outputTokens\"] ?? 0),\n ...(typeof event[\"cachedPromptTokens\"] === \"number\"\n ? { cachedPromptTokens: event[\"cachedPromptTokens\"] }\n : {}),\n ...(typeof event[\"cacheCreationInputTokens\"] === \"number\"\n ? { cacheCreationInputTokens: event[\"cacheCreationInputTokens\"] }\n : {}),\n creditsEstimated: Number(event[\"creditsEstimated\"] ?? 0),\n ...(typeof event[\"apiCostUsd\"] === \"number\" &&\n Number.isFinite(event[\"apiCostUsd\"])\n ? { apiCostUsd: event[\"apiCostUsd\"] }\n : {}),\n ...(typeof event[\"provider\"] === \"string\" && event[\"provider\"]\n ? { provider: event[\"provider\"] }\n : {}),\n },\n ];\n }\n default:\n return prev;\n }\n}\n\n/**\n * Merge live segments with the terminal `done` payload (optional `stop_reason` segment),\n * and build the persisted assistant message — same shape as dashboard `ChatMessageData` for `ai`.\n */\nexport function finalizeAgentChatUiTurn(\n segments: AgentChatUiSegment[],\n done: AgentChatStreamDonePayload,\n): {\n segments: AgentChatUiSegment[];\n message: AgentChatUiAssistantMessage;\n} {\n let segs: AgentChatUiSegment[] | undefined =\n segments.length > 0 ? [...segments] : undefined;\n if (done.stopReason) {\n const stopSeg: AgentChatUiSegment = {\n type: \"stop_reason\",\n content: done.stopReason,\n finishReason: done.finishReason ?? \"error\",\n };\n segs = segs ? [...segs, stopSeg] : [stopSeg];\n }\n const fromText = segs\n ? collectAssistantTextFromUiSegments(segs)\n : \"\";\n const content =\n done.response ||\n fromText ||\n \"No response.\";\n\n const message: AgentChatUiAssistantMessage = {\n role: \"ai\",\n content,\n ...(segs && segs.length > 0 ? { segments: segs } : {}),\n finishReason: done.finishReason ?? null,\n ...(Array.isArray(done.completionProviders) &&\n done.completionProviders.length > 0\n ? { completionProviders: done.completionProviders }\n : {}),\n ...(typeof done.agentSteps === \"number\" &&\n Number.isFinite(done.agentSteps) &&\n done.agentSteps > 0\n ? { agentSteps: Math.floor(done.agentSteps) }\n : {}),\n usage: {\n inputTokens: done.inputTokens ?? 0,\n outputTokens: done.outputTokens ?? 0,\n creditsCharged: done.creditsCharged ?? 0,\n ...(typeof done.cachedPromptTokens === \"number\" &&\n done.cachedPromptTokens > 0\n ? { cachedPromptTokens: done.cachedPromptTokens }\n : {}),\n ...(typeof done.cacheCreationInputTokens === \"number\" &&\n done.cacheCreationInputTokens > 0\n ? { cacheCreationInputTokens: done.cacheCreationInputTokens }\n : {}),\n },\n ...(typeof done.totalDurationMs === \"number\" && done.totalDurationMs > 0\n ? { durationMs: done.totalDurationMs }\n : {}),\n };\n\n return { segments: segs ?? [], message };\n}\n\n/**\n * Consume a stream and drive dashboard-style UI state: {@link AgentChatStreamUiHandlers.onSegments}\n * / {@link AgentChatStreamUiHandlers.onStreamingText} mirror `AgentChat`’s `streamingSegments` /\n * `streamingContent`; the returned {@link AgentChatUiStreamResult.message} is ready to append\n * to history like `useEngineIDEAgent` does on `done`.\n */\nexport async function runAgentChatStreamForUi(\n source: AsyncIterable<AgentStreamEvent>,\n handlers: AgentChatStreamUiHandlers = {},\n options: RunAgentChatStreamOptions = {},\n): Promise<AgentChatUiStreamResult> {\n const { signal } = options;\n let segments: AgentChatUiSegment[] = [];\n let donePayload: AgentChatStreamDonePayload | null = null;\n\n try {\n for await (const event of source) {\n assertAborted(signal);\n handlers.onEvent?.(event);\n\n const info = parseAgentStreamAgentInfo(event);\n if (info) {\n handlers.onAgentInfo?.(info);\n continue;\n }\n\n if (event.type === \"ping\") continue;\n\n if (event.type === \"done\") {\n const parsed = parseAgentStreamDone(event);\n if (parsed) {\n donePayload = parsed;\n handlers.onDone?.(parsed);\n }\n break;\n }\n\n const next = foldAgentStreamIntoUiSegments(segments, event);\n if (next !== segments) {\n segments = next;\n handlers.onSegments?.(segments);\n if (event.type === \"token\") {\n handlers.onStreamingText?.(\n collectAssistantTextFromUiSegments(segments),\n );\n }\n }\n }\n } catch (err) {\n handlers.onError?.(err);\n throw err;\n }\n\n if (!donePayload) {\n const err = new RagableError(\n \"Agent stream ended without a done event\",\n 502,\n { code: \"SDK_AGENT_STREAM_INCOMPLETE\" },\n );\n handlers.onError?.(err);\n throw err;\n }\n\n const segmentsMidTurn = [...segments];\n const { segments: finalSegs, message } = finalizeAgentChatUiTurn(\n segments,\n donePayload,\n );\n\n const result: AgentChatUiStreamResult = {\n segmentsMidTurn,\n segments: finalSegs,\n message,\n done: donePayload,\n };\n handlers.onComplete?.(result);\n return result;\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 type {\n AgentChatStreamUiHandlers,\n AgentChatUiStreamResult,\n} from \"./agent-chat-ui\";\nimport { runAgentChatStreamForUi } from \"./agent-chat-ui\";\nimport { runAgentChatStream } from \"./agent-stream\";\nimport type { AgentChatStreamHandlers, AgentChatStreamResult } from \"./agent-stream\";\nimport {\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 /** Passed to `fetch` — aborts the HTTP request and SSE body. */\n signal?: AbortSignal;\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 ...(params.signal !== undefined ? { signal: params.signal } : {}),\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 /**\n * Stream an agent turn with callbacks; returns the final `done` payload plus streamed text.\n * Prefer this over manual iteration when building chat UIs against the server API key client.\n */\n async runChatStream(\n agentId: string,\n params: AgentChatParams,\n handlers: AgentChatStreamHandlers = {},\n ): Promise<AgentChatStreamResult> {\n return runAgentChatStream(this.chatStream(agentId, params), handlers, {\n signal: params.signal,\n });\n }\n\n /**\n * Stream with dashboard-style `AgentChat` ergonomics: {@link AgentChatStreamUiHandlers.onSegments}\n * / `onStreamingText` for live UI; returns a persisted-shaped assistant message on `done`.\n */\n async runChatUi(\n agentId: string,\n params: AgentChatParams,\n handlers: AgentChatStreamUiHandlers = {},\n ): Promise<AgentChatUiStreamResult> {\n return runAgentChatStreamForUi(this.chatStream(agentId, params), handlers, {\n signal: params.signal,\n });\n }\n}\n","import {\r\n bindFetch,\r\n RagableAbortError,\r\n RagableError,\r\n RagableNetworkError,\r\n RagableTimeoutError,\r\n extractErrorMessage,\r\n} from \"./request-client\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type HttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\" | \"HEAD\";\r\n\r\nexport interface RetryOptions {\r\n maxRetries: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n retryOn: number[];\r\n respectRetryAfter: boolean;\r\n}\r\n\r\nexport interface TransportOptions {\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n retry?: Partial<RetryOptions>;\r\n timeoutMs?: number;\r\n onRequest?: (req: TransportRequest) => void;\r\n onResponse?: (req: TransportRequest, res: Response, durationMs: number) => void;\r\n onRetry?: (req: TransportRequest, attempt: number, delayMs: number, reason: string) => void;\r\n}\r\n\r\nexport interface TransportRequest {\r\n url: string;\r\n method: HttpMethod;\r\n headers: Headers;\r\n body?: BodyInit;\r\n signal?: AbortSignal;\r\n idempotencyKey?: string;\r\n retry?: Partial<RetryOptions>;\r\n timeoutMs?: number;\r\n}\r\n\r\n// ─── Defaults ────────────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_RETRY: RetryOptions = {\r\n maxRetries: 3,\r\n baseDelayMs: 200,\r\n maxDelayMs: 5_000,\r\n retryOn: [408, 425, 429, 502, 503, 504],\r\n respectRetryAfter: true,\r\n};\r\n\r\nconst DEFAULT_TIMEOUT_MS = 30_000;\r\n\r\n// ─── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nfunction jitteredDelay(base: number, attempt: number, max: number): number {\r\n const exp = Math.min(base * 2 ** attempt, max);\r\n return Math.round(exp * (0.5 + Math.random() * 0.5));\r\n}\r\n\r\nfunction parseRetryAfter(header: string | null): number | null {\r\n if (!header) return null;\r\n const seconds = Number(header);\r\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\r\n const date = Date.parse(header);\r\n if (Number.isFinite(date)) return Math.max(0, date - Date.now());\r\n return null;\r\n}\r\n\r\nlet _uuidCounter = 0;\r\nexport function generateIdempotencyKey(): string {\r\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n _uuidCounter++;\r\n return `idk-${Date.now()}-${_uuidCounter}-${Math.random().toString(36).slice(2, 10)}`;\r\n}\r\n\r\nfunction requestCacheKey(req: TransportRequest): string {\r\n return `${req.method}:${req.url}`;\r\n}\r\n\r\n// ─── Transport ───────────────────────────────────────────────────────────────\r\n\r\nexport class Transport {\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultHeaders: HeadersInit | undefined;\r\n private readonly defaultRetry: RetryOptions;\r\n private readonly defaultTimeoutMs: number;\r\n private readonly onRequest?: TransportOptions[\"onRequest\"];\r\n private readonly onResponse?: TransportOptions[\"onResponse\"];\r\n private readonly onRetry?: TransportOptions[\"onRetry\"];\r\n\r\n private readonly inflightGets = new Map<string, Promise<Response>>();\r\n\r\n private _refreshHandler: (() => Promise<string | null>) | null = null;\r\n\r\n constructor(options: TransportOptions = {}) {\r\n this.fetchImpl = bindFetch(options.fetch);\r\n this.defaultHeaders = options.headers;\r\n this.defaultRetry = { ...DEFAULT_RETRY, ...options.retry };\r\n this.defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\r\n this.onRequest = options.onRequest;\r\n this.onResponse = options.onResponse;\r\n this.onRetry = options.onRetry;\r\n }\r\n\r\n setRefreshHandler(handler: (() => Promise<string | null>) | null): void {\r\n this._refreshHandler = handler;\r\n }\r\n\r\n async execute(req: TransportRequest): Promise<Response> {\r\n if (req.method === \"GET\") {\r\n const key = requestCacheKey(req);\r\n const existing = this.inflightGets.get(key);\r\n if (existing) return existing;\r\n const promise = this._executeWithRetry(req).finally(() => {\r\n this.inflightGets.delete(key);\r\n });\r\n this.inflightGets.set(key, promise);\r\n return promise;\r\n }\r\n return this._executeWithRetry(req);\r\n }\r\n\r\n private async _executeWithRetry(req: TransportRequest): Promise<Response> {\r\n const retryOpts: RetryOptions = {\r\n ...this.defaultRetry,\r\n ...req.retry,\r\n };\r\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\r\n\r\n const headers = new Headers(this.defaultHeaders);\r\n req.headers.forEach((v, k) => headers.set(k, v));\r\n if (req.idempotencyKey) {\r\n headers.set(\"Idempotency-Key\", req.idempotencyKey);\r\n }\r\n\r\n const finalReq: TransportRequest = { ...req, headers };\r\n\r\n this.onRequest?.(finalReq);\r\n\r\n let lastError: unknown;\r\n const maxAttempts = 1 + retryOpts.maxRetries;\r\n let did401Refresh = false;\r\n\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n const response = await this._singleFetch(finalReq, timeoutMs);\r\n\r\n if (response.status === 401 && this._refreshHandler && !did401Refresh) {\r\n did401Refresh = true;\r\n const newToken = await this._refreshHandler();\r\n if (newToken) {\r\n finalReq.headers.set(\"Authorization\", `Bearer ${newToken}`);\r\n attempt--;\r\n continue;\r\n }\r\n }\r\n\r\n if (!response.ok && retryOpts.retryOn.includes(response.status) && attempt < maxAttempts - 1) {\r\n let delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\r\n if (retryOpts.respectRetryAfter) {\r\n const ra = parseRetryAfter(response.headers.get(\"retry-after\"));\r\n if (ra !== null) delayMs = Math.min(ra, retryOpts.maxDelayMs);\r\n }\r\n this.onRetry?.(finalReq, attempt + 1, delayMs, `HTTP ${response.status}`);\r\n await sleep(delayMs);\r\n continue;\r\n }\r\n\r\n return response;\r\n } catch (e) {\r\n if (e instanceof RagableAbortError || e instanceof RagableTimeoutError) {\r\n throw e;\r\n }\r\n lastError = e;\r\n if (attempt < maxAttempts - 1) {\r\n const delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\r\n this.onRetry?.(finalReq, attempt + 1, delayMs, (e as Error).message);\r\n await sleep(delayMs);\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n throw lastError instanceof RagableNetworkError\r\n ? lastError\r\n : new RagableNetworkError(\r\n (lastError as Error)?.message ?? \"Network request failed\",\r\n lastError,\r\n );\r\n }\r\n\r\n private async _singleFetch(req: TransportRequest, timeoutMs: number): Promise<Response> {\r\n const controller = new AbortController();\r\n const signals: AbortSignal[] = [controller.signal];\r\n if (req.signal) signals.push(req.signal);\r\n\r\n const combinedSignal = signals.length === 1\r\n ? controller.signal\r\n : AbortSignal.any\r\n ? AbortSignal.any(signals)\r\n : controller.signal;\r\n\r\n if (req.signal?.aborted) {\r\n throw new RagableAbortError();\r\n }\r\n\r\n const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n const externalAbortHandler = req.signal\r\n ? () => controller.abort()\r\n : null;\r\n if (externalAbortHandler && req.signal) {\r\n req.signal.addEventListener(\"abort\", externalAbortHandler, { once: true });\r\n }\r\n\r\n const start = Date.now();\r\n try {\r\n const response = await this.fetchImpl(req.url, {\r\n method: req.method,\r\n headers: req.headers,\r\n body: req.body,\r\n signal: combinedSignal,\r\n });\r\n this.onResponse?.(req, response, Date.now() - start);\r\n return response;\r\n } catch (e) {\r\n if ((e as Error).name === \"AbortError\") {\r\n if (req.signal?.aborted) throw new RagableAbortError();\r\n throw new RagableTimeoutError(timeoutMs);\r\n }\r\n throw new RagableNetworkError((e as Error).message, e);\r\n } finally {\r\n clearTimeout(timer);\r\n if (externalAbortHandler && req.signal) {\r\n req.signal.removeEventListener(\"abort\", externalAbortHandler);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport async function parseTransportResponse<T>(response: Response): Promise<T> {\r\n if (response.status === 204) return null as T;\r\n const text = await response.text();\r\n if (!text) return null as T;\r\n let payload: unknown;\r\n try {\r\n payload = JSON.parse(text);\r\n } catch {\r\n if (!response.ok) {\r\n throw new RagableError(text.slice(0, 200), response.status, null);\r\n }\r\n return text as T;\r\n }\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n}\r\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\n/** Discriminated result for easier TypeScript narrowing than `{ data, error }` after destructuring. */\nexport type RagableResult<T, E = RagableError> =\n | { ok: true; value: T }\n | { ok: false; error: E };\n\nexport function toRagableResult<T>(r: PostgrestResult<T>): RagableResult<T> {\n if (r.error) return { ok: false, error: r.error };\n return { ok: true, value: r.data };\n}\n\n/**\n * Narrows a {@link PostgrestResult} after an `if (result.error)` guard.\n * Prefer checking `result.error` on the result object (not destructured `{ data, error }`)\n * so TypeScript narrows `data` automatically; use this when you need a throw or assertion.\n */\nexport function assertPostgrestSuccess<T>(\n r: PostgrestResult<T>,\n): asserts r is { data: T; error: null } {\n if (r.error) throw r.error;\n}\n\n/** Returns `data` or throws `RagableError` / the failure case. */\nexport function unwrapPostgrest<T>(r: PostgrestResult<T>): T {\n if (r.error) throw r.error;\n return r.data;\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\n/**\n * Chainable SELECT (PostgREST / Supabase-style). Filters and modifiers apply to the **base**\n * table of the query (the table passed to `client.from(...)`); the `select` string controls columns\n * and **resource embedding** (joins).\n *\n * **Joins** use the same embedded `select` syntax as\n * [Supabase `.select()`](https://supabase.com/docs/reference/javascript/select) / PostgREST, for example:\n * - `*,related_table(*)` — include related rows\n * - `related_table!inner(*)` — inner-style embed\n * - `related_table!fkey_column_or_constraint(*)` — disambiguate when multiple FKs exist\n * - `alias:related_table(*)` — rename the JSON key for the nested object/array\n *\n * **Ragable limits** (server-side): only **one level** of embedding is supported — no nested\n * `relation(nested(...))`. Prefer embed aliases above; top-level column rename forms like\n * `alias:column` may not be accepted for scalar columns.\n *\n * **API note:** Supabase’s second `select(columns, options?)` argument (`count`, `head`, etc.) is\n * not supported in Ragable yet; joins use the **first** argument only.\n *\n * For nested result shapes, pass a type argument on {@link PostgrestTableApi.select}:\n * `from('orders').select<OrderWithLines>(\\`*, lines (*)\\`)`.\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 /**\n * Start a SELECT. Pass a PostgREST `select` string; use embedded resources for joins — see\n * {@link PostgrestSelectBuilder}.\n *\n * @param columns Column list and optional embeds (default `\"*\"`). Omitted or `\"*\"` means all base columns.\n * @typeParam RowResult Row shape returned by the query; defaults to this table’s `Row`. Override when using joins.\n */\n select<\n RowResult extends Record<string, unknown> = TableRow<Database, TableName>,\n >(columns = \"*\"): PostgrestSelectBuilder<RowResult, Database, TableName> {\n return new PostgrestSelectBuilder<RowResult, 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 {\r\n bindFetch,\r\n DEFAULT_RAGABLE_API_BASE,\r\n extractErrorMessage,\r\n RagableError,\r\n} from \"./request-client\";\r\nimport type {\r\n SessionStorage,\r\n} from \"./auth-storage\";\r\nimport {\r\n AuthBroadcastChannel,\r\n detectStorage,\r\n} from \"./auth-storage\";\r\nimport {\r\n asPostgrestResponse,\r\n type PostgrestResult,\r\n} from \"./browser-postgrest\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type AuthChangeEvent =\r\n | \"INITIAL_SESSION\"\r\n | \"SIGNED_IN\"\r\n | \"SIGNED_OUT\"\r\n | \"TOKEN_REFRESHED\"\r\n | \"USER_UPDATED\";\r\n\r\nexport type AuthUserMetadata = Record<string, unknown>;\r\n\r\nexport interface DefaultAuthUser<\r\n Metadata extends AuthUserMetadata = AuthUserMetadata,\r\n> {\r\n id: string;\r\n email: string;\r\n name: string | null;\r\n status: \"active\" | \"disabled\" | (string & {});\r\n metadata: Metadata;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n lastSignInAt?: string | null;\r\n}\r\n\r\nexport interface AuthSession<\r\n U extends object = DefaultAuthUser,\r\n> {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n expires_at: number;\r\n token_type: \"bearer\";\r\n user: U;\r\n}\r\n\r\nexport interface AuthOptions {\r\n persistSession?: boolean;\r\n autoRefreshToken?: boolean;\r\n storage?: SessionStorage;\r\n storageKey?: string;\r\n refreshSkewSeconds?: number;\r\n debug?: boolean;\r\n}\r\n\r\nexport interface RagableAuthConfig {\r\n authGroupId: string;\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n auth?: AuthOptions;\r\n}\r\n\r\nexport type AuthSignUpCredentials<\r\n Metadata extends AuthUserMetadata = AuthUserMetadata,\r\n> = {\r\n email: string;\r\n password: string;\r\n options?: {\r\n data?: Partial<Metadata> & {\r\n name?: string | null;\r\n };\r\n };\r\n};\r\n\r\nexport type AuthUpdateUserAttributes<\r\n Metadata extends AuthUserMetadata = AuthUserMetadata,\r\n> = {\r\n email?: string;\r\n password?: string;\r\n data?: Partial<Metadata> & {\r\n name?: string | null;\r\n };\r\n};\r\n\r\ntype MetadataForUser<U extends object> = U extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Metadata\r\n : AuthUserMetadata\r\n : AuthUserMetadata;\r\n\r\ntype AuthListener<U extends object> = (\r\n event: AuthChangeEvent,\r\n session: AuthSession<U> | null,\r\n) => void;\r\n\r\ninterface Subscription {\r\n id: string;\r\n unsubscribe: () => void;\r\n}\r\n\r\n// ─── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nfunction parseExpiresInSeconds(raw: string | number): number {\r\n if (typeof raw === \"number\") return raw;\r\n const s = raw.trim().toLowerCase();\r\n const m = /^(\\d+)([smhd])?$/.exec(s);\r\n if (m) {\r\n const n = Number(m[1]);\r\n const u = m[2] ?? \"s\";\r\n const mult =\r\n u === \"s\" ? 1 : u === \"m\" ? 60 : u === \"h\" ? 3600 : u === \"d\" ? 86400 : 1;\r\n return n * mult;\r\n }\r\n const asNum = Number(s);\r\n return Number.isFinite(asNum) ? asNum : 0;\r\n}\r\n\r\nasync function parseJsonOrThrow<T>(response: Response): Promise<T> {\r\n const text = await response.text();\r\n let payload: unknown;\r\n try {\r\n payload = text ? JSON.parse(text) : null;\r\n } catch {\r\n throw new RagableError(`Response parse error: ${text.slice(0, 200)}`, response.status, null);\r\n }\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n}\r\n\r\nlet _subCounter = 0;\r\n\r\n// ─── RagableAuth ─────────────────────────────────────────────────────────────\r\n\r\nexport class RagableAuth<\r\n U extends object = DefaultAuthUser,\r\n> {\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly baseUrl: string;\r\n private readonly authGroupId: string;\r\n private readonly defaultHeaders: HeadersInit | undefined;\r\n private readonly persistSession: boolean;\r\n private readonly autoRefreshToken: boolean;\r\n private readonly storage: SessionStorage;\r\n private readonly storageKey: string;\r\n private readonly refreshSkewSeconds: number;\r\n private readonly debug: boolean;\r\n\r\n private currentSession: AuthSession<U> | null = null;\r\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\r\n private refreshPromise: Promise<AuthSession<U> | null> | null = null;\r\n private listeners = new Map<string, AuthListener<U>>();\r\n private broadcast: AuthBroadcastChannel | null = null;\r\n private visibilityHandler: (() => void) | null = null;\r\n private initialized = false;\r\n\r\n constructor(config: RagableAuthConfig) {\r\n this.baseUrl = DEFAULT_RAGABLE_API_BASE.replace(/\\/+$/, \"\");\r\n this.authGroupId = config.authGroupId;\r\n this.fetchImpl = bindFetch(config.fetch);\r\n this.defaultHeaders = config.headers;\r\n\r\n const auth = config.auth ?? {};\r\n this.persistSession = auth.persistSession !== false;\r\n this.autoRefreshToken = auth.autoRefreshToken !== false;\r\n this.storage = auth.storage ?? detectStorage();\r\n this.storageKey = auth.storageKey ?? `ragable.session.${this.authGroupId}`;\r\n this.refreshSkewSeconds = auth.refreshSkewSeconds ?? 60;\r\n this.debug = auth.debug ?? false;\r\n\r\n this.broadcast = new AuthBroadcastChannel(`ragable-auth-${this.authGroupId}`);\r\n this.broadcast.onMessage((msg) => {\r\n if (msg.type === \"SESSION_UPDATED\") {\r\n try {\r\n const session = JSON.parse(msg.payload) as AuthSession<U>;\r\n this.currentSession = session;\r\n this.scheduleRefresh(session);\r\n this.emit(\"TOKEN_REFRESHED\", session);\r\n } catch { /* ignore bad data from other tab */ }\r\n } else if (msg.type === \"SESSION_REMOVED\") {\r\n this.currentSession = null;\r\n this.clearRefreshTimer();\r\n this.emit(\"SIGNED_OUT\", null);\r\n }\r\n });\r\n\r\n this.setupVisibilityListener();\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.debug) console.debug(\"[RagableAuth]\", ...args);\r\n }\r\n\r\n // ── Lifecycle ──────────────────────────────────────────────────────────────\r\n\r\n async initialize(): Promise<AuthSession<U> | null> {\r\n if (this.initialized) return this.currentSession;\r\n this.initialized = true;\r\n if (this.persistSession) {\r\n try {\r\n const raw = await this.storage.getItem(this.storageKey);\r\n if (raw) {\r\n const session = JSON.parse(raw) as AuthSession<U>;\r\n if (session.expires_at && session.expires_at > nowSeconds()) {\r\n this.currentSession = session;\r\n this.scheduleRefresh(session);\r\n this.log(\"Restored session from storage\");\r\n } else if (session.refresh_token) {\r\n this.log(\"Stored session expired, attempting refresh\");\r\n const refreshed = await this._doRefresh(session.refresh_token);\r\n if (refreshed) {\r\n this.currentSession = refreshed;\r\n } else {\r\n await this.storage.removeItem(this.storageKey);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n this.log(\"Failed to restore session\", e);\r\n }\r\n }\r\n this.emit(\"INITIAL_SESSION\", this.currentSession);\r\n return this.currentSession;\r\n }\r\n\r\n // ── Auth methods ───────────────────────────────────────────────────────────\r\n\r\n async signUp(\r\n credentials: AuthSignUpCredentials<MetadataForUser<U>>,\r\n ): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\r\n return asPostgrestResponse(async () => {\r\n const name =\r\n typeof credentials.options?.data?.name === \"string\"\r\n ? credentials.options.data.name\r\n : undefined;\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/register\", \"POST\", {\r\n email: credentials.email,\r\n password: credentials.password,\r\n ...(name !== undefined ? { name } : {}),\r\n ...(credentials.options?.data !== undefined\r\n ? { data: credentials.options.data }\r\n : {}),\r\n });\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return { user: session.user, session };\r\n });\r\n }\r\n\r\n async signInWithPassword(credentials: {\r\n email: string;\r\n password: string;\r\n }): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\r\n return asPostgrestResponse(async () => {\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/login\", \"POST\", {\r\n email: credentials.email,\r\n password: credentials.password,\r\n });\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return { user: session.user, session };\r\n });\r\n }\r\n\r\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{ error: null }> {\r\n this.currentSession = null;\r\n this.clearRefreshTimer();\r\n if (this.persistSession) {\r\n await this.storage.removeItem(this.storageKey);\r\n }\r\n this.broadcast?.postSessionRemoved();\r\n this.emit(\"SIGNED_OUT\", null);\r\n return { error: null };\r\n }\r\n\r\n async refreshSession(\r\n refreshToken?: string,\r\n ): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const token = refreshToken ?? this.currentSession?.refresh_token;\r\n if (!token) throw new RagableError(\"No refresh token available\", 401, null);\r\n const session = await this.singleFlightRefresh(token);\r\n if (!session) throw new RagableError(\"Refresh failed\", 401, null);\r\n return { session, user: session.user };\r\n });\r\n }\r\n\r\n async getSession(): Promise<PostgrestResult<{ session: AuthSession<U> | null }>> {\r\n if (!this.initialized) await this.initialize();\r\n return { data: { session: this.currentSession }, error: null };\r\n }\r\n\r\n async getUser(): Promise<PostgrestResult<{ user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\r\n });\r\n }\r\n\r\n async setSession(tokens: {\r\n access_token: string;\r\n refresh_token: string;\r\n }): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", tokens.access_token);\r\n const decoded = decodeJwtExpiry(tokens.access_token);\r\n const expiresIn = decoded ? decoded - nowSeconds() : 3600;\r\n const session: AuthSession<U> = {\r\n access_token: tokens.access_token,\r\n refresh_token: tokens.refresh_token,\r\n expires_in: expiresIn,\r\n expires_at: nowSeconds() + expiresIn,\r\n token_type: \"bearer\",\r\n user: me.user,\r\n };\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return { session, user: me.user };\r\n });\r\n }\r\n\r\n async updateUser(attributes: {\r\n email?: string;\r\n password?: string;\r\n data?: (Partial<MetadataForUser<U>> & { name?: string | null });\r\n }): Promise<PostgrestResult<{ user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, {\r\n ...(attributes.email !== undefined ? { email: attributes.email } : {}),\r\n ...(attributes.password !== undefined ? { password: attributes.password } : {}),\r\n ...(attributes.data !== undefined ? { data: attributes.data } : {}),\r\n ...(attributes.data?.name !== undefined ? { name: attributes.data.name } : {}),\r\n });\r\n if (this.currentSession) {\r\n this.currentSession = { ...this.currentSession, user: result.user };\r\n await this.persistCurrentSession();\r\n }\r\n this.emit(\"USER_UPDATED\", this.currentSession);\r\n return result;\r\n });\r\n }\r\n\r\n // ── Event subscription ─────────────────────────────────────────────────────\r\n\r\n onAuthStateChange(\r\n callback: AuthListener<U>,\r\n ): { data: { subscription: Subscription } } {\r\n _subCounter++;\r\n const id = `sub-${_subCounter}`;\r\n this.listeners.set(id, callback);\r\n const unsubscribe = () => {\r\n this.listeners.delete(id);\r\n };\r\n return { data: { subscription: { id, unsubscribe } } };\r\n }\r\n\r\n // ── Accessors ──────────────────────────────────────────────────────────────\r\n\r\n getAccessToken(): string | null {\r\n return this.currentSession?.access_token ?? null;\r\n }\r\n\r\n async getValidAccessToken(): Promise<string | null> {\r\n if (!this.initialized) await this.initialize();\r\n const session = this.currentSession;\r\n if (!session) return null;\r\n const secondsUntilExpiry = session.expires_at - nowSeconds();\r\n if (secondsUntilExpiry <= this.refreshSkewSeconds) {\r\n const refreshed = await this.singleFlightRefresh(session.refresh_token);\r\n return refreshed?.access_token ?? null;\r\n }\r\n return session.access_token;\r\n }\r\n\r\n getCurrentSession(): AuthSession<U> | null {\r\n return this.currentSession;\r\n }\r\n\r\n // ── Back-compat: raw Ragable auth methods ──────────────────────────────────\r\n\r\n async register(body: {\r\n email: string;\r\n password: string;\r\n name?: string;\r\n data?: Partial<MetadataForUser<U>> & { name?: string | null };\r\n }): Promise<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }> {\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/register\", \"POST\", body);\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return raw;\r\n }\r\n\r\n async login(body: {\r\n email: string;\r\n password: string;\r\n }): Promise<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }> {\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/login\", \"POST\", body);\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return raw;\r\n }\r\n\r\n async refresh(body: { refreshToken: string }): Promise<{\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }> {\r\n return this.fetchAuth(\"/refresh\", \"POST\", body);\r\n }\r\n\r\n async getMe(): Promise<{ user: U }> {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\r\n }\r\n\r\n async updateMe(body: {\r\n email?: string;\r\n name?: string | null;\r\n password?: string;\r\n data?: Partial<MetadataForUser<U>> & { name?: string | null };\r\n }): Promise<{ user: U }> {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, body);\r\n if (this.currentSession) {\r\n this.currentSession = { ...this.currentSession, user: result.user };\r\n await this.persistCurrentSession();\r\n }\r\n this.emit(\"USER_UPDATED\", this.currentSession);\r\n return result;\r\n }\r\n\r\n // ── Cleanup ────────────────────────────────────────────────────────────────\r\n\r\n destroy(): void {\r\n this.clearRefreshTimer();\r\n this.broadcast?.close();\r\n this.listeners.clear();\r\n if (this.visibilityHandler && typeof document !== \"undefined\") {\r\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n }\r\n\r\n // ─── Internal ──────────────────────────────────────────────────────────────\r\n\r\n private authPrefix(): string {\r\n return `/auth-groups/${this.authGroupId}/auth`;\r\n }\r\n\r\n private toUrl(path: string): string {\r\n return `${this.baseUrl}${this.authPrefix()}${path}`;\r\n }\r\n\r\n private baseHeaders(json: boolean): Headers {\r\n const h = new Headers(this.defaultHeaders);\r\n if (json) h.set(\"Content-Type\", \"application/json\");\r\n return h;\r\n }\r\n\r\n private async fetchAuth<T>(\r\n path: string,\r\n method: \"GET\" | \"POST\" | \"PATCH\",\r\n body?: unknown,\r\n ): Promise<T> {\r\n const headers = this.baseHeaders(body !== undefined);\r\n const response = await this.fetchImpl(this.toUrl(path), {\r\n method,\r\n headers,\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n });\r\n return parseJsonOrThrow<T>(response);\r\n }\r\n\r\n private async fetchAuthWithBearer<T>(\r\n path: string,\r\n method: \"GET\" | \"POST\" | \"PATCH\",\r\n token: string,\r\n body?: unknown,\r\n ): Promise<T> {\r\n const headers = this.baseHeaders(body !== undefined);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n const response = await this.fetchImpl(this.toUrl(path), {\r\n method,\r\n headers,\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n });\r\n return parseJsonOrThrow<T>(response);\r\n }\r\n\r\n private rawToSession(raw: {\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }): AuthSession<U> {\r\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\r\n return {\r\n access_token: raw.accessToken,\r\n refresh_token: raw.refreshToken,\r\n expires_in: expiresIn,\r\n expires_at: nowSeconds() + expiresIn,\r\n token_type: \"bearer\",\r\n user: raw.user,\r\n };\r\n }\r\n\r\n private async setSessionInternal(\r\n session: AuthSession<U>,\r\n event: AuthChangeEvent,\r\n ): Promise<void> {\r\n this.currentSession = session;\r\n await this.persistCurrentSession();\r\n this.broadcast?.postSessionUpdated(JSON.stringify(session));\r\n this.scheduleRefresh(session);\r\n this.emit(event, session);\r\n }\r\n\r\n private async persistCurrentSession(): Promise<void> {\r\n if (!this.persistSession || !this.currentSession) return;\r\n try {\r\n await this.storage.setItem(this.storageKey, JSON.stringify(this.currentSession));\r\n } catch (e) {\r\n this.log(\"Failed to persist session\", e);\r\n }\r\n }\r\n\r\n private emit(event: AuthChangeEvent, session: AuthSession<U> | null): void {\r\n this.log(event, session?.user);\r\n for (const cb of this.listeners.values()) {\r\n try {\r\n cb(event, session);\r\n } catch (e) {\r\n this.log(\"Listener threw\", e);\r\n }\r\n }\r\n }\r\n\r\n // ─── Refresh scheduling ────────────────────────────────────────────────────\r\n\r\n private scheduleRefresh(session: AuthSession<U>): void {\r\n this.clearRefreshTimer();\r\n if (!this.autoRefreshToken) return;\r\n const secondsUntilExpiry = session.expires_at - nowSeconds();\r\n const refreshIn = Math.max(0, secondsUntilExpiry - this.refreshSkewSeconds);\r\n this.log(`Scheduling refresh in ${refreshIn}s`);\r\n this.refreshTimer = setTimeout(() => {\r\n this.singleFlightRefresh(session.refresh_token).catch((e) => {\r\n this.log(\"Scheduled refresh failed\", e);\r\n });\r\n }, refreshIn * 1000);\r\n }\r\n\r\n private clearRefreshTimer(): void {\r\n if (this.refreshTimer !== null) {\r\n clearTimeout(this.refreshTimer);\r\n this.refreshTimer = null;\r\n }\r\n }\r\n\r\n async singleFlightRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\r\n if (this.refreshPromise) return this.refreshPromise;\r\n this.refreshPromise = this._doRefresh(refreshToken).finally(() => {\r\n this.refreshPromise = null;\r\n });\r\n return this.refreshPromise;\r\n }\r\n\r\n private async _doRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\r\n try {\r\n const raw = await this.fetchAuth<{\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/refresh\", \"POST\", { refreshToken });\r\n\r\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", raw.accessToken);\r\n\r\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\r\n const session: AuthSession<U> = {\r\n access_token: raw.accessToken,\r\n refresh_token: raw.refreshToken,\r\n expires_in: expiresIn,\r\n expires_at: nowSeconds() + expiresIn,\r\n token_type: \"bearer\",\r\n user: me.user,\r\n };\r\n\r\n await this.setSessionInternal(session, \"TOKEN_REFRESHED\");\r\n return session;\r\n } catch (e) {\r\n this.log(\"Refresh failed\", e);\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Visibility listener ───────────────────────────────────────────────────\r\n\r\n private setupVisibilityListener(): void {\r\n if (typeof document === \"undefined\") return;\r\n this.visibilityHandler = () => {\r\n if (document.visibilityState === \"visible\" && this.currentSession) {\r\n const secondsUntilExpiry = this.currentSession.expires_at - nowSeconds();\r\n if (secondsUntilExpiry <= this.refreshSkewSeconds) {\r\n this.singleFlightRefresh(this.currentSession.refresh_token).catch(() => {});\r\n } else {\r\n this.scheduleRefresh(this.currentSession);\r\n }\r\n } else {\r\n this.clearRefreshTimer();\r\n }\r\n };\r\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n}\r\n\r\nfunction nowSeconds(): number {\r\n return Math.floor(Date.now() / 1000);\r\n}\r\n\r\nfunction decodeJwtExpiry(jwt: string): number | null {\r\n try {\r\n const parts = jwt.split(\".\");\r\n if (parts.length !== 3) return null;\r\n const payload = JSON.parse(atob(parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\")));\r\n return typeof payload.exp === \"number\" ? payload.exp : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import type {\r\n AgentChatStreamUiHandlers,\r\n AgentChatUiStreamResult,\r\n} from \"./agent-chat-ui\";\r\nimport { runAgentChatStreamForUi } from \"./agent-chat-ui\";\r\nimport {\r\n runAgentChatStream,\r\n type AgentChatStreamHandlers,\r\n type AgentChatStreamResult,\r\n} from \"./agent-stream\";\r\nimport {\r\n bindFetch,\r\n DEFAULT_RAGABLE_API_BASE,\r\n extractErrorMessage,\r\n RagableError,\r\n} from \"./request-client\";\r\nimport type { AgentChatParams, AgentStreamEvent } from \"./agents\";\r\nimport type {\r\n DefaultRagableDatabase,\r\n RagableDatabase,\r\n RagableTableNames,\r\n TableInsertRow,\r\n TableRow,\r\n TableUpdatePatch,\r\n} from \"./database-schema\";\r\nimport { parseMaybeJsonBody, readSseStream } from \"./sse\";\r\nimport {\r\n asPostgrestResponse,\r\n PostgrestTableApi,\r\n type PostgRESTFetch,\r\n type PostgRESTFetchParams,\r\n type PostgrestResult,\r\n} from \"./browser-postgrest\";\r\nexport {\r\n assertPostgrestSuccess,\r\n toRagableResult,\r\n unwrapPostgrest,\r\n} from \"./browser-postgrest\";\r\nimport {\r\n RagableAuth,\r\n type AuthSignUpCredentials,\r\n type AuthChangeEvent,\r\n type AuthOptions,\r\n type AuthSession,\r\n type AuthUpdateUserAttributes,\r\n type AuthUserMetadata,\r\n type DefaultAuthUser,\r\n} from \"./auth\";\r\nimport { Transport, type TransportOptions } from \"./transport\";\r\n\r\n/** Canonical browser/server API base (`…/api`, no trailing slash). */\r\nexport function normalizeBrowserApiBase(): string {\r\n return DEFAULT_RAGABLE_API_BASE.replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport type BrowserDataAuthMode = \"user\" | \"publicAnon\" | \"admin\";\r\n\r\n/**\r\n * Resolves how database requests are authorized. If `dataAuth` is omitted and a\r\n * static browser data key is configured (`dataStaticKey` / `getDataStaticKey`),\r\n * defaults to **`publicAnon`** so public apps can use shared collections without\r\n * sign-in. Use explicit **`dataAuth: \"user\"`** when you need JWT sessions; use\r\n * **`\"admin\"`** when the static key is a data-admin key.\r\n */\r\nexport function effectiveDataAuth(\r\n options: RagableBrowserClientOptions,\r\n): BrowserDataAuthMode {\r\n if (options.dataAuth) return options.dataAuth;\r\n const hasStatic =\r\n Boolean(options.dataStaticKey?.trim()) ||\r\n typeof options.getDataStaticKey === \"function\";\r\n if (hasStatic) return \"publicAnon\";\r\n return \"user\";\r\n}\r\n\r\nexport interface RagableBrowserClientOptions {\r\n organizationId: string;\r\n websiteId?: string;\r\n authGroupId?: string;\r\n databaseInstanceId?: string;\r\n /** When omitted, inferred from static keys — see {@link effectiveDataAuth}. */\r\n dataAuth?: BrowserDataAuthMode;\r\n /** Public anon or data-admin key from the dashboard (Browser Data API keys). */\r\n dataStaticKey?: string;\r\n getDataStaticKey?: () => string | null | Promise<string | null>;\r\n getAccessToken?: () => string | null | Promise<string | null>;\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n auth?: AuthOptions;\r\n transport?: Partial<TransportOptions>;\r\n}\r\n\r\nfunction requireAuthGroupId(options: RagableBrowserClientOptions): string {\r\n const id = options.authGroupId?.trim();\r\n if (!id) {\r\n throw new RagableError(\r\n \"authGroupId is required for auth and database methods on the browser client\",\r\n 400,\r\n { code: \"SDK_MISSING_AUTH_GROUP_ID\" },\r\n );\r\n }\r\n return id;\r\n}\r\n\r\nasync function requireAccessToken(\r\n options: RagableBrowserClientOptions,\r\n ragableAuth: RagableAuth | null,\r\n): Promise<string> {\r\n if (ragableAuth) {\r\n const token = await ragableAuth.getValidAccessToken();\r\n if (token) return token;\r\n }\r\n const getter = options.getAccessToken;\r\n if (getter) {\r\n const token = await getter();\r\n if (token?.trim()) return token.trim();\r\n }\r\n throw new RagableError(\r\n \"No access token available. Sign in first with auth.signInWithPassword() or provide getAccessToken callback.\",\r\n 401,\r\n { code: \"SDK_NO_ACCESS_TOKEN\" },\r\n );\r\n}\r\n\r\nasync function resolveDatabaseAuthBearer(\r\n options: RagableBrowserClientOptions,\r\n ragableAuth: RagableAuth | null,\r\n): Promise<string> {\r\n const mode = effectiveDataAuth(options);\r\n if (mode === \"user\") {\r\n return requireAccessToken(options, ragableAuth);\r\n }\r\n const fromGetter = options.getDataStaticKey\r\n ? await options.getDataStaticKey()\r\n : null;\r\n const key = (fromGetter?.trim() || options.dataStaticKey?.trim()) ?? \"\";\r\n if (!key) {\r\n throw new RagableError(\r\n mode === \"publicAnon\"\r\n ? \"dataAuth publicAnon requires getDataStaticKey or dataStaticKey\"\r\n : \"dataAuth admin requires getDataStaticKey or dataStaticKey\",\r\n 400,\r\n { code: \"SDK_MISSING_STATIC_KEY\" },\r\n );\r\n }\r\n return key;\r\n}\r\n\r\n// ─── Session types (kept for back-compat) ────────────────────────────────────\r\n\r\nexport interface BrowserAuthSession<\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n user: AuthUser;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n}\r\n\r\nexport interface BrowserAuthTokens {\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n}\r\n\r\nexport interface SupabaseCompatSession<\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n token_type: \"bearer\";\r\n user: AuthUser;\r\n}\r\n\r\nexport type { PostgrestResult };\r\nexport type { RagableResult } from \"./browser-postgrest\";\r\n\r\n// ─── RagableBrowserAuthClient (back-compat shim) ─────────────────────────────\r\n\r\nexport class RagableBrowserAuthClient<\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n constructor(\r\n _options: RagableBrowserClientOptions,\r\n private readonly ragableAuth: RagableAuth<AuthUser> | null = null,\r\n ) {}\r\n\r\n private get auth(): RagableAuth<AuthUser> {\r\n if (!this.ragableAuth) {\r\n throw new Error(\"Auth not initialized — provide authGroupId to enable auth\");\r\n }\r\n return this.ragableAuth;\r\n }\r\n\r\n async signUp(\r\n credentials: AuthSignUpCredentials<\r\n AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Metadata\r\n : AuthUserMetadata\r\n : AuthUserMetadata\r\n >,\r\n ): Promise<\r\n PostgrestResult<{\r\n user: AuthUser;\r\n session: SupabaseCompatSession<AuthUser>;\r\n }>\r\n > {\r\n const result = await this.auth.signUp(credentials);\r\n if (result.error) return { data: null, error: result.error };\r\n const session = result.data!.session;\r\n return {\r\n data: {\r\n user: session.user,\r\n session: {\r\n access_token: session.access_token,\r\n refresh_token: session.refresh_token,\r\n expires_in: session.expires_in,\r\n token_type: \"bearer\",\r\n user: session.user,\r\n },\r\n },\r\n error: null,\r\n };\r\n }\r\n\r\n async signInWithPassword(credentials: {\r\n email: string;\r\n password: string;\r\n }): Promise<\r\n PostgrestResult<{\r\n user: AuthUser;\r\n session: SupabaseCompatSession<AuthUser>;\r\n }>\r\n > {\r\n const result = await this.auth.signInWithPassword(credentials);\r\n if (result.error) return { data: null, error: result.error };\r\n const session = result.data!.session;\r\n return {\r\n data: {\r\n user: session.user,\r\n session: {\r\n access_token: session.access_token,\r\n refresh_token: session.refresh_token,\r\n expires_in: session.expires_in,\r\n token_type: \"bearer\",\r\n user: session.user,\r\n },\r\n },\r\n error: null,\r\n };\r\n }\r\n\r\n async refreshSession(refreshToken: string): Promise<\r\n PostgrestResult<{ session: SupabaseCompatSession<AuthUser>; user: AuthUser }>\r\n > {\r\n const result = await this.auth.refreshSession(refreshToken);\r\n if (result.error) return { data: null, error: result.error };\r\n const session = result.data!.session;\r\n return {\r\n data: {\r\n user: session.user,\r\n session: {\r\n access_token: session.access_token,\r\n refresh_token: session.refresh_token,\r\n expires_in: session.expires_in,\r\n token_type: \"bearer\",\r\n user: session.user,\r\n },\r\n },\r\n error: null,\r\n };\r\n }\r\n\r\n async getUser(): Promise<PostgrestResult<{ user: AuthUser }>> {\r\n return this.auth.getUser();\r\n }\r\n\r\n async updateUser(\r\n attributes: AuthUpdateUserAttributes<\r\n AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Metadata\r\n : AuthUserMetadata\r\n : AuthUserMetadata\r\n >,\r\n ): Promise<PostgrestResult<{ user: AuthUser }>> {\r\n return this.auth.updateUser(attributes);\r\n }\r\n\r\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{\r\n error: null;\r\n }> {\r\n return this.auth.signOut(_options);\r\n }\r\n\r\n async register(body: {\r\n email: string;\r\n password: string;\r\n name?: string;\r\n data?: AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Partial<Metadata> & { name?: string | null }\r\n : Record<string, unknown>\r\n : Record<string, unknown>;\r\n }): Promise<BrowserAuthSession<AuthUser>> {\r\n return this.auth.register(body as Parameters<RagableAuth<AuthUser>[\"register\"]>[0]);\r\n }\r\n\r\n async login(body: {\r\n email: string;\r\n password: string;\r\n }): Promise<BrowserAuthSession<AuthUser>> {\r\n return this.auth.login(body);\r\n }\r\n\r\n async refresh(body: { refreshToken: string }): Promise<BrowserAuthTokens> {\r\n return this.auth.refresh(body);\r\n }\r\n\r\n async getMe(): Promise<{ user: AuthUser }> {\r\n return this.auth.getMe();\r\n }\r\n\r\n async updateMe(body: {\r\n email?: string;\r\n name?: string | null;\r\n password?: string;\r\n data?: AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Partial<Metadata> & { name?: string | null }\r\n : Record<string, unknown>\r\n : Record<string, unknown>;\r\n }): Promise<{ user: AuthUser }> {\r\n return this.auth.updateMe(body as Parameters<RagableAuth<AuthUser>[\"updateMe\"]>[0]);\r\n }\r\n\r\n onAuthStateChange(\r\n callback: (event: AuthChangeEvent, session: AuthSession<AuthUser> | null) => void,\r\n ): { data: { subscription: { id: string; unsubscribe: () => void } } } {\r\n return this.auth.onAuthStateChange(callback);\r\n }\r\n\r\n getSession(): Promise<PostgrestResult<{ session: AuthSession<AuthUser> | null }>> {\r\n return this.auth.getSession();\r\n }\r\n}\r\n\r\n// ─── SQL query types ─────────────────────────────────────────────────────────\r\n\r\nexport interface BrowserSqlQueryParams {\r\n databaseInstanceId?: string;\r\n sql: string;\r\n params?: unknown[];\r\n readOnly?: boolean;\r\n timeoutMs?: number;\r\n rowLimit?: number;\r\n}\r\n\r\nexport interface BrowserSqlQueryResult<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> {\r\n command: string;\r\n rowCount: number;\r\n truncated: boolean;\r\n rows: Row[];\r\n}\r\n\r\n// ─── Database client ─────────────────────────────────────────────────────────\r\n\r\nexport interface BrowserCollectionRecord<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> {\r\n [key: string]: unknown;\r\n id: string;\r\n data: Row;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/**\r\n * Collection APIs return record envelopes, but user schema `Row` types should be\r\n * the JSON row inside `record.data`. If generated app types accidentally use the\r\n * envelope as `Row`, unwrap it so consumers still get `record.data.<field>`.\r\n */\r\nexport type BrowserCollectionRowData<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = Row extends {\r\n id: string;\r\n data: infer Data;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n ? Data extends Record<string, unknown>\r\n ? Data\r\n : Row\r\n : Row;\r\n\r\ntype BrowserCollectionInsertData<\r\n Row extends Record<string, unknown>,\r\n Insert extends Record<string, unknown>,\r\n> = BrowserCollectionRowData<Row> extends Row\r\n ? Insert\r\n : Insert extends {\r\n data: infer Data;\r\n }\r\n ? Data extends Record<string, unknown>\r\n ? Data\r\n : BrowserCollectionRowData<Row>\r\n : BrowserCollectionRowData<Row>;\r\n\r\ntype BrowserCollectionUpdateData<\r\n Row extends Record<string, unknown>,\r\n Update extends Record<string, unknown>,\r\n> = BrowserCollectionRowData<Row> extends Row\r\n ? Update\r\n : Update extends {\r\n data?: infer Data;\r\n }\r\n ? Data extends Record<string, unknown>\r\n ? Partial<Data>\r\n : Partial<BrowserCollectionRowData<Row>>\r\n : Partial<BrowserCollectionRowData<Row>>;\r\n\r\nexport interface BrowserCollectionDefinition {\r\n id: string;\r\n name: string;\r\n schema: Record<string, unknown> | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/**\r\n * Prisma-style operator object for a single field (server-supported ops).\r\n * Typed loosely so schema-specific refinements can be added in app code.\r\n */\r\nexport type WhereOperatorObject = {\r\n eq?: unknown;\r\n neq?: unknown;\r\n gt?: number;\r\n gte?: number;\r\n lt?: number;\r\n lte?: number;\r\n in?: unknown;\r\n contains?: unknown;\r\n};\r\n\r\n/**\r\n * `where` filters: equality on values, or per-field operator objects.\r\n * Use `id`, `createdAt`, `updatedAt` to match the record envelope (DB columns), not `data` JSON\r\n * (unless you also have those keys in your JSON — prefer envelope keys for `id`).\r\n */\r\nexport type WhereInput<Row extends Record<string, unknown>> = {\r\n [K in keyof Row]?: Row[K] | WhereOperatorObject | null;\r\n} & {\r\n id?: string | WhereOperatorObject;\r\n createdAt?: string | WhereOperatorObject;\r\n updatedAt?: string | WhereOperatorObject;\r\n};\r\n\r\n/** @deprecated Use {@link WhereInput} — same shape. */\r\nexport type CollectionWhere<Row extends Record<string, unknown>> = WhereInput<Row>;\r\n\r\ntype CollectionFilter<Row extends Record<string, unknown>> = {\r\n [Field in Extract<keyof Row, string>]: {\r\n field: Field;\r\n op?: \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"in\" | \"contains\";\r\n value: Row[Field];\r\n };\r\n}[Extract<keyof Row, string>];\r\n\r\nexport type CollectionReturnMode = \"envelope\" | \"flat\";\r\n\r\n/**\r\n * One row: JSON fields at the top level, envelope fields under `meta`\r\n * (when using {@link BrowserCollectionApi.findMany} with `return: \"flat\"`).\r\n */\r\nexport type CollectionRowWithMeta<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = Row & {\r\n meta: { id: string; createdAt: string; updatedAt: string };\r\n};\r\n\r\nexport function collectionRecordToRowWithMeta<Row extends Record<string, unknown>>(\r\n record: BrowserCollectionRecord<Row>,\r\n): CollectionRowWithMeta<Row> {\r\n const { data, id, createdAt, updatedAt } = record;\r\n return { ...(data as Row), meta: { id, createdAt, updatedAt } };\r\n}\r\n\r\nexport function collectionRecordsToRowWithMeta<Row extends Record<string, unknown>>(\r\n records: BrowserCollectionRecord<Row>[],\r\n): CollectionRowWithMeta<Row>[] {\r\n return records.map(collectionRecordToRowWithMeta);\r\n}\r\n\r\nconst FIND_QUERY_KEYS = [\r\n \"where\",\r\n \"filters\",\r\n \"limit\",\r\n \"offset\",\r\n \"orderBy\",\r\n \"orderDirection\",\r\n \"return\",\r\n] as const;\r\n\r\nexport type BrowserCollectionFindParams<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = {\r\n where?: WhereInput<Row>;\r\n filters?: Array<{\r\n field: Extract<keyof Row, string> | (string & {});\r\n op?: \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"in\" | \"contains\";\r\n value: unknown;\r\n } | CollectionFilter<Row>>;\r\n limit?: number;\r\n offset?: number;\r\n orderBy?:\r\n | Extract<keyof Row, string>\r\n | \"id\"\r\n | \"createdAt\"\r\n | \"updatedAt\"\r\n | (string & {});\r\n orderDirection?: \"asc\" | \"desc\";\r\n /**\r\n * - `envelope` (default): `Array<{ id, data, createdAt, updatedAt }>`\r\n * - `flat`: {@link CollectionRowWithMeta} — row fields at top level + `meta` for `id` / timestamps\r\n */\r\n return?: CollectionReturnMode;\r\n};\r\n\r\nexport type CollectionRowData<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = BrowserCollectionRowData<Row>;\r\n\r\ntype RowD<Row extends Record<string, unknown>> = BrowserCollectionRowData<Row>;\r\n\r\nexport class BrowserCollectionApi<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n Insert extends Record<string, unknown> = Row,\r\n Update extends Record<string, unknown> = Partial<Row>,\r\n> {\r\n constructor(\r\n private readonly database: RagableBrowserDatabaseClient<any>,\r\n private readonly name: string,\r\n private readonly databaseInstanceId?: string,\r\n ) {}\r\n\r\n private normalizeFindArgs(whereOrParams: unknown): {\r\n returnMode: CollectionReturnMode;\r\n body: Record<string, unknown>;\r\n } {\r\n const hasQueryKeys =\r\n typeof whereOrParams === \"object\" &&\r\n whereOrParams !== null &&\r\n FIND_QUERY_KEYS.some((key) =>\r\n Object.prototype.hasOwnProperty.call(whereOrParams, key),\r\n );\r\n const raw: Record<string, unknown> = hasQueryKeys\r\n ? { ...(whereOrParams as object) }\r\n : { where: whereOrParams };\r\n const returnMode: CollectionReturnMode =\r\n raw[\"return\"] === \"flat\" ? \"flat\" : \"envelope\";\r\n delete raw[\"return\"];\r\n return { returnMode, body: raw };\r\n }\r\n\r\n private requestFind = (\r\n body: Record<string, unknown>,\r\n ): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>>[]>> =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>[]>(\r\n \"POST\",\r\n `/${encodeURIComponent(this.name)}/find`,\r\n body,\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Query collection rows. Prefer this over the deprecated `find` alias.\r\n * Use `return: \"flat\"` to get {@link CollectionRowWithMeta} without nested `.data`.\r\n */\r\n findMany = async (\r\n whereOrParams:\r\n | WhereInput<RowD<Row>>\r\n | BrowserCollectionFindParams<RowD<Row>> = {},\r\n ): Promise<\r\n PostgrestResult<\r\n | BrowserCollectionRecord<RowD<Row>>[]\r\n | CollectionRowWithMeta<RowD<Row>>[]\r\n >\r\n > => {\r\n const { returnMode, body } = this.normalizeFindArgs(whereOrParams);\r\n const res = await this.requestFind(body);\r\n if (res.error) return res;\r\n if (returnMode === \"flat\") {\r\n return {\r\n data: collectionRecordsToRowWithMeta<RowD<Row>>(res.data),\r\n error: null,\r\n };\r\n }\r\n return res;\r\n };\r\n\r\n /**\r\n * @deprecated Use {@link BrowserCollectionApi.findMany} — same behavior.\r\n */\r\n find = (\r\n whereOrParams:\r\n | WhereInput<RowD<Row>>\r\n | BrowserCollectionFindParams<RowD<Row>> = {},\r\n ): Promise<\r\n PostgrestResult<\r\n | BrowserCollectionRecord<RowD<Row>>[]\r\n | CollectionRowWithMeta<RowD<Row>>[]\r\n >\r\n > => this.findMany(whereOrParams);\r\n\r\n /**\r\n * At most one row, `data` is the record or `null` if none match (not an error).\r\n */\r\n findFirst = async (\r\n whereOrParams:\r\n | WhereInput<RowD<Row>>\r\n | Omit<BrowserCollectionFindParams<RowD<Row>>, \"return\"> = {},\r\n ): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>> | null>> => {\r\n const { body } = this.normalizeFindArgs(whereOrParams);\r\n const withCap = { ...body, limit: 1, offset: body[\"offset\"] ?? 0 };\r\n const res = await this.requestFind(withCap);\r\n if (res.error) return res;\r\n return { data: res.data[0] ?? null, error: null };\r\n };\r\n\r\n /**\r\n * Lookup by primary key `id` (envelope). Equivalent to\r\n * `findFirst({ where: { id }, limit: 1 })` with a typed `where.id`.\r\n */\r\n findUnique = async (args: {\r\n where: { id: string } & Partial<WhereInput<RowD<Row>>>;\r\n }): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>> | null>> => {\r\n return this.findFirst({ where: args.where });\r\n };\r\n\r\n insert = (\r\n data: BrowserCollectionInsertData<Row, Insert>,\r\n ): Promise<\r\n PostgrestResult<BrowserCollectionRecord<RowD<Row>>>\r\n > =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>>(\r\n \"POST\",\r\n `/${encodeURIComponent(this.name)}/records`,\r\n { data },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Insert multiple rows in one request (server multi-value `INSERT`, single transaction).\r\n * Empty **`items`** resolves to an empty array. Max batch size is enforced on the server (500).\r\n */\r\n insertMany = (\r\n items: BrowserCollectionInsertData<Row, Insert>[],\r\n ): Promise<\r\n PostgrestResult<BrowserCollectionRecord<RowD<Row>>[]>\r\n > =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>[]>(\r\n \"POST\",\r\n `/${encodeURIComponent(this.name)}/records/batch`,\r\n { items },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Update rows matching `where` (JSON fields, plus envelope `id` / `createdAt` / `updatedAt`).\r\n */\r\n update = (\r\n where: WhereInput<RowD<Row>>,\r\n patch: BrowserCollectionUpdateData<Row, Update>,\r\n options?: { limit?: number },\r\n ): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>>[]>> =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>[]>(\r\n \"PATCH\",\r\n `/${encodeURIComponent(this.name)}/records`,\r\n { where, patch, ...(options?.limit ? { limit: options.limit } : {}) },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Like {@link BrowserCollectionApi.update} but the success payload includes\r\n * `meta.count` (number of rows returned from the update, bounded by `limit`).\r\n */\r\n updateMany = async (\r\n where: WhereInput<RowD<Row>>,\r\n patch: BrowserCollectionUpdateData<Row, Update>,\r\n options?: { limit?: number },\r\n ): Promise<\r\n PostgrestResult<{\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n meta: { count: number };\r\n }>\r\n > => {\r\n const r = await this.update(where, patch, options);\r\n if (r.error) return r;\r\n return { data: { records: r.data, meta: { count: r.data.length } }, error: null };\r\n };\r\n\r\n delete = (\r\n where: WhereInput<RowD<Row>>,\r\n options?: { limit?: number },\r\n ): Promise<\r\n PostgrestResult<{\r\n deleted: number;\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n }>\r\n > =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<{\r\n deleted: number;\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n }>(\r\n \"DELETE\",\r\n `/${encodeURIComponent(this.name)}/records`,\r\n { where, ...(options?.limit ? { limit: options.limit } : {}) },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Like {@link BrowserCollectionApi.delete} but the success payload includes **`meta.count`**\r\n * (number of deleted rows), matching {@link BrowserCollectionApi.updateMany}.\r\n */\r\n deleteMany = async (\r\n where: WhereInput<RowD<Row>>,\r\n options?: { limit?: number },\r\n ): Promise<\r\n PostgrestResult<{\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n meta: { count: number };\r\n }>\r\n > => {\r\n const r = await this.delete(where, options);\r\n if (r.error) return r;\r\n return {\r\n data: {\r\n records: r.data.records,\r\n meta: { count: r.data.deleted },\r\n },\r\n error: null,\r\n };\r\n };\r\n}\r\n\r\nexport type BrowserCollections<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n> = [keyof Database[\"public\"][\"Tables\"]] extends [never]\r\n ? Record<string, BrowserCollectionApi<Record<string, unknown>>>\r\n : {\r\n readonly [Name in RagableTableNames<Database>]: BrowserCollectionApi<\r\n TableRow<Database, Name>,\r\n TableInsertRow<Database, Name>,\r\n TableUpdatePatch<Database, Name>\r\n >;\r\n };\r\n\r\nexport type BrowserCollectionFactory<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n> = {\r\n <Name extends RagableTableNames<Database>>(\r\n name: Name,\r\n databaseInstanceId?: string,\r\n ): BrowserCollectionApi<\r\n TableRow<Database, Name>,\r\n TableInsertRow<Database, Name>,\r\n TableUpdatePatch<Database, Name>\r\n >;\r\n <Row extends Record<string, unknown>>(\r\n name: string,\r\n databaseInstanceId?: string,\r\n ): BrowserCollectionApi<Row>;\r\n};\r\n\r\nexport class RagableBrowserDatabaseClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n> {\r\n private readonly fetchImpl: typeof fetch;\r\n private _transport: Transport | null = null;\r\n readonly collections: BrowserCollections<Database>;\r\n readonly collection: BrowserCollectionFactory<Database>;\r\n\r\n constructor(\r\n private readonly options: RagableBrowserClientOptions,\r\n private readonly ragableAuth: RagableAuth | null = null,\r\n ) {\r\n this.fetchImpl = bindFetch(options.fetch);\r\n this.collections = new Proxy(\r\n {},\r\n {\r\n get: (_target, prop) => {\r\n if (typeof prop !== \"string\") return undefined;\r\n if (prop === \"then\") return undefined;\r\n return this.collection(prop);\r\n },\r\n },\r\n ) as BrowserCollections<Database>;\r\n this.collection = ((name: string, databaseInstanceId?: string) =>\r\n new BrowserCollectionApi(\r\n this,\r\n name,\r\n databaseInstanceId,\r\n )) as BrowserCollectionFactory<Database>;\r\n }\r\n\r\n /** @internal Called by RagableBrowser to share the Transport instance. */\r\n _setTransport(transport: Transport): void {\r\n this._transport = transport;\r\n }\r\n\r\n /**\r\n * PostgREST table access. Instance field so `client.database.from` is always an own,\r\n * enumerable function (avoids rare prototype/bundler issues).\r\n */\r\n from = <TableName extends RagableTableNames<Database>>(\r\n table: TableName,\r\n databaseInstanceId?: string,\r\n ): PostgrestTableApi<Database, TableName> => {\r\n const id =\r\n databaseInstanceId?.trim() || this.options.databaseInstanceId?.trim() || \"\";\r\n const ragableAuth = this.ragableAuth;\r\n const opts = this.options;\r\n const transport = this._transport;\r\n const fetchImpl = this.fetchImpl;\r\n\r\n const pgFetch: PostgRESTFetch = async (params: PostgRESTFetchParams) => {\r\n if (!params.databaseInstanceId?.trim()) {\r\n throw new RagableError(\r\n \"database.from() requires databaseInstanceId in client options or as the second argument\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n const gid = requireAuthGroupId(opts);\r\n const token = await resolveDatabaseAuthBearer(opts, ragableAuth);\r\n const apiBase = normalizeBrowserApiBase();\r\n const qs = params.searchParams.toString();\r\n const url = `${apiBase}/auth-groups/${gid}/data/rest/${params.table}${qs ? `?${qs}` : \"\"}`;\r\n\r\n const headers = new Headers(opts.headers);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"X-Database-Instance-Id\", params.databaseInstanceId);\r\n if (params.body !== undefined) {\r\n headers.set(\"Content-Type\", \"application/json\");\r\n }\r\n if (params.headers) {\r\n for (const [k, v] of Object.entries(params.headers)) {\r\n headers.set(k, v);\r\n }\r\n }\r\n\r\n if (transport) {\r\n return transport.execute({\r\n url,\r\n method: params.method,\r\n headers,\r\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\r\n signal: params.signal,\r\n idempotencyKey: params.idempotencyKey,\r\n });\r\n }\r\n\r\n return fetchImpl(url, {\r\n method: params.method,\r\n headers,\r\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\r\n signal: params.signal,\r\n });\r\n };\r\n return new PostgrestTableApi<Database, TableName>(pgFetch, id, table);\r\n };\r\n\r\n private toUrl(path: string): string {\r\n return `${normalizeBrowserApiBase()}${path.startsWith(\"/\") ? path : `/${path}`}`;\r\n }\r\n\r\n defineCollection = (\r\n name: string,\r\n schema?: Record<string, unknown>,\r\n databaseInstanceId?: string,\r\n ): Promise<PostgrestResult<BrowserCollectionDefinition>> =>\r\n asPostgrestResponse(() =>\r\n this._requestCollection<BrowserCollectionDefinition>(\r\n \"POST\",\r\n \"/\",\r\n { name, ...(schema ? { schema } : {}) },\r\n databaseInstanceId,\r\n ),\r\n );\r\n\r\n listCollections = (\r\n databaseInstanceId?: string,\r\n ): Promise<PostgrestResult<BrowserCollectionDefinition[]>> =>\r\n asPostgrestResponse(() =>\r\n this._requestCollection<BrowserCollectionDefinition[]>(\r\n \"GET\",\r\n \"/\",\r\n undefined,\r\n databaseInstanceId,\r\n ),\r\n );\r\n\r\n async _requestCollection<T>(\r\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\r\n path: string,\r\n body?: unknown,\r\n databaseInstanceId?: string,\r\n ): Promise<T> {\r\n const gid = requireAuthGroupId(this.options);\r\n const token = await resolveDatabaseAuthBearer(this.options, this.ragableAuth);\r\n const id = databaseInstanceId?.trim() || this.options.databaseInstanceId?.trim();\r\n if (!id) {\r\n throw new RagableError(\r\n \"db.collections requires databaseInstanceId in client options. For dynamic collection() calls, you can also pass databaseInstanceId as the second argument.\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n const headers = this.baseHeaders();\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"X-Database-Instance-Id\", id);\r\n if (body !== undefined) headers.set(\"Content-Type\", \"application/json\");\r\n const response = await this.fetchImpl(\r\n this.toUrl(`/auth-groups/${gid}/data/collections${path}`),\r\n {\r\n method,\r\n headers,\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n },\r\n );\r\n const payload = await parseMaybeJsonBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n }\r\n\r\n query = async <Row extends Record<string, unknown> = Record<string, unknown>>(\r\n params: BrowserSqlQueryParams,\r\n ): Promise<PostgrestResult<BrowserSqlQueryResult<Row>>> => {\r\n return asPostgrestResponse(async () => {\r\n const gid = requireAuthGroupId(this.options);\r\n const token = await resolveDatabaseAuthBearer(this.options, this.ragableAuth);\r\n const databaseInstanceId =\r\n params.databaseInstanceId?.trim() ||\r\n this.options.databaseInstanceId?.trim();\r\n if (!databaseInstanceId) {\r\n throw new RagableError(\r\n \"database.query requires databaseInstanceId in the request or on createBrowserClient({ databaseInstanceId })\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n const headers = this.baseHeaders();\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n const readOnly =\r\n effectiveDataAuth(this.options) === \"publicAnon\"\r\n ? true\r\n : params.readOnly !== false;\r\n const response = await this.fetchImpl(\r\n this.toUrl(`/auth-groups/${gid}/data/query`),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n databaseInstanceId,\r\n sql: params.sql,\r\n ...(params.params !== undefined ? { params: params.params } : {}),\r\n readOnly,\r\n ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),\r\n ...(params.rowLimit !== undefined ? { rowLimit: params.rowLimit } : {}),\r\n }),\r\n },\r\n );\r\n const payload = await parseMaybeJsonBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as BrowserSqlQueryResult<Row>;\r\n });\r\n };\r\n\r\n private baseHeaders(): Headers {\r\n return new Headers(this.options.headers);\r\n }\r\n\r\n /**\r\n * Postgres `LISTEN` / `NOTIFY` realtime via server-proxied SSE.\r\n * Channels must be lowercase identifiers: `[a-z_][a-z0-9_]*` (max 63 chars).\r\n */\r\n /**\r\n * Postgres `LISTEN` / `NOTIFY` realtime via server-proxied SSE.\r\n *\r\n * Returns a `BrowserRealtimeSubscription` with:\r\n * - `unsubscribe()` — permanently close the subscription (stops reconnects).\r\n * - `status` — current connection state: `\"connecting\"` | `\"connected\"` | `\"reconnecting\"` | `\"disconnected\"`.\r\n *\r\n * The subscription automatically reconnects with exponential backoff when the\r\n * stream drops. Server heartbeats (every 15 s) are monitored — if none arrive\r\n * within `heartbeatTimeoutMs` (default 45 s), the connection is treated as dead\r\n * and a reconnect is triggered. Auth errors (401/403/404) are non-retryable.\r\n *\r\n * Channel names must be lowercase identifiers: `[a-z_][a-z0-9_]*` (max 63 chars).\r\n */\r\n realtime = {\r\n subscribe: (\r\n params: BrowserRealtimeSubscribeParams,\r\n ): Promise<BrowserRealtimeSubscription> =>\r\n subscribeBrowserRealtime(\r\n this.options,\r\n this.ragableAuth,\r\n this.fetchImpl,\r\n params,\r\n ),\r\n };\r\n}\r\n\r\n/**\r\n * A single NOTIFY message received from a Postgres channel.\r\n *\r\n * - `channel` — the lowercase channel name that fired.\r\n * - `payload` — the text payload (may be null if NOTIFY was sent without one).\r\n * - `processId` — the PID of the Postgres backend that called NOTIFY.\r\n */\r\nexport interface BrowserRealtimeNotification {\r\n channel: string;\r\n payload: string | null;\r\n processId: number;\r\n}\r\n\r\n/**\r\n * Connection status of a realtime subscription.\r\n *\r\n * - `\"connecting\"` — establishing or re-establishing the SSE stream.\r\n * - `\"connected\"` — stream is open, heartbeats are arriving, NOTIFY events are flowing.\r\n * - `\"reconnecting\"` — the stream dropped and the SDK is waiting before the next retry.\r\n * - `\"disconnected\"` — permanently stopped (via `unsubscribe()`, `signal` abort, or max retries exceeded).\r\n */\r\nexport type BrowserRealtimeStatus =\r\n | \"connecting\"\r\n | \"connected\"\r\n | \"reconnecting\"\r\n | \"disconnected\";\r\n\r\nexport interface BrowserRealtimeSubscribeParams {\r\n databaseInstanceId?: string;\r\n /** Channel names (normalized to lowercase on the server). */\r\n channels: string[];\r\n /** When aborted, the subscription stops permanently (equivalent to calling `unsubscribe()`). */\r\n signal?: AbortSignal;\r\n\r\n // ── Callbacks ──\r\n\r\n /** Called each time a Postgres NOTIFY message arrives. */\r\n onNotify?: (msg: BrowserRealtimeNotification) => void;\r\n /** Called once per connection attempt when the server confirms LISTEN is active. */\r\n onReady?: (channels: string[]) => void;\r\n /** Called when the stream encounters a non-retryable error or the server sends an error event. */\r\n onError?: (message: string) => void;\r\n /** Called whenever the connection status changes (connecting → connected → reconnecting → …). */\r\n onStatusChange?: (status: BrowserRealtimeStatus) => void;\r\n /** Called when the stream drops and the SDK will attempt to reconnect. `attempt` is 1-indexed. */\r\n onDisconnect?: (info: { attempt: number; retryInMs: number }) => void;\r\n /** Called when a reconnect attempt succeeds (stream is open again). */\r\n onReconnect?: (info: { attempt: number }) => void;\r\n\r\n // ── Reconnect tuning (safe defaults; override for advanced use) ──\r\n\r\n /** Maximum number of reconnect attempts before giving up. Set `0` to disable reconnect. Default: **Infinity** (never stops). */\r\n maxReconnectAttempts?: number;\r\n /** Base delay for exponential backoff (ms). Default: **1000**. */\r\n reconnectBaseDelayMs?: number;\r\n /** Maximum delay between reconnect attempts (ms). Default: **30000**. */\r\n reconnectMaxDelayMs?: number;\r\n /** How long to wait without a heartbeat before considering the connection dead (ms). Default: **45000** (3× the server's 15 s heartbeat interval). */\r\n heartbeatTimeoutMs?: number;\r\n}\r\n\r\n/**\r\n * Handle returned by `database.realtime.subscribe()`.\r\n *\r\n * - Call `unsubscribe()` to permanently close the subscription (no more reconnects).\r\n * - Read `status` to check the current connection state at any time.\r\n */\r\nexport interface BrowserRealtimeSubscription {\r\n unsubscribe: () => void;\r\n readonly status: BrowserRealtimeStatus;\r\n}\r\n\r\nfunction followAbortSignal(\r\n parent: AbortSignal | undefined,\r\n child: AbortController,\r\n): void {\r\n if (!parent) return;\r\n if (parent.aborted) {\r\n child.abort();\r\n return;\r\n }\r\n parent.addEventListener(\"abort\", () => child.abort(), { once: true });\r\n}\r\n\r\nfunction backoffDelay(\r\n attempt: number,\r\n baseMs: number,\r\n maxMs: number,\r\n): number {\r\n const exp = Math.min(baseMs * 2 ** (attempt - 1), maxMs);\r\n const jitter = exp * (0.5 + Math.random() * 0.5);\r\n return Math.round(jitter);\r\n}\r\n\r\nasync function subscribeBrowserRealtime(\r\n options: RagableBrowserClientOptions,\r\n ragableAuth: RagableAuth | null,\r\n fetchImpl: typeof fetch,\r\n params: BrowserRealtimeSubscribeParams,\r\n): Promise<BrowserRealtimeSubscription> {\r\n const gid = requireAuthGroupId(options);\r\n const databaseInstanceId =\r\n params.databaseInstanceId?.trim() || options.databaseInstanceId?.trim();\r\n if (!databaseInstanceId) {\r\n throw new RagableError(\r\n \"realtime.subscribe requires databaseInstanceId in params or on createBrowserClient({ databaseInstanceId })\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n if (!Array.isArray(params.channels) || params.channels.length === 0) {\r\n throw new RagableError(\r\n \"realtime.subscribe requires a non-empty channels array\",\r\n 400,\r\n { code: \"SDK_REALTIME_CHANNELS_REQUIRED\" },\r\n );\r\n }\r\n\r\n const maxAttempts = params.maxReconnectAttempts ?? Infinity;\r\n const baseDelay = params.reconnectBaseDelayMs ?? 1_000;\r\n const maxDelay = params.reconnectMaxDelayMs ?? 30_000;\r\n const heartbeatTimeout = params.heartbeatTimeoutMs ?? 45_000;\r\n\r\n const lifecycleAc = new AbortController();\r\n followAbortSignal(params.signal, lifecycleAc);\r\n\r\n let currentStatus: BrowserRealtimeStatus = \"connecting\";\r\n const setStatus = (s: BrowserRealtimeStatus) => {\r\n if (s === currentStatus) return;\r\n currentStatus = s;\r\n params.onStatusChange?.(s);\r\n };\r\n\r\n const subscription: BrowserRealtimeSubscription = {\r\n unsubscribe: () => lifecycleAc.abort(),\r\n get status() {\r\n return currentStatus;\r\n },\r\n };\r\n\r\n setStatus(\"connecting\");\r\n\r\n async function connectOnce(\r\n signal: AbortSignal,\r\n ): Promise<\"stream_ended\" | \"aborted\"> {\r\n const token = await resolveDatabaseAuthBearer(options, ragableAuth);\r\n const headers = new Headers(options.headers);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n\r\n const response = await fetchImpl(\r\n `${normalizeBrowserApiBase()}/auth-groups/${gid}/data/realtime/stream`,\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n databaseInstanceId,\r\n channels: params.channels,\r\n }),\r\n signal,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const payload = await parseMaybeJsonBody(response);\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n const streamBody = response.body;\r\n if (!streamBody) {\r\n throw new RagableError(\"Realtime stream has no body\", 502, {\r\n code: \"SDK_REALTIME_NO_BODY\",\r\n });\r\n }\r\n\r\n let heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\r\n const resetHeartbeatTimer = () => {\r\n if (heartbeatTimer) clearTimeout(heartbeatTimer);\r\n heartbeatTimer = setTimeout(() => {\r\n streamReader?.cancel().catch(() => undefined);\r\n }, heartbeatTimeout);\r\n };\r\n\r\n let streamReader: ReadableStreamDefaultReader<Uint8Array> | null = null;\r\n\r\n try {\r\n streamReader = streamBody.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n resetHeartbeatTimer();\r\n\r\n const processEvent = (evt: { type: string; [k: string]: unknown }) => {\r\n if (evt.type === \"realtime:heartbeat\") {\r\n resetHeartbeatTimer();\r\n return;\r\n }\r\n resetHeartbeatTimer();\r\n if (evt.type === \"realtime:ready\") {\r\n const ch = evt.channels;\r\n setStatus(\"connected\");\r\n params.onReady?.(\r\n Array.isArray(ch) ? ch.map((c) => String(c)) : [],\r\n );\r\n } else if (evt.type === \"notify\") {\r\n params.onNotify?.({\r\n channel: String(evt.channel ?? \"\"),\r\n payload:\r\n evt.payload === undefined || evt.payload === null\r\n ? null\r\n : String(evt.payload),\r\n processId: Number(evt.processId ?? 0),\r\n });\r\n } else if (evt.type === \"realtime:error\") {\r\n params.onError?.(String(evt.message ?? \"Realtime error\"));\r\n }\r\n };\r\n\r\n while (true) {\r\n const { done, value } = await streamReader.read();\r\n if (done) break;\r\n buffer += decoder.decode(value, { stream: true });\r\n let boundary = buffer.indexOf(\"\\n\\n\");\r\n while (boundary !== -1) {\r\n const block = buffer.slice(0, boundary);\r\n buffer = buffer.slice(boundary + 2);\r\n for (const line of block.split(\"\\n\")) {\r\n const dataPrefix = \"data: \";\r\n if (!line.startsWith(dataPrefix)) continue;\r\n const json = line.slice(dataPrefix.length).trim();\r\n if (!json || json === \"[DONE]\") continue;\r\n try {\r\n processEvent(JSON.parse(json));\r\n } catch {\r\n /* malformed JSON — skip */\r\n }\r\n }\r\n boundary = buffer.indexOf(\"\\n\\n\");\r\n }\r\n }\r\n\r\n return \"stream_ended\";\r\n } finally {\r\n if (heartbeatTimer) clearTimeout(heartbeatTimer);\r\n streamReader?.releaseLock();\r\n }\r\n }\r\n\r\n void (async () => {\r\n let attempt = 0;\r\n while (!lifecycleAc.signal.aborted) {\r\n const iterAc = new AbortController();\r\n followAbortSignal(lifecycleAc.signal, iterAc);\r\n\r\n try {\r\n const result = await connectOnce(iterAc.signal);\r\n if (lifecycleAc.signal.aborted) break;\r\n if (result === \"stream_ended\") {\r\n attempt++;\r\n }\r\n } catch (e) {\r\n if (lifecycleAc.signal.aborted) break;\r\n if ((e as Error).name === \"AbortError\") break;\r\n\r\n const status = (e as RagableError).status;\r\n if (status === 400 || status === 401 || status === 403 || status === 404) {\r\n params.onError?.((e as Error).message);\r\n break;\r\n }\r\n attempt++;\r\n }\r\n\r\n if (lifecycleAc.signal.aborted) break;\r\n if (attempt > maxAttempts) {\r\n params.onError?.(`Realtime: gave up after ${maxAttempts} reconnect attempts`);\r\n break;\r\n }\r\n\r\n const delay = backoffDelay(attempt, baseDelay, maxDelay);\r\n setStatus(\"reconnecting\");\r\n params.onDisconnect?.({ attempt, retryInMs: delay });\r\n\r\n await new Promise<void>((r) => {\r\n const timer = setTimeout(r, delay);\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n r();\r\n };\r\n lifecycleAc.signal.addEventListener(\"abort\", onAbort, { once: true });\r\n });\r\n\r\n if (lifecycleAc.signal.aborted) break;\r\n setStatus(\"connecting\");\r\n params.onReconnect?.({ attempt });\r\n }\r\n\r\n setStatus(\"disconnected\");\r\n })();\r\n\r\n return subscription;\r\n}\r\n\r\n// ─── Agents client ───────────────────────────────────────────────────────────\r\n\r\nexport interface AgentConversationMessage {\r\n role: \"user\" | \"assistant\";\r\n content: string;\r\n file_urls?: string[];\r\n}\r\n\r\nexport interface AgentConversation {\r\n id: string;\r\n agent_name: string;\r\n agentName: string;\r\n title: string | null;\r\n metadata: unknown;\r\n messages: AgentConversationMessage[];\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface AgentConversationSubscription {\r\n unsubscribe: () => void;\r\n}\r\n\r\nexport class RagableBrowserAgentsClient {\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(private readonly options: RagableBrowserClientOptions) {\r\n this.fetchImpl = bindFetch(options.fetch);\r\n }\r\n\r\n private toUrl(path: string): string {\r\n return `${normalizeBrowserApiBase()}${path.startsWith(\"/\") ? path : `/${path}`}`;\r\n }\r\n\r\n private requireWebsiteId(): string {\r\n const websiteId = this.options.websiteId?.trim();\r\n if (!websiteId) {\r\n throw new RagableError(\r\n \"websiteId is required for project agent conversation APIs. Use the generated createWebsiteRagableClient() or pass createBrowserClient({ websiteId, ... }).\",\r\n 400,\r\n { code: \"SDK_MISSING_WEBSITE_ID\" },\r\n );\r\n }\r\n return websiteId;\r\n }\r\n\r\n private websiteAgentPath(path: string): string {\r\n const websiteId = this.requireWebsiteId();\r\n return `/public/organizations/${this.options.organizationId}/websites/${websiteId}${path}`;\r\n }\r\n\r\n private async requestJson<T>(path: string, init: RequestInit = {}): Promise<T> {\r\n const response = await this.fetchImpl(this.toUrl(path), init);\r\n const payload = await parseMaybeJsonBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n }\r\n\r\n /** @deprecated Prefer `chatStreamByName(agentName, params)` for project-local `/agents/*.json` agents. */\r\n async *chatStream(\r\n agentId: string,\r\n params: AgentPublicChatParams,\r\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\r\n const orgId = this.options.organizationId;\r\n const body: Record<string, unknown> = {\r\n message: params.message,\r\n ...(params.history !== undefined ? { history: params.history } : {}),\r\n ...(params.triggerSubtype !== undefined\r\n ? { triggerSubtype: params.triggerSubtype }\r\n : {}),\r\n ...(params.triggerNodeId !== undefined\r\n ? { triggerNodeId: params.triggerNodeId }\r\n : {}),\r\n };\r\n\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n\r\n const response = await this.fetchImpl(\r\n this.toUrl(`/public/organizations/${orgId}/agents/${agentId}/chat/stream`),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify(body),\r\n ...(params.signal !== undefined ? { signal: params.signal } : {}),\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const payload = await parseMaybeJsonBody(response);\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n const streamBody = response.body;\r\n if (!streamBody) {\r\n return;\r\n }\r\n\r\n yield* readSseStream(streamBody);\r\n }\r\n\r\n async *chatStreamByName(\r\n agentName: string,\r\n params: AgentChatParams,\r\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n const response = await this.fetchImpl(\r\n this.toUrl(\r\n this.websiteAgentPath(\r\n `/agents/${encodeURIComponent(agentName)}/chat/stream`,\r\n ),\r\n ),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n message: params.message,\r\n ...(params.history !== undefined ? { history: params.history } : {}),\r\n }),\r\n ...(params.signal !== undefined ? { signal: params.signal } : {}),\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const payload = await parseMaybeJsonBody(response);\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n if (!response.body) return;\r\n yield* readSseStream(response.body);\r\n }\r\n\r\n /**\r\n * Stream a project agent (`/agents/*.json`) with callbacks; returns the final `done` payload\r\n * plus streamed assistant text. Prefer this over manual `for await` when building chat UIs.\r\n */\r\n async runChatStreamByName(\r\n agentName: string,\r\n params: AgentChatParams,\r\n handlers: AgentChatStreamHandlers = {},\r\n ): Promise<AgentChatStreamResult> {\r\n return runAgentChatStream(this.chatStreamByName(agentName, params), handlers, {\r\n signal: params.signal,\r\n });\r\n }\r\n\r\n /**\r\n * Same as {@link runChatStreamByName} but folds events into `AgentChat`-style segments\r\n * (`onSegments` / `onStreamingText`) and returns a history-ready assistant message.\r\n */\r\n async runChatUiByName(\r\n agentName: string,\r\n params: AgentChatParams,\r\n handlers: AgentChatStreamUiHandlers = {},\r\n ): Promise<AgentChatUiStreamResult> {\r\n return runAgentChatStreamForUi(\r\n this.chatStreamByName(agentName, params),\r\n handlers,\r\n { signal: params.signal },\r\n );\r\n }\r\n\r\n createConversation(params: {\r\n agent_name?: string;\r\n agentName?: string;\r\n title?: string | null;\r\n metadata?: unknown;\r\n }): Promise<AgentConversation> {\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\"/agent-conversations\"),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify(params),\r\n },\r\n );\r\n }\r\n\r\n listConversations(params: {\r\n agent_name?: string;\r\n agentName?: string;\r\n } = {}): Promise<AgentConversation[]> {\r\n const agentName = params.agent_name ?? params.agentName;\r\n const qs = agentName\r\n ? `?agentName=${encodeURIComponent(agentName)}`\r\n : \"\";\r\n return this.requestJson<AgentConversation[]>(\r\n this.websiteAgentPath(`/agent-conversations${qs}`),\r\n );\r\n }\r\n\r\n getConversation(conversationId: string): Promise<AgentConversation> {\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\r\n `/agent-conversations/${encodeURIComponent(conversationId)}`,\r\n ),\r\n );\r\n }\r\n\r\n updateConversation(\r\n conversationId: string,\r\n data: { title?: string | null; metadata?: unknown },\r\n ): Promise<AgentConversation> {\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\r\n `/agent-conversations/${encodeURIComponent(conversationId)}`,\r\n ),\r\n {\r\n method: \"PATCH\",\r\n headers,\r\n body: JSON.stringify(data),\r\n },\r\n );\r\n }\r\n\r\n addMessage(\r\n conversationOrId: AgentConversation | string,\r\n message: AgentConversationMessage,\r\n ): Promise<AgentConversation> {\r\n const conversationId =\r\n typeof conversationOrId === \"string\" ? conversationOrId : conversationOrId.id;\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\r\n `/agent-conversations/${encodeURIComponent(conversationId)}/messages`,\r\n ),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify(message),\r\n },\r\n );\r\n }\r\n\r\n subscribeToConversation(\r\n conversationId: string,\r\n callback: (conversation: AgentConversation) => void,\r\n options: { intervalMs?: number } = {},\r\n ): AgentConversationSubscription {\r\n let stopped = false;\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const intervalMs = Math.max(500, options.intervalMs ?? 1500);\r\n const tick = async () => {\r\n if (stopped) return;\r\n try {\r\n callback(await this.getConversation(conversationId));\r\n } finally {\r\n if (!stopped) timer = setTimeout(tick, intervalMs);\r\n }\r\n };\r\n void tick();\r\n return {\r\n unsubscribe: () => {\r\n stopped = true;\r\n if (timer) clearTimeout(timer);\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport interface AgentPublicChatParams extends AgentChatParams {\r\n triggerSubtype?: string;\r\n triggerNodeId?: string;\r\n}\r\n\r\n// ─── Main browser client ─────────────────────────────────────────────────────\r\n\r\nexport class RagableBrowser<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n readonly agents: RagableBrowserAgentsClient;\r\n readonly auth: RagableBrowserAuthClient<AuthUser>;\r\n readonly database: RagableBrowserDatabaseClient<Database>;\r\n readonly db: RagableBrowserDatabaseClient<Database>;\r\n readonly transport: Transport;\r\n private readonly _ragableAuth: RagableAuth<AuthUser> | null;\r\n\r\n constructor(options: RagableBrowserClientOptions) {\r\n this.transport = new Transport({\r\n fetch: options.fetch,\r\n headers: options.headers,\r\n ...options.transport,\r\n });\r\n\r\n if (options.authGroupId) {\r\n this._ragableAuth = new RagableAuth<AuthUser>({\r\n authGroupId: options.authGroupId,\r\n fetch: options.fetch,\r\n headers: options.headers,\r\n auth: options.auth,\r\n });\r\n\r\n this.transport.setRefreshHandler(async () => {\r\n if (effectiveDataAuth(options) !== \"user\") return null;\r\n return this._ragableAuth!.getValidAccessToken();\r\n });\r\n\r\n if (\r\n !options.getAccessToken &&\r\n effectiveDataAuth(options) === \"user\"\r\n ) {\r\n this._ragableAuth.initialize().catch(() => {});\r\n }\r\n } else {\r\n this._ragableAuth = null;\r\n }\r\n\r\n this.agents = new RagableBrowserAgentsClient(options);\r\n this.auth = new RagableBrowserAuthClient<AuthUser>(options, this._ragableAuth);\r\n this.database = new RagableBrowserDatabaseClient<Database>(\r\n options,\r\n this._ragableAuth as RagableAuth | null,\r\n );\r\n this.database._setTransport(this.transport);\r\n this.db = this.database;\r\n }\r\n\r\n /** Delegates to `database.from()`. Kept for back-compat — prefer `database.from()`. */\r\n from = <TableName extends RagableTableNames<Database>>(\r\n table: TableName,\r\n databaseInstanceId?: string,\r\n ): PostgrestTableApi<Database, TableName> => {\r\n return this.database.from(table, databaseInstanceId);\r\n };\r\n\r\n destroy(): void {\r\n this._ragableAuth?.destroy();\r\n }\r\n}\r\n\r\nexport function createBrowserClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser> {\r\n return new RagableBrowser<Database, AuthUser>(options);\r\n}\r\n\r\nexport const createRagableBrowserClient = createBrowserClient;\r\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","import { RagableRequestClient } from \"./request-client\";\n\n// ─── Bucket types ─────────────────────────────────────────────────────────────\n\nexport interface StorageBucket {\n id: string;\n name: string;\n organizationId: string;\n status: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface StorageBucketItem {\n type: \"file\" | \"folder\";\n path: string;\n name: string;\n /** File size in bytes (files only). */\n size?: string | null;\n contentType?: string | null;\n updated?: string | null;\n generation?: string | null;\n}\n\nexport interface StorageListContentsResult {\n bucket: string;\n prefix: string;\n items: StorageBucketItem[];\n nextPageToken: string | null;\n}\n\nexport interface StorageListBucketsParams {\n /** Filter by name substring. */\n q?: string;\n status?: string;\n sort?: string;\n}\n\nexport interface StorageListContentsParams {\n /** Folder prefix to list inside (e.g. `\"reports/\"`). */\n prefix?: string;\n /** Path delimiter — defaults to `\"/\"` on the server. */\n delimiter?: string;\n maxResults?: number;\n pageToken?: string;\n}\n\n// ─── Object / file types ──────────────────────────────────────────────────────\n\nexport type StorageUploadableFile = Blob | ArrayBuffer | Uint8Array;\n\nexport interface StorageUploadParams {\n /** Target path inside the bucket (e.g. `\"reports/jan.pdf\"`). */\n objectPath: string;\n file: StorageUploadableFile;\n /** Optional filename hint for content-type detection. */\n fileName?: string;\n contentType?: string;\n /** HTTP `Cache-Control` header stored with the object. */\n cacheControl?: string;\n}\n\nexport interface StorageUploadResult {\n success: true;\n path: string;\n size: string | null;\n contentType: string | null;\n generation: string | null;\n updated: string | null;\n}\n\nexport interface StorageDownloadParams {\n objectPath: string;\n /** When `true`, the response includes `text` if the file fits in `maxTextBytes`. */\n asText?: boolean;\n /** Maximum bytes to decode as text (default 1 MB, max 5 MB). */\n maxTextBytes?: number;\n}\n\nexport interface StorageDownloadResult {\n path: string;\n size: string | null;\n contentType: string | null;\n updated: string | null;\n generation: string | null;\n /** Always `\"base64\"`. */\n encoding: string;\n /** Full file contents encoded as base64. */\n contentsBase64: string;\n /** UTF-8 decoded text when `asText: true` and size ≤ `maxTextBytes`. */\n text: string | null;\n textIncluded: boolean;\n}\n\nexport interface StorageObjectMetadata {\n name: string;\n bucket: string;\n contentType: string | null;\n size: string | null;\n updated: string | null;\n generation: string | null;\n metadata?: Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface StorageUpdateMetadataParams {\n objectPath: string;\n contentType?: string;\n cacheControl?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface StorageCopyMoveParams {\n sourcePath: string;\n destinationPath: string;\n}\n\nexport interface StorageBulkDeleteResult {\n success: boolean;\n totalRequested: number;\n uniquePaths: number;\n deleted: string[];\n errors: Array<{ path: string; error: string }>;\n}\n\n// ─── Signed URL types ─────────────────────────────────────────────────────────\n\nexport interface StorageSignedUploadUrlParams {\n objectPath: string;\n /** Expiry in seconds — clamped to [60, 3600] by the server. Default 900. */\n expiresInSeconds?: number;\n contentType?: string;\n}\n\nexport interface StorageSignedUploadUrlResult {\n url: string;\n method: string;\n expiresInSeconds: number;\n objectPath: string;\n}\n\nexport interface StorageSignedDownloadUrlParams {\n objectPath: string;\n /** Expiry in seconds — clamped to [60, 86400] by the server. Default 900. */\n expiresInSeconds?: number;\n}\n\nexport interface StorageSignedDownloadUrlResult {\n url: string;\n method: string;\n expiresInSeconds: number;\n objectPath: string;\n}\n\n// ─── Bucket-settings types ────────────────────────────────────────────────────\n\nexport interface StorageBucketCorsEntry {\n origin?: string[];\n method?: string[];\n responseHeader?: string[];\n maxAgeSeconds?: number;\n}\n\nexport interface StorageBucketSettings {\n id: string;\n logicalName: string;\n gcpBucketName: string;\n location: string | null;\n storageClass: string | null;\n labels: Record<string, string>;\n versioningEnabled: boolean;\n publicAccessPrevention: string | null;\n uniformBucketLevelAccessEnabled: boolean;\n cors: StorageBucketCorsEntry[];\n retentionPolicy: unknown;\n lifecycleRules: unknown[];\n updated: string | null;\n}\n\nexport interface StorageUpdateBucketSettingsParams {\n labels?: Record<string, string>;\n storageClass?: string;\n versioningEnabled?: boolean;\n publicAccessPrevention?: \"inherited\" | \"enforced\";\n uniformBucketLevelAccessEnabled?: boolean;\n cors?: StorageBucketCorsEntry[];\n}\n\n// ─── Per-bucket client surface ────────────────────────────────────────────────\n\n/**\n * Object/file operations scoped to a single bucket.\n * Obtained via {@link StorageClient.from}.\n *\n * @example\n * const bucket = ragable.storage.from(\"bucket-id\");\n *\n * // Upload a file\n * await bucket.upload({ objectPath: \"data/report.pdf\", file: pdfBlob });\n *\n * // Download and read as text\n * const { text } = await bucket.download({ objectPath: \"data/notes.txt\", asText: true });\n *\n * // Generate a short-lived public download link\n * const { url } = await bucket.getSignedDownloadUrl({ objectPath: \"data/report.pdf\" });\n */\nexport interface StorageBucketClient {\n /** List objects and sub-folders inside this bucket (optionally under a prefix). */\n list(params?: StorageListContentsParams): Promise<StorageListContentsResult>;\n\n /** Create an empty folder placeholder (GCS folder marker). */\n createFolder(folderPath: string): Promise<{ success: true; folderPath: string }>;\n\n /** Delete a folder and all objects under it. */\n deleteFolder(folderPath: string): Promise<{ success: true; folderPath: string }>;\n\n /** Upload a file to the specified `objectPath`. */\n upload(params: StorageUploadParams): Promise<StorageUploadResult>;\n\n /** Delete a single object. */\n delete(objectPath: string): Promise<{ success: true; path: string }>;\n\n /** Delete up to 1 000 objects in one call. */\n bulkDelete(objectPaths: string[]): Promise<StorageBulkDeleteResult>;\n\n /** Retrieve GCS metadata for an object. */\n getMetadata(objectPath: string): Promise<StorageObjectMetadata>;\n\n /** Update `contentType`, `cacheControl`, or custom `metadata` for an object. */\n updateMetadata(params: StorageUpdateMetadataParams): Promise<StorageObjectMetadata>;\n\n /**\n * Download an object. Contents are always returned as `contentsBase64`.\n * Pass `asText: true` to also receive a decoded `text` field (≤ maxTextBytes).\n */\n download(params: StorageDownloadParams): Promise<StorageDownloadResult>;\n\n /** Copy an object to a new path inside the same bucket. */\n copy(params: StorageCopyMoveParams): Promise<{ success: true; sourcePath: string; destinationPath: string }>;\n\n /** Move (rename) an object inside the same bucket. */\n move(params: StorageCopyMoveParams): Promise<{ success: true; sourcePath: string; destinationPath: string }>;\n\n /**\n * Generate a signed URL for direct client-side PUT upload (bypasses your server).\n * Use this when a website needs to upload large files directly to GCS.\n */\n getSignedUploadUrl(params: StorageSignedUploadUrlParams): Promise<StorageSignedUploadUrlResult>;\n\n /**\n * Generate a signed URL for direct client-side download.\n * Useful for serving private files without proxying through your server.\n */\n getSignedDownloadUrl(params: StorageSignedDownloadUrlParams): Promise<StorageSignedDownloadUrlResult>;\n\n /** Retrieve GCS-level settings for this bucket (CORS, versioning, storage class …). */\n getSettings(): Promise<StorageBucketSettings>;\n\n /** Update GCS-level settings for this bucket. */\n updateSettings(params: StorageUpdateBucketSettingsParams): Promise<StorageBucketSettings>;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction normalizeUploadFile(\n file: StorageUploadableFile,\n contentType?: string,\n): Blob {\n if (file instanceof Blob) return file;\n // For ArrayBuffer and typed arrays (Uint8Array etc.) copy to a plain ArrayBuffer\n // to avoid TypeScript's strict ArrayBuffer vs ArrayBufferLike mismatch.\n // Use a fresh Uint8Array copy so we always hand a plain ArrayBuffer to Blob,\n // avoiding TypeScript's SharedArrayBuffer vs ArrayBuffer incompatibility.\n const u8 = file instanceof ArrayBuffer ? new Uint8Array(file) : new Uint8Array(file);\n return new Blob([u8.buffer as ArrayBuffer], contentType ? { type: contentType } : {});\n}\n\n// ─── StorageClient ────────────────────────────────────────────────────────────\n\n/**\n * Server-side storage client — access via `ragable.storage`.\n *\n * Manages GCS-backed storage buckets for your organisation and exposes typed\n * helpers for every object-storage operation websites need for durable storage.\n *\n * ```ts\n * import { createClient } from \"@ragable/sdk\";\n *\n * const ragable = createClient({ apiKey: process.env.RAGABLE_API_KEY! });\n *\n * // ── Bucket management ───────────────────────────────────────────────────\n * const buckets = await ragable.storage.buckets.list();\n * const bucket = await ragable.storage.buckets.create(\"my-website-assets\");\n *\n * // ── Object operations (via .from()) ─────────────────────────────────────\n * const b = ragable.storage.from(bucket.id);\n *\n * await b.upload({ objectPath: \"pages/index.html\", file: htmlBlob, contentType: \"text/html\" });\n * const { text } = await b.download({ objectPath: \"pages/index.html\", asText: true });\n *\n * // ── Signed URLs for client-side direct upload/download ──────────────────\n * const { url } = await b.getSignedUploadUrl({ objectPath: \"uploads/photo.jpg\", contentType: \"image/jpeg\" });\n * ```\n */\nexport class StorageClient {\n /**\n * Bucket-level CRUD — list, create and delete buckets for this organisation.\n */\n readonly buckets: {\n /**\n * List all managed storage buckets.\n *\n * @param params Optional filter / sort params (`q`, `status`, `sort`).\n */\n list(params?: StorageListBucketsParams): Promise<StorageBucket[]>;\n\n /**\n * Create a new managed GCS bucket.\n *\n * The `name` must be lowercase alphanumeric + dashes, max 63 chars.\n */\n create(name: string): Promise<StorageBucket>;\n\n /**\n * Permanently delete a bucket and **all** its contents.\n *\n * @param bucketId The Ragable bucket ID (not the raw GCS bucket name).\n */\n delete(bucketId: string): Promise<{ success: true }>;\n };\n\n constructor(private readonly client: RagableRequestClient) {\n this.buckets = {\n list: async (params?) => {\n const qs = new URLSearchParams();\n if (params?.q) qs.set(\"q\", params.q);\n if (params?.status) qs.set(\"status\", params.status);\n if (params?.sort) qs.set(\"sort\", params.sort);\n const query = qs.toString();\n return this.client.request<StorageBucket[]>(\n `/v1/storage/buckets${query ? `?${query}` : \"\"}`,\n );\n },\n\n create: async (name) => {\n return this.client.request<StorageBucket>(\"/v1/storage/buckets\", {\n method: \"POST\",\n body: { name },\n });\n },\n\n delete: async (bucketId) => {\n return this.client.request<{ success: true }>(\n `/v1/storage/buckets/${encodeURIComponent(bucketId)}`,\n { method: \"DELETE\" },\n );\n },\n };\n }\n\n /**\n * Returns a {@link StorageBucketClient} scoped to the given bucket ID.\n *\n * All object operations (upload, download, list, copy, move, signed URLs, …)\n * are performed through the returned client.\n *\n * @param bucketId The Ragable bucket ID obtained from `buckets.list()` or `buckets.create()`.\n */\n from(bucketId: string): StorageBucketClient {\n const { client } = this;\n const base = `/v1/storage/buckets/${encodeURIComponent(bucketId)}`;\n\n return {\n list: async (params?) => {\n const qs = new URLSearchParams();\n if (params?.prefix) qs.set(\"prefix\", params.prefix);\n if (params?.delimiter) qs.set(\"delimiter\", params.delimiter);\n if (params?.maxResults != null)\n qs.set(\"maxResults\", String(params.maxResults));\n if (params?.pageToken) qs.set(\"pageToken\", params.pageToken);\n const query = qs.toString();\n return client.request<StorageListContentsResult>(\n `${base}/contents${query ? `?${query}` : \"\"}`,\n );\n },\n\n createFolder: async (folderPath) => {\n return client.request<{ success: true; folderPath: string }>(\n `${base}/folders`,\n { method: \"POST\", body: { folderPath } },\n );\n },\n\n deleteFolder: async (folderPath) => {\n return client.request<{ success: true; folderPath: string }>(\n `${base}/folders`,\n { method: \"DELETE\", body: { folderPath } },\n );\n },\n\n upload: async (params) => {\n const formData = new FormData();\n const blob = normalizeUploadFile(params.file, params.contentType);\n const fileName = params.fileName ?? \"upload\";\n formData.set(\"file\", blob, fileName);\n formData.set(\"objectPath\", params.objectPath);\n if (params.cacheControl) {\n formData.set(\"cacheControl\", params.cacheControl);\n }\n return client.request<StorageUploadResult>(`${base}/upload`, {\n method: \"POST\",\n body: formData,\n });\n },\n\n delete: async (objectPath) => {\n return client.request<{ success: true; path: string }>(\n `${base}/objects`,\n { method: \"DELETE\", body: { objectPath } },\n );\n },\n\n bulkDelete: async (objectPaths) => {\n return client.request<StorageBulkDeleteResult>(\n `${base}/objects/delete-bulk`,\n { method: \"POST\", body: { objectPaths } },\n );\n },\n\n getMetadata: async (objectPath) => {\n const qs = new URLSearchParams({ objectPath });\n return client.request<StorageObjectMetadata>(\n `${base}/objects/metadata?${qs}`,\n );\n },\n\n updateMetadata: async (params) => {\n return client.request<StorageObjectMetadata>(\n `${base}/objects/metadata`,\n { method: \"PATCH\", body: params },\n );\n },\n\n download: async (params) => {\n const qs = new URLSearchParams({ objectPath: params.objectPath });\n if (params.asText != null) qs.set(\"asText\", String(params.asText));\n if (params.maxTextBytes != null)\n qs.set(\"maxTextBytes\", String(params.maxTextBytes));\n return client.request<StorageDownloadResult>(\n `${base}/objects/download?${qs}`,\n );\n },\n\n copy: async (params) => {\n return client.request<{\n success: true;\n sourcePath: string;\n destinationPath: string;\n }>(`${base}/objects/copy`, { method: \"POST\", body: params });\n },\n\n move: async (params) => {\n return client.request<{\n success: true;\n sourcePath: string;\n destinationPath: string;\n }>(`${base}/objects/move`, { method: \"POST\", body: params });\n },\n\n getSignedUploadUrl: async (params) => {\n return client.request<StorageSignedUploadUrlResult>(\n `${base}/signed-upload-url`,\n { method: \"POST\", body: params },\n );\n },\n\n getSignedDownloadUrl: async (params) => {\n const qs = new URLSearchParams({ objectPath: params.objectPath });\n if (params.expiresInSeconds != null)\n qs.set(\"expiresInSeconds\", String(params.expiresInSeconds));\n return client.request<StorageSignedDownloadUrlResult>(\n `${base}/signed-download-url?${qs}`,\n );\n },\n\n getSettings: async () => {\n return client.request<StorageBucketSettings>(`${base}/settings`);\n },\n\n updateSettings: async (params) => {\n return client.request<StorageBucketSettings>(`${base}/settings`, {\n method: \"PATCH\",\n body: params,\n });\n },\n };\n }\n}\n","export type {\r\n ColumnName,\r\n ColumnValue,\r\n DefaultRagableDatabase,\r\n Json,\r\n RagableDatabase,\r\n RagableTableDefinition,\r\n RagableTableNames,\r\n TableInsertRow,\r\n TableRow,\r\n TableUpdatePatch,\r\n Tables,\r\n TablesInsert,\r\n TablesUpdate,\r\n} from \"./database-schema\";\r\n\r\nexport type { RagableClientOptions, RequestOptions } from \"./request-client\";\r\nexport {\r\n bindFetch,\r\n DEFAULT_RAGABLE_API_BASE,\r\n extractErrorMessage,\r\n formatSdkError,\r\n formatPostgrestError,\r\n RagableAbortError,\r\n RagableError,\r\n RagableNetworkError,\r\n RagableSdkError,\r\n RagableTimeoutError,\r\n RagableRequestClient,\r\n} from \"./request-client\";\r\n\r\nexport type {\r\n ShiftAddDocumentParams,\r\n ShiftCreateIndexParams,\r\n ShiftEntry,\r\n ShiftIndex,\r\n ShiftIngestResponse,\r\n ShiftListEntriesParams,\r\n ShiftListEntriesResponse,\r\n ShiftSearchParams,\r\n ShiftSearchResult,\r\n ShiftUpdateIndexParams,\r\n ShiftUploadableFile,\r\n ShiftUploadFileParams,\r\n} from \"./shift\";\r\nexport { ShiftClient } from \"./shift\";\r\n\r\nexport type {\r\n AgentChatMessage,\r\n AgentChatParams,\r\n AgentChatResult,\r\n AgentStreamEvent,\r\n AgentSummary,\r\n} from \"./agents\";\r\nexport { AgentsClient } from \"./agents\";\r\n\r\nexport type {\r\n AgentChatStreamDonePayload,\r\n AgentChatStreamHandlers,\r\n AgentChatStreamResult,\r\n AgentStreamAgentInfoEvent,\r\n RunAgentChatStreamOptions,\r\n} from \"./agent-stream\";\r\nexport {\r\n isIncompleteAgentStreamError,\r\n parseAgentStreamAgentInfo,\r\n parseAgentStreamDone,\r\n runAgentChatStream,\r\n runAgentChatStreamLenient,\r\n} from \"./agent-stream\";\r\n\r\nexport type {\r\n AgentChatStreamUiHandlers,\r\n AgentChatUiAssistantMessage,\r\n AgentChatUiSegment,\r\n AgentChatUiStreamResult,\r\n} from \"./agent-chat-ui\";\r\nexport {\r\n collectAssistantTextFromUiSegments,\r\n finalizeAgentChatUiTurn,\r\n foldAgentStreamIntoUiSegments,\r\n runAgentChatStreamForUi,\r\n} from \"./agent-chat-ui\";\r\n\r\nexport type {\r\n AgentPublicChatParams,\r\n AgentConversation,\r\n AgentConversationMessage,\r\n AgentConversationSubscription,\r\n BrowserAuthSession,\r\n BrowserAuthTokens,\r\n BrowserCollectionApi,\r\n BrowserCollectionDefinition,\r\n BrowserCollectionFactory,\r\n BrowserCollectionFindParams,\r\n BrowserCollectionRecord,\r\n BrowserCollections,\r\n CollectionReturnMode,\r\n CollectionRowData,\r\n CollectionRowWithMeta,\r\n CollectionWhere,\r\n BrowserDataAuthMode,\r\n BrowserRealtimeNotification,\r\n BrowserRealtimeStatus,\r\n BrowserRealtimeSubscribeParams,\r\n BrowserRealtimeSubscription,\r\n BrowserSqlQueryParams,\r\n BrowserSqlQueryResult,\r\n PostgrestResult,\r\n RagableBrowserClientOptions,\r\n SupabaseCompatSession,\r\n WhereInput,\r\n WhereOperatorObject,\r\n} from \"./browser\";\r\nexport {\r\n assertPostgrestSuccess,\r\n collectionRecordToRowWithMeta,\r\n collectionRecordsToRowWithMeta,\r\n createBrowserClient,\r\n createRagableBrowserClient,\r\n effectiveDataAuth,\r\n normalizeBrowserApiBase,\r\n RagableBrowser,\r\n RagableBrowserAgentsClient,\r\n RagableBrowserAuthClient,\r\n RagableBrowserDatabaseClient,\r\n toRagableResult,\r\n unwrapPostgrest,\r\n} from \"./browser\";\r\n\r\nexport type {\r\n BrowserSqlExecParams,\r\n BrowserSqlExecResult,\r\n PostgRESTFetch,\r\n PostgRESTFetchParams,\r\n PostgrestUpsertOptions,\r\n RunQuery,\r\n} from \"./browser-postgrest\";\r\nexport type { RagableResult } from \"./browser-postgrest\";\r\nexport {\r\n asPostgrestResponse,\r\n PostgrestDeleteReturningBuilder,\r\n PostgrestDeleteRootBuilder,\r\n PostgrestInsertReturningBuilder,\r\n PostgrestInsertRootBuilder,\r\n PostgrestInsertSdkErrorReturning,\r\n PostgrestInsertSdkErrorRoot,\r\n PostgrestSelectBuilder,\r\n PostgrestTableApi,\r\n PostgrestUpdateReturningBuilder,\r\n PostgrestUpdateRootBuilder,\r\n PostgrestUpsertReturningBuilder,\r\n PostgrestUpsertRootBuilder,\r\n} from \"./browser-postgrest\";\r\n\r\nexport type { SseJsonEvent } from \"./sse\";\r\nexport { parseSseDataLine, readSseStream } from \"./sse\";\r\n\r\nexport type {\r\n FormatContextOptions,\r\n RagClientForPipeline,\r\n RagPipeline,\r\n RagPipelineOptions,\r\n RetrieveParams,\r\n} from \"./rag\";\r\nexport { createRagPipeline, formatRetrievalContext } from \"./rag\";\r\n\r\nexport type {\r\n StorageBucket,\r\n StorageBucketClient,\r\n StorageBucketCorsEntry,\r\n StorageBucketItem,\r\n StorageBucketSettings,\r\n StorageBulkDeleteResult,\r\n StorageCopyMoveParams,\r\n StorageDownloadParams,\r\n StorageDownloadResult,\r\n StorageListBucketsParams,\r\n StorageListContentsParams,\r\n StorageListContentsResult,\r\n StorageObjectMetadata,\r\n StorageSignedDownloadUrlParams,\r\n StorageSignedDownloadUrlResult,\r\n StorageSignedUploadUrlParams,\r\n StorageSignedUploadUrlResult,\r\n StorageUpdateBucketSettingsParams,\r\n StorageUpdateMetadataParams,\r\n StorageUploadableFile,\r\n StorageUploadParams,\r\n StorageUploadResult,\r\n} from \"./storage\";\r\nexport { StorageClient } from \"./storage\";\r\n\r\n// ─── New modules ─────────────────────────────────────────────────────────────\r\n\r\nexport type {\r\n HttpMethod,\r\n RetryOptions,\r\n TransportOptions,\r\n TransportRequest,\r\n} from \"./transport\";\r\nexport { generateIdempotencyKey, Transport, parseTransportResponse } from \"./transport\";\r\n\r\nexport type {\r\n SessionStorage,\r\n AuthBroadcastMessage,\r\n} from \"./auth-storage\";\r\nexport {\r\n AuthBroadcastChannel,\r\n CookieStorageAdapter,\r\n detectStorage,\r\n LocalStorageAdapter,\r\n MemoryStorageAdapter,\r\n SessionStorageAdapter,\r\n} from \"./auth-storage\";\r\n\r\nexport type {\r\n AuthChangeEvent,\r\n AuthSignUpCredentials,\r\n AuthOptions,\r\n AuthSession,\r\n AuthUpdateUserAttributes,\r\n AuthUserMetadata,\r\n DefaultAuthUser,\r\n RagableAuthConfig,\r\n} from \"./auth\";\r\nexport { RagableAuth } from \"./auth\";\r\n\r\n// ─── Top-level client classes ────────────────────────────────────────────────\r\n\r\nimport { AgentsClient } from \"./agents\";\r\nimport {\r\n createBrowserClient,\r\n RagableBrowser,\r\n type RagableBrowserClientOptions,\r\n} from \"./browser\";\r\nimport type { DefaultAuthUser } from \"./auth\";\r\nimport type { DefaultRagableDatabase, RagableDatabase } from \"./database-schema\";\r\nimport {\r\n RagableRequestClient,\r\n type RagableClientOptions,\r\n} from \"./request-client\";\r\nimport { ShiftClient } from \"./shift\";\r\nimport { StorageClient } from \"./storage\";\r\n\r\nexport class Ragable {\r\n readonly shift: ShiftClient;\r\n readonly agents: AgentsClient;\r\n readonly storage: StorageClient;\r\n readonly infrastructure: {\r\n shift: ShiftClient;\r\n };\r\n\r\n constructor(options: RagableClientOptions) {\r\n const client = new RagableRequestClient(options);\r\n this.shift = new ShiftClient(client);\r\n this.agents = new AgentsClient(client);\r\n this.storage = new StorageClient(client);\r\n this.infrastructure = {\r\n shift: this.shift,\r\n };\r\n }\r\n}\r\n\r\nfunction isServerClientOptions(o: unknown): o is RagableClientOptions {\r\n return (\r\n typeof o === \"object\" &&\r\n o !== null &&\r\n \"apiKey\" in o &&\r\n typeof (o as RagableClientOptions).apiKey === \"string\" &&\r\n (o as RagableClientOptions).apiKey.length > 0\r\n );\r\n}\r\n\r\nexport function createClient(options: RagableClientOptions): Ragable;\r\nexport function createClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser>;\r\nexport function createClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n>(\r\n options: RagableClientOptions | RagableBrowserClientOptions,\r\n): Ragable | RagableBrowser<Database, AuthUser> {\r\n if (isServerClientOptions(options)) {\r\n if (\r\n typeof options === \"object\" &&\r\n options !== null &&\r\n \"organizationId\" in options &&\r\n typeof (options as RagableBrowserClientOptions).organizationId === \"string\"\r\n ) {\r\n console.warn(\r\n \"[@ragable/sdk] createClient: `apiKey` is set, so the server client is returned. \" +\r\n \"It has no `database` or `auth` — only `agents` and `shift`. \" +\r\n \"For `db.collections.<name>` / `database.from()` / `auth.*`, use the browser client without `apiKey` \" +\r\n \"(e.g. createClient({ organizationId, authGroupId, databaseInstanceId, ... })).\",\r\n );\r\n }\r\n return new Ragable(options);\r\n }\r\n if (\r\n typeof options === \"object\" &&\r\n options !== null &&\r\n \"organizationId\" in options &&\r\n typeof (options as RagableBrowserClientOptions).organizationId === \"string\"\r\n ) {\r\n return createBrowserClient<Database, AuthUser>(\r\n options as RagableBrowserClientOptions,\r\n );\r\n }\r\n throw new Error(\r\n \"createClient(options) requires apiKey (server) or organizationId (browser)\",\r\n );\r\n}\r\n\r\nexport function createRagableServerClient(options: RagableClientOptions) {\r\n return new Ragable(options);\r\n}\r\n"],"mappings":"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","names":["asString","asNumber","assertAborted","normalizeUploadFile"]}
|
|
1
|
+
{"version":3,"sources":["../src/request-client.ts","../src/agent-stream.ts","../src/agent-chat-ui.ts","../src/sse.ts","../src/transport.ts","../src/browser-postgrest.ts","../src/auth-storage.ts","../src/auth.ts","../src/stream-parts.ts","../src/ai.ts","../src/browser.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Native `fetch` must not be called as a detached reference (`const f = fetch; f(url)`),\r\n * or the browser throws **Illegal invocation**. Use this for defaults and for `options.fetch`.\r\n */\r\nexport function bindFetch(custom?: typeof fetch): typeof fetch {\r\n return (input, init) => {\r\n const f = custom ?? globalThis.fetch;\r\n return f.call(globalThis, input as RequestInfo, init);\r\n };\r\n}\r\n\r\n/** Hosted Ragable HTTP API base (`…/api`) — used by all SDK clients (not configurable). */\r\nexport const DEFAULT_RAGABLE_API_BASE =\r\n \"https://ragable-341305259977.asia-southeast1.run.app/api\";\r\n\r\nexport interface RagableClientOptions {\r\n apiKey: string;\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n}\r\n\r\nexport type RequestOptions = Omit<RequestInit, \"body\"> & {\r\n body?: unknown;\r\n};\r\n\r\nexport abstract class RagableSdkError extends Error {\r\n abstract readonly __type: string;\r\n constructor(message: string) {\r\n super(message);\r\n this.name = this.constructor.name;\r\n // Native `Error.message` is non-enumerable — `{...err}`, `JSON.stringify({...err})`, and some\r\n // loggers show `{}`. Redefine so spreads and plain serialization keep `message`.\r\n Object.defineProperty(this, \"message\", {\r\n configurable: true,\r\n enumerable: true,\r\n writable: true,\r\n value: message,\r\n });\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n __type: this.__type,\r\n };\r\n }\r\n}\r\n\r\nexport class RagableError extends RagableSdkError {\r\n readonly __type = \"RagableError\" as const;\r\n readonly status: number;\r\n readonly body: unknown;\r\n readonly code: string | undefined;\r\n readonly details: string | undefined;\r\n\r\n constructor(message: string, status: number, body: unknown) {\r\n super(message);\r\n this.status = status;\r\n this.body = body;\r\n this.code =\r\n body && typeof body === \"object\"\r\n ? typeof (body as Record<string, unknown>).code === \"string\"\r\n ? ((body as Record<string, unknown>).code as string)\r\n : typeof (body as Record<string, unknown>).code === \"number\"\r\n ? String((body as Record<string, unknown>).code)\r\n : undefined\r\n : undefined;\r\n this.details =\r\n body && typeof body === \"object\"\r\n ? typeof (body as Record<string, unknown>).details === \"string\"\r\n ? ((body as Record<string, unknown>).details as string)\r\n : undefined\r\n : undefined;\r\n }\r\n\r\n override toJSON(): Record<string, unknown> {\r\n return {\r\n ...super.toJSON(),\r\n status: this.status,\r\n body: this.body,\r\n code: this.code,\r\n details: this.details,\r\n };\r\n }\r\n\r\n /** Stable string for logs — avoids `{}` when coercing or stringifying. */\r\n override toString(): string {\r\n const bits = [`${this.name}: ${this.message}`];\r\n if (this.status) bits.push(`status=${this.status}`);\r\n if (this.code) bits.push(`code=${this.code}`);\r\n return bits.join(\" · \");\r\n }\r\n}\r\n\r\n/** Safe one-line log for any thrown value (catch blocks, TanStack Query). */\r\nexport function formatSdkError(err: unknown): string {\r\n if (err instanceof RagableError) {\r\n return `${err.message} (HTTP ${err.status}${err.code ? `, ${err.code}` : \"\"})`;\r\n }\r\n if (err instanceof RagableSdkError) {\r\n return err.message;\r\n }\r\n if (err instanceof Error) {\r\n return err.message || err.name;\r\n }\r\n if (typeof err === \"string\") return err;\r\n if (err && typeof err === \"object\") {\r\n try {\r\n const s = JSON.stringify(err);\r\n if (s !== \"{}\") return s;\r\n return \"Unknown error (empty object — avoid `{...error}` spread; use error.message or formatSdkError)\";\r\n } catch {\r\n /* fall through */\r\n }\r\n }\r\n return String(err);\r\n}\r\n\r\n/**\r\n * Human-readable line for a PostgREST `{ data, error }` error (or any thrown value).\r\n * Use in UI instead of `JSON.stringify(error)` or template strings on unknown errors.\r\n */\r\nexport function formatPostgrestError(error: unknown): string {\r\n return formatSdkError(error);\r\n}\r\n\r\nexport class RagableNetworkError extends RagableSdkError {\r\n readonly __type = \"RagableNetworkError\" as const;\r\n readonly cause: unknown;\r\n constructor(message: string, cause?: unknown) {\r\n super(message);\r\n this.cause = cause;\r\n }\r\n\r\n override toJSON(): Record<string, unknown> {\r\n return {\r\n ...super.toJSON(),\r\n cause: this.cause instanceof Error ? this.cause.message : this.cause,\r\n };\r\n }\r\n}\r\n\r\nexport class RagableAbortError extends RagableSdkError {\r\n readonly __type = \"RagableAbortError\" as const;\r\n constructor(message = \"Request aborted\") {\r\n super(message);\r\n }\r\n}\r\n\r\nexport class RagableTimeoutError extends RagableSdkError {\r\n readonly __type = \"RagableTimeoutError\" as const;\r\n readonly timeoutMs: number;\r\n constructor(timeoutMs: number) {\r\n super(`Request timed out after ${timeoutMs}ms`);\r\n this.timeoutMs = timeoutMs;\r\n }\r\n\r\n override toJSON(): Record<string, unknown> {\r\n return {\r\n ...super.toJSON(),\r\n timeoutMs: this.timeoutMs,\r\n };\r\n }\r\n}\r\n\r\nexport function extractErrorMessage(payload: unknown, fallback: string) {\r\n if (payload && typeof payload === \"object\") {\r\n if (\"error\" in payload && typeof payload.error === \"string\") {\r\n return payload.error;\r\n }\r\n if (\"message\" in payload && typeof payload.message === \"string\") {\r\n return payload.message;\r\n }\r\n }\r\n\r\n if (typeof payload === \"string\" && payload.length > 0) {\r\n return payload;\r\n }\r\n\r\n return fallback || \"Request failed\";\r\n}\r\n\r\nexport class RagableRequestClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultHeaders: HeadersInit | undefined;\r\n\r\n constructor(options: RagableClientOptions) {\r\n this.apiKey = options.apiKey;\r\n this.baseUrl = DEFAULT_RAGABLE_API_BASE.replace(/\\/+$/, \"\");\r\n this.fetchImpl = bindFetch(options.fetch);\r\n this.defaultHeaders = options.headers;\r\n }\r\n\r\n toUrl(path: string) {\r\n const normalizedBase = this.baseUrl.replace(/\\/+$/, \"\");\r\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${normalizedBase}${normalizedPath}`;\r\n }\r\n\r\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\r\n const response = await this.rawFetch(path, options);\r\n const payload = await this.parseResponseBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n return payload as T;\r\n }\r\n\r\n /**\r\n * Low-level fetch with API key and JSON body encoding. Caller handles status and body.\r\n */\r\n async rawFetch(path: string, options: RequestOptions = {}): Promise<Response> {\r\n const headers = new Headers(this.defaultHeaders);\r\n headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\r\n\r\n let body = options.body;\r\n if (body !== undefined && !isBodyInit(body)) {\r\n headers.set(\"Content-Type\", \"application/json\");\r\n body = JSON.stringify(body);\r\n }\r\n\r\n return this.fetchImpl(this.toUrl(path), {\r\n ...options,\r\n headers,\r\n body: body as BodyInit | undefined,\r\n });\r\n }\r\n\r\n private async parseResponseBody(response: Response): Promise<unknown> {\r\n if (response.status === 204) {\r\n return null;\r\n }\r\n\r\n const contentType = response.headers.get(\"content-type\") ?? \"\";\r\n if (contentType.includes(\"application/json\")) {\r\n return response.json();\r\n }\r\n\r\n return response.text();\r\n }\r\n}\r\n\r\nexport function isBodyInit(value: unknown): value is BodyInit {\r\n return (\r\n typeof value === \"string\" ||\r\n value instanceof Blob ||\r\n value instanceof FormData ||\r\n value instanceof URLSearchParams ||\r\n value instanceof ArrayBuffer ||\r\n ArrayBuffer.isView(value)\r\n );\r\n}\r\n","import { RagableAbortError, RagableError } from \"./request-client\";\n\nexport interface AgentChatMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AgentChatParams {\n message: string;\n history?: AgentChatMessage[];\n /** Passed to `fetch` — aborts the HTTP request and SSE body. */\n signal?: AbortSignal;\n}\n\nexport type AgentStreamEvent = Record<string, unknown> & { type: string };\n\n/**\n * First SSE frame for website project agents (`POST …/agents/:name/chat/stream`).\n */\nexport interface AgentStreamAgentInfoEvent {\n type: \"agent:info\";\n name: string;\n agent_name: string;\n}\n\n/** Payload on the terminal `done` event (matches backend {@link AgentChatResult} + usage fields). */\nexport interface AgentChatStreamDonePayload {\n response: string;\n traces: unknown[];\n totalDurationMs: number;\n httpResponse?: unknown;\n inputTokens?: number;\n outputTokens?: number;\n cachedPromptTokens?: number;\n cacheCreationInputTokens?: number;\n completionProviders?: string[];\n creditsCharged?: number;\n agentSteps?: number;\n finishReason?: string | null;\n stopReason?: string | null;\n turnMessages?: unknown;\n promptTokensEstimated?: number;\n contextWindow?: number;\n}\n\n/**\n * Resolved outcome after the stream finishes. `assistantText` is the concatenation of\n * all `token` deltas; `response` is the server’s final string from `done` (authoritative).\n */\nexport interface AgentChatStreamResult extends AgentChatStreamDonePayload {\n assistantText: string;\n reasoningText: string;\n}\n\nexport interface AgentChatStreamHandlers {\n /** Every parsed SSE object (including `ping`, `node:*`, etc.). */\n onEvent?: (event: AgentStreamEvent) => void;\n onAgentInfo?: (info: AgentStreamAgentInfoEvent) => void;\n onToken?: (token: string, ctx: { nodeId: string }) => void;\n onReasoningToken?: (token: string, ctx: { nodeId: string }) => void;\n onToolCall?: (ctx: {\n nodeId: string;\n toolName: string;\n args: unknown;\n }) => void;\n onToolArgsUpdate?: (ctx: {\n nodeId: string;\n args: Record<string, unknown>;\n }) => void;\n onToolResult?: (ctx: {\n nodeId: string;\n toolName: string;\n durationMs: number;\n result?: string;\n }) => void;\n onNodeStart?: (ctx: {\n nodeId: string;\n nodeType: string;\n label: string;\n }) => void;\n onNodeComplete?: (ctx: {\n nodeId: string;\n output: unknown;\n durationMs: number;\n }) => void;\n onNodeError?: (ctx: { nodeId: string; error: string }) => void;\n /** Backend heartbeat — safe to ignore in UI. */\n onPing?: () => void;\n /** Fired when the server emits `done` (before {@link onComplete}). */\n onDone?: (payload: AgentChatStreamDonePayload) => void;\n /**\n * Always called on successful completion (after `done`). Not called if the stream\n * errors or ends without `done`.\n */\n onComplete?: (result: AgentChatStreamResult) => void;\n onError?: (error: unknown) => void;\n}\n\nexport interface RunAgentChatStreamOptions {\n /**\n * Abort while consuming events (in addition to any `signal` on the HTTP request).\n * Stops reading and throws {@link RagableAbortError}.\n */\n signal?: AbortSignal;\n}\n\nfunction assertAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new RagableAbortError();\n }\n}\n\nfunction asString(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction asNumber(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction asUnknownArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\n/** Narrow `done` events from a loose {@link AgentStreamEvent}. */\nexport function parseAgentStreamDone(\n e: AgentStreamEvent,\n): AgentChatStreamDonePayload | null {\n if (e.type !== \"done\") return null;\n return {\n response: asString(e[\"response\"]),\n traces: asUnknownArray(e[\"traces\"]),\n totalDurationMs: asNumber(e[\"totalDurationMs\"]),\n ...(e[\"httpResponse\"] !== undefined\n ? { httpResponse: e[\"httpResponse\"] }\n : {}),\n ...(typeof e[\"inputTokens\"] === \"number\"\n ? { inputTokens: e[\"inputTokens\"] }\n : {}),\n ...(typeof e[\"outputTokens\"] === \"number\"\n ? { outputTokens: e[\"outputTokens\"] }\n : {}),\n ...(typeof e[\"cachedPromptTokens\"] === \"number\"\n ? { cachedPromptTokens: e[\"cachedPromptTokens\"] }\n : {}),\n ...(typeof e[\"cacheCreationInputTokens\"] === \"number\"\n ? { cacheCreationInputTokens: e[\"cacheCreationInputTokens\"] }\n : {}),\n ...(Array.isArray(e[\"completionProviders\"])\n ? {\n completionProviders: e[\"completionProviders\"].map((x: unknown) => String(x)),\n }\n : {}),\n ...(typeof e[\"creditsCharged\"] === \"number\"\n ? { creditsCharged: e[\"creditsCharged\"] }\n : {}),\n ...(typeof e[\"agentSteps\"] === \"number\"\n ? { agentSteps: e[\"agentSteps\"] }\n : {}),\n ...(e[\"finishReason\"] !== undefined\n ? { finishReason: e[\"finishReason\"] as string | null }\n : {}),\n ...(e[\"stopReason\"] !== undefined\n ? { stopReason: e[\"stopReason\"] as string | null }\n : {}),\n ...(e[\"turnMessages\"] !== undefined\n ? { turnMessages: e[\"turnMessages\"] }\n : {}),\n ...(typeof e[\"promptTokensEstimated\"] === \"number\"\n ? { promptTokensEstimated: e[\"promptTokensEstimated\"] }\n : {}),\n ...(typeof e[\"contextWindow\"] === \"number\"\n ? { contextWindow: e[\"contextWindow\"] }\n : {}),\n };\n}\n\n/** @public Parse the initial `agent:info` SSE frame (website project agents). */\nexport function parseAgentStreamAgentInfo(\n e: AgentStreamEvent,\n): AgentStreamAgentInfoEvent | null {\n if (e.type !== \"agent:info\") return null;\n return {\n type: \"agent:info\",\n name: asString(e[\"name\"]),\n agent_name: asString(e[\"agent_name\"]),\n };\n}\n\nfunction parseAgentInfo(\n e: AgentStreamEvent,\n): AgentStreamAgentInfoEvent | null {\n return parseAgentStreamAgentInfo(e);\n}\n\n/**\n * Consume a Ragable agent SSE stream with callbacks and return the final result.\n *\n * For the same segment model as dashboard `AgentChat` (`streamingSegments` /\n * `streamingContent`), use {@link runAgentChatStreamForUi} or\n * `client.agents.runChatUiByName` instead.\n *\n * Typical low-level chat (string accumulation only):\n *\n * ```ts\n * const result = await client.agents.runChatStreamByName(\"support\", {\n * message: input,\n * history,\n * signal: ac.signal,\n * }, {\n * onToken: (t) => setReply((s) => s + t),\n * });\n * ```\n *\n * Lower-level (same client, manual iterator):\n *\n * ```ts\n * const result = await runAgentChatStream(\n * client.agents.chatStreamByName(\"support\", { message, signal }),\n * { onToken: (t) => append(t) },\n * { signal },\n * );\n * ```\n */\nexport async function runAgentChatStream(\n source: AsyncIterable<AgentStreamEvent>,\n handlers: AgentChatStreamHandlers = {},\n options: RunAgentChatStreamOptions = {},\n): Promise<AgentChatStreamResult> {\n const { signal } = options;\n let assistantText = \"\";\n let reasoningText = \"\";\n let donePayload: AgentChatStreamDonePayload | null = null;\n\n try {\n for await (const event of source) {\n assertAborted(signal);\n handlers.onEvent?.(event);\n\n const info = parseAgentInfo(event);\n if (info) {\n handlers.onAgentInfo?.(info);\n continue;\n }\n\n switch (event.type) {\n case \"ping\":\n handlers.onPing?.();\n break;\n case \"token\": {\n const nodeId = asString(event[\"nodeId\"], \"__self__\");\n const token = asString(event[\"token\"]);\n assistantText += token;\n handlers.onToken?.(token, { nodeId });\n break;\n }\n case \"reasoning_token\": {\n const nodeId = asString(event[\"nodeId\"], \"__self__\");\n const token = asString(event[\"token\"]);\n reasoningText += token;\n handlers.onReasoningToken?.(token, { nodeId });\n break;\n }\n case \"tool:call\":\n handlers.onToolCall?.({\n nodeId: asString(event[\"nodeId\"]),\n toolName: asString(event[\"toolName\"]),\n args: event[\"args\"],\n });\n break;\n case \"tool:args_update\": {\n const raw = event[\"args\"];\n const args =\n raw !== null && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n handlers.onToolArgsUpdate?.({\n nodeId: asString(event[\"nodeId\"]),\n args,\n });\n break;\n }\n case \"tool:result\":\n handlers.onToolResult?.({\n nodeId: asString(event[\"nodeId\"]),\n toolName: asString(event[\"toolName\"]),\n durationMs: asNumber(event[\"durationMs\"]),\n ...(typeof event[\"result\"] === \"string\"\n ? { result: event[\"result\"] }\n : {}),\n });\n break;\n case \"node:start\":\n handlers.onNodeStart?.({\n nodeId: asString(event[\"nodeId\"]),\n nodeType: asString(event[\"nodeType\"]),\n label: asString(event[\"label\"]),\n });\n break;\n case \"node:complete\":\n handlers.onNodeComplete?.({\n nodeId: asString(event[\"nodeId\"]),\n output: event[\"output\"],\n durationMs: asNumber(event[\"durationMs\"]),\n });\n break;\n case \"node:error\":\n handlers.onNodeError?.({\n nodeId: asString(event[\"nodeId\"]),\n error: asString(event[\"error\"]),\n });\n break;\n case \"done\": {\n const parsed = parseAgentStreamDone(event);\n if (parsed) {\n donePayload = parsed;\n handlers.onDone?.(parsed);\n }\n break;\n }\n default:\n break;\n }\n }\n } catch (err) {\n handlers.onError?.(err);\n throw err;\n }\n\n if (!donePayload) {\n const err = new RagableError(\n \"Agent stream ended without a done event\",\n 502,\n { code: \"SDK_AGENT_STREAM_INCOMPLETE\" },\n );\n handlers.onError?.(err);\n throw err;\n }\n\n const result: AgentChatStreamResult = {\n ...donePayload,\n assistantText,\n reasoningText,\n };\n handlers.onComplete?.(result);\n return result;\n}\n\n/**\n * Like {@link runAgentChatStream} but resolves with `null` if the stream ends without `done`\n * instead of throwing. Errors other than incomplete stream are still thrown.\n */\nexport async function runAgentChatStreamLenient(\n source: AsyncIterable<AgentStreamEvent>,\n handlers: AgentChatStreamHandlers = {},\n options: RunAgentChatStreamOptions = {},\n): Promise<AgentChatStreamResult | null> {\n try {\n return await runAgentChatStream(source, handlers, options);\n } catch (e) {\n if (\n e instanceof RagableError &&\n e.code === \"SDK_AGENT_STREAM_INCOMPLETE\"\n ) {\n return null;\n }\n throw e;\n }\n}\n\n/** True when {@link runAgentChatStream} stopped because no `done` event arrived. */\nexport function isIncompleteAgentStreamError(e: unknown): boolean {\n return e instanceof RagableError && e.code === \"SDK_AGENT_STREAM_INCOMPLETE\";\n}\n","/**\n * UI-oriented agent streaming — folds wire events into the same segment model as\n * `app/web/src/components/AgentChat.tsx` (`StreamSegment`), matching the reducers in\n * `useEngineIDEAgent` / `useIDEAgent` (tool gating, coalesced text/reasoning, etc.).\n */\n\nimport type { AgentStreamEvent } from \"./agent-stream\";\nimport type {\n AgentChatStreamDonePayload,\n AgentStreamAgentInfoEvent,\n RunAgentChatStreamOptions,\n} from \"./agent-stream\";\nimport {\n parseAgentStreamAgentInfo,\n parseAgentStreamDone,\n} from \"./agent-stream\";\nimport { RagableAbortError, RagableError } from \"./request-client\";\n\n/**\n * Chat UI segments — structural parity with `StreamSegment` in dashboard `AgentChat`.\n */\nexport type AgentChatUiSegment =\n | { type: \"text\"; content: string }\n | { type: \"reasoning\"; content: string }\n | {\n type: \"tool\";\n id: string;\n toolName: string;\n status: \"started\" | \"completed\";\n durationMs?: number;\n args?: Record<string, unknown>;\n result?: string;\n }\n | {\n type: \"context_summarized\";\n step: number;\n mode?: \"llm\" | \"heuristic\" | \"llm+heuristic\" | \"aggressive\";\n reason?: \"soft_limit\" | \"forced\";\n tokensRemovedEstimate?: number;\n estimatedTokensAfter?: number;\n }\n | {\n type: \"llm_step\";\n step: number;\n inputTokens: number;\n outputTokens: number;\n cachedPromptTokens?: number;\n cacheCreationInputTokens?: number;\n creditsEstimated: number;\n apiCostUsd?: number;\n provider?: string;\n }\n | { type: \"stop_reason\"; content: string; finishReason: string };\n\n/** Assistant row to append to chat history (add your own `id`). */\nexport interface AgentChatUiAssistantMessage {\n role: \"ai\";\n content: string;\n segments?: AgentChatUiSegment[];\n usage?: {\n inputTokens: number;\n outputTokens: number;\n creditsCharged: number;\n cachedPromptTokens?: number;\n cacheCreationInputTokens?: number;\n };\n durationMs?: number;\n finishReason?: string | null;\n completionProviders?: string[];\n agentSteps?: number;\n}\n\nexport interface AgentChatUiStreamResult {\n /** Segments immediately before `done` (no trailing `stop_reason`). */\n segmentsMidTurn: AgentChatUiSegment[];\n /** Final segments including optional `stop_reason` from `done`. */\n segments: AgentChatUiSegment[];\n /** Persisted assistant message — matches dashboard `ChatMessageData` for `ai` (except `id`). */\n message: AgentChatUiAssistantMessage;\n done: AgentChatStreamDonePayload;\n}\n\nexport interface AgentChatStreamUiHandlers {\n /**\n * Live segment list — pass to `AgentChat` as `streamingSegments` (or your own renderer).\n */\n onSegments?: (segments: AgentChatUiSegment[]) => void;\n /**\n * Plain assistant text — mirrors dashboard `streamingContent` (text channel only).\n */\n onStreamingText?: (text: string) => void;\n onAgentInfo?: (info: AgentStreamAgentInfoEvent) => void;\n onEvent?: (event: AgentStreamEvent) => void;\n onDone?: (payload: AgentChatStreamDonePayload) => void;\n onComplete?: (result: AgentChatUiStreamResult) => void;\n onError?: (error: unknown) => void;\n}\n\nfunction asString(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction asNumber(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction assertAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new RagableAbortError();\n }\n}\n\nfunction recordFromUnknown(v: unknown): Record<string, unknown> {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n return { ...(v as Record<string, unknown>) };\n }\n return {};\n}\n\nfunction lastToolBlocksStream(\n last: AgentChatUiSegment | undefined,\n): boolean {\n return last?.type === \"tool\" && last.status === \"started\";\n}\n\nfunction toolSegmentId(event: AgentStreamEvent): string {\n const nid = event[\"nodeId\"];\n if (typeof nid === \"string\" && nid.length > 0) return nid;\n const tn = event[\"toolName\"];\n if (typeof tn === \"string\" && tn.length > 0) return tn;\n return \"__tool__\";\n}\n\nfunction normalizeContextSummarizedMode(\n m: unknown,\n): \"llm\" | \"heuristic\" | \"llm+heuristic\" | \"aggressive\" | undefined {\n if (\n m === \"llm\" ||\n m === \"heuristic\" ||\n m === \"llm+heuristic\" ||\n m === \"aggressive\"\n ) {\n return m;\n }\n return undefined;\n}\n\nfunction normalizeContextSummarizedReason(\n r: unknown,\n): \"soft_limit\" | \"forced\" | undefined {\n if (r === \"soft_limit\" || r === \"forced\") return r;\n return undefined;\n}\n\nfunction foldContextSummarized(\n prev: AgentChatUiSegment[],\n event: AgentStreamEvent,\n): AgentChatUiSegment[] {\n const step = asNumber(event[\"step\"], 0);\n const mode = normalizeContextSummarizedMode(event[\"mode\"]);\n const reason = normalizeContextSummarizedReason(event[\"reason\"]);\n const tro = event[\"tokensRemovedEstimate\"];\n const eta = event[\"estimatedTokensAfter\"];\n return [\n ...prev,\n {\n type: \"context_summarized\",\n step,\n ...(mode ? { mode } : {}),\n ...(reason ? { reason } : {}),\n ...(typeof tro === \"number\" && tro > 0\n ? { tokensRemovedEstimate: tro }\n : {}),\n ...(typeof eta === \"number\" && eta > 0\n ? { estimatedTokensAfter: eta }\n : {}),\n },\n ];\n}\n\n/** Concatenate `text` segments (ignores reasoning/tools). */\nexport function collectAssistantTextFromUiSegments(\n segments: AgentChatUiSegment[],\n): string {\n return segments\n .filter((s): s is { type: \"text\"; content: string } => s.type === \"text\")\n .map((s) => s.content)\n .join(\"\");\n}\n\n/**\n * Pure fold: one SSE event → next segment list. Matches `useEngineIDEAgent` / `useIDEAgent`\n * behavior for token gating while a tool is in the `started` state.\n */\nexport function foldAgentStreamIntoUiSegments(\n prev: AgentChatUiSegment[],\n event: AgentStreamEvent,\n): AgentChatUiSegment[] {\n switch (event.type) {\n case \"token\": {\n const last = prev[prev.length - 1];\n if (lastToolBlocksStream(last)) return prev;\n const token = asString(event[\"token\"]);\n if (!token) return prev;\n if (last?.type === \"text\") {\n return [\n ...prev.slice(0, -1),\n { type: \"text\", content: last.content + token },\n ];\n }\n return [...prev, { type: \"text\", content: token }];\n }\n case \"reasoning_token\": {\n const last = prev[prev.length - 1];\n if (lastToolBlocksStream(last)) return prev;\n const token = asString(event[\"token\"]);\n if (!token) return prev;\n if (last?.type === \"reasoning\") {\n return [\n ...prev.slice(0, -1),\n { type: \"reasoning\", content: last.content + token },\n ];\n }\n return [...prev, { type: \"reasoning\", content: token }];\n }\n case \"tool:call\": {\n const id = toolSegmentId(event);\n const toolName = asString(event[\"toolName\"], \"tool\");\n const argsRaw = event[\"args\"];\n const args =\n argsRaw !== null &&\n typeof argsRaw === \"object\" &&\n !Array.isArray(argsRaw)\n ? (argsRaw as Record<string, unknown>)\n : undefined;\n return [\n ...prev,\n {\n type: \"tool\",\n id,\n toolName,\n status: \"started\",\n ...(args !== undefined ? { args } : {}),\n },\n ];\n }\n case \"tool:args_update\": {\n const nodeId = asString(event[\"nodeId\"]);\n const patch = recordFromUnknown(event[\"args\"]);\n return prev.map((seg) => {\n if (seg.type !== \"tool\" || seg.id !== nodeId) return seg;\n const merged = { ...recordFromUnknown(seg.args), ...patch };\n return {\n ...seg,\n args: merged,\n };\n });\n }\n case \"tool:result\": {\n const nodeId = asString(event[\"nodeId\"]);\n const toolName =\n asString(event[\"toolName\"]) || asString(event[\"nodeId\"]);\n const durationMs =\n typeof event[\"durationMs\"] === \"number\" ? event[\"durationMs\"] : undefined;\n const resultStr =\n typeof event[\"result\"] === \"string\" ? event[\"result\"] : undefined;\n\n let idx = -1;\n if (nodeId) {\n for (let i = prev.length - 1; i >= 0; i--) {\n const s = prev[i]!;\n if (\n s.type === \"tool\" &&\n s.status === \"started\" &&\n s.id === nodeId\n ) {\n idx = i;\n break;\n }\n }\n }\n if (idx < 0 && toolName) {\n for (let i = prev.length - 1; i >= 0; i--) {\n const s = prev[i]!;\n if (\n s.type === \"tool\" &&\n s.status === \"started\" &&\n s.toolName === toolName\n ) {\n idx = i;\n break;\n }\n }\n }\n if (idx < 0) return prev;\n const next = [...prev];\n const seg = next[idx]!;\n if (seg.type !== \"tool\") return prev;\n next[idx] = {\n ...seg,\n status: \"completed\",\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(resultStr !== undefined ? { result: resultStr } : {}),\n };\n return next;\n }\n case \"context_summarized\":\n return foldContextSummarized(prev, event);\n case \"llm_step\": {\n return [\n ...prev,\n {\n type: \"llm_step\",\n step: Number(event[\"step\"]),\n inputTokens: Number(event[\"inputTokens\"] ?? 0),\n outputTokens: Number(event[\"outputTokens\"] ?? 0),\n ...(typeof event[\"cachedPromptTokens\"] === \"number\"\n ? { cachedPromptTokens: event[\"cachedPromptTokens\"] }\n : {}),\n ...(typeof event[\"cacheCreationInputTokens\"] === \"number\"\n ? { cacheCreationInputTokens: event[\"cacheCreationInputTokens\"] }\n : {}),\n creditsEstimated: Number(event[\"creditsEstimated\"] ?? 0),\n ...(typeof event[\"apiCostUsd\"] === \"number\" &&\n Number.isFinite(event[\"apiCostUsd\"])\n ? { apiCostUsd: event[\"apiCostUsd\"] }\n : {}),\n ...(typeof event[\"provider\"] === \"string\" && event[\"provider\"]\n ? { provider: event[\"provider\"] }\n : {}),\n },\n ];\n }\n default:\n return prev;\n }\n}\n\n/**\n * Merge live segments with the terminal `done` payload (optional `stop_reason` segment),\n * and build the persisted assistant message — same shape as dashboard `ChatMessageData` for `ai`.\n */\nexport function finalizeAgentChatUiTurn(\n segments: AgentChatUiSegment[],\n done: AgentChatStreamDonePayload,\n): {\n segments: AgentChatUiSegment[];\n message: AgentChatUiAssistantMessage;\n} {\n let segs: AgentChatUiSegment[] | undefined =\n segments.length > 0 ? [...segments] : undefined;\n if (done.stopReason) {\n const stopSeg: AgentChatUiSegment = {\n type: \"stop_reason\",\n content: done.stopReason,\n finishReason: done.finishReason ?? \"error\",\n };\n segs = segs ? [...segs, stopSeg] : [stopSeg];\n }\n const fromText = segs\n ? collectAssistantTextFromUiSegments(segs)\n : \"\";\n const content =\n done.response ||\n fromText ||\n \"No response.\";\n\n const message: AgentChatUiAssistantMessage = {\n role: \"ai\",\n content,\n ...(segs && segs.length > 0 ? { segments: segs } : {}),\n finishReason: done.finishReason ?? null,\n ...(Array.isArray(done.completionProviders) &&\n done.completionProviders.length > 0\n ? { completionProviders: done.completionProviders }\n : {}),\n ...(typeof done.agentSteps === \"number\" &&\n Number.isFinite(done.agentSteps) &&\n done.agentSteps > 0\n ? { agentSteps: Math.floor(done.agentSteps) }\n : {}),\n usage: {\n inputTokens: done.inputTokens ?? 0,\n outputTokens: done.outputTokens ?? 0,\n creditsCharged: done.creditsCharged ?? 0,\n ...(typeof done.cachedPromptTokens === \"number\" &&\n done.cachedPromptTokens > 0\n ? { cachedPromptTokens: done.cachedPromptTokens }\n : {}),\n ...(typeof done.cacheCreationInputTokens === \"number\" &&\n done.cacheCreationInputTokens > 0\n ? { cacheCreationInputTokens: done.cacheCreationInputTokens }\n : {}),\n },\n ...(typeof done.totalDurationMs === \"number\" && done.totalDurationMs > 0\n ? { durationMs: done.totalDurationMs }\n : {}),\n };\n\n return { segments: segs ?? [], message };\n}\n\n/**\n * Consume a stream and drive dashboard-style UI state: {@link AgentChatStreamUiHandlers.onSegments}\n * / {@link AgentChatStreamUiHandlers.onStreamingText} mirror `AgentChat`’s `streamingSegments` /\n * `streamingContent`; the returned {@link AgentChatUiStreamResult.message} is ready to append\n * to history like `useEngineIDEAgent` does on `done`.\n */\nexport async function runAgentChatStreamForUi(\n source: AsyncIterable<AgentStreamEvent>,\n handlers: AgentChatStreamUiHandlers = {},\n options: RunAgentChatStreamOptions = {},\n): Promise<AgentChatUiStreamResult> {\n const { signal } = options;\n let segments: AgentChatUiSegment[] = [];\n let donePayload: AgentChatStreamDonePayload | null = null;\n\n try {\n for await (const event of source) {\n assertAborted(signal);\n handlers.onEvent?.(event);\n\n const info = parseAgentStreamAgentInfo(event);\n if (info) {\n handlers.onAgentInfo?.(info);\n continue;\n }\n\n if (event.type === \"ping\") continue;\n\n if (event.type === \"done\") {\n const parsed = parseAgentStreamDone(event);\n if (parsed) {\n donePayload = parsed;\n handlers.onDone?.(parsed);\n }\n break;\n }\n\n const next = foldAgentStreamIntoUiSegments(segments, event);\n if (next !== segments) {\n segments = next;\n handlers.onSegments?.(segments);\n if (event.type === \"token\") {\n handlers.onStreamingText?.(\n collectAssistantTextFromUiSegments(segments),\n );\n }\n }\n }\n } catch (err) {\n handlers.onError?.(err);\n throw err;\n }\n\n if (!donePayload) {\n const err = new RagableError(\n \"Agent stream ended without a done event\",\n 502,\n { code: \"SDK_AGENT_STREAM_INCOMPLETE\" },\n );\n handlers.onError?.(err);\n throw err;\n }\n\n const segmentsMidTurn = [...segments];\n const { segments: finalSegs, message } = finalizeAgentChatUiTurn(\n segments,\n donePayload,\n );\n\n const result: AgentChatUiStreamResult = {\n segmentsMidTurn,\n segments: finalSegs,\n message,\n done: donePayload,\n };\n handlers.onComplete?.(result);\n return result;\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 {\r\n bindFetch,\r\n RagableAbortError,\r\n RagableError,\r\n RagableNetworkError,\r\n RagableTimeoutError,\r\n extractErrorMessage,\r\n} from \"./request-client\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type HttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\" | \"HEAD\";\r\n\r\nexport interface RetryOptions {\r\n maxRetries: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n retryOn: number[];\r\n respectRetryAfter: boolean;\r\n}\r\n\r\nexport interface TransportOptions {\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n retry?: Partial<RetryOptions>;\r\n timeoutMs?: number;\r\n onRequest?: (req: TransportRequest) => void;\r\n onResponse?: (req: TransportRequest, res: Response, durationMs: number) => void;\r\n onRetry?: (req: TransportRequest, attempt: number, delayMs: number, reason: string) => void;\r\n}\r\n\r\nexport interface TransportRequest {\r\n url: string;\r\n method: HttpMethod;\r\n headers: Headers;\r\n body?: BodyInit;\r\n signal?: AbortSignal;\r\n idempotencyKey?: string;\r\n retry?: Partial<RetryOptions>;\r\n timeoutMs?: number;\r\n}\r\n\r\n// ─── Defaults ────────────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_RETRY: RetryOptions = {\r\n maxRetries: 3,\r\n baseDelayMs: 200,\r\n maxDelayMs: 5_000,\r\n retryOn: [408, 425, 429, 502, 503, 504],\r\n respectRetryAfter: true,\r\n};\r\n\r\nconst DEFAULT_TIMEOUT_MS = 30_000;\r\n\r\n// ─── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nfunction jitteredDelay(base: number, attempt: number, max: number): number {\r\n const exp = Math.min(base * 2 ** attempt, max);\r\n return Math.round(exp * (0.5 + Math.random() * 0.5));\r\n}\r\n\r\nfunction parseRetryAfter(header: string | null): number | null {\r\n if (!header) return null;\r\n const seconds = Number(header);\r\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\r\n const date = Date.parse(header);\r\n if (Number.isFinite(date)) return Math.max(0, date - Date.now());\r\n return null;\r\n}\r\n\r\nlet _uuidCounter = 0;\r\nexport function generateIdempotencyKey(): string {\r\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n _uuidCounter++;\r\n return `idk-${Date.now()}-${_uuidCounter}-${Math.random().toString(36).slice(2, 10)}`;\r\n}\r\n\r\nfunction requestCacheKey(req: TransportRequest): string {\r\n return `${req.method}:${req.url}`;\r\n}\r\n\r\n// ─── Transport ───────────────────────────────────────────────────────────────\r\n\r\nexport class Transport {\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultHeaders: HeadersInit | undefined;\r\n private readonly defaultRetry: RetryOptions;\r\n private readonly defaultTimeoutMs: number;\r\n private readonly onRequest?: TransportOptions[\"onRequest\"];\r\n private readonly onResponse?: TransportOptions[\"onResponse\"];\r\n private readonly onRetry?: TransportOptions[\"onRetry\"];\r\n\r\n private readonly inflightGets = new Map<string, Promise<Response>>();\r\n\r\n private _refreshHandler: (() => Promise<string | null>) | null = null;\r\n\r\n constructor(options: TransportOptions = {}) {\r\n this.fetchImpl = bindFetch(options.fetch);\r\n this.defaultHeaders = options.headers;\r\n this.defaultRetry = { ...DEFAULT_RETRY, ...options.retry };\r\n this.defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\r\n this.onRequest = options.onRequest;\r\n this.onResponse = options.onResponse;\r\n this.onRetry = options.onRetry;\r\n }\r\n\r\n setRefreshHandler(handler: (() => Promise<string | null>) | null): void {\r\n this._refreshHandler = handler;\r\n }\r\n\r\n async execute(req: TransportRequest): Promise<Response> {\r\n if (req.method === \"GET\") {\r\n const key = requestCacheKey(req);\r\n const existing = this.inflightGets.get(key);\r\n if (existing) return existing;\r\n const promise = this._executeWithRetry(req).finally(() => {\r\n this.inflightGets.delete(key);\r\n });\r\n this.inflightGets.set(key, promise);\r\n return promise;\r\n }\r\n return this._executeWithRetry(req);\r\n }\r\n\r\n private async _executeWithRetry(req: TransportRequest): Promise<Response> {\r\n const retryOpts: RetryOptions = {\r\n ...this.defaultRetry,\r\n ...req.retry,\r\n };\r\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\r\n\r\n const headers = new Headers(this.defaultHeaders);\r\n req.headers.forEach((v, k) => headers.set(k, v));\r\n if (req.idempotencyKey) {\r\n headers.set(\"Idempotency-Key\", req.idempotencyKey);\r\n }\r\n\r\n const finalReq: TransportRequest = { ...req, headers };\r\n\r\n this.onRequest?.(finalReq);\r\n\r\n let lastError: unknown;\r\n const maxAttempts = 1 + retryOpts.maxRetries;\r\n let did401Refresh = false;\r\n\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n const response = await this._singleFetch(finalReq, timeoutMs);\r\n\r\n if (response.status === 401 && this._refreshHandler && !did401Refresh) {\r\n did401Refresh = true;\r\n const newToken = await this._refreshHandler();\r\n if (newToken) {\r\n finalReq.headers.set(\"Authorization\", `Bearer ${newToken}`);\r\n attempt--;\r\n continue;\r\n }\r\n }\r\n\r\n if (!response.ok && retryOpts.retryOn.includes(response.status) && attempt < maxAttempts - 1) {\r\n let delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\r\n if (retryOpts.respectRetryAfter) {\r\n const ra = parseRetryAfter(response.headers.get(\"retry-after\"));\r\n if (ra !== null) delayMs = Math.min(ra, retryOpts.maxDelayMs);\r\n }\r\n this.onRetry?.(finalReq, attempt + 1, delayMs, `HTTP ${response.status}`);\r\n await sleep(delayMs);\r\n continue;\r\n }\r\n\r\n return response;\r\n } catch (e) {\r\n if (e instanceof RagableAbortError || e instanceof RagableTimeoutError) {\r\n throw e;\r\n }\r\n lastError = e;\r\n if (attempt < maxAttempts - 1) {\r\n const delayMs = jitteredDelay(retryOpts.baseDelayMs, attempt, retryOpts.maxDelayMs);\r\n this.onRetry?.(finalReq, attempt + 1, delayMs, (e as Error).message);\r\n await sleep(delayMs);\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n throw lastError instanceof RagableNetworkError\r\n ? lastError\r\n : new RagableNetworkError(\r\n (lastError as Error)?.message ?? \"Network request failed\",\r\n lastError,\r\n );\r\n }\r\n\r\n private async _singleFetch(req: TransportRequest, timeoutMs: number): Promise<Response> {\r\n const controller = new AbortController();\r\n const signals: AbortSignal[] = [controller.signal];\r\n if (req.signal) signals.push(req.signal);\r\n\r\n const combinedSignal = signals.length === 1\r\n ? controller.signal\r\n : AbortSignal.any\r\n ? AbortSignal.any(signals)\r\n : controller.signal;\r\n\r\n if (req.signal?.aborted) {\r\n throw new RagableAbortError();\r\n }\r\n\r\n const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n const externalAbortHandler = req.signal\r\n ? () => controller.abort()\r\n : null;\r\n if (externalAbortHandler && req.signal) {\r\n req.signal.addEventListener(\"abort\", externalAbortHandler, { once: true });\r\n }\r\n\r\n const start = Date.now();\r\n try {\r\n const response = await this.fetchImpl(req.url, {\r\n method: req.method,\r\n headers: req.headers,\r\n body: req.body,\r\n signal: combinedSignal,\r\n });\r\n this.onResponse?.(req, response, Date.now() - start);\r\n return response;\r\n } catch (e) {\r\n if ((e as Error).name === \"AbortError\") {\r\n if (req.signal?.aborted) throw new RagableAbortError();\r\n throw new RagableTimeoutError(timeoutMs);\r\n }\r\n throw new RagableNetworkError((e as Error).message, e);\r\n } finally {\r\n clearTimeout(timer);\r\n if (externalAbortHandler && req.signal) {\r\n req.signal.removeEventListener(\"abort\", externalAbortHandler);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport async function parseTransportResponse<T>(response: Response): Promise<T> {\r\n if (response.status === 204) return null as T;\r\n const text = await response.text();\r\n if (!text) return null as T;\r\n let payload: unknown;\r\n try {\r\n payload = JSON.parse(text);\r\n } catch {\r\n if (!response.ok) {\r\n throw new RagableError(text.slice(0, 200), response.status, null);\r\n }\r\n return text as T;\r\n }\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n}\r\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\n/** Discriminated result for easier TypeScript narrowing than `{ data, error }` after destructuring. */\nexport type RagableResult<T, E = RagableError> =\n | { ok: true; value: T }\n | { ok: false; error: E };\n\nexport function toRagableResult<T>(r: PostgrestResult<T>): RagableResult<T> {\n if (r.error) return { ok: false, error: r.error };\n return { ok: true, value: r.data };\n}\n\n/**\n * Narrows a {@link PostgrestResult} after an `if (result.error)` guard.\n * Prefer checking `result.error` on the result object (not destructured `{ data, error }`)\n * so TypeScript narrows `data` automatically; use this when you need a throw or assertion.\n */\nexport function assertPostgrestSuccess<T>(\n r: PostgrestResult<T>,\n): asserts r is { data: T; error: null } {\n if (r.error) throw r.error;\n}\n\n/** Returns `data` or throws `RagableError` / the failure case. */\nexport function unwrapPostgrest<T>(r: PostgrestResult<T>): T {\n if (r.error) throw r.error;\n return r.data;\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\n/**\n * Chainable SELECT (PostgREST / Supabase-style). Filters and modifiers apply to the **base**\n * table of the query (the table passed to `client.from(...)`); the `select` string controls columns\n * and **resource embedding** (joins).\n *\n * **Joins** use the same embedded `select` syntax as\n * [Supabase `.select()`](https://supabase.com/docs/reference/javascript/select) / PostgREST, for example:\n * - `*,related_table(*)` — include related rows\n * - `related_table!inner(*)` — inner-style embed\n * - `related_table!fkey_column_or_constraint(*)` — disambiguate when multiple FKs exist\n * - `alias:related_table(*)` — rename the JSON key for the nested object/array\n *\n * **Ragable limits** (server-side): only **one level** of embedding is supported — no nested\n * `relation(nested(...))`. Prefer embed aliases above; top-level column rename forms like\n * `alias:column` may not be accepted for scalar columns.\n *\n * **API note:** Supabase’s second `select(columns, options?)` argument (`count`, `head`, etc.) is\n * not supported in Ragable yet; joins use the **first** argument only.\n *\n * For nested result shapes, pass a type argument on {@link PostgrestTableApi.select}:\n * `from('orders').select<OrderWithLines>(\\`*, lines (*)\\`)`.\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 /**\n * Start a SELECT. Pass a PostgREST `select` string; use embedded resources for joins — see\n * {@link PostgrestSelectBuilder}.\n *\n * @param columns Column list and optional embeds (default `\"*\"`). Omitted or `\"*\"` means all base columns.\n * @typeParam RowResult Row shape returned by the query; defaults to this table’s `Row`. Override when using joins.\n */\n select<\n RowResult extends Record<string, unknown> = TableRow<Database, TableName>,\n >(columns = \"*\"): PostgrestSelectBuilder<RowResult, Database, TableName> {\n return new PostgrestSelectBuilder<RowResult, 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 {\r\n bindFetch,\r\n DEFAULT_RAGABLE_API_BASE,\r\n extractErrorMessage,\r\n RagableError,\r\n} from \"./request-client\";\r\nimport type {\r\n SessionStorage,\r\n} from \"./auth-storage\";\r\nimport {\r\n AuthBroadcastChannel,\r\n detectStorage,\r\n} from \"./auth-storage\";\r\nimport {\r\n asPostgrestResponse,\r\n type PostgrestResult,\r\n} from \"./browser-postgrest\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type AuthChangeEvent =\r\n | \"INITIAL_SESSION\"\r\n | \"SIGNED_IN\"\r\n | \"SIGNED_OUT\"\r\n | \"TOKEN_REFRESHED\"\r\n | \"USER_UPDATED\";\r\n\r\nexport type AuthUserMetadata = Record<string, unknown>;\r\n\r\nexport interface DefaultAuthUser<\r\n Metadata extends AuthUserMetadata = AuthUserMetadata,\r\n> {\r\n id: string;\r\n email: string;\r\n name: string | null;\r\n status: \"active\" | \"disabled\" | (string & {});\r\n metadata: Metadata;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n lastSignInAt?: string | null;\r\n}\r\n\r\nexport interface AuthSession<\r\n U extends object = DefaultAuthUser,\r\n> {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n expires_at: number;\r\n token_type: \"bearer\";\r\n user: U;\r\n}\r\n\r\nexport interface AuthOptions {\r\n persistSession?: boolean;\r\n autoRefreshToken?: boolean;\r\n storage?: SessionStorage;\r\n storageKey?: string;\r\n refreshSkewSeconds?: number;\r\n debug?: boolean;\r\n}\r\n\r\nexport interface RagableAuthConfig {\r\n authGroupId: string;\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n auth?: AuthOptions;\r\n}\r\n\r\nexport type AuthSignUpCredentials<\r\n Metadata extends AuthUserMetadata = AuthUserMetadata,\r\n> = {\r\n email: string;\r\n password: string;\r\n options?: {\r\n data?: Partial<Metadata> & {\r\n name?: string | null;\r\n };\r\n };\r\n};\r\n\r\nexport type AuthUpdateUserAttributes<\r\n Metadata extends AuthUserMetadata = AuthUserMetadata,\r\n> = {\r\n email?: string;\r\n password?: string;\r\n data?: Partial<Metadata> & {\r\n name?: string | null;\r\n };\r\n};\r\n\r\ntype MetadataForUser<U extends object> = U extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Metadata\r\n : AuthUserMetadata\r\n : AuthUserMetadata;\r\n\r\ntype AuthListener<U extends object> = (\r\n event: AuthChangeEvent,\r\n session: AuthSession<U> | null,\r\n) => void;\r\n\r\ninterface Subscription {\r\n id: string;\r\n unsubscribe: () => void;\r\n}\r\n\r\n// ─── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nfunction parseExpiresInSeconds(raw: string | number): number {\r\n if (typeof raw === \"number\") return raw;\r\n const s = raw.trim().toLowerCase();\r\n const m = /^(\\d+)([smhd])?$/.exec(s);\r\n if (m) {\r\n const n = Number(m[1]);\r\n const u = m[2] ?? \"s\";\r\n const mult =\r\n u === \"s\" ? 1 : u === \"m\" ? 60 : u === \"h\" ? 3600 : u === \"d\" ? 86400 : 1;\r\n return n * mult;\r\n }\r\n const asNum = Number(s);\r\n return Number.isFinite(asNum) ? asNum : 0;\r\n}\r\n\r\nasync function parseJsonOrThrow<T>(response: Response): Promise<T> {\r\n const text = await response.text();\r\n let payload: unknown;\r\n try {\r\n payload = text ? JSON.parse(text) : null;\r\n } catch {\r\n throw new RagableError(`Response parse error: ${text.slice(0, 200)}`, response.status, null);\r\n }\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n}\r\n\r\nlet _subCounter = 0;\r\n\r\n// ─── RagableAuth ─────────────────────────────────────────────────────────────\r\n\r\nexport class RagableAuth<\r\n U extends object = DefaultAuthUser,\r\n> {\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly baseUrl: string;\r\n private readonly authGroupId: string;\r\n private readonly defaultHeaders: HeadersInit | undefined;\r\n private readonly persistSession: boolean;\r\n private readonly autoRefreshToken: boolean;\r\n private readonly storage: SessionStorage;\r\n private readonly storageKey: string;\r\n private readonly refreshSkewSeconds: number;\r\n private readonly debug: boolean;\r\n\r\n private currentSession: AuthSession<U> | null = null;\r\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\r\n private refreshPromise: Promise<AuthSession<U> | null> | null = null;\r\n private listeners = new Map<string, AuthListener<U>>();\r\n private broadcast: AuthBroadcastChannel | null = null;\r\n private visibilityHandler: (() => void) | null = null;\r\n private initialized = false;\r\n\r\n constructor(config: RagableAuthConfig) {\r\n this.baseUrl = DEFAULT_RAGABLE_API_BASE.replace(/\\/+$/, \"\");\r\n this.authGroupId = config.authGroupId;\r\n this.fetchImpl = bindFetch(config.fetch);\r\n this.defaultHeaders = config.headers;\r\n\r\n const auth = config.auth ?? {};\r\n this.persistSession = auth.persistSession !== false;\r\n this.autoRefreshToken = auth.autoRefreshToken !== false;\r\n this.storage = auth.storage ?? detectStorage();\r\n this.storageKey = auth.storageKey ?? `ragable.session.${this.authGroupId}`;\r\n this.refreshSkewSeconds = auth.refreshSkewSeconds ?? 60;\r\n this.debug = auth.debug ?? false;\r\n\r\n this.broadcast = new AuthBroadcastChannel(`ragable-auth-${this.authGroupId}`);\r\n this.broadcast.onMessage((msg) => {\r\n if (msg.type === \"SESSION_UPDATED\") {\r\n try {\r\n const session = JSON.parse(msg.payload) as AuthSession<U>;\r\n this.currentSession = session;\r\n this.scheduleRefresh(session);\r\n this.emit(\"TOKEN_REFRESHED\", session);\r\n } catch { /* ignore bad data from other tab */ }\r\n } else if (msg.type === \"SESSION_REMOVED\") {\r\n this.currentSession = null;\r\n this.clearRefreshTimer();\r\n this.emit(\"SIGNED_OUT\", null);\r\n }\r\n });\r\n\r\n this.setupVisibilityListener();\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.debug) console.debug(\"[RagableAuth]\", ...args);\r\n }\r\n\r\n // ── Lifecycle ──────────────────────────────────────────────────────────────\r\n\r\n async initialize(): Promise<AuthSession<U> | null> {\r\n if (this.initialized) return this.currentSession;\r\n this.initialized = true;\r\n if (this.persistSession) {\r\n try {\r\n const raw = await this.storage.getItem(this.storageKey);\r\n if (raw) {\r\n const session = JSON.parse(raw) as AuthSession<U>;\r\n if (session.expires_at && session.expires_at > nowSeconds()) {\r\n this.currentSession = session;\r\n this.scheduleRefresh(session);\r\n this.log(\"Restored session from storage\");\r\n } else if (session.refresh_token) {\r\n this.log(\"Stored session expired, attempting refresh\");\r\n const refreshed = await this._doRefresh(session.refresh_token);\r\n if (refreshed) {\r\n this.currentSession = refreshed;\r\n } else {\r\n await this.storage.removeItem(this.storageKey);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n this.log(\"Failed to restore session\", e);\r\n }\r\n }\r\n this.emit(\"INITIAL_SESSION\", this.currentSession);\r\n return this.currentSession;\r\n }\r\n\r\n // ── Auth methods ───────────────────────────────────────────────────────────\r\n\r\n async signUp(\r\n credentials: AuthSignUpCredentials<MetadataForUser<U>>,\r\n ): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\r\n return asPostgrestResponse(async () => {\r\n const name =\r\n typeof credentials.options?.data?.name === \"string\"\r\n ? credentials.options.data.name\r\n : undefined;\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/register\", \"POST\", {\r\n email: credentials.email,\r\n password: credentials.password,\r\n ...(name !== undefined ? { name } : {}),\r\n ...(credentials.options?.data !== undefined\r\n ? { data: credentials.options.data }\r\n : {}),\r\n });\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return { user: session.user, session };\r\n });\r\n }\r\n\r\n async signInWithPassword(credentials: {\r\n email: string;\r\n password: string;\r\n }): Promise<PostgrestResult<{ user: U; session: AuthSession<U> }>> {\r\n return asPostgrestResponse(async () => {\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/login\", \"POST\", {\r\n email: credentials.email,\r\n password: credentials.password,\r\n });\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return { user: session.user, session };\r\n });\r\n }\r\n\r\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{ error: null }> {\r\n this.currentSession = null;\r\n this.clearRefreshTimer();\r\n if (this.persistSession) {\r\n await this.storage.removeItem(this.storageKey);\r\n }\r\n this.broadcast?.postSessionRemoved();\r\n this.emit(\"SIGNED_OUT\", null);\r\n return { error: null };\r\n }\r\n\r\n async refreshSession(\r\n refreshToken?: string,\r\n ): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const token = refreshToken ?? this.currentSession?.refresh_token;\r\n if (!token) throw new RagableError(\"No refresh token available\", 401, null);\r\n const session = await this.singleFlightRefresh(token);\r\n if (!session) throw new RagableError(\"Refresh failed\", 401, null);\r\n return { session, user: session.user };\r\n });\r\n }\r\n\r\n async getSession(): Promise<PostgrestResult<{ session: AuthSession<U> | null }>> {\r\n if (!this.initialized) await this.initialize();\r\n return { data: { session: this.currentSession }, error: null };\r\n }\r\n\r\n async getUser(): Promise<PostgrestResult<{ user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\r\n });\r\n }\r\n\r\n async setSession(tokens: {\r\n access_token: string;\r\n refresh_token: string;\r\n }): Promise<PostgrestResult<{ session: AuthSession<U>; user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", tokens.access_token);\r\n const decoded = decodeJwtExpiry(tokens.access_token);\r\n const expiresIn = decoded ? decoded - nowSeconds() : 3600;\r\n const session: AuthSession<U> = {\r\n access_token: tokens.access_token,\r\n refresh_token: tokens.refresh_token,\r\n expires_in: expiresIn,\r\n expires_at: nowSeconds() + expiresIn,\r\n token_type: \"bearer\",\r\n user: me.user,\r\n };\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return { session, user: me.user };\r\n });\r\n }\r\n\r\n async updateUser(attributes: {\r\n email?: string;\r\n password?: string;\r\n data?: (Partial<MetadataForUser<U>> & { name?: string | null });\r\n }): Promise<PostgrestResult<{ user: U }>> {\r\n return asPostgrestResponse(async () => {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, {\r\n ...(attributes.email !== undefined ? { email: attributes.email } : {}),\r\n ...(attributes.password !== undefined ? { password: attributes.password } : {}),\r\n ...(attributes.data !== undefined ? { data: attributes.data } : {}),\r\n ...(attributes.data?.name !== undefined ? { name: attributes.data.name } : {}),\r\n });\r\n if (this.currentSession) {\r\n this.currentSession = { ...this.currentSession, user: result.user };\r\n await this.persistCurrentSession();\r\n }\r\n this.emit(\"USER_UPDATED\", this.currentSession);\r\n return result;\r\n });\r\n }\r\n\r\n // ── Event subscription ─────────────────────────────────────────────────────\r\n\r\n onAuthStateChange(\r\n callback: AuthListener<U>,\r\n ): { data: { subscription: Subscription } } {\r\n _subCounter++;\r\n const id = `sub-${_subCounter}`;\r\n this.listeners.set(id, callback);\r\n const unsubscribe = () => {\r\n this.listeners.delete(id);\r\n };\r\n return { data: { subscription: { id, unsubscribe } } };\r\n }\r\n\r\n // ── Accessors ──────────────────────────────────────────────────────────────\r\n\r\n getAccessToken(): string | null {\r\n return this.currentSession?.access_token ?? null;\r\n }\r\n\r\n async getValidAccessToken(): Promise<string | null> {\r\n if (!this.initialized) await this.initialize();\r\n const session = this.currentSession;\r\n if (!session) return null;\r\n const secondsUntilExpiry = session.expires_at - nowSeconds();\r\n if (secondsUntilExpiry <= this.refreshSkewSeconds) {\r\n const refreshed = await this.singleFlightRefresh(session.refresh_token);\r\n return refreshed?.access_token ?? null;\r\n }\r\n return session.access_token;\r\n }\r\n\r\n getCurrentSession(): AuthSession<U> | null {\r\n return this.currentSession;\r\n }\r\n\r\n // ── Back-compat: raw Ragable auth methods ──────────────────────────────────\r\n\r\n async register(body: {\r\n email: string;\r\n password: string;\r\n name?: string;\r\n data?: Partial<MetadataForUser<U>> & { name?: string | null };\r\n }): Promise<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }> {\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/register\", \"POST\", body);\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return raw;\r\n }\r\n\r\n async login(body: {\r\n email: string;\r\n password: string;\r\n }): Promise<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }> {\r\n const raw = await this.fetchAuth<{\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/login\", \"POST\", body);\r\n const session = this.rawToSession(raw);\r\n await this.setSessionInternal(session, \"SIGNED_IN\");\r\n return raw;\r\n }\r\n\r\n async refresh(body: { refreshToken: string }): Promise<{\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }> {\r\n return this.fetchAuth(\"/refresh\", \"POST\", body);\r\n }\r\n\r\n async getMe(): Promise<{ user: U }> {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n return this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", token);\r\n }\r\n\r\n async updateMe(body: {\r\n email?: string;\r\n name?: string | null;\r\n password?: string;\r\n data?: Partial<MetadataForUser<U>> & { name?: string | null };\r\n }): Promise<{ user: U }> {\r\n const token = this.currentSession?.access_token;\r\n if (!token) throw new RagableError(\"Not authenticated\", 401, null);\r\n const result = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"PATCH\", token, body);\r\n if (this.currentSession) {\r\n this.currentSession = { ...this.currentSession, user: result.user };\r\n await this.persistCurrentSession();\r\n }\r\n this.emit(\"USER_UPDATED\", this.currentSession);\r\n return result;\r\n }\r\n\r\n // ── Cleanup ────────────────────────────────────────────────────────────────\r\n\r\n destroy(): void {\r\n this.clearRefreshTimer();\r\n this.broadcast?.close();\r\n this.listeners.clear();\r\n if (this.visibilityHandler && typeof document !== \"undefined\") {\r\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n }\r\n\r\n // ─── Internal ──────────────────────────────────────────────────────────────\r\n\r\n private authPrefix(): string {\r\n return `/auth-groups/${this.authGroupId}/auth`;\r\n }\r\n\r\n private toUrl(path: string): string {\r\n return `${this.baseUrl}${this.authPrefix()}${path}`;\r\n }\r\n\r\n private baseHeaders(json: boolean): Headers {\r\n const h = new Headers(this.defaultHeaders);\r\n if (json) h.set(\"Content-Type\", \"application/json\");\r\n return h;\r\n }\r\n\r\n private async fetchAuth<T>(\r\n path: string,\r\n method: \"GET\" | \"POST\" | \"PATCH\",\r\n body?: unknown,\r\n ): Promise<T> {\r\n const headers = this.baseHeaders(body !== undefined);\r\n const response = await this.fetchImpl(this.toUrl(path), {\r\n method,\r\n headers,\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n });\r\n return parseJsonOrThrow<T>(response);\r\n }\r\n\r\n private async fetchAuthWithBearer<T>(\r\n path: string,\r\n method: \"GET\" | \"POST\" | \"PATCH\",\r\n token: string,\r\n body?: unknown,\r\n ): Promise<T> {\r\n const headers = this.baseHeaders(body !== undefined);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n const response = await this.fetchImpl(this.toUrl(path), {\r\n method,\r\n headers,\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n });\r\n return parseJsonOrThrow<T>(response);\r\n }\r\n\r\n private rawToSession(raw: {\r\n user: U;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }): AuthSession<U> {\r\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\r\n return {\r\n access_token: raw.accessToken,\r\n refresh_token: raw.refreshToken,\r\n expires_in: expiresIn,\r\n expires_at: nowSeconds() + expiresIn,\r\n token_type: \"bearer\",\r\n user: raw.user,\r\n };\r\n }\r\n\r\n private async setSessionInternal(\r\n session: AuthSession<U>,\r\n event: AuthChangeEvent,\r\n ): Promise<void> {\r\n this.currentSession = session;\r\n await this.persistCurrentSession();\r\n this.broadcast?.postSessionUpdated(JSON.stringify(session));\r\n this.scheduleRefresh(session);\r\n this.emit(event, session);\r\n }\r\n\r\n private async persistCurrentSession(): Promise<void> {\r\n if (!this.persistSession || !this.currentSession) return;\r\n try {\r\n await this.storage.setItem(this.storageKey, JSON.stringify(this.currentSession));\r\n } catch (e) {\r\n this.log(\"Failed to persist session\", e);\r\n }\r\n }\r\n\r\n private emit(event: AuthChangeEvent, session: AuthSession<U> | null): void {\r\n this.log(event, session?.user);\r\n for (const cb of this.listeners.values()) {\r\n try {\r\n cb(event, session);\r\n } catch (e) {\r\n this.log(\"Listener threw\", e);\r\n }\r\n }\r\n }\r\n\r\n // ─── Refresh scheduling ────────────────────────────────────────────────────\r\n\r\n private scheduleRefresh(session: AuthSession<U>): void {\r\n this.clearRefreshTimer();\r\n if (!this.autoRefreshToken) return;\r\n const secondsUntilExpiry = session.expires_at - nowSeconds();\r\n const refreshIn = Math.max(0, secondsUntilExpiry - this.refreshSkewSeconds);\r\n this.log(`Scheduling refresh in ${refreshIn}s`);\r\n this.refreshTimer = setTimeout(() => {\r\n this.singleFlightRefresh(session.refresh_token).catch((e) => {\r\n this.log(\"Scheduled refresh failed\", e);\r\n });\r\n }, refreshIn * 1000);\r\n }\r\n\r\n private clearRefreshTimer(): void {\r\n if (this.refreshTimer !== null) {\r\n clearTimeout(this.refreshTimer);\r\n this.refreshTimer = null;\r\n }\r\n }\r\n\r\n async singleFlightRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\r\n if (this.refreshPromise) return this.refreshPromise;\r\n this.refreshPromise = this._doRefresh(refreshToken).finally(() => {\r\n this.refreshPromise = null;\r\n });\r\n return this.refreshPromise;\r\n }\r\n\r\n private async _doRefresh(refreshToken: string): Promise<AuthSession<U> | null> {\r\n try {\r\n const raw = await this.fetchAuth<{\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n }>(\"/refresh\", \"POST\", { refreshToken });\r\n\r\n const me = await this.fetchAuthWithBearer<{ user: U }>(\"/me\", \"GET\", raw.accessToken);\r\n\r\n const expiresIn = parseExpiresInSeconds(raw.expiresIn);\r\n const session: AuthSession<U> = {\r\n access_token: raw.accessToken,\r\n refresh_token: raw.refreshToken,\r\n expires_in: expiresIn,\r\n expires_at: nowSeconds() + expiresIn,\r\n token_type: \"bearer\",\r\n user: me.user,\r\n };\r\n\r\n await this.setSessionInternal(session, \"TOKEN_REFRESHED\");\r\n return session;\r\n } catch (e) {\r\n this.log(\"Refresh failed\", e);\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Visibility listener ───────────────────────────────────────────────────\r\n\r\n private setupVisibilityListener(): void {\r\n if (typeof document === \"undefined\") return;\r\n this.visibilityHandler = () => {\r\n if (document.visibilityState === \"visible\" && this.currentSession) {\r\n const secondsUntilExpiry = this.currentSession.expires_at - nowSeconds();\r\n if (secondsUntilExpiry <= this.refreshSkewSeconds) {\r\n this.singleFlightRefresh(this.currentSession.refresh_token).catch(() => {});\r\n } else {\r\n this.scheduleRefresh(this.currentSession);\r\n }\r\n } else {\r\n this.clearRefreshTimer();\r\n }\r\n };\r\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n}\r\n\r\nfunction nowSeconds(): number {\r\n return Math.floor(Date.now() / 1000);\r\n}\r\n\r\nfunction decodeJwtExpiry(jwt: string): number | null {\r\n try {\r\n const parts = jwt.split(\".\");\r\n if (parts.length !== 3) return null;\r\n const payload = JSON.parse(atob(parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\")));\r\n return typeof payload.exp === \"number\" ? payload.exp : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","/**\n * Vercel AI SDK–style stream part types, used by both `client.ai.streamText`\n * (Fireworks chunks via the Ragable proxy) and `client.agents.run` (existing\n * agent SSE events). Keep this module zero-dep so it can be re-exported from\n * the SDK entrypoint without dragging in agent/browser code.\n */\n\nexport type FinishReason =\n | \"stop\"\n | \"length\"\n | \"tool-calls\"\n | \"content-filter\"\n | \"error\"\n | \"unknown\";\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n /** Prompt-cache read tokens reported by the upstream provider, when available. */\n cachedPromptTokens?: number;\n}\n\nexport type StreamPart =\n | { type: \"text-delta\"; textDelta: string }\n | { type: \"reasoning\"; textDelta: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n }\n | {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n durationMs?: number;\n }\n | { type: \"finish\"; finishReason: FinishReason; usage: TokenUsage }\n | { type: \"error\"; error: unknown };\n\nexport interface Message {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/**\n * OpenAI/Fireworks SSE chunk shape, only the fields we actually consume.\n * Kept as a local type so we don't depend on backend internals.\n */\nexport interface OpenAiStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string | null;\n reasoning_content?: string | null;\n reasoning?: string | null;\n tool_calls?: Array<{\n index?: number;\n id?: string | null;\n type?: string;\n function?: { name?: string | null; arguments?: string | null };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n cache_read_input_tokens?: number;\n };\n error?: { code?: number; message?: string };\n}\n\nfunction normalizeFinishReason(raw: string | null | undefined): FinishReason {\n switch (raw) {\n case \"stop\":\n case \"length\":\n case \"content-filter\":\n case \"error\":\n return raw;\n case \"tool_calls\":\n return \"tool-calls\";\n case null:\n case undefined:\n case \"\":\n return \"unknown\";\n default:\n return \"unknown\";\n }\n}\n\nfunction chunkUsage(chunk: OpenAiStreamChunk): TokenUsage {\n const u = chunk.usage ?? {};\n const cached =\n u.prompt_tokens_details?.cached_tokens ?? u.cache_read_input_tokens;\n return {\n promptTokens: typeof u.prompt_tokens === \"number\" ? u.prompt_tokens : 0,\n completionTokens:\n typeof u.completion_tokens === \"number\" ? u.completion_tokens : 0,\n totalTokens: typeof u.total_tokens === \"number\" ? u.total_tokens : 0,\n ...(typeof cached === \"number\" ? { cachedPromptTokens: cached } : {}),\n };\n}\n\n/**\n * Accumulator for partial tool-call function arguments streamed across\n * multiple chunks (Fireworks streams the `arguments` JSON token-by-token).\n */\nexport interface ToolCallAccumulator {\n byIndex: Map<\n number,\n { id: string; name: string; argsBuffer: string; emitted: boolean }\n >;\n}\n\nexport function createToolCallAccumulator(): ToolCallAccumulator {\n return { byIndex: new Map() };\n}\n\nfunction parseJsonOrRaw(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Map a single Fireworks/OpenAI chunk into zero or more StreamParts.\n * Tool calls are buffered until their `arguments` JSON is parseable, then\n * emitted as a single `tool-call` part — same convention as Vercel AI SDK.\n */\nexport function mapFireworksChunk(\n chunk: OpenAiStreamChunk,\n acc: ToolCallAccumulator,\n): StreamPart[] {\n const out: StreamPart[] = [];\n\n if (chunk.error?.message) {\n out.push({ type: \"error\", error: chunk.error.message });\n return out;\n }\n\n const choice = chunk.choices?.[0];\n const delta = choice?.delta;\n\n if (delta?.content) {\n out.push({ type: \"text-delta\", textDelta: delta.content });\n }\n\n const reasoning = delta?.reasoning_content ?? delta?.reasoning;\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n out.push({ type: \"reasoning\", textDelta: reasoning });\n }\n\n if (Array.isArray(delta?.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = typeof tc.index === \"number\" ? tc.index : 0;\n let entry = acc.byIndex.get(idx);\n if (!entry) {\n entry = { id: \"\", name: \"\", argsBuffer: \"\", emitted: false };\n acc.byIndex.set(idx, entry);\n }\n if (tc.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (typeof tc.function?.arguments === \"string\") {\n entry.argsBuffer += tc.function.arguments;\n }\n }\n }\n\n if (choice?.finish_reason) {\n // Flush any remaining tool calls whose args weren't a closing brace mid-stream.\n for (const entry of acc.byIndex.values()) {\n if (entry.emitted || !entry.name) continue;\n entry.emitted = true;\n out.push({\n type: \"tool-call\",\n toolCallId: entry.id || `call_${entry.name}_${Date.now()}`,\n toolName: entry.name,\n args: entry.argsBuffer ? parseJsonOrRaw(entry.argsBuffer) : {},\n });\n }\n out.push({\n type: \"finish\",\n finishReason: normalizeFinishReason(choice.finish_reason),\n usage: chunkUsage(chunk),\n });\n } else if (chunk.usage) {\n // Some providers emit usage in a trailing chunk without finish_reason.\n out.push({\n type: \"finish\",\n finishReason: \"unknown\",\n usage: chunkUsage(chunk),\n });\n }\n\n return out;\n}\n\n/**\n * Minimal shape of an `AgentStreamEvent` from `agent-stream.ts`. Inlined to\n * keep this module zero-import.\n */\nexport interface AgentStreamLikeEvent {\n type: string;\n [k: string]: unknown;\n}\n\nfunction asStr(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction asNum(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\n/**\n * Map an existing agent SSE event (`token`, `reasoning_token`, `tool:call`,\n * `tool:result`, `done`) into a StreamPart, or `null` for events that don't\n * map (`ping`, `agent:info`, `node:*`).\n */\nexport function mapAgentEvent(event: AgentStreamLikeEvent): StreamPart | null {\n switch (event.type) {\n case \"token\":\n return { type: \"text-delta\", textDelta: asStr(event.token) };\n case \"reasoning_token\":\n return { type: \"reasoning\", textDelta: asStr(event.token) };\n case \"tool:call\":\n return {\n type: \"tool-call\",\n toolCallId: asStr(event.nodeId),\n toolName: asStr(event.toolName),\n args: event.args,\n };\n case \"tool:result\":\n return {\n type: \"tool-result\",\n toolCallId: asStr(event.nodeId),\n toolName: asStr(event.toolName),\n result: event.result,\n ...(typeof event.durationMs === \"number\"\n ? { durationMs: event.durationMs }\n : {}),\n };\n case \"done\": {\n const usage: TokenUsage = {\n promptTokens: asNum(event.inputTokens),\n completionTokens: asNum(event.outputTokens),\n totalTokens: asNum(event.inputTokens) + asNum(event.outputTokens),\n ...(typeof event.cachedPromptTokens === \"number\"\n ? { cachedPromptTokens: event.cachedPromptTokens }\n : {}),\n };\n return {\n type: \"finish\",\n finishReason: normalizeFinishReason(\n asStr(event.finishReason) || asStr(event.stopReason) || null,\n ),\n usage,\n };\n }\n default:\n return null;\n }\n}\n","/**\n * Vercel AI SDK–style raw inference for `@ragable/sdk`. Routes through the\n * Ragable backend's Fireworks proxy\n * (`POST /public/organizations/:id/websites/:websiteId/inference/stream`)\n * so callers don't need a provider API key and credit usage is tracked\n * against the website's organization.\n */\n\nimport { bindFetch, extractErrorMessage, RagableError } from \"./request-client\";\nimport { parseMaybeJsonBody, parseSseDataLine } from \"./sse\";\nimport {\n createToolCallAccumulator,\n mapFireworksChunk,\n type FinishReason,\n type Message,\n type OpenAiStreamChunk,\n type StreamPart,\n type TokenUsage,\n type ToolCallAccumulator,\n} from \"./stream-parts\";\n\nexport interface StreamTextParams {\n model: string;\n messages: Message[];\n system?: string;\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n reasoningEffort?: \"none\" | \"low\" | \"medium\" | \"high\";\n signal?: AbortSignal;\n}\n\nexport interface ToolCallRecord {\n toolCallId: string;\n toolName: string;\n args: unknown;\n}\n\nexport interface StreamTextResult {\n /** Stream of text deltas only. Same content as `fullStream.filter(p => p.type === \"text-delta\")`. */\n textStream: AsyncIterable<string>;\n /** Full event stream — text deltas, reasoning, tool calls, finish, error. */\n fullStream: AsyncIterable<StreamPart>;\n /** Resolves to the concatenation of all `text-delta` parts once the stream finishes. */\n text: Promise<string>;\n /** Resolves to the concatenation of all `reasoning` parts. */\n reasoning: Promise<string>;\n /** Resolves to token usage from the final chunk (zeros if not reported). */\n usage: Promise<TokenUsage>;\n /** Resolves to the upstream finish reason. */\n finishReason: Promise<FinishReason>;\n /** Resolves to the list of tool calls extracted from this turn. */\n toolCalls: Promise<ToolCallRecord[]>;\n}\n\nexport interface GenerateTextResult {\n text: string;\n reasoning: string;\n usage: TokenUsage;\n finishReason: FinishReason;\n toolCalls: ToolCallRecord[];\n}\n\ninterface ResolvedPart {\n parts: StreamPart[];\n resolved: boolean;\n error: unknown;\n waiters: Array<() => void>;\n}\n\nclass PartBroadcast {\n private state: ResolvedPart = {\n parts: [],\n resolved: false,\n error: null,\n waiters: [],\n };\n\n push(part: StreamPart): void {\n this.state.parts.push(part);\n this.notify();\n }\n\n end(): void {\n if (this.state.resolved) return;\n this.state.resolved = true;\n this.notify();\n }\n\n fail(error: unknown): void {\n if (this.state.resolved) return;\n this.state.error = error;\n this.state.resolved = true;\n this.notify();\n }\n\n private notify(): void {\n const waiters = this.state.waiters;\n this.state.waiters = [];\n for (const w of waiters) w();\n }\n\n consume(): AsyncIterable<StreamPart> {\n const state = this.state;\n return {\n [Symbol.asyncIterator]: (): AsyncIterator<StreamPart> => {\n let idx = 0;\n return {\n next: async (): Promise<IteratorResult<StreamPart>> => {\n while (true) {\n if (idx < state.parts.length) {\n return { value: state.parts[idx++]!, done: false };\n }\n if (state.resolved) {\n if (state.error) throw state.error;\n return { value: undefined as unknown as StreamPart, done: true };\n }\n await new Promise<void>((resolve) => {\n state.waiters.push(resolve);\n });\n }\n },\n };\n },\n };\n }\n}\n\ninterface DeferredPromise<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason: unknown) => void;\n}\n\nfunction defer<T>(): DeferredPromise<T> {\n let resolve!: (value: T) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nconst ZERO_USAGE: TokenUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n};\n\n/**\n * Build the JSON body for the inference proxy. Public so tests can assert it.\n */\nexport function buildInferenceRequestBody(\n params: StreamTextParams,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: params.model,\n messages: params.messages,\n };\n if (params.system !== undefined) body.system = params.system;\n if (typeof params.temperature === \"number\")\n body.temperature = params.temperature;\n if (typeof params.maxTokens === \"number\") body.max_tokens = params.maxTokens;\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (params.reasoningEffort) body.reasoning_effort = params.reasoningEffort;\n return body;\n}\n\n/**\n * Consume a Fireworks-shaped SSE body and push StreamParts onto `broadcast`.\n * Resolves the deferred result promises when the stream ends or errors.\n */\nasync function consumeInferenceStream(\n body: ReadableStream<Uint8Array>,\n broadcast: PartBroadcast,\n deferreds: {\n text: DeferredPromise<string>;\n reasoning: DeferredPromise<string>;\n usage: DeferredPromise<TokenUsage>;\n finishReason: DeferredPromise<FinishReason>;\n toolCalls: DeferredPromise<ToolCallRecord[]>;\n },\n): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const acc: ToolCallAccumulator = createToolCallAccumulator();\n\n let textBuffer = \"\";\n let reasoningBuffer = \"\";\n let lastUsage: TokenUsage = ZERO_USAGE;\n let lastFinish: FinishReason = \"unknown\";\n const toolCallsArr: ToolCallRecord[] = [];\n let buffer = \"\";\n\n const dispatch = (rawLine: string): void => {\n const parsed = parseSseDataLine(rawLine);\n if (!parsed) return;\n const chunk = parsed as unknown as OpenAiStreamChunk;\n const parts = mapFireworksChunk(chunk, acc);\n for (const part of parts) {\n if (part.type === \"text-delta\") textBuffer += part.textDelta;\n else if (part.type === \"reasoning\") reasoningBuffer += part.textDelta;\n else if (part.type === \"tool-call\") {\n toolCallsArr.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n } else if (part.type === \"finish\") {\n lastFinish = part.finishReason;\n lastUsage = part.usage;\n }\n broadcast.push(part);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\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\")) dispatch(line);\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n if (buffer.trim().length > 0) {\n for (const line of buffer.split(\"\\n\")) dispatch(line);\n }\n\n broadcast.end();\n deferreds.text.resolve(textBuffer);\n deferreds.reasoning.resolve(reasoningBuffer);\n deferreds.usage.resolve(lastUsage);\n deferreds.finishReason.resolve(lastFinish);\n deferreds.toolCalls.resolve(toolCallsArr);\n } catch (error) {\n broadcast.fail(error);\n deferreds.text.reject(error);\n deferreds.reasoning.reject(error);\n deferreds.usage.reject(error);\n deferreds.finishReason.reject(error);\n deferreds.toolCalls.reject(error);\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // already released\n }\n }\n}\n\n/**\n * Build a `StreamTextResult` from a pre-existing async iterable of StreamParts.\n * Used by `client.agents.run()` to share the same DX as `client.ai.streamText`.\n */\nexport function createStreamResultFromParts(\n source: AsyncIterable<StreamPart>,\n): StreamTextResult {\n const broadcast = new PartBroadcast();\n const text = defer<string>();\n const reasoning = defer<string>();\n const usage = defer<TokenUsage>();\n const finishReason = defer<FinishReason>();\n const toolCalls = defer<ToolCallRecord[]>();\n\n void (async () => {\n let textBuffer = \"\";\n let reasoningBuffer = \"\";\n let lastUsage: TokenUsage = ZERO_USAGE;\n let lastFinish: FinishReason = \"unknown\";\n const toolCallsArr: ToolCallRecord[] = [];\n try {\n for await (const part of source) {\n if (part.type === \"text-delta\") textBuffer += part.textDelta;\n else if (part.type === \"reasoning\")\n reasoningBuffer += part.textDelta;\n else if (part.type === \"tool-call\") {\n toolCallsArr.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n } else if (part.type === \"finish\") {\n lastFinish = part.finishReason;\n lastUsage = part.usage;\n }\n broadcast.push(part);\n }\n broadcast.end();\n text.resolve(textBuffer);\n reasoning.resolve(reasoningBuffer);\n usage.resolve(lastUsage);\n finishReason.resolve(lastFinish);\n toolCalls.resolve(toolCallsArr);\n } catch (error) {\n broadcast.fail(error);\n text.reject(error);\n reasoning.reject(error);\n usage.reject(error);\n finishReason.reject(error);\n toolCalls.reject(error);\n }\n })();\n\n return {\n fullStream: broadcast.consume(),\n textStream: {\n [Symbol.asyncIterator]: (): AsyncIterator<string> => {\n const inner = broadcast.consume()[Symbol.asyncIterator]();\n return {\n next: async (): Promise<IteratorResult<string>> => {\n while (true) {\n const r = await inner.next();\n if (r.done)\n return { value: undefined as unknown as string, done: true };\n if (r.value.type === \"text-delta\") {\n return { value: r.value.textDelta, done: false };\n }\n }\n },\n };\n },\n },\n text: text.promise,\n reasoning: reasoning.promise,\n usage: usage.promise,\n finishReason: finishReason.promise,\n toolCalls: toolCalls.promise,\n };\n}\n\nexport interface InferenceRequestContext {\n /** Resolved URL of the inference endpoint. */\n url: string;\n /** Pre-built request headers (`Content-Type` already set). */\n headers: Headers;\n /** Bound fetch (already wraps user `fetch` option). */\n fetch: typeof fetch;\n}\n\n/**\n * Open the inference SSE stream and return a `StreamTextResult`. Exposed\n * separately so `agents.run` can share the same fan-out plumbing later if\n * we ever want a backend-agnostic chunk format.\n */\nexport function streamInferenceFromContext(\n ctx: InferenceRequestContext,\n params: StreamTextParams,\n): StreamTextResult {\n const broadcast = new PartBroadcast();\n const text = defer<string>();\n const reasoning = defer<string>();\n const usage = defer<TokenUsage>();\n const finishReason = defer<FinishReason>();\n const toolCalls = defer<ToolCallRecord[]>();\n\n const start = async (): Promise<void> => {\n const response = await ctx.fetch(ctx.url, {\n method: \"POST\",\n headers: ctx.headers,\n body: JSON.stringify(buildInferenceRequestBody(params)),\n ...(params.signal !== undefined ? { signal: params.signal } : {}),\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 if (!response.body) {\n throw new RagableError(\"Inference stream has no body\", 502, {\n code: \"SDK_INFERENCE_STREAM_NO_BODY\",\n });\n }\n\n await consumeInferenceStream(response.body, broadcast, {\n text,\n reasoning,\n usage,\n finishReason,\n toolCalls,\n });\n };\n\n // Kick off in background — the consumer drives it via the iterables / promises.\n start().catch((err) => {\n broadcast.fail(err);\n text.reject(err);\n reasoning.reject(err);\n usage.reject(err);\n finishReason.reject(err);\n toolCalls.reject(err);\n });\n\n return {\n fullStream: broadcast.consume(),\n textStream: {\n [Symbol.asyncIterator]: (): AsyncIterator<string> => {\n const inner = broadcast.consume()[Symbol.asyncIterator]();\n return {\n next: async (): Promise<IteratorResult<string>> => {\n while (true) {\n const r = await inner.next();\n if (r.done) return { value: undefined as unknown as string, done: true };\n if (r.value.type === \"text-delta\") {\n return { value: r.value.textDelta, done: false };\n }\n }\n },\n };\n },\n },\n text: text.promise,\n reasoning: reasoning.promise,\n usage: usage.promise,\n finishReason: finishReason.promise,\n toolCalls: toolCalls.promise,\n };\n}\n\ninterface AiClientOptions {\n organizationId: string;\n websiteId?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n /** API base override; defaults to the shared SDK base. */\n apiBase: string;\n}\n\nexport class RagableBrowserAiClient {\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: AiClientOptions) {\n this.fetchImpl = bindFetch(options.fetch);\n }\n\n private requireWebsiteId(): string {\n const id = this.options.websiteId?.trim();\n if (!id) {\n throw new RagableError(\n \"client.ai.streamText requires websiteId on the client. Pass createBrowserClient({ websiteId, organizationId, ... }).\",\n 400,\n { code: \"SDK_MISSING_WEBSITE_ID\" },\n );\n }\n return id;\n }\n\n private buildContext(): InferenceRequestContext {\n const url = `${this.options.apiBase}/public/organizations/${encodeURIComponent(\n this.options.organizationId,\n )}/websites/${encodeURIComponent(\n this.requireWebsiteId(),\n )}/inference/stream`;\n const headers = new Headers(this.options.headers);\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"Accept\", \"text/event-stream\");\n return { url, headers, fetch: this.fetchImpl };\n }\n\n streamText(params: StreamTextParams): StreamTextResult {\n return streamInferenceFromContext(this.buildContext(), params);\n }\n\n async generateText(params: StreamTextParams): Promise<GenerateTextResult> {\n const result = this.streamText(params);\n // Drain the fullStream so promises settle even if the caller never iterates.\n for await (const _ of result.fullStream) {\n void _;\n }\n const [text, reasoning, usage, finishReason, toolCalls] = await Promise.all(\n [\n result.text,\n result.reasoning,\n result.usage,\n result.finishReason,\n result.toolCalls,\n ],\n );\n return { text, reasoning, usage, finishReason, toolCalls };\n }\n}\n","import type {\r\n AgentChatStreamUiHandlers,\r\n AgentChatUiStreamResult,\r\n} from \"./agent-chat-ui\";\r\nimport { runAgentChatStreamForUi } from \"./agent-chat-ui\";\r\nimport {\r\n runAgentChatStream,\r\n type AgentChatStreamHandlers,\r\n type AgentChatStreamResult,\r\n type AgentChatParams,\r\n type AgentStreamEvent,\r\n} from \"./agent-stream\";\r\nimport {\r\n bindFetch,\r\n DEFAULT_RAGABLE_API_BASE,\r\n extractErrorMessage,\r\n RagableError,\r\n} from \"./request-client\";\r\nimport type {\r\n DefaultRagableDatabase,\r\n RagableDatabase,\r\n RagableTableNames,\r\n TableInsertRow,\r\n TableRow,\r\n TableUpdatePatch,\r\n} from \"./database-schema\";\r\nimport { parseMaybeJsonBody, readSseStream } from \"./sse\";\r\nimport {\r\n asPostgrestResponse,\r\n PostgrestTableApi,\r\n type PostgRESTFetch,\r\n type PostgRESTFetchParams,\r\n type PostgrestResult,\r\n} from \"./browser-postgrest\";\r\nexport {\r\n assertPostgrestSuccess,\r\n toRagableResult,\r\n unwrapPostgrest,\r\n} from \"./browser-postgrest\";\r\nimport {\r\n RagableAuth,\r\n type AuthSignUpCredentials,\r\n type AuthChangeEvent,\r\n type AuthOptions,\r\n type AuthSession,\r\n type AuthUpdateUserAttributes,\r\n type AuthUserMetadata,\r\n type DefaultAuthUser,\r\n} from \"./auth\";\r\nimport { Transport, type TransportOptions } from \"./transport\";\r\nimport {\r\n RagableBrowserAiClient,\r\n createStreamResultFromParts,\r\n type StreamTextResult,\r\n} from \"./ai\";\r\nimport { mapAgentEvent, type StreamPart, type Message } from \"./stream-parts\";\r\n\r\n/** Canonical browser/server API base (`…/api`, no trailing slash). */\r\nexport function normalizeBrowserApiBase(): string {\r\n return DEFAULT_RAGABLE_API_BASE.replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport type BrowserDataAuthMode = \"user\" | \"publicAnon\" | \"admin\";\r\n\r\n/**\r\n * Resolves how database requests are authorized. If `dataAuth` is omitted and a\r\n * static browser data key is configured (`dataStaticKey` / `getDataStaticKey`),\r\n * defaults to **`publicAnon`** so public apps can use shared collections without\r\n * sign-in. Use explicit **`dataAuth: \"user\"`** when you need JWT sessions; use\r\n * **`\"admin\"`** when the static key is a data-admin key.\r\n */\r\nexport function effectiveDataAuth(\r\n options: RagableBrowserClientOptions,\r\n): BrowserDataAuthMode {\r\n if (options.dataAuth) return options.dataAuth;\r\n const hasStatic =\r\n Boolean(options.dataStaticKey?.trim()) ||\r\n typeof options.getDataStaticKey === \"function\";\r\n if (hasStatic) return \"publicAnon\";\r\n return \"user\";\r\n}\r\n\r\nexport interface RagableBrowserClientOptions {\r\n organizationId: string;\r\n websiteId?: string;\r\n authGroupId?: string;\r\n databaseInstanceId?: string;\r\n /** When omitted, inferred from static keys — see {@link effectiveDataAuth}. */\r\n dataAuth?: BrowserDataAuthMode;\r\n /** Public anon or data-admin key from the dashboard (Browser Data API keys). */\r\n dataStaticKey?: string;\r\n getDataStaticKey?: () => string | null | Promise<string | null>;\r\n getAccessToken?: () => string | null | Promise<string | null>;\r\n fetch?: typeof fetch;\r\n headers?: HeadersInit;\r\n auth?: AuthOptions;\r\n transport?: Partial<TransportOptions>;\r\n}\r\n\r\nfunction requireAuthGroupId(options: RagableBrowserClientOptions): string {\r\n const id = options.authGroupId?.trim();\r\n if (!id) {\r\n throw new RagableError(\r\n \"authGroupId is required for auth and database methods on the browser client\",\r\n 400,\r\n { code: \"SDK_MISSING_AUTH_GROUP_ID\" },\r\n );\r\n }\r\n return id;\r\n}\r\n\r\nasync function requireAccessToken(\r\n options: RagableBrowserClientOptions,\r\n ragableAuth: RagableAuth | null,\r\n): Promise<string> {\r\n if (ragableAuth) {\r\n const token = await ragableAuth.getValidAccessToken();\r\n if (token) return token;\r\n }\r\n const getter = options.getAccessToken;\r\n if (getter) {\r\n const token = await getter();\r\n if (token?.trim()) return token.trim();\r\n }\r\n throw new RagableError(\r\n \"No access token available. Sign in first with auth.signInWithPassword() or provide getAccessToken callback.\",\r\n 401,\r\n { code: \"SDK_NO_ACCESS_TOKEN\" },\r\n );\r\n}\r\n\r\nasync function resolveDatabaseAuthBearer(\r\n options: RagableBrowserClientOptions,\r\n ragableAuth: RagableAuth | null,\r\n): Promise<string> {\r\n const mode = effectiveDataAuth(options);\r\n if (mode === \"user\") {\r\n return requireAccessToken(options, ragableAuth);\r\n }\r\n const fromGetter = options.getDataStaticKey\r\n ? await options.getDataStaticKey()\r\n : null;\r\n const key = (fromGetter?.trim() || options.dataStaticKey?.trim()) ?? \"\";\r\n if (!key) {\r\n throw new RagableError(\r\n mode === \"publicAnon\"\r\n ? \"dataAuth publicAnon requires getDataStaticKey or dataStaticKey\"\r\n : \"dataAuth admin requires getDataStaticKey or dataStaticKey\",\r\n 400,\r\n { code: \"SDK_MISSING_STATIC_KEY\" },\r\n );\r\n }\r\n return key;\r\n}\r\n\r\n// ─── Session types (kept for back-compat) ────────────────────────────────────\r\n\r\nexport interface BrowserAuthSession<\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n user: AuthUser;\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n}\r\n\r\nexport interface BrowserAuthTokens {\r\n accessToken: string;\r\n refreshToken: string;\r\n expiresIn: string;\r\n}\r\n\r\nexport interface SupabaseCompatSession<\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n token_type: \"bearer\";\r\n user: AuthUser;\r\n}\r\n\r\nexport type { PostgrestResult };\r\nexport type { RagableResult } from \"./browser-postgrest\";\r\n\r\n// ─── RagableBrowserAuthClient (back-compat shim) ─────────────────────────────\r\n\r\nexport class RagableBrowserAuthClient<\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n constructor(\r\n _options: RagableBrowserClientOptions,\r\n private readonly ragableAuth: RagableAuth<AuthUser> | null = null,\r\n ) {}\r\n\r\n private get auth(): RagableAuth<AuthUser> {\r\n if (!this.ragableAuth) {\r\n throw new Error(\"Auth not initialized — provide authGroupId to enable auth\");\r\n }\r\n return this.ragableAuth;\r\n }\r\n\r\n async signUp(\r\n credentials: AuthSignUpCredentials<\r\n AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Metadata\r\n : AuthUserMetadata\r\n : AuthUserMetadata\r\n >,\r\n ): Promise<\r\n PostgrestResult<{\r\n user: AuthUser;\r\n session: SupabaseCompatSession<AuthUser>;\r\n }>\r\n > {\r\n const result = await this.auth.signUp(credentials);\r\n if (result.error) return { data: null, error: result.error };\r\n const session = result.data!.session;\r\n return {\r\n data: {\r\n user: session.user,\r\n session: {\r\n access_token: session.access_token,\r\n refresh_token: session.refresh_token,\r\n expires_in: session.expires_in,\r\n token_type: \"bearer\",\r\n user: session.user,\r\n },\r\n },\r\n error: null,\r\n };\r\n }\r\n\r\n async signInWithPassword(credentials: {\r\n email: string;\r\n password: string;\r\n }): Promise<\r\n PostgrestResult<{\r\n user: AuthUser;\r\n session: SupabaseCompatSession<AuthUser>;\r\n }>\r\n > {\r\n const result = await this.auth.signInWithPassword(credentials);\r\n if (result.error) return { data: null, error: result.error };\r\n const session = result.data!.session;\r\n return {\r\n data: {\r\n user: session.user,\r\n session: {\r\n access_token: session.access_token,\r\n refresh_token: session.refresh_token,\r\n expires_in: session.expires_in,\r\n token_type: \"bearer\",\r\n user: session.user,\r\n },\r\n },\r\n error: null,\r\n };\r\n }\r\n\r\n async refreshSession(refreshToken: string): Promise<\r\n PostgrestResult<{ session: SupabaseCompatSession<AuthUser>; user: AuthUser }>\r\n > {\r\n const result = await this.auth.refreshSession(refreshToken);\r\n if (result.error) return { data: null, error: result.error };\r\n const session = result.data!.session;\r\n return {\r\n data: {\r\n user: session.user,\r\n session: {\r\n access_token: session.access_token,\r\n refresh_token: session.refresh_token,\r\n expires_in: session.expires_in,\r\n token_type: \"bearer\",\r\n user: session.user,\r\n },\r\n },\r\n error: null,\r\n };\r\n }\r\n\r\n async getUser(): Promise<PostgrestResult<{ user: AuthUser }>> {\r\n return this.auth.getUser();\r\n }\r\n\r\n async updateUser(\r\n attributes: AuthUpdateUserAttributes<\r\n AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Metadata\r\n : AuthUserMetadata\r\n : AuthUserMetadata\r\n >,\r\n ): Promise<PostgrestResult<{ user: AuthUser }>> {\r\n return this.auth.updateUser(attributes);\r\n }\r\n\r\n async signOut(_options?: { scope?: \"global\" | \"local\" }): Promise<{\r\n error: null;\r\n }> {\r\n return this.auth.signOut(_options);\r\n }\r\n\r\n async register(body: {\r\n email: string;\r\n password: string;\r\n name?: string;\r\n data?: AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Partial<Metadata> & { name?: string | null }\r\n : Record<string, unknown>\r\n : Record<string, unknown>;\r\n }): Promise<BrowserAuthSession<AuthUser>> {\r\n return this.auth.register(body as Parameters<RagableAuth<AuthUser>[\"register\"]>[0]);\r\n }\r\n\r\n async login(body: {\r\n email: string;\r\n password: string;\r\n }): Promise<BrowserAuthSession<AuthUser>> {\r\n return this.auth.login(body);\r\n }\r\n\r\n async refresh(body: { refreshToken: string }): Promise<BrowserAuthTokens> {\r\n return this.auth.refresh(body);\r\n }\r\n\r\n async getMe(): Promise<{ user: AuthUser }> {\r\n return this.auth.getMe();\r\n }\r\n\r\n async updateMe(body: {\r\n email?: string;\r\n name?: string | null;\r\n password?: string;\r\n data?: AuthUser extends { metadata: infer Metadata }\r\n ? Metadata extends AuthUserMetadata\r\n ? Partial<Metadata> & { name?: string | null }\r\n : Record<string, unknown>\r\n : Record<string, unknown>;\r\n }): Promise<{ user: AuthUser }> {\r\n return this.auth.updateMe(body as Parameters<RagableAuth<AuthUser>[\"updateMe\"]>[0]);\r\n }\r\n\r\n onAuthStateChange(\r\n callback: (event: AuthChangeEvent, session: AuthSession<AuthUser> | null) => void,\r\n ): { data: { subscription: { id: string; unsubscribe: () => void } } } {\r\n return this.auth.onAuthStateChange(callback);\r\n }\r\n\r\n getSession(): Promise<PostgrestResult<{ session: AuthSession<AuthUser> | null }>> {\r\n return this.auth.getSession();\r\n }\r\n}\r\n\r\n// ─── SQL query types ─────────────────────────────────────────────────────────\r\n\r\nexport interface BrowserSqlQueryParams {\r\n databaseInstanceId?: string;\r\n sql: string;\r\n params?: unknown[];\r\n readOnly?: boolean;\r\n timeoutMs?: number;\r\n rowLimit?: number;\r\n}\r\n\r\nexport interface BrowserSqlQueryResult<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> {\r\n command: string;\r\n rowCount: number;\r\n truncated: boolean;\r\n rows: Row[];\r\n}\r\n\r\n// ─── Database client ─────────────────────────────────────────────────────────\r\n\r\nexport interface BrowserCollectionRecord<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> {\r\n [key: string]: unknown;\r\n id: string;\r\n data: Row;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/**\r\n * Collection APIs return record envelopes, but user schema `Row` types should be\r\n * the JSON row inside `record.data`. If generated app types accidentally use the\r\n * envelope as `Row`, unwrap it so consumers still get `record.data.<field>`.\r\n */\r\nexport type BrowserCollectionRowData<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = Row extends {\r\n id: string;\r\n data: infer Data;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n ? Data extends Record<string, unknown>\r\n ? Data\r\n : Row\r\n : Row;\r\n\r\ntype BrowserCollectionInsertData<\r\n Row extends Record<string, unknown>,\r\n Insert extends Record<string, unknown>,\r\n> = BrowserCollectionRowData<Row> extends Row\r\n ? Insert\r\n : Insert extends {\r\n data: infer Data;\r\n }\r\n ? Data extends Record<string, unknown>\r\n ? Data\r\n : BrowserCollectionRowData<Row>\r\n : BrowserCollectionRowData<Row>;\r\n\r\ntype BrowserCollectionUpdateData<\r\n Row extends Record<string, unknown>,\r\n Update extends Record<string, unknown>,\r\n> = BrowserCollectionRowData<Row> extends Row\r\n ? Update\r\n : Update extends {\r\n data?: infer Data;\r\n }\r\n ? Data extends Record<string, unknown>\r\n ? Partial<Data>\r\n : Partial<BrowserCollectionRowData<Row>>\r\n : Partial<BrowserCollectionRowData<Row>>;\r\n\r\nexport interface BrowserCollectionDefinition {\r\n id: string;\r\n name: string;\r\n schema: Record<string, unknown> | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/**\r\n * Prisma-style operator object for a single field (server-supported ops).\r\n * Typed loosely so schema-specific refinements can be added in app code.\r\n */\r\nexport type WhereOperatorObject = {\r\n eq?: unknown;\r\n neq?: unknown;\r\n gt?: number;\r\n gte?: number;\r\n lt?: number;\r\n lte?: number;\r\n in?: unknown;\r\n contains?: unknown;\r\n};\r\n\r\n/**\r\n * `where` filters: equality on values, or per-field operator objects.\r\n * Use `id`, `createdAt`, `updatedAt` to match the record envelope (DB columns), not `data` JSON\r\n * (unless you also have those keys in your JSON — prefer envelope keys for `id`).\r\n */\r\nexport type WhereInput<Row extends Record<string, unknown>> = {\r\n [K in keyof Row]?: Row[K] | WhereOperatorObject | null;\r\n} & {\r\n id?: string | WhereOperatorObject;\r\n createdAt?: string | WhereOperatorObject;\r\n updatedAt?: string | WhereOperatorObject;\r\n};\r\n\r\n/** @deprecated Use {@link WhereInput} — same shape. */\r\nexport type CollectionWhere<Row extends Record<string, unknown>> = WhereInput<Row>;\r\n\r\ntype CollectionFilter<Row extends Record<string, unknown>> = {\r\n [Field in Extract<keyof Row, string>]: {\r\n field: Field;\r\n op?: \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"in\" | \"contains\";\r\n value: Row[Field];\r\n };\r\n}[Extract<keyof Row, string>];\r\n\r\nexport type CollectionReturnMode = \"envelope\" | \"flat\";\r\n\r\n/**\r\n * One row: JSON fields at the top level, envelope fields under `meta`\r\n * (when using {@link BrowserCollectionApi.findMany} with `return: \"flat\"`).\r\n */\r\nexport type CollectionRowWithMeta<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = Row & {\r\n meta: { id: string; createdAt: string; updatedAt: string };\r\n};\r\n\r\nexport function collectionRecordToRowWithMeta<Row extends Record<string, unknown>>(\r\n record: BrowserCollectionRecord<Row>,\r\n): CollectionRowWithMeta<Row> {\r\n const { data, id, createdAt, updatedAt } = record;\r\n return { ...(data as Row), meta: { id, createdAt, updatedAt } };\r\n}\r\n\r\nexport function collectionRecordsToRowWithMeta<Row extends Record<string, unknown>>(\r\n records: BrowserCollectionRecord<Row>[],\r\n): CollectionRowWithMeta<Row>[] {\r\n return records.map(collectionRecordToRowWithMeta);\r\n}\r\n\r\nconst FIND_QUERY_KEYS = [\r\n \"where\",\r\n \"filters\",\r\n \"limit\",\r\n \"offset\",\r\n \"orderBy\",\r\n \"orderDirection\",\r\n \"return\",\r\n] as const;\r\n\r\nexport type BrowserCollectionFindParams<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = {\r\n where?: WhereInput<Row>;\r\n filters?: Array<{\r\n field: Extract<keyof Row, string> | (string & {});\r\n op?: \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"in\" | \"contains\";\r\n value: unknown;\r\n } | CollectionFilter<Row>>;\r\n limit?: number;\r\n offset?: number;\r\n orderBy?:\r\n | Extract<keyof Row, string>\r\n | \"id\"\r\n | \"createdAt\"\r\n | \"updatedAt\"\r\n | (string & {});\r\n orderDirection?: \"asc\" | \"desc\";\r\n /**\r\n * - `envelope` (default): `Array<{ id, data, createdAt, updatedAt }>`\r\n * - `flat`: {@link CollectionRowWithMeta} — row fields at top level + `meta` for `id` / timestamps\r\n */\r\n return?: CollectionReturnMode;\r\n};\r\n\r\nexport type CollectionRowData<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n> = BrowserCollectionRowData<Row>;\r\n\r\ntype RowD<Row extends Record<string, unknown>> = BrowserCollectionRowData<Row>;\r\n\r\nexport class BrowserCollectionApi<\r\n Row extends Record<string, unknown> = Record<string, unknown>,\r\n Insert extends Record<string, unknown> = Row,\r\n Update extends Record<string, unknown> = Partial<Row>,\r\n> {\r\n constructor(\r\n private readonly database: RagableBrowserDatabaseClient<any>,\r\n private readonly name: string,\r\n private readonly databaseInstanceId?: string,\r\n ) {}\r\n\r\n private normalizeFindArgs(whereOrParams: unknown): {\r\n returnMode: CollectionReturnMode;\r\n body: Record<string, unknown>;\r\n } {\r\n const hasQueryKeys =\r\n typeof whereOrParams === \"object\" &&\r\n whereOrParams !== null &&\r\n FIND_QUERY_KEYS.some((key) =>\r\n Object.prototype.hasOwnProperty.call(whereOrParams, key),\r\n );\r\n const raw: Record<string, unknown> = hasQueryKeys\r\n ? { ...(whereOrParams as object) }\r\n : { where: whereOrParams };\r\n const returnMode: CollectionReturnMode =\r\n raw[\"return\"] === \"flat\" ? \"flat\" : \"envelope\";\r\n delete raw[\"return\"];\r\n return { returnMode, body: raw };\r\n }\r\n\r\n private requestFind = (\r\n body: Record<string, unknown>,\r\n ): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>>[]>> =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>[]>(\r\n \"POST\",\r\n `/${encodeURIComponent(this.name)}/find`,\r\n body,\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Query collection rows. Prefer this over the deprecated `find` alias.\r\n * Use `return: \"flat\"` to get {@link CollectionRowWithMeta} without nested `.data`.\r\n */\r\n findMany = async (\r\n whereOrParams:\r\n | WhereInput<RowD<Row>>\r\n | BrowserCollectionFindParams<RowD<Row>> = {},\r\n ): Promise<\r\n PostgrestResult<\r\n | BrowserCollectionRecord<RowD<Row>>[]\r\n | CollectionRowWithMeta<RowD<Row>>[]\r\n >\r\n > => {\r\n const { returnMode, body } = this.normalizeFindArgs(whereOrParams);\r\n const res = await this.requestFind(body);\r\n if (res.error) return res;\r\n if (returnMode === \"flat\") {\r\n return {\r\n data: collectionRecordsToRowWithMeta<RowD<Row>>(res.data),\r\n error: null,\r\n };\r\n }\r\n return res;\r\n };\r\n\r\n /**\r\n * @deprecated Use {@link BrowserCollectionApi.findMany} — same behavior.\r\n */\r\n find = (\r\n whereOrParams:\r\n | WhereInput<RowD<Row>>\r\n | BrowserCollectionFindParams<RowD<Row>> = {},\r\n ): Promise<\r\n PostgrestResult<\r\n | BrowserCollectionRecord<RowD<Row>>[]\r\n | CollectionRowWithMeta<RowD<Row>>[]\r\n >\r\n > => this.findMany(whereOrParams);\r\n\r\n /**\r\n * At most one row, `data` is the record or `null` if none match (not an error).\r\n */\r\n findFirst = async (\r\n whereOrParams:\r\n | WhereInput<RowD<Row>>\r\n | Omit<BrowserCollectionFindParams<RowD<Row>>, \"return\"> = {},\r\n ): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>> | null>> => {\r\n const { body } = this.normalizeFindArgs(whereOrParams);\r\n const withCap = { ...body, limit: 1, offset: body[\"offset\"] ?? 0 };\r\n const res = await this.requestFind(withCap);\r\n if (res.error) return res;\r\n return { data: res.data[0] ?? null, error: null };\r\n };\r\n\r\n /**\r\n * Lookup by primary key `id` (envelope). Equivalent to\r\n * `findFirst({ where: { id }, limit: 1 })` with a typed `where.id`.\r\n */\r\n findUnique = async (args: {\r\n where: { id: string } & Partial<WhereInput<RowD<Row>>>;\r\n }): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>> | null>> => {\r\n return this.findFirst({ where: args.where });\r\n };\r\n\r\n insert = (\r\n data: BrowserCollectionInsertData<Row, Insert>,\r\n ): Promise<\r\n PostgrestResult<BrowserCollectionRecord<RowD<Row>>>\r\n > =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>>(\r\n \"POST\",\r\n `/${encodeURIComponent(this.name)}/records`,\r\n { data },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Insert multiple rows in one request (server multi-value `INSERT`, single transaction).\r\n * Empty **`items`** resolves to an empty array. Max batch size is enforced on the server (500).\r\n */\r\n insertMany = (\r\n items: BrowserCollectionInsertData<Row, Insert>[],\r\n ): Promise<\r\n PostgrestResult<BrowserCollectionRecord<RowD<Row>>[]>\r\n > =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>[]>(\r\n \"POST\",\r\n `/${encodeURIComponent(this.name)}/records/batch`,\r\n { items },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Update rows matching `where` (JSON fields, plus envelope `id` / `createdAt` / `updatedAt`).\r\n */\r\n update = (\r\n where: WhereInput<RowD<Row>>,\r\n patch: BrowserCollectionUpdateData<Row, Update>,\r\n options?: { limit?: number },\r\n ): Promise<PostgrestResult<BrowserCollectionRecord<RowD<Row>>[]>> =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<BrowserCollectionRecord<RowD<Row>>[]>(\r\n \"PATCH\",\r\n `/${encodeURIComponent(this.name)}/records`,\r\n { where, patch, ...(options?.limit ? { limit: options.limit } : {}) },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Like {@link BrowserCollectionApi.update} but the success payload includes\r\n * `meta.count` (number of rows returned from the update, bounded by `limit`).\r\n */\r\n updateMany = async (\r\n where: WhereInput<RowD<Row>>,\r\n patch: BrowserCollectionUpdateData<Row, Update>,\r\n options?: { limit?: number },\r\n ): Promise<\r\n PostgrestResult<{\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n meta: { count: number };\r\n }>\r\n > => {\r\n const r = await this.update(where, patch, options);\r\n if (r.error) return r;\r\n return { data: { records: r.data, meta: { count: r.data.length } }, error: null };\r\n };\r\n\r\n delete = (\r\n where: WhereInput<RowD<Row>>,\r\n options?: { limit?: number },\r\n ): Promise<\r\n PostgrestResult<{\r\n deleted: number;\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n }>\r\n > =>\r\n asPostgrestResponse(() =>\r\n this.database._requestCollection<{\r\n deleted: number;\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n }>(\r\n \"DELETE\",\r\n `/${encodeURIComponent(this.name)}/records`,\r\n { where, ...(options?.limit ? { limit: options.limit } : {}) },\r\n this.databaseInstanceId,\r\n ),\r\n );\r\n\r\n /**\r\n * Like {@link BrowserCollectionApi.delete} but the success payload includes **`meta.count`**\r\n * (number of deleted rows), matching {@link BrowserCollectionApi.updateMany}.\r\n */\r\n deleteMany = async (\r\n where: WhereInput<RowD<Row>>,\r\n options?: { limit?: number },\r\n ): Promise<\r\n PostgrestResult<{\r\n records: BrowserCollectionRecord<RowD<Row>>[];\r\n meta: { count: number };\r\n }>\r\n > => {\r\n const r = await this.delete(where, options);\r\n if (r.error) return r;\r\n return {\r\n data: {\r\n records: r.data.records,\r\n meta: { count: r.data.deleted },\r\n },\r\n error: null,\r\n };\r\n };\r\n}\r\n\r\nexport type BrowserCollections<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n> = [keyof Database[\"public\"][\"Tables\"]] extends [never]\r\n ? Record<string, BrowserCollectionApi<Record<string, unknown>>>\r\n : {\r\n readonly [Name in RagableTableNames<Database>]: BrowserCollectionApi<\r\n TableRow<Database, Name>,\r\n TableInsertRow<Database, Name>,\r\n TableUpdatePatch<Database, Name>\r\n >;\r\n };\r\n\r\nexport type BrowserCollectionFactory<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n> = {\r\n <Name extends RagableTableNames<Database>>(\r\n name: Name,\r\n databaseInstanceId?: string,\r\n ): BrowserCollectionApi<\r\n TableRow<Database, Name>,\r\n TableInsertRow<Database, Name>,\r\n TableUpdatePatch<Database, Name>\r\n >;\r\n <Row extends Record<string, unknown>>(\r\n name: string,\r\n databaseInstanceId?: string,\r\n ): BrowserCollectionApi<Row>;\r\n};\r\n\r\nexport class RagableBrowserDatabaseClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n> {\r\n private readonly fetchImpl: typeof fetch;\r\n private _transport: Transport | null = null;\r\n readonly collections: BrowserCollections<Database>;\r\n readonly collection: BrowserCollectionFactory<Database>;\r\n\r\n constructor(\r\n private readonly options: RagableBrowserClientOptions,\r\n private readonly ragableAuth: RagableAuth | null = null,\r\n ) {\r\n this.fetchImpl = bindFetch(options.fetch);\r\n this.collections = new Proxy(\r\n {},\r\n {\r\n get: (_target, prop) => {\r\n if (typeof prop !== \"string\") return undefined;\r\n if (prop === \"then\") return undefined;\r\n return this.collection(prop);\r\n },\r\n },\r\n ) as BrowserCollections<Database>;\r\n this.collection = ((name: string, databaseInstanceId?: string) =>\r\n new BrowserCollectionApi(\r\n this,\r\n name,\r\n databaseInstanceId,\r\n )) as BrowserCollectionFactory<Database>;\r\n }\r\n\r\n /** @internal Called by RagableBrowser to share the Transport instance. */\r\n _setTransport(transport: Transport): void {\r\n this._transport = transport;\r\n }\r\n\r\n /**\r\n * PostgREST table access. Instance field so `client.database.from` is always an own,\r\n * enumerable function (avoids rare prototype/bundler issues).\r\n */\r\n from = <TableName extends RagableTableNames<Database>>(\r\n table: TableName,\r\n databaseInstanceId?: string,\r\n ): PostgrestTableApi<Database, TableName> => {\r\n const id =\r\n databaseInstanceId?.trim() || this.options.databaseInstanceId?.trim() || \"\";\r\n const ragableAuth = this.ragableAuth;\r\n const opts = this.options;\r\n const transport = this._transport;\r\n const fetchImpl = this.fetchImpl;\r\n\r\n const pgFetch: PostgRESTFetch = async (params: PostgRESTFetchParams) => {\r\n if (!params.databaseInstanceId?.trim()) {\r\n throw new RagableError(\r\n \"database.from() requires databaseInstanceId in client options or as the second argument\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n const gid = requireAuthGroupId(opts);\r\n const token = await resolveDatabaseAuthBearer(opts, ragableAuth);\r\n const apiBase = normalizeBrowserApiBase();\r\n const qs = params.searchParams.toString();\r\n const url = `${apiBase}/auth-groups/${gid}/data/rest/${params.table}${qs ? `?${qs}` : \"\"}`;\r\n\r\n const headers = new Headers(opts.headers);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"X-Database-Instance-Id\", params.databaseInstanceId);\r\n if (params.body !== undefined) {\r\n headers.set(\"Content-Type\", \"application/json\");\r\n }\r\n if (params.headers) {\r\n for (const [k, v] of Object.entries(params.headers)) {\r\n headers.set(k, v);\r\n }\r\n }\r\n\r\n if (transport) {\r\n return transport.execute({\r\n url,\r\n method: params.method,\r\n headers,\r\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\r\n signal: params.signal,\r\n idempotencyKey: params.idempotencyKey,\r\n });\r\n }\r\n\r\n return fetchImpl(url, {\r\n method: params.method,\r\n headers,\r\n body: params.body !== undefined ? JSON.stringify(params.body) : undefined,\r\n signal: params.signal,\r\n });\r\n };\r\n return new PostgrestTableApi<Database, TableName>(pgFetch, id, table);\r\n };\r\n\r\n private toUrl(path: string): string {\r\n return `${normalizeBrowserApiBase()}${path.startsWith(\"/\") ? path : `/${path}`}`;\r\n }\r\n\r\n defineCollection = (\r\n name: string,\r\n schema?: Record<string, unknown>,\r\n databaseInstanceId?: string,\r\n ): Promise<PostgrestResult<BrowserCollectionDefinition>> =>\r\n asPostgrestResponse(() =>\r\n this._requestCollection<BrowserCollectionDefinition>(\r\n \"POST\",\r\n \"/\",\r\n { name, ...(schema ? { schema } : {}) },\r\n databaseInstanceId,\r\n ),\r\n );\r\n\r\n listCollections = (\r\n databaseInstanceId?: string,\r\n ): Promise<PostgrestResult<BrowserCollectionDefinition[]>> =>\r\n asPostgrestResponse(() =>\r\n this._requestCollection<BrowserCollectionDefinition[]>(\r\n \"GET\",\r\n \"/\",\r\n undefined,\r\n databaseInstanceId,\r\n ),\r\n );\r\n\r\n async _requestCollection<T>(\r\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\r\n path: string,\r\n body?: unknown,\r\n databaseInstanceId?: string,\r\n ): Promise<T> {\r\n const gid = requireAuthGroupId(this.options);\r\n const token = await resolveDatabaseAuthBearer(this.options, this.ragableAuth);\r\n const id = databaseInstanceId?.trim() || this.options.databaseInstanceId?.trim();\r\n if (!id) {\r\n throw new RagableError(\r\n \"db.collections requires databaseInstanceId in client options. For dynamic collection() calls, you can also pass databaseInstanceId as the second argument.\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n const headers = this.baseHeaders();\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"X-Database-Instance-Id\", id);\r\n if (body !== undefined) headers.set(\"Content-Type\", \"application/json\");\r\n const response = await this.fetchImpl(\r\n this.toUrl(`/auth-groups/${gid}/data/collections${path}`),\r\n {\r\n method,\r\n headers,\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n },\r\n );\r\n const payload = await parseMaybeJsonBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n }\r\n\r\n query = async <Row extends Record<string, unknown> = Record<string, unknown>>(\r\n params: BrowserSqlQueryParams,\r\n ): Promise<PostgrestResult<BrowserSqlQueryResult<Row>>> => {\r\n return asPostgrestResponse(async () => {\r\n const gid = requireAuthGroupId(this.options);\r\n const token = await resolveDatabaseAuthBearer(this.options, this.ragableAuth);\r\n const databaseInstanceId =\r\n params.databaseInstanceId?.trim() ||\r\n this.options.databaseInstanceId?.trim();\r\n if (!databaseInstanceId) {\r\n throw new RagableError(\r\n \"database.query requires databaseInstanceId in the request or on createBrowserClient({ databaseInstanceId })\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n const headers = this.baseHeaders();\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n const readOnly =\r\n effectiveDataAuth(this.options) === \"publicAnon\"\r\n ? true\r\n : params.readOnly !== false;\r\n const response = await this.fetchImpl(\r\n this.toUrl(`/auth-groups/${gid}/data/query`),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n databaseInstanceId,\r\n sql: params.sql,\r\n ...(params.params !== undefined ? { params: params.params } : {}),\r\n readOnly,\r\n ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),\r\n ...(params.rowLimit !== undefined ? { rowLimit: params.rowLimit } : {}),\r\n }),\r\n },\r\n );\r\n const payload = await parseMaybeJsonBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as BrowserSqlQueryResult<Row>;\r\n });\r\n };\r\n\r\n private baseHeaders(): Headers {\r\n return new Headers(this.options.headers);\r\n }\r\n\r\n /**\r\n * Postgres `LISTEN` / `NOTIFY` realtime via server-proxied SSE.\r\n * Channels must be lowercase identifiers: `[a-z_][a-z0-9_]*` (max 63 chars).\r\n */\r\n /**\r\n * Postgres `LISTEN` / `NOTIFY` realtime via server-proxied SSE.\r\n *\r\n * Returns a `BrowserRealtimeSubscription` with:\r\n * - `unsubscribe()` — permanently close the subscription (stops reconnects).\r\n * - `status` — current connection state: `\"connecting\"` | `\"connected\"` | `\"reconnecting\"` | `\"disconnected\"`.\r\n *\r\n * The subscription automatically reconnects with exponential backoff when the\r\n * stream drops. Server heartbeats (every 15 s) are monitored — if none arrive\r\n * within `heartbeatTimeoutMs` (default 45 s), the connection is treated as dead\r\n * and a reconnect is triggered. Auth errors (401/403/404) are non-retryable.\r\n *\r\n * Channel names must be lowercase identifiers: `[a-z_][a-z0-9_]*` (max 63 chars).\r\n */\r\n realtime = {\r\n subscribe: (\r\n params: BrowserRealtimeSubscribeParams,\r\n ): Promise<BrowserRealtimeSubscription> =>\r\n subscribeBrowserRealtime(\r\n this.options,\r\n this.ragableAuth,\r\n this.fetchImpl,\r\n params,\r\n ),\r\n };\r\n}\r\n\r\n/**\r\n * A single NOTIFY message received from a Postgres channel.\r\n *\r\n * - `channel` — the lowercase channel name that fired.\r\n * - `payload` — the text payload (may be null if NOTIFY was sent without one).\r\n * - `processId` — the PID of the Postgres backend that called NOTIFY.\r\n */\r\nexport interface BrowserRealtimeNotification {\r\n channel: string;\r\n payload: string | null;\r\n processId: number;\r\n}\r\n\r\n/**\r\n * Connection status of a realtime subscription.\r\n *\r\n * - `\"connecting\"` — establishing or re-establishing the SSE stream.\r\n * - `\"connected\"` — stream is open, heartbeats are arriving, NOTIFY events are flowing.\r\n * - `\"reconnecting\"` — the stream dropped and the SDK is waiting before the next retry.\r\n * - `\"disconnected\"` — permanently stopped (via `unsubscribe()`, `signal` abort, or max retries exceeded).\r\n */\r\nexport type BrowserRealtimeStatus =\r\n | \"connecting\"\r\n | \"connected\"\r\n | \"reconnecting\"\r\n | \"disconnected\";\r\n\r\nexport interface BrowserRealtimeSubscribeParams {\r\n databaseInstanceId?: string;\r\n /** Channel names (normalized to lowercase on the server). */\r\n channels: string[];\r\n /** When aborted, the subscription stops permanently (equivalent to calling `unsubscribe()`). */\r\n signal?: AbortSignal;\r\n\r\n // ── Callbacks ──\r\n\r\n /** Called each time a Postgres NOTIFY message arrives. */\r\n onNotify?: (msg: BrowserRealtimeNotification) => void;\r\n /** Called once per connection attempt when the server confirms LISTEN is active. */\r\n onReady?: (channels: string[]) => void;\r\n /** Called when the stream encounters a non-retryable error or the server sends an error event. */\r\n onError?: (message: string) => void;\r\n /** Called whenever the connection status changes (connecting → connected → reconnecting → …). */\r\n onStatusChange?: (status: BrowserRealtimeStatus) => void;\r\n /** Called when the stream drops and the SDK will attempt to reconnect. `attempt` is 1-indexed. */\r\n onDisconnect?: (info: { attempt: number; retryInMs: number }) => void;\r\n /** Called when a reconnect attempt succeeds (stream is open again). */\r\n onReconnect?: (info: { attempt: number }) => void;\r\n\r\n // ── Reconnect tuning (safe defaults; override for advanced use) ──\r\n\r\n /** Maximum number of reconnect attempts before giving up. Set `0` to disable reconnect. Default: **Infinity** (never stops). */\r\n maxReconnectAttempts?: number;\r\n /** Base delay for exponential backoff (ms). Default: **1000**. */\r\n reconnectBaseDelayMs?: number;\r\n /** Maximum delay between reconnect attempts (ms). Default: **30000**. */\r\n reconnectMaxDelayMs?: number;\r\n /** How long to wait without a heartbeat before considering the connection dead (ms). Default: **45000** (3× the server's 15 s heartbeat interval). */\r\n heartbeatTimeoutMs?: number;\r\n}\r\n\r\n/**\r\n * Handle returned by `database.realtime.subscribe()`.\r\n *\r\n * - Call `unsubscribe()` to permanently close the subscription (no more reconnects).\r\n * - Read `status` to check the current connection state at any time.\r\n */\r\nexport interface BrowserRealtimeSubscription {\r\n unsubscribe: () => void;\r\n readonly status: BrowserRealtimeStatus;\r\n}\r\n\r\nfunction followAbortSignal(\r\n parent: AbortSignal | undefined,\r\n child: AbortController,\r\n): void {\r\n if (!parent) return;\r\n if (parent.aborted) {\r\n child.abort();\r\n return;\r\n }\r\n parent.addEventListener(\"abort\", () => child.abort(), { once: true });\r\n}\r\n\r\nfunction backoffDelay(\r\n attempt: number,\r\n baseMs: number,\r\n maxMs: number,\r\n): number {\r\n const exp = Math.min(baseMs * 2 ** (attempt - 1), maxMs);\r\n const jitter = exp * (0.5 + Math.random() * 0.5);\r\n return Math.round(jitter);\r\n}\r\n\r\nasync function subscribeBrowserRealtime(\r\n options: RagableBrowserClientOptions,\r\n ragableAuth: RagableAuth | null,\r\n fetchImpl: typeof fetch,\r\n params: BrowserRealtimeSubscribeParams,\r\n): Promise<BrowserRealtimeSubscription> {\r\n const gid = requireAuthGroupId(options);\r\n const databaseInstanceId =\r\n params.databaseInstanceId?.trim() || options.databaseInstanceId?.trim();\r\n if (!databaseInstanceId) {\r\n throw new RagableError(\r\n \"realtime.subscribe requires databaseInstanceId in params or on createBrowserClient({ databaseInstanceId })\",\r\n 400,\r\n { code: \"SDK_MISSING_DATABASE_INSTANCE_ID\" },\r\n );\r\n }\r\n if (!Array.isArray(params.channels) || params.channels.length === 0) {\r\n throw new RagableError(\r\n \"realtime.subscribe requires a non-empty channels array\",\r\n 400,\r\n { code: \"SDK_REALTIME_CHANNELS_REQUIRED\" },\r\n );\r\n }\r\n\r\n const maxAttempts = params.maxReconnectAttempts ?? Infinity;\r\n const baseDelay = params.reconnectBaseDelayMs ?? 1_000;\r\n const maxDelay = params.reconnectMaxDelayMs ?? 30_000;\r\n const heartbeatTimeout = params.heartbeatTimeoutMs ?? 45_000;\r\n\r\n const lifecycleAc = new AbortController();\r\n followAbortSignal(params.signal, lifecycleAc);\r\n\r\n let currentStatus: BrowserRealtimeStatus = \"connecting\";\r\n const setStatus = (s: BrowserRealtimeStatus) => {\r\n if (s === currentStatus) return;\r\n currentStatus = s;\r\n params.onStatusChange?.(s);\r\n };\r\n\r\n const subscription: BrowserRealtimeSubscription = {\r\n unsubscribe: () => lifecycleAc.abort(),\r\n get status() {\r\n return currentStatus;\r\n },\r\n };\r\n\r\n setStatus(\"connecting\");\r\n\r\n async function connectOnce(\r\n signal: AbortSignal,\r\n ): Promise<\"stream_ended\" | \"aborted\"> {\r\n const token = await resolveDatabaseAuthBearer(options, ragableAuth);\r\n const headers = new Headers(options.headers);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n\r\n const response = await fetchImpl(\r\n `${normalizeBrowserApiBase()}/auth-groups/${gid}/data/realtime/stream`,\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n databaseInstanceId,\r\n channels: params.channels,\r\n }),\r\n signal,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const payload = await parseMaybeJsonBody(response);\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n const streamBody = response.body;\r\n if (!streamBody) {\r\n throw new RagableError(\"Realtime stream has no body\", 502, {\r\n code: \"SDK_REALTIME_NO_BODY\",\r\n });\r\n }\r\n\r\n let heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\r\n const resetHeartbeatTimer = () => {\r\n if (heartbeatTimer) clearTimeout(heartbeatTimer);\r\n heartbeatTimer = setTimeout(() => {\r\n streamReader?.cancel().catch(() => undefined);\r\n }, heartbeatTimeout);\r\n };\r\n\r\n let streamReader: ReadableStreamDefaultReader<Uint8Array> | null = null;\r\n\r\n try {\r\n streamReader = streamBody.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n resetHeartbeatTimer();\r\n\r\n const processEvent = (evt: { type: string; [k: string]: unknown }) => {\r\n if (evt.type === \"realtime:heartbeat\") {\r\n resetHeartbeatTimer();\r\n return;\r\n }\r\n resetHeartbeatTimer();\r\n if (evt.type === \"realtime:ready\") {\r\n const ch = evt.channels;\r\n setStatus(\"connected\");\r\n params.onReady?.(\r\n Array.isArray(ch) ? ch.map((c) => String(c)) : [],\r\n );\r\n } else if (evt.type === \"notify\") {\r\n params.onNotify?.({\r\n channel: String(evt.channel ?? \"\"),\r\n payload:\r\n evt.payload === undefined || evt.payload === null\r\n ? null\r\n : String(evt.payload),\r\n processId: Number(evt.processId ?? 0),\r\n });\r\n } else if (evt.type === \"realtime:error\") {\r\n params.onError?.(String(evt.message ?? \"Realtime error\"));\r\n }\r\n };\r\n\r\n while (true) {\r\n const { done, value } = await streamReader.read();\r\n if (done) break;\r\n buffer += decoder.decode(value, { stream: true });\r\n let boundary = buffer.indexOf(\"\\n\\n\");\r\n while (boundary !== -1) {\r\n const block = buffer.slice(0, boundary);\r\n buffer = buffer.slice(boundary + 2);\r\n for (const line of block.split(\"\\n\")) {\r\n const dataPrefix = \"data: \";\r\n if (!line.startsWith(dataPrefix)) continue;\r\n const json = line.slice(dataPrefix.length).trim();\r\n if (!json || json === \"[DONE]\") continue;\r\n try {\r\n processEvent(JSON.parse(json));\r\n } catch {\r\n /* malformed JSON — skip */\r\n }\r\n }\r\n boundary = buffer.indexOf(\"\\n\\n\");\r\n }\r\n }\r\n\r\n return \"stream_ended\";\r\n } finally {\r\n if (heartbeatTimer) clearTimeout(heartbeatTimer);\r\n streamReader?.releaseLock();\r\n }\r\n }\r\n\r\n void (async () => {\r\n let attempt = 0;\r\n while (!lifecycleAc.signal.aborted) {\r\n const iterAc = new AbortController();\r\n followAbortSignal(lifecycleAc.signal, iterAc);\r\n\r\n try {\r\n const result = await connectOnce(iterAc.signal);\r\n if (lifecycleAc.signal.aborted) break;\r\n if (result === \"stream_ended\") {\r\n attempt++;\r\n }\r\n } catch (e) {\r\n if (lifecycleAc.signal.aborted) break;\r\n if ((e as Error).name === \"AbortError\") break;\r\n\r\n const status = (e as RagableError).status;\r\n if (status === 400 || status === 401 || status === 403 || status === 404) {\r\n params.onError?.((e as Error).message);\r\n break;\r\n }\r\n attempt++;\r\n }\r\n\r\n if (lifecycleAc.signal.aborted) break;\r\n if (attempt > maxAttempts) {\r\n params.onError?.(`Realtime: gave up after ${maxAttempts} reconnect attempts`);\r\n break;\r\n }\r\n\r\n const delay = backoffDelay(attempt, baseDelay, maxDelay);\r\n setStatus(\"reconnecting\");\r\n params.onDisconnect?.({ attempt, retryInMs: delay });\r\n\r\n await new Promise<void>((r) => {\r\n const timer = setTimeout(r, delay);\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n r();\r\n };\r\n lifecycleAc.signal.addEventListener(\"abort\", onAbort, { once: true });\r\n });\r\n\r\n if (lifecycleAc.signal.aborted) break;\r\n setStatus(\"connecting\");\r\n params.onReconnect?.({ attempt });\r\n }\r\n\r\n setStatus(\"disconnected\");\r\n })();\r\n\r\n return subscription;\r\n}\r\n\r\n// ─── Storage client ──────────────────────────────────────────────────────────\r\n\r\nexport interface BrowserStorageItem {\r\n type: \"file\" | \"folder\";\r\n path: string;\r\n name: string;\r\n size?: string | null;\r\n contentType?: string | null;\r\n updated?: string | null;\r\n}\r\n\r\nexport interface BrowserStorageListResult {\r\n bucket: string;\r\n prefix: string;\r\n items: BrowserStorageItem[];\r\n nextPageToken: string | null;\r\n}\r\n\r\nexport interface BrowserStorageUploadResult {\r\n success: true;\r\n path: string;\r\n size: string | null;\r\n contentType: string | null;\r\n updated: string | null;\r\n}\r\n\r\nexport interface BrowserStorageDownloadResult {\r\n path: string;\r\n size: string | null;\r\n contentType: string | null;\r\n updated: string | null;\r\n encoding: string;\r\n contentsBase64: string;\r\n text: string | null;\r\n textIncluded: boolean;\r\n}\r\n\r\nexport interface BrowserStorageSignedUrlResult {\r\n url: string;\r\n method: string;\r\n expiresInSeconds: number;\r\n objectPath: string;\r\n}\r\n\r\nexport interface BrowserStorageBulkDeleteResult {\r\n success: boolean;\r\n totalRequested: number;\r\n uniquePaths: number;\r\n deleted: string[];\r\n errors: Array<{ path: string; error: string }>;\r\n}\r\n\r\nexport class BrowserStorageBucketClient {\r\n constructor(\r\n private readonly options: RagableBrowserClientOptions,\r\n private readonly fetchImpl: typeof fetch,\r\n private readonly bucketId: string,\r\n ) {}\r\n\r\n private get authGroupId(): string {\r\n const id = this.options.authGroupId?.trim();\r\n if (!id) throw new RagableError(\"authGroupId is required for storage\", 400, { code: \"SDK_MISSING_AUTH_GROUP_ID\" });\r\n return id;\r\n }\r\n\r\n private base(): string {\r\n return `${normalizeBrowserApiBase()}/auth-groups/${this.authGroupId}/storage/buckets/${encodeURIComponent(this.bucketId)}`;\r\n }\r\n\r\n private async bearerToken(): Promise<string> {\r\n const staticKey = this.options.dataStaticKey?.trim() ||\r\n (this.options.getDataStaticKey ? await this.options.getDataStaticKey() : null)?.trim() ||\r\n null;\r\n if (staticKey) return staticKey;\r\n if (this.options.getAccessToken) {\r\n const tok = await this.options.getAccessToken();\r\n if (tok?.trim()) return tok.trim();\r\n }\r\n throw new RagableError(\"No auth token for storage. Provide dataStaticKey or getAccessToken.\", 401, { code: \"SDK_NO_ACCESS_TOKEN\" });\r\n }\r\n\r\n private async req<T>(method: string, path: string, body?: unknown): Promise<T> {\r\n const token = await this.bearerToken();\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n if (body !== undefined && !(body instanceof FormData)) headers.set(\"Content-Type\", \"application/json\");\r\n const res = await this.fetchImpl(`${this.base()}${path}`, {\r\n method,\r\n headers,\r\n body: body instanceof FormData ? body : body !== undefined ? JSON.stringify(body) : undefined,\r\n });\r\n const payload = await res.json().catch(() => ({}));\r\n if (!res.ok) throw new RagableError((payload as any)?.error ?? res.statusText, res.status, payload);\r\n return payload as T;\r\n }\r\n\r\n list(params: { prefix?: string; delimiter?: string; maxResults?: number; pageToken?: string } = {}): Promise<BrowserStorageListResult> {\r\n const qs = new URLSearchParams();\r\n if (params.prefix) qs.set(\"prefix\", params.prefix);\r\n if (params.delimiter) qs.set(\"delimiter\", params.delimiter);\r\n if (params.maxResults != null) qs.set(\"maxResults\", String(params.maxResults));\r\n if (params.pageToken) qs.set(\"pageToken\", params.pageToken);\r\n const q = qs.toString();\r\n return this.req(\"GET\", `/contents${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n async upload(params: { objectPath: string; file: Blob | ArrayBuffer | Uint8Array; fileName?: string; contentType?: string; cacheControl?: string }): Promise<BrowserStorageUploadResult> {\r\n const token = await this.bearerToken();\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Authorization\", `Bearer ${token}`);\r\n const form = new FormData();\r\n const raw = params.file instanceof Blob ? params.file : new Blob([new Uint8Array(params.file instanceof ArrayBuffer ? params.file : (params.file as Uint8Array).buffer as ArrayBuffer)], params.contentType ? { type: params.contentType } : {});\r\n const blob = raw;\r\n form.set(\"file\", blob, params.fileName ?? \"upload\");\r\n form.set(\"objectPath\", params.objectPath);\r\n if (params.cacheControl) form.set(\"cacheControl\", params.cacheControl);\r\n const res = await this.fetchImpl(`${this.base()}/upload`, { method: \"POST\", headers, body: form });\r\n const payload = await res.json().catch(() => ({}));\r\n if (!res.ok) throw new RagableError((payload as any)?.error ?? res.statusText, res.status, payload);\r\n return payload as BrowserStorageUploadResult;\r\n }\r\n\r\n download(params: { objectPath: string; asText?: boolean; maxTextBytes?: number }): Promise<BrowserStorageDownloadResult> {\r\n const qs = new URLSearchParams({ objectPath: params.objectPath });\r\n if (params.asText != null) qs.set(\"asText\", String(params.asText));\r\n if (params.maxTextBytes != null) qs.set(\"maxTextBytes\", String(params.maxTextBytes));\r\n return this.req(\"GET\", `/objects/download?${qs}`);\r\n }\r\n\r\n delete(objectPath: string): Promise<{ success: true; path: string }> {\r\n return this.req(\"DELETE\", \"/objects\", { objectPath });\r\n }\r\n\r\n bulkDelete(objectPaths: string[]): Promise<BrowserStorageBulkDeleteResult> {\r\n return this.req(\"POST\", \"/objects/delete-bulk\", { objectPaths });\r\n }\r\n\r\n getSignedUploadUrl(params: { objectPath: string; contentType?: string; expiresInSeconds?: number }): Promise<BrowserStorageSignedUrlResult> {\r\n return this.req(\"POST\", \"/signed-upload-url\", params);\r\n }\r\n\r\n getSignedDownloadUrl(params: { objectPath: string; expiresInSeconds?: number }): Promise<BrowserStorageSignedUrlResult> {\r\n const qs = new URLSearchParams({ objectPath: params.objectPath });\r\n if (params.expiresInSeconds != null) qs.set(\"expiresInSeconds\", String(params.expiresInSeconds));\r\n return this.req(\"GET\", `/signed-download-url?${qs}`);\r\n }\r\n\r\n copy(params: { sourcePath: string; destinationPath: string }): Promise<{ success: true; sourcePath: string; destinationPath: string }> {\r\n return this.req(\"POST\", \"/objects/copy\", params);\r\n }\r\n\r\n move(params: { sourcePath: string; destinationPath: string }): Promise<{ success: true; sourcePath: string; destinationPath: string }> {\r\n return this.req(\"POST\", \"/objects/move\", params);\r\n }\r\n\r\n createFolder(folderPath: string): Promise<{ success: true; folderPath: string }> {\r\n return this.req(\"POST\", \"/folders\", { folderPath });\r\n }\r\n\r\n deleteFolder(folderPath: string): Promise<{ success: true; folderPath: string }> {\r\n return this.req(\"DELETE\", \"/folders\", { folderPath });\r\n }\r\n\r\n getMetadata(objectPath: string): Promise<{ name: string; contentType: string | null; size: string | null; updated: string | null; metadata?: Record<string, string> }> {\r\n const qs = new URLSearchParams({ objectPath });\r\n return this.req(\"GET\", `/objects/metadata?${qs}`);\r\n }\r\n}\r\n\r\nexport class RagableBrowserStorageClient {\r\n constructor(\r\n private readonly options: RagableBrowserClientOptions,\r\n private readonly fetchImpl: typeof fetch,\r\n ) {}\r\n\r\n from(bucketId: string): BrowserStorageBucketClient {\r\n return new BrowserStorageBucketClient(this.options, this.fetchImpl, bucketId);\r\n }\r\n}\r\n\r\n// ─── Agents client ───────────────────────────────────────────────────────────\r\n\r\nexport interface AgentConversationMessage {\r\n role: \"user\" | \"assistant\";\r\n content: string;\r\n file_urls?: string[];\r\n}\r\n\r\nexport interface AgentConversation {\r\n id: string;\r\n agent_name: string;\r\n agentName: string;\r\n title: string | null;\r\n metadata: unknown;\r\n messages: AgentConversationMessage[];\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface AgentConversationSubscription {\r\n unsubscribe: () => void;\r\n}\r\n\r\nexport class RagableBrowserAgentsClient {\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(private readonly options: RagableBrowserClientOptions) {\r\n this.fetchImpl = bindFetch(options.fetch);\r\n }\r\n\r\n private toUrl(path: string): string {\r\n return `${normalizeBrowserApiBase()}${path.startsWith(\"/\") ? path : `/${path}`}`;\r\n }\r\n\r\n private requireWebsiteId(): string {\r\n const websiteId = this.options.websiteId?.trim();\r\n if (!websiteId) {\r\n throw new RagableError(\r\n \"websiteId is required for project agent conversation APIs. Use the generated createWebsiteRagableClient() or pass createBrowserClient({ websiteId, ... }).\",\r\n 400,\r\n { code: \"SDK_MISSING_WEBSITE_ID\" },\r\n );\r\n }\r\n return websiteId;\r\n }\r\n\r\n private websiteAgentPath(path: string): string {\r\n const websiteId = this.requireWebsiteId();\r\n return `/public/organizations/${this.options.organizationId}/websites/${websiteId}${path}`;\r\n }\r\n\r\n private async requestJson<T>(path: string, init: RequestInit = {}): Promise<T> {\r\n const response = await this.fetchImpl(this.toUrl(path), init);\r\n const payload = await parseMaybeJsonBody(response);\r\n if (!response.ok) {\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n return payload as T;\r\n }\r\n\r\n /** @deprecated Prefer `chatStreamByName(agentName, params)` for project-local `/agents/*.json` agents. */\r\n async *chatStream(\r\n agentId: string,\r\n params: AgentPublicChatParams,\r\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\r\n const orgId = this.options.organizationId;\r\n const body: Record<string, unknown> = {\r\n message: params.message,\r\n ...(params.history !== undefined ? { history: params.history } : {}),\r\n ...(params.triggerSubtype !== undefined\r\n ? { triggerSubtype: params.triggerSubtype }\r\n : {}),\r\n ...(params.triggerNodeId !== undefined\r\n ? { triggerNodeId: params.triggerNodeId }\r\n : {}),\r\n };\r\n\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n\r\n const response = await this.fetchImpl(\r\n this.toUrl(`/public/organizations/${orgId}/agents/${agentId}/chat/stream`),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify(body),\r\n ...(params.signal !== undefined ? { signal: params.signal } : {}),\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const payload = await parseMaybeJsonBody(response);\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n const streamBody = response.body;\r\n if (!streamBody) {\r\n return;\r\n }\r\n\r\n yield* readSseStream(streamBody);\r\n }\r\n\r\n /**\r\n * Stream a project agent defined in `agents/*.json` using the same result\r\n * shape as `client.ai.streamText`. Preferred over {@link chatStreamByName}\r\n * and {@link runChatStreamByName} — those remain for back-compat only.\r\n *\r\n * ```ts\r\n * const { textStream, text } = client.agents.run(\"support\", {\r\n * messages: [{ role: \"user\", content: \"I can't log in\" }],\r\n * });\r\n * for await (const delta of textStream) process.stdout.write(delta);\r\n * console.log(await text);\r\n * ```\r\n */\r\n run(\r\n agentName: string,\r\n params: { messages: Message[]; signal?: AbortSignal },\r\n ): StreamTextResult {\r\n const source = this.runStreamParts(agentName, params);\r\n return createStreamResultFromParts(source);\r\n }\r\n\r\n private async *runStreamParts(\r\n agentName: string,\r\n params: { messages: Message[]; signal?: AbortSignal },\r\n ): AsyncGenerator<StreamPart, void, undefined> {\r\n const { messages } = params;\r\n if (!Array.isArray(messages) || messages.length === 0) {\r\n throw new RagableError(\r\n \"agents.run requires at least one message\",\r\n 400,\r\n { code: \"SDK_AGENTS_RUN_EMPTY_MESSAGES\" },\r\n );\r\n }\r\n const last = messages[messages.length - 1];\r\n if (!last || last.role !== \"user\") {\r\n throw new RagableError(\r\n 'agents.run: the final message must have role \"user\"',\r\n 400,\r\n { code: \"SDK_AGENTS_RUN_INVALID_LAST_MESSAGE\" },\r\n );\r\n }\r\n const history: AgentChatParams[\"history\"] = messages\r\n .slice(0, -1)\r\n .filter((m) => m.role === \"user\" || m.role === \"assistant\")\r\n .map((m) => ({\r\n role: m.role as \"user\" | \"assistant\",\r\n content: m.content,\r\n }));\r\n const events = this.chatStreamByName(agentName, {\r\n message: last.content,\r\n ...(history.length > 0 ? { history } : {}),\r\n ...(params.signal !== undefined ? { signal: params.signal } : {}),\r\n });\r\n for await (const event of events) {\r\n const mapped = mapAgentEvent(event);\r\n if (mapped) yield mapped;\r\n }\r\n }\r\n\r\n /**\r\n * @deprecated Use {@link run} for new code. This method is kept for\r\n * back-compat with the original chat-stream DX.\r\n */\r\n async *chatStreamByName(\r\n agentName: string,\r\n params: AgentChatParams,\r\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n const response = await this.fetchImpl(\r\n this.toUrl(\r\n this.websiteAgentPath(\r\n `/agents/${encodeURIComponent(agentName)}/chat/stream`,\r\n ),\r\n ),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n message: params.message,\r\n ...(params.history !== undefined ? { history: params.history } : {}),\r\n }),\r\n ...(params.signal !== undefined ? { signal: params.signal } : {}),\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const payload = await parseMaybeJsonBody(response);\r\n const message = extractErrorMessage(payload, response.statusText);\r\n throw new RagableError(message, response.status, payload);\r\n }\r\n\r\n if (!response.body) return;\r\n yield* readSseStream(response.body);\r\n }\r\n\r\n /**\r\n * @deprecated Use {@link run} for new code. Returns the legacy callback-based\r\n * result type leaking server internals; the new Vercel-style API exposes\r\n * `textStream` / `fullStream` / promises for `text`, `usage`, `finishReason`.\r\n */\r\n async runChatStreamByName(\r\n agentName: string,\r\n params: AgentChatParams,\r\n handlers: AgentChatStreamHandlers = {},\r\n ): Promise<AgentChatStreamResult> {\r\n return runAgentChatStream(this.chatStreamByName(agentName, params), handlers, {\r\n signal: params.signal,\r\n });\r\n }\r\n\r\n /**\r\n * Same as {@link runChatStreamByName} but folds events into `AgentChat`-style segments\r\n * (`onSegments` / `onStreamingText`) and returns a history-ready assistant message.\r\n */\r\n async runChatUiByName(\r\n agentName: string,\r\n params: AgentChatParams,\r\n handlers: AgentChatStreamUiHandlers = {},\r\n ): Promise<AgentChatUiStreamResult> {\r\n return runAgentChatStreamForUi(\r\n this.chatStreamByName(agentName, params),\r\n handlers,\r\n { signal: params.signal },\r\n );\r\n }\r\n\r\n createConversation(params: {\r\n agent_name?: string;\r\n agentName?: string;\r\n title?: string | null;\r\n metadata?: unknown;\r\n }): Promise<AgentConversation> {\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\"/agent-conversations\"),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify(params),\r\n },\r\n );\r\n }\r\n\r\n listConversations(params: {\r\n agent_name?: string;\r\n agentName?: string;\r\n } = {}): Promise<AgentConversation[]> {\r\n const agentName = params.agent_name ?? params.agentName;\r\n const qs = agentName\r\n ? `?agentName=${encodeURIComponent(agentName)}`\r\n : \"\";\r\n return this.requestJson<AgentConversation[]>(\r\n this.websiteAgentPath(`/agent-conversations${qs}`),\r\n );\r\n }\r\n\r\n getConversation(conversationId: string): Promise<AgentConversation> {\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\r\n `/agent-conversations/${encodeURIComponent(conversationId)}`,\r\n ),\r\n );\r\n }\r\n\r\n updateConversation(\r\n conversationId: string,\r\n data: { title?: string | null; metadata?: unknown },\r\n ): Promise<AgentConversation> {\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\r\n `/agent-conversations/${encodeURIComponent(conversationId)}`,\r\n ),\r\n {\r\n method: \"PATCH\",\r\n headers,\r\n body: JSON.stringify(data),\r\n },\r\n );\r\n }\r\n\r\n addMessage(\r\n conversationOrId: AgentConversation | string,\r\n message: AgentConversationMessage,\r\n ): Promise<AgentConversation> {\r\n const conversationId =\r\n typeof conversationOrId === \"string\" ? conversationOrId : conversationOrId.id;\r\n const headers = new Headers(this.options.headers);\r\n headers.set(\"Content-Type\", \"application/json\");\r\n return this.requestJson<AgentConversation>(\r\n this.websiteAgentPath(\r\n `/agent-conversations/${encodeURIComponent(conversationId)}/messages`,\r\n ),\r\n {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify(message),\r\n },\r\n );\r\n }\r\n\r\n subscribeToConversation(\r\n conversationId: string,\r\n callback: (conversation: AgentConversation) => void,\r\n options: { intervalMs?: number } = {},\r\n ): AgentConversationSubscription {\r\n let stopped = false;\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const intervalMs = Math.max(500, options.intervalMs ?? 1500);\r\n const tick = async () => {\r\n if (stopped) return;\r\n try {\r\n callback(await this.getConversation(conversationId));\r\n } finally {\r\n if (!stopped) timer = setTimeout(tick, intervalMs);\r\n }\r\n };\r\n void tick();\r\n return {\r\n unsubscribe: () => {\r\n stopped = true;\r\n if (timer) clearTimeout(timer);\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport interface AgentPublicChatParams extends AgentChatParams {\r\n triggerSubtype?: string;\r\n triggerNodeId?: string;\r\n}\r\n\r\n// ─── Main browser client ─────────────────────────────────────────────────────\r\n\r\nexport class RagableBrowser<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n> {\r\n readonly agents: RagableBrowserAgentsClient;\r\n readonly ai: RagableBrowserAiClient;\r\n readonly auth: RagableBrowserAuthClient<AuthUser>;\r\n readonly database: RagableBrowserDatabaseClient<Database>;\r\n readonly db: RagableBrowserDatabaseClient<Database>;\r\n readonly storage: RagableBrowserStorageClient;\r\n readonly transport: Transport;\r\n private readonly _ragableAuth: RagableAuth<AuthUser> | null;\r\n\r\n constructor(options: RagableBrowserClientOptions) {\r\n this.transport = new Transport({\r\n fetch: options.fetch,\r\n headers: options.headers,\r\n ...options.transport,\r\n });\r\n\r\n if (options.authGroupId) {\r\n this._ragableAuth = new RagableAuth<AuthUser>({\r\n authGroupId: options.authGroupId,\r\n fetch: options.fetch,\r\n headers: options.headers,\r\n auth: options.auth,\r\n });\r\n\r\n this.transport.setRefreshHandler(async () => {\r\n if (effectiveDataAuth(options) !== \"user\") return null;\r\n return this._ragableAuth!.getValidAccessToken();\r\n });\r\n\r\n if (\r\n !options.getAccessToken &&\r\n effectiveDataAuth(options) === \"user\"\r\n ) {\r\n this._ragableAuth.initialize().catch(() => {});\r\n }\r\n } else {\r\n this._ragableAuth = null;\r\n }\r\n\r\n this.agents = new RagableBrowserAgentsClient(options);\r\n this.ai = new RagableBrowserAiClient({\r\n organizationId: options.organizationId,\r\n ...(options.websiteId !== undefined ? { websiteId: options.websiteId } : {}),\r\n ...(options.fetch !== undefined ? { fetch: options.fetch } : {}),\r\n ...(options.headers !== undefined ? { headers: options.headers } : {}),\r\n apiBase: normalizeBrowserApiBase(),\r\n });\r\n this.auth = new RagableBrowserAuthClient<AuthUser>(options, this._ragableAuth);\r\n this.database = new RagableBrowserDatabaseClient<Database>(\r\n options,\r\n this._ragableAuth as RagableAuth | null,\r\n );\r\n this.database._setTransport(this.transport);\r\n this.db = this.database;\r\n this.storage = new RagableBrowserStorageClient(options, bindFetch(options.fetch));\r\n }\r\n\r\n /** Delegates to `database.from()`. Kept for back-compat — prefer `database.from()`. */\r\n from = <TableName extends RagableTableNames<Database>>(\r\n table: TableName,\r\n databaseInstanceId?: string,\r\n ): PostgrestTableApi<Database, TableName> => {\r\n return this.database.from(table, databaseInstanceId);\r\n };\r\n\r\n destroy(): void {\r\n this._ragableAuth?.destroy();\r\n }\r\n}\r\n\r\nexport function createBrowserClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser> {\r\n return new RagableBrowser<Database, AuthUser>(options);\r\n}\r\n\r\nexport const createRagableBrowserClient = createBrowserClient;\r\n","export type {\r\n ColumnName,\r\n ColumnValue,\r\n DefaultRagableDatabase,\r\n Json,\r\n RagableDatabase,\r\n RagableTableDefinition,\r\n RagableTableNames,\r\n TableInsertRow,\r\n TableRow,\r\n TableUpdatePatch,\r\n Tables,\r\n TablesInsert,\r\n TablesUpdate,\r\n} from \"./database-schema\";\r\n\r\nexport type { RequestOptions } from \"./request-client\";\r\nexport {\r\n bindFetch,\r\n DEFAULT_RAGABLE_API_BASE,\r\n extractErrorMessage,\r\n formatSdkError,\r\n formatPostgrestError,\r\n RagableAbortError,\r\n RagableError,\r\n RagableNetworkError,\r\n RagableSdkError,\r\n RagableTimeoutError,\r\n} from \"./request-client\";\r\n\r\nexport type {\r\n AgentChatMessage,\r\n AgentChatParams,\r\n AgentChatStreamDonePayload,\r\n AgentChatStreamHandlers,\r\n AgentChatStreamResult,\r\n AgentStreamAgentInfoEvent,\r\n AgentStreamEvent,\r\n RunAgentChatStreamOptions,\r\n} from \"./agent-stream\";\r\nexport {\r\n isIncompleteAgentStreamError,\r\n parseAgentStreamAgentInfo,\r\n parseAgentStreamDone,\r\n runAgentChatStream,\r\n runAgentChatStreamLenient,\r\n} from \"./agent-stream\";\r\n\r\nexport type {\r\n AgentChatStreamUiHandlers,\r\n AgentChatUiAssistantMessage,\r\n AgentChatUiSegment,\r\n AgentChatUiStreamResult,\r\n} from \"./agent-chat-ui\";\r\nexport {\r\n collectAssistantTextFromUiSegments,\r\n finalizeAgentChatUiTurn,\r\n foldAgentStreamIntoUiSegments,\r\n runAgentChatStreamForUi,\r\n} from \"./agent-chat-ui\";\r\n\r\nexport type {\r\n AgentConversation,\r\n AgentConversationMessage,\r\n AgentConversationSubscription,\r\n AgentPublicChatParams,\r\n BrowserAuthSession,\r\n BrowserAuthTokens,\r\n BrowserCollectionApi,\r\n BrowserCollectionDefinition,\r\n BrowserCollectionFactory,\r\n BrowserCollectionFindParams,\r\n BrowserCollectionRecord,\r\n BrowserCollections,\r\n CollectionReturnMode,\r\n CollectionRowData,\r\n CollectionRowWithMeta,\r\n CollectionWhere,\r\n BrowserDataAuthMode,\r\n BrowserRealtimeNotification,\r\n BrowserRealtimeStatus,\r\n BrowserRealtimeSubscribeParams,\r\n BrowserRealtimeSubscription,\r\n BrowserSqlQueryParams,\r\n BrowserSqlQueryResult,\r\n BrowserStorageBulkDeleteResult,\r\n BrowserStorageDownloadResult,\r\n BrowserStorageItem,\r\n BrowserStorageListResult,\r\n BrowserStorageSignedUrlResult,\r\n BrowserStorageUploadResult,\r\n PostgrestResult,\r\n RagableBrowserClientOptions,\r\n SupabaseCompatSession,\r\n WhereInput,\r\n WhereOperatorObject,\r\n} from \"./browser\";\r\nexport {\r\n assertPostgrestSuccess,\r\n BrowserStorageBucketClient,\r\n collectionRecordToRowWithMeta,\r\n collectionRecordsToRowWithMeta,\r\n createBrowserClient,\r\n createRagableBrowserClient,\r\n effectiveDataAuth,\r\n normalizeBrowserApiBase,\r\n RagableBrowser,\r\n RagableBrowserAgentsClient,\r\n RagableBrowserAuthClient,\r\n RagableBrowserDatabaseClient,\r\n RagableBrowserStorageClient,\r\n toRagableResult,\r\n unwrapPostgrest,\r\n} from \"./browser\";\r\n\r\nexport type {\r\n BrowserSqlExecParams,\r\n BrowserSqlExecResult,\r\n PostgRESTFetch,\r\n PostgRESTFetchParams,\r\n PostgrestUpsertOptions,\r\n RunQuery,\r\n} from \"./browser-postgrest\";\r\nexport type { RagableResult } from \"./browser-postgrest\";\r\nexport {\r\n asPostgrestResponse,\r\n PostgrestDeleteReturningBuilder,\r\n PostgrestDeleteRootBuilder,\r\n PostgrestInsertReturningBuilder,\r\n PostgrestInsertRootBuilder,\r\n PostgrestInsertSdkErrorReturning,\r\n PostgrestInsertSdkErrorRoot,\r\n PostgrestSelectBuilder,\r\n PostgrestTableApi,\r\n PostgrestUpdateReturningBuilder,\r\n PostgrestUpdateRootBuilder,\r\n PostgrestUpsertReturningBuilder,\r\n PostgrestUpsertRootBuilder,\r\n} from \"./browser-postgrest\";\r\n\r\nexport type { SseJsonEvent } from \"./sse\";\r\nexport { parseSseDataLine, readSseStream } from \"./sse\";\r\n\r\nexport type {\r\n FinishReason,\r\n Message,\r\n StreamPart,\r\n TokenUsage,\r\n} from \"./stream-parts\";\r\nexport { mapAgentEvent, mapFireworksChunk } from \"./stream-parts\";\r\n\r\nexport type {\r\n GenerateTextResult,\r\n StreamTextParams,\r\n StreamTextResult,\r\n ToolCallRecord,\r\n} from \"./ai\";\r\nexport {\r\n buildInferenceRequestBody,\r\n createStreamResultFromParts,\r\n RagableBrowserAiClient,\r\n} from \"./ai\";\r\n\r\nexport type {\r\n HttpMethod,\r\n RetryOptions,\r\n TransportOptions,\r\n TransportRequest,\r\n} from \"./transport\";\r\nexport { generateIdempotencyKey, Transport, parseTransportResponse } from \"./transport\";\r\n\r\nexport type {\r\n SessionStorage,\r\n AuthBroadcastMessage,\r\n} from \"./auth-storage\";\r\nexport {\r\n AuthBroadcastChannel,\r\n CookieStorageAdapter,\r\n detectStorage,\r\n LocalStorageAdapter,\r\n MemoryStorageAdapter,\r\n SessionStorageAdapter,\r\n} from \"./auth-storage\";\r\n\r\nexport type {\r\n AuthChangeEvent,\r\n AuthSignUpCredentials,\r\n AuthOptions,\r\n AuthSession,\r\n AuthUpdateUserAttributes,\r\n AuthUserMetadata,\r\n DefaultAuthUser,\r\n RagableAuthConfig,\r\n} from \"./auth\";\r\nexport { RagableAuth } from \"./auth\";\r\n\r\n// ─── Top-level client factory ────────────────────────────────────────────────\r\n\r\nimport {\r\n createBrowserClient,\r\n RagableBrowser,\r\n type RagableBrowserClientOptions,\r\n} from \"./browser\";\r\nimport type { DefaultAuthUser } from \"./auth\";\r\nimport type { DefaultRagableDatabase, RagableDatabase } from \"./database-schema\";\r\n\r\nexport function createClient<\r\n Database extends RagableDatabase = DefaultRagableDatabase,\r\n AuthUser extends object = DefaultAuthUser,\r\n>(options: RagableBrowserClientOptions): RagableBrowser<Database, AuthUser> {\r\n return createBrowserClient<Database, AuthUser>(options);\r\n}\r\n"],"mappings":"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","names":["asString","asNumber","assertAborted","asNum"]}
|