{"version":3,"sources":["../src/miniprogram.ts","../src/types.ts","../src/config.ts","../src/http/fetch.ts","../src/paths.ts","../src/modules/auth/protocol.ts","../src/modules/auth/session-manager.ts","../src/modules/auth/session-store.ts","../src/modules/auth/index.ts","../src/vendor/postgrest/types/common/common.ts","../src/vendor/postgrest/PostgrestError.ts","../src/vendor/postgrest/PostgrestBuilder.ts","../src/vendor/postgrest/PostgrestTransformBuilder.ts","../src/vendor/postgrest/PostgrestFilterBuilder.ts","../src/vendor/postgrest/PostgrestQueryBuilder.ts","../src/vendor/postgrest/PostgrestClient.ts","../src/modules/database.ts","../src/modules/llm/errors.ts","../src/modules/llm/models.ts","../src/modules/llm/sse.ts","../src/modules/llm/chat.ts","../src/modules/llm.ts","../src/vendor/storage/lib/common/errors.ts","../src/vendor/storage/lib/common/headers.ts","../src/vendor/storage/lib/common/helpers.ts","../src/vendor/storage/lib/common/fetch.ts","../src/vendor/storage/lib/common/BaseApiClient.ts","../src/vendor/storage/packages/StreamDownloadBuilder.ts","../src/vendor/storage/packages/BlobDownloadBuilder.ts","../src/vendor/storage/packages/StorageFileApi.ts","../src/vendor/storage/lib/version.ts","../src/vendor/storage/lib/constants.ts","../src/modules/storage.ts","../src/client.ts","../src/platform/miniprogram/polyfills.ts","../src/platform/miniprogram/fetch.ts","../src/platform/miniprogram/storage.ts","../src/platform/miniprogram/index.ts"],"sourcesContent":["/**\n * `./miniprogram` subpath 的构建入口（对应 package.json exports）。\n *\n * 单独开一个顶层文件而不是直接把 `platform/miniprogram/index.ts` 传给\n * tsup，是因为 tsup 多入口按 basename 输出文件名，两个都叫 `index.ts`\n * 会互相覆盖；这样能产出 `lib/miniprogram.js`/`.cjs`/`.d.ts`。\n */\nexport * from './platform/miniprogram/index.js';\n","/**\n * WorkBuddy Cloud SDK 公共类型（#89098）\n *\n * 契约权威来源（不要在此另行发明字段）：\n *  - `services/cmd/agentserver/docs/genie-baas/genie-baas-phase1-design.md` §5 / §6\n *  - `packages/workbuddy-server/src/cloud-service/types.ts`（`CloudServicePublicConfig`）\n *\n * 本文件只有类型与常量，不含任何 I/O。\n */\n\nimport type { CloudAuthStorage } from './modules/auth/types.js';\n\n/**\n * 四个云服务模块。数据面路径按 `/.cloud/{module}/**` 组织，\n * 前缀 `/.cloud/` 是刻意选的，避免与生成应用自有路由冲突（设计文档 §5.0）。\n */\nexport type CloudModuleName = 'auth' | 'database' | 'storage' | 'llm';\n\n/**\n * 创建客户端的入参，字段与 `CloudServicePublicConfig` 下发给应用的部分一一对应。\n *\n * ⚠️ 这里只接受公开配置。envId、CloudBase publish_key / api_key 只存服务端，\n * 任何响应都不下发（设计文档 §5.2），因此不要为它们加配置项。\n */\nexport interface WorkBuddyCloudOptions {\n    /**\n     * 数据面基址，例如 `https://app.workbuddy.link`。末尾斜杠会被归一化掉。\n     *\n     * **省略即用当前页面同源，这是推荐用法** —— 数据面 `/.cloud/**` 与应用页面本就\n     * 同域，同源永远正确。显式传绝对地址反而有失效模式：它会被写进前端产物，应用\n     * 重新发布 / 追加认证域名后拿到新域名，产物里的旧地址不变，请求便打到旧域名上，\n     * 而服务端按 Origin 精确匹配必然拒绝（现场表现为跨域预检失败，极难归因）。\n     *\n     * 需要显式传的场景：本地开发页面跑在 dev server、数据面在别处；以及非浏览器\n     * 运行时（无 `location.origin` 可回落，此时省略会抛配置错误）。\n     */\n    endpoint?: string;\n    /**\n     * Google OAuth Relay 的环境中心基址，例如\n     * `https://test4-api.workbuddy.cn/v2/as/genie-baas/oauth`。\n     *\n     * 它与 endpoint 是两条入口：endpoint 是每应用发布域名，承载 `/.cloud/**`；\n     * OAuth Relay 走中心 APISIX，不能根据 endpoint 拼接。\n     *\n     * **网页微信扫码登录必传**：`signInWithOAuth({ provider: 'wechat' })` 用它拼\n     * Relay 的 `/authorize`，缺失直接返回 `requires oauthRelayBaseUrl`。Google 登录\n     * 虽已下线，该字段并未随之停发——后端一直在 `publicConfig` 里返回它。\n     *\n     * 省略时回落为空串（小程序不走 Relay，可以不传）。\n     */\n    oauthRelayBaseUrl?: string;\n    /**\n     * 我方签发的半公开 key，格式 `wbpk_{appId}_{随机}`。\n     *\n     * 它只标识「哪个应用」、不携带权限，可以打进前端产物；安全性由服务端 Origin\n     * 精确匹配提供（设计文档 §5.2 / §7.3）。仍不应打进日志。\n     */\n    publishableKey: string;\n    /**\n     * 自定义 fetch，便于测试与非标准运行时注入。缺省用全局 `fetch`。\n     */\n    fetch?: typeof globalThis.fetch;\n    /**\n     * 凭据存储。缺省用 localStorage（不可用时退回内存）。\n     *\n     * 什么时候需要显式传：\n     *  - 测试里要一个**干净的、与当前登录态无关**的客户端（例如验证「未登录\n     *    时写数据会被拒」——若沿用 localStorage 就会带上现有身份，测不到）\n     *  - 非浏览器运行时（Node、小程序）里没有 localStorage\n     *\n     * ⚠️ **不要传 cookie 实现。** 兄弟子域可读写共享后缀 cookie，那是已识别\n     * 的越权面（设计文档 §7.1）。这个选项存在是为了可注入，不是为了给 cookie\n     * 留口子。\n     */\n    storage?: CloudAuthStorage;\n}\n\n/** 归一化后的运行期配置，四个模块共享同一份。 */\nexport interface CloudRuntimeConfig {\n    /** 归一化后的 endpoint（无尾斜杠）。 */\n    readonly endpoint: string;\n    /** 归一化后的中心 OAuth Relay 基址（无尾斜杠）。 */\n    readonly oauthRelayBaseUrl: string;\n    readonly publishableKey: string;\n    readonly fetch: typeof globalThis.fetch;\n}\n\n/**\n * 配置非法。**在初始化阶段就抛**，而不是等到第一次业务调用才失败 ——\n * 生成应用里这类错误几乎都是 publicConfig 没接上，早失败才好定位。\n */\nexport class WorkBuddyCloudConfigError extends Error {\n    constructor(message: string) {\n        super(message);\n        this.name = 'WorkBuddyCloudConfigError';\n    }\n}\n","/**\n * 配置校验与归一化（骨架，#89098）\n */\n\nimport {\n    type CloudRuntimeConfig,\n    WorkBuddyCloudConfigError,\n    type WorkBuddyCloudOptions,\n} from './types.js';\n\n/** publishableKey 形态：`wbpk_{appId}_{随机}`（设计文档 §5.2）。 */\nconst PUBLISHABLE_KEY_PATTERN = /^wbpk_/;\n\nfunction normalizeHttpUrl(value: unknown, field: string): string {\n    if (typeof value !== 'string' || value.trim() === '') {\n        throw new WorkBuddyCloudConfigError(\n            `${field} is required and must be a non-empty string.`,\n        );\n    }\n\n    const trimmed = value.trim();\n\n    let parsed: URL;\n    try {\n        parsed = new URL(trimmed);\n    } catch {\n        throw new WorkBuddyCloudConfigError(\n            `${field} must be an absolute URL, received: ${trimmed}`,\n        );\n    }\n\n    if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n        throw new WorkBuddyCloudConfigError(\n            `${field} must use http(s), received protocol: ${parsed.protocol}`,\n        );\n    }\n\n    // 去掉尾斜杠，后续模块统一用 `${endpoint}${modulePath}` 拼接，避免出现 `//`。\n    return trimmed.replace(/\\/+$/, '');\n}\n\n/**\n * 归一化 endpoint；省略时回落到当前页面同源。\n *\n * 为什么允许省略（而且这是推荐用法）：数据面 `/.cloud/**` 与应用页面**本就同域**\n * （见架构文档「② 生成应用的终端用户读写」），所以同源就是正确答案。而显式传入\n * 一个绝对地址反而引入了出错空间 —— 服务端下发的 endpoint 会被写进前端产物，应用\n * 重新发布 / 追加认证域名后拿到新域名，产物里的旧地址却不会变，SDK 于是把请求发到\n * 旧域名上；数据面按 Origin 精确匹配（服务端 CredentialVerifier）必然拒绝，现场\n * 表现为跨域预检失败，极难归因。同源没有这个失效模式。\n *\n * 仍保留显式传入的能力：本地开发时页面跑在 vite dev server 上、数据面在别处，\n * 以及非浏览器运行时（无 location）必须显式给。\n */\nfunction resolveEndpoint(value: unknown): string {\n    if (value !== undefined && value !== null && value !== '') {\n        return normalizeHttpUrl(value, 'endpoint');\n    }\n\n    // 同源回落：只取 origin，不带 path —— 后续模块统一用 `${endpoint}${modulePath}`\n    // 拼接，带上 path 会拼出 /some/page/.cloud/... 这种不存在的地址。\n    const origin = globalThis.location?.origin;\n    if (typeof origin !== 'string' || origin === '') {\n        throw new WorkBuddyCloudConfigError(\n            'endpoint is required outside browsers (no location.origin to fall back to).',\n        );\n    }\n    return origin.replace(/\\/+$/, '');\n}\n\nfunction normalizePublishableKey(publishableKey: unknown): string {    if (typeof publishableKey !== 'string' || publishableKey.trim() === '') {\n        throw new WorkBuddyCloudConfigError(\n            'publishableKey is required and must be a non-empty string.',\n        );\n    }\n\n    const trimmed = publishableKey.trim();\n    if (!PUBLISHABLE_KEY_PATTERN.test(trimmed)) {\n        // 只校验前缀，不校验长度/字符集 —— 随机段格式由服务端签发决定，SDK 不该跟死。\n        throw new WorkBuddyCloudConfigError('publishableKey must start with \"wbpk_\".');\n    }\n\n    return trimmed;\n}\n\nfunction resolveFetch(candidate: WorkBuddyCloudOptions['fetch']): typeof globalThis.fetch {\n    if (candidate) {\n        return candidate;\n    }\n\n    if (typeof globalThis.fetch !== 'function') {\n        throw new WorkBuddyCloudConfigError(\n            'Global fetch is unavailable in this runtime; pass options.fetch explicitly.',\n        );\n    }\n\n    // 绑定回 globalThis：某些运行时下裸取 fetch 再调用会丢 this（Illegal invocation）。\n    return globalThis.fetch.bind(globalThis);\n}\n\n/** 校验并归一化用户传入的配置。任何一项不合法都会抛 {@link WorkBuddyCloudConfigError}。 */\nexport function resolveRuntimeConfig(options: WorkBuddyCloudOptions): CloudRuntimeConfig {\n    if (!options || typeof options !== 'object') {\n        throw new WorkBuddyCloudConfigError(\n            'createWorkBuddyCloud requires publishableKey.',\n        );\n    }\n\n    return Object.freeze({\n        endpoint: resolveEndpoint(options.endpoint),\n        oauthRelayBaseUrl: options.oauthRelayBaseUrl\n            ? normalizeHttpUrl(options.oauthRelayBaseUrl, 'oauthRelayBaseUrl')\n            : '',\n        publishableKey: normalizePublishableKey(options.publishableKey),\n        fetch: resolveFetch(options.fetch),\n    });\n}\n","/**\n * 单一 I/O 出口（骨架，#89098）\n *\n * 四个模块**共用这一个 fetch**。publishableKey 注入、自签 session 注入、超时策略\n * 都只在这里实现一次 —— 任何模块自己拼 fetch 都是架构错误：\n * 会长出多套鉴权发送方式，而 §5.2 对此有唯一规定。\n *\n * 契约来源：`services/cmd/agentserver/docs/genie-baas/genie-baas-phase1-design.md` §5.2 / §6.0\n */\n\nimport type { CloudRuntimeConfig } from '../types.js';\n\n/**\n * publishableKey 的请求头形态。\n *\n * §5.2 规定服务端同时接受两种发送方式：`clientId` 位置（TCB 语义，body/query）\n * 与本头部。SDK 统一走头部 —— 它对 GET/POST 一致，不需要按方法改写 body。\n *\n * 头名用 genie-baas 自己的品牌（`x-wb-webapp-access-key`）而非 TCB 的\n * `x-cloudbase-access-key`：genie-baas 在服务端做了凭据换签，浏览器端根本\n * 不直接对话 CloudBase，暴露 cloudbase 品牌名没有意义、也泄漏底层实现。\n * 服务端 gateway 认这个新头（见 dataplane_proxy.go 的 accessKeyHeader）。\n */\nexport const PUBLISHABLE_KEY_HEADER = 'x-wb-webapp-access-key';\n\n/**\n * 已登录终端用户的自签 session token 提供者。\n *\n * 返回 undefined 表示未登录 —— 此时按匿名身份转发（§6.1），**不是错误**。\n * 用函数而非固定值：登录/登出/刷新后无需重建 client，database、storage\n * 自动带上最新身份。\n *\n * ---------------------------------------------------------------------------\n * 为什么是异步（这一点不是可选的）\n *\n * 因为「取 token」这个动作**可能要先发一次网络请求** —— token 已过期或临近\n * 过期时必须先续期再发业务请求。同步签名下做不到这件事：\n *\n *  - 同步 XHR 发续期请求：浏览器已废弃，且阻塞主线程。\n *  - 只靠后台定时器续期、provider 同步读缓存：**会漏**。后台标签页的\n *    setInterval 被节流到分钟级，笔记本休眠唤醒后 token 早已过期。\n *    定时器只能算优化，请求前检查才是正确性底线。\n *  - 返回过期 token、靠 401 重试：见 AuthModule 里关于句柄轮换的说明 ——\n *    我方句柄一旦轮换旧的立即失效，N 个并发 401 各自去刷会把会话弄坏。\n *\n * 改异步对 vendor 完全无感：它只知道自己拿到一个返回 Promise 的 fetch\n * （`src/vendor/postgrest/PostgrestBuilder.ts` 里是 `await _fetch(...)`）。\n * ---------------------------------------------------------------------------\n */\nexport type SessionTokenProvider = () => Promise<string | undefined>;\n\n/**\n * 包装出四模块共用的 fetch。\n *\n * ⚠️ 注入的是**我方自签 session token**，不是 CloudBase 的 token ——\n * 真实 provider 凭据只存服务端，浏览器永远拿不到（§5.3）。\n *\n * ⚠️ auth 模块**自己的**请求不能用带 provider 的 fetch：`/auth/v1/token`\n * 本身就是续期端点，让它去调「取 token（必要时续期）」会死锁。装配见 client.ts。\n */\nexport function createCloudFetch(\n    config: CloudRuntimeConfig,\n    getSessionToken: SessionTokenProvider,\n): typeof globalThis.fetch {\n    return async (input, init) => {\n        const headers = new Headers(init?.headers);\n\n        // 应用身份：标识「哪个应用」，不携带权限（§5.2）。\n        headers.set(PUBLISHABLE_KEY_HEADER, config.publishableKey);\n\n        // 终端用户身份：有则带，无则匿名。\n        //\n        // 已有 Authorization 时不覆盖：调用方显式指定身份的场景（例如刻意用\n        // 别的 token 做越权验证）必须能压过默认注入。\n        if (!headers.has('Authorization')) {\n            const token = await getSessionToken();\n            if (token) {\n                headers.set('Authorization', `Bearer ${token}`);\n            }\n        }\n\n        return config.fetch(input, { ...init, headers });\n    };\n}\n\n/** 恒定匿名的 provider，供 auth 模块自身使用（见 createCloudFetch 的死锁说明）。 */\nexport const anonymousTokenProvider: SessionTokenProvider = () => Promise.resolve(undefined);\n","/**\n * 数据面路径前缀（骨架，#89098）\n *\n * 取值来自设计文档 §5.0 / §6.0 的路径白名单，与 skill 的 “How an App Talks to It”\n * 表格一致。**写死为常量表，不做通用拼接** —— 网关侧同样是常量映射，两边必须对齐。\n */\n\nimport type { CloudModuleName } from './types.js';\n\n/** 所有数据面路径的公共前缀。 */\nexport const CLOUD_PATH_PREFIX = '/.cloud';\n\n/**\n * 模块 → 数据面路径前缀。\n *\n * 网关剥掉 `/.cloud/{模块}` 后还原为 TCB 原路径（auth→`/auth/**`、\n * database→`/v1/rdb/rest/**`、storage→`/v1/storages/**`），该映射是服务端职责，\n * SDK 不感知，也不要在这里镜像。\n */\nexport const CLOUD_MODULE_PATHS: Readonly<Record<CloudModuleName, string>> = Object.freeze({\n    auth: `${CLOUD_PATH_PREFIX}/auth`,\n    database: `${CLOUD_PATH_PREFIX}/database/rest`,\n    storage: `${CLOUD_PATH_PREFIX}/storage`,\n    llm: `${CLOUD_PATH_PREFIX}/llm`,\n});\n","/**\n * auth 端点的请求/响应适配（#89098）\n *\n * 这一层只做三件事：拼路径、把上游响应解析成 CloudSession、把上游错误归一成\n * CloudError。业务流程在 index.ts，并发与生命周期在 session-manager.ts。\n *\n * 端点路径全部取自 `@cloudbase/js-sdk` 的 ApiUrls 常量表（v3.8.0 的\n * `consts.ts`），与服务端的放行表逐条对齐。**不要凭印象改这些字符串** ——\n * 服务端按路径精确匹配来决定「换签 / 本地处理 / 透传 / 拒绝」，改错一个字符\n * 就会掉到另一条分支上（例如带了尾斜杠会从「本地续期」掉成「透传给上游」）。\n */\n\nimport type { CloudError, CloudErrorKind } from '../../http/errors.js';\nimport type { CloudSession, CloudUser } from './types.js';\n\n/**\n * auth 端点表。\n *\n * ⚠️ 续期**只能**用 v1 的 `/v1/token`。v2 的 `/v2/token` 在服务端落在「换签」\n * 分支、会被转发给上游，而我们手里的 refresh_token 是我方句柄，上游不认识它，\n * 结果必然是 invalid_grant。\n */\nexport const AUTH_PATHS = {\n    signUp: '/v1/signup',\n    signIn: '/v1/signin',\n    signInWithProvider: '/v1/signin/with/provider',\n    /** 本地续期端点（服务端不转发上游）。 */\n    token: '/v1/token',\n    /** 小程序微信登录：本地认人后仍需用 custom 票据换取 TCB session。 */\n    loginWechat: '/v1/login-wechat',\n    /** 网页微信扫码：Relay 回调后换 Genie session。 */\n    loginWechatWeb: '/v1/login-wechat-web',\n    signOut: '/v1/user/signout',\n    userMe: '/v1/user/me',\n    /** 发码。 */\n    verification: '/v1/verification',\n    /** 验码，返回一次性的 verification_token（**不是**会话）。 */\n    verificationVerify: '/v1/verification/verify',\n    /** 忘记密码最终更新。 */\n    resetPassword: '/v1/reset',\n    /** 登录后改密的二次校验。 */\n    sudo: '/v1/user/sudo',\n    /** 登录后更新密码。 */\n    userPassword: '/v1/user/password',\n} as const;\n\n/** 上游返回的会话形状（换签后的我方字段）。 */\ninterface RawSession {\n    access_token?: unknown;\n    refresh_token?: unknown;\n    expires_in?: unknown;\n    sub?: unknown;\n    [key: string]: unknown;\n}\n\n/**\n * 把换签后的响应解析成 CloudSession。\n *\n * ⚠️ 上游字段是**保留的**：服务端在原始 JSON 上覆盖那五个字段，其余（如\n * `is_anonymous`）原样留着。所以这里按「至少含这几个键」解析，不能假设\n * 响应里只有这五个键。\n */\nexport function parseSession(payload: unknown, receivedAt: number): CloudSession {\n    const raw = (payload ?? {}) as RawSession;\n    const accessToken = typeof raw.access_token === 'string' ? raw.access_token : '';\n    if (!accessToken) {\n        throw sessionShapeError('response has no access_token');\n    }\n    const refreshToken = typeof raw.refresh_token === 'string' ? raw.refresh_token : '';\n    // expires_in 是**秒**（服务端 int，向零截断）。缺失时给 0，交给\n    // SessionManager 的 fail-safe 当作已过期处理，而不是在这里编一个默认值。\n    const expiresInSec = typeof raw.expires_in === 'number' ? raw.expires_in : 0;\n\n    return {\n        accessToken,\n        refreshToken,\n        expiresAt: receivedAt + expiresInSec * 1000,\n        user: userFromSessionPayload(raw),\n    };\n}\n\n/**\n * 从换签响应里取用户信息。\n *\n * 换签响应只保证有 `sub`，其它字段取决于上游返了什么 —— 需要完整用户信息时\n * 应当另调 `/v1/user/me`。这里刻意不去发那次请求：登录路径上多一个往返会让\n * 首屏变慢，而多数应用只需要一个 id。\n */\nfunction userFromSessionPayload(raw: RawSession): CloudUser {\n    const isAnonymous = raw.is_anonymous === true;\n    return {\n        id: typeof raw.sub === 'string' ? raw.sub : '',\n        isAnonymous,\n        raw: raw as Record<string, unknown>,\n    };\n}\n\n/**\n * 解析 `/v1/user/me` 的响应。\n *\n * 该端点服务端**纯透传**，所以拿到的是上游原始 user 对象。字段名两种都见过\n * （`sub` 与旧的 `uid`），都认。\n */\nexport function parseUser(payload: unknown): CloudUser {\n    const raw = (payload ?? {}) as Record<string, unknown>;\n    const id =\n        typeof raw.sub === 'string' ? raw.sub : typeof raw.uid === 'string' ? raw.uid : '';\n    const metadata = (raw.user_metadata ?? {}) as Record<string, unknown>;\n    return {\n        id,\n        email: pickString(raw.email) ?? pickString(metadata.email),\n        phone: pickString(raw.phone_number) ?? pickString(raw.phone),\n        // 两处都判：上游在不同端点上用过不同字段表达匿名。\n        isAnonymous: raw.is_anonymous === true || raw.scope === 'anonymous',\n        raw,\n    };\n}\n\nfunction pickString(v: unknown): string | undefined {\n    return typeof v === 'string' && v !== '' ? v : undefined;\n}\n\n/** 上游错误体（OAuth2 形状，服务端归一后固定这两个字段）。 */\ninterface RawError {\n    error?: unknown;\n    error_description?: unknown;\n    message?: unknown;\n    msg?: unknown;\n    code?: unknown;\n}\n\n/**\n * 把一次失败的响应归一成 CloudError。\n *\n * 映射依据是服务端的 errorMapping：它把内部错误码收敛成 OAuth2 的枚举值 +\n * 固定 HTTP 状态。这里按 (status, error) 双因素判定，不只看状态码 ——\n * 401 既可能是「key 无效」(invalid_client) 也可能是「会话失效」(invalid_grant)，\n * 二者的处置完全不同：前者是配置错，后者要清凭据重登。\n */\nexport function normalizeHttpError(status: number, payload: unknown): CloudError {\n    const raw = (payload ?? {}) as RawError;\n    const code = typeof raw.error === 'string' ? raw.error : undefined;\n    const message =\n        pickString(raw.error_description) ??\n        pickString(raw.message) ??\n        pickString(raw.msg) ??\n        `HTTP ${status}`;\n\n    return { kind: errorKind(status, code), message, status, code, cause: payload };\n}\n\nfunction errorKind(status: number, code?: string): CloudErrorKind {\n    if (code === 'invalid_grant') {\n        return 'unauthenticated';\n    }\n    switch (status) {\n        case 400:\n            return 'invalid-request';\n        case 401:\n            // 走到这里说明不是 invalid_grant —— 多半是 invalid_client（key 无效\n            // 或已吊销）。归到 invalid-request 会让调用方以为改参数就能好。\n            return 'unauthenticated';\n        case 403:\n            return 'permission-denied';\n        case 404:\n            return 'not-found';\n        case 429:\n            return 'rate-limited';\n        case 501:\n            return 'unimplemented';\n        case 503:\n            return 'backend-unavailable';\n        default:\n            return status >= 500 ? 'backend-unavailable' : 'unknown';\n    }\n}\n\n/**\n * fetch 本身失败（离线、DNS、CORS）时的归一。\n *\n * 这条路径**必须**存在：服务端对 403 与 404 刻意不回 CORS 头，所以浏览器里\n * 这两类错误表现为 fetch 抛 TypeError、**读不到响应体**。只处理 HTTP 状态码\n * 的实现会在这里静默漏掉两类真实失败。\n */\nexport function normalizeNetworkError(err: unknown): CloudError {\n    const message = err instanceof Error ? err.message : String(err);\n    return {\n        kind: 'network',\n        message: `request failed before a response was received: ${message}`,\n        status: 0,\n        cause: err,\n    };\n}\n\nfunction sessionShapeError(reason: string): CloudError & Error {\n    const e = new Error(`workbuddy-cloud auth: ${reason}`) as CloudError & Error;\n    e.kind = 'unknown';\n    e.status = 0;\n    return e;\n}\n","/**\n * 会话生命周期：过期判定、续期、单飞、并发保护（#89098）\n *\n * ============================================================================\n * 为什么这个文件比「调一下 /auth/v1/token」复杂得多\n *\n * 我方刷新句柄的语义是：**每次成功续期都轮换，旧句柄立即失效，没有宽限期。**\n * 这一条把几个平时属于「优化」的东西变成了正确性必需项。\n *\n * 具体的失效场景（不是假想，是这套语义的必然推论）：\n *\n *   3 个并发请求（database ×2 + storage ×1）同时发现 token 过期，各自拿着\n *   句柄 A 去续期。服务端侧有单飞锁，所以只有一个真的轮换成 B，另外两个抢不到\n *   锁、沿用旧记录返回（句柄仍是 A）。三个响应回到浏览器后**都会写 localStorage，\n *   且顺序不确定**：如果 B 先落盘、A 后落盘覆盖，客户端最终持有 A，而服务端\n *   已经轮换到 B、A 已失效 —— 下次续期必然 401，会话锁死。\n *\n *   注意这是**永久损坏**：本地只有失效的 A，没有任何自愈路径，用户被强制登出\n *   且重新登录前做不了任何事。\n *\n * 结论：**服务端单飞不能替代客户端单飞**。两者防的是不同的东西 ——\n * 服务端防「重复轮换」，客户端防「响应乱序覆盖 localStorage」。必须两边都有。\n *\n * 因此本文件实现四层保护，每层针对一个具体的竞态：\n *\n *   1. 单飞（inflight）      —— 同一实例内的并发续期合并成一次\n *   2. commit guard          —— 写入前复核 storage，句柄被别人换过就丢弃自己的结果\n *                               （这是唯一能挡住**跨标签页**覆盖的机制）\n *   3. 登出 epoch            —— 防「登出 + 在途续期」把用户重新登入\n *   4. 失败冷却              —— 服务端故障时不让每个请求都去打 /token\n * ============================================================================\n */\n\nimport type { SessionStore } from './session-store.js';\nimport type { CloudAuthEvent, CloudSession } from './types.js';\n\n/**\n * 提前多久就认为「该续期了」。\n *\n * 余量放在**比较时**而不是写入时：写入时减会把余量固化进 localStorage，\n * 之后想调都调不了（CloudBase 就是写入时减 30s，改不动）。\n *\n * 90 秒的取值理由：token 要经网络到服务端才被校验，「本地还差 3 秒过期」的\n * token 到服务端时很可能已经过期了。留足一个网络往返加时钟偏差的余量。\n */\nconst EXPIRY_MARGIN_MS = 90_000;\n\n/**\n * 同一个句柄续期失败后的冷却时间。\n *\n * 没有冷却时的表现：服务端故障期间，进入过期窗口后**每一个**业务请求都会去打\n * 一次 /token，把故障放大成请求风暴。\n *\n * 按句柄索引而非按时间点索引：句柄一旦换新就绕过冷却立即重试 —— 换新说明\n * 上一次其实成功了，没理由继续冷却。\n */\nconst REFRESH_FAILURE_COOLDOWN_MS = 60_000;\n\n/** 续期请求的执行体，由 AuthModule 注入（它才知道怎么发 HTTP）。 */\nexport type RefreshExecutor = (refreshToken: string) => Promise<CloudSession>;\n\n/** 续期彻底失败（凭据已不可用）时通知 AuthModule 广播 SIGNED_OUT。 */\nexport type SessionEventEmitter = (event: CloudAuthEvent, session: CloudSession | null) => void;\n\n/** 判定一个错误是否意味着「凭据已废，清掉重登」。 */\nexport type CredentialsRejected = (error: unknown) => boolean;\n\nexport interface SessionManagerOptions {\n    store: SessionStore;\n    refresh: RefreshExecutor;\n    emit: SessionEventEmitter;\n    isCredentialsRejected: CredentialsRejected;\n    /** 可注入时钟，仅供测试。 */\n    now?: () => number;\n}\n\nexport class SessionManager {\n    private readonly store: SessionStore;\n    private readonly refresh: RefreshExecutor;\n    private readonly emit: SessionEventEmitter;\n    private readonly isCredentialsRejected: CredentialsRejected;\n    private readonly now: () => number;\n\n    /** 在途的续期。并发调用共享同一个 Promise（第 1 层保护）。 */\n    private inflight: Promise<CloudSession | null> | null = null;\n\n    /**\n     * 登出计数（第 3 层保护）。\n     *\n     * 在任何 await **之前**同步自增，续期流程在写入前后各读一次；若期间发生过\n     * 登出，就把刚拿到的新会话丢弃。否则「用户点了登出 + 一个在途续期」会让\n     * 用户在登出之后被重新登入。\n     */\n    private signOutEpoch = 0;\n\n    /** 上次续期失败的句柄与时刻（第 4 层保护）。 */\n    private lastFailure: { token: string; at: number } | null = null;\n\n    constructor(opts: SessionManagerOptions) {\n        this.store = opts.store;\n        this.refresh = opts.refresh;\n        this.emit = opts.emit;\n        this.isCredentialsRejected = opts.isCredentialsRejected;\n        this.now = opts.now ?? Date.now;\n    }\n\n    /** 读当前会话（不触发续期）。总是从 storage 重读，见 session-store.ts。 */\n    peek(): CloudSession | null {\n        return this.store.read();\n    }\n\n    /**\n     * 取一个**当前可用**的会话，必要时先续期。\n     *\n     * 这是 database / storage 请求路径上的入口，所以它必须「要么给一个能用的\n     * token，要么给 null」，不能给一个即将过期的 token 让调用方去撞 401。\n     */\n    async ensure(): Promise<CloudSession | null> {\n        const current = this.store.read();\n        if (!current) {\n            return null;\n        }\n        if (!this.isExpiring(current)) {\n            return current;\n        }\n        if (!current.refreshToken) {\n            // 没句柄就续不了。清掉：留着一个永远刷不动的会话，表现是每个请求\n            // 都先白跑一次续期再失败。\n            return this.abandon();\n        }\n        return this.refreshOnce(current);\n    }\n\n    /**\n     * 强制续期一次，无论是否临近过期。\n     *\n     * 对外暴露给 `auth.refreshSession()` —— 应用有时需要在拿到「权限刚变更」\n     * 的信号后立刻换一份新 token。\n     */\n    async forceRefresh(): Promise<CloudSession | null> {\n        const current = this.store.read();\n        if (!current?.refreshToken) {\n            return null;\n        }\n        return this.refreshOnce(current, { ignoreCooldown: true });\n    }\n\n    /** 登录成功后落盘并广播。 */\n    commitSignIn(session: CloudSession): CloudSession {\n        this.lastFailure = null;\n        this.store.write(session);\n        this.emit('SIGNED_IN', session);\n        return session;\n    }\n\n    /** 用户信息变更（如匿名升级重签了 token）后落盘并广播。 */\n    commitUserUpdate(session: CloudSession): CloudSession {\n        this.store.write(session);\n        this.emit('USER_UPDATED', session);\n        return session;\n    }\n\n    /**\n     * 清掉本地会话并广播登出。\n     *\n     * 同步自增 epoch 是关键（见 signOutEpoch 注释）——必须在任何 await 之前。\n     */\n    clear(): void {\n        this.signOutEpoch += 1;\n        this.lastFailure = null;\n        this.inflight = null;\n        this.store.clear();\n        this.emit('SIGNED_OUT', null);\n    }\n\n    /** 是否已进入「该续期」的窗口。 */\n    private isExpiring(session: CloudSession): boolean {\n        // 缺 expiresAt 一律当作已过期（fail-safe）：宁可多刷一次，也不要拿着\n        // 一个不知道什么时候过期的 token 一直用下去。\n        if (typeof session.expiresAt !== 'number') {\n            return true;\n        }\n        return session.expiresAt - this.now() < EXPIRY_MARGIN_MS;\n    }\n\n    /** 单飞入口：在途则复用，否则起一次。 */\n    private refreshOnce(\n        current: CloudSession,\n        opts: { ignoreCooldown?: boolean } = {},\n    ): Promise<CloudSession | null> {\n        if (this.inflight) {\n            return this.inflight;\n        }\n        if (!opts.ignoreCooldown && this.inCooldown(current.refreshToken)) {\n            // 冷却期内直接给出「没有可用会话」，不去打服务端。\n            return Promise.resolve(null);\n        }\n        const task = this.doRefresh(current).finally(() => {\n            this.inflight = null;\n        });\n        this.inflight = task;\n        return task;\n    }\n\n    private inCooldown(refreshToken: string): boolean {\n        const f = this.lastFailure;\n        return (\n            f !== null &&\n            f.token === refreshToken &&\n            this.now() - f.at < REFRESH_FAILURE_COOLDOWN_MS\n        );\n    }\n\n    /** 实际续期，含 commit guard 与 epoch 复核。 */\n    private async doRefresh(current: CloudSession): Promise<CloudSession | null> {\n        const epochBefore = this.signOutEpoch;\n        const handleBefore = current.refreshToken;\n\n        let next: CloudSession;\n        try {\n            next = await this.refresh(handleBefore);\n        } catch (err) {\n            return this.onRefreshFailed(handleBefore, err);\n        }\n\n        // --- 第 3 层：期间是否发生过登出 -----------------------------------\n        if (this.signOutEpoch !== epochBefore) {\n            // 用户在续期途中登出了。把刚拿到的会话丢掉 —— 落盘就等于把用户\n            // 重新登入，那是明确违背用户意图的。\n            this.store.clear();\n            return null;\n        }\n\n        // --- 第 2 层：commit guard ----------------------------------------\n        // 复核 storage：若期间**别人**（另一个标签页）已经用同一个句柄换过一份\n        // 新会话，那份才是服务端认的。此时写入自己的结果会把对方的覆盖掉，\n        // 而被覆盖的那个句柄很可能已失效 —— 正是会话锁死的成因。\n        const latest = this.store.read();\n        if (latest && latest.refreshToken !== handleBefore) {\n            return latest;\n        }\n\n        this.lastFailure = null;\n        this.store.write(next);\n        this.emit('TOKEN_REFRESHED', next);\n        return next;\n    }\n\n    /**\n     * 续期失败的分流。\n     *\n     * 「凭据被拒」与「网络/服务端故障」必须区别对待：\n     *  - 凭据被拒（invalid_grant）→ 会话已不可能恢复，清掉并广播登出。留着它\n     *    只会让每个后续请求都先白跑一次续期。\n     *  - 其它（网络、5xx）→ **保留**会话，只记冷却。这类失败会自愈，清掉等于\n     *    把一次网络抖动升级成用户被强制登出。\n     */\n    private onRefreshFailed(handle: string, err: unknown): CloudSession | null {\n        if (this.isCredentialsRejected(err)) {\n            return this.abandon();\n        }\n        this.lastFailure = { token: handle, at: this.now() };\n        return null;\n    }\n\n    /** 会话已不可恢复：清本地并广播登出。 */\n    private abandon(): null {\n        this.store.clear();\n        this.lastFailure = null;\n        this.emit('SIGNED_OUT', null);\n        return null;\n    }\n}\n","/**\n * 会话持久化（#89098）\n *\n * ---------------------------------------------------------------------------\n * localStorage 是**唯一真源**，内存里不留副本\n * ---------------------------------------------------------------------------\n *\n * 每次取 session 都重读 localStorage，承担一次同步读的开销，换「绝不读到脏值」。\n *\n * 为什么不能缓存在内存里：凭据存 localStorage，那么「另一个标签页登出了」\n * 或「另一个标签页刚把刷新句柄轮换了」这类事件，只有重读才能发现。任何长期\n * 驻留的内存副本都会变脏，而变脏的后果不是「多一次 401」——我方句柄一旦轮换\n * 旧的立即失效，拿着脏句柄去续期会把会话彻底弄坏（见 session-manager.ts）。\n *\n * 两家 BaaS SDK 都是这个结论：CloudBase 的 LocalCredentials 注释直接写了\n * 「storage 为凭证的唯一可信来源」；supabase 的 GoTrueClient 每次\n * `__loadSession` 都重读 storage。\n */\n\nimport type { CloudAuthStorage, CloudSession } from './types.js';\n\n/**\n * 存储 key 前缀。\n *\n * 带上 publishableKey：同一浏览器可能开着同平台的多个应用，共用一个 key 会让\n * 它们互相顶掉登录态。\n */\nconst STORAGE_KEY_PREFIX = 'workbuddy-cloud.session.';\n\n/** 内存实现，供测试与无 localStorage 的运行时使用。 */\nexport function createMemoryStorage(): CloudAuthStorage {\n    const map = new Map<string, string>();\n    return {\n        getItem: (k) => map.get(k) ?? null,\n        setItem: (k, v) => void map.set(k, v),\n        removeItem: (k) => void map.delete(k),\n    };\n}\n\n/**\n * 解析出可用的 storage。\n *\n * localStorage 在隐私模式、禁用第三方存储、部分 WebView 里访问即抛，所以要\n * 探测而不是假设存在。探测不到就退回内存版 —— 此时刷新页面会掉登录态，\n * 但**功能可用**，比整个 SDK 初始化就抛异常要好。\n */\nexport function resolveStorage(candidate?: CloudAuthStorage): CloudAuthStorage {\n    if (candidate) {\n        return candidate;\n    }\n    try {\n        const probe = '__workbuddy_probe__';\n        globalThis.localStorage.setItem(probe, '1');\n        globalThis.localStorage.removeItem(probe);\n        return globalThis.localStorage;\n    } catch {\n        return createMemoryStorage();\n    }\n}\n\n/**\n * 会话读写。\n *\n * 只做「读 / 写 / 删」三件事，不含任何过期判定与刷新逻辑 —— 那些在\n * session-manager.ts。分开是因为持久化的正确性（脏数据、序列化）与并发的\n * 正确性（单飞、commit guard）是两类问题，混在一起两边都难看清。\n */\nexport class SessionStore {\n    private readonly key: string;\n\n    constructor(\n        private readonly storage: CloudAuthStorage,\n        publishableKey: string,\n    ) {\n        this.key = STORAGE_KEY_PREFIX + publishableKey;\n    }\n\n    /**\n     * 读当前会话。\n     *\n     * 任何解析失败都当作「没有会话」并**顺手清掉**那条脏记录：残留的坏 JSON\n     * 会让每次读都失败一次，而用户永远不知道该去清哪个 key。\n     * 触发场景真实存在 —— 用户手改 localStorage、SDK 升级换了存储格式。\n     */\n    read(): CloudSession | null {\n        let raw: string | null;\n        try {\n            raw = this.storage.getItem(this.key);\n        } catch {\n            return null;\n        }\n        if (!raw) {\n            return null;\n        }\n        try {\n            const parsed = JSON.parse(raw) as unknown;\n            return isStoredSession(parsed) ? parsed : this.discard();\n        } catch {\n            return this.discard();\n        }\n    }\n\n    write(session: CloudSession): void {\n        try {\n            this.storage.setItem(this.key, JSON.stringify(session));\n        } catch {\n            // 写失败（配额满 / 隐私模式）不能让登录整体失败：内存里这次调用\n            // 返回的 session 仍然可用，只是刷新页面会掉。\n        }\n    }\n\n    clear(): void {\n        try {\n            this.storage.removeItem(this.key);\n        } catch {\n            // 同上：清理失败不该抛给调用方，登出的语义是「尽力清干净」。\n        }\n    }\n\n    private discard(): null {\n        this.clear();\n        return null;\n    }\n}\n\n/**\n * 校验存储内容的形状。\n *\n * 逐字段检查而不是只判 `typeof === 'object'`：格式升级后旧记录会缺字段，\n * 那时候「读到一个缺 refreshToken 的 session」比「读不到」更难查 ——\n * 它会一路走到续期时才炸。\n */\nfunction isStoredSession(value: unknown): value is CloudSession {\n    if (!value || typeof value !== 'object') {\n        return false;\n    }\n    const s = value as Record<string, unknown>;\n    return (\n        typeof s.accessToken === 'string' &&\n        s.accessToken !== '' &&\n        typeof s.refreshToken === 'string' &&\n        typeof s.expiresAt === 'number' &&\n        !!s.user &&\n        typeof s.user === 'object'\n    );\n}\n","/**\n * Auth 模块（#89098）\n *\n * 数据面 `/.cloud/auth/v1/**`。\n *\n * **四个模块里唯一自研的**。Auth 也是唯一不能纯透传的能力：登录响应里 provider\n * 的 token 必须被换成我方自签 session，续期在服务端完成（§5.3 / §6.0）。\n *\n * ============================================================================\n * 本模块是整个客户端的**身份唯一来源**\n *\n * database / storage 的请求身份不由它们自己管 —— client.ts 把\n * `() => auth.getAccessToken()` 交给共享 fetch，于是登录一次其它模块自动带上\n * 身份，登出一次其它模块自动变匿名。调用方不需要（也不应该）手动搬 token。\n *\n * 这也意味着 `getAccessToken()` 在**每个** database/storage 请求前都会被调用、\n * 且可能被高并发调用 —— 它必须便宜且幂等。过期续期的并发保护在\n * session-manager.ts。\n * ============================================================================\n */\n\nimport type { CloudError, CloudResult } from '../../http/errors.js';\nimport { CLOUD_MODULE_PATHS } from '../../paths.js';\nimport type { CloudRuntimeConfig } from '../../types.js';\nimport {\n    AUTH_PATHS,\n    normalizeHttpError,\n    normalizeNetworkError,\n    parseSession,\n    parseUser,\n} from './protocol.js';\nimport { SessionManager } from './session-manager.js';\nimport { resolveStorage, SessionStore } from './session-store.js';\nimport type {\n    CloudAuthEvent,\n    CloudAuthStateCallback,\n    CloudAuthStorage,\n    CloudSession,\n    CloudUser,\n    OAuthRedirect,\n    OAuthSignInOptions,\n    OtpChallenge,\n    OtpCredentials,\n    OtpSignInChallenge,\n    PasswordResetChallenge,\n    PasswordCredentials,\n    ResetPasswordWithOldCredentials,\n    SignUpCredentials,\n    VerifyOtpParams,\n} from './types.js';\n\n/** 错误文案上限，按 Unicode 码点计（不是 UTF-16 code unit）。 */\nconst OAUTH_ERROR_MESSAGE_MAX = 200;\n\nfunction truncateMessage(message: string, max: number): string {\n    const chars = Array.from(message);\n    return chars.length <= max ? message : `${chars.slice(0, max).join('')}…`;\n}\n\n/** 只认 `error`。单独出现的 `error_description` 不是拒绝，不能当成失败。 */\nfunction oauthProviderRejectMessage(params: URLSearchParams): string | null {\n    const error = params.get('error');\n    if (!error) {\n        return null;\n    }\n    const description = params.get('error_description');\n    const message = description\n        ? `oauth provider rejected the request: ${error}: ${description}`\n        : `oauth provider rejected the request: ${error}`;\n    return truncateMessage(message, OAUTH_ERROR_MESSAGE_MAX);\n}\n\nexport interface AuthModuleOptions {\n    /** 凭据存储。缺省用 localStorage（探测失败退回内存）。 */\n    storage?: CloudAuthStorage;\n}\n\nexport class AuthModule {\n    /** 该模块的数据面基址。 */\n    readonly baseUrl: string;\n\n    private readonly sessions: SessionManager;\n    private readonly storage: CloudAuthStorage;\n    private readonly oauthRelayBaseUrl: string;\n    private readonly listeners = new Map<number, CloudAuthStateCallback>();\n    private nextListenerId = 1;\n\n    /**\n     * @param fetch 必须是**不带 session provider** 的 fetch。\n     *\n     * 原因：本模块的 `/v1/token` 就是续期端点；若它走「取 token（必要时先续期）」\n     * 那条出口，续期就会调用自己 —— 死锁。CloudBase 的 OAuth2Client 为同一个\n     * 问题留了逃生口，注释里直接写了 \"may cause deadlock during initialization\"。\n     * 装配见 client.ts。\n     */\n    constructor(\n        config: CloudRuntimeConfig,\n        private readonly fetch: typeof globalThis.fetch,\n        opts: AuthModuleOptions = {},\n    ) {\n        this.baseUrl = `${config.endpoint}${CLOUD_MODULE_PATHS.auth}`;\n        this.oauthRelayBaseUrl = config.oauthRelayBaseUrl;\n        this.storage = resolveStorage(opts.storage);\n        this.sessions = new SessionManager({\n            store: new SessionStore(this.storage, config.publishableKey),\n            refresh: (handle) => this.exchangeRefreshHandle(handle),\n            emit: (event, session) => this.notify(event, session),\n            isCredentialsRejected: (err) => isCloudError(err) && rejectedCredentials(err),\n        });\n    }\n\n    // ------------------------------------------------------------------\n    // 供 client.ts 装配共享 fetch 用\n    // ------------------------------------------------------------------\n\n    /**\n     * 取一个当前可用的 access token，必要时先续期。无会话返回 undefined。\n     *\n     * database / storage 的每个请求都会调它 —— 返回 undefined 表示匿名，\n     * 那是合法状态不是错误（服务端按 anon 角色处理）。\n     */\n    async getAccessToken(): Promise<string | undefined> {\n        const session = await this.sessions.ensure();\n        return session?.accessToken;\n    }\n\n    // ------------------------------------------------------------------\n    // 登录\n    // ------------------------------------------------------------------\n\n    /** 邮箱 + 密码登录。当前环境未启用手机号或匿名登录。 */\n    async signInWithPassword(credentials: PasswordCredentials): Promise<CloudResult<CloudSession>> {\n        if (!credentials.email || !credentials.password) {\n            return fail(badRequest('signInWithPassword requires email and password'));\n        }\n        return this.postForSession(AUTH_PATHS.signIn, {\n            username: credentials.email,\n            password: credentials.password,\n        });\n    }\n\n    /**\n     * 小程序 wx.login 的 code 换 Genie session。\n     * 试用与正式是两套独立小程序，必须带当前账号的 appid\n     *（`wx.getAccountInfoSync().miniProgram.appId`）。\n     * 成功后 session.user.id 为 TCB custom uid：`wx:` + 微信 openid（长度需 ≤32）。\n     */\n    async signInWithWechat(code: string, appid: string): Promise<CloudResult<CloudSession>> {\n        if (!code) {\n            return fail(badRequest('signInWithWechat requires code'));\n        }\n        if (!appid) {\n            return fail(badRequest('signInWithWechat requires appid'));\n        }\n        return this.postForSession(AUTH_PATHS.loginWechat, { code, appid });\n    }\n\n    /**\n     * 注册。\n     *\n     * 上游要求先完成验证码验证，所以必须带一个 `verificationToken`（来自\n     * `verifyOtp`）。只有用户名+密码的注册会被上游明确拒绝。\n     *\n     * 账号标识用 `email` 或 `phone`（二选一，与发码渠道一致）。\n     */\n    async signUp(\n        credentials: SignUpCredentials & { verificationToken: string },\n    ): Promise<CloudResult<CloudSession>> {\n        if (!credentials.email && !credentials.phone) {\n            return fail(badRequest('signUp requires email or phone'));\n        }\n        if (!credentials.verificationToken) {\n            return fail(\n                badRequest(\n                    'signUp requires a verificationToken; run sendOtp + verifyOtp first ' +\n                        '(the provider rejects username+password-only signup)',\n                ),\n            );\n        }\n        // 邮箱注册必须带密码。上游接受缺 password 的注册（验证码已证明身份），\n        // 但这样建出的账号**永远无法密码登录**，而注册当下是成功的 —— 用户要到\n        // 下次登录才发现，且看到的是「密码错误」而不是「你没设过密码」。\n        // 契约（auth/code-generation.md）承诺邮箱+密码登录，这里必须拦住。\n        //\n        // 手机号注册不拦：短信注册通常只用验证码，不设密码是正常形态。\n        if (credentials.email && !credentials.password) {\n            return fail(\n                badRequest(\n                    'signUp with email requires a password; an account created without one ' +\n                        'can never sign in by password',\n                ),\n            );\n        }\n        const body: Record<string, unknown> = {\n            verification_token: credentials.verificationToken,\n        };\n        if (credentials.phone) body.phone_number = normalizePhone(credentials.phone);\n        if (credentials.email) body.email = credentials.email;\n        if (credentials.password) body.password = credentials.password;\n        return this.postForSession(AUTH_PATHS.signUp, body);\n    }\n\n    /**\n     * 发验证码（邮箱或短信，由 `credentials` 传的字段决定）。\n     *\n     * 这一步**不产生会话**，只返回一个 `verificationId`。发码由上游完成，\n     * 我方不实现发码逻辑。\n     *\n     * 返回的 `isExistingUser` 决定验码之后走登录还是注册 —— 该判断由上游给出，\n     * SDK 不猜。\n     *\n     * 两条渠道的请求体差异是刻意的（runtime-auth-design §3.1）：\n     * - 邮箱：`{ email, usage: 'email' }`，与上游 `VerificationUsage.EMAIL` 的值一致，区分大小写。\n     * - 手机：`{ phone_number, target: 'ANY' }` —— **不带 `usage`**（普通短信登录\n     *   发码时省略即可，上游没有对应的短信枚举值），`target: 'ANY'` 表示新老用户\n     *   都允许发码。\n     */\n    async sendOtp(credentials: OtpCredentials): Promise<CloudResult<OtpChallenge>> {\n        const body: Record<string, unknown> = {};\n        if (credentials.phone) {\n            body.phone_number = normalizePhone(credentials.phone);\n            body.target = 'ANY';\n        } else if (credentials.email) {\n            body.email = credentials.email;\n            body.usage = 'email';\n            if (credentials.emailRedirectTo) {\n                body.email_redirect_to = credentials.emailRedirectTo;\n            }\n        } else {\n            return fail(badRequest('sendOtp requires email or phone'));\n        }\n\n        const res = await this.request(AUTH_PATHS.verification, { method: 'POST', body });\n        if (res.error) {\n            return fail(res.error);\n        }\n        const payload = (res.data ?? {}) as Record<string, unknown>;\n        const verificationId =\n            typeof payload.verification_id === 'string' ? payload.verification_id : '';\n        if (!verificationId) {\n            return fail(badRequest('provider returned no verification_id'));\n        }\n        return ok({ verificationId, isExistingUser: payload.is_user === true });\n    }\n\n    /** gotrue 风格的 OTP 入口：发码后由 challenge.verify 完成登录。 */\n    async signInWithOtp(\n        credentials: OtpCredentials,\n    ): Promise<CloudResult<OtpSignInChallenge>> {\n        const sent = await this.sendOtp(credentials);\n        if (sent.error) {\n            return fail(sent.error);\n        }\n        const { verificationId, isExistingUser } = sent.data;\n        const phone = credentials.phone ? normalizePhone(credentials.phone) : undefined;\n        return ok({\n            verificationId,\n            isExistingUser,\n            isUser: isExistingUser,\n            verify: ({ token, password }) =>\n                this.verifyOtp({\n                    verificationId,\n                    token,\n                    email: credentials.email,\n                    phone,\n                    isExistingUser,\n                    password,\n                }),\n        });\n    }\n\n    /**\n     * 验码并登录（或注册后登录）。\n     *\n     * 两步：先用验证码换一个**一次性** `verification_token`，再用它换会话。\n     * 中间那个 token 不是会话 —— 拿它当 Bearer 会被拒。\n     *\n     * 走登录还是注册由 `isExistingUser` 决定（`sendOtp` 的返回值）。刻意不做\n     * 「先试登录失败再试注册」的兜底：那会把「密码错」这类真实错误掩盖成一次\n     * 莫名的注册尝试。\n     *\n     * 登录侧邮箱与手机号共用 `username` 字段 —— 上游 `SignInRequest.username`\n     * 承载邮箱/手机/用户名三种形态（runtime-auth-design §3.2）。\n     */\n    async verifyOtp(\n        params: VerifyOtpParams & { isExistingUser: boolean },\n    ): Promise<CloudResult<CloudSession>> {\n        const identifier = params.phone ? normalizePhone(params.phone) : params.email ?? '';\n        if (!params.verificationId || !params.token || !identifier) {\n            return fail(\n                badRequest('verifyOtp requires verificationId, token and either email or phone'),\n            );\n        }\n        const verified = await this.request(AUTH_PATHS.verificationVerify, {\n            method: 'POST',\n            body: {\n                verification_id: params.verificationId,\n                verification_code: params.token,\n            },\n        });\n        if (verified.error) {\n            return fail(verified.error);\n        }\n        const vt = (verified.data ?? {}) as Record<string, unknown>;\n        const verificationToken =\n            typeof vt.verification_token === 'string' ? vt.verification_token : '';\n        if (!verificationToken) {\n            return fail(badRequest('provider returned no verification_token'));\n        }\n\n        if (params.isExistingUser) {\n            return this.postForSession(AUTH_PATHS.signIn, {\n                username: identifier,\n                verification_token: verificationToken,\n            });\n        }\n        return this.signUp({\n            email: params.email,\n            phone: params.phone,\n            password: params.password,\n            verificationToken,\n        });\n    }\n\n    // ------------------------------------------------------------------\n    // OAuth\n    // ------------------------------------------------------------------\n\n    /**\n     * 发起第三方登录，返回该把用户送去的地址。\n     *\n     * 走 Cloud Backend Service OAuth Relay。IdP 回调白名单只登记平台统一域名。\n     * SDK 不自己跳转：返回 url 交调用方 `location.assign`。\n     *\n     * `google` 已下线，仅存量应用；新应用用 `wechat` 做网页扫码登录。\n     */\n    async signInWithOAuth(options: OAuthSignInOptions): Promise<CloudResult<OAuthRedirect>> {\n        if (!this.oauthRelayBaseUrl) {\n            return fail(badRequest('signInWithOAuth requires oauthRelayBaseUrl'));\n        }\n        if (options.provider !== 'google' && options.provider !== 'wechat') {\n            return fail(badRequest('signInWithOAuth supports google or wechat'));\n        }\n        const redirectTo = options.redirectTo ?? currentPageUrl();\n        if (!redirectTo) {\n            return fail(\n                badRequest('signInWithOAuth requires redirectTo outside a browser environment'),\n            );\n        }\n        return this.startRelayOAuth(options, redirectTo);\n    }\n\n    /** 回调输入的 query 归一：接受完整 URL 或裸 query。 */\n    private parseCallbackQuery(input: string): CloudResult<URLSearchParams> {\n        try {\n            const query = /^https?:\\/\\//i.test(input) ? new URL(input).search : input;\n            return ok(new URLSearchParams(query));\n        } catch {\n            return fail(badRequest('oauth callback URL is invalid'));\n        }\n    }\n\n    /**\n     * 完成第三方登录：读回调 URL 上的参数换会话。\n     *\n     * 在回调落地页调一次即可。`code` 缺失时返回 `null` 数据而**不是**错误 ——\n     * 落地页可能被直接访问（用户收藏了它），那不是失败。\n     *\n     * @deprecated Google 登录已下线，新应用不应再调用该方法。\n     */\n    async handleOAuthCallback(search?: string): Promise<CloudResult<CloudSession | null>> {\n        const parsed = this.parseCallbackQuery(search ?? currentPageSearch());\n        if (parsed.error || !parsed.data) {\n            return fail(parsed.error ?? badRequest('oauth callback URL is invalid'));\n        }\n        const params = parsed.data;\n        // 上游的失败也从 query 回来（用户点了「拒绝授权」）。\n        const oauthError = oauthProviderRejectMessage(params);\n        if (oauthError) {\n            return fail({\n                kind: 'unauthenticated',\n                message: oauthError,\n                status: 0,\n            });\n        }\n        const code = params.get('code');\n        if (!code) {\n            return ok(null);\n        }\n        const state = params.get('state') ?? '';\n        if (!state) {\n            return fail(badRequest('oauth callback requires state'));\n        }\n        const providerId = params.get('provider_id');\n        if (providerId !== 'custom-oauth') {\n            return fail(badRequest('oauth callback requires provider_id=custom-oauth'));\n        }\n\n        const body: Record<string, unknown> = {\n            provider_id: providerId,\n            provider_code: code,\n            state,\n            provider_params: { state },\n        };\n        return this.postForSession(AUTH_PATHS.signInWithProvider, body);\n    }\n\n    /**\n     * 网页微信扫码回调：用 Relay 带回的 code/state 换 Genie session。\n     *\n     * 仅用于 **微信扫码** 落地页。Google 存量应用必须继续调用\n     * `handleOAuthCallback`（custom-oauth 路径）。两者不可互换：本方法会拒绝\n     * `provider != \"wechat\"` 的回调，报错看起来像前端传错参数。\n     */\n    async handleWechatWebCallback(search?: string): Promise<CloudResult<CloudSession | null>> {\n        const parsed = this.parseCallbackQuery(search ?? currentPageSearch());\n        if (parsed.error || !parsed.data) {\n            return fail(parsed.error ?? badRequest('oauth callback URL is invalid'));\n        }\n        const params = parsed.data;\n        const oauthError = oauthProviderRejectMessage(params);\n        if (oauthError) {\n            return fail({\n                kind: 'unauthenticated',\n                message: oauthError,\n                status: 0,\n            });\n        }\n        const code = params.get('code');\n        if (!code) {\n            return ok(null);\n        }\n        const state = params.get('state') ?? '';\n        if (!state) {\n            return fail(badRequest('oauth callback requires state'));\n        }\n        const provider = params.get('provider');\n        if (provider && provider !== 'wechat') {\n            return fail(badRequest('wechat callback requires provider=wechat'));\n        }\n        if (params.get('provider_id') === 'custom-oauth') {\n            return fail(badRequest('wechat callback must not use provider_id=custom-oauth'));\n        }\n        return this.postForSession(AUTH_PATHS.loginWechatWeb, { code, state });\n    }\n\n    /** 忘记密码：发码，验证码通过后更新密码并自动登录。 */\n    async resetPasswordForEmail(\n        email: string,\n    ): Promise<CloudResult<PasswordResetChallenge>> {\n        if (!email) {\n            return fail(badRequest('resetPasswordForEmail requires email'));\n        }\n        const sent = await this.request(AUTH_PATHS.verification, {\n            method: 'POST',\n            body: { email, usage: 'PASSWORD_RESET', target: 'USER' },\n        });\n        if (sent.error) {\n            return fail(sent.error);\n        }\n        const payload = (sent.data ?? {}) as Record<string, unknown>;\n        const verificationId =\n            typeof payload.verification_id === 'string' ? payload.verification_id : '';\n        if (!verificationId) {\n            return fail(badRequest('provider returned no verification_id'));\n        }\n        return ok({\n            updateUser: async ({ nonce, password }) => {\n                const verified = await this.request(AUTH_PATHS.verificationVerify, {\n                    method: 'POST',\n                    body: {\n                        verification_id: verificationId,\n                        verification_code: nonce,\n                    },\n                });\n                if (verified.error) {\n                    return fail(verified.error);\n                }\n                const verifiedPayload = (verified.data ?? {}) as Record<string, unknown>;\n                const verificationToken =\n                    typeof verifiedPayload.verification_token === 'string'\n                        ? verifiedPayload.verification_token\n                        : '';\n                if (!verificationToken) {\n                    return fail(badRequest('provider returned no verification_token'));\n                }\n                const reset = await this.request(AUTH_PATHS.resetPassword, {\n                    method: 'POST',\n                    body: {\n                        email,\n                        new_password: password,\n                        verification_token: verificationToken,\n                    },\n                });\n                if (reset.error) {\n                    return fail(reset.error);\n                }\n                const signedIn = await this.signInWithPassword({ email, password });\n                if (!signedIn.error) {\n                    this.notify('PASSWORD_RECOVERY', signedIn.data);\n                }\n                return signedIn;\n            },\n        });\n    }\n\n    /** 登录后使用旧密码进行 sudo 校验并更新密码。 */\n    async resetPasswordForOld(\n        credentials: ResetPasswordWithOldCredentials,\n    ): Promise<CloudResult<CloudSession>> {\n        const token = await this.getAccessToken();\n        if (!token) {\n            return fail({ kind: 'unauthenticated', message: 'no active session', status: 0 });\n        }\n        const sudo = await this.request(AUTH_PATHS.sudo, {\n            method: 'POST',\n            token,\n            body: { password: credentials.oldPassword },\n        });\n        if (sudo.error) {\n            return fail(sudo.error);\n        }\n        const payload = (sudo.data ?? {}) as Record<string, unknown>;\n        const sudoToken = typeof payload.sudo_token === 'string' ? payload.sudo_token : '';\n        if (!sudoToken) {\n            return fail(badRequest('provider returned no sudo_token'));\n        }\n        const updated = await this.request(AUTH_PATHS.userPassword, {\n            method: 'PATCH',\n            token,\n            body: { sudo_token: sudoToken, new_password: credentials.newPassword },\n        });\n        if (updated.error) {\n            return fail(updated.error);\n        }\n        const session = await this.getSession();\n        if (session.data) {\n            this.notify('USER_UPDATED', session.data);\n            return ok(session.data);\n        }\n        return fail(session.error ?? {\n            kind: 'unauthenticated',\n            message: 'no active session',\n            status: 0,\n        });\n    }\n\n    // ------------------------------------------------------------------\n    // 会话\n    // ------------------------------------------------------------------\n\n    /**\n     * 读当前会话。\n     *\n     * 会在临近过期时**顺手续期** —— 只读本地不续期的话，调用方拿到一个还剩\n     * 3 秒有效期的 token 去发请求，到服务端就已经过期了。\n     */\n    async getSession(): Promise<CloudResult<CloudSession | null>> {\n        try {\n            return ok(await this.sessions.ensure());\n        } catch (err) {\n            return fail(isCloudError(err) ? err : normalizeNetworkError(err));\n        }\n    }\n\n    /** 强制续期一次，不管是否临近过期。 */\n    async refreshSession(): Promise<CloudResult<CloudSession | null>> {\n        try {\n            return ok(await this.sessions.forceRefresh());\n        } catch (err) {\n            return fail(isCloudError(err) ? err : normalizeNetworkError(err));\n        }\n    }\n\n    /**\n     * 读当前用户。\n     *\n     * 会发请求（`/v1/user/me`）而不是读本地 session —— 后者的 user 字段来自\n     * 登录那一刻，可能已过时（别处改了昵称、或匿名已升级为实名）。\n     */\n    async getUser(): Promise<CloudResult<CloudUser>> {\n        const token = await this.getAccessToken();\n        if (!token) {\n            return fail({ kind: 'unauthenticated', message: 'no active session', status: 0 });\n        }\n        const res = await this.request(AUTH_PATHS.userMe, { method: 'GET', token });\n        if (res.error) {\n            // 会话在服务端已失效（例如别处登出了）：本地也要清，否则界面会一直\n            // 显示登录态却什么都做不了。\n            if (rejectedCredentials(res.error)) {\n                this.sessions.clear();\n            }\n            return fail(res.error);\n        }\n        return ok(parseUser(res.data));\n    }\n\n    /**\n     * 登出。\n     *\n     * 无论服务端返回什么都清本地：服务端侧是**无条件销毁**的（转发上游之后就\n     * 销毁，不看上游成败），本地留着只会让界面显示一个已经不能用的登录态。\n     * 断网时也必须能登出。\n     */\n    async signOut(): Promise<CloudResult<null>> {\n        const session = this.sessions.peek();\n        if (session?.accessToken) {\n            // 必须带 Authorization：不带的话服务端不知道要销毁哪个会话，\n            // 会静默什么都不做。\n            await this.request(AUTH_PATHS.signOut, {\n                method: 'POST',\n                body: {},\n                token: session.accessToken,\n            });\n        }\n        this.sessions.clear();\n        return ok(null);\n    }\n\n    /**\n     * 订阅登录态变化。返回取消订阅函数。\n     *\n     * 订阅时会**立即**回放一次 `INITIAL_SESSION`：没有它，调用方无法区分\n     * 「还没初始化完」与「初始化完了但未登录」，首屏会闪一下登录页。\n     */\n    onAuthStateChange(callback: CloudAuthStateCallback): () => void {\n        const id = this.nextListenerId++;\n        this.listeners.set(id, callback);\n        // 同步回放，不推到微任务：调用方常在首次 render 前订阅，延迟一拍就会\n        // 多渲染一帧未登录状态。\n        safeInvoke(callback, 'INITIAL_SESSION', this.sessions.peek());\n        return () => void this.listeners.delete(id);\n    }\n\n    // ------------------------------------------------------------------\n    // 内部\n    // ------------------------------------------------------------------\n\n    /**\n     * 拼出平台 Relay 授权地址；state 由 Relay 自己签发、校验并一次性消费。\n     */\n    private async startRelayOAuth(\n        options: OAuthSignInOptions,\n        redirectTo: string,\n    ): Promise<CloudResult<OAuthRedirect>> {\n        // Cloud Backend Relay 自己签发、校验并一次性消费 state；应用只提供最终\n        // callback URL，不能自行生成或覆盖 state。\n        const callback = new URL(redirectTo);\n        const relay = new URL(`${this.oauthRelayBaseUrl}/authorize`);\n        relay.searchParams.set('provider', options.provider);\n        relay.searchParams.set('callback_url', callback.toString());\n\n        return ok({ url: relay.toString() });\n    }\n\n    /** 用我方句柄换新会话。这是 SessionManager 注入的续期执行体。 */\n    private async exchangeRefreshHandle(handle: string): Promise<CloudSession> {\n        // 刻意**不带** Authorization：句柄本身就是凭据；带上一个已过期的\n        // access token 反而会在服务端的鉴权阶段先被 401 挡掉。\n        const res = await this.request(AUTH_PATHS.token, {\n            method: 'POST',\n            body: { grant_type: 'refresh_token', refresh_token: handle },\n        });\n        if (res.error) {\n            throw res.error;\n        }\n        return parseSession(res.data, Date.now());\n    }\n\n    /** POST 一个换签端点并把响应解析成会话。 */\n    private async postForSession(\n        path: string,\n        body: unknown,\n        opts: { headers?: Record<string, string> } = {},\n    ): Promise<CloudResult<CloudSession>> {\n        const res = await this.request(path, { method: 'POST', body, headers: opts.headers });\n        if (res.error) {\n            return fail(res.error);\n        }\n        try {\n            return ok(this.sessions.commitSignIn(parseSession(res.data, Date.now())));\n        } catch (err) {\n            return fail(isCloudError(err) ? err : normalizeNetworkError(err));\n        }\n    }\n\n    /** 发一次 auth 请求并归一错误。 */\n    private async request(\n        path: string,\n        init: {\n            method: string;\n            body?: unknown;\n            token?: string;\n            headers?: Record<string, string>;\n        },\n    ): Promise<CloudResult<unknown>> {\n        const headers: Record<string, string> = { ...init.headers };\n        if (init.body !== undefined) {\n            // Content-Type 必须是 JSON：服务端只在这个前提下才解析 body\n            // （它要从里面找 refresh_token / redirect_uri 等字段）。\n            headers['Content-Type'] = 'application/json';\n        }\n        if (init.token) {\n            headers.Authorization = `Bearer ${init.token}`;\n        }\n\n        let response: Response;\n        try {\n            response = await this.fetch(this.baseUrl + path, {\n                method: init.method,\n                headers,\n                body: init.body === undefined ? undefined : JSON.stringify(init.body),\n            });\n        } catch (err) {\n            // fetch 层失败。403/404 在浏览器里也会走到这里（服务端对这两类刻意\n            // 不回 CORS 头），所以这条分支不是「只有断网才进」。\n            return fail(normalizeNetworkError(err));\n        }\n\n        const payload = await readBody(response);\n        if (!response.ok) {\n            return fail(normalizeHttpError(response.status, payload));\n        }\n        return ok(payload);\n    }\n\n    /** 广播事件。单个监听器抛错不能影响其它监听器与主流程。 */\n    private notify(event: CloudAuthEvent, session: CloudSession | null): void {\n        for (const cb of this.listeners.values()) {\n            safeInvoke(cb, event, session);\n        }\n    }\n}\n\n// ----------------------------------------------------------------------\n// 小工具\n// ----------------------------------------------------------------------\n\nfunction ok<T>(data: T): CloudResult<T> {\n    return { data, error: null };\n}\n\nfunction fail<T>(error: CloudError): CloudResult<T> {\n    return { data: null, error };\n}\n\nfunction badRequest(message: string): CloudError {\n    return { kind: 'invalid-request', message, status: 0 };\n}\n\n/**\n * 归一化国内手机号为 `+86 13800000000` 形式（+86 后带一个空格）。\n *\n * 兼容输入：裸号（`13800000000`）、带区号但无空格（`+8613800000000`、\n * `8613800000000`）、国际冠码（`0086...`）、各种分隔符（空格/连字符）。\n * 非 11 位国内手机号（如港澳号 `+852...`）原样返回，不破坏非大陆号码。\n */\nfunction normalizePhone(phone: string): string {\n    const digits = phone.replace(/\\D/g, '');\n    let local = digits;\n    if (local.startsWith('0086')) {\n        local = local.slice(4);\n    } else if (local.startsWith('86') && local.length === 13) {\n        local = local.slice(2);\n    }\n    return /^1\\d{10}$/.test(local) ? `+86 ${local}` : phone;\n}\n\nfunction isCloudError(v: unknown): v is CloudError {\n    return !!v && typeof v === 'object' && typeof (v as CloudError).kind === 'string';\n}\n\n/** 该错误是否意味着本地凭据已废。 */\nfunction rejectedCredentials(error: CloudError): boolean {\n    return error.kind === 'unauthenticated' || error.code === 'invalid_grant';\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n    const text = await response.text();\n    if (!text) {\n        return null;\n    }\n    try {\n        return JSON.parse(text);\n    } catch {\n        // 非 JSON 响应（网关错误页等）：包一层，让上层仍能拿到原文。\n        return { message: text };\n    }\n}\n\nfunction safeInvoke(\n    cb: CloudAuthStateCallback,\n    event: CloudAuthEvent,\n    session: CloudSession | null,\n): void {\n    try {\n        cb(event, session);\n    } catch {\n        // 监听器里的异常是调用方的问题，不能让它中断登录/登出流程。\n    }\n}\n\n/** 当前页地址（去掉 query 与 hash）—— OAuth 回调的缺省落地点。 */\nfunction currentPageUrl(): string {\n    const loc = globalThis.location;\n    return loc ? loc.origin + loc.pathname : '';\n}\n\nfunction currentPageSearch(): string {\n    return globalThis.location?.search ?? '';\n}\n","// Types that are shared between supabase-js and postgrest-js\n\nexport type Fetch = typeof fetch\n\n/**\n * Default number of retry attempts.\n */\nexport const DEFAULT_MAX_RETRIES = 3\n\n/**\n * Default exponential backoff delay function.\n * Delays: 1s, 2s, 4s, 8s, ... (max 30s)\n *\n * @param attemptIndex - Zero-based index of the retry attempt\n * @returns Delay in milliseconds before the next retry\n */\nexport const getRetryDelay = (attemptIndex: number): number =>\n  Math.min(1000 * 2 ** attemptIndex, 30000)\n\n/**\n * Status codes that are safe to retry.\n * 520 = Cloudflare timeout/connection errors (transient)\n * 503 = PostgREST schema cache not yet loaded (transient, signals retry via Retry-After header)\n */\nexport const RETRYABLE_STATUS_CODES = [520, 503] as const\n\n/**\n * HTTP methods that are safe to retry (idempotent operations).\n */\nexport const RETRYABLE_METHODS = ['GET', 'HEAD', 'OPTIONS'] as const\n\nexport type GenericRelationship = {\n  foreignKeyName: string\n  columns: string[]\n  isOneToOne?: boolean\n  referencedRelation: string\n  referencedColumns: string[]\n}\n\nexport type GenericTable = {\n  Row: Record<string, unknown>\n  Insert: Record<string, unknown>\n  Update: Record<string, unknown>\n  Relationships: GenericRelationship[]\n}\n\nexport type GenericUpdatableView = {\n  Row: Record<string, unknown>\n  Insert: Record<string, unknown>\n  Update: Record<string, unknown>\n  Relationships: GenericRelationship[]\n}\n\nexport type GenericNonUpdatableView = {\n  Row: Record<string, unknown>\n  Relationships: GenericRelationship[]\n}\n\nexport type GenericView = GenericUpdatableView | GenericNonUpdatableView\n\nexport type GenericSetofOption = {\n  isSetofReturn?: boolean | undefined\n  isOneToOne?: boolean | undefined\n  isNotNullable?: boolean | undefined\n  to: string\n  from: string\n}\n\nexport type GenericFunction = {\n  Args: Record<string, unknown> | never\n  Returns: unknown\n  SetofOptions?: GenericSetofOption\n}\n\nexport type GenericSchema = {\n  Tables: Record<string, GenericTable>\n  Views: Record<string, GenericView>\n  Functions: Record<string, GenericFunction>\n}\n\nexport type ClientServerOptions = {\n  PostgrestVersion?: string\n}\n","/**\n * Error format\n *\n * Returned by every PostgREST request that fails. When something fails, the\n * single most useful field is usually `hint` — Postgres often returns the\n * actionable fix there, not in `message`. Always log the full object (e.g.\n * `console.error(error)`); logging only `error.message` hides the hint.\n *\n * Read the fields in roughly this order of usefulness:\n *\n * - `hint` — actionable guidance from the database when available. For\n *   permission-denied errors (`42501`), this is the literal SQL to fix the\n *   problem, e.g.\n *   `\"Grant the required privileges to the current role with: GRANT SELECT ON public.users TO anon;\"`.\n *   Missing column? `hint` suggests the column you probably meant. Whenever\n *   Postgres knows the fix, it puts it in `hint`.\n * - `code` — stable error code from PostgREST (e.g. `PGRST301`) or Postgres\n *   (e.g. `42501`). Branch on this rather than on `message` text.\n * - `details` — extra context, often the offending value, key, or row.\n * - `message` — human-readable summary. Useful in UI strings; less useful\n *   for debugging.\n *\n * {@link https://postgrest.org/en/stable/api.html?highlight=options#errors-and-http-status-codes}\n */\nexport default class PostgrestError extends Error {\n  details: string\n  hint: string\n  code: string\n\n  /**\n   * @example\n   * ```ts\n   * import PostgrestError from '@supabase/postgrest-js'\n   *\n   * throw new PostgrestError({\n   *   message: 'Row level security prevented the request',\n   *   details: 'RLS denied the insert',\n   *   hint: 'Check your policies',\n   *   code: 'PGRST301',\n   * })\n   * ```\n   */\n  constructor(context: { message: string; details: string; hint: string; code: string }) {\n    super(context.message)\n    this.name = 'PostgrestError'\n    this.details = context.details\n    this.hint = context.hint\n    this.code = context.code\n  }\n\n  toJSON(): { name: string; message: string; details: string; hint: string; code: string } {\n    return {\n      name: this.name,\n      message: this.message,\n      details: this.details,\n      hint: this.hint,\n      code: this.code,\n    }\n  }\n}\n","import type {\n  PostgrestSingleResponse,\n  PostgrestResponseSuccess,\n  CheckMatchingArrayTypes,\n  MergePartialResult,\n  IsValidResultOverride,\n} from './types/types'\nimport {\n  ClientServerOptions,\n  Fetch,\n  DEFAULT_MAX_RETRIES,\n  getRetryDelay,\n  RETRYABLE_STATUS_CODES,\n  RETRYABLE_METHODS,\n} from './types/common/common'\nimport PostgrestError from './PostgrestError'\nimport { ContainsNull } from './select-query-parser/types'\n\n/**\n * Sleep for a given number of milliseconds.\n * If an AbortSignal is provided, the sleep resolves early when the signal is aborted.\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n  return new Promise((resolve) => {\n    if (signal?.aborted) {\n      resolve()\n      return\n    }\n    const id = setTimeout(() => {\n      signal?.removeEventListener('abort', onAbort)\n      resolve()\n    }, ms)\n    function onAbort() {\n      clearTimeout(id)\n      resolve()\n    }\n    signal?.addEventListener('abort', onAbort)\n  })\n}\n\n/**\n * Check if a request should be retried based on method and status code.\n */\nfunction shouldRetry(\n  method: string,\n  status: number,\n  attemptCount: number,\n  retryEnabled: boolean\n): boolean {\n  // Don't retry if retries are disabled or we've exhausted attempts\n  if (!retryEnabled || attemptCount >= DEFAULT_MAX_RETRIES) {\n    return false\n  }\n\n  // Only retry idempotent methods (GET, HEAD, OPTIONS)\n  if (!RETRYABLE_METHODS.includes(method as (typeof RETRYABLE_METHODS)[number])) {\n    return false\n  }\n\n  // Only retry on specific status codes (520 - Cloudflare errors)\n  if (!RETRYABLE_STATUS_CODES.includes(status as (typeof RETRYABLE_STATUS_CODES)[number])) {\n    return false\n  }\n\n  return true\n}\n\nexport default abstract class PostgrestBuilder<\n  ClientOptions extends ClientServerOptions,\n  Result,\n  ThrowOnError extends boolean = false,\n> implements PromiseLike<\n  ThrowOnError extends true ? PostgrestResponseSuccess<Result> : PostgrestSingleResponse<Result>\n> {\n  protected method: 'GET' | 'HEAD' | 'POST' | 'PATCH' | 'DELETE'\n  protected url: URL\n  protected headers: Headers\n  protected schema?: string\n  protected body?: unknown\n  protected shouldThrowOnError = false\n  protected signal?: AbortSignal\n  protected fetch: Fetch\n  protected isMaybeSingle: boolean\n  protected shouldStripNulls: boolean\n  protected urlLengthLimit: number\n\n  // Retry configuration - enabled by default\n  protected retryEnabled: boolean = true\n\n  /**\n   * Creates a builder configured for a specific PostgREST request.\n   *\n   * @example Using supabase-js (recommended)\n   * ```ts\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const { data, error } = await supabase.from('users').select('*')\n   * ```\n   *\n   * @category Database\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```ts\n   * import { PostgrestQueryBuilder } from '@supabase/postgrest-js'\n   *\n   * const builder = new PostgrestQueryBuilder(\n   *   new URL('https://xyzcompany.supabase.co/rest/v1/users'),\n   *   { headers: new Headers({ apikey: 'your-publishable-key' }) }\n   * )\n   * ```\n   */\n  constructor(builder: {\n    method: 'GET' | 'HEAD' | 'POST' | 'PATCH' | 'DELETE'\n    url: URL\n    headers: HeadersInit\n    schema?: string\n    body?: unknown\n    shouldThrowOnError?: boolean\n    signal?: AbortSignal\n    fetch?: Fetch\n    isMaybeSingle?: boolean\n    shouldStripNulls?: boolean\n    urlLengthLimit?: number\n    // Retry option\n    retry?: boolean\n  }) {\n    this.method = builder.method\n    this.url = builder.url\n    this.headers = new Headers(builder.headers)\n    this.schema = builder.schema\n    this.body = builder.body\n    this.shouldThrowOnError = builder.shouldThrowOnError ?? false\n    this.signal = builder.signal\n    this.isMaybeSingle = builder.isMaybeSingle ?? false\n    this.shouldStripNulls = builder.shouldStripNulls ?? false\n    this.urlLengthLimit = builder.urlLengthLimit ?? 8000\n    this.retryEnabled = builder.retry ?? true\n\n    if (builder.fetch) {\n      this.fetch = builder.fetch\n    } else {\n      this.fetch = fetch\n    }\n  }\n\n  /**\n   * If there's an error with the query, throwOnError will reject the promise by\n   * throwing the error instead of returning it as part of a successful response.\n   *\n   * {@link https://github.com/supabase/supabase-js/issues/92}\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   */\n  throwOnError(): PostgrestBuilder<ClientOptions, Result, true> {\n    this.shouldThrowOnError = true\n    return this as PostgrestBuilder<ClientOptions, Result, true>\n  }\n\n  /**\n   * Strip null values from the response data. Properties with `null` values\n   * will be omitted from the returned JSON objects.\n   *\n   * Requires PostgREST 11.2.0+.\n   *\n   * {@link https://docs.postgrest.org/en/stable/references/api/resource_representation.html#stripped-nulls}\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .stripNulls()\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text, bio text);\n   *\n   * insert into\n   *   characters (id, name, bio)\n   * values\n   *   (1, 'Luke', null),\n   *   (2, 'Leia', 'Princess of Alderaan');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     },\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"Leia\",\n   *       \"bio\": \"Princess of Alderaan\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  stripNulls(): this {\n    if (this.headers.get('Accept') === 'text/csv') {\n      throw new Error('stripNulls() cannot be used with csv()')\n    }\n    this.shouldStripNulls = true\n    return this\n  }\n\n  /**\n   * Set an HTTP header on this single PostgREST request, overriding any header\n   * with the same name set on the client.\n   *\n   * This is an advanced escape hatch for one-off needs (passing a custom\n   * `Authorization` for a single query, attaching a tracing header, etc.).\n   * Most callers do not need it: configure client-wide headers via the\n   * `headers` option when constructing the client, and authentication via\n   * Supabase Auth.\n   *\n   * @param name - HTTP header name\n   * @param value - HTTP header value\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   */\n  setHeader(name: string, value: string): this {\n    this.headers = new Headers(this.headers)\n    this.headers.set(name, value)\n    return this\n  }\n\n  /**\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * Configure retry behavior for this request.\n   *\n   * By default, retries are enabled for idempotent requests (GET, HEAD, OPTIONS)\n   * that fail with network errors or specific HTTP status codes (503, 520).\n   * Retries use exponential backoff (1s, 2s, 4s) with a maximum of 3 attempts.\n   *\n   * @param enabled - Whether to enable retries for this request\n   *\n   * @example\n   * ```ts\n   * // Disable retries for a specific query\n   * const { data, error } = await supabase\n   *   .from('users')\n   *   .select()\n   *   .retry(false)\n   * ```\n   */\n  retry(enabled: boolean): this {\n    this.retryEnabled = enabled\n    return this\n  }\n\n  then<\n    TResult1 = ThrowOnError extends true\n      ? PostgrestResponseSuccess<Result>\n      : PostgrestSingleResponse<Result>,\n    TResult2 = never,\n  >(\n    onfulfilled?:\n      | ((\n          value: ThrowOnError extends true\n            ? PostgrestResponseSuccess<Result>\n            : PostgrestSingleResponse<Result>\n        ) => TResult1 | PromiseLike<TResult1>)\n      | undefined\n      | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null\n  ): PromiseLike<TResult1 | TResult2> {\n    // https://postgrest.org/en/stable/api.html#switching-schemas\n    if (this.schema === undefined) {\n      // skip\n    } else if (['GET', 'HEAD'].includes(this.method)) {\n      this.headers.set('Accept-Profile', this.schema)\n    } else {\n      this.headers.set('Content-Profile', this.schema)\n    }\n    if (this.method !== 'GET' && this.method !== 'HEAD') {\n      this.headers.set('Content-Type', 'application/json')\n    }\n\n    // https://docs.postgrest.org/en/stable/references/api/resource_representation.html#stripped-nulls\n    if (this.shouldStripNulls) {\n      const currentAccept = this.headers.get('Accept')\n      if (currentAccept === 'application/vnd.pgrst.object+json') {\n        this.headers.set('Accept', 'application/vnd.pgrst.object+json;nulls=stripped')\n      } else if (!currentAccept || currentAccept === 'application/json') {\n        this.headers.set('Accept', 'application/vnd.pgrst.array+json;nulls=stripped')\n      }\n    }\n\n    // NOTE: Invoke w/o `this` to avoid illegal invocation error.\n    // https://github.com/supabase/postgrest-js/pull/247\n    const _fetch = this.fetch\n\n    // Execute fetch with retry logic\n    const executeWithRetry = async (): Promise<{\n      error: any\n      data: any\n      count: number | null\n      status: number\n      statusText: string\n    }> => {\n      let attemptCount = 0\n\n      while (true) {\n        // Serialize headers as a plain object rather than a Headers instance.\n        // React Native's XHR-based fetch silently drops headers (notably Content-Type)\n        // when given a Headers instance, causing PGRST202 on parameter-less RPC calls.\n        // See supabase/supabase-js#1562 and facebook/react-native#33933.\n        // All sibling packages (auth-js, storage-js, functions-js) already pass plain objects.\n        const headers: Record<string, string> = {}\n        this.headers.forEach((value, key) => {\n          headers[key] = value\n        })\n        if (attemptCount > 0) {\n          headers['X-Retry-Count'] = String(attemptCount)\n        }\n\n        // Only wrap the fetch call itself — processResponse errors must never trigger retries\n        let res: Response\n        try {\n          res = await _fetch(this.url.toString(), {\n            method: this.method,\n            headers,\n            body: JSON.stringify(this.body, (_, value) =>\n              typeof value === 'bigint' ? value.toString() : value\n            ),\n            signal: this.signal,\n          })\n          // JS allows throwing any value, and serverless or realm-crossing fetch\n          // implementations can reject with non-Error objects. `instanceof Error`\n          // is too narrow here; narrow at the use site with optional chaining.\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        } catch (fetchError: any) {\n          // Never retry aborted requests\n          if (fetchError?.name === 'AbortError' || fetchError?.code === 'ABORT_ERR') {\n            throw fetchError\n          }\n\n          // Don't retry network errors for non-idempotent methods\n          if (!RETRYABLE_METHODS.includes(this.method as (typeof RETRYABLE_METHODS)[number])) {\n            throw fetchError\n          }\n\n          // Check if we should retry network errors\n          if (this.retryEnabled && attemptCount < DEFAULT_MAX_RETRIES) {\n            const delay = getRetryDelay(attemptCount)\n            attemptCount++\n            await sleep(delay, this.signal)\n            continue\n          }\n\n          // Exhausted retries or retries disabled, throw the last error\n          throw fetchError\n        }\n\n        // Check if we should retry this HTTP response\n        if (shouldRetry(this.method, res.status, attemptCount, this.retryEnabled)) {\n          const retryAfterHeader = res.headers?.get('Retry-After') ?? null\n          const delay =\n            retryAfterHeader !== null\n              ? Math.max(0, parseInt(retryAfterHeader, 10) || 0) * 1000\n              : getRetryDelay(attemptCount)\n          await res.text()\n          attemptCount++\n          await sleep(delay, this.signal)\n          continue\n        }\n\n        return await this.processResponse(res)\n      }\n    }\n\n    let res = executeWithRetry()\n\n    if (!this.shouldThrowOnError) {\n      res = res.catch((fetchError) => {\n        // Build detailed error information including cause if available\n        // Note: We don't populate code/hint for client-side network errors since those\n        // fields are meant for upstream service errors (PostgREST/PostgreSQL)\n        let errorDetails = ''\n        let hint = ''\n        let code = ''\n\n        // Add cause information if available (e.g., DNS errors, network failures)\n        const cause = fetchError?.cause\n        if (cause) {\n          const causeMessage = cause?.message ?? ''\n          const causeCode = cause?.code ?? ''\n\n          errorDetails = `${fetchError?.name ?? 'FetchError'}: ${fetchError?.message}`\n          errorDetails += `\\n\\nCaused by: ${cause?.name ?? 'Error'}: ${causeMessage}`\n          if (causeCode) {\n            errorDetails += ` (${causeCode})`\n          }\n          if (cause?.stack) {\n            errorDetails += `\\n${cause.stack}`\n          }\n        } else {\n          // No cause available, just include the error stack\n          errorDetails = fetchError?.stack ?? ''\n        }\n\n        // Get URL length for potential hints\n        const urlLength = this.url.toString().length\n\n        // Handle AbortError specially with helpful hints\n        if (fetchError?.name === 'AbortError' || fetchError?.code === 'ABORT_ERR') {\n          code = ''\n          hint = 'Request was aborted (timeout or manual cancellation)'\n\n          if (urlLength > this.urlLengthLimit) {\n            hint += `. Note: Your request URL is ${urlLength} characters, which may exceed server limits. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [many IDs])), consider using an RPC function to pass values server-side.`\n          }\n        }\n        // Handle HeadersOverflowError from undici (Node.js fetch implementation)\n        else if (\n          cause?.name === 'HeadersOverflowError' ||\n          cause?.code === 'UND_ERR_HEADERS_OVERFLOW'\n        ) {\n          code = ''\n          hint = 'HTTP headers exceeded server limits (typically 16KB)'\n\n          if (urlLength > this.urlLengthLimit) {\n            hint += `. Your request URL is ${urlLength} characters. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [200+ IDs])), consider using an RPC function instead.`\n          }\n        }\n\n        return {\n          success: false as const,\n          error: {\n            message: `${fetchError?.name ?? 'FetchError'}: ${fetchError?.message}`,\n            details: errorDetails,\n            hint: hint,\n            code: code,\n          },\n          data: null,\n          count: null,\n          status: 0,\n          statusText: '',\n        }\n      })\n    }\n\n    return (\n      res as Promise<\n        ThrowOnError extends true\n          ? PostgrestResponseSuccess<Result>\n          : PostgrestSingleResponse<Result>\n      >\n    ).then(onfulfilled, onrejected)\n  }\n\n  /**\n   * Process a fetch response and return the standardized postgrest response.\n   */\n  private async processResponse(res: Response): Promise<{\n    success: boolean\n    error: any\n    data: any\n    count: number | null\n    status: number\n    statusText: string\n  }> {\n    let error = null\n    let data = null\n    let count: number | null = null\n    let status = res.status\n    let statusText = res.statusText\n\n    if (res.ok) {\n      if (this.method !== 'HEAD') {\n        const body = await res.text()\n        if (body === '') {\n          // Prefer: return=minimal\n        } else if (this.headers.get('Accept') === 'text/csv') {\n          data = body\n        } else if (\n          this.headers.get('Accept') &&\n          this.headers.get('Accept')?.includes('application/vnd.pgrst.plan+text')\n        ) {\n          data = body\n        } else {\n          try {\n            data = JSON.parse(body)\n          } catch {\n            // A 2xx status doesn't guarantee a JSON body; mirror the non-2xx fallback below.\n            error = { message: body }\n            data = null\n\n            if (this.shouldThrowOnError) {\n              throw new PostgrestError({ message: body, details: '', hint: '', code: '' })\n            }\n          }\n        }\n      }\n\n      const countHeader = this.headers.get('Prefer')?.match(/count=(exact|planned|estimated)/)\n      const contentRange = res.headers.get('content-range')?.split('/')\n      if (countHeader && contentRange && contentRange.length > 1) {\n        count = parseInt(contentRange[1])\n      }\n\n      // Fix for https://github.com/supabase/postgrest-js/issues/361 — applies to all methods.\n      if (this.isMaybeSingle && Array.isArray(data)) {\n        if (data.length > 1) {\n          error = {\n            // https://github.com/PostgREST/postgrest/blob/a867d79c42419af16c18c3fb019eba8df992626f/src/PostgREST/Error.hs#L553\n            code: 'PGRST116',\n            details: `Results contain ${data.length} rows, application/vnd.pgrst.object+json requires 1 row`,\n            hint: null,\n            message: 'JSON object requested, multiple (or no) rows returned',\n          }\n          data = null\n          count = null\n          status = 406\n          statusText = 'Not Acceptable'\n\n          if (this.shouldThrowOnError) {\n            // `hint` is null in the returned error to match PostgREST, but\n            // PostgrestError types it as a string, like the other throws here.\n            throw new PostgrestError({ ...error, hint: error.hint ?? '' })\n          }\n        } else if (data.length === 1) {\n          data = data[0]\n        } else {\n          data = null\n        }\n      }\n    } else {\n      const body = await res.text()\n\n      try {\n        error = JSON.parse(body)\n\n        // Workaround for https://github.com/supabase/postgrest-js/issues/295\n        if (Array.isArray(error) && res.status === 404) {\n          data = []\n          error = null\n          status = 200\n          statusText = 'OK'\n        }\n      } catch {\n        // Workaround for https://github.com/supabase/postgrest-js/issues/295\n        if (res.status === 404 && body === '') {\n          status = 204\n          statusText = 'No Content'\n        } else {\n          error = {\n            message: body,\n          }\n        }\n      }\n\n      if (error && this.shouldThrowOnError) {\n        throw new PostgrestError(error)\n      }\n    }\n\n    return {\n      success: error === null,\n      error,\n      data,\n      count,\n      status,\n      statusText,\n    }\n  }\n\n  /**\n   * Override the type of the returned `data`.\n   *\n   * @typeParam NewResult - The new result type to override with\n   * @deprecated Use overrideTypes<yourType, { merge: false }>() method at the end of your call chain instead\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   */\n  returns<NewResult>(): PostgrestBuilder<\n    ClientOptions,\n    CheckMatchingArrayTypes<Result, NewResult>,\n    ThrowOnError\n  > {\n    /* istanbul ignore next */\n    return this as unknown as PostgrestBuilder<\n      ClientOptions,\n      CheckMatchingArrayTypes<Result, NewResult>,\n      ThrowOnError\n    >\n  }\n\n  /**\n   * Override the type of the returned `data` field in the response.\n   *\n   * @typeParam NewResult - The new type to cast the response data to\n   * @typeParam Options - Optional type configuration (defaults to { merge: true })\n   * @typeParam Options.merge - When true, merges the new type with existing return type. When false, replaces the existing types entirely (defaults to true)\n   * @example\n   * ```typescript\n   * // Merge with existing types (default behavior)\n   * const query = supabase\n   *   .from('users')\n   *   .select()\n   *   .overrideTypes<{ custom_field: string }>()\n   *\n   * // Replace existing types completely\n   * const replaceQuery = supabase\n   *   .from('users')\n   *   .select()\n   *   .overrideTypes<{ id: number; name: string }, { merge: false }>()\n   * ```\n   * @returns A PostgrestBuilder instance with the new type\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example Complete Override type of successful response\n   * ```ts\n   * const { data } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .overrideTypes<Array<MyType>, { merge: false }>()\n   * ```\n   *\n   * @exampleResponse Complete Override type of successful response\n   * ```ts\n   * let x: typeof data // MyType[]\n   * ```\n   *\n   * @example Complete Override type of object response\n   * ```ts\n   * const { data } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .maybeSingle()\n   *   .overrideTypes<MyType, { merge: false }>()\n   * ```\n   *\n   * @exampleResponse Complete Override type of object response\n   * ```ts\n   * let x: typeof data // MyType | null\n   * ```\n   *\n   * @example Partial Override type of successful response\n   * ```ts\n   * const { data } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .overrideTypes<Array<{ status: \"A\" | \"B\" }>>()\n   * ```\n   *\n   * @exampleResponse Partial Override type of successful response\n   * ```ts\n   * let x: typeof data // Array<CountryRowProperties & { status: \"A\" | \"B\" }>\n   * ```\n   *\n   * @example Partial Override type of object response\n   * ```ts\n   * const { data } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .maybeSingle()\n   *   .overrideTypes<{ status: \"A\" | \"B\" }>()\n   * ```\n   *\n   * @exampleResponse Partial Override type of object response\n   * ```ts\n   * let x: typeof data // CountryRowProperties & { status: \"A\" | \"B\" } | null\n   * ```\n   *\n   * @example Merge vs replace existing types\n   * ```typescript\n   * // Merge with existing types (default behavior)\n   * const query = supabase\n   *   .from('users')\n   *   .select()\n   *   .overrideTypes<{ custom_field: string }>()\n   *\n   * // Replace existing types completely\n   * const replaceQuery = supabase\n   *   .from('users')\n   *   .select()\n   *   .overrideTypes<{ id: number; name: string }, { merge: false }>()\n   * ```\n   */\n  overrideTypes<\n    NewResult,\n    Options extends { merge?: boolean } = { merge: true },\n  >(): PostgrestBuilder<\n    ClientOptions,\n    IsValidResultOverride<Result, NewResult, false, false> extends true\n      ? // Preserve the optionality of the result if the overriden type is an object (case of chaining with `maybeSingle`)\n        ContainsNull<Result> extends true\n        ? MergePartialResult<NewResult, NonNullable<Result>, Options> | null\n        : MergePartialResult<NewResult, Result, Options>\n      : CheckMatchingArrayTypes<Result, NewResult>,\n    ThrowOnError\n  > {\n    return this as unknown as PostgrestBuilder<\n      ClientOptions,\n      IsValidResultOverride<Result, NewResult, false, false> extends true\n        ? // Preserve the optionality of the result if the overriden type is an object (case of chaining with `maybeSingle`)\n          ContainsNull<Result> extends true\n          ? MergePartialResult<NewResult, NonNullable<Result>, Options> | null\n          : MergePartialResult<NewResult, Result, Options>\n        : CheckMatchingArrayTypes<Result, NewResult>,\n      ThrowOnError\n    >\n  }\n}\n","import PostgrestBuilder from './PostgrestBuilder'\nimport PostgrestFilterBuilder, { InvalidMethodError } from './PostgrestFilterBuilder'\nimport { GetResult } from './select-query-parser/result'\nimport { CheckMatchingArrayTypes } from './types/types'\nimport { ClientServerOptions, GenericSchema } from './types/common/common'\nimport type { MaxAffectedEnabled } from './types/feature-flags'\n\nexport default class PostgrestTransformBuilder<\n  ClientOptions extends ClientServerOptions,\n  Schema extends GenericSchema,\n  Row extends Record<string, unknown>,\n  Result,\n  RelationName = unknown,\n  Relationships = unknown,\n  Method = unknown,\n  ThrowOnError extends boolean = false,\n> extends PostgrestBuilder<ClientOptions, Result, ThrowOnError> {\n  throwOnError(): PostgrestTransformBuilder<\n    ClientOptions,\n    Schema,\n    Row,\n    Result,\n    RelationName,\n    Relationships,\n    Method,\n    true\n  > {\n    return super.throwOnError() as PostgrestTransformBuilder<\n      ClientOptions,\n      Schema,\n      Row,\n      Result,\n      RelationName,\n      Relationships,\n      Method,\n      true\n    >\n  }\n\n  /**\n   * Perform a SELECT on the query result.\n   *\n   * By default, `.insert()`, `.update()`, `.upsert()`, and `.delete()` do not\n   * return modified rows. By calling this method, modified rows are returned in\n   * `data`.\n   *\n   * @param columns - The columns to retrieve, separated by commas\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `upsert()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .upsert({ id: 1, name: 'Han Solo' })\n   *   .select()\n   * ```\n   *\n   * @exampleSql With `upsert()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Han');\n   * ```\n   *\n   * @exampleResponse With `upsert()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Han Solo\"\n   *     }\n   *   ],\n   *   \"status\": 201,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   */\n  select<\n    Query extends string = '*',\n    NewResultOne = GetResult<Schema, Row, RelationName, Relationships, Query, ClientOptions>,\n  >(\n    columns?: Query\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Row,\n    Method extends 'RPC'\n      ? Result extends unknown[]\n        ? NewResultOne[]\n        : NewResultOne\n      : NewResultOne[],\n    RelationName,\n    Relationships,\n    Method,\n    ThrowOnError\n  > {\n    // Remove whitespaces except when quoted\n    let quoted = false\n    const cleanedColumns = (columns ?? '*')\n      .split('')\n      .map((c) => {\n        if (/\\s/.test(c) && !quoted) {\n          return ''\n        }\n        if (c === '\"') {\n          quoted = !quoted\n        }\n        return c\n      })\n      .join('')\n    this.url.searchParams.set('select', cleanedColumns)\n    this.headers.append('Prefer', 'return=representation')\n    return this as unknown as PostgrestFilterBuilder<\n      ClientOptions,\n      Schema,\n      Row,\n      Method extends 'RPC'\n        ? Result extends unknown[]\n          ? NewResultOne[]\n          : NewResultOne\n        : NewResultOne[],\n      RelationName,\n      Relationships,\n      Method,\n      ThrowOnError\n    >\n  }\n\n  /**\n   * Order the query result by `column`.\n   *\n   * You can call this method multiple times to order by multiple columns.\n   *\n   * You can order referenced tables, but it only affects the ordering of the\n   * parent table if you use `!inner` in the query.\n   *\n   * @param column - The column to order by\n   * @param options - Named parameters\n   * @param options.ascending - If `true`, the result will be in ascending order\n   * @param options.nullsFirst - If `true`, `null`s appear first. If `false`,\n   * `null`s appear last.\n   * @param options.referencedTable - Set this to order a referenced table by\n   * its columns\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   */\n  order<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    options?: { ascending?: boolean; nullsFirst?: boolean; referencedTable?: undefined }\n  ): this\n  order(\n    column: string,\n    options?: { ascending?: boolean; nullsFirst?: boolean; referencedTable?: string }\n  ): this\n  /**\n   * @deprecated Use `options.referencedTable` instead of `options.foreignTable`\n   */\n  order<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    options?: { ascending?: boolean; nullsFirst?: boolean; foreignTable?: undefined }\n  ): this\n  /**\n   * @deprecated Use `options.referencedTable` instead of `options.foreignTable`\n   */\n  order(\n    column: string,\n    options?: { ascending?: boolean; nullsFirst?: boolean; foreignTable?: string }\n  ): this\n  /**\n   * Order the query result by `column`.\n   *\n   * You can call this method multiple times to order by multiple columns.\n   *\n   * You can order referenced tables, but it only affects the ordering of the\n   * parent table if you use `!inner` in the query.\n   *\n   * @param column - The column to order by\n   * @param options - Named parameters\n   * @param options.ascending - If `true`, the result will be in ascending order\n   * @param options.nullsFirst - If `true`, `null`s appear first. If `false`,\n   * `null`s appear last.\n   * @param options.referencedTable - Set this to order a referenced table by\n   * its columns\n   * @param options.foreignTable - Deprecated, use `options.referencedTable`\n   * instead\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('id, name')\n   *   .order('id', { ascending: false })\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 3,\n   *       \"name\": \"Han\"\n   *     },\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"Leia\"\n   *     },\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription On a referenced table\n   * Ordering with `referencedTable` doesn't affect the ordering of the\n   * parent table.\n   *\n   * @example On a referenced table\n   * ```ts\n   *   const { data, error } = await supabase\n   *     .from('orchestral_sections')\n   *     .select(`\n   *       name,\n   *       instruments (\n   *         name\n   *       )\n   *     `)\n   *     .order('name', { referencedTable: 'instruments', ascending: false })\n   *\n   * ```\n   *\n   * @exampleSql On a referenced table\n   * ```sql\n   * create table\n   *   orchestral_sections (id int8 primary key, name text);\n   * create table\n   *   instruments (\n   *     id int8 primary key,\n   *     section_id int8 not null references orchestral_sections,\n   *     name text\n   *   );\n   *\n   * insert into\n   *   orchestral_sections (id, name)\n   * values\n   *   (1, 'strings'),\n   *   (2, 'woodwinds');\n   * insert into\n   *   instruments (id, section_id, name)\n   * values\n   *   (1, 1, 'harp'),\n   *   (2, 1, 'violin');\n   * ```\n   *\n   * @exampleResponse On a referenced table\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"strings\",\n   *       \"instruments\": [\n   *         {\n   *           \"name\": \"violin\"\n   *         },\n   *         {\n   *           \"name\": \"harp\"\n   *         }\n   *       ]\n   *     },\n   *     {\n   *       \"name\": \"woodwinds\",\n   *       \"instruments\": []\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription Order parent table by a referenced table\n   * Ordering with `referenced_table(col)` affects the ordering of the\n   * parent table.\n   *\n   * @example Order parent table by a referenced table\n   * ```ts\n   *   const { data, error } = await supabase\n   *     .from('instruments')\n   *     .select(`\n   *       name,\n   *       section:orchestral_sections (\n   *         name\n   *       )\n   *     `)\n   *     .order('section(name)', { ascending: true })\n   *\n   * ```\n   *\n   * @exampleSql Order parent table by a referenced table\n   * ```sql\n   * create table\n   *   orchestral_sections (id int8 primary key, name text);\n   * create table\n   *   instruments (\n   *     id int8 primary key,\n   *     section_id int8 not null references orchestral_sections,\n   *     name text\n   *   );\n   *\n   * insert into\n   *   orchestral_sections (id, name)\n   * values\n   *   (1, 'strings'),\n   *   (2, 'woodwinds');\n   * insert into\n   *   instruments (id, section_id, name)\n   * values\n   *   (1, 2, 'flute'),\n   *   (2, 1, 'violin');\n   * ```\n   *\n   * @exampleResponse Order parent table by a referenced table\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"violin\",\n   *       \"orchestral_sections\": {\"name\": \"strings\"}\n   *     },\n   *     {\n   *       \"name\": \"flute\",\n   *       \"orchestral_sections\": {\"name\": \"woodwinds\"}\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  order(\n    column: string,\n    {\n      ascending = true,\n      nullsFirst,\n      foreignTable,\n      referencedTable = foreignTable,\n    }: {\n      ascending?: boolean\n      nullsFirst?: boolean\n      foreignTable?: string\n      referencedTable?: string\n    } = {}\n  ): this {\n    const key = referencedTable ? `${referencedTable}.order` : 'order'\n    const existingOrder = this.url.searchParams.get(key)\n\n    this.url.searchParams.set(\n      key,\n      `${existingOrder ? `${existingOrder},` : ''}${column}.${ascending ? 'asc' : 'desc'}${\n        nullsFirst === undefined ? '' : nullsFirst ? '.nullsfirst' : '.nullslast'\n      }`\n    )\n    return this\n  }\n\n  /**\n   * Limit the query result by `rows`.\n   *\n   * @param rows - The maximum number of rows to return\n   * @param options - Named parameters\n   * @param options.referencedTable - Set this to limit rows of referenced\n   * tables instead of the parent table\n   * @param options.foreignTable - Deprecated, use `options.referencedTable`\n   * instead\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('name')\n   *   .limit(1)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Luke\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example On a referenced table\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('orchestral_sections')\n   *   .select(`\n   *     name,\n   *     instruments (\n   *       name\n   *     )\n   *   `)\n   *   .limit(1, { referencedTable: 'instruments' })\n   * ```\n   *\n   * @exampleSql On a referenced table\n   * ```sql\n   * create table\n   *   orchestral_sections (id int8 primary key, name text);\n   * create table\n   *   instruments (\n   *     id int8 primary key,\n   *     section_id int8 not null references orchestral_sections,\n   *     name text\n   *   );\n   *\n   * insert into\n   *   orchestral_sections (id, name)\n   * values\n   *   (1, 'strings');\n   * insert into\n   *   instruments (id, section_id, name)\n   * values\n   *   (1, 1, 'harp'),\n   *   (2, 1, 'violin');\n   * ```\n   *\n   * @exampleResponse On a referenced table\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"strings\",\n   *       \"instruments\": [\n   *         {\n   *           \"name\": \"violin\"\n   *         }\n   *       ]\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  limit(\n    rows: number,\n    {\n      foreignTable,\n      referencedTable = foreignTable,\n    }: { foreignTable?: string; referencedTable?: string } = {}\n  ): this {\n    const key = typeof referencedTable === 'undefined' ? 'limit' : `${referencedTable}.limit`\n    this.url.searchParams.set(key, `${rows}`)\n    return this\n  }\n\n  /**\n   * Limit the query result by starting at an offset `from` and ending at the offset `to`.\n   * Only records within this range are returned.\n   * This respects the query order and if there is no order clause the range could behave unexpectedly.\n   * The `from` and `to` values are 0-based and inclusive: `range(1, 3)` will include the second, third\n   * and fourth rows of the query.\n   *\n   * @param from - The starting index from which to limit the result\n   * @param to - The last index to which to limit the result\n   * @param options - Named parameters\n   * @param options.referencedTable - Set this to limit rows of referenced\n   * tables instead of the parent table\n   * @param options.foreignTable - Deprecated, use `options.referencedTable`\n   * instead\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('name')\n   *   .range(0, 1)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Luke\"\n   *     },\n   *     {\n   *       \"name\": \"Leia\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  range(\n    from: number,\n    to: number,\n    {\n      foreignTable,\n      referencedTable = foreignTable,\n    }: { foreignTable?: string; referencedTable?: string } = {}\n  ): this {\n    const keyOffset =\n      typeof referencedTable === 'undefined' ? 'offset' : `${referencedTable}.offset`\n    const keyLimit = typeof referencedTable === 'undefined' ? 'limit' : `${referencedTable}.limit`\n    this.url.searchParams.set(keyOffset, `${from}`)\n    // Range is inclusive, so add 1\n    this.url.searchParams.set(keyLimit, `${to - from + 1}`)\n    return this\n  }\n\n  /**\n   * Set the AbortSignal for the fetch request.\n   *\n   * @param signal - The AbortSignal to use for the fetch request\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @remarks\n   * You can use this to set a timeout for the request.\n   *\n   * @exampleDescription Aborting requests in-flight\n   * You can use an [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) to abort requests.\n   * Note that `status` and `statusText` don't mean anything for aborted requests as the request wasn't fulfilled.\n   *\n   * @example Aborting requests in-flight\n   * ```ts\n   * const ac = new AbortController()\n   *\n   * const { data, error } = await supabase\n   *   .from('very_big_table')\n   *   .select()\n   *   .abortSignal(ac.signal)\n   *\n   * // Abort the request after 100 ms\n   * setTimeout(() => ac.abort(), 100)\n   * ```\n   *\n   * @exampleResponse Aborting requests in-flight\n   * ```json\n   *   {\n   *     \"error\": {\n   *       \"message\": \"AbortError: The user aborted a request.\",\n   *       \"details\": \"\",\n   *       \"hint\": \"The request was aborted locally via the provided AbortSignal.\",\n   *       \"code\": \"\"\n   *     },\n   *     \"status\": 0,\n   *     \"statusText\": \"\"\n   *   }\n   *\n   * ```\n   *\n   * @example Set a timeout\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('very_big_table')\n   *   .select()\n   *   .abortSignal(AbortSignal.timeout(1000 /* ms *\\/))\n   * ```\n   *\n   * @exampleResponse Set a timeout\n   * ```json\n   *   {\n   *     \"error\": {\n   *       \"message\": \"FetchError: The user aborted a request.\",\n   *       \"details\": \"\",\n   *       \"hint\": \"\",\n   *       \"code\": \"\"\n   *     },\n   *     \"status\": 0,\n   *     \"statusText\": \"\"\n   *   }\n   *\n   * ```\n   */\n  abortSignal(signal: AbortSignal): this {\n    this.signal = signal\n    return this\n  }\n\n  /**\n   * Return `data` as a single object instead of an array of objects.\n   *\n   * Query result must be one row (e.g. using `.limit(1)`), otherwise this\n   * returns an error.\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('name')\n   *   .limit(1)\n   *   .single()\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"name\": \"Luke\"\n   *   },\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  single<ResultOne = Result extends (infer ResultOne)[] ? ResultOne : never>(): PostgrestBuilder<\n    ClientOptions,\n    ResultOne,\n    ThrowOnError\n  > {\n    this.headers.set('Accept', 'application/vnd.pgrst.object+json')\n    return this as unknown as PostgrestBuilder<ClientOptions, ResultOne, ThrowOnError>\n  }\n\n  /**\n   * Return `data` as a single object instead of an array of objects.\n   *\n   * Query result must be zero or one row (e.g. using `.limit(1)`), otherwise\n   * this returns an error.\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .eq('name', 'Katniss')\n   *   .maybeSingle()\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  maybeSingle<\n    ResultOne = Result extends (infer ResultOne)[] ? ResultOne : never,\n  >(): PostgrestBuilder<ClientOptions, ResultOne | null, ThrowOnError> {\n    // No Accept header override — we fetch as a list and enforce cardinality client-side.\n    // Fixes https://github.com/supabase/postgrest-js/issues/361 for all request methods.\n    this.isMaybeSingle = true\n    return this as unknown as PostgrestBuilder<ClientOptions, ResultOne | null, ThrowOnError>\n  }\n\n  /**\n   * Return `data` as a string in CSV format.\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @exampleDescription Return data as CSV\n   * By default, the data is returned in JSON format, but can also be returned as Comma Separated Values.\n   *\n   * @example Return data as CSV\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .csv()\n   * ```\n   *\n   * @exampleSql Return data as CSV\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse Return data as CSV\n   * ```json\n   * {\n   *   \"data\": \"id,name\\n1,Luke\\n2,Leia\\n3,Han\",\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  csv(): PostgrestBuilder<ClientOptions, string, ThrowOnError> {\n    this.headers.set('Accept', 'text/csv')\n    return this as unknown as PostgrestBuilder<ClientOptions, string, ThrowOnError>\n  }\n\n  /**\n   * Return `data` as an object in [GeoJSON](https://geojson.org) format.\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   */\n  geojson(): PostgrestBuilder<ClientOptions, Record<string, unknown>, ThrowOnError> {\n    this.headers.set('Accept', 'application/geo+json')\n    return this as unknown as PostgrestBuilder<ClientOptions, Record<string, unknown>, ThrowOnError>\n  }\n\n  /**\n   * Return `data` as the EXPLAIN plan for the query.\n   *\n   * You need to enable the\n   * [db_plan_enabled](https://supabase.com/docs/guides/database/debugging-performance#enabling-explain)\n   * setting before using this method.\n   *\n   * @param options - Named parameters\n   *\n   * @param options.analyze - If `true`, the query will be executed and the\n   * actual run time will be returned\n   *\n   * @param options.verbose - If `true`, the query identifier will be returned\n   * and `data` will include the output columns of the query\n   *\n   * @param options.settings - If `true`, include information on configuration\n   * parameters that affect query planning\n   *\n   * @param options.buffers - If `true`, include information on buffer usage\n   *\n   * @param options.wal - If `true`, include information on WAL record generation\n   *\n   * @param options.format - The format of the output, can be `\"text\"` (default)\n   * or `\"json\"`\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @exampleDescription Get the execution plan\n   * By default, the data is returned in TEXT format, but can also be returned as JSON by using the `format` parameter.\n   *\n   * @example Get the execution plan\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .explain()\n   * ```\n   *\n   * @exampleSql Get the execution plan\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse Get the execution plan\n   * ```js\n   * Aggregate  (cost=33.34..33.36 rows=1 width=112)\n   *   ->  Limit  (cost=0.00..18.33 rows=1000 width=40)\n   *         ->  Seq Scan on characters  (cost=0.00..22.00 rows=1200 width=40)\n   * ```\n   *\n   * @exampleDescription Get the execution plan with analyze and verbose\n   * By default, the data is returned in TEXT format, but can also be returned as JSON by using the `format` parameter.\n   *\n   * @example Get the execution plan with analyze and verbose\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .explain({analyze:true,verbose:true})\n   * ```\n   *\n   * @exampleSql Get the execution plan with analyze and verbose\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse Get the execution plan with analyze and verbose\n   * ```js\n   * Aggregate  (cost=33.34..33.36 rows=1 width=112) (actual time=0.041..0.041 rows=1 loops=1)\n   *   Output: NULL::bigint, count(ROW(characters.id, characters.name)), COALESCE(json_agg(ROW(characters.id, characters.name)), '[]'::json), NULLIF(current_setting('response.headers'::text, true), ''::text), NULLIF(current_setting('response.status'::text, true), ''::text)\n   *   ->  Limit  (cost=0.00..18.33 rows=1000 width=40) (actual time=0.005..0.006 rows=3 loops=1)\n   *         Output: characters.id, characters.name\n   *         ->  Seq Scan on public.characters  (cost=0.00..22.00 rows=1200 width=40) (actual time=0.004..0.005 rows=3 loops=1)\n   *               Output: characters.id, characters.name\n   * Query Identifier: -4730654291623321173\n   * Planning Time: 0.407 ms\n   * Execution Time: 0.119 ms\n   * ```\n   */\n  explain({\n    analyze = false,\n    verbose = false,\n    settings = false,\n    buffers = false,\n    wal = false,\n    format = 'text',\n  }: {\n    analyze?: boolean\n    verbose?: boolean\n    settings?: boolean\n    buffers?: boolean\n    wal?: boolean\n    format?: 'json' | 'text'\n  } = {}) {\n    const options = [\n      analyze ? 'analyze' : null,\n      verbose ? 'verbose' : null,\n      settings ? 'settings' : null,\n      buffers ? 'buffers' : null,\n      wal ? 'wal' : null,\n    ]\n      .filter(Boolean)\n      .join('|')\n    // An Accept header can carry multiple media types but postgrest-js always sends one\n    const forMediatype = this.headers.get('Accept') ?? 'application/json'\n    this.headers.set(\n      'Accept',\n      `application/vnd.pgrst.plan+${format}; for=\"${forMediatype}\"; options=${options};`\n    )\n    if (format === 'json') {\n      return this as unknown as PostgrestBuilder<\n        ClientOptions,\n        Record<string, unknown>[],\n        ThrowOnError\n      >\n    } else {\n      return this as unknown as PostgrestBuilder<ClientOptions, string, ThrowOnError>\n    }\n  }\n\n  /**\n   * Dry-run this request: execute the query but discard the changes.\n   *\n   * Server-side, PostgREST runs the query inside a transaction and rolls it back\n   * instead of committing. The response still contains the data that *would* have\n   * been returned — `RETURNING` clauses execute and RLS, triggers, and constraints\n   * are all evaluated — but no row is actually inserted, updated, or deleted.\n   *\n   * This affects only the single request it is chained to. The JS caller has no\n   * handle on the transaction: supabase-js does not group multiple queries into\n   * one transaction. For multi-statement transactional logic, use a database\n   * function (`supabase.rpc(...)`).\n   *\n   * Sets the `Prefer: tx=rollback` header. See PostgREST's docs on transaction\n   * preferences for the underlying mechanism.\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @example Validate an insert without persisting\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('countries')\n   *   .insert({ name: 'France' })\n   *   .select()\n   *   .rollback()\n   * // `data` shows what would have been inserted; nothing is saved.\n   * ```\n   */\n  rollback(): this {\n    this.headers.append('Prefer', 'tx=rollback')\n    return this\n  }\n\n  /**\n   * Override the type of the returned `data`.\n   *\n   * @typeParam NewResult - The new result type to override with\n   * @deprecated Use overrideTypes<yourType, { merge: false }>() method at the end of your call chain instead\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   *\n   * @remarks\n   * - Deprecated: use overrideTypes method instead\n   *\n   * @example Override type of successful response\n   * ```ts\n   * const { data } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .returns<Array<MyType>>()\n   * ```\n   *\n   * @exampleResponse Override type of successful response\n   * ```js\n   * let x: typeof data // MyType[]\n   * ```\n   *\n   * @example Override type of object response\n   * ```ts\n   * const { data } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .maybeSingle()\n   *   .returns<MyType>()\n   * ```\n   *\n   * @exampleResponse Override type of object response\n   * ```js\n   * let x: typeof data // MyType | null\n   * ```\n   */\n  returns<NewResult>(): PostgrestTransformBuilder<\n    ClientOptions,\n    Schema,\n    Row,\n    CheckMatchingArrayTypes<Result, NewResult>,\n    RelationName,\n    Relationships,\n    Method,\n    ThrowOnError\n  > {\n    return this as unknown as PostgrestTransformBuilder<\n      ClientOptions,\n      Schema,\n      Row,\n      CheckMatchingArrayTypes<Result, NewResult>,\n      RelationName,\n      Relationships,\n      Method,\n      ThrowOnError\n    >\n  }\n\n  /**\n   * Set the maximum number of rows that can be affected by the query.\n   * Only available in PostgREST v13+ and only works with PATCH and DELETE methods.\n   *\n   * @param rows - The maximum number of rows that can be affected\n   *\n   * @category Database\n   * @subcategory Using modifiers\n   */\n  maxAffected(rows: number): MaxAffectedEnabled<ClientOptions['PostgrestVersion']> extends true\n    ? // TODO: update the RPC case to only work on RPC that returns SETOF rows\n      Method extends 'PATCH' | 'DELETE' | 'RPC'\n      ? this\n      : InvalidMethodError<'maxAffected method only available on update or delete'>\n    : InvalidMethodError<'maxAffected method only available on postgrest 13+'> {\n    this.headers.append('Prefer', 'handling=strict')\n    this.headers.append('Prefer', `max-affected=${rows}`)\n    return this as unknown as MaxAffectedEnabled<ClientOptions['PostgrestVersion']> extends true\n      ? Method extends 'PATCH' | 'DELETE' | 'RPC'\n        ? this\n        : InvalidMethodError<'maxAffected method only available on update or delete'>\n      : InvalidMethodError<'maxAffected method only available on postgrest 13+'>\n  }\n}\n","import PostgrestTransformBuilder from './PostgrestTransformBuilder'\nimport { JsonPathToAccessor, JsonPathToType } from './select-query-parser/utils'\nimport { ClientServerOptions, GenericSchema } from './types/common/common'\n\ntype FilterOperator =\n  | 'eq'\n  | 'neq'\n  | 'gt'\n  | 'gte'\n  | 'lt'\n  | 'lte'\n  | 'like'\n  | 'ilike'\n  | 'is'\n  | 'isdistinct'\n  | 'in'\n  | 'cs'\n  | 'cd'\n  | 'sl'\n  | 'sr'\n  | 'nxl'\n  | 'nxr'\n  | 'adj'\n  | 'ov'\n  | 'fts'\n  | 'plfts'\n  | 'phfts'\n  | 'wfts'\n  | 'match'\n  | 'imatch'\n\nexport type IsStringOperator<Path extends string> = Path extends `${string}->>${string}`\n  ? true\n  : false\n\nconst PostgrestReservedCharsRegexp = new RegExp('[,()]')\n\n// Match relationship filters with `table.column` syntax and resolve underlying\n// column value. If not matched, fallback to generic type.\n// TODO: Validate the relationship itself ala select-query-parser. Currently we\n// assume that all tables have valid relationships to each other, despite\n// nonexistent foreign keys.\ntype ResolveFilterValue<\n  Schema extends GenericSchema,\n  Row extends Record<string, unknown>,\n  ColumnName extends string,\n> = ColumnName extends `${infer RelationshipTable}.${infer Remainder}`\n  ? Remainder extends `${infer _}.${infer _}`\n    ? ResolveFilterValue<Schema, Row, Remainder>\n    : ResolveFilterRelationshipValue<Schema, RelationshipTable, Remainder>\n  : ColumnName extends keyof Row\n    ? Row[ColumnName]\n    : // If the column selection is a jsonpath like `data->value` or `data->>value` we attempt to match\n      // the expected type with the parsed custom json type\n      IsStringOperator<ColumnName> extends true\n      ? string\n      : JsonPathToType<Row, JsonPathToAccessor<ColumnName>> extends infer JsonPathValue\n        ? JsonPathValue extends never\n          ? never\n          : JsonPathValue\n        : never\n\ntype ResolveFilterRelationshipValue<\n  Schema extends GenericSchema,\n  RelationshipTable extends string,\n  RelationshipColumn extends string,\n> = Schema['Tables'] & Schema['Views'] extends infer TablesAndViews\n  ? RelationshipTable extends keyof TablesAndViews\n    ? 'Row' extends keyof TablesAndViews[RelationshipTable]\n      ? RelationshipColumn extends keyof TablesAndViews[RelationshipTable]['Row']\n        ? TablesAndViews[RelationshipTable]['Row'][RelationshipColumn]\n        : unknown\n      : unknown\n    : unknown\n  : never\n\nexport type InvalidMethodError<S extends string> = { Error: S }\n\ntype NonNullableColumn<T extends Record<string, unknown>, Col extends string> = Col extends keyof T\n  ? { [K in keyof T]: K extends Col ? NonNullable<T[K]> : T[K] }\n  : T\n\ntype NarrowResultColumn<T, Col extends string> = T extends (infer Item)[]\n  ? Item extends Record<string, unknown>\n    ? Col extends keyof Item\n      ? { [K in keyof Item]: K extends Col ? NonNullable<Item[K]> : Item[K] }[]\n      : T\n    : T\n  : T extends Record<string, unknown>\n    ? Col extends keyof T\n      ? { [K in keyof T]: K extends Col ? NonNullable<T[K]> : T[K] }\n      : T\n    : T\n\nexport default class PostgrestFilterBuilder<\n  ClientOptions extends ClientServerOptions,\n  Schema extends GenericSchema,\n  Row extends Record<string, unknown>,\n  Result,\n  RelationName = unknown,\n  Relationships = unknown,\n  Method = unknown,\n  ThrowOnError extends boolean = false,\n> extends PostgrestTransformBuilder<\n  ClientOptions,\n  Schema,\n  Row,\n  Result,\n  RelationName,\n  Relationships,\n  Method,\n  ThrowOnError\n> {\n  throwOnError(): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Row,\n    Result,\n    RelationName,\n    Relationships,\n    Method,\n    true\n  > {\n    return super.throwOnError() as PostgrestFilterBuilder<\n      ClientOptions,\n      Schema,\n      Row,\n      Result,\n      RelationName,\n      Relationships,\n      Method,\n      true\n    >\n  }\n\n  /**\n   * Match only rows where `column` is equal to `value`.\n   *\n   * To check if the value of `column` is NULL, you should use `.is()` instead.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .eq('name', 'Leia')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"Leia\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  eq<ColumnName extends string>(\n    column: ColumnName extends keyof Row\n      ? ColumnName\n      : ColumnName extends `${string}.${string}` | `${string}->${string}`\n        ? ColumnName\n        : string extends ColumnName\n          ? string\n          : keyof Row,\n    value: ResolveFilterValue<Schema, Row, ColumnName> extends never\n      ? NonNullable<unknown>\n      : ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue\n        ? NonNullable<ResolvedFilterValue>\n        : never\n  ): this {\n    this.url.searchParams.append(column as string, `eq.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is not equal to `value`.\n   *\n   * This filter does not include rows where `column` is `NULL`. To match null\n   * values, use `.is(column, null)` instead.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .neq('name', 'Leia')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     },\n   *     {\n   *       \"id\": 3,\n   *       \"name\": \"Han\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  neq<ColumnName extends string>(\n    column: ColumnName extends keyof Row\n      ? ColumnName\n      : ColumnName extends `${string}.${string}` | `${string}->${string}`\n        ? ColumnName\n        : string extends ColumnName\n          ? string\n          : keyof Row,\n    value: ResolveFilterValue<Schema, Row, ColumnName> extends never\n      ? unknown\n      : ResolveFilterValue<Schema, Row, ColumnName> extends infer Resolved\n        ? Resolved\n        : never\n  ): this {\n    this.url.searchParams.append(column as string, `neq.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is greater than `value`.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription With `select()`\n   * When using [reserved words](https://www.postgresql.org/docs/current/sql-keywords-appendix.html) for column names you need\n   * to add double quotes e.g. `.gt('\"order\"', 2)`\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .gt('id', 2)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 3,\n   *       \"name\": \"Han\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  gt<ColumnName extends string & keyof Row>(column: ColumnName, value: Row[ColumnName]): this\n  gt(column: string, value: unknown): this\n  gt(column: string, value: unknown): this {\n    this.url.searchParams.append(column, `gt.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is greater than or equal to `value`.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .gte('id', 2)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"Leia\"\n   *     },\n   *     {\n   *       \"id\": 3,\n   *       \"name\": \"Han\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  gte<ColumnName extends string & keyof Row>(column: ColumnName, value: Row[ColumnName]): this\n  gte(column: string, value: unknown): this\n  gte(column: string, value: unknown): this {\n    this.url.searchParams.append(column, `gte.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is less than `value`.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .lt('id', 2)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  lt<ColumnName extends string & keyof Row>(column: ColumnName, value: Row[ColumnName]): this\n  lt(column: string, value: unknown): this\n  lt(column: string, value: unknown): this {\n    this.url.searchParams.append(column, `lt.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is less than or equal to `value`.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .lte('id', 2)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     },\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"Leia\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  lte<ColumnName extends string & keyof Row>(column: ColumnName, value: Row[ColumnName]): this\n  lte(column: string, value: unknown): this\n  lte(column: string, value: unknown): this {\n    this.url.searchParams.append(column, `lte.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches `pattern` case-sensitively.\n   *\n   * @param column - The column to filter on\n   * @param pattern - The pattern to match with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .like('name', '%Lu%')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  like<ColumnName extends string & keyof Row>(column: ColumnName, pattern: string): this\n  like(column: string, pattern: string): this\n  like(column: string, pattern: string): this {\n    this.url.searchParams.append(column, `like.${pattern}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches all of `patterns` case-sensitively.\n   *\n   * @param column - The column to filter on\n   * @param patterns - The patterns to match with\n   *\n   * @category Database\n   * @subcategory Using filters\n   */\n  likeAllOf<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    patterns: readonly string[]\n  ): this\n  likeAllOf(column: string, patterns: readonly string[]): this\n  likeAllOf(column: string, patterns: readonly string[]): this {\n    this.url.searchParams.append(column, `like(all).{${patterns.join(',')}}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches any of `patterns` case-sensitively.\n   *\n   * @param column - The column to filter on\n   * @param patterns - The patterns to match with\n   *\n   * @category Database\n   * @subcategory Using filters\n   */\n  likeAnyOf<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    patterns: readonly string[]\n  ): this\n  likeAnyOf(column: string, patterns: readonly string[]): this\n  likeAnyOf(column: string, patterns: readonly string[]): this {\n    this.url.searchParams.append(column, `like(any).{${patterns.join(',')}}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches `pattern` case-insensitively.\n   *\n   * @param column - The column to filter on\n   * @param pattern - The pattern to match with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .ilike('name', '%lu%')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Luke\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  ilike<ColumnName extends string & keyof Row>(column: ColumnName, pattern: string): this\n  ilike(column: string, pattern: string): this\n  ilike(column: string, pattern: string): this {\n    this.url.searchParams.append(column, `ilike.${pattern}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches all of `patterns` case-insensitively.\n   *\n   * @param column - The column to filter on\n   * @param patterns - The patterns to match with\n   *\n   * @category Database\n   * @subcategory Using filters\n   */\n  ilikeAllOf<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    patterns: readonly string[]\n  ): this\n  ilikeAllOf(column: string, patterns: readonly string[]): this\n  ilikeAllOf(column: string, patterns: readonly string[]): this {\n    this.url.searchParams.append(column, `ilike(all).{${patterns.join(',')}}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches any of `patterns` case-insensitively.\n   *\n   * @param column - The column to filter on\n   * @param patterns - The patterns to match with\n   *\n   * @category Database\n   * @subcategory Using filters\n   */\n  ilikeAnyOf<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    patterns: readonly string[]\n  ): this\n  ilikeAnyOf(column: string, patterns: readonly string[]): this\n  ilikeAnyOf(column: string, patterns: readonly string[]): this {\n    this.url.searchParams.append(column, `ilike(any).{${patterns.join(',')}}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches the PostgreSQL regex `pattern`\n   * case-sensitively (using the `~` operator).\n   *\n   * @param column - The column to filter on\n   * @param pattern - The PostgreSQL regular expression pattern to match with\n   */\n  regexMatch<ColumnName extends string & keyof Row>(column: ColumnName, pattern: string): this\n  regexMatch(column: string, pattern: string): this\n  regexMatch(column: string, pattern: string): this {\n    this.url.searchParams.append(column, `match.${pattern}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` matches the PostgreSQL regex `pattern`\n   * case-insensitively (using the `~*` operator).\n   *\n   * @param column - The column to filter on\n   * @param pattern - The PostgreSQL regular expression pattern to match with\n   */\n  regexIMatch<ColumnName extends string & keyof Row>(column: ColumnName, pattern: string): this\n  regexIMatch(column: string, pattern: string): this\n  regexIMatch(column: string, pattern: string): this {\n    this.url.searchParams.append(column, `imatch.${pattern}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` IS `value`.\n   *\n   * For non-boolean columns, this is only relevant for checking if the value of\n   * `column` is NULL by setting `value` to `null`.\n   *\n   * For boolean columns, you can also set `value` to `true` or `false` and it\n   * will behave the same way as `.eq()`.\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription Checking for nullness, true or false\n   * Using the `eq()` filter doesn't work when filtering for `null`.\n   *\n   * Instead, you need to use `is()`.\n   *\n   * @example Checking for nullness, true or false\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .is('name', null)\n   * ```\n   *\n   * @exampleSql Checking for nullness, true or false\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   *\n   * insert into\n   *   countries (id, name)\n   * values\n   *   (1, 'null'),\n   *   (2, null);\n   * ```\n   *\n   * @exampleResponse Checking for nullness, true or false\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"null\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  is<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    value: Row[ColumnName] & (boolean | null)\n  ): this\n  is(column: string, value: boolean | null): this\n  is(column: string, value: boolean | null): this {\n    this.url.searchParams.append(column, `is.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` IS DISTINCT FROM `value`.\n   *\n   * Unlike `.neq()`, this treats `NULL` as a comparable value. Two `NULL` values\n   * are considered equal (not distinct), and comparing `NULL` with any non-NULL\n   * value returns true (distinct).\n   *\n   * @param column - The column to filter on\n   * @param value - The value to filter with\n   */\n  isDistinct<ColumnName extends string>(\n    column: ColumnName,\n    value: ResolveFilterValue<Schema, Row, ColumnName> extends never\n      ? unknown\n      : ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue\n        ? ResolvedFilterValue\n        : never\n  ): this {\n    this.url.searchParams.append(column, `isdistinct.${value}`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is included in the `values` array.\n   *\n   * @param column - The column to filter on\n   * @param values - The values array to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .in('name', ['Leia', 'Han'])\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"Leia\"\n   *     },\n   *     {\n   *       \"id\": 3,\n   *       \"name\": \"Han\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  in<ColumnName extends string>(\n    column: ColumnName,\n    values: ReadonlyArray<\n      ResolveFilterValue<Schema, Row, ColumnName> extends never\n        ? unknown\n        : // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep\n          // type resolution error\n          ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue\n          ? ResolvedFilterValue\n          : // We should never enter this case as all the branches are covered above\n            never\n    >\n  ): this {\n    const cleanedValues = Array.from(new Set(values))\n      .map((s) => {\n        // handle postgrest reserved characters\n        // https://postgrest.org/en/v7.0.0/api.html#reserved-characters\n        if (typeof s === 'string' && PostgrestReservedCharsRegexp.test(s)) return `\"${s}\"`\n        else return `${s}`\n      })\n      .join(',')\n    this.url.searchParams.append(column, `in.(${cleanedValues})`)\n    return this\n  }\n\n  /**\n   * Match only rows where `column` is NOT included in the `values` array.\n   *\n   * @param column - The column to filter on\n   * @param values - The values array to filter with\n   */\n  notIn<ColumnName extends string>(\n    column: ColumnName,\n    values: ReadonlyArray<\n      ResolveFilterValue<Schema, Row, ColumnName> extends never\n        ? unknown\n        : ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue\n          ? ResolvedFilterValue\n          : never\n    >\n  ): this {\n    const cleanedValues = Array.from(new Set(values))\n      .map((s) => {\n        // handle postgrest reserved characters\n        // https://postgrest.org/en/v7.0.0/api.html#reserved-characters\n        if (typeof s === 'string' && PostgrestReservedCharsRegexp.test(s)) return `\"${s}\"`\n        else return `${s}`\n      })\n      .join(',')\n    this.url.searchParams.append(column, `not.in.(${cleanedValues})`)\n    return this\n  }\n\n  /**\n   * Only relevant for jsonb, array, and range columns. Match only rows where\n   * `column` contains every element appearing in `value`.\n   *\n   * @param column - The jsonb, array, or range column to filter on\n   * @param value - The jsonb, array, or range value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example On array columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('issues')\n   *   .select()\n   *   .contains('tags', ['is:open', 'priority:low'])\n   * ```\n   *\n   * @exampleSql On array columns\n   * ```sql\n   * create table\n   *   issues (\n   *     id int8 primary key,\n   *     title text,\n   *     tags text[]\n   *   );\n   *\n   * insert into\n   *   issues (id, title, tags)\n   * values\n   *   (1, 'Cache invalidation is not working', array['is:open', 'severity:high', 'priority:low']),\n   *   (2, 'Use better names', array['is:open', 'severity:low', 'priority:medium']);\n   * ```\n   *\n   * @exampleResponse On array columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"title\": \"Cache invalidation is not working\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription On range columns\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example On range columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .contains('during', '[2000-01-01 13:00, 2000-01-01 13:30)')\n   * ```\n   *\n   * @exampleSql On range columns\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse On range columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"room_name\": \"Emerald\",\n   *       \"during\": \"[\\\"2000-01-01 13:00:00\\\",\\\"2000-01-01 15:00:00\\\")\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example On `jsonb` columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('users')\n   *   .select('name')\n   *   .contains('address', { postcode: 90210 })\n   * ```\n   *\n   * @exampleSql On `jsonb` columns\n   * ```sql\n   * create table\n   *   users (\n   *     id int8 primary key,\n   *     name text,\n   *     address jsonb\n   *   );\n   *\n   * insert into\n   *   users (id, name, address)\n   * values\n   *   (1, 'Michael', '{ \"postcode\": 90210, \"street\": \"Melrose Place\" }'),\n   *   (2, 'Jane', '{}');\n   * ```\n   *\n   * @exampleResponse On `jsonb` columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Michael\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  contains<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    value: string | ReadonlyArray<Row[ColumnName]> | Record<string, unknown>\n  ): this\n  contains(column: string, value: string | readonly unknown[] | Record<string, unknown>): this\n  contains(column: string, value: string | readonly unknown[] | Record<string, unknown>): this {\n    if (typeof value === 'string') {\n      // range types can be inclusive '[', ']' or exclusive '(', ')' so just\n      // keep it simple and accept a string\n      this.url.searchParams.append(column, `cs.${value}`)\n    } else if (Array.isArray(value)) {\n      // array\n      this.url.searchParams.append(column, `cs.{${value.join(',')}}`)\n    } else {\n      // json\n      this.url.searchParams.append(column, `cs.${JSON.stringify(value)}`)\n    }\n    return this\n  }\n\n  /**\n   * Only relevant for jsonb, array, and range columns. Match only rows where\n   * every element appearing in `column` is contained by `value`.\n   *\n   * @param column - The jsonb, array, or range column to filter on\n   * @param value - The jsonb, array, or range value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example On array columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('classes')\n   *   .select('name')\n   *   .containedBy('days', ['monday', 'tuesday', 'wednesday', 'friday'])\n   * ```\n   *\n   * @exampleSql On array columns\n   * ```sql\n   * create table\n   *   classes (\n   *     id int8 primary key,\n   *     name text,\n   *     days text[]\n   *   );\n   *\n   * insert into\n   *   classes (id, name, days)\n   * values\n   *   (1, 'Chemistry', array['monday', 'friday']),\n   *   (2, 'History', array['monday', 'wednesday', 'thursday']);\n   * ```\n   *\n   * @exampleResponse On array columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Chemistry\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription On range columns\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example On range columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .containedBy('during', '[2000-01-01 00:00, 2000-01-01 23:59)')\n   * ```\n   *\n   * @exampleSql On range columns\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse On range columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"room_name\": \"Emerald\",\n   *       \"during\": \"[\\\"2000-01-01 13:00:00\\\",\\\"2000-01-01 15:00:00\\\")\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example On `jsonb` columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('users')\n   *   .select('name')\n   *   .containedBy('address', {})\n   * ```\n   *\n   * @exampleSql On `jsonb` columns\n   * ```sql\n   * create table\n   *   users (\n   *     id int8 primary key,\n   *     name text,\n   *     address jsonb\n   *   );\n   *\n   * insert into\n   *   users (id, name, address)\n   * values\n   *   (1, 'Michael', '{ \"postcode\": 90210, \"street\": \"Melrose Place\" }'),\n   *   (2, 'Jane', '{}');\n   * ```\n   *\n   * @exampleResponse On `jsonb` columns\n   * ```json\n   *   {\n   *     \"data\": [\n   *       {\n   *         \"name\": \"Jane\"\n   *       }\n   *     ],\n   *     \"status\": 200,\n   *     \"statusText\": \"OK\"\n   *   }\n   *\n   * ```\n   */\n  containedBy<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    value: string | ReadonlyArray<Row[ColumnName]> | Record<string, unknown>\n  ): this\n  containedBy(column: string, value: string | readonly unknown[] | Record<string, unknown>): this\n  containedBy(column: string, value: string | readonly unknown[] | Record<string, unknown>): this {\n    if (typeof value === 'string') {\n      // range\n      this.url.searchParams.append(column, `cd.${value}`)\n    } else if (Array.isArray(value)) {\n      // array\n      this.url.searchParams.append(column, `cd.{${value.join(',')}}`)\n    } else {\n      // json\n      this.url.searchParams.append(column, `cd.${JSON.stringify(value)}`)\n    }\n    return this\n  }\n\n  /**\n   * Only relevant for range columns. Match only rows where every element in\n   * `column` is greater than any element in `range`.\n   *\n   * @param column - The range column to filter on\n   * @param range - The range to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription With `select()`\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .rangeGt('during', '[2000-01-02 08:00, 2000-01-02 09:00)')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   *   {\n   *     \"data\": [\n   *       {\n   *         \"id\": 2,\n   *         \"room_name\": \"Topaz\",\n   *         \"during\": \"[\\\"2000-01-02 09:00:00\\\",\\\"2000-01-02 10:00:00\\\")\"\n   *       }\n   *     ],\n   *     \"status\": 200,\n   *     \"statusText\": \"OK\"\n   *   }\n   *\n   * ```\n   */\n  rangeGt<ColumnName extends string & keyof Row>(column: ColumnName, range: string): this\n  rangeGt(column: string, range: string): this\n  rangeGt(column: string, range: string): this {\n    this.url.searchParams.append(column, `sr.${range}`)\n    return this\n  }\n\n  /**\n   * Only relevant for range columns. Match only rows where every element in\n   * `column` is either contained in `range` or greater than any element in\n   * `range`.\n   *\n   * @param column - The range column to filter on\n   * @param range - The range to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription With `select()`\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .rangeGte('during', '[2000-01-02 08:30, 2000-01-02 09:30)')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   *   {\n   *     \"data\": [\n   *       {\n   *         \"id\": 2,\n   *         \"room_name\": \"Topaz\",\n   *         \"during\": \"[\\\"2000-01-02 09:00:00\\\",\\\"2000-01-02 10:00:00\\\")\"\n   *       }\n   *     ],\n   *     \"status\": 200,\n   *     \"statusText\": \"OK\"\n   *   }\n   *\n   * ```\n   */\n  rangeGte<ColumnName extends string & keyof Row>(column: ColumnName, range: string): this\n  rangeGte(column: string, range: string): this\n  rangeGte(column: string, range: string): this {\n    this.url.searchParams.append(column, `nxl.${range}`)\n    return this\n  }\n\n  /**\n   * Only relevant for range columns. Match only rows where every element in\n   * `column` is less than any element in `range`.\n   *\n   * @param column - The range column to filter on\n   * @param range - The range to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription With `select()`\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .rangeLt('during', '[2000-01-01 15:00, 2000-01-01 16:00)')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"room_name\": \"Emerald\",\n   *       \"during\": \"[\\\"2000-01-01 13:00:00\\\",\\\"2000-01-01 15:00:00\\\")\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  rangeLt<ColumnName extends string & keyof Row>(column: ColumnName, range: string): this\n  rangeLt(column: string, range: string): this\n  rangeLt(column: string, range: string): this {\n    this.url.searchParams.append(column, `sl.${range}`)\n    return this\n  }\n\n  /**\n   * Only relevant for range columns. Match only rows where every element in\n   * `column` is either contained in `range` or less than any element in\n   * `range`.\n   *\n   * @param column - The range column to filter on\n   * @param range - The range to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription With `select()`\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .rangeLte('during', '[2000-01-01 14:00, 2000-01-01 16:00)')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   *   {\n   *     \"data\": [\n   *       {\n   *         \"id\": 1,\n   *         \"room_name\": \"Emerald\",\n   *         \"during\": \"[\\\"2000-01-01 13:00:00\\\",\\\"2000-01-01 15:00:00\\\")\"\n   *       }\n   *     ],\n   *     \"status\": 200,\n   *     \"statusText\": \"OK\"\n   *   }\n   *\n   * ```\n   */\n  rangeLte<ColumnName extends string & keyof Row>(column: ColumnName, range: string): this\n  rangeLte(column: string, range: string): this\n  rangeLte(column: string, range: string): this {\n    this.url.searchParams.append(column, `nxr.${range}`)\n    return this\n  }\n\n  /**\n   * Only relevant for range columns. Match only rows where `column` is\n   * mutually exclusive to `range` and there can be no element between the two\n   * ranges.\n   *\n   * @param column - The range column to filter on\n   * @param range - The range to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @exampleDescription With `select()`\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .rangeAdjacent('during', '[2000-01-01 12:00, 2000-01-01 13:00)')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"room_name\": \"Emerald\",\n   *       \"during\": \"[\\\"2000-01-01 13:00:00\\\",\\\"2000-01-01 15:00:00\\\")\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  rangeAdjacent<ColumnName extends string & keyof Row>(column: ColumnName, range: string): this\n  rangeAdjacent(column: string, range: string): this\n  rangeAdjacent(column: string, range: string): this {\n    this.url.searchParams.append(column, `adj.${range}`)\n    return this\n  }\n\n  /**\n   * Only relevant for array and range columns. Match only rows where\n   * `column` and `value` have an element in common.\n   *\n   * @param column - The array or range column to filter on\n   * @param value - The array or range value to filter with\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example On array columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('issues')\n   *   .select('title')\n   *   .overlaps('tags', ['is:closed', 'severity:high'])\n   * ```\n   *\n   * @exampleSql On array columns\n   * ```sql\n   * create table\n   *   issues (\n   *     id int8 primary key,\n   *     title text,\n   *     tags text[]\n   *   );\n   *\n   * insert into\n   *   issues (id, title, tags)\n   * values\n   *   (1, 'Cache invalidation is not working', array['is:open', 'severity:high', 'priority:low']),\n   *   (2, 'Use better names', array['is:open', 'severity:low', 'priority:medium']);\n   * ```\n   *\n   * @exampleResponse On array columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"title\": \"Cache invalidation is not working\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription On range columns\n   * Postgres supports a number of [range\n   * types](https://www.postgresql.org/docs/current/rangetypes.html). You\n   * can filter on range columns using the string representation of range\n   * values.\n   *\n   * @example On range columns\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('reservations')\n   *   .select()\n   *   .overlaps('during', '[2000-01-01 12:45, 2000-01-01 13:15)')\n   * ```\n   *\n   * @exampleSql On range columns\n   * ```sql\n   * create table\n   *   reservations (\n   *     id int8 primary key,\n   *     room_name text,\n   *     during tsrange\n   *   );\n   *\n   * insert into\n   *   reservations (id, room_name, during)\n   * values\n   *   (1, 'Emerald', '[2000-01-01 13:00, 2000-01-01 15:00)'),\n   *   (2, 'Topaz', '[2000-01-02 09:00, 2000-01-02 10:00)');\n   * ```\n   *\n   * @exampleResponse On range columns\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"room_name\": \"Emerald\",\n   *       \"during\": \"[\\\"2000-01-01 13:00:00\\\",\\\"2000-01-01 15:00:00\\\")\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  overlaps<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    value: string | ReadonlyArray<Row[ColumnName]>\n  ): this\n  overlaps(column: string, value: string | readonly unknown[]): this\n  overlaps(column: string, value: string | readonly unknown[]): this {\n    if (typeof value === 'string') {\n      // range\n      this.url.searchParams.append(column, `ov.${value}`)\n    } else {\n      // array\n      this.url.searchParams.append(column, `ov.{${value.join(',')}}`)\n    }\n    return this\n  }\n\n  /**\n   * Only relevant for text and tsvector columns. Match only rows where\n   * `column` matches the query string in `query`.\n   *\n   * @param column - The text or tsvector column to filter on\n   * @param query - The query text to match with\n   * @param options - Named parameters\n   * @param options.config - The text search configuration to use\n   * @param options.type - Change how the `query` text is interpreted\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @remarks\n   * - For more information, see [Postgres full text search](/docs/guides/database/full-text-search).\n   *\n   * @example Text search\n   * ```ts\n   * const result = await supabase\n   *   .from(\"texts\")\n   *   .select(\"content\")\n   *   .textSearch(\"content\", `'eggs' & 'ham'`, {\n   *     config: \"english\",\n   *   });\n   * ```\n   *\n   * @exampleSql Text search\n   * ```sql\n   * create table texts (\n   *   id      bigint\n   *           primary key\n   *           generated always as identity,\n   *   content text\n   * );\n   *\n   * insert into texts (content) values\n   *     ('Four score and seven years ago'),\n   *     ('The road goes ever on and on'),\n   *     ('Green eggs and ham')\n   * ;\n   * ```\n   *\n   * @exampleResponse Text search\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"content\": \"Green eggs and ham\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription Basic normalization\n   * Uses PostgreSQL's `plainto_tsquery` function.\n   *\n   * @example Basic normalization\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('quotes')\n   *   .select('catchphrase')\n   *   .textSearch('catchphrase', `'fat' & 'cat'`, {\n   *     type: 'plain',\n   *     config: 'english'\n   *   })\n   * ```\n   *\n   * @exampleDescription Full normalization\n   * Uses PostgreSQL's `phraseto_tsquery` function.\n   *\n   * @example Full normalization\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('quotes')\n   *   .select('catchphrase')\n   *   .textSearch('catchphrase', `'fat' & 'cat'`, {\n   *     type: 'phrase',\n   *     config: 'english'\n   *   })\n   * ```\n   *\n   * @exampleDescription Websearch\n   * Uses PostgreSQL's `websearch_to_tsquery` function.\n   * This function will never raise syntax errors, which makes it possible to use raw user-supplied input for search, and can be used\n   * with advanced operators.\n   *\n   * - `unquoted text`: text not inside quote marks will be converted to terms separated by & operators, as if processed by plainto_tsquery.\n   * - `\"quoted text\"`: text inside quote marks will be converted to terms separated by `<->` operators, as if processed by phraseto_tsquery.\n   * - `OR`: the word “or” will be converted to the | operator.\n   * - `-`: a dash will be converted to the ! operator.\n   *\n   * @example Websearch\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('quotes')\n   *   .select('catchphrase')\n   *   .textSearch('catchphrase', `'fat or cat'`, {\n   *     type: 'websearch',\n   *     config: 'english'\n   *   })\n   * ```\n   */\n  textSearch<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    query: string,\n    options?: { config?: string; type?: 'plain' | 'phrase' | 'websearch' }\n  ): this\n  textSearch(\n    column: string,\n    query: string,\n    options?: { config?: string; type?: 'plain' | 'phrase' | 'websearch' }\n  ): this\n  textSearch(\n    column: string,\n    query: string,\n    { config, type }: { config?: string; type?: 'plain' | 'phrase' | 'websearch' } = {}\n  ): this {\n    let typePart = ''\n    if (type === 'plain') {\n      typePart = 'pl'\n    } else if (type === 'phrase') {\n      typePart = 'ph'\n    } else if (type === 'websearch') {\n      typePart = 'w'\n    }\n    const configPart = config === undefined ? '' : `(${config})`\n    this.url.searchParams.append(column, `${typePart}fts${configPart}.${query}`)\n    return this\n  }\n\n  /**\n   * Match only rows where each column in `query` keys is equal to its\n   * associated value. Shorthand for multiple `.eq()`s.\n   *\n   * @param query - The object to filter with, with column names as keys mapped\n   * to their filter values\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('name')\n   *   .match({ id: 2, name: 'Leia' })\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Leia\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  match<ColumnName extends string & keyof Row>(query: Record<ColumnName, Row[ColumnName]>): this\n  match(query: Record<string, unknown>): this\n  match(query: Record<string, unknown>): this {\n    Object.entries(query)\n      // columns with `undefined` value needs to be filtered out, otherwise it'll\n      // show up as `?column=eq.undefined`\n      .filter(([_, value]) => value !== undefined)\n      .forEach(([column, value]) => {\n        this.url.searchParams.append(column, `eq.${value}`)\n      })\n    return this\n  }\n\n  /**\n   * Match only rows which doesn't satisfy the filter.\n   *\n   * Unlike most filters, `opearator` and `value` are used as-is and need to\n   * follow [PostgREST\n   * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n   * to make sure they are properly sanitized.\n   *\n   * @param column - The column to filter on\n   * @param operator - The operator to be negated to filter with, following\n   * PostgREST syntax\n   * @param value - The value to filter with, following PostgREST syntax\n   *\n   * @category Database\n   * @subcategory Using filters\n   */\n  not<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    operator: 'is',\n    value: null\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    NonNullableColumn<Row, ColumnName>,\n    NarrowResultColumn<Result, ColumnName>,\n    RelationName,\n    Relationships,\n    Method,\n    ThrowOnError\n  > &\n    this\n  not<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    operator: FilterOperator,\n    value: Row[ColumnName]\n  ): this\n  not(column: string, operator: string, value: unknown): this\n  /**\n   * Match only rows which doesn't satisfy the filter.\n   *\n   * Unlike most filters, `opearator` and `value` are used as-is and need to\n   * follow [PostgREST\n   * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n   * to make sure they are properly sanitized.\n   *\n   * @param column - The column to filter on\n   * @param operator - The operator to be negated to filter with, following\n   * PostgREST syntax\n   * @param value - The value to filter with, following PostgREST syntax\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @remarks\n   * not() expects you to use the raw PostgREST syntax for the filter values.\n   *\n   * ```ts\n   * .not('id', 'in', '(5,6,7)')  // Use `()` for `in` filter\n   * .not('arraycol', 'cs', '{\"a\",\"b\"}')  // Use `cs` for `contains()`, `{}` for array values\n   * ```\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('countries')\n   *   .select()\n   *   .not('name', 'is', null)\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   *\n   * insert into\n   *   countries (id, name)\n   * values\n   *   (1, 'null'),\n   *   (2, null);\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   *   {\n   *     \"data\": [\n   *       {\n   *         \"id\": 1,\n   *         \"name\": \"null\"\n   *       }\n   *     ],\n   *     \"status\": 200,\n   *     \"statusText\": \"OK\"\n   *   }\n   *\n   * ```\n   */\n  not(\n    column: string,\n    operator: string,\n    value: unknown\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    any,\n    any,\n    RelationName,\n    Relationships,\n    Method,\n    ThrowOnError\n  > &\n    this {\n    this.url.searchParams.append(column, `not.${operator}.${value}`)\n    return this as any\n  }\n\n  /**\n   * Match only rows which satisfy at least one of the filters.\n   *\n   * Unlike most filters, `filters` is used as-is and needs to follow [PostgREST\n   * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n   * to make sure it's properly sanitized.\n   *\n   * It's currently not possible to do an `.or()` filter across multiple tables.\n   *\n   * @param filters - The filters to use, following PostgREST syntax\n   * @param options - Named parameters\n   * @param options.referencedTable - Set this to filter on referenced tables\n   * instead of the parent table\n   * @param options.foreignTable - Deprecated, use `referencedTable` instead\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @remarks\n   * or() expects you to use the raw PostgREST syntax for the filter names and values.\n   *\n   * ```ts\n   * .or('id.in.(5,6,7), arraycol.cs.{\"a\",\"b\"}')  // Use `()` for `in` filter, `{}` for array values and `cs` for `contains()`.\n   * .or('id.in.(5,6,7), arraycol.cd.{\"a\",\"b\"}')  // Use `cd` for `containedBy()`\n   * ```\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('name')\n   *   .or('id.eq.2,name.eq.Han')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Leia\"\n   *     },\n   *     {\n   *       \"name\": \"Han\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example Use `or` with `and`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select('name')\n   *   .or('id.gt.3,and(id.eq.1,name.eq.Luke)')\n   * ```\n   *\n   * @exampleSql Use `or` with `and`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse Use `or` with `and`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"Luke\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example Use `or` on referenced tables\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('orchestral_sections')\n   *   .select(`\n   *     name,\n   *     instruments!inner (\n   *       name\n   *     )\n   *   `)\n   *   .or('section_id.eq.1,name.eq.guzheng', { referencedTable: 'instruments' })\n   * ```\n   *\n   * @exampleSql Use `or` on referenced tables\n   * ```sql\n   * create table\n   *   orchestral_sections (id int8 primary key, name text);\n   * create table\n   *   instruments (\n   *     id int8 primary key,\n   *     section_id int8 not null references orchestral_sections,\n   *     name text\n   *   );\n   *\n   * insert into\n   *   orchestral_sections (id, name)\n   * values\n   *   (1, 'strings'),\n   *   (2, 'woodwinds');\n   * insert into\n   *   instruments (id, section_id, name)\n   * values\n   *   (1, 2, 'flute'),\n   *   (2, 1, 'violin');\n   * ```\n   *\n   * @exampleResponse Use `or` on referenced tables\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"strings\",\n   *       \"instruments\": [\n   *         {\n   *           \"name\": \"violin\"\n   *         }\n   *       ]\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  or(\n    filters: string,\n    {\n      foreignTable,\n      referencedTable = foreignTable,\n    }: { foreignTable?: string; referencedTable?: string } = {}\n  ): this {\n    const key = referencedTable ? `${referencedTable}.or` : 'or'\n    this.url.searchParams.append(key, `(${filters})`)\n    return this\n  }\n\n  /**\n   * Match only rows which satisfy the filter. This is an escape hatch - you\n   * should use the specific filter methods wherever possible.\n   *\n   * Unlike most filters, `opearator` and `value` are used as-is and need to\n   * follow [PostgREST\n   * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n   * to make sure they are properly sanitized.\n   *\n   * @param column - The column to filter on\n   * @param operator - The operator to filter with, following PostgREST syntax\n   * @param value - The value to filter with, following PostgREST syntax\n   *\n   * @category Database\n   * @subcategory Using filters\n   *\n   * @remarks\n   * filter() expects you to use the raw PostgREST syntax for the filter values.\n   *\n   * ```ts\n   * .filter('id', 'in', '(5,6,7)')  // Use `()` for `in` filter\n   * .filter('arraycol', 'cs', '{\"a\",\"b\"}')  // Use `cs` for `contains()`, `{}` for array values\n   * ```\n   *\n   * @example With `select()`\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('characters')\n   *   .select()\n   *   .filter('name', 'in', '(\"Han\",\"Yoda\")')\n   * ```\n   *\n   * @exampleSql With `select()`\n   * ```sql\n   * create table\n   *   characters (id int8 primary key, name text);\n   *\n   * insert into\n   *   characters (id, name)\n   * values\n   *   (1, 'Luke'),\n   *   (2, 'Leia'),\n   *   (3, 'Han');\n   * ```\n   *\n   * @exampleResponse With `select()`\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 3,\n   *       \"name\": \"Han\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example On a referenced table\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('orchestral_sections')\n   *   .select(`\n   *     name,\n   *     instruments!inner (\n   *       name\n   *     )\n   *   `)\n   *   .filter('instruments.name', 'eq', 'flute')\n   * ```\n   *\n   * @exampleSql On a referenced table\n   * ```sql\n   * create table\n   *   orchestral_sections (id int8 primary key, name text);\n   * create table\n   *    instruments (\n   *     id int8 primary key,\n   *     section_id int8 not null references orchestral_sections,\n   *     name text\n   *   );\n   *\n   * insert into\n   *   orchestral_sections (id, name)\n   * values\n   *   (1, 'strings'),\n   *   (2, 'woodwinds');\n   * insert into\n   *   instruments (id, section_id, name)\n   * values\n   *   (1, 2, 'flute'),\n   *   (2, 1, 'violin');\n   * ```\n   *\n   * @exampleResponse On a referenced table\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"woodwinds\",\n   *       \"instruments\": [\n   *         {\n   *           \"name\": \"flute\"\n   *         }\n   *       ]\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  filter<ColumnName extends string & keyof Row>(\n    column: ColumnName,\n    operator: `${'' | 'not.'}${FilterOperator}`,\n    value: unknown\n  ): this\n  filter(column: string, operator: string, value: unknown): this\n  filter(column: string, operator: string, value: unknown): this {\n    this.url.searchParams.append(column, `${operator}.${value}`)\n    return this\n  }\n}\n","import PostgrestFilterBuilder from './PostgrestFilterBuilder'\nimport { GetResult } from './select-query-parser/result'\nimport {\n  ClientServerOptions,\n  Fetch,\n  GenericSchema,\n  GenericTable,\n  GenericView,\n} from './types/common/common'\nimport { RejectExcessProperties } from './types/types'\n\nexport default class PostgrestQueryBuilder<\n  ClientOptions extends ClientServerOptions,\n  Schema extends GenericSchema,\n  Relation extends GenericTable | GenericView,\n  RelationName = unknown,\n  Relationships = Relation extends { Relationships: infer R } ? R : unknown,\n> {\n  url: URL\n  headers: Headers\n  schema?: string\n  signal?: AbortSignal\n  fetch?: Fetch\n  urlLengthLimit: number\n\n  /**\n   * Enable or disable automatic retries for transient errors.\n   * When enabled, idempotent requests (GET/HEAD/OPTIONS) that fail with network\n   * errors or HTTP 503/520 responses are automatically retried with exponential\n   * backoff (1s, 2s, 4s, up to 3 attempts). Defaults to `true` when not specified.\n   */\n  retry?: boolean\n\n  /**\n   * Creates a query builder scoped to a Postgres table or view.\n   *\n   * @category Database\n   *\n   * @param url - The URL for the query\n   * @param options - Named parameters\n   * @param options.headers - Custom headers\n   * @param options.schema - Postgres schema to use\n   * @param options.fetch - Custom fetch implementation\n   * @param options.urlLengthLimit - Maximum URL length before warning\n   * @param options.retry - Enable automatic retries for transient errors (default: true)\n   *\n   * @example Using supabase-js (recommended)\n   * ```ts\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const { data, error } = await supabase.from('users').select('*')\n   * ```\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```ts\n   * import { PostgrestQueryBuilder } from '@supabase/postgrest-js'\n   *\n   * const query = new PostgrestQueryBuilder(\n   *   new URL('https://xyzcompany.supabase.co/rest/v1/users'),\n   *   { headers: { apikey: 'your-publishable-key' }, retry: true }\n   * )\n   * ```\n   */\n  constructor(\n    url: URL,\n    {\n      headers = {},\n      schema,\n      fetch,\n      urlLengthLimit = 8000,\n      retry,\n    }: {\n      headers?: HeadersInit\n      schema?: string\n      fetch?: Fetch\n      urlLengthLimit?: number\n      retry?: boolean\n    }\n  ) {\n    this.url = url\n    this.headers = new Headers(headers)\n    this.schema = schema\n    this.fetch = fetch\n    this.urlLengthLimit = urlLengthLimit\n    this.retry = retry\n  }\n\n  /**\n   * Clone URL and headers to prevent shared state between operations.\n   */\n  private cloneRequestState(): { url: URL; headers: Headers } {\n    return {\n      url: new URL(this.url.toString()),\n      headers: new Headers(this.headers),\n    }\n  }\n\n  /**\n       * Perform a SELECT query on the table or view.\n       *\n       * @param columns - The columns to retrieve, separated by commas. Columns can be renamed when returned with `customName:columnName`\n       *\n       * @param options - Named parameters\n       *\n       * @param options.head - When set to `true`, `data` will not be returned.\n       * Useful if you only need the count.\n       *\n       * @param options.count - Count algorithm to use to count rows in the table or view.\n       *\n       * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n       * hood.\n       *\n       * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n       * statistics under the hood.\n       *\n       * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n       * numbers.\n       *\n       * @remarks\n       * When using `count` with `.range()` or `.limit()`, the returned `count` is the total number of rows\n       * that match your filters, not the number of rows in the current page. Use this to build pagination UI.\n     *\n     * - By default, Supabase projects return a maximum of 1,000 rows. This setting can be changed in your project's [API settings](/dashboard/project/_/settings/api). It's recommended that you keep it low to limit the payload size of accidental or malicious requests. You can use `range()` queries to paginate through your data.\n     * - `select()` can be combined with [Filters](/docs/reference/javascript/using-filters)\n     * - `select()` can be combined with [Modifiers](/docs/reference/javascript/using-modifiers)\n     * - `apikey` is a reserved keyword if you're using the [Supabase Platform](/docs/guides/platform) and [should be avoided as a column name](https://github.com/supabase/supabase/issues/5465). *\n     * @category Database\n     *\n     * @example Getting your data\n     * ```js\n     * const { data, error } = await supabase\n     *   .from('characters')\n     *   .select()\n     * ```\n     *\n     * @exampleSql Getting your data\n     * ```sql\n     * create table\n     *   characters (id int8 primary key, name text);\n     *\n     * insert into\n     *   characters (id, name)\n     * values\n     *   (1, 'Harry'),\n     *   (2, 'Frodo'),\n     *   (3, 'Katniss');\n     * ```\n     *\n     * @exampleResponse Getting your data\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"id\": 1,\n     *       \"name\": \"Harry\"\n     *     },\n     *     {\n     *       \"id\": 2,\n     *       \"name\": \"Frodo\"\n     *     },\n     *     {\n     *       \"id\": 3,\n     *       \"name\": \"Katniss\"\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Handling errors\n     * The most useful field on a Postgres error is usually `hint` — when the database knows the fix, it puts the literal SQL there. For example, a permission-denied error (`code: '42501'`) arrives with a `hint` like `\"Grant the required privileges to the current role with: GRANT SELECT ON public.characters TO anon;\"`. Log the full `error` object so the hint isn't hidden behind `error.message`.\n     *\n     * @example Handling errors\n     * ```js\n     * const { data, error } = await supabase.from('characters').select()\n     * if (error) {\n     *   // Logs the full error: message, code, details, and hint.\n     *   console.error(error)\n     *   return\n     * }\n     * ```\n     *\n     * @exampleResponse Handling errors\n     * ```json\n     * {\n     *   \"error\": {\n     *     \"code\": \"42501\",\n     *     \"details\": null,\n     *     \"hint\": \"Grant the required privileges to the current role with: GRANT SELECT ON public.characters TO anon;\",\n     *     \"message\": \"permission denied for table characters\"\n     *   },\n     *   \"status\": 401,\n     *   \"statusText\": \"\"\n     * }\n     * ```\n     *\n     * @example Selecting specific columns\n     * ```js\n     * const { data, error } = await supabase\n     *   .from('characters')\n     *   .select('name')\n     * ```\n     *\n     * @exampleSql Selecting specific columns\n     * ```sql\n     * create table\n     *   characters (id int8 primary key, name text);\n     *\n     * insert into\n     *   characters (id, name)\n     * values\n     *   (1, 'Frodo'),\n     *   (2, 'Harry'),\n     *   (3, 'Katniss');\n     * ```\n     *\n     * @exampleResponse Selecting specific columns\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"name\": \"Frodo\"\n     *     },\n     *     {\n     *       \"name\": \"Harry\"\n     *     },\n     *     {\n     *       \"name\": \"Katniss\"\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Query referenced tables\n     * If your database has foreign key relationships, you can query related tables too.\n     *\n     * @example Query referenced tables\n     * ```js\n     * const { data, error } = await supabase\n     *   .from('orchestral_sections')\n     *   .select(`\n     *     name,\n     *     instruments (\n     *       name\n     *     )\n     *   `)\n     * ```\n     *\n     * @exampleSql Query referenced tables\n     * ```sql\n     * create table\n     *   orchestral_sections (id int8 primary key, name text);\n     * create table\n     *   instruments (\n     *     id int8 primary key,\n     *     section_id int8 not null references orchestral_sections,\n     *     name text\n     *   );\n     *\n     * insert into\n     *   orchestral_sections (id, name)\n     * values\n     *   (1, 'strings'),\n     *   (2, 'woodwinds');\n     * insert into\n     *   instruments (id, section_id, name)\n     * values\n     *   (1, 2, 'flute'),\n     *   (2, 1, 'violin');\n     * ```\n     *\n     * @exampleResponse Query referenced tables\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"name\": \"strings\",\n     *       \"instruments\": [\n     *         {\n     *           \"name\": \"violin\"\n     *         }\n     *       ]\n     *     },\n     *     {\n     *       \"name\": \"woodwinds\",\n     *       \"instruments\": [\n     *         {\n     *           \"name\": \"flute\"\n     *         }\n     *       ]\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Query referenced tables with spaces in their names\n     * If your table name contains spaces, you must use double quotes in the `select` statement to reference the table.\n     *\n     * @example Query referenced tables with spaces in their names\n     * ```js\n     * const { data, error } = await supabase\n     *   .from('orchestral sections')\n     *   .select(`\n     *     name,\n     *     \"musical instruments\" (\n     *       name\n     *     )\n     *   `)\n     * ```\n     *\n     * @exampleSql Query referenced tables with spaces in their names\n     * ```sql\n     * create table\n     *   \"orchestral sections\" (id int8 primary key, name text);\n     * create table\n     *   \"musical instruments\" (\n     *     id int8 primary key,\n     *     section_id int8 not null references \"orchestral sections\",\n     *     name text\n     *   );\n     *\n     * insert into\n     *   \"orchestral sections\" (id, name)\n     * values\n     *   (1, 'strings'),\n     *   (2, 'woodwinds');\n     * insert into\n     *   \"musical instruments\" (id, section_id, name)\n     * values\n     *   (1, 2, 'flute'),\n     *   (2, 1, 'violin');\n     * ```\n     *\n     * @exampleResponse Query referenced tables with spaces in their names\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"name\": \"strings\",\n     *       \"musical instruments\": [\n     *         {\n     *           \"name\": \"violin\"\n     *         }\n     *       ]\n     *     },\n     *     {\n     *       \"name\": \"woodwinds\",\n     *       \"musical instruments\": [\n     *         {\n     *           \"name\": \"flute\"\n     *         }\n     *       ]\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Query referenced tables through a join table\n     * If you're in a situation where your tables are **NOT** directly\n     * related, but instead are joined by a _join table_, you can still use\n     * the `select()` method to query the related data. The join table needs\n     * to have the foreign keys as part of its composite primary key.\n     *\n     * @example Query referenced tables through a join table\n     * ```ts\n     * const { data, error } = await supabase\n     *   .from('users')\n     *   .select(`\n     *     name,\n     *     teams (\n     *       name\n     *     )\n     *   `)\n     *\n     * ```     * @exampleSql Query referenced tables through a join table\n     * ```sql\n     * create table\n     *   users (\n     *     id int8 primary key,\n     *     name text\n     *   );\n     * create table\n     *   teams (\n     *     id int8 primary key,\n     *     name text\n     *   );\n     * -- join table\n     * create table\n     *   users_teams (\n     *     user_id int8 not null references users,\n     *     team_id int8 not null references teams,\n     *     -- both foreign keys must be part of a composite primary key\n     *     primary key (user_id, team_id)\n     *   );\n     *\n     * insert into\n     *   users (id, name)\n     * values\n     *   (1, 'Kiran'),\n     *   (2, 'Evan');\n     * insert into\n     *   teams (id, name)\n     * values\n     *   (1, 'Green'),\n     *   (2, 'Blue');\n     * insert into\n     *   users_teams (user_id, team_id)\n     * values\n     *   (1, 1),\n     *   (1, 2),\n     *   (2, 2);\n     * ```\n     *\n     * @exampleResponse Query referenced tables through a join table\n     * ```json\n     *   {\n     *     \"data\": [\n     *       {\n     *         \"name\": \"Kiran\",\n     *         \"teams\": [\n     *           {\n     *             \"name\": \"Green\"\n     *           },\n     *           {\n     *             \"name\": \"Blue\"\n     *           }\n     *         ]\n     *       },\n     *       {\n     *         \"name\": \"Evan\",\n     *         \"teams\": [\n     *           {\n     *             \"name\": \"Blue\"\n     *           }\n     *         ]\n     *       }\n     *     ],\n     *     \"status\": 200,\n     *     \"statusText\": \"OK\"\n     *   }\n     *\n     * ```\n     *\n     * @exampleDescription Query the same referenced table multiple times\n     * If you need to query the same referenced table twice, use the name of the\n     * joined column to identify which join to use. You can also give each\n     * column an alias.\n     *\n     * @example Query the same referenced table multiple times\n     * ```ts\n     * const { data, error } = await supabase\n     *   .from('messages')\n     *   .select(`\n     *     content,\n     *     from:sender_id(name),\n     *     to:receiver_id(name)\n     *   `)\n     *\n     * // To infer types, use the name of the table (in this case `users`) and\n     * // the name of the foreign key constraint.\n     * const { data, error } = await supabase\n     *   .from('messages')\n     *   .select(`\n     *     content,\n     *     from:users!messages_sender_id_fkey(name),\n     *     to:users!messages_receiver_id_fkey(name)\n     *   `)\n     * ```\n     *\n     * @exampleSql Query the same referenced table multiple times\n     * ```sql\n     *  create table\n     *  users (id int8 primary key, name text);\n     *\n     *  create table\n     *    messages (\n     *      sender_id int8 not null references users,\n     *      receiver_id int8 not null references users,\n     *      content text\n     *    );\n     *\n     *  insert into\n     *    users (id, name)\n     *  values\n     *    (1, 'Kiran'),\n     *    (2, 'Evan');\n     *\n     *  insert into\n     *    messages (sender_id, receiver_id, content)\n     *  values\n     *    (1, 2, '👋');\n     *  ```\n     * ```\n     *\n     * @exampleResponse Query the same referenced table multiple times\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"content\": \"👋\",\n     *       \"from\": {\n     *         \"name\": \"Kiran\"\n     *       },\n     *       \"to\": {\n     *         \"name\": \"Evan\"\n     *       }\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Query nested foreign tables through a join table\n     * You can use the result of a joined table to gather data in\n     * another foreign table. With multiple references to the same foreign\n     * table you must specify the column on which to conduct the join.\n     *\n     * @example Query nested foreign tables through a join table\n     * ```ts\n     *   const { data, error } = await supabase\n     *     .from('games')\n     *     .select(`\n     *       game_id:id,\n     *       away_team:teams!games_away_team_fkey (\n     *         users (\n     *           id,\n     *           name\n     *         )\n     *       )\n     *     `)\n     *\n     * ```\n     *\n     * @exampleSql Query nested foreign tables through a join table\n     * ```sql\n     * ```sql\n     * create table\n     *   users (\n     *     id int8 primary key,\n     *     name text\n     *   );\n     * create table\n     *   teams (\n     *     id int8 primary key,\n     *     name text\n     *   );\n     * -- join table\n     * create table\n     *   users_teams (\n     *     user_id int8 not null references users,\n     *     team_id int8 not null references teams,\n     *\n     *     primary key (user_id, team_id)\n     *   );\n     * create table\n     *   games (\n     *     id int8 primary key,\n     *     home_team int8 not null references teams,\n     *     away_team int8 not null references teams,\n     *     name text\n     *   );\n     *\n     * insert into users (id, name)\n     * values\n     *   (1, 'Kiran'),\n     *   (2, 'Evan');\n     * insert into\n     *   teams (id, name)\n     * values\n     *   (1, 'Green'),\n     *   (2, 'Blue');\n     * insert into\n     *   users_teams (user_id, team_id)\n     * values\n     *   (1, 1),\n     *   (1, 2),\n     *   (2, 2);\n     * insert into\n     *   games (id, home_team, away_team, name)\n     * values\n     *   (1, 1, 2, 'Green vs Blue'),\n     *   (2, 2, 1, 'Blue vs Green');\n     * ```\n     *\n     * @exampleResponse Query nested foreign tables through a join table\n     * ```json\n     *   {\n     *     \"data\": [\n     *       {\n     *         \"game_id\": 1,\n     *         \"away_team\": {\n     *           \"users\": [\n     *             {\n     *               \"id\": 1,\n     *               \"name\": \"Kiran\"\n     *             },\n     *             {\n     *               \"id\": 2,\n     *               \"name\": \"Evan\"\n     *             }\n     *           ]\n     *         }\n     *       },\n     *       {\n     *         \"game_id\": 2,\n     *         \"away_team\": {\n     *           \"users\": [\n     *             {\n     *               \"id\": 1,\n     *               \"name\": \"Kiran\"\n     *             }\n     *           ]\n     *         }\n     *       }\n     *     ],\n     *     \"status\": 200,\n     *     \"statusText\": \"OK\"\n     *   }\n     *\n     * ```\n     *\n     * @exampleDescription Filtering through referenced tables\n     * If the filter on a referenced table's column is not satisfied, the referenced\n     * table returns `[]` or `null` but the parent table is not filtered out.\n     * If you want to filter out the parent table rows, use the `!inner` hint\n     *\n     * @example Filtering through referenced tables\n     * ```ts\n     * const { data, error } = await supabase\n     *   .from('instruments')\n     *   .select('name, orchestral_sections(*)')\n     *   .eq('orchestral_sections.name', 'percussion')\n     * ```\n     *\n     * @exampleSql Filtering through referenced tables\n     * ```sql\n     * create table\n     *   orchestral_sections (id int8 primary key, name text);\n     * create table\n     *   instruments (\n     *     id int8 primary key,\n     *     section_id int8 not null references orchestral_sections,\n     *     name text\n     *   );\n     *\n     * insert into\n     *   orchestral_sections (id, name)\n     * values\n     *   (1, 'strings'),\n     *   (2, 'woodwinds');\n     * insert into\n     *   instruments (id, section_id, name)\n     * values\n     *   (1, 2, 'flute'),\n     *   (2, 1, 'violin');\n     * ```\n     *\n     * @exampleResponse Filtering through referenced tables\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"name\": \"flute\",\n     *       \"orchestral_sections\": null\n     *     },\n     *     {\n     *       \"name\": \"violin\",\n     *       \"orchestral_sections\": null\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Querying referenced table with count\n     * You can get the number of rows in a related table by using the\n     * **count** property.\n     *\n     * @example Querying referenced table with count\n     * ```ts\n     * const { data, error } = await supabase\n     *   .from('orchestral_sections')\n     *   .select(`*, instruments(count)`)\n     * ```\n     *\n     * @exampleSql Querying referenced table with count\n     * ```sql\n     * create table orchestral_sections (\n     *   \"id\" \"uuid\" primary key default \"extensions\".\"uuid_generate_v4\"() not null,\n     *   \"name\" text\n     * );\n     *\n     * create table characters (\n     *   \"id\" \"uuid\" primary key default \"extensions\".\"uuid_generate_v4\"() not null,\n     *   \"name\" text,\n     *   \"section_id\" \"uuid\" references public.orchestral_sections on delete cascade\n     * );\n     *\n     * with section as (\n     *   insert into orchestral_sections (name)\n     *   values ('strings') returning id\n     * )\n     * insert into instruments (name, section_id) values\n     * ('violin', (select id from section)),\n     * ('viola', (select id from section)),\n     * ('cello', (select id from section)),\n     * ('double bass', (select id from section));\n     * ```\n     *\n     * @exampleResponse Querying referenced table with count\n     * ```json\n     * [\n     *   {\n     *     \"id\": \"693694e7-d993-4360-a6d7-6294e325d9b6\",\n     *     \"name\": \"strings\",\n     *     \"instruments\": [\n     *       {\n     *         \"count\": 4\n     *       }\n     *     ]\n     *   }\n     * ]\n     * ```\n     *\n     * @exampleDescription Querying with count option\n     * You can get the number of rows by using the\n     * [count](/docs/reference/javascript/select#parameters) option.\n     *\n     * @example Querying with count option\n     * ```ts\n     * const { count, error } = await supabase\n     *   .from('characters')\n     *   .select('*', { count: 'exact', head: true })\n     * ```\n     *\n     * @exampleSql Querying with count option\n     * ```sql\n     * create table\n     *   characters (id int8 primary key, name text);\n     *\n     * insert into\n     *   characters (id, name)\n     * values\n     *   (1, 'Luke'),\n     *   (2, 'Leia'),\n     *   (3, 'Han');\n     * ```\n     *\n     * @exampleResponse Querying with count option\n     * ```json\n     * {\n     *   \"count\": 3,\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Querying JSON data\n     * You can select and filter data inside of\n     * [JSON](/docs/guides/database/json) columns. Postgres offers some\n     * [operators](/docs/guides/database/json#query-the-jsonb-data) for\n     * querying JSON data.\n     *\n     * @example Querying JSON data\n     * ```ts\n     * const { data, error } = await supabase\n     *   .from('users')\n     *   .select(`\n     *     id, name,\n     *     address->city\n     *   `)\n     * ```\n     *\n     * @exampleSql Querying JSON data\n     * ```sql\n     * create table\n     *   users (\n     *     id int8 primary key,\n     *     name text,\n     *     address jsonb\n     *   );\n     *\n     * insert into\n     *   users (id, name, address)\n     * values\n     *   (1, 'Frodo', '{\"city\":\"Hobbiton\"}');\n     * ```\n     *\n     * @exampleResponse Querying JSON data\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"id\": 1,\n     *       \"name\": \"Frodo\",\n     *       \"city\": \"Hobbiton\"\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Querying referenced table with inner join\n     * If you don't want to return the referenced table contents, you can leave the parenthesis empty.\n     * Like `.select('name, orchestral_sections!inner()')`.\n     *\n     * @example Querying referenced table with inner join\n     * ```ts\n     * const { data, error } = await supabase\n     *   .from('instruments')\n     *   .select('name, orchestral_sections!inner(name)')\n     *   .eq('orchestral_sections.name', 'woodwinds')\n     *   .limit(1)\n     * ```\n     *\n     * @exampleSql Querying referenced table with inner join\n     * ```sql\n     * create table orchestral_sections (\n     *   \"id\" \"uuid\" primary key default \"extensions\".\"uuid_generate_v4\"() not null,\n     *   \"name\" text\n     * );\n     *\n     * create table instruments (\n     *   \"id\" \"uuid\" primary key default \"extensions\".\"uuid_generate_v4\"() not null,\n     *   \"name\" text,\n     *   \"section_id\" \"uuid\" references public.orchestral_sections on delete cascade\n     * );\n     *\n     * with section as (\n     *   insert into orchestral_sections (name)\n     *   values ('woodwinds') returning id\n     * )\n     * insert into instruments (name, section_id) values\n     * ('flute', (select id from section)),\n     * ('clarinet', (select id from section)),\n     * ('bassoon', (select id from section)),\n     * ('piccolo', (select id from section));\n     * ```\n     *\n     * @exampleResponse Querying referenced table with inner join\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"name\": \"flute\",\n     *       \"orchestral_sections\": {\"name\": \"woodwinds\"}\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n     *\n     * @exampleDescription Switching schemas per query\n     * In addition to setting the schema during initialization, you can also switch schemas on a per-query basis.\n     * Make sure you've set up your [database privileges and API settings](/docs/guides/api/using-custom-schemas).\n     *\n     * @example Switching schemas per query\n     * ```ts\n     * const { data, error } = await supabase\n     *   .schema('myschema')\n     *   .from('mytable')\n     *   .select()\n     * ```\n     *\n     * @exampleSql Switching schemas per query\n     * ```sql\n     * create schema myschema;\n     *\n     * create table myschema.mytable (\n     *   id uuid primary key default gen_random_uuid(),\n     *   data text\n     * );\n     *\n     * insert into myschema.mytable (data) values ('mydata');\n     * ```\n     *\n     * @exampleResponse Switching schemas per query\n     * ```json\n     * {\n     *   \"data\": [\n     *     {\n     *       \"id\": \"4162e008-27b0-4c0f-82dc-ccaeee9a624d\",\n     *       \"data\": \"mydata\"\n     *     }\n     *   ],\n     *   \"status\": 200,\n     *   \"statusText\": \"OK\"\n     * }\n     * ```\n       */\n  select<\n    Query extends string = '*',\n    ResultOne = GetResult<\n      Schema,\n      Relation['Row'],\n      RelationName,\n      Relationships,\n      Query,\n      ClientOptions\n    >,\n  >(\n    columns?: Query,\n    options?: {\n      head?: boolean\n      count?: 'exact' | 'planned' | 'estimated' | (string & {})\n    }\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Relation['Row'],\n    ResultOne[],\n    RelationName,\n    Relationships,\n    'GET'\n  > {\n    const { head = false, count } = options ?? {}\n\n    const method = head ? 'HEAD' : 'GET'\n    // Remove whitespaces except when quoted\n    let quoted = false\n    const cleanedColumns = (columns ?? '*')\n      .split('')\n      .map((c) => {\n        if (/\\s/.test(c) && !quoted) {\n          return ''\n        }\n        if (c === '\"') {\n          quoted = !quoted\n        }\n        return c\n      })\n      .join('')\n\n    const { url, headers } = this.cloneRequestState()\n    url.searchParams.set('select', cleanedColumns)\n\n    if (count) {\n      headers.append('Prefer', `count=${count}`)\n    }\n\n    return new PostgrestFilterBuilder({\n      method,\n      url,\n      headers,\n      schema: this.schema,\n      fetch: this.fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n\n  /**\n   * Perform an INSERT into the table or view.\n   *\n   * By default, inserted rows are not returned. To return it, chain the call\n   * with `.select()`.\n   *\n   * @param values - The values to insert. Pass an object to insert a single row\n   * or an array to insert multiple rows.\n   *\n   * @param options - Named parameters\n   *\n   * @param options.count - Count algorithm to use to count inserted rows.\n   *\n   * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n   * hood.\n   *\n   * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n   * statistics under the hood.\n   *\n   * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n   * numbers.\n   *\n   * @param options.defaultToNull - Make missing fields default to `null`.\n   * Otherwise, use the default value for the column. Only applies for bulk\n   * inserts.\n   *\n   * @category Database\n   *\n   * @example Create a record\n   * ```ts\n   * const { error } = await supabase\n   *   .from('countries')\n   *   .insert({ id: 1, name: 'Mordor' })\n   * ```\n   *\n   * @exampleSql Create a record\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   * ```\n   *\n   * @exampleResponse Create a record\n   * ```json\n   * {\n   *   \"status\": 201,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   *\n   * @exampleDescription Handling errors\n   * `error.hint` from Postgres often contains the actionable fix (e.g. `\"Grant the required privileges to the current role with: GRANT INSERT ON public.countries TO anon;\"` for a `42501` permission-denied error). Log the full `error` object so it isn't hidden behind `error.message`.\n   *\n   * @example Handling errors\n   * ```js\n   * const { error } = await supabase.from('countries').insert({ id: 1, name: 'Mordor' })\n   * if (error) console.error(error)\n   * ```\n   *\n   * @example Create a record and return it\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('countries')\n   *   .insert({ id: 1, name: 'Mordor' })\n   *   .select()\n   * ```\n   *\n   * @exampleSql Create a record and return it\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   * ```\n   *\n   * @exampleResponse Create a record and return it\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Mordor\"\n   *     }\n   *   ],\n   *   \"status\": 201,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   *\n   * @exampleDescription Bulk create\n   * A bulk create operation is handled in a single transaction.\n   * If any of the inserts fail, none of the rows are inserted.\n   *\n   * @example Bulk create\n   * ```ts\n   * const { error } = await supabase\n   *   .from('countries')\n   *   .insert([\n   *     { id: 1, name: 'Mordor' },\n   *     { id: 1, name: 'The Shire' },\n   *   ])\n   * ```\n   *\n   * @exampleSql Bulk create\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   * ```\n   *\n   * @exampleResponse Bulk create\n   * ```json\n   * {\n   *   \"error\": {\n   *     \"code\": \"23505\",\n   *     \"details\": \"Key (id)=(1) already exists.\",\n   *     \"hint\": null,\n   *     \"message\": \"duplicate key value violates unique constraint \\\"countries_pkey\\\"\"\n   *   },\n   *   \"status\": 409,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   */\n  insert<Row extends Relation extends { Insert: unknown } ? Relation['Insert'] : never>(\n    values:\n      | RejectExcessProperties<\n          Relation extends { Insert: unknown } ? Relation['Insert'] : never,\n          Row\n        >\n      | RejectExcessProperties<\n          Relation extends { Insert: unknown } ? Relation['Insert'] : never,\n          Row\n        >[],\n    {\n      count,\n      defaultToNull = true,\n    }: {\n      count?: 'exact' | 'planned' | 'estimated' | (string & {})\n      defaultToNull?: boolean\n    } = {}\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Relation['Row'],\n    null,\n    RelationName,\n    Relationships,\n    'POST'\n  > {\n    const method = 'POST'\n    const { url, headers } = this.cloneRequestState()\n\n    if (count) {\n      headers.append('Prefer', `count=${count}`)\n    }\n    if (!defaultToNull) {\n      headers.append('Prefer', `missing=default`)\n    }\n\n    if (Array.isArray(values)) {\n      const columns = values.reduce((acc, x) => acc.concat(Object.keys(x)), [] as string[])\n      if (columns.length > 0) {\n        const uniqueColumns = [...new Set(columns)].map((column) => `\"${column}\"`)\n        url.searchParams.set('columns', uniqueColumns.join(','))\n      }\n    }\n\n    return new PostgrestFilterBuilder({\n      method,\n      url,\n      headers,\n      schema: this.schema,\n      body: values,\n      fetch: this.fetch ?? fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n\n  /**\n   * Perform an UPSERT on the table or view. Depending on the column(s) passed\n   * to `onConflict`, `.upsert()` allows you to perform the equivalent of\n   * `.insert()` if a row with the corresponding `onConflict` columns doesn't\n   * exist, or if it does exist, perform an alternative action depending on\n   * `ignoreDuplicates`.\n   *\n   * By default, upserted rows are not returned. To return it, chain the call\n   * with `.select()`.\n   *\n   * @param values - The values to upsert with. Pass an object to upsert a\n   * single row or an array to upsert multiple rows.\n   *\n   * @param options - Named parameters\n   *\n   * @param options.onConflict - Comma-separated UNIQUE column(s) to specify how\n   * duplicate rows are determined. Two rows are duplicates if all the\n   * `onConflict` columns are equal.\n   *\n   * @param options.ignoreDuplicates - If `true`, duplicate rows are ignored. If\n   * `false`, duplicate rows are merged with existing rows.\n   *\n   * @param options.count - Count algorithm to use to count upserted rows.\n   *\n   * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n   * hood.\n   *\n   * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n   * statistics under the hood.\n   *\n   * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n   * numbers.\n   *\n   * @param options.defaultToNull - Make missing fields default to `null`.\n   * Otherwise, use the default value for the column. This only applies when\n   * inserting new rows, not when merging with existing rows under\n   * `ignoreDuplicates: false`. This also only applies when doing bulk upserts.\n   *\n   * @example Upsert a single row using a unique key\n   * ```ts\n   * // Upserting a single row, overwriting based on the 'username' unique column\n   * const { data, error } = await supabase\n   *   .from('users')\n   *   .upsert({ username: 'supabot' }, { onConflict: 'username' })\n   *\n   * // Example response:\n   * // {\n   * //   data: [\n   * //     { id: 4, message: 'bar', username: 'supabot' }\n   * //   ],\n   * //   error: null\n   * // }\n   * ```\n   *\n   * @example Upsert with conflict resolution and exact row counting\n   * ```ts\n   * // Upserting and returning exact count\n   * const { data, error, count } = await supabase\n   *   .from('users')\n   *   .upsert(\n   *     {\n   *       id: 3,\n   *       message: 'foo',\n   *       username: 'supabot'\n   *     },\n   *     {\n   *       onConflict: 'username',\n   *       count: 'exact'\n   *     }\n   *   )\n   *\n   * // Example response:\n   * // {\n   * //   data: [\n   * //     {\n   * //       id: 42,\n   * //       handle: \"saoirse\",\n   * //       display_name: \"Saoirse\"\n   * //     }\n   * //   ],\n   * //   count: 1,\n   * //   error: null\n   * // }\n   * ```\n   *\n   * @category Database\n   *\n   * @remarks\n   * - Primary keys must be included in `values` to use upsert.\n   *\n   * @example Upsert your data\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('instruments')\n   *   .upsert({ id: 1, name: 'piano' })\n   *   .select()\n   * ```\n   *\n   * @exampleSql Upsert your data\n   * ```sql\n   * create table\n   *   instruments (id int8 primary key, name text);\n   *\n   * insert into\n   *   instruments (id, name)\n   * values\n   *   (1, 'harpsichord');\n   * ```\n   *\n   * @exampleResponse Upsert your data\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"piano\"\n   *     }\n   *   ],\n   *   \"status\": 201,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   *\n   * @exampleDescription Handling errors\n   * `error.hint` from Postgres often contains the actionable fix (e.g. `\"Grant the required privileges to the current role with: GRANT INSERT, UPDATE ON public.instruments TO anon;\"` for a `42501` permission-denied error). Log the full `error` object so it isn't hidden behind `error.message`.\n   *\n   * @example Handling errors\n   * ```js\n   * const { data, error } = await supabase.from('instruments').upsert({ id: 1, name: 'piano' }).select()\n   * if (error) console.error(error)\n   * ```\n   *\n   * @example Bulk Upsert your data\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('instruments')\n   *   .upsert([\n   *     { id: 1, name: 'piano' },\n   *     { id: 2, name: 'harp' },\n   *   ])\n   *   .select()\n   * ```\n   *\n   * @exampleSql Bulk Upsert your data\n   * ```sql\n   * create table\n   *   instruments (id int8 primary key, name text);\n   *\n   * insert into\n   *   instruments (id, name)\n   * values\n   *   (1, 'harpsichord');\n   * ```\n   *\n   * @exampleResponse Bulk Upsert your data\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"piano\"\n   *     },\n   *     {\n   *       \"id\": 2,\n   *       \"name\": \"harp\"\n   *     }\n   *   ],\n   *   \"status\": 201,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   *\n   * @exampleDescription Upserting into tables with constraints\n   * In the following query, `upsert()` implicitly uses the `id`\n   * (primary key) column to determine conflicts. If there is no existing\n   * row with the same `id`, `upsert()` inserts a new row, which\n   * will fail in this case as there is already a row with `handle` `\"saoirse\"`.\n   * Using the `onConflict` option, you can instruct `upsert()` to use\n   * another column with a unique constraint to determine conflicts.\n   *\n   * @example Upserting into tables with constraints\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('users')\n   *   .upsert({ id: 42, handle: 'saoirse', display_name: 'Saoirse' })\n   *   .select()\n   * ```\n   *\n   * @exampleSql Upserting into tables with constraints\n   * ```sql\n   * create table\n   *   users (\n   *     id int8 generated by default as identity primary key,\n   *     handle text not null unique,\n   *     display_name text\n   *   );\n   *\n   * insert into\n   *   users (id, handle, display_name)\n   * values\n   *   (1, 'saoirse', null);\n   * ```\n   *\n   * @exampleResponse Upserting into tables with constraints\n   * ```json\n   * {\n   *   \"error\": {\n   *     \"code\": \"23505\",\n   *     \"details\": \"Key (handle)=(saoirse) already exists.\",\n   *     \"hint\": null,\n   *     \"message\": \"duplicate key value violates unique constraint \\\"users_handle_key\\\"\"\n   *   },\n   *   \"status\": 409,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   */\n\n  upsert<Row extends Relation extends { Insert: unknown } ? Relation['Insert'] : never>(\n    values:\n      | RejectExcessProperties<\n          Relation extends { Insert: unknown } ? Relation['Insert'] : never,\n          Row\n        >\n      | RejectExcessProperties<\n          Relation extends { Insert: unknown } ? Relation['Insert'] : never,\n          Row\n        >[],\n    {\n      onConflict,\n      ignoreDuplicates = false,\n      count,\n      defaultToNull = true,\n    }: {\n      onConflict?: string\n      ignoreDuplicates?: boolean\n      count?: 'exact' | 'planned' | 'estimated' | (string & {})\n      defaultToNull?: boolean\n    } = {}\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Relation['Row'],\n    null,\n    RelationName,\n    Relationships,\n    'POST'\n  > {\n    const method = 'POST'\n    const { url, headers } = this.cloneRequestState()\n\n    headers.append('Prefer', `resolution=${ignoreDuplicates ? 'ignore' : 'merge'}-duplicates`)\n\n    if (onConflict !== undefined) url.searchParams.set('on_conflict', onConflict)\n    if (count) {\n      headers.append('Prefer', `count=${count}`)\n    }\n    if (!defaultToNull) {\n      headers.append('Prefer', 'missing=default')\n    }\n\n    if (Array.isArray(values)) {\n      const columns = values.reduce((acc, x) => acc.concat(Object.keys(x)), [] as string[])\n      if (columns.length > 0) {\n        const uniqueColumns = [...new Set(columns)].map((column) => `\"${column}\"`)\n        url.searchParams.set('columns', uniqueColumns.join(','))\n      }\n    }\n\n    return new PostgrestFilterBuilder({\n      method,\n      url,\n      headers,\n      schema: this.schema,\n      body: values,\n      fetch: this.fetch ?? fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n\n  /**\n   * Perform an UPDATE on the table or view.\n   *\n   * By default, updated rows are not returned. To return it, chain the call\n   * with `.select()` after filters.\n   *\n   * @param values - The values to update with\n   *\n   * @param options - Named parameters\n   *\n   * @param options.count - Count algorithm to use to count updated rows.\n   *\n   * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n   * hood.\n   *\n   * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n   * statistics under the hood.\n   *\n   * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n   * numbers.\n   *\n   * @category Database\n   *\n   * @remarks\n   * - `update()` should always be combined with [Filters](/docs/reference/javascript/using-filters) to target the item(s) you wish to update.\n   *\n   * @example Updating your data\n   * ```ts\n   * const { error } = await supabase\n   *   .from('instruments')\n   *   .update({ name: 'piano' })\n   *   .eq('id', 1)\n   * ```\n   *\n   * @exampleSql Updating your data\n   * ```sql\n   * create table\n   *   instruments (id int8 primary key, name text);\n   *\n   * insert into\n   *   instruments (id, name)\n   * values\n   *   (1, 'harpsichord');\n   * ```\n   *\n   * @exampleResponse Updating your data\n   * ```json\n   * {\n   *   \"status\": 204,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   *\n   * @exampleDescription Handling errors\n   * `error.hint` from Postgres often contains the actionable fix (e.g. `\"Grant the required privileges to the current role with: GRANT UPDATE ON public.instruments TO anon;\"` for a `42501` permission-denied error). Log the full `error` object so it isn't hidden behind `error.message`.\n   *\n   * @example Handling errors\n   * ```js\n   * const { error } = await supabase.from('instruments').update({ name: 'piano' }).eq('id', 1)\n   * if (error) console.error(error)\n   * ```\n   *\n   * @example Update a record and return it\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('instruments')\n   *   .update({ name: 'piano' })\n   *   .eq('id', 1)\n   *   .select()\n   * ```\n   *\n   * @exampleSql Update a record and return it\n   * ```sql\n   * create table\n   *   instruments (id int8 primary key, name text);\n   *\n   * insert into\n   *   instruments (id, name)\n   * values\n   *   (1, 'harpsichord');\n   * ```\n   *\n   * @exampleResponse Update a record and return it\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"piano\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription Updating JSON data\n   * Postgres offers some\n   * [operators](/docs/guides/database/json#query-the-jsonb-data) for\n   * working with JSON data. Currently, it is only possible to update the entire JSON document.\n   *\n   * @example Updating JSON data\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('users')\n   *   .update({\n   *     address: {\n   *       street: 'Melrose Place',\n   *       postcode: 90210\n   *     }\n   *   })\n   *   .eq('address->postcode', 90210)\n   *   .select()\n   * ```\n   *\n   * @exampleSql Updating JSON data\n   * ```sql\n   * create table\n   *   users (\n   *     id int8 primary key,\n   *     name text,\n   *     address jsonb\n   *   );\n   *\n   * insert into\n   *   users (id, name, address)\n   * values\n   *   (1, 'Michael', '{ \"postcode\": 90210 }');\n   * ```\n   *\n   * @exampleResponse Updating JSON data\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Michael\",\n   *       \"address\": {\n   *         \"street\": \"Melrose Place\",\n   *         \"postcode\": 90210\n   *       }\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  update<Row extends Relation extends { Update: unknown } ? Relation['Update'] : never>(\n    values: RejectExcessProperties<\n      Relation extends { Update: unknown } ? Relation['Update'] : never,\n      Row\n    >,\n    {\n      count,\n    }: {\n      count?: 'exact' | 'planned' | 'estimated' | (string & {})\n    } = {}\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Relation['Row'],\n    null,\n    RelationName,\n    Relationships,\n    'PATCH'\n  > {\n    const method = 'PATCH'\n    const { url, headers } = this.cloneRequestState()\n\n    if (count) {\n      headers.append('Prefer', `count=${count}`)\n    }\n\n    return new PostgrestFilterBuilder({\n      method,\n      url,\n      headers,\n      schema: this.schema,\n      body: values,\n      fetch: this.fetch ?? fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n\n  /**\n   * Perform a DELETE on the table or view.\n   *\n   * By default, deleted rows are not returned. To return it, chain the call\n   * with `.select()` after filters.\n   *\n   * @param options - Named parameters\n   *\n   * @param options.count - Count algorithm to use to count deleted rows.\n   *\n   * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n   * hood.\n   *\n   * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n   * statistics under the hood.\n   *\n   * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n   * numbers.\n   *\n   * @category Database\n   *\n   * @remarks\n   * - `delete()` should always be combined with [filters](/docs/reference/javascript/using-filters) to target the item(s) you wish to delete.\n   * - If you use `delete()` with filters and you have\n   *   [RLS](/docs/learn/auth-deep-dive/auth-row-level-security) enabled, only\n   *   rows visible through `SELECT` policies are deleted. Note that by default\n   *   no rows are visible, so you need at least one `SELECT`/`ALL` policy that\n   *   makes the rows visible.\n   * - When using `delete().in()`, specify an array of values to target multiple rows with a single query. This is particularly useful for batch deleting entries that share common criteria, such as deleting users by their IDs. Ensure that the array you provide accurately represents all records you intend to delete to avoid unintended data removal.\n   *\n   * @example Delete a single record\n   * ```ts\n   * const response = await supabase\n   *   .from('countries')\n   *   .delete()\n   *   .eq('id', 1)\n   * ```\n   *\n   * @exampleSql Delete a single record\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   *\n   * insert into\n   *   countries (id, name)\n   * values\n   *   (1, 'Mordor');\n   * ```\n   *\n   * @exampleResponse Delete a single record\n   * ```json\n   * {\n   *   \"status\": 204,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   *\n   * @exampleDescription Handling errors\n   * `error.hint` from Postgres often contains the actionable fix (e.g. `\"Grant the required privileges to the current role with: GRANT DELETE ON public.countries TO anon;\"` for a `42501` permission-denied error). Log the full `error` object so it isn't hidden behind `error.message`.\n   *\n   * @example Handling errors\n   * ```js\n   * const { error } = await supabase.from('countries').delete().eq('id', 1)\n   * if (error) console.error(error)\n   * ```\n   *\n   * @example Delete a record and return it\n   * ```ts\n   * const { data, error } = await supabase\n   *   .from('countries')\n   *   .delete()\n   *   .eq('id', 1)\n   *   .select()\n   * ```\n   *\n   * @exampleSql Delete a record and return it\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   *\n   * insert into\n   *   countries (id, name)\n   * values\n   *   (1, 'Mordor');\n   * ```\n   *\n   * @exampleResponse Delete a record and return it\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"id\": 1,\n   *       \"name\": \"Mordor\"\n   *     }\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example Delete multiple records\n   * ```ts\n   * const response = await supabase\n   *   .from('countries')\n   *   .delete()\n   *   .in('id', [1, 2, 3])\n   * ```\n   *\n   * @exampleSql Delete multiple records\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   *\n   * insert into\n   *   countries (id, name)\n   * values\n   *   (1, 'Rohan'), (2, 'The Shire'), (3, 'Mordor');\n   * ```\n   *\n   * @exampleResponse Delete multiple records\n   * ```json\n   * {\n   *   \"status\": 204,\n   *   \"statusText\": \"\"\n   * }\n   * ```\n   */\n  delete({\n    count,\n  }: {\n    count?: 'exact' | 'planned' | 'estimated' | (string & {})\n  } = {}): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    Relation['Row'],\n    null,\n    RelationName,\n    Relationships,\n    'DELETE'\n  > {\n    const method = 'DELETE'\n    const { url, headers } = this.cloneRequestState()\n\n    if (count) {\n      headers.append('Prefer', `count=${count}`)\n    }\n\n    return new PostgrestFilterBuilder({\n      method,\n      url,\n      headers,\n      schema: this.schema,\n      fetch: this.fetch ?? fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n}\n","import PostgrestQueryBuilder from './PostgrestQueryBuilder'\nimport PostgrestFilterBuilder from './PostgrestFilterBuilder'\nimport { Fetch, GenericSchema, ClientServerOptions } from './types/common/common'\nimport { GetRpcFunctionFilterBuilderByArgs } from './types/common/rpc'\n\n/**\n * PostgREST client.\n *\n * @typeParam Database - Types for the schema from the [type\n * generator](https://supabase.com/docs/reference/javascript/next/typescript-support)\n *\n * @typeParam SchemaName - Postgres schema to switch to. Must be a string\n * literal, the same one passed to the constructor. If the schema is not\n * `\"public\"`, this must be supplied manually.\n */\nexport default class PostgrestClient<\n  Database = any,\n  ClientOptions extends ClientServerOptions = Database extends {\n    __InternalSupabase: infer I extends ClientServerOptions\n  }\n    ? I\n    : {},\n  SchemaName extends string & keyof Omit<Database, '__InternalSupabase'> =\n    'public' extends keyof Omit<Database, '__InternalSupabase'>\n      ? 'public'\n      : string & keyof Omit<Database, '__InternalSupabase'>,\n  Schema extends GenericSchema = Omit<\n    Database,\n    '__InternalSupabase'\n  >[SchemaName] extends GenericSchema\n    ? Omit<Database, '__InternalSupabase'>[SchemaName]\n    : any,\n> {\n  url: string\n  headers: Headers\n  schemaName?: SchemaName\n  fetch?: Fetch\n  urlLengthLimit: number\n\n  // Retry configuration - enabled by default\n  retry?: boolean\n\n  // TODO: Add back shouldThrowOnError once we figure out the typings\n  /**\n   * Creates a PostgREST client.\n   *\n   * @param url - URL of the PostgREST endpoint\n   * @param options - Named parameters\n   * @param options.headers - Custom headers\n   * @param options.schema - Postgres schema to switch to\n   * @param options.fetch - Custom fetch\n   * @param options.timeout - Optional timeout in milliseconds for all requests. When set, requests will automatically abort after this duration to prevent indefinite hangs.\n   * @param options.urlLengthLimit - Maximum URL length in characters before warnings/errors are triggered. Defaults to 8000.\n   * @param options.retry - Enable or disable automatic retries for transient errors.\n   *   When enabled, idempotent requests (GET, HEAD, OPTIONS) that fail with network\n   *   errors or HTTP 503/520 responses will be automatically retried up to 3 times\n   *   with exponential backoff (1s, 2s, 4s). Defaults to `true`.\n   * @example Using supabase-js (recommended)\n   * ```ts\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const { data, error } = await supabase.from('profiles').select('*')\n   * ```\n   *\n   * @category Database\n   *\n   * @remarks\n   * - A `timeout` option (in milliseconds) can be set to automatically abort requests that take too long.\n   * - A `urlLengthLimit` option (default: 8000) can be set to control when URL length warnings are included in error messages for aborted requests.\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```ts\n   * import { PostgrestClient } from '@supabase/postgrest-js'\n   *\n   * const postgrest = new PostgrestClient('https://xyzcompany.supabase.co/rest/v1', {\n   *   headers: { apikey: 'your-publishable-key' },\n   *   schema: 'public',\n   *   timeout: 30000, // 30 second timeout\n   * })\n   * ```\n   */\n  constructor(\n    url: string,\n    {\n      headers = {},\n      schema,\n      fetch,\n      timeout,\n      urlLengthLimit = 8000,\n      retry,\n    }: {\n      headers?: HeadersInit\n      schema?: SchemaName\n      fetch?: Fetch\n      timeout?: number\n      urlLengthLimit?: number\n      retry?: boolean\n    } = {}\n  ) {\n    this.url = url\n    this.headers = new Headers(headers)\n    this.schemaName = schema\n    this.urlLengthLimit = urlLengthLimit\n\n    const originalFetch = fetch ?? globalThis.fetch\n\n    // Wrap fetch with timeout if specified\n    if (timeout !== undefined && timeout > 0) {\n      this.fetch = (input, init) => {\n        const controller = new AbortController()\n        const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n        // Merge abort signals if one already exists\n        const existingSignal = init?.signal\n        if (existingSignal) {\n          // If the existing signal is already aborted, use it directly\n          if (existingSignal.aborted) {\n            clearTimeout(timeoutId)\n            return originalFetch(input, init)\n          }\n\n          // Listen to existing signal and abort our controller too\n          const abortHandler = () => {\n            clearTimeout(timeoutId)\n            controller.abort()\n          }\n          existingSignal.addEventListener('abort', abortHandler, { once: true })\n\n          return originalFetch(input, {\n            ...init,\n            signal: controller.signal,\n          }).finally(() => {\n            clearTimeout(timeoutId)\n            existingSignal.removeEventListener('abort', abortHandler)\n          })\n        }\n\n        return originalFetch(input, {\n          ...init,\n          signal: controller.signal,\n        }).finally(() => clearTimeout(timeoutId))\n      }\n    } else {\n      this.fetch = originalFetch\n    }\n    this.retry = retry\n  }\n  /**\n   * Perform a query on a table or a view.\n   *\n   * @param relation - The table or view name to query\n   *\n   * @category Database\n   */\n  from<\n    TableName extends string & keyof Schema['Tables'],\n    Table extends Schema['Tables'][TableName],\n  >(relation: TableName): PostgrestQueryBuilder<ClientOptions, Schema, Table, TableName>\n  from<ViewName extends string & keyof Schema['Views'], View extends Schema['Views'][ViewName]>(\n    relation: ViewName\n  ): PostgrestQueryBuilder<ClientOptions, Schema, View, ViewName>\n  from(\n    relation: (string & keyof Schema['Tables']) | (string & keyof Schema['Views'])\n  ): PostgrestQueryBuilder<ClientOptions, Schema, any, any> {\n    if (!relation || typeof relation !== 'string' || relation.trim() === '') {\n      throw new Error('Invalid relation name: relation must be a non-empty string.')\n    }\n\n    const url = new URL(`${this.url}/${relation}`)\n    return new PostgrestQueryBuilder(url, {\n      headers: new Headers(this.headers),\n      schema: this.schemaName,\n      fetch: this.fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n\n  /**\n   * Select a schema to query or perform an function (rpc) call.\n   *\n   * The schema needs to be on the list of exposed schemas inside Supabase.\n   *\n   * @param schema - The schema to query\n   *\n   * @category Database\n   */\n  schema<DynamicSchema extends string & keyof Omit<Database, '__InternalSupabase'>>(\n    schema: DynamicSchema\n  ): PostgrestClient<\n    Database,\n    ClientOptions,\n    DynamicSchema,\n    Database[DynamicSchema] extends GenericSchema ? Database[DynamicSchema] : any\n  > {\n    return new PostgrestClient(this.url, {\n      headers: this.headers,\n      schema,\n      fetch: this.fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n\n  /**\n   * Perform a function call.\n   *\n   * @param fn - The function name to call\n   * @param args - The arguments to pass to the function call\n   * @param options - Named parameters\n   * @param options.head - When set to `true`, `data` will not be returned.\n   * Useful if you only need the count.\n   * @param options.get - When set to `true`, the function will be called with\n   * read-only access mode.\n   * @param options.count - Count algorithm to use to count rows returned by the\n   * function. Only applicable for [set-returning\n   * functions](https://www.postgresql.org/docs/current/functions-srf.html).\n   *\n   * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n   * hood.\n   *\n   * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n   * statistics under the hood.\n   *\n   * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n   * numbers.\n   *\n   * @example\n   * ```ts\n   * // For cross-schema functions where type inference fails, use overrideTypes:\n   * const { data } = await supabase\n   *   .schema('schema_b')\n   *   .rpc('function_a', {})\n   *   .overrideTypes<{ id: string; user_id: string }[]>()\n   * ```\n   *\n   * @category Database\n   *\n   * @example Call a Postgres function without arguments\n   * ```ts\n   * const { data, error } = await supabase.rpc('hello_world')\n   * ```\n   *\n   * @exampleSql Call a Postgres function without arguments\n   * ```sql\n   * create function hello_world() returns text as $$\n   *   select 'Hello world';\n   * $$ language sql;\n   * ```\n   *\n   * @exampleResponse Call a Postgres function without arguments\n   * ```json\n   * {\n   *   \"data\": \"Hello world\",\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example Call a Postgres function with arguments\n   * ```ts\n   * const { data, error } = await supabase.rpc('echo', { say: '👋' })\n   * ```\n   *\n   * @exampleSql Call a Postgres function with arguments\n   * ```sql\n   * create function echo(say text) returns text as $$\n   *   select say;\n   * $$ language sql;\n   * ```\n   *\n   * @exampleResponse Call a Postgres function with arguments\n   * ```json\n   *   {\n   *     \"data\": \"👋\",\n   *     \"status\": 200,\n   *     \"statusText\": \"OK\"\n   *   }\n   *\n   * ```\n   *\n   * @exampleDescription Bulk processing\n   * You can process large payloads by passing in an array as an argument.\n   *\n   * @example Bulk processing\n   * ```ts\n   * const { data, error } = await supabase.rpc('add_one_each', { arr: [1, 2, 3] })\n   * ```\n   *\n   * @exampleSql Bulk processing\n   * ```sql\n   * create function add_one_each(arr int[]) returns int[] as $$\n   *   select array_agg(n + 1) from unnest(arr) as n;\n   * $$ language sql;\n   * ```\n   *\n   * @exampleResponse Bulk processing\n   * ```json\n   * {\n   *   \"data\": [\n   *     2,\n   *     3,\n   *     4\n   *   ],\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @exampleDescription Call a Postgres function with filters\n   * Postgres functions that return tables can also be combined with [Filters](/docs/reference/javascript/using-filters) and [Modifiers](/docs/reference/javascript/using-modifiers).\n   *\n   * @example Call a Postgres function with filters\n   * ```ts\n   * const { data, error } = await supabase\n   *   .rpc('list_stored_countries')\n   *   .eq('id', 1)\n   *   .single()\n   * ```\n   *\n   * @exampleSql Call a Postgres function with filters\n   * ```sql\n   * create table\n   *   countries (id int8 primary key, name text);\n   *\n   * insert into\n   *   countries (id, name)\n   * values\n   *   (1, 'Rohan'),\n   *   (2, 'The Shire');\n   *\n   * create function list_stored_countries() returns setof countries as $$\n   *   select * from countries;\n   * $$ language sql;\n   * ```\n   *\n   * @exampleResponse Call a Postgres function with filters\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"id\": 1,\n   *     \"name\": \"Rohan\"\n   *   },\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   *\n   * @example Call a read-only Postgres function\n   * ```ts\n   * const { data, error } = await supabase.rpc('hello_world', undefined, { get: true })\n   * ```\n   *\n   * @exampleSql Call a read-only Postgres function\n   * ```sql\n   * create function hello_world() returns text as $$\n   *   select 'Hello world';\n   * $$ language sql;\n   * ```\n   *\n   * @exampleResponse Call a read-only Postgres function\n   * ```json\n   * {\n   *   \"data\": \"Hello world\",\n   *   \"status\": 200,\n   *   \"statusText\": \"OK\"\n   * }\n   * ```\n   */\n  rpc<\n    FnName extends string & keyof Schema['Functions'],\n    Args extends Schema['Functions'][FnName]['Args'] = never,\n    FilterBuilder extends GetRpcFunctionFilterBuilderByArgs<Schema, FnName, Args> =\n      GetRpcFunctionFilterBuilderByArgs<Schema, FnName, Args>,\n  >(\n    fn: FnName,\n    args: Args = {} as Args,\n    {\n      head = false,\n      get = false,\n      count,\n    }: {\n      head?: boolean\n      get?: boolean\n      count?: 'exact' | 'planned' | 'estimated' | (string & {})\n    } = {}\n  ): PostgrestFilterBuilder<\n    ClientOptions,\n    Schema,\n    FilterBuilder['Row'],\n    FilterBuilder['Result'],\n    FilterBuilder['RelationName'],\n    FilterBuilder['Relationships'],\n    'RPC'\n  > {\n    let method: 'HEAD' | 'GET' | 'POST'\n    const url = new URL(`${this.url}/rpc/${fn}`)\n    let body: unknown | undefined\n    // objects/arrays-of-objects can't be serialized to URL params, use POST + return=minimal instead\n    const _isObject = (v: unknown): boolean =>\n      v !== null && typeof v === 'object' && (!Array.isArray(v) || v.some(_isObject))\n    const _hasObjectArg = head && Object.values(args as object).some(_isObject)\n    if (_hasObjectArg) {\n      method = 'POST'\n      body = args\n    } else if (head || get) {\n      method = head ? 'HEAD' : 'GET'\n      Object.entries(args)\n        // params with undefined value needs to be filtered out, otherwise it'll\n        // show up as `?param=undefined`\n        .filter(([_, value]) => value !== undefined)\n        // array values need special syntax\n        .map(([name, value]) => [name, Array.isArray(value) ? `{${value.join(',')}}` : `${value}`])\n        .forEach(([name, value]) => {\n          url.searchParams.append(name, value)\n        })\n    } else {\n      method = 'POST'\n      body = args\n    }\n\n    const headers = new Headers(this.headers)\n    if (_hasObjectArg) {\n      headers.set('Prefer', count ? `count=${count},return=minimal` : 'return=minimal')\n    } else if (count) {\n      headers.set('Prefer', `count=${count}`)\n    }\n\n    return new PostgrestFilterBuilder({\n      method,\n      url,\n      headers,\n      schema: this.schemaName,\n      body,\n      fetch: this.fetch ?? fetch,\n      urlLengthLimit: this.urlLengthLimit,\n      retry: this.retry,\n    })\n  }\n}\n","/**\n * Database 模块封装（#89098）\n *\n * 数据面 `/.cloud/database/rest/**`，PostgREST 语义（设计文档 §6.1）。\n *\n * ============================================================================\n * 为什么有这层 facade，而不是把 vendor 的 PostgrestClient 裸抛给应用\n *\n * 其余三个模块（auth/storage/llm）都在 SDK 侧收一层 facade，公开自命名类型、\n * 藏住 vendor —— database 若独独裸透传，会有两个后果：\n *\n *  1. vendor 类型泄漏。`index.ts` 明确规定不导出 `PostgrestClient` 之类的名字\n *     （泄漏后消费方会写出依赖第三方命名的代码，之后换不掉）。裸抛就等于把\n *     整个 vendor 类型面暴露到公开 d.ts。\n *  2. 入口失控。vendor 的 `.schema()` 能切到任意 schema，但数据面只放行 public\n *     （网关 `provider/tcb/data.go` 的 deniedSchemas 会拒 auth、pg_ 前缀、information_schema）。\n *     裸抛会让应用写出「类型上成立、运行期必被网关拒」的代码。\n *\n * 因此这里收一层**薄** facade：只转发 `from` / `rpc`（保留 vendor builder 的\n * 全部链式与 `{data,error}` 语义，体验对齐 supabase-js），去掉 `.schema()`，\n * 并以自己的泛型入口 `Database` 承接强类型（对齐 supabase 的 createClient<DB>）。\n *\n * 这里**没有自研请求层**，底座仍是 `src/vendor/postgrest`。原因：\n *  - 官方 `@cloudbase/js-sdk` 用不了 —— `getBaseEndPoint` 会把配置值截取到 host，\n *    我们的 `/.cloud/database/rest` 前缀被丢弃（`runtime-auth-design.md` §4.1）。\n *  - vendor 的客户端只把 base URL 当字符串保存，路径原样保留，正是所需行为。\n * ============================================================================\n */\n\nimport { CLOUD_MODULE_PATHS } from '../paths.js';\nimport type { CloudRuntimeConfig } from '../types.js';\nimport { PostgrestClient } from '../vendor/postgrest/index.js';\n\n/**\n * WorkBuddy 数据库模块。PostgREST 语义、`{ data, error }` 信封，\n * 查询构造器与 supabase-js 的 `.from()` 完全一致。\n *\n * 泛型 `Database` 承接 [类型生成器](https://supabase.com/docs/guides/api/rest/generating-types)\n * 产出的 schema 类型，用法与 supabase 的 `createClient<Database>()` 一致；\n * 不传时退化为无类型（`any` Row），运行期行为不变。\n */\nexport class WorkBuddyDatabaseModule<Database = unknown> {\n    /**\n     * 底层 PostgREST 客户端。刻意保持 private —— 对外只暴露 `from` / `rpc`，\n     * 不让 vendor 客户端（及其 `.schema()` 等入口）泄漏到应用。\n     */\n    private readonly client: PostgrestClient<Database>;\n\n    constructor(config: CloudRuntimeConfig, fetch: typeof globalThis.fetch) {\n        // 身份由 `fetch` 携带（publishableKey + 自签 session），所以这里不传 headers ——\n        // 避免出现第二处鉴权注入点。\n        this.client = new PostgrestClient<Database>(\n            `${config.endpoint}${CLOUD_MODULE_PATHS.database}`,\n            { fetch },\n        );\n\n        // 直接把 vendor 的方法引用绑定过来，保留其全部重载与泛型签名\n        // （用 Parameters/ReturnType 包一层会塌掉重载、弱化类型）。\n        // 这是「薄 facade」：只搬 from / rpc 两个入口，不搬 .schema() 等。\n        this.from = this.client.from.bind(this.client);\n        this.rpc = this.client.rpc.bind(this.client);\n    }\n\n    /**\n     * 在一张表或视图上发起查询。返回值即 supabase-js 的查询构造器，\n     * 支持 `select/insert/upsert/update/delete` 及全部 filter/transform 链，\n     * `await` 得到 `{ data, error }`。语义与 supabase-js `.from()` 一致。\n     *\n     * 只放行 public schema —— 不提供 `.schema()` 切换（数据面会拒系统 schema）。\n     */\n    readonly from: PostgrestClient<Database>['from'];\n\n    /**\n     * 调用一个 PostgreSQL 函数（RPC）。语义同 supabase-js `.rpc()`：\n     * 返回可继续 `.select()/.order()/.limit()` 的构造器（集合返回型函数）。\n     */\n    readonly rpc: PostgrestClient<Database>['rpc'];\n\n    /**\n     * 归一化后的数据面基址（`/.cloud/database/rest`，无尾斜杠）。\n     * 仅用于诊断/契约测试；应用不应据此手拼请求。\n     */\n    get url(): string {\n        return this.client.url;\n    }\n}\n\n/**\n * 创建 Database 模块。\n */\nexport function createDatabaseModule<Database = unknown>(\n    config: CloudRuntimeConfig,\n    fetch: typeof globalThis.fetch,\n): WorkBuddyDatabaseModule<Database> {\n    return new WorkBuddyDatabaseModule<Database>(config, fetch);\n}\n","/**\n * CloudOpenAIError — OpenAI-style error for the LLM module (#89098).\n *\n * Shape follows the OpenAI error object:\n *   { error: { message, type, param?, code? } }\n * Plus Genie BaaS extensions: status?, requestId?, retryAfterMs?.\n *\n * Uses the formal package's existing error philosophy: a single typed error\n * class for LLM operations (consistent with how `CloudError` serves the other\n * three modules), while remaining OpenAI-compatible for ergonomic consumption.\n */\n\nexport interface OpenAIErrorObject {\n    message: string;\n    type: string;\n    param: string | null;\n    code: string | null;\n}\n\nexport interface CloudOpenAIErrorInit {\n    /** HTTP response status code (undefined for in-stream errors). */\n    status?: number;\n    /** Server X-Request-Id header. */\n    requestId?: string;\n    /** Parsed Retry-After header in milliseconds. */\n    retryAfterMs?: number;\n    /** Underlying cause (e.g. original TypeError from fetch). */\n    cause?: unknown;\n}\n\n/**\n * Error thrown by all LLM module operations.\n *\n * Both non-2xx HTTP responses and in-stream `event: error` events produce\n * this error. The `error` field always follows the OpenAI error object shape.\n */\nexport class CloudOpenAIError extends Error {\n    readonly error: OpenAIErrorObject;\n    readonly status?: number;\n    readonly requestId?: string;\n    readonly retryAfterMs?: number;\n\n    constructor(\n        error: OpenAIErrorObject | string,\n        init: CloudOpenAIErrorInit = {},\n    ) {\n        const errorObj: OpenAIErrorObject =\n            typeof error === 'string'\n                ? { message: error, type: 'server_error', param: null, code: null }\n                : error;\n        super(errorObj.message);\n        this.name = 'CloudOpenAIError';\n        this.error = errorObj;\n        this.status = init.status;\n        this.requestId = init.requestId;\n        this.retryAfterMs = init.retryAfterMs;\n        if (init.cause !== undefined) {\n            if (!('cause' in this)) {\n                Object.defineProperty(this, 'cause', {\n                    value: init.cause,\n                    writable: false,\n                    enumerable: false,\n                    configurable: false,\n                });\n            }\n        }\n    }\n}\n\n/**\n * Parse Retry-After header value into milliseconds.\n *\n * Supports:\n * - Integer seconds: \"120\"\n * - HTTP-date: \"Wed, 21 Oct 2026 07:28:00 GMT\"\n * Returns undefined if the header is absent or unparseable.\n */\nexport function parseRetryAfter(headerValue: string | null): number | undefined {\n    if (!headerValue) return undefined;\n\n    const trimmed = headerValue.trim();\n\n    // Try integer seconds (most common)\n    const asNum = Number(trimmed);\n    if (!isNaN(asNum) && asNum >= 0 && Number.isInteger(asNum)) {\n        return asNum * 1000;\n    }\n\n    // Try HTTP-date\n    const asDate = Date.parse(trimmed);\n    if (!isNaN(asDate)) {\n        const diff = asDate - Date.now();\n        return diff > 0 ? diff : 0;\n    }\n\n    return undefined;\n}\n","/**\n * LLM Models — GET /.cloud/llm/models (#89098)\n *\n * Fetches the browser-safe public model directory for this application,\n * preserving its explicit public fields for display and selection.\n */\n\nimport { CloudOpenAIError, parseRetryAfter } from './errors.js';\nimport type {\n    PublicLLMModel,\n    PublicModelCapabilities,\n    PublicModelContextWindow,\n    PublicModelModalities,\n    PublicModelPricing,\n    PublicModelReasoning,\n} from './types.js';\n\n/**\n * Raw public model object returned by GenieBaas.\n *\n * camelCase is the current data-plane contract. PascalCase aliases remain only\n * for a rolling upgrade where an older AgentServer may still return Go default\n * JSON field names. Unknown fields are deliberately not surfaced by the SDK.\n */\nexport interface RawLLMModel {\n    ID?: string;\n    id?: string;\n    Name?: string;\n    name?: string;\n    Provider?: string;\n    provider?: string;\n    Vendor?: string;\n    vendor?: string;\n    Family?: string;\n    family?: string;\n    Version?: string;\n    version?: string;\n    Description?: string;\n    description?: string;\n    DescriptionZh?: string;\n    descriptionZh?: string;\n    DescriptionEn?: string;\n    descriptionEn?: string;\n    IconURL?: string;\n    iconUrl?: string;\n    ContextWindow?: number | PublicModelContextWindow;\n    contextWindow?: number | PublicModelContextWindow;\n    MaxInputTokens?: number;\n    maxInputTokens?: number;\n    MaxOutputTokens?: number;\n    maxOutputTokens?: number;\n    Modalities?: PublicModelModalities;\n    modalities?: PublicModelModalities;\n    Capabilities?: PublicModelCapabilities;\n    capabilities?: PublicModelCapabilities;\n    Enabled?: boolean;\n    enabled?: boolean;\n    Disabled?: boolean;\n    disabled?: boolean;\n    IsDefault?: boolean;\n    isDefault?: boolean;\n    SortOrder?: number;\n    sortOrder?: number;\n    Pricing?: PublicModelPricing;\n    pricing?: PublicModelPricing;\n\n    // ── User-specified public fields (aligned with console productConfig) ──\n    Credits?: string;\n    credits?: string;\n    MaxAllowedSize?: number;\n    maxAllowedSize?: number;\n    DisabledMultimodal?: boolean;\n    disabledMultimodal?: boolean;\n    SupportsImages?: boolean;\n    supportsImages?: boolean;\n    SupportsToolCall?: boolean;\n    supportsToolCall?: boolean;\n    SupportsReasoning?: boolean;\n    supportsReasoning?: boolean;\n    OnlyReasoning?: boolean;\n    onlyReasoning?: boolean;\n    Reasoning?: PublicModelReasoning;\n    reasoning?: PublicModelReasoning;\n    Temperature?: number;\n    temperature?: number;\n    // top_k/top_p/repetition_penalty: keep snake_case from productConfig\n    top_k?: number;\n    Top_K?: number;\n    top_p?: number;\n    Top_P?: number;\n    repetition_penalty?: number;\n    Repetition_Penalty?: number;\n}\n\nfunction stringField(...values: unknown[]): string | undefined {\n    return values.find((value): value is string => typeof value === 'string' && value.length > 0);\n}\n\nfunction numberField(...values: unknown[]): number | undefined {\n    return values.find((value): value is number => typeof value === 'number' && Number.isFinite(value));\n}\n\nfunction booleanField(...values: unknown[]): boolean | undefined {\n    return values.find((value): value is boolean => typeof value === 'boolean');\n}\n\n/**\n * Normalize the contextWindow controlled union (number | object).\n *\n * The upstream product contract allows both a plain number and an object\n * form (`ModelContextWindow`). This must be handled at runtime — relying on\n * TS type erasure would silently drop the object form like the previous\n * number-only filter did.\n *\n * - number (finite): kept as-is.\n * - object: kept with `supportedLengths` / `defaultLength` validated, and\n *   unknown sub-fields preserved as-is for forward compatibility (matching\n *   the GenieBaas pass-through contract). Special keys such as a JSON-parsed\n *   `__proto__` are preserved as own enumerable properties and never rewrite\n *   the result object's prototype.\n * - anything else (string / boolean / array / null / absent): dropped —\n *   the model entry itself is unaffected.\n */\nfunction contextWindowField(...values: unknown[]): number | PublicModelContextWindow | undefined {\n    for (const value of values) {\n        if (typeof value === 'number' && Number.isFinite(value)) {\n            return value;\n        }\n        if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n            return normalizeContextWindowObject(value as Record<string, unknown>);\n        }\n    }\n    return undefined;\n}\n\nfunction normalizeContextWindowObject(raw: Record<string, unknown>): PublicModelContextWindow {\n    const result: PublicModelContextWindow = {};\n    for (const [key, value] of Object.entries(raw)) {\n        if (key === 'supportedLengths') {\n            if (Array.isArray(value)) {\n                result.supportedLengths = value.filter(\n                    (item): item is number => typeof item === 'number' && Number.isFinite(item),\n                );\n            }\n            continue;\n        }\n        if (key === 'defaultLength') {\n            if (typeof value === 'number' && Number.isFinite(value)) {\n                result.defaultLength = value;\n            }\n            continue;\n        }\n        // Unknown sub-fields: preserved as-is for forward compatibility.\n        // defineProperty instead of plain assignment: a JSON-origin key named\n        // `__proto__` (materialized as an own property by JSON.parse) must stay\n        // an own enumerable data property — assignment would instead invoke\n        // Object.prototype's `__proto__` setter and rewrite the result's\n        // prototype (prototype pollution).\n        Object.defineProperty(result, key, {\n            value,\n            writable: true,\n            enumerable: true,\n            configurable: true,\n        });\n    }\n    return result;\n}\n\nfunction modalitiesField(value: unknown): PublicModelModalities | undefined {\n    if (!value || typeof value !== 'object') return undefined;\n    const raw = value as PublicModelModalities;\n    const input = Array.isArray(raw.input) ? raw.input.filter((item): item is string => typeof item === 'string') : undefined;\n    const output = Array.isArray(raw.output) ? raw.output.filter((item): item is string => typeof item === 'string') : undefined;\n    return input?.length || output?.length ? { ...(input?.length ? { input } : {}), ...(output?.length ? { output } : {}) } : undefined;\n}\n\nfunction capabilitiesField(value: unknown): PublicModelCapabilities | undefined {\n    if (!value || typeof value !== 'object') return undefined;\n    const raw = value as PublicModelCapabilities;\n    const entries = Object.entries(raw).filter(([, enabled]) => typeof enabled === 'boolean');\n    return entries.length ? Object.fromEntries(entries) as PublicModelCapabilities : undefined;\n}\n\nfunction pricingField(value: unknown): PublicModelPricing | undefined {\n    if (!value || typeof value !== 'object') return undefined;\n    const raw = value as PublicModelPricing;\n    const pricing: PublicModelPricing = {\n        ...(stringField(raw.currency) ? { currency: raw.currency } : {}),\n        ...(numberField(raw.inputPerMillionTokens) !== undefined ? { inputPerMillionTokens: raw.inputPerMillionTokens } : {}),\n        ...(numberField(raw.outputPerMillionTokens) !== undefined ? { outputPerMillionTokens: raw.outputPerMillionTokens } : {}),\n        ...(stringField(raw.displayText) ? { displayText: raw.displayText } : {}),\n    };\n    return Object.keys(pricing).length ? pricing : undefined;\n}\n\n/**\n * Normalize a raw reasoning object, preserving sparse sub-fields and explicit false/0.\n * Returns undefined only when the object is absent or has no set fields.\n *\n * SupportedEfforts: when the raw value is an array (including []), the result\n * includes `supportedEfforts` with the filtered string array — even if empty.\n * When the raw value is absent, `supportedEfforts` is omitted.\n *\n * Summary: only 'auto' | 'concise' | 'detailed' are accepted; other strings\n * are dropped to avoid forging an invalid union type.\n */\nfunction reasoningField(value: unknown): PublicModelReasoning | undefined {\n    if (!value || typeof value !== 'object') return undefined;\n    const raw = value as PublicModelReasoning;\n    const result: PublicModelReasoning = {};\n    const effort = stringField(raw.effort);\n    if (effort !== undefined) result.effort = effort;\n    const defaultEffort = stringField(raw.defaultEffort);\n    if (defaultEffort !== undefined) result.defaultEffort = defaultEffort;\n    // If the raw value is an array, preserve it — even if empty after filtering.\n    if (Array.isArray(raw.supportedEfforts)) {\n        result.supportedEfforts = raw.supportedEfforts.filter((item): item is string => typeof item === 'string');\n    }\n    // Summary: only accept console-defined values.\n    const rawSummary = stringField(raw.summary);\n    if (rawSummary !== undefined && (rawSummary === 'auto' || rawSummary === 'concise' || rawSummary === 'detailed')) {\n        result.summary = rawSummary;\n    }\n    const canDisable = booleanField(raw.canDisableThinking);\n    if (canDisable !== undefined) result.canDisableThinking = canDisable;\n    return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Normalize a raw public server model to the SDK's public directory type.\n *\n * Missing optional fields remain absent. The SDK deliberately keeps\n * `enabled: false` entries so a UI can render a disabled state without\n * inventing policy; callers must never treat omitted capabilities as false.\n */\nexport function normalizeModel(raw: RawLLMModel): PublicLLMModel | null {\n    const id = stringField(raw.id, raw.ID);\n    if (!id) return null;\n\n    // enabled/disabled compatibility logic:\n    // - Prefer server-provided `enabled` when present.\n    // - If only `disabled` is present (rolling upgrade), derive enabled = !disabled.\n    // - If both absent, default enabled = true.\n    const serverEnabled = booleanField(raw.enabled, raw.Enabled);\n    const serverDisabled = booleanField(raw.disabled, raw.Disabled);\n    let enabled: boolean;\n    let disabled: boolean | undefined;\n    if (serverEnabled !== undefined) {\n        enabled = serverEnabled;\n        if (serverDisabled !== undefined) disabled = serverDisabled;\n    } else if (serverDisabled !== undefined) {\n        disabled = serverDisabled;\n        enabled = !serverDisabled;\n    } else {\n        enabled = true;\n    }\n\n    return {\n        id,\n        name: stringField(raw.name, raw.Name) ?? id,\n        ...(stringField(raw.provider, raw.Provider) ? { provider: stringField(raw.provider, raw.Provider) } : {}),\n        ...(stringField(raw.vendor, raw.Vendor) ? { vendor: stringField(raw.vendor, raw.Vendor) } : {}),\n        ...(stringField(raw.family, raw.Family) ? { family: stringField(raw.family, raw.Family) } : {}),\n        ...(stringField(raw.version, raw.Version) ? { version: stringField(raw.version, raw.Version) } : {}),\n        ...(stringField(raw.description, raw.Description) ? { description: stringField(raw.description, raw.Description) } : {}),\n        ...(stringField(raw.descriptionZh, raw.DescriptionZh) ? { descriptionZh: stringField(raw.descriptionZh, raw.DescriptionZh) } : {}),\n        ...(stringField(raw.descriptionEn, raw.DescriptionEn) ? { descriptionEn: stringField(raw.descriptionEn, raw.DescriptionEn) } : {}),\n        ...(stringField(raw.iconUrl, raw.IconURL) ? { iconUrl: stringField(raw.iconUrl, raw.IconURL) } : {}),\n        ...(contextWindowField(raw.contextWindow, raw.ContextWindow) !== undefined\n            ? { contextWindow: contextWindowField(raw.contextWindow, raw.ContextWindow) }\n            : {}),\n        ...(numberField(raw.maxInputTokens, raw.MaxInputTokens) !== undefined ? { maxInputTokens: numberField(raw.maxInputTokens, raw.MaxInputTokens) } : {}),\n        ...(numberField(raw.maxOutputTokens, raw.MaxOutputTokens) !== undefined ? { maxOutputTokens: numberField(raw.maxOutputTokens, raw.MaxOutputTokens) } : {}),\n        ...(modalitiesField(raw.modalities ?? raw.Modalities) ? { modalities: modalitiesField(raw.modalities ?? raw.Modalities) } : {}),\n        ...(capabilitiesField(raw.capabilities ?? raw.Capabilities) ? { capabilities: capabilitiesField(raw.capabilities ?? raw.Capabilities) } : {}),\n        enabled,\n        ...(disabled !== undefined ? { disabled } : {}),\n        ...(booleanField(raw.isDefault, raw.IsDefault) !== undefined ? { isDefault: booleanField(raw.isDefault, raw.IsDefault) } : {}),\n        ...(numberField(raw.sortOrder, raw.SortOrder) !== undefined ? { sortOrder: numberField(raw.sortOrder, raw.SortOrder) } : {}),\n        ...(pricingField(raw.pricing ?? raw.Pricing) ? { pricing: pricingField(raw.pricing ?? raw.Pricing) } : {}),\n        // User-specified sparse fields: preserve explicit false/0, omit only when absent.\n        ...(stringField(raw.credits, raw.Credits) ? { credits: stringField(raw.credits, raw.Credits) } : {}),\n        ...(numberField(raw.maxAllowedSize, raw.MaxAllowedSize) !== undefined ? { maxAllowedSize: numberField(raw.maxAllowedSize, raw.MaxAllowedSize) } : {}),\n        ...(booleanField(raw.disabledMultimodal, raw.DisabledMultimodal) !== undefined ? { disabledMultimodal: booleanField(raw.disabledMultimodal, raw.DisabledMultimodal) } : {}),\n        ...(booleanField(raw.supportsImages, raw.SupportsImages) !== undefined ? { supportsImages: booleanField(raw.supportsImages, raw.SupportsImages) } : {}),\n        ...(booleanField(raw.supportsToolCall, raw.SupportsToolCall) !== undefined ? { supportsToolCall: booleanField(raw.supportsToolCall, raw.SupportsToolCall) } : {}),\n        ...(booleanField(raw.supportsReasoning, raw.SupportsReasoning) !== undefined ? { supportsReasoning: booleanField(raw.supportsReasoning, raw.SupportsReasoning) } : {}),\n        ...(booleanField(raw.onlyReasoning, raw.OnlyReasoning) !== undefined ? { onlyReasoning: booleanField(raw.onlyReasoning, raw.OnlyReasoning) } : {}),\n        ...(reasoningField(raw.reasoning ?? raw.Reasoning) ? { reasoning: reasoningField(raw.reasoning ?? raw.Reasoning) } : {}),\n        ...(numberField(raw.temperature, raw.Temperature) !== undefined ? { temperature: numberField(raw.temperature, raw.Temperature) } : {}),\n        ...(numberField(raw.top_k, raw.Top_K) !== undefined ? { top_k: numberField(raw.top_k, raw.Top_K) } : {}),\n        ...(numberField(raw.top_p, raw.Top_P) !== undefined ? { top_p: numberField(raw.top_p, raw.Top_P) } : {}),\n        ...(numberField(raw.repetition_penalty, raw.Repetition_Penalty) !== undefined ? { repetition_penalty: numberField(raw.repetition_penalty, raw.Repetition_Penalty) } : {}),\n    };\n}\n\n/**\n * Return a safe display label for a public model directory entry.\n *\n * `name` is currently required by the SDK type, but retaining the fallback\n * keeps UI code resilient to cached objects produced by an older SDK release.\n */\nexport function getModelDisplayName(model: PublicLLMModel): string {\n    return model.name || model.id;\n}\n\n/**\n * Return an explicitly declared capability, or `undefined` when the server\n * did not provide that metadata. `undefined` must not be treated as `false`.\n */\nexport function getModelCapability(\n    model: PublicLLMModel,\n    capability: keyof PublicModelCapabilities,\n): boolean | undefined {\n    return model.capabilities?.[capability];\n}\n\n/** LLM models namespace. */\nexport class ModelsAPI {\n    constructor(\n        private readonly baseUrl: string,\n        private readonly fetch: typeof globalThis.fetch,\n    ) {}\n\n    /**\n     * List the browser-safe public model directory for this application.\n     *\n     * `id` is the value to pass as `model` to `chat.completions.create()`.\n     * Optional metadata is included only when the server explicitly provides\n     * it; absence means unknown, not unsupported. The actual call result\n     * is determined by the response, not by the directory entry.\n     */\n    async list(signal?: AbortSignal): Promise<PublicLLMModel[]> {\n        let response: Response;\n        try {\n            response = await this.fetch(`${this.baseUrl}/models`, {\n                method: 'GET',\n                headers: { Accept: 'application/json' },\n                signal,\n            });\n        } catch (err) {\n            if (err instanceof Error && err.name === 'AbortError') {\n                throw err;\n            }\n            throw new CloudOpenAIError(\n                {\n                    message: `Network error: ${(err as Error)?.message ?? 'unknown'}`,\n                    type: 'server_error',\n                    param: null,\n                    code: 'gateway_network_error',\n                },\n                { cause: err },\n            );\n        }\n\n        if (!response.ok) {\n            throw await httpError(response);\n        }\n\n        const text = await response.text();\n        let parsed: unknown;\n        try {\n            parsed = JSON.parse(text);\n        } catch {\n            throw new CloudOpenAIError({\n                message: 'Failed to parse models response: invalid JSON',\n                type: 'server_error',\n                param: null,\n                code: 'gateway_invalid_response',\n            });\n        }\n\n        // Current data-plane contract is a bare array. Accepting { data: [] }\n        // preserves compatibility with older deployments without changing the\n        // public SDK result type.\n        const rawModels: RawLLMModel[] = Array.isArray(parsed)\n            ? (parsed as RawLLMModel[])\n            : Array.isArray((parsed as { data?: unknown[] })?.data)\n                ? ((parsed as { data: RawLLMModel[] }).data)\n                : [];\n\n        const models: PublicLLMModel[] = [];\n        for (const raw of rawModels) {\n            const normalized = normalizeModel(raw);\n            if (normalized) models.push(normalized);\n        }\n        return models;\n    }\n}\n\n/**\n * Build a CloudOpenAIError from a non-2xx HTTP response.\n *\n * Extracts the OpenAI error object from the response body if present,\n * otherwise synthesizes a fallback from the HTTP status.\n */\nexport async function httpError(response: Response): Promise<CloudOpenAIError> {\n    const text = await response.text().catch(() => '');\n    let errorObj: import('./errors.js').OpenAIErrorObject;\n\n    try {\n        const parsed = JSON.parse(text);\n        if (parsed && typeof parsed === 'object' && parsed.error) {\n            const e = parsed.error;\n            errorObj = {\n                message: typeof e.message === 'string' ? e.message : `HTTP ${response.status}`,\n                type: typeof e.type === 'string' ? e.type : 'server_error',\n                param: e.param === undefined ? null : e.param,\n                code: e.code === undefined ? null : e.code,\n            };\n        } else {\n            errorObj = {\n                message: typeof parsed === 'string' ? parsed : `HTTP ${response.status}`,\n                type: 'server_error',\n                param: null,\n                code: null,\n            };\n        }\n    } catch {\n        errorObj = {\n            message: text || `HTTP ${response.status}`,\n            type: 'server_error',\n            param: null,\n            code: null,\n        };\n    }\n\n    const requestId = response.headers.get('x-request-id') ?? undefined;\n    const retryAfterMs = parseRetryAfter(response.headers.get('retry-after'));\n\n    return new CloudOpenAIError(errorObj, {\n        status: response.status,\n        requestId,\n        retryAfterMs,\n    });\n}\n","/**\n * Minimal SSE (Server-Sent Events) parser for LLM Chat Completions streaming (#89098).\n *\n * Self-implemented to avoid pulling in the `openai` runtime package or any\n * Node-specific API. Uses only Web-standard `ReadableStream` + `TextDecoder`.\n *\n * Handles:\n * - Standard SSE `data:` / `event:` fields\n * - Multi-line `data:` fields (joined with \\n per SSE spec)\n * - UTF-8 cross-chunk boundary (via TextDecoder with stream=true)\n * - `[DONE]` sentinel\n * - `event: error` dispatch\n * - CRLF and LF line endings\n * - AbortSignal — cancels the stream reader cleanly\n */\n\nexport interface SSEEvent {\n    /** The event type (null for default/unspecified events). */\n    event: string | null;\n    /** The data payload (multiple `data:` lines joined with \\n). */\n    data: string;\n}\n\n/**\n * SSEDecoder processes complete SSE lines and assembles them into events.\n *\n * An SSE event is terminated by an empty line (double newline).\n * Lines starting with `:` are comments and are ignored.\n */\nclass SSEDecoder {\n    private event: string | null = null;\n    private dataParts: string[] = [];\n\n    /**\n     * Feed a single line. Returns an SSEEvent when the current event is\n     * terminated (i.e. when an empty line is received), or null otherwise.\n     */\n    decode(line: string): SSEEvent | null {\n        // Strip trailing \\r for CRLF compatibility\n        let l = line;\n        if (l.endsWith('\\r')) {\n            l = l.slice(0, -1);\n        }\n\n        // Empty line = event terminator\n        if (l === '') {\n            if (this.event === null && this.dataParts.length === 0) {\n                return null;\n            }\n            const ev: SSEEvent = {\n                event: this.event,\n                data: this.dataParts.join('\\n'),\n            };\n            this.event = null;\n            this.dataParts = [];\n            return ev;\n        }\n\n        // Comment line (starts with ':')\n        if (l.startsWith(':')) {\n            return null;\n        }\n\n        // Parse field: value\n        const colonIdx = l.indexOf(':');\n        let field: string;\n        let value: string;\n        if (colonIdx === -1) {\n            field = l;\n            value = '';\n        } else {\n            field = l.slice(0, colonIdx);\n            // Per SSE spec, a single leading space after the colon is removed\n            let rest = l.slice(colonIdx + 1);\n            if (rest.startsWith(' ')) {\n                rest = rest.slice(1);\n            }\n            value = rest;\n        }\n\n        if (field === 'event') {\n            this.event = value;\n        } else if (field === 'data') {\n            this.dataParts.push(value);\n        }\n        // Ignore id/retry fields — not needed for this SDK\n\n        return null;\n    }\n\n    /** Flush any remaining buffered data as a final event. */\n    flush(): SSEEvent | null {\n        if (this.event === null && this.dataParts.length === 0) {\n            return null;\n        }\n        const ev: SSEEvent = {\n            event: this.event,\n            data: this.dataParts.join('\\n'),\n        };\n        this.event = null;\n        this.dataParts = [];\n        return ev;\n    }\n}\n\n/**\n * LineDecoder splits a byte stream into individual lines (by \\n or \\r\\n).\n *\n * Operates on Uint8Array to correctly handle UTF-8 multi-byte characters\n * that may be split across chunks. Uses TextDecoder with stream=true\n * for incremental decoding.\n */\nclass LineDecoder {\n    private buffer: Uint8Array = new Uint8Array();\n    private decoder: TextDecoder;\n\n    constructor() {\n        // stream=true keeps incomplete multi-byte sequences buffered internally\n        this.decoder = new TextDecoder('utf-8');\n    }\n\n    /**\n     * Decode a chunk and yield complete lines.\n     *\n     * Lines are terminated by \\n, \\r, or \\r\\n. The line terminators are\n     * NOT included in the returned strings.\n     */\n    decode(chunk: Uint8Array): string[] {\n        // Append to buffer\n        const newData = new Uint8Array(this.buffer.length + chunk.length);\n        newData.set(this.buffer);\n        newData.set(chunk, this.buffer.length);\n        this.buffer = newData;\n\n        const lines: string[] = [];\n        let start = 0;\n\n        for (let i = 0; i < this.buffer.length; i++) {\n            if (this.buffer[i] === 0x0a /* \\n */ || this.buffer[i] === 0x0d /* \\r */) {\n                // Decode the line (excluding the terminator)\n                const lineBytes = this.buffer.subarray(start, i);\n                const line = this.decoder.decode(lineBytes, { stream: true });\n                lines.push(line);\n\n                // Handle \\r\\n: skip the \\n\n                if (this.buffer[i] === 0x0d && i + 1 < this.buffer.length && this.buffer[i + 1] === 0x0a) {\n                    i++;\n                }\n                start = i + 1;\n            }\n        }\n\n        // Keep the remainder in buffer\n        if (start > 0) {\n            this.buffer = this.buffer.slice(start);\n        }\n\n        return lines;\n    }\n\n    /**\n     * Flush remaining buffered data. Returns a final line if any data remains\n     * (without a trailing newline). The TextDecoder is also flushed.\n     */\n    flush(): string[] {\n        if (this.buffer.length === 0) {\n            // Flush any remaining bytes in the TextDecoder\n            const remaining = this.decoder.decode();\n            return remaining ? [remaining] : [];\n        }\n        const line = this.decoder.decode(this.buffer, { stream: false });\n        this.buffer = new Uint8Array();\n        return line ? [line] : [];\n    }\n}\n\n/** Sentinel value indicating end of stream. */\nexport const SSE_DONE = '[DONE]';\n\n/**\n * Async generator that yields SSE events from a ReadableStream<Uint8Array>.\n *\n * This is the core streaming primitive: it takes a raw response body\n * and yields parsed SSEEvent objects one at a time.\n *\n * When an AbortSignal is provided and fires, the stream is cancelled\n * (which causes the pending reader.read() to reject), allowing the\n * generator to exit cleanly.\n */\nexport async function* iterSSEEvents(\n    body: ReadableStream<Uint8Array>,\n    signal?: AbortSignal,\n): AsyncGenerator<SSEEvent, void, unknown> {\n    const sseDecoder = new SSEDecoder();\n    const lineDecoder = new LineDecoder();\n    const reader = body.getReader();\n\n    // When the abort signal fires, cancel the stream to unblock reader.read()\n    let aborted = false;\n    const onAbort = () => {\n        aborted = true;\n        reader.cancel().catch(() => {});\n    };\n\n    if (signal) {\n        if (signal.aborted) {\n            return;\n        }\n        signal.addEventListener('abort', onAbort, { once: true });\n    }\n\n    try {\n        while (true) {\n            if (aborted) {\n                return;\n            }\n\n            let result: ReadableStreamReadResult<Uint8Array>;\n            try {\n                result = await reader.read();\n            } catch (err) {\n                // reader.read() rejects when the stream is cancelled (abort)\n                if (aborted || (err instanceof Error && err.name === 'AbortError')) {\n                    return;\n                }\n                throw err;\n            }\n\n            const { done, value } = result;\n            if (done) break;\n\n            for (const line of lineDecoder.decode(value)) {\n                const ev = sseDecoder.decode(line);\n                if (ev) yield ev;\n            }\n        }\n\n        // Flush remaining data\n        for (const line of lineDecoder.flush()) {\n            const ev = sseDecoder.decode(line);\n            if (ev) yield ev;\n        }\n        const finalEv = sseDecoder.flush();\n        if (finalEv) yield finalEv;\n    } finally {\n        if (signal) {\n            signal.removeEventListener('abort', onAbort);\n        }\n        try {\n            reader.releaseLock();\n        } catch {\n            // already released or stream errored\n        }\n    }\n}\n","/**\n * LLM Chat Completions — POST /.cloud/llm/chat/completions (#89098)\n *\n * Supports streaming (SSE) only. The API contract requires `stream: true`;\n * non-streaming is not supported. The SDK rejects `stream !== true` before\n * any network request is issued.\n *\n * Uses the shared fetch injected by `WorkBuddyCloudClient` — never\n * constructs its own fetch or adds Authorization/ModelHub headers.\n */\n\nimport { CloudOpenAIError } from './errors.js';\nimport { httpError } from './models.js';\nimport { iterSSEEvents, SSE_DONE } from './sse.js';\nimport type {\n    ChatCompletionChunk,\n    ChatCompletionCreateParams,\n    ChatCompletionCreateParamsStreaming,\n} from './types.js';\n\n/**\n * Extract error from an SSE `event: error` data payload.\n *\n * The server sends:\n *   event: error\n *   data: { \"error\": { \"message\": \"...\", \"type\": \"...\", \"param\": null, \"code\": \"...\" } }\n *\n * `requestId` is the `X-Request-Id` from the streaming response header; it is\n * attached to the resulting `CloudOpenAIError` so in-stream failures stay\n * correlatable with server logs.\n */\nfunction extractSSEError(data: string, requestId?: string): CloudOpenAIError {\n    const init: import('./errors.js').CloudOpenAIErrorInit = requestId ? { requestId } : {};\n    try {\n        const parsed = JSON.parse(data);\n        if (parsed && typeof parsed === 'object') {\n            const errorObj = parsed.error ?? parsed;\n            if (errorObj && typeof errorObj === 'object') {\n                return new CloudOpenAIError(\n                    {\n                        message: typeof errorObj.message === 'string' ? errorObj.message : 'Stream error',\n                        type: typeof errorObj.type === 'string' ? errorObj.type : 'server_error',\n                        param: errorObj.param === undefined ? null : errorObj.param,\n                        code: errorObj.code === undefined ? null : errorObj.code,\n                    },\n                    init,\n                );\n            }\n        }\n    } catch {\n        // Not JSON\n    }\n    return new CloudOpenAIError(\n        {\n            message: data || 'Stream error',\n            type: 'server_error',\n            param: null,\n            code: null,\n        },\n        init,\n    );\n}\n\n/** LLM chat completions namespace. */\nexport class ChatCompletionsAPI {\n    constructor(\n        private readonly baseUrl: string,\n        private readonly fetch: typeof globalThis.fetch,\n    ) {}\n\n    /**\n     * Create a chat completion.\n     *\n     * The API only supports streaming. `input.stream` must be `true`;\n     * any other value (or omitting `stream`) is rejected before a network\n     * request is sent. Returns an async iterable of `ChatCompletionChunk`\n     * objects decoded from the SSE stream.\n     */\n    create(input: ChatCompletionCreateParamsStreaming): AsyncIterable<ChatCompletionChunk>;\n    create(input: ChatCompletionCreateParams): AsyncIterable<ChatCompletionChunk>;\n    create(input: ChatCompletionCreateParams): AsyncIterable<ChatCompletionChunk> {\n        if (input.stream !== true) {\n            throw new CloudOpenAIError({\n                message: 'stream must be true; non-streaming chat completions are not supported',\n                type: 'invalid_request_error',\n                param: 'stream',\n                code: 'request_stream_required',\n            });\n        }\n        return this.createStreaming(input as ChatCompletionCreateParamsStreaming);\n    }\n\n    /**\n     * Streaming chat completion — returns an async generator of chunks.\n     *\n     * Reads the SSE stream incrementally, yielding ChatCompletionChunk objects.\n     * `stream_options` is passed through unchanged when present.\n     *\n     * The `X-Request-Id` response header is captured and attached (as\n     * `requestId`) to every `CloudOpenAIError` thrown from within the stream:\n     * `event: error`, chunk-embedded error, JSON parse failure, and missing\n     * `[DONE]` interruption. Non-2xx HTTP errors continue to go through\n     * `httpError`, which independently extracts `X-Request-Id`.\n     *\n     * Throws CloudOpenAIError on:\n     * - `event: error` in the stream\n     * - Stream ends without `[DONE]` (gateway_stream_interrupted)\n     * - JSON parse errors in data frames\n     * - Caller abort (AbortSignal) — exits silently, no throw\n     */\n    private async *createStreaming(\n        input: ChatCompletionCreateParamsStreaming,\n    ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n        const { signal, conversationId, ...body } = input;\n        body.stream = true;\n\n        let response: Response;\n        try {\n            response = await this.fetch(`${this.baseUrl}/chat/completions`, {\n                method: 'POST',\n                headers: {\n                    Accept: 'text/event-stream',\n                    'Content-Type': 'application/json',\n                    ...(conversationId !== undefined ? { 'X-Conversation-ID': conversationId } : {}),\n                },\n                body: JSON.stringify(body),\n                signal,\n            });\n        } catch (err) {\n            if (err instanceof Error && err.name === 'AbortError') {\n                return;\n            }\n            throw new CloudOpenAIError(\n                {\n                    message: `Network error: ${(err as Error)?.message ?? 'unknown'}`,\n                    type: 'server_error',\n                    param: null,\n                    code: 'gateway_network_error',\n                },\n                { cause: err },\n            );\n        }\n\n        // Non-2xx on a streaming request still returns a body — convert to error.\n        if (!response.ok) {\n            throw await httpError(response);\n        }\n\n        if (!response.body) {\n            throw new CloudOpenAIError(\n                {\n                    message: 'Response body is empty — streaming not supported',\n                    type: 'server_error',\n                    param: null,\n                    code: 'gateway_invalid_response',\n                },\n                { requestId: response.headers.get('x-request-id') ?? undefined },\n            );\n        }\n\n        // Capture X-Request-Id from the streaming response header so all\n        // in-stream errors (event:error, embedded error, JSON parse failure,\n        // missing [DONE]) stay correlatable with server-side logs.\n        const requestId = response.headers.get('x-request-id') ?? undefined;\n\n        let receivedDone = false;\n        let threw = false;\n\n        try {\n            for await (const sseEvent of iterSSEEvents(response.body, signal)) {\n                // Check for named error event\n                if (sseEvent.event === 'error') {\n                    threw = true;\n                    throw extractSSEError(sseEvent.data, requestId);\n                }\n\n                // Default event: data frame\n                if (sseEvent.event === null || sseEvent.event === '') {\n                    if (sseEvent.data === SSE_DONE) {\n                        receivedDone = true;\n                        return;\n                    }\n\n                    if (!sseEvent.data) {\n                        // Empty data frame, skip\n                        continue;\n                    }\n\n                    let chunk: ChatCompletionChunk;\n                    try {\n                        chunk = JSON.parse(sseEvent.data) as ChatCompletionChunk;\n                    } catch {\n                        threw = true;\n                        throw new CloudOpenAIError(\n                            {\n                                message: `Failed to parse SSE data: ${sseEvent.data}`,\n                                type: 'server_error',\n                                param: null,\n                                code: 'gateway_invalid_response',\n                            },\n                            { requestId },\n                        );\n                    }\n\n                    // Check for error embedded in the chunk (some servers do this)\n                    if (chunk && typeof chunk === 'object' && 'error' in chunk) {\n                        threw = true;\n                        const errObj = (chunk as unknown as { error: Record<string, unknown> }).error;\n                        throw new CloudOpenAIError(\n                            {\n                                message: typeof errObj?.message === 'string' ? errObj.message : 'Stream error',\n                                type: typeof errObj?.type === 'string' ? errObj.type : 'server_error',\n                                param: errObj?.param === undefined ? null : (errObj.param as string | null),\n                                code: errObj?.code === undefined ? null : (errObj.code as string | null),\n                            },\n                            { requestId },\n                        );\n                    }\n\n                    yield chunk;\n                }\n            }\n        } catch (err) {\n            // AbortError: caller cancelled, exit silently\n            if (err instanceof Error && err.name === 'AbortError') {\n                return;\n            }\n            threw = true;\n            throw err;\n        }\n\n        // Stream ended normally (reader returned done) but without [DONE].\n        if (!receivedDone && !threw && !signal?.aborted) {\n            throw new CloudOpenAIError(\n                {\n                    message: '流式响应中断。',\n                    type: 'server_error',\n                    param: null,\n                    code: 'gateway_stream_interrupted',\n                },\n                { requestId },\n            );\n        }\n    }\n}\n","/**\n * LLM 模块入口（#89098）\n *\n * 数据面 `/.cloud/llm`：\n *   GET  /.cloud/llm/models\n *   POST /.cloud/llm/chat/completions\n *\n * 公开 API：\n *   cloud.llm.models.list()\n *   cloud.llm.chat.completions.create()\n *\n * 流式响应走 SSE（`text/event-stream`），分块解析由 `./llm/sse.ts` 处理。\n */\n\nimport { CLOUD_MODULE_PATHS } from '../paths.js';\nimport type { CloudRuntimeConfig } from '../types.js';\nimport { ChatCompletionsAPI } from './llm/chat.js';\nimport { ModelsAPI } from './llm/models.js';\n\nexport { getModelCapability, getModelDisplayName } from './llm/models.js';\n\nexport class LlmModule {\n    /** 该模块的数据面基址。 */\n    readonly baseUrl: string;\n\n    /** Models namespace。 */\n    readonly models: ModelsAPI;\n\n    /** Chat namespace。 */\n    readonly chat: {\n        completions: ChatCompletionsAPI;\n    };\n\n    constructor(\n        config: CloudRuntimeConfig,\n        private readonly fetch: typeof globalThis.fetch,\n    ) {\n        this.baseUrl = `${config.endpoint}${CLOUD_MODULE_PATHS.llm}`;\n        this.models = new ModelsAPI(this.baseUrl, this.fetch);\n        this.chat = {\n            completions: new ChatCompletionsAPI(this.baseUrl, this.fetch),\n        };\n    }\n}\n\n// Re-export public types for ergonomic consumption from the module entry.\nexport type {\n    ChatCompletion,\n    ChatCompletionChunk,\n    ChatCompletionChoice,\n    ChatCompletionChunkChoice,\n    ChatCompletionCreateParams,\n    ChatCompletionCreateParamsStreaming,\n    CompletionUsage,\n    ChatCompletionMessage,\n    ChatCompletionRequestMessage,\n    ChatCompletionAssistantMessage,\n    ChatCompletionTool,\n    ChatCompletionToolChoice,\n    ChatCompletionResponseFormat,\n    ChatCompletionContentPart,\n    ChatCompletionRole,\n    PublicLLMModel,\n    PublicModelCapabilities,\n    PublicModelModalities,\n    PublicModelPricing,\n    PublicModelReasoning,\n} from './llm/types.js';\nexport { CloudOpenAIError } from './llm/errors.js';\nexport type { OpenAIErrorObject, CloudOpenAIErrorInit } from './llm/errors.js';\n","/**\n * Namespace type for error classes\n * Determines the error class names and type guards\n */\nexport type ErrorNamespace = 'storage' | 'vectors'\n\n/**\n * Base error class for all Storage errors\n * Supports both 'storage' and 'vectors' namespaces\n */\nexport class StorageError extends Error {\n  protected __isStorageError = true\n  protected namespace: ErrorNamespace\n  status: number | undefined\n  statusCode: string | undefined\n\n  constructor(\n    message: string,\n    namespace: ErrorNamespace = 'storage',\n    status?: number,\n    statusCode?: string\n  ) {\n    super(message)\n    this.namespace = namespace\n    this.name = namespace === 'vectors' ? 'StorageVectorsError' : 'StorageError'\n    this.status = status\n    this.statusCode = statusCode\n  }\n\n  toJSON(): {\n    name: string\n    message: string\n    status: number | undefined\n    statusCode: string | undefined\n  } {\n    return {\n      name: this.name,\n      message: this.message,\n      status: this.status,\n      statusCode: this.statusCode,\n    }\n  }\n}\n\n/**\n * Type guard to check if an error is a StorageError\n * @param error - The error to check\n * @returns True if the error is a StorageError\n */\nexport function isStorageError(error: unknown): error is StorageError {\n  return typeof error === 'object' && error !== null && '__isStorageError' in error\n}\n\n/**\n * API error returned from Storage service\n * Includes HTTP status code and service-specific error code\n */\nexport class StorageApiError extends StorageError {\n  override status: number\n  override statusCode: string\n  /**\n   * Service-specific error code from the Storage API response body, such as\n   * `NoSuchKey`, `AccessDenied` or `ResourceAlreadyExists`. Use this to branch\n   * on the specific error rather than parsing the message.\n   * @see https://supabase.com/docs/guides/storage/debugging/error-codes\n   */\n  code: string | undefined\n\n  constructor(\n    message: string,\n    status: number,\n    statusCode: string,\n    namespace: ErrorNamespace = 'storage',\n    code?: string\n  ) {\n    super(message, namespace, status, statusCode)\n    this.name = namespace === 'vectors' ? 'StorageVectorsApiError' : 'StorageApiError'\n    this.status = status\n    this.statusCode = statusCode\n    this.code = code\n  }\n\n  toJSON(): {\n    name: string\n    message: string\n    status: number | undefined\n    statusCode: string | undefined\n    code: string | undefined\n  } {\n    return {\n      ...super.toJSON(),\n      code: this.code,\n    }\n  }\n}\n\n/**\n * Unknown error that doesn't match expected error patterns\n * Wraps the original error for debugging\n */\nexport class StorageUnknownError extends StorageError {\n  originalError: unknown\n\n  constructor(message: string, originalError: unknown, namespace: ErrorNamespace = 'storage') {\n    super(message, namespace)\n    this.name = namespace === 'vectors' ? 'StorageVectorsUnknownError' : 'StorageUnknownError'\n    this.originalError = originalError\n  }\n}\n\n// ============================================================================\n// Backward Compatibility Exports for Vectors\n// ============================================================================\n\n/**\n * @deprecated Use StorageError with namespace='vectors' instead\n * Alias for backward compatibility with existing vector storage code\n */\nexport class StorageVectorsError extends StorageError {\n  constructor(message: string) {\n    super(message, 'vectors')\n  }\n}\n\n/**\n * Type guard to check if an error is a StorageVectorsError\n * @param error - The error to check\n * @returns True if the error is a StorageVectorsError\n */\nexport function isStorageVectorsError(error: unknown): error is StorageVectorsError {\n  return isStorageError(error) && (error as StorageError)['namespace'] === 'vectors'\n}\n\n/**\n * @deprecated Use StorageApiError with namespace='vectors' instead\n * Alias for backward compatibility with existing vector storage code\n */\nexport class StorageVectorsApiError extends StorageApiError {\n  constructor(message: string, status: number, statusCode: string) {\n    super(message, status, statusCode, 'vectors')\n  }\n}\n\n/**\n * @deprecated Use StorageUnknownError with namespace='vectors' instead\n * Alias for backward compatibility with existing vector storage code\n */\nexport class StorageVectorsUnknownError extends StorageUnknownError {\n  constructor(message: string, originalError: unknown) {\n    super(message, originalError, 'vectors')\n  }\n}\n\n/**\n * Error codes specific to S3 Vectors API\n * Maps AWS service errors to application-friendly error codes\n */\nexport enum StorageVectorsErrorCode {\n  /** Internal server fault (HTTP 500) */\n  InternalError = 'InternalError',\n  /** Resource already exists / conflict (HTTP 409) */\n  S3VectorConflictException = 'S3VectorConflictException',\n  /** Resource not found (HTTP 404) */\n  S3VectorNotFoundException = 'S3VectorNotFoundException',\n  /** Delete bucket while not empty (HTTP 400) */\n  S3VectorBucketNotEmpty = 'S3VectorBucketNotEmpty',\n  /** Exceeds bucket quota/limit (HTTP 400) */\n  S3VectorMaxBucketsExceeded = 'S3VectorMaxBucketsExceeded',\n  /** Exceeds index quota/limit (HTTP 400) */\n  S3VectorMaxIndexesExceeded = 'S3VectorMaxIndexesExceeded',\n}\n","/**\n * Sets a header with case-insensitive deduplication.\n * Removes any existing headers whose name matches (case-insensitive),\n * then sets the value under the lowercase key. Does not mutate the input object.\n *\n * @param headers - Existing headers object\n * @param name - Header name to set (stored as lowercase)\n * @param value - Header value\n * @returns New headers object with the header set\n */\nexport function setHeader(\n  headers: Record<string, string>,\n  name: string,\n  value: string\n): Record<string, string> {\n  const result = { ...headers }\n  const nameLower = name.toLowerCase()\n\n  for (const key of Object.keys(result)) {\n    if (key.toLowerCase() === nameLower) {\n      delete result[key]\n    }\n  }\n\n  result[nameLower] = value\n  return result\n}\n\n/**\n * Normalizes all header keys to lowercase with case-insensitive deduplication.\n * When duplicate keys exist (differing only in case), the last value wins.\n * Does not mutate the input object.\n *\n * @param headers - Headers object to normalize\n * @returns New headers object with all keys lowercased\n */\nexport function normalizeHeaders(headers: Record<string, string>): Record<string, string> {\n  const result: Record<string, string> = {}\n  for (const [key, value] of Object.entries(headers)) {\n    result[key.toLowerCase()] = value\n  }\n  return result\n}\n","type Fetch = typeof fetch\n\n/**\n * Resolves the fetch implementation to use\n * Uses custom fetch if provided, otherwise uses native fetch\n *\n * @param customFetch - Optional custom fetch implementation\n * @returns Resolved fetch function\n */\nexport const resolveFetch = (customFetch?: Fetch): Fetch => {\n  if (customFetch) {\n    return (...args) => customFetch(...args)\n  }\n  return (...args) => fetch(...args)\n}\n\n/**\n * Resolves the Response constructor to use\n * Returns native Response constructor\n *\n * @returns Response constructor\n */\nexport const resolveResponse = (): typeof Response => {\n  return Response\n}\n\n/**\n * Determine if input is a plain object\n * An object is plain if it's created by either {}, new Object(), or Object.create(null)\n *\n * @param value - Value to check\n * @returns True if value is a plain object\n * @source https://github.com/sindresorhus/is-plain-obj\n */\nexport const isPlainObject = (value: object): boolean => {\n  if (typeof value !== 'object' || value === null) {\n    return false\n  }\n\n  const prototype = Object.getPrototypeOf(value)\n  return (\n    (prototype === null ||\n      prototype === Object.prototype ||\n      Object.getPrototypeOf(prototype) === null) &&\n    !(Symbol.toStringTag in value) &&\n    !(Symbol.iterator in value)\n  )\n}\n\n/**\n * Recursively converts object keys from snake_case to camelCase\n * Used for normalizing API responses\n *\n * @param item - Object to convert\n * @returns Converted object with camelCase keys\n */\nexport const recursiveToCamel = (item: Record<string, any>): unknown => {\n  if (Array.isArray(item)) {\n    return item.map((el) => recursiveToCamel(el))\n  } else if (typeof item === 'function' || item !== Object(item)) {\n    return item\n  }\n\n  const result: Record<string, any> = {}\n  Object.entries(item).forEach(([key, value]) => {\n    const newKey = key.replace(/([-_][a-z])/gi, (c) => c.toUpperCase().replace(/[-_]/g, ''))\n    result[newKey] = recursiveToCamel(value)\n  })\n\n  return result\n}\n\n/**\n * Validates if a given bucket name is valid according to Supabase Storage API rules\n * Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()\n *\n * Rules:\n * - Length: 1-100 characters\n * - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters\n * - Safe special characters: ! - . * ' ( ) space & $ @ = ; : + , ?\n * - Forbidden: path separators (/, \\), path traversal (..), leading/trailing whitespace\n *\n * AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n *\n * @param bucketName - The bucket name to validate\n * @returns true if valid, false otherwise\n */\nexport const isValidBucketName = (bucketName: string): boolean => {\n  if (!bucketName || typeof bucketName !== 'string') {\n    return false\n  }\n\n  // Check length constraints (1-100 characters)\n  if (bucketName.length === 0 || bucketName.length > 100) {\n    return false\n  }\n\n  // Check for leading/trailing whitespace\n  if (bucketName.trim() !== bucketName) {\n    return false\n  }\n\n  // Explicitly reject path separators (security)\n  // Note: Consecutive periods (..) are allowed by backend - the AWS restriction\n  // on relative paths applies to object keys, not bucket names\n  if (bucketName.includes('/') || bucketName.includes('\\\\')) {\n    return false\n  }\n\n  // Validate against allowed character set\n  // Pattern matches backend regex: /^(\\w|!|-|\\.|\\*|'|\\(|\\)| |&|\\$|@|=|;|:|\\+|,|\\?)*$/\n  // This explicitly excludes path separators (/, \\) and other problematic characters\n  const bucketNameRegex = /^[\\w!.\\*'() &$@=;:+,?-]+$/\n  return bucketNameRegex.test(bucketName)\n}\n\n/**\n * Normalizes a number array to float32 format\n * Ensures all vector values are valid 32-bit floats\n *\n * @param values - Array of numbers to normalize\n * @returns Normalized float32 array\n */\nexport const normalizeToFloat32 = (values: number[]): number[] => {\n  // Use Float32Array to ensure proper precision\n  return Array.from(new Float32Array(values))\n}\n\n/**\n * Validates vector dimensions match expected dimension\n * Throws error if dimensions don't match\n *\n * @param vector - Vector data to validate\n * @param expectedDimension - Expected vector dimension\n * @throws Error if dimensions don't match\n */\nexport const validateVectorDimension = (\n  vector: { float32: number[] },\n  expectedDimension?: number\n): void => {\n  if (expectedDimension !== undefined && vector.float32.length !== expectedDimension) {\n    throw new Error(\n      `Vector dimension mismatch: expected ${expectedDimension}, got ${vector.float32.length}`\n    )\n  }\n}\n\n/**\n * Percent-encodes each segment of a storage path so URL delimiters within a\n * key (e.g. `?`, `#`) can't be interpreted as a querystring/fragment start.\n *\n * Splits on `/` so real path separators stay literal — the storage server\n * routes on them and decodes each segment back to the original key.\n *\n * @param path - A bucket id or `bucketId/objectKey` path\n * @returns The path with each `/`-delimited segment percent-encoded\n */\nexport const encodeStoragePath = (path: string): string =>\n  path.split('/').map(encodeURIComponent).join('/')\n","import { StorageApiError, StorageError, StorageUnknownError, ErrorNamespace } from './errors'\nimport { setHeader } from './headers'\nimport { isPlainObject, resolveResponse } from './helpers'\nimport { FetchParameters } from '../types'\n\nexport type Fetch = typeof fetch\n\n/**\n * Options for fetch requests\n */\nexport interface FetchOptions {\n  headers?: {\n    [key: string]: string\n  }\n  duplex?: string\n  noResolveJson?: boolean\n}\n\n/**\n * HTTP methods supported by the API\n */\nexport type RequestMethodType = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD'\n\n/**\n * Extracts error message from various error response formats\n * @param err - Error object from API\n * @returns Human-readable error message\n */\nconst _getErrorMessage = (err: unknown): string => {\n  if (typeof err === 'object' && err !== null) {\n    const e = err as Record<string, unknown>\n    if (typeof e.msg === 'string') return e.msg\n    if (typeof e.message === 'string') return e.message\n    if (typeof e.error_description === 'string') return e.error_description\n    if (typeof e.error === 'string') return e.error\n    if (typeof e.error === 'object' && e.error !== null) {\n      const nested = e.error as Record<string, unknown>\n      if (typeof nested.message === 'string') return nested.message\n    }\n  }\n  return JSON.stringify(err)\n}\n\n/**\n * Handles fetch errors and converts them to Storage error types\n * @param error - The error caught from fetch\n * @param reject - Promise rejection function\n * @param options - Fetch options that may affect error handling\n * @param namespace - Error namespace ('storage' or 'vectors')\n */\nconst handleError = async (\n  error: unknown,\n  reject: (reason: StorageError) => void,\n  options: FetchOptions | undefined,\n  namespace: ErrorNamespace\n) => {\n  // Structural detection of json() method, present in all Response implementations\n  // (native, node-fetch, cross-fetch, undici) and absent from standard Error objects.\n  // Checking 'ok' or 'status' via `in` is unreliable across fetch polyfills/realms.\n  const isResponseLike =\n    error !== null &&\n    typeof error === 'object' &&\n    'json' in error &&\n    typeof (error as Record<string, unknown>).json === 'function'\n\n  if (isResponseLike) {\n    const responseError = error as Response\n    // Defensive coercion: some fetch polyfills have historically returned status as a string.\n    let status = parseInt(String(responseError.status), 10)\n    if (!Number.isFinite(status)) {\n      status = 500\n    }\n\n    responseError\n      .json()\n      .then(\n        (err: { statusCode?: string; code?: string; error?: string; message?: string } | null) => {\n          const statusCode = err?.statusCode || err?.code || status + ''\n          reject(\n            new StorageApiError(_getErrorMessage(err), status, statusCode, namespace, err?.code)\n          )\n        }\n      )\n      .catch(() => {\n        const statusCode = status + ''\n        const message = responseError.statusText || `HTTP ${status} error`\n        reject(new StorageApiError(message, status, statusCode, namespace))\n      })\n  } else {\n    reject(new StorageUnknownError(_getErrorMessage(error), error, namespace))\n  }\n}\n\n/**\n * Builds request parameters for fetch calls\n * @param method - HTTP method\n * @param options - Custom fetch options\n * @param parameters - Additional fetch parameters like AbortSignal\n * @param body - Request body (will be JSON stringified if plain object)\n * @returns Complete fetch request parameters\n */\nconst _getRequestParams = (\n  method: RequestMethodType,\n  options?: FetchOptions,\n  parameters?: FetchParameters,\n  body?: object\n) => {\n  const params: { [k: string]: any } = { method, headers: options?.headers || {} }\n\n  if (method === 'GET' || method === 'HEAD' || !body) {\n    return { ...params, ...parameters }\n  }\n\n  if (isPlainObject(body)) {\n    const headers = options?.headers || {}\n    let contentType: string | undefined\n\n    for (const [key, value] of Object.entries(headers)) {\n      if (key.toLowerCase() === 'content-type') {\n        contentType = value\n      }\n    }\n\n    params.headers = setHeader(headers, 'Content-Type', contentType ?? 'application/json')\n    params.body = JSON.stringify(body)\n  } else {\n    params.body = body\n  }\n\n  if (options?.duplex) {\n    params.duplex = options.duplex\n  }\n\n  return { ...params, ...parameters }\n}\n\n/**\n * Internal request handler that wraps fetch with error handling\n * @param fetcher - Fetch function to use\n * @param method - HTTP method\n * @param url - Request URL\n * @param options - Custom fetch options\n * @param parameters - Additional fetch parameters\n * @param body - Request body\n * @param namespace - Error namespace ('storage' or 'vectors')\n * @returns Promise with parsed response or error\n */\nasync function _handleRequest(\n  fetcher: Fetch,\n  method: RequestMethodType,\n  url: string,\n  options: FetchOptions | undefined,\n  parameters: FetchParameters | undefined,\n  body: object | undefined,\n  namespace: ErrorNamespace\n): Promise<any> {\n  return new Promise((resolve, reject) => {\n    fetcher(url, _getRequestParams(method, options, parameters, body))\n      .then((result) => {\n        if (!result.ok) throw result\n        if (options?.noResolveJson) return result\n\n        // AWS S3 Vectors API returns 200 OK with content-length: 0 for successful mutations\n        // (putVectors, deleteVectors) instead of 204 or JSON response. This is AWS's design choice\n        // for performance optimization of bulk operations (up to 500 vectors per request).\n        // We handle this to prevent \"Unexpected end of JSON input\" errors when calling result.json()\n        if (namespace === 'vectors') {\n          const contentType = result.headers.get('content-type')\n          const contentLength = result.headers.get('content-length')\n\n          // Return empty object for explicitly empty responses\n          if (contentLength === '0' || result.status === 204) {\n            return {}\n          }\n\n          // Return empty object if no JSON content type\n          if (!contentType || !contentType.includes('application/json')) {\n            return {}\n          }\n        }\n\n        return result.json()\n      })\n      .then((data) => resolve(data))\n      .catch((error) => handleError(error, reject, options, namespace))\n  })\n}\n\n/**\n * Creates a fetch API with the specified namespace\n * @param namespace - Error namespace ('storage' or 'vectors')\n * @returns Object with HTTP method functions\n */\nexport function createFetchApi(namespace: ErrorNamespace = 'storage') {\n  return {\n    /**\n     * Performs a GET request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    get: async (\n      fetcher: Fetch,\n      url: string,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise<any> => {\n      return _handleRequest(fetcher, 'GET', url, options, parameters, undefined, namespace)\n    },\n\n    /**\n     * Performs a POST request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param body - Request body to be JSON stringified\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    post: async (\n      fetcher: Fetch,\n      url: string,\n      body: object,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise<any> => {\n      return _handleRequest(fetcher, 'POST', url, options, parameters, body, namespace)\n    },\n\n    /**\n     * Performs a PUT request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param body - Request body to be JSON stringified\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    put: async (\n      fetcher: Fetch,\n      url: string,\n      body: object,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise<any> => {\n      return _handleRequest(fetcher, 'PUT', url, options, parameters, body, namespace)\n    },\n\n    /**\n     * Performs a HEAD request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with Response object (not JSON parsed)\n     */\n    head: async (\n      fetcher: Fetch,\n      url: string,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise<any> => {\n      return _handleRequest(\n        fetcher,\n        'HEAD',\n        url,\n        {\n          ...options,\n          noResolveJson: true,\n        },\n        parameters,\n        undefined,\n        namespace\n      )\n    },\n\n    /**\n     * Performs a DELETE request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param body - Request body to be JSON stringified\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    remove: async (\n      fetcher: Fetch,\n      url: string,\n      body: object,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise<any> => {\n      return _handleRequest(fetcher, 'DELETE', url, options, parameters, body, namespace)\n    },\n  }\n}\n\n// Default exports for backward compatibility with 'storage' namespace\nconst defaultApi = createFetchApi('storage')\nexport const { get, post, put, head, remove } = defaultApi\n\n// Vectors API with 'vectors' namespace for proper error handling\nexport const vectorsApi = createFetchApi('vectors')\n","import { ErrorNamespace, isStorageError, StorageError } from './errors'\nimport { Fetch } from './fetch'\nimport { normalizeHeaders, setHeader as setHeaderUtil } from './headers'\nimport { resolveFetch } from './helpers'\n\n/**\n * @ignore\n * Base API client class for all Storage API classes\n * Provides common infrastructure for error handling and configuration\n *\n * @typeParam TError - The error type (StorageError or subclass)\n */\nexport default abstract class BaseApiClient<TError extends StorageError = StorageError> {\n  protected url: string\n  protected headers: { [key: string]: string }\n  protected fetch: Fetch\n  protected shouldThrowOnError = false\n  protected namespace: ErrorNamespace\n\n  /**\n   * Creates a new BaseApiClient instance\n   * @param url - Base URL for API requests\n   * @param headers - Default headers for API requests\n   * @param fetch - Optional custom fetch implementation\n   * @param namespace - Error namespace ('storage' or 'vectors')\n   */\n  constructor(\n    url: string,\n    headers: { [key: string]: string } = {},\n    fetch?: Fetch,\n    namespace: ErrorNamespace = 'storage'\n  ) {\n    this.url = url\n    this.headers = normalizeHeaders(headers)\n    this.fetch = resolveFetch(fetch)\n    this.namespace = namespace\n  }\n\n  /**\n   * Enable throwing errors instead of returning them.\n   * When enabled, errors are thrown instead of returned in { data, error } format.\n   *\n   * @returns this - For method chaining\n   */\n  public throwOnError(): this {\n    this.shouldThrowOnError = true\n    return this\n  }\n\n  /**\n   * Set an HTTP header for the request.\n   * Creates a shallow copy of headers to avoid mutating shared state.\n   *\n   * @param name - Header name\n   * @param value - Header value\n   * @returns this - For method chaining\n   */\n  public setHeader(name: string, value: string): this {\n    this.headers = setHeaderUtil(this.headers, name, value)\n    return this\n  }\n\n  /**\n   * Handles API operation with standardized error handling\n   * Eliminates repetitive try-catch blocks across all API methods\n   *\n   * This wrapper:\n   * 1. Executes the operation\n   * 2. Returns { data, error: null } on success\n   * 3. Returns { data: null, error } on failure (if shouldThrowOnError is false)\n   * 4. Throws error on failure (if shouldThrowOnError is true)\n   *\n   * @typeParam T - The expected data type from the operation\n   * @param operation - Async function that performs the API call\n   * @returns Promise with { data, error } tuple\n   *\n   * @example Handling an operation\n   * ```typescript\n   * async listBuckets() {\n   *   return this.handleOperation(async () => {\n   *     return await get(this.fetch, `${this.url}/bucket`, {\n   *       headers: this.headers,\n   *     })\n   *   })\n   * }\n   * ```\n   */\n  protected async handleOperation<T>(\n    operation: () => Promise<T>\n  ): Promise<{ data: T; error: null } | { data: null; error: TError }> {\n    try {\n      const data = await operation()\n      return { data, error: null }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n      if (isStorageError(error)) {\n        return { data: null, error: error as TError }\n      }\n      throw error\n    }\n  }\n}\n","import { isStorageError } from '../lib/common/errors'\nimport { DownloadResult } from '../lib/types'\n\nexport default class StreamDownloadBuilder implements Promise<DownloadResult<ReadableStream>> {\n  readonly [Symbol.toStringTag]: string = 'StreamDownloadBuilder'\n  private promise: Promise<DownloadResult<ReadableStream>> | null = null\n\n  constructor(\n    private downloadFn: () => Promise<Response>,\n    private shouldThrowOnError: boolean\n  ) {}\n\n  then<TResult1 = DownloadResult<ReadableStream>, TResult2 = never>(\n    onfulfilled?:\n      | ((value: DownloadResult<ReadableStream>) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n  ): Promise<TResult1 | TResult2> {\n    return this.getPromise().then(onfulfilled, onrejected)\n  }\n\n  catch<TResult = never>(\n    onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n  ): Promise<DownloadResult<ReadableStream> | TResult> {\n    return this.getPromise().catch(onrejected)\n  }\n\n  finally(onfinally?: (() => void) | null): Promise<DownloadResult<ReadableStream>> {\n    return this.getPromise().finally(onfinally)\n  }\n\n  private getPromise(): Promise<DownloadResult<ReadableStream>> {\n    if (!this.promise) {\n      this.promise = this.execute()\n    }\n    return this.promise\n  }\n\n  private async execute(): Promise<DownloadResult<ReadableStream>> {\n    try {\n      const result = await this.downloadFn()\n\n      return {\n        data: result.body as ReadableStream,\n        error: null,\n      }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n\n      if (isStorageError(error)) {\n        return { data: null, error }\n      }\n\n      throw error\n    }\n  }\n}\n","import { isStorageError } from '../lib/common/errors'\nimport { DownloadResult } from '../lib/types'\nimport StreamDownloadBuilder from './StreamDownloadBuilder'\n\nexport default class BlobDownloadBuilder implements Promise<DownloadResult<Blob>> {\n  readonly [Symbol.toStringTag]: string = 'BlobDownloadBuilder'\n  private promise: Promise<DownloadResult<Blob>> | null = null\n\n  constructor(\n    private downloadFn: () => Promise<Response>,\n    private shouldThrowOnError: boolean\n  ) {}\n\n  asStream(): StreamDownloadBuilder {\n    return new StreamDownloadBuilder(this.downloadFn, this.shouldThrowOnError)\n  }\n\n  then<TResult1 = DownloadResult<Blob>, TResult2 = never>(\n    onfulfilled?: ((value: DownloadResult<Blob>) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n  ): Promise<TResult1 | TResult2> {\n    return this.getPromise().then(onfulfilled, onrejected)\n  }\n\n  catch<TResult = never>(\n    onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n  ): Promise<DownloadResult<Blob> | TResult> {\n    return this.getPromise().catch(onrejected)\n  }\n\n  finally(onfinally?: (() => void) | null): Promise<DownloadResult<Blob>> {\n    return this.getPromise().finally(onfinally)\n  }\n\n  private getPromise(): Promise<DownloadResult<Blob>> {\n    if (!this.promise) {\n      this.promise = this.execute()\n    }\n    return this.promise\n  }\n\n  private async execute(): Promise<DownloadResult<Blob>> {\n    try {\n      const result = await this.downloadFn()\n\n      return {\n        data: await result.blob(),\n        error: null,\n      }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n\n      if (isStorageError(error)) {\n        return { data: null, error }\n      }\n\n      throw error\n    }\n  }\n}\n","import {\n  StorageApiError,\n  StorageError,\n  StorageUnknownError,\n  isStorageError,\n} from '../lib/common/errors'\nimport { get, head, post, put, remove, Fetch } from '../lib/common/fetch'\nimport { setHeader } from '../lib/common/headers'\nimport { encodeStoragePath, recursiveToCamel } from '../lib/common/helpers'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport {\n  FileObject,\n  FileOptions,\n  SearchOptions,\n  FetchParameters,\n  TransformOptions,\n  DestinationOptions,\n  FileObjectV2,\n  Camelize,\n  SearchV2Options,\n  SearchV2Result,\n  PurgeCacheOptions,\n} from '../lib/types'\nimport BlobDownloadBuilder from './BlobDownloadBuilder'\n\nconst DEFAULT_SEARCH_OPTIONS = {\n  limit: 100,\n  offset: 0,\n  sortBy: {\n    column: 'name',\n    order: 'asc',\n  },\n}\n\nconst DEFAULT_FILE_OPTIONS: FileOptions = {\n  cacheControl: '3600',\n  contentType: 'text/plain;charset=UTF-8',\n  upsert: false,\n}\n\ntype FileBody =\n  | ArrayBuffer\n  | ArrayBufferView\n  | Blob\n  | Buffer\n  | File\n  | FormData\n  | NodeJS.ReadableStream\n  | ReadableStream<Uint8Array>\n  | URLSearchParams\n  | string\n\nexport default class StorageFileApi extends BaseApiClient<StorageError> {\n  protected bucketId: string | undefined\n\n  constructor(\n    url: string,\n    headers: { [key: string]: string } = {},\n    bucketId?: string,\n    fetch?: Fetch\n  ) {\n    super(url, headers, fetch, 'storage')\n    this.bucketId = bucketId\n  }\n\n  /**\n   * Uploads a file to an existing bucket or replaces an existing file at the specified path with a new one.\n   *\n   * @param method HTTP method.\n   * @param path The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n   * @param fileBody The body of the file to be stored in the bucket.\n   */\n  private async uploadOrUpdate(\n    method: 'POST' | 'PUT',\n    path: string,\n    fileBody: FileBody,\n    fileOptions?: FileOptions\n  ): Promise<\n    | {\n        data: { id: string; path: string; fullPath: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      let body\n      const options = { ...DEFAULT_FILE_OPTIONS, ...fileOptions }\n      let headers: Record<string, string> = {\n        ...this.headers,\n        ...(method === 'POST' && { 'x-upsert': String(options.upsert as boolean) }),\n      }\n\n      const metadata = options.metadata\n\n      if (typeof Blob !== 'undefined' && fileBody instanceof Blob) {\n        body = new FormData()\n        body.append('cacheControl', options.cacheControl as string)\n        if (metadata) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n        body.append('', fileBody)\n      } else if (typeof FormData !== 'undefined' && fileBody instanceof FormData) {\n        body = fileBody\n        // Only append if not already present\n        if (!body.has('cacheControl')) {\n          body.append('cacheControl', options.cacheControl as string)\n        }\n        if (metadata && !body.has('metadata')) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n      } else {\n        body = fileBody\n        headers['cache-control'] = `max-age=${options.cacheControl}`\n        headers['content-type'] = options.contentType as string\n\n        if (metadata) {\n          headers['x-metadata'] = this.toBase64(this.encodeMetadata(metadata))\n        }\n\n        // Node.js streams require duplex option for fetch in Node 20+\n        // Check for both web ReadableStream and Node.js streams\n        const isStream =\n          (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream) ||\n          (body && typeof body === 'object' && 'pipe' in body && typeof body.pipe === 'function')\n\n        if (isStream && !options.duplex) {\n          options.duplex = 'half'\n        }\n      }\n\n      if (fileOptions?.headers) {\n        for (const [key, value] of Object.entries(fileOptions.headers)) {\n          headers = setHeader(headers, key, value)\n        }\n      }\n\n      const cleanPath = this._removeEmptyFolders(path)\n      const _path = this._getFinalPath(cleanPath)\n      const data = await (method == 'PUT' ? put : post)(\n        this.fetch,\n        `${this.url}/object/${_path}`,\n        body as object,\n        { headers, ...(options?.duplex ? { duplex: options.duplex } : {}) }\n      )\n\n      return { path: cleanPath, id: data.Id, fullPath: data.Key }\n    })\n  }\n\n  /**\n   * Uploads a file to an existing bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n   * @param fileBody The body of the file to be stored in the bucket.\n   * @param fileOptions Optional file upload options including cacheControl, contentType, upsert, and metadata.\n   * @returns Promise with response containing file path, id, and fullPath or error\n   *\n   * @example Upload file\n   * ```js\n   * const avatarFile = event.target.files[0]\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .upload('public/avatar1.png', avatarFile, {\n   *     cacheControl: '3600',\n   *     upsert: false\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"public/avatar1.png\",\n   *     \"fullPath\": \"avatars/public/avatar1.png\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Upload file using `ArrayBuffer` from base64 file data\n   * ```js\n   * import { decode } from 'base64-arraybuffer'\n   *\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .upload('public/avatar1.png', decode('base64FileData'), {\n   *     contentType: 'image/png'\n   *   })\n   * ```\n   *\n   * @example Handling errors\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .upload('public/avatar1.png', avatarFile)\n   *\n   * if (error) {\n   *   // Log the full error so fields like `statusCode` and `error` (the\n   *   // Storage error name, e.g. \"Duplicate\") aren't hidden behind `error.message`.\n   *   console.error(error)\n   *   return\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: only `insert` when you are uploading new files and `select`, `insert` and `update` when you are upserting files\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   * - For React Native, using either `Blob`, `File` or `FormData` does not work as intended. Upload file using `ArrayBuffer` from base64 file data instead, see example below.\n   */\n  async upload(\n    path: string,\n    fileBody: FileBody,\n    fileOptions?: FileOptions\n  ): Promise<\n    | {\n        data: { id: string; path: string; fullPath: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.uploadOrUpdate('POST', path, fileBody, fileOptions)\n  }\n\n  /**\n   * Upload a file with a token generated from `createSignedUploadUrl`.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n   * @param token The token generated from `createSignedUploadUrl`\n   * @param fileBody The body of the file to be stored in the bucket.\n   * @param fileOptions HTTP headers (cacheControl, contentType, etc.).\n   * **Note:** The `upsert` option has no effect here. To enable upsert behavior,\n   * pass `{ upsert: true }` when calling `createSignedUploadUrl()` instead.\n   * @returns Promise with response containing file path and fullPath or error\n   *\n   * @example Upload to a signed URL\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .uploadToSignedUrl('folder/cat.jpg', 'token-from-createSignedUploadUrl', file)\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"folder/cat.jpg\",\n   *     \"fullPath\": \"avatars/folder/cat.jpg\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async uploadToSignedUrl(\n    path: string,\n    token: string,\n    fileBody: FileBody,\n    fileOptions?: FileOptions\n  ) {\n    const cleanPath = this._removeEmptyFolders(path)\n    const _path = this._getFinalPath(cleanPath)\n\n    const url = new URL(this.url + `/object/upload/sign/${_path}`)\n    url.searchParams.set('token', token)\n\n    return this.handleOperation(async () => {\n      let body\n      const options = { ...DEFAULT_FILE_OPTIONS, ...fileOptions }\n      let headers: Record<string, string> = {\n        ...this.headers,\n        ...{ 'x-upsert': String(options.upsert as boolean) },\n      }\n\n      const metadata = options.metadata\n\n      if (typeof Blob !== 'undefined' && fileBody instanceof Blob) {\n        body = new FormData()\n        body.append('cacheControl', options.cacheControl as string)\n        if (metadata) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n        body.append('', fileBody)\n      } else if (typeof FormData !== 'undefined' && fileBody instanceof FormData) {\n        body = fileBody\n        if (!body.has('cacheControl')) {\n          body.append('cacheControl', options.cacheControl as string)\n        }\n        if (metadata && !body.has('metadata')) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n      } else {\n        body = fileBody\n        headers['cache-control'] = `max-age=${options.cacheControl}`\n        headers['content-type'] = options.contentType as string\n        if (metadata) {\n          headers['x-metadata'] = this.toBase64(this.encodeMetadata(metadata))\n        }\n\n        const isStream =\n          (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream) ||\n          (body && typeof body === 'object' && 'pipe' in body && typeof body.pipe === 'function')\n\n        if (isStream && !options.duplex) {\n          options.duplex = 'half'\n        }\n      }\n\n      if (fileOptions?.headers) {\n        for (const [key, value] of Object.entries(fileOptions.headers)) {\n          headers = setHeader(headers, key, value)\n        }\n      }\n\n      const data = await put(this.fetch, url.toString(), body as object, {\n        headers,\n        ...(options?.duplex ? { duplex: options.duplex } : {}),\n      })\n\n      return { path: cleanPath, fullPath: data.Key }\n    })\n  }\n\n  /**\n   * Creates a signed upload URL.\n   * Signed upload URLs can be used to upload files to the bucket without further authentication.\n   * They are valid for 2 hours.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the current file name. For example `folder/image.png`.\n   * @param options.upsert If set to true, allows the file to be overwritten if it already exists.\n   * @returns Promise with response containing signed upload URL, token, and path or error\n   *\n   * @example Create Signed Upload URL\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUploadUrl('folder/cat.jpg')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"signedUrl\": \"https://example.supabase.co/storage/v1/object/upload/sign/avatars/folder/cat.jpg?token=<TOKEN>\",\n   *     \"path\": \"folder/cat.jpg\",\n   *     \"token\": \"<TOKEN>\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `insert`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createSignedUploadUrl(\n    path: string,\n    options?: { upsert: boolean }\n  ): Promise<\n    | {\n        data: { signedUrl: string; token: string; path: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      let _path = this._getFinalPath(path)\n\n      const headers = { ...this.headers }\n\n      if (options?.upsert) {\n        headers['x-upsert'] = 'true'\n      }\n\n      const data = await post(\n        this.fetch,\n        `${this.url}/object/upload/sign/${_path}`,\n        {},\n        { headers }\n      )\n\n      const url = new URL(this.url + data.url)\n\n      const token = url.searchParams.get('token')\n\n      if (!token) {\n        throw new StorageError('No token returned by API')\n      }\n\n      return { signedUrl: url.toString(), path, token }\n    })\n  }\n\n  /**\n   * Replaces an existing file at the specified path with a new one.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to update.\n   * @param fileBody The body of the file to be stored in the bucket.\n   * @param fileOptions Optional file upload options including cacheControl, contentType, and metadata.\n   * **Note:** The `upsert` option has no effect here. `update()` always replaces the\n   * file at the given path, so the `x-upsert` header is not sent. To control upsert\n   * behavior, use `upload()` instead.\n   * @returns Promise with response containing file path, id, and fullPath or error\n   *\n   * @example Update file\n   * ```js\n   * const avatarFile = event.target.files[0]\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .update('public/avatar1.png', avatarFile, {\n   *     cacheControl: '3600'\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"public/avatar1.png\",\n   *     \"fullPath\": \"avatars/public/avatar1.png\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Update file using `ArrayBuffer` from base64 file data\n   * ```js\n   * import {decode} from 'base64-arraybuffer'\n   *\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .update('public/avatar1.png', decode('base64FileData'), {\n   *     contentType: 'image/png'\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `update` and `select`\n   * - `update()` always replaces the file at the given path regardless of the `upsert` option.\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   * - For React Native, using either `Blob`, `File` or `FormData` does not work as intended. Update file using `ArrayBuffer` from base64 file data instead, see example below.\n   */\n  async update(\n    path: string,\n    fileBody:\n      | ArrayBuffer\n      | ArrayBufferView\n      | Blob\n      | Buffer\n      | File\n      | FormData\n      | NodeJS.ReadableStream\n      | ReadableStream<Uint8Array>\n      | URLSearchParams\n      | string,\n    fileOptions?: FileOptions\n  ): Promise<\n    | {\n        data: { id: string; path: string; fullPath: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.uploadOrUpdate('PUT', path, fileBody, fileOptions)\n  }\n\n  /**\n   * Moves an existing file to a new path in the same bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param fromPath The original file path, including the current file name. For example `folder/image.png`.\n   * @param toPath The new file path, including the new file name. For example `folder/image-new.png`.\n   * @param options The destination options.\n   * @returns Promise with response containing success message or error\n   *\n   * @example Move file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .move('public/avatar1.png', 'private/avatar2.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"message\": \"Successfully moved\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `update` and `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async move(\n    fromPath: string,\n    toPath: string,\n    options?: DestinationOptions\n  ): Promise<\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      return await post(\n        this.fetch,\n        `${this.url}/object/move`,\n        {\n          bucketId: this.bucketId,\n          sourceKey: fromPath,\n          destinationKey: toPath,\n          destinationBucket: options?.destinationBucket,\n        },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * Copies an existing file to a new path in the same bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param fromPath The original file path, including the current file name. For example `folder/image.png`.\n   * @param toPath The new file path, including the new file name. For example `folder/image-copy.png`.\n   * @param options The destination options.\n   * @returns Promise with response containing copied file path or error\n   *\n   * @example Copy file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .copy('public/avatar1.png', 'private/avatar2.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"avatars/private/avatar2.png\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `insert` and `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async copy(\n    fromPath: string,\n    toPath: string,\n    options?: DestinationOptions\n  ): Promise<\n    | {\n        data: { path: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      const data = await post(\n        this.fetch,\n        `${this.url}/object/copy`,\n        {\n          bucketId: this.bucketId,\n          sourceKey: fromPath,\n          destinationKey: toPath,\n          destinationBucket: options?.destinationBucket,\n        },\n        { headers: this.headers }\n      )\n      return { path: data.Key }\n    })\n  }\n\n  /**\n   * Creates a signed URL. Use a signed URL to share a file for a fixed amount of time.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the current file name. For example `folder/image.png`.\n   * @param expiresIn The number of seconds until the signed URL expires. For example, `60` for a URL which is valid for one minute.\n   * @param options.download triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n   * @param options.transform Transform the asset before serving it to the client.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @returns Promise with response containing signed URL or error\n   *\n   * @example Create Signed URL\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrl('folder/avatar1.png', 60)\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=<TOKEN>\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Create a signed URL for an asset with transformations\n   * ```js\n   * const { data } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrl('folder/avatar1.png', 60, {\n   *     transform: {\n   *       width: 100,\n   *       height: 100,\n   *     }\n   *   })\n   * ```\n   *\n   * @example Create a signed URL which triggers the download of the asset\n   * ```js\n   * const { data } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrl('folder/avatar1.png', 60, {\n   *     download: true,\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createSignedUrl(\n    path: string,\n    expiresIn: number,\n    options?: {\n      download?: string | boolean\n      transform?: TransformOptions\n      cacheNonce?: string\n    }\n  ): Promise<\n    | {\n        data: { signedUrl: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      let _path = this._getFinalPath(path)\n\n      const hasTransform =\n        typeof options?.transform === 'object' &&\n        options.transform !== null &&\n        Object.keys(options.transform).length > 0\n\n      let data = await post(\n        this.fetch,\n        `${this.url}/object/sign/${_path}`,\n        { expiresIn, ...(hasTransform ? { transform: options!.transform } : {}) },\n        { headers: this.headers }\n      )\n\n      const query = new URLSearchParams()\n      if (options?.download)\n        query.set('download', options.download === true ? '' : options.download)\n      if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n      const queryString = query.toString()\n\n      // `data.signedURL` contains a `token` query parameter, so append extra params with `&`\n      // only when we actually have something to add.\n      const signedUrl = encodeURI(\n        `${this.url}${data.signedURL}${queryString ? `&${queryString}` : ''}`\n      )\n\n      return { signedUrl }\n    })\n  }\n\n  /**\n   * Creates multiple signed URLs. Use a signed URL to share a file for a fixed amount of time.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param paths The file paths to be downloaded, including the current file names. For example `['folder/image.png', 'folder2/image2.png']`.\n   * @param expiresIn The number of seconds until the signed URLs expire. For example, `60` for URLs which are valid for one minute.\n   * @param options.download triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @returns Promise with response containing array of objects with signedUrl, path, and error or error\n   *\n   * @example Create Signed URLs\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrls(['folder/avatar1.png', 'folder/avatar2.png'], 60)\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"error\": null,\n   *       \"path\": \"folder/avatar1.png\",\n   *       \"signedURL\": \"/object/sign/avatars/folder/avatar1.png?token=<TOKEN>\",\n   *       \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=<TOKEN>\"\n   *     },\n   *     {\n   *       \"error\": null,\n   *       \"path\": \"folder/avatar2.png\",\n   *       \"signedURL\": \"/object/sign/avatars/folder/avatar2.png?token=<TOKEN>\",\n   *       \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar2.png?token=<TOKEN>\"\n   *     }\n   *   ],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createSignedUrls(\n    paths: string[],\n    expiresIn: number,\n    options?: { download?: string | boolean; cacheNonce?: string }\n  ): Promise<\n    | {\n        data: {\n          error: string | null\n          path: string | null\n          signedURL: string | null\n          signedUrl: string | null\n        }[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      const data = await post(\n        this.fetch,\n        `${this.url}/object/sign/${this.bucketId}`,\n        { expiresIn, paths },\n        { headers: this.headers }\n      )\n\n      const query = new URLSearchParams()\n\n      if (options?.download)\n        query.set('download', options.download === true ? '' : options.download)\n      if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n\n      const queryString = query.toString()\n\n      return data.map(\n        (datum: { error: string | null; path: string | null; signedURL: string | null }) => ({\n          ...datum,\n          signedUrl: datum.signedURL\n            ? encodeURI(`${this.url}${datum.signedURL}${queryString ? `&${queryString}` : ''}`)\n            : null,\n        })\n      )\n    })\n  }\n\n  /**\n   * Downloads a file from a private bucket. For public buckets, make a request to the URL returned from `getPublicUrl` instead.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The full path and file name of the file to be downloaded. For example `folder/image.png`.\n   * @param options Optional settings: `transform` to transform the asset before serving it to the client, and `cacheNonce` to append a cache nonce parameter to the URL to invalidate the cache.\n   * @param parameters Additional fetch parameters like signal for cancellation. Supports standard fetch options including cache control.\n   * @returns BlobDownloadBuilder instance for downloading the file\n   *\n   * @example Download file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": <BLOB>,\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Download file with transformations\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png', {\n   *     transform: {\n   *       width: 100,\n   *       height: 100,\n   *       quality: 80\n   *     }\n   *   })\n   * ```\n   *\n   * @example Download with cache control (useful in Edge Functions)\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png', {}, { cache: 'no-store' })\n   * ```\n   *\n   * @example Download with abort signal\n   * ```js\n   * const controller = new AbortController()\n   * setTimeout(() => controller.abort(), 5000)\n   *\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png', {}, { signal: controller.signal })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  download<Options extends { transform?: TransformOptions; cacheNonce?: string }>(\n    path: string,\n    options?: Options,\n    parameters?: FetchParameters\n  ): BlobDownloadBuilder {\n    const wantsTransformation =\n      typeof options?.transform === 'object' &&\n      options.transform !== null &&\n      Object.keys(options.transform).length > 0\n    const renderPath = wantsTransformation ? 'render/image/authenticated' : 'object'\n\n    const query = new URLSearchParams()\n    if (options?.transform) this.applyTransformOptsToQuery(query, options.transform)\n    if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n    const queryString = query.toString()\n\n    const _path = this._getFinalPath(path)\n    const downloadFn = () =>\n      get(\n        this.fetch,\n        `${this.url}/${renderPath}/${_path}${queryString ? `?${queryString}` : ''}`,\n        {\n          headers: this.headers,\n          noResolveJson: true,\n        },\n        parameters\n      )\n    return new BlobDownloadBuilder(downloadFn, this.shouldThrowOnError)\n  }\n\n  /**\n   * Retrieves the details of an existing file.\n   *\n   * Returns detailed file metadata including size, content type, and timestamps.\n   * Note: The API returns `last_modified` field, not `updated_at`.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. For example `folder/image.png`.\n   * @returns Promise with response containing file metadata or error\n   *\n   * @example Get file info\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .info('folder/avatar1.png')\n   *\n   * if (data) {\n   *   console.log('Last modified:', data.lastModified)\n   *   console.log('Size:', data.size)\n   * }\n   * ```\n   */\n  async info(path: string): Promise<\n    | {\n        data: Camelize<FileObjectV2>\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    const _path = this._getFinalPath(path)\n\n    return this.handleOperation(async () => {\n      const data = await get(this.fetch, `${this.url}/object/info/${_path}`, {\n        headers: this.headers,\n      })\n\n      return recursiveToCamel(data) as Camelize<FileObjectV2>\n    })\n  }\n\n  /**\n   * Checks the existence of a file.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. For example `folder/image.png`.\n   * @returns Promise with response containing boolean indicating file existence or error\n   *\n   * @example Check file existence\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .exists('folder/avatar1.png')\n   * ```\n   */\n  async exists(path: string): Promise<\n    | {\n        data: boolean\n        error: null\n      }\n    | {\n        data: boolean\n        error: StorageError\n      }\n  > {\n    const _path = this._getFinalPath(path)\n\n    try {\n      await head(this.fetch, `${this.url}/object/${_path}`, {\n        headers: this.headers,\n      })\n\n      return { data: true, error: null }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n      if (isStorageError(error)) {\n        // HEAD requests produce StorageApiError (via handleError) or StorageUnknownError (legacy)\n        const status =\n          error instanceof StorageApiError\n            ? error.status\n            : error instanceof StorageUnknownError\n              ? (error.originalError as { status: number })?.status\n              : undefined\n\n        if (status !== undefined && [400, 404].includes(status)) {\n          return { data: false, error }\n        }\n      }\n\n      throw error\n    }\n  }\n\n  /**\n   * A simple convenience function to get the URL for an asset in a public bucket. If you do not want to use this function, you can construct the public URL by concatenating the bucket URL with the path to the asset.\n   * This function does not verify if the bucket is public. If a public URL is created for a bucket which is not public, you will not be able to download the asset.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The path and name of the file to generate the public URL for. For example `folder/image.png`.\n   * @param options.download Triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n   * @param options.transform Transform the asset before serving it to the client.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @returns Object with public URL\n   *\n   * @example Returns the URL for an asset in a public bucket\n   * ```js\n   * const { data } = supabase\n   *   .storage\n   *   .from('public-bucket')\n   *   .getPublicUrl('folder/avatar1.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"publicUrl\": \"https://example.supabase.co/storage/v1/object/public/public-bucket/folder/avatar1.png\"\n   *   }\n   * }\n   * ```\n   *\n   * @example Returns the URL for an asset in a public bucket with transformations\n   * ```js\n   * const { data } = supabase\n   *   .storage\n   *   .from('public-bucket')\n   *   .getPublicUrl('folder/avatar1.png', {\n   *     transform: {\n   *       width: 100,\n   *       height: 100,\n   *     }\n   *   })\n   * ```\n   *\n   * @example Returns the URL which triggers the download of an asset in a public bucket\n   * ```js\n   * const { data } = supabase\n   *   .storage\n   *   .from('public-bucket')\n   *   .getPublicUrl('folder/avatar1.png', {\n   *     download: true,\n   *   })\n   * ```\n   *\n   * @remarks\n   * - The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [supabase.com/dashboard](https://supabase.com/dashboard), clicking the overflow menu on a bucket and choosing \"Make public\"\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  getPublicUrl(\n    path: string,\n    options?: {\n      download?: string | boolean\n      transform?: TransformOptions\n      cacheNonce?: string\n    }\n  ): { data: { publicUrl: string } } {\n    const _path = this._getFinalPath(path)\n\n    const query = new URLSearchParams()\n    if (options?.download) query.set('download', options.download === true ? '' : options.download)\n    if (options?.transform) this.applyTransformOptsToQuery(query, options.transform)\n    if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n    const queryString = query.toString()\n\n    const wantsTransformation =\n      typeof options?.transform === 'object' &&\n      options.transform !== null &&\n      Object.keys(options.transform).length > 0\n    const renderPath = wantsTransformation ? 'render/image' : 'object'\n\n    return {\n      data: {\n        publicUrl:\n          encodeURI(`${this.url}/${renderPath}/public/${_path}`) +\n          (queryString ? `?${queryString}` : ''),\n      },\n    }\n  }\n\n  /**\n   * Deletes files within the same bucket\n   *\n   * Returns an array of FileObject entries for the deleted files. Note that deprecated\n   * fields like `bucket_id` may or may not be present in the response - do not rely on them.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param paths An array of files to delete, including the path and file name. For example [`'folder/image.png'`].\n   * @returns Promise with response containing array of deleted file objects or error\n   *\n   * @example Delete file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .remove(['folder/avatar1.png'])\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `delete` and `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async remove(paths: string[]): Promise<\n    | {\n        data: FileObject[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      return await remove(\n        this.fetch,\n        `${this.url}/object/${this.bucketId}`,\n        { prefixes: paths },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * Purges the CDN cache for a single object in this bucket.\n   *\n   * Maps to `DELETE /cdn/{bucket}/{path}` on the Storage API. The server\n   * issues a CDN invalidation for the object and returns `{ message: 'success' }`.\n   *\n   * **Requires the `service_role` key.** The underlying endpoint enforces\n   * `service_role` JWT — calls made with the anon key or a user JWT will be\n   * rejected by the server.\n   *\n   * **Hosted CDN feature.** On self-hosted Supabase, the Storage service must\n   * have `CDN_PURGE_ENDPOINT_URL` configured and the `purgeCache` tenant\n   * feature enabled, otherwise the server returns an error.\n   *\n   * Operates on a single object path. There is no wildcard or recursion: pass\n   * the exact path of the object you want invalidated.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The path (relative to the bucket) of the object to purge, e.g. `folder/avatar.png`.\n   * @param options Optional purge cache options.\n   * @param options.transformations If true, purges only transformations (resized/formatted variants), leaving the original cached file intact.\n   * @param parameters Optional fetch parameters such as an `AbortController` signal.\n   * @returns Promise with `{ data: { message }, error: null }` on success or `{ data: null, error }` on failure.\n   *\n   * @example Purge a single cached object\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .purgeCache('folder/avatar1.png')\n   * ```\n   *\n   * @example Purge only transformations for a single object\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .purgeCache('folder/avatar1.png', { transformations: true })\n   * ```\n   */\n  async purgeCache(\n    path: string,\n    options?: PurgeCacheOptions,\n    parameters?: FetchParameters\n  ): Promise<\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      const _path = encodeStoragePath(this._getFinalPath(path))\n      const query = new URLSearchParams()\n      if (options?.transformations) {\n        query.set('transformations', 'true')\n      }\n      const queryString = query.toString()\n\n      return await remove(\n        this.fetch,\n        `${this.url}/cdn/${_path}${queryString ? `?${queryString}` : ''}`,\n        {},\n        { headers: this.headers },\n        parameters\n      )\n    })\n  }\n\n  /**\n   * Get file metadata\n   * @param id the file id to retrieve metadata\n   */\n  // async getMetadata(\n  //   id: string\n  // ): Promise<\n  //   | {\n  //       data: Metadata\n  //       error: null\n  //     }\n  //   | {\n  //       data: null\n  //       error: StorageError\n  //     }\n  // > {\n  //   try {\n  //     const data = await get(this.fetch, `${this.url}/metadata/${id}`, { headers: this.headers })\n  //     return { data, error: null }\n  //   } catch (error) {\n  //     if (isStorageError(error)) {\n  //       return { data: null, error }\n  //     }\n\n  //     throw error\n  //   }\n  // }\n\n  /**\n   * Update file metadata\n   * @param id the file id to update metadata\n   * @param meta the new file metadata\n   */\n  // async updateMetadata(\n  //   id: string,\n  //   meta: Metadata\n  // ): Promise<\n  //   | {\n  //       data: Metadata\n  //       error: null\n  //     }\n  //   | {\n  //       data: null\n  //       error: StorageError\n  //     }\n  // > {\n  //   try {\n  //     const data = await post(\n  //       this.fetch,\n  //       `${this.url}/metadata/${id}`,\n  //       { ...meta },\n  //       { headers: this.headers }\n  //     )\n  //     return { data, error: null }\n  //   } catch (error) {\n  //     if (isStorageError(error)) {\n  //       return { data: null, error }\n  //     }\n\n  //     throw error\n  //   }\n  // }\n\n  /**\n   * Lists all the files and folders within a path of the bucket.\n   *\n   * **Important:** For folder entries, fields like `id`, `updated_at`, `created_at`,\n   * `last_accessed_at`, and `metadata` will be `null`. Only files have these fields populated.\n   * Additionally, deprecated fields like `bucket_id`, `owner`, and `buckets` are NOT returned\n   * by this method.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The folder path.\n   * @param options Search options including limit (defaults to 100), offset, sortBy, and search\n   * @param parameters Optional fetch parameters including signal for cancellation\n   * @returns Promise with response containing array of files/folders or error\n   *\n   * @example List files in a bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .list('folder', {\n   *     limit: 100,\n   *     offset: 0,\n   *     sortBy: { column: 'name', order: 'asc' },\n   *   })\n   *\n   * // Handle files vs folders\n   * data?.forEach(item => {\n   *   if (item.id !== null) {\n   *     // It's a file\n   *     console.log('File:', item.name, 'Size:', item.metadata?.size)\n   *   } else {\n   *     // It's a folder\n   *     console.log('Folder:', item.name)\n   *   }\n   * })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"avatar1.png\",\n   *       \"id\": \"e668cf7f-821b-4a2f-9dce-7dfa5dd1cfd2\",\n   *       \"updated_at\": \"2024-05-22T23:06:05.580Z\",\n   *       \"created_at\": \"2024-05-22T23:04:34.443Z\",\n   *       \"last_accessed_at\": \"2024-05-22T23:04:34.443Z\",\n   *       \"metadata\": {\n   *         \"eTag\": \"\\\"c5e8c553235d9af30ef4f6e280790b92\\\"\",\n   *         \"size\": 32175,\n   *         \"mimetype\": \"image/png\",\n   *         \"cacheControl\": \"max-age=3600\",\n   *         \"lastModified\": \"2024-05-22T23:06:05.574Z\",\n   *         \"contentLength\": 32175,\n   *         \"httpStatusCode\": 200\n   *       }\n   *     }\n   *   ],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Search files in a bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .list('folder', {\n   *     limit: 100,\n   *     offset: 0,\n   *     sortBy: { column: 'name', order: 'asc' },\n   *     search: 'jon'\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async list(\n    path?: string,\n    options?: SearchOptions,\n    parameters?: FetchParameters\n  ): Promise<\n    | {\n        data: FileObject[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      // Deep-merge `sortBy` so overriding only one of its keys (e.g. `column`) keeps the\n      // default for the other (e.g. `order`), matching how the top-level defaults behave.\n      const sortBy = options?.sortBy\n        ? { ...DEFAULT_SEARCH_OPTIONS.sortBy, ...options.sortBy }\n        : DEFAULT_SEARCH_OPTIONS.sortBy\n      const body = { ...DEFAULT_SEARCH_OPTIONS, ...options, sortBy, prefix: path || '' }\n      return await post(\n        this.fetch,\n        `${this.url}/object/list/${this.bucketId}`,\n        body,\n        { headers: this.headers },\n        parameters\n      )\n    })\n  }\n\n  /**\n   * Lists all the files and folders within a bucket using the V2 API with pagination support.\n   *\n   * **Important:** Folder entries in the `folders` array only contain `name` and optionally `key` —\n   * they have no `id`, timestamps, or `metadata` fields. Full file metadata is only available\n   * on entries in the `objects` array.\n   *\n   * @experimental this method signature might change in the future\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param options Search options including prefix, cursor for pagination, limit, with_delimiter\n   * @param parameters Optional fetch parameters including signal for cancellation\n   * @returns Promise with response containing folders/objects arrays with pagination info or error\n   *\n   * @example List files with pagination\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .listV2({\n   *     prefix: 'folder/',\n   *     limit: 100,\n   *   })\n   *\n   * // Handle pagination\n   * if (data?.hasNext) {\n   *   const nextPage = await supabase\n   *     .storage\n   *     .from('avatars')\n   *     .listV2({\n   *       prefix: 'folder/',\n   *       cursor: data.nextCursor,\n   *     })\n   * }\n   *\n   * // Handle files vs folders\n   * data?.objects.forEach(file => {\n   *   if (file.id !== null) {\n   *     console.log('File:', file.name, 'Size:', file.metadata?.size)\n   *   }\n   * })\n   * data?.folders.forEach(folder => {\n   *   console.log('Folder:', folder.name)\n   * })\n   * ```\n   */\n  async listV2(\n    options?: SearchV2Options,\n    parameters?: FetchParameters\n  ): Promise<\n    | {\n        data: SearchV2Result\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  > {\n    return this.handleOperation(async () => {\n      const body = { ...options }\n      return await post(\n        this.fetch,\n        `${this.url}/object/list-v2/${this.bucketId}`,\n        body,\n        { headers: this.headers },\n        parameters\n      )\n    })\n  }\n\n  protected encodeMetadata(metadata: Record<string, any>) {\n    return JSON.stringify(metadata)\n  }\n\n  toBase64(data: string) {\n    if (typeof Buffer !== 'undefined') {\n      return Buffer.from(data).toString('base64')\n    }\n    return btoa(data)\n  }\n\n  private _getFinalPath(path: string) {\n    return `${this.bucketId}/${path.replace(/^\\/+/, '')}`\n  }\n\n  private _removeEmptyFolders(path: string) {\n    return path.replace(/^\\/|\\/$/g, '').replace(/\\/+/g, '/')\n  }\n\n  /** Modifies the `query`, appending values the from `transform` */\n  private applyTransformOptsToQuery(\n    query: URLSearchParams,\n    transform: TransformOptions\n  ): URLSearchParams {\n    if (transform.width) query.set('width', transform.width.toString())\n    if (transform.height) query.set('height', transform.height.toString())\n    if (transform.resize) query.set('resize', transform.resize)\n    if (transform.format) query.set('format', transform.format)\n    if (transform.quality) query.set('quality', transform.quality.toString())\n\n    return query\n  }\n}\n","// Generated automatically during releases by scripts/update-version-files.ts\n// This file provides runtime access to the package version for:\n// - HTTP request headers (e.g., X-Client-Info header for API requests)\n// - Debugging and support (identifying which version is running)\n// - Telemetry and logging (version reporting in errors/analytics)\n// - Ensuring build artifacts match the published package version\nexport const version = '2.112.3'\n","import { version } from './version'\nexport const DEFAULT_HEADERS = {\n  'X-Client-Info': `storage-js/${version}`,\n}\n","/**\n * WorkBuddy Cloud Storage facade（#89098）\n *\n * 生成应用只使用环境内固定的 `runtime` 逻辑 Bucket。物理 COS Bucket 与 envId\n * BasePath 由 TCB 管理，SDK 不感知；Bucket 创建/删除/清空属于可信控制面，\n * 不暴露给终端应用。\n */\n\nimport { CLOUD_MODULE_PATHS } from '../paths.js';\nimport type { CloudRuntimeConfig } from '../types.js';\nimport StorageFileApi from '../vendor/storage/packages/StorageFileApi.js';\nimport { DEFAULT_HEADERS } from '../vendor/storage/lib/constants.js';\nimport type { StorageClient } from '../vendor/storage/StorageClient.js';\n\nexport const RUNTIME_STORAGE_BUCKET = 'runtime';\nexport const DEFAULT_SIGNED_URL_TTL_SECONDS = 10 * 60;\nexport const MAX_SIGNED_URL_TTL_SECONDS = 60 * 60;\n\nexport type CloudStorageFileBody =\n    | ArrayBuffer\n    | ArrayBufferView\n    | Blob\n    | File\n    | FormData\n    | ReadableStream<Uint8Array>\n    | URLSearchParams\n    | string;\n\nexport interface CloudStorageFileOptions {\n    cacheControl?: string;\n    contentType?: string;\n    upsert?: boolean;\n    duplex?: string;\n    metadata?: Record<string, unknown>;\n}\n\nexport interface CloudStorageListOptions {\n    limit?: number;\n    offset?: number;\n    sortBy?: { column?: string; order?: string };\n    search?: string;\n}\n\nexport interface CloudStorageCursorListOptions {\n    limit?: number;\n    prefix?: string;\n    cursor?: string;\n    with_delimiter?: boolean;\n    sortBy?: {\n        column: 'name' | 'updated_at' | 'created_at';\n        order?: 'asc' | 'desc';\n    };\n}\n\nexport interface CloudStorageMetadata {\n    eTag?: string;\n    size?: number;\n    mimetype?: string;\n    cacheControl?: string;\n    lastModified?: string;\n    contentLength?: number;\n    httpStatusCode?: number;\n    [key: string]: unknown;\n}\n\nexport interface CloudStorageFile {\n    name: string;\n    id: string | null;\n    updated_at: string | null;\n    created_at: string | null;\n    last_accessed_at: string | null;\n    metadata: CloudStorageMetadata | null;\n}\n\nexport interface CloudStorageObjectInfo {\n    id: string;\n    version: string;\n    name: string;\n    bucketId: string;\n    createdAt: string;\n    size?: number;\n    cacheControl?: string;\n    contentType?: string;\n    etag?: string;\n    lastModified?: string;\n    metadata?: CloudStorageMetadata;\n}\n\nexport interface CloudStorageCursorObject {\n    name: string;\n    key?: string;\n    id: string;\n    updated_at: string;\n    created_at: string;\n    metadata: CloudStorageMetadata | null;\n}\n\nexport interface CloudStorageCursorFolder {\n    name: string;\n    key?: string;\n}\n\nexport interface CloudStorageListResult {\n    hasNext: boolean;\n    folders: CloudStorageCursorFolder[];\n    objects: CloudStorageCursorObject[];\n    nextCursor?: string;\n}\n\nexport interface CloudStorageError {\n    name: string;\n    message: string;\n    status?: number;\n    statusCode?: string;\n    code?: string;\n    cause?: unknown;\n}\n\nexport type CloudStorageResult<T> =\n    | { data: T; error: null }\n    | { data: null; error: CloudStorageError };\n\n/** SDK 路径非法。请求尚未发出。 */\nexport class CloudStoragePathError extends Error {\n    constructor(message: string) {\n        super(message);\n        this.name = 'CloudStoragePathError';\n    }\n}\n\nexport class WorkBuddyStorageDownload implements Promise<CloudStorageResult<Blob>> {\n    readonly [Symbol.toStringTag] = 'WorkBuddyStorageDownload';\n\n    constructor(\n        private readonly blob: () => Promise<CloudStorageResult<Blob>>,\n        private readonly stream: () => Promise<CloudStorageResult<ReadableStream>>,\n    ) {}\n\n    asStream(): Promise<CloudStorageResult<ReadableStream>> {\n        return this.stream();\n    }\n\n    then<TResult1 = CloudStorageResult<Blob>, TResult2 = never>(\n        onfulfilled?:\n            | ((value: CloudStorageResult<Blob>) => TResult1 | PromiseLike<TResult1>)\n            | null,\n        onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n    ): Promise<TResult1 | TResult2> {\n        return this.blob().then(onfulfilled, onrejected);\n    }\n\n    catch<TResult = never>(\n        onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n    ): Promise<CloudStorageResult<Blob> | TResult> {\n        return this.blob().catch(onrejected);\n    }\n\n    finally(onfinally?: (() => void) | null): Promise<CloudStorageResult<Blob>> {\n        return this.blob().finally(onfinally);\n    }\n}\n\nexport class WorkBuddyStorageBucket {\n    private readonly fileApi: StorageFileApi;\n\n    constructor(fileApi: unknown) {\n        this.fileApi = fileApi as StorageFileApi;\n    }\n\n    upload(\n        path: string,\n        body: CloudStorageFileBody,\n        options?: CloudStorageFileOptions,\n    ): Promise<CloudStorageResult<{ id: string; path: string; fullPath: string }>> {\n        return mapStorageResult(\n            this.fileApi.upload(validateObjectPath(path), body, options),\n        );\n    }\n\n    update(\n        path: string,\n        body: CloudStorageFileBody,\n        options?: CloudStorageFileOptions,\n    ): Promise<CloudStorageResult<{ id: string; path: string; fullPath: string }>> {\n        return mapStorageResult(\n            this.fileApi.update(validateObjectPath(path), body, options),\n        );\n    }\n\n    list(\n        prefix = '',\n        options?: CloudStorageListOptions,\n    ): Promise<CloudStorageResult<CloudStorageFile[]>> {\n        return mapStorageResult(\n            this.fileApi.list(validateObjectPrefix(prefix), options),\n        );\n    }\n\n    listPage(\n        options?: CloudStorageCursorListOptions,\n    ): Promise<CloudStorageResult<CloudStorageListResult>> {\n        return mapStorageResult(\n            this.fileApi.listV2({\n                ...options,\n                prefix: validateObjectPrefix(options?.prefix ?? ''),\n            }),\n        );\n    }\n\n    info(path: string): Promise<CloudStorageResult<CloudStorageObjectInfo>> {\n        return mapStorageResult(this.fileApi.info(validateObjectPath(path)));\n    }\n\n    async exists(path: string): Promise<CloudStorageResult<boolean>> {\n        const result = await this.fileApi.exists(validateObjectPath(path));\n        if (result.error) {\n            return { data: null, error: normalizeStorageError(result.error) };\n        }\n        return { data: result.data, error: null };\n    }\n\n    download(path: string): WorkBuddyStorageDownload {\n        const builder = this.fileApi.download(validateObjectPath(path));\n        return new WorkBuddyStorageDownload(\n            () => mapStorageResult(builder),\n            () => mapStorageResult(builder.asStream()),\n        );\n    }\n\n    remove(paths: string[]): Promise<CloudStorageResult<CloudStorageFile[]>> {\n        if (paths.length === 0) {\n            throw new CloudStoragePathError('remove requires at least one object path.');\n        }\n        return mapStorageResult(this.fileApi.remove(paths.map(validateObjectPath)));\n    }\n\n    copy(\n        fromPath: string,\n        toPath: string,\n    ): Promise<CloudStorageResult<{ path: string }>> {\n        return mapStorageResult(\n            this.fileApi.copy(validateObjectPath(fromPath), validateObjectPath(toPath)),\n        );\n    }\n\n    move(\n        fromPath: string,\n        toPath: string,\n    ): Promise<CloudStorageResult<{ message: string }>> {\n        return mapStorageResult(\n            this.fileApi.move(validateObjectPath(fromPath), validateObjectPath(toPath)),\n        );\n    }\n\n    createSignedUrl(\n        path: string,\n        expiresIn = DEFAULT_SIGNED_URL_TTL_SECONDS,\n    ): Promise<CloudStorageResult<{ signedUrl: string }>> {\n        return mapStorageResult(\n            this.fileApi.createSignedUrl(\n                validateObjectPath(path),\n                validateSignedURLTTL(expiresIn),\n            ),\n        );\n    }\n\n    createSignedUrls(\n        paths: string[],\n        expiresIn = DEFAULT_SIGNED_URL_TTL_SECONDS,\n    ): Promise<CloudStorageResult<Array<{\n        error: string | null;\n        path: string | null;\n        signedURL: string | null;\n        signedUrl: string | null;\n    }>>> {\n        if (paths.length === 0) {\n            throw new CloudStoragePathError('createSignedUrls requires at least one object path.');\n        }\n        return mapStorageResult(\n            this.fileApi.createSignedUrls(\n                paths.map(validateObjectPath),\n                validateSignedURLTTL(expiresIn),\n            ),\n        );\n    }\n\n    createSignedUploadUrl(\n        path: string,\n        options?: { upsert?: boolean },\n    ): Promise<CloudStorageResult<{ signedUrl: string; token: string; path: string }>> {\n        return mapStorageResult(\n            this.fileApi.createSignedUploadUrl(validateObjectPath(path), {\n                upsert: options?.upsert ?? false,\n            }),\n        );\n    }\n\n    uploadToSignedUrl(\n        path: string,\n        token: string,\n        body: CloudStorageFileBody,\n        options?: CloudStorageFileOptions,\n    ): Promise<CloudStorageResult<{ path: string; fullPath: string }>> {\n        if (!token) {\n            throw new CloudStoragePathError('signed upload token is required.');\n        }\n        return mapStorageResult(\n            this.fileApi.uploadToSignedUrl(validateObjectPath(path), token, body, options),\n        );\n    }\n}\n\nexport class WorkBuddyStorageModule extends WorkBuddyStorageBucket {\n    private readonly runtime: WorkBuddyStorageBucket;\n\n    constructor(client: unknown) {\n        const storageClient = client as Pick<StorageClient, 'from'>;\n        const runtimeApi = storageClient.from(RUNTIME_STORAGE_BUCKET);\n        super(runtimeApi);\n        this.runtime = new WorkBuddyStorageBucket(runtimeApi);\n    }\n\n    /**\n     * 兼容 bucket-native 调用形态，但只允许固定的 `runtime`。\n     * 终端应用不能枚举、创建或切换逻辑 Bucket。\n     */\n    from(bucketID: typeof RUNTIME_STORAGE_BUCKET = RUNTIME_STORAGE_BUCKET): WorkBuddyStorageBucket {\n        if (bucketID !== RUNTIME_STORAGE_BUCKET) {\n            throw new CloudStoragePathError(\n                `Only the \"${RUNTIME_STORAGE_BUCKET}\" storage bucket is available.`,\n            );\n        }\n        return this.runtime;\n    }\n\n    userPath(userID: string, relativePath: string): string {\n        return scopedPath('users', userID, relativePath);\n    }\n\n    sharedPath(ownerID: string, relativePath: string): string {\n        return scopedPath('shared', ownerID, relativePath);\n    }\n}\n\nexport function createStorageModule(\n    config: CloudRuntimeConfig,\n    fetch: typeof globalThis.fetch,\n): WorkBuddyStorageModule {\n    // 只接入文件 API，避免完整 StorageClient 引入未开放的 analytics 和 iceberg-js。\n    const client = {\n        from: (bucketID: string) => new StorageFileApi(\n            `${config.endpoint}${CLOUD_MODULE_PATHS.storage}`, DEFAULT_HEADERS, bucketID, fetch,\n        ),\n    };\n    return new WorkBuddyStorageModule(client);\n}\n\nfunction scopedPath(scope: 'users' | 'shared', ownerID: string, relativePath: string): string {\n    const owner = validatePathSegment(ownerID, 'owner/user id');\n    const relative = validatePath(relativePath, false);\n    return validateObjectPath(`${scope}/${owner}/${relative}`);\n}\n\nexport function validateObjectPath(path: string): string {\n    const normalized = validatePath(path, false);\n    if (!normalized.includes('/')) {\n        throw new CloudStoragePathError(\n            'Object paths must use users/<uid>/... or shared/<ownerUid>/....',\n        );\n    }\n    const [scope, owner, ...rest] = normalized.split('/');\n    if ((scope !== 'users' && scope !== 'shared') || !owner || rest.length === 0) {\n        throw new CloudStoragePathError(\n            'Object paths must use users/<uid>/... or shared/<ownerUid>/....',\n        );\n    }\n    return normalized;\n}\n\nexport function validateObjectPrefix(prefix: string): string {\n    if (prefix === '') {\n        return '';\n    }\n    const normalized = validatePath(prefix, true);\n    const [scope, owner] = normalized.split('/');\n    if (scope === 'shared' && !owner) {\n        return 'shared';\n    }\n    if ((scope !== 'users' && scope !== 'shared') || !owner) {\n        throw new CloudStoragePathError(\n            'List prefixes must start with users/<uid> or shared/<ownerUid>.',\n        );\n    }\n    return normalized;\n}\n\nfunction validatePath(path: string, allowTrailingSlash: boolean): string {\n    if (typeof path !== 'string' || path.trim() === '') {\n        throw new CloudStoragePathError('Storage path must be a non-empty relative path.');\n    }\n    let decoded = path.trim();\n    for (let index = 0; index < 3; index += 1) {\n        try {\n            const next = decodeURIComponent(decoded);\n            if (next === decoded) break;\n            decoded = next;\n        } catch {\n            throw new CloudStoragePathError('Storage path contains invalid URL encoding.');\n        }\n    }\n    if (\n        decoded.startsWith('/')\n        || decoded.includes('\\\\')\n        || decoded.includes('\\0')\n        || decoded.includes('//')\n        || (!allowTrailingSlash && decoded.endsWith('/'))\n    ) {\n        throw new CloudStoragePathError('Storage path is not a safe relative object path.');\n    }\n    const normalized = allowTrailingSlash ? decoded.replace(/\\/+$/, '') : decoded;\n    const segments = normalized.split('/');\n    if (segments.some(segment => segment === '' || segment === '.' || segment === '..')) {\n        throw new CloudStoragePathError('Storage path traversal is not allowed.');\n    }\n    return normalized;\n}\n\nfunction validatePathSegment(value: string, label: string): string {\n    if (!value) {\n        throw new CloudStoragePathError(`${label} is not a valid storage path segment.`);\n    }\n    let decoded = value;\n    for (let index = 0; index < 3; index += 1) {\n        try {\n            const next = decodeURIComponent(decoded);\n            if (next === decoded) break;\n            decoded = next;\n        } catch {\n            throw new CloudStoragePathError(`${label} contains invalid URL encoding.`);\n        }\n    }\n    if (\n        decoded.includes('/')\n        || decoded.includes('\\\\')\n        || decoded.includes('\\0')\n        || decoded === '.'\n        || decoded === '..'\n    ) {\n        throw new CloudStoragePathError(`${label} is not a valid storage path segment.`);\n    }\n    return decoded;\n}\n\nfunction validateSignedURLTTL(expiresIn: number): number {\n    if (\n        !Number.isInteger(expiresIn)\n        || expiresIn <= 0\n        || expiresIn > MAX_SIGNED_URL_TTL_SECONDS\n    ) {\n        throw new CloudStoragePathError(\n            `Signed URL expiry must be an integer between 1 and ${MAX_SIGNED_URL_TTL_SECONDS} seconds.`,\n        );\n    }\n    return expiresIn;\n}\n\nasync function mapStorageResult<T>(\n    source: PromiseLike<{ data: T | null; error: unknown | null }>,\n): Promise<CloudStorageResult<T>> {\n    const result = await source;\n    if (result.error) {\n        return { data: null, error: normalizeStorageError(result.error) };\n    }\n    if (result.data === null) {\n        return {\n            data: null,\n            error: {\n                name: 'CloudStorageResponseError',\n                message: 'Storage API returned neither data nor an error.',\n            },\n        };\n    }\n    return { data: result.data, error: null };\n}\n\nfunction normalizeStorageError(error: unknown): CloudStorageError {\n    if (error instanceof Error) {\n        const source = error as Error & {\n            status?: number;\n            statusCode?: string;\n            code?: string;\n        };\n        return {\n            name: source.name,\n            message: source.message,\n            status: source.status,\n            statusCode: source.statusCode,\n            code: source.code,\n            cause: error,\n        };\n    }\n    return {\n        name: 'CloudStorageError',\n        message: String(error),\n        cause: error,\n    };\n}\n","/**\n * 客户端核心入口（#89098）\n */\n\nimport { resolveRuntimeConfig } from './config.js';\nimport { anonymousTokenProvider, createCloudFetch } from './http/fetch.js';\nimport { AuthModule } from './modules/auth/index.js';\nimport { createDatabaseModule, WorkBuddyDatabaseModule } from './modules/database.js';\nimport { LlmModule } from './modules/llm.js';\nimport { createStorageModule } from './modules/storage.js';\nimport type { CloudRuntimeConfig, WorkBuddyCloudOptions } from './types.js';\nimport type { WorkBuddyStorageModule } from './modules/storage.js';\n\n/**\n * 一个应用一个实例。**初始化一次**，四个模块共用同一份配置与同一个 fetch。\n *\n * ============================================================================\n * 身份怎么流到 database / storage\n *\n * AuthModule 是**唯一**的身份来源。共享 fetch 拿到的是\n * `() => this.auth.getAccessToken()` 这个函数 —— 每个请求发出前都会调它一次，\n * 于是登录/登出/续期后，database 与 storage 自动带上最新身份，不需要重建\n * client，也不需要调用方手动搬 token。\n *\n * ⚠️ **client 上刻意没有 `sessionToken` 之类的字段。** 会话的唯一真源是\n * AuthModule 背后的 localStorage：在这里缓存一份副本会在「另一个标签页登出/\n * 续期」时变脏，而拿着脏句柄去续期会让会话永久锁死（见\n * modules/auth/session-manager.ts 顶部说明）。supabase-js 与 CloudBase SDK\n * 都是同一个结论 —— 状态归 auth，client 层只持有取值函数。\n * ============================================================================\n */\nexport class WorkBuddyCloudClient<Database = unknown> {\n    /** PostgREST 语义的数据库模块（`/.cloud/database/rest`）。 */\n    readonly database: WorkBuddyDatabaseModule<Database>;\n    readonly auth: AuthModule;\n    /** 对象存储客户端（`/.cloud/storage`）。 */\n    readonly storage: WorkBuddyStorageModule;\n    readonly llm: LlmModule;\n\n    constructor(\n        private readonly config: CloudRuntimeConfig,\n        options: Pick<WorkBuddyCloudOptions, 'storage'> = {},\n    ) {\n        // auth 自己的请求走**不带 session provider** 的出口：`/auth/v1/token`\n        // 就是续期端点，让它去调「取 token（必要时先续期）」会死锁。\n        this.auth = new AuthModule(config, createCloudFetch(config, anonymousTokenProvider), {\n            storage: options.storage,\n        });\n\n        // 其余三个模块共用带身份的出口。\n        const fetch = createCloudFetch(config, () => this.auth.getAccessToken());\n        this.database = createDatabaseModule<Database>(config, fetch);\n        this.storage = createStorageModule(config, fetch);\n        this.llm = new LlmModule(config, fetch);\n    }\n\n    /** 归一化后的数据面基址（无尾斜杠）。 */\n    get endpoint(): string {\n        return this.config.endpoint;\n    }\n\n    /** 归一化后的环境中心 OAuth Relay 基址（无尾斜杠）。 */\n    get oauthRelayBaseUrl(): string {\n        return this.config.oauthRelayBaseUrl;\n    }\n}\n\n/**\n * 创建 WorkBuddy Cloud 客户端。\n *\n * `endpoint` 与 `publishableKey` 来自云服务开通后下发的\n * `publicConfig`，都不含 envId 与 provider 凭据（设计文档 §5.2）。\n *\n * ```ts\n * const cloud = createWorkBuddyCloud({\n *     endpoint: 'https://my-app.workbuddy.link',\n *     publishableKey: 'wbpk_wbapp_demo_abc123',\n * });\n *\n * await cloud.auth.signInWithPassword({ email, password });\n * // 登录后 database / storage 自动带上身份，不需要手动传 token。\n * const { data, error } = await cloud.database.from('todos').select('id, title');\n * ```\n *\n * 传入类型生成器产出的 `Database` 类型可得到强类型查询（对齐 supabase 的\n * `createClient<Database>()`）：`createWorkBuddyCloud<Database>({ ... })`。\n *\n * @throws {WorkBuddyCloudConfigError} 配置缺失或格式不合法时**立即**抛出。\n */\nexport function createWorkBuddyCloud<Database = unknown>(\n    options: WorkBuddyCloudOptions,\n): WorkBuddyCloudClient<Database> {\n    return new WorkBuddyCloudClient<Database>(resolveRuntimeConfig(options), {\n        storage: options.storage,\n    });\n}\n","/**\n * 小程序运行时缺失的 Web API 最小占位实现（WIP）。\n *\n * 背景：核心 SDK（`src/http/fetch.ts` 的 `createCloudFetch`）直接 `new Headers(...)`，\n * 不是通过注入口子拿到的 —— 这是核心 SDK 对\"浏览器环境\"的一处硬依赖，不是本\n * 适配层能绕开的。因此本模块在小程序里补一份全局 `Headers`；`ReadableStream`\n * 同理，`iterSSEEvents`（`modules/llm/sse.ts`）直接调 `body.getReader()`。\n *\n * ⚠️ 占位说明：以下两个类都只实现了 SDK 自己会用到的方法子集，不是 spec 完整\n * 实现（例如 `MiniProgramReadableStream` 不支持 tee/pipeTo，也不是真正的\n * 生产者暂停式 backpressure——只是按字节数设了一个缓冲上限，超限直接 abort\n * 整条流，把「内存持续膨胀」变成「明确报错」）。\n * 只在目标小程序基础库确实缺失对应全局对象时才会安装，且没有验证过真机基础库\n * 版本号 —— 接入时用 `wx.getSystemInfoSync` 之类的方式确认目标基础库是否已经\n * 自带这两个全局对象，自带的话应该跳过这份占位，直接用原生实现更可靠。\n */\n\n/** 大小写不敏感的最小 Headers 占位实现。 */\nclass MiniProgramHeaders {\n    private readonly map = new Map<string, string>();\n\n    constructor(init?: HeadersInit) {\n        if (!init) return;\n        if (init instanceof MiniProgramHeaders) {\n            for (const [key, value] of init.map) this.map.set(key, value);\n            return;\n        }\n        if (Array.isArray(init)) {\n            for (const [key, value] of init) this.set(key, value);\n            return;\n        }\n        if (init instanceof Headers) {\n            init.forEach((value, key) => this.set(key, value));\n            return;\n        }\n        for (const [key, value] of Object.entries(init)) this.set(key, String(value));\n    }\n\n    private normalize(name: string): string {\n        return name.toLowerCase();\n    }\n\n    set(name: string, value: string): void {\n        this.map.set(this.normalize(name), value);\n    }\n\n    get(name: string): string | null {\n        return this.map.get(this.normalize(name)) ?? null;\n    }\n\n    has(name: string): boolean {\n        return this.map.has(this.normalize(name));\n    }\n\n    append(name: string, value: string): void {\n        const key = this.normalize(name);\n        const existing = this.map.get(key);\n        this.map.set(key, existing ? `${existing}, ${value}` : value);\n    }\n\n    delete(name: string): void {\n        this.map.delete(this.normalize(name));\n    }\n\n    forEach(callback: (value: string, key: string) => void): void {\n        this.map.forEach((value, key) => callback(value, key));\n    }\n\n    entries(): IterableIterator<[string, string]> {\n        return this.map.entries();\n    }\n\n    /** 转成 `wx.request` 需要的 plain object header。 */\n    toPlainObject(): Record<string, string> {\n        return Object.fromEntries(this.map);\n    }\n}\n\n/** 流式响应队列默认字节上限（4 MiB）：超过后中止流并向 reader 抛错，\n *  而不是无限缓冲——慢消费者或异常长响应会持续占用小程序有限的运行时内存。\n */\nconst DEFAULT_MAX_BUFFERED_BYTES = 4 * 1024 * 1024;\n\n/**\n * 极简 ReadableStream 占位：单读者、按到达顺序 push，不支持 tee/pipeTo。\n *\n * 只满足 `iterSSEEvents` 的调用面：`getReader().read()` / `.cancel()` / `.releaseLock()`。\n *\n * 背压：队列按字节数计数，超过 `maxBufferedBytes` 时整条流直接 `abort`——\n * 不是真正的生产者暂停式背压（占位实现做不到暂停 `wx.request` 的分块推送），\n * 但至少把「内存持续膨胀」变成「明确报错」，调用方能感知并重试/降级。\n */\nclass MiniProgramReadableStream {\n    private readonly queue: Uint8Array[] = [];\n    private queuedBytes = 0;\n    private readonly maxBufferedBytes: number;\n    private closed = false;\n    private error: Error | null = null;\n    private pendingResolve: ((result: { done: boolean; value?: Uint8Array }) => void) | null = null;\n    private pendingReject: ((err: Error) => void) | null = null;\n    private cancelled = false;\n\n    constructor(options?: { maxBufferedBytes?: number }) {\n        this.maxBufferedBytes = options?.maxBufferedBytes ?? DEFAULT_MAX_BUFFERED_BYTES;\n    }\n\n    /** 供 fetch 适配层喂数据用，不是公开 API。超过字节上限时自动 abort。 */\n    push(chunk: Uint8Array): void {\n        if (this.cancelled || this.closed || this.error) return;\n        if (this.queuedBytes + chunk.byteLength > this.maxBufferedBytes) {\n            this.abort(\n                new Error(\n                    `MiniProgramReadableStream: buffered bytes exceeded limit (${this.maxBufferedBytes}), aborting stream`,\n                ),\n            );\n            return;\n        }\n        this.queuedBytes += chunk.byteLength;\n        if (this.pendingResolve) {\n            const resolve = this.pendingResolve;\n            this.pendingResolve = null;\n            this.pendingReject = null;\n            resolve({ done: false, value: chunk });\n        } else {\n            this.queue.push(chunk);\n        }\n    }\n\n    /** 供 fetch 适配层在请求正常结束时调用，不是公开 API。 */\n    close(): void {\n        if (this.closed || this.error) return;\n        this.closed = true;\n        if (this.pendingResolve) {\n            const resolve = this.pendingResolve;\n            this.pendingResolve = null;\n            this.pendingReject = null;\n            resolve({ done: true });\n        }\n    }\n\n    /**\n     * 供 fetch 适配层在检测到「流已经开始但实际是错误响应/请求异常终止」\n     * 时调用，不是公开 API。跟 `close()` 的区别：`close()` 是正常 EOF，\n     * `abort()` 让当前挂起的 `read()` 与后续所有 `read()` 都 reject，\n     * 避免调用方把截断的错误响应体误判为一段正常收完的 SSE 内容。\n     */\n    abort(err: Error): void {\n        if (this.closed || this.error) return;\n        this.error = err;\n        this.closed = true;\n        this.queue.length = 0;\n        this.queuedBytes = 0;\n        if (this.pendingReject) {\n            const reject = this.pendingReject;\n            this.pendingResolve = null;\n            this.pendingReject = null;\n            reject(err);\n        }\n    }\n\n    getReader(): {\n        read(): Promise<{ done: boolean; value?: Uint8Array }>;\n        cancel(): Promise<void>;\n        releaseLock(): void;\n    } {\n        return {\n            read: () => {\n                if (this.cancelled) {\n                    return Promise.resolve({ done: true });\n                }\n                if (this.queue.length > 0) {\n                    const value = this.queue.shift();\n                    if (value) this.queuedBytes -= value.byteLength;\n                    return Promise.resolve({ done: false, value });\n                }\n                if (this.error) {\n                    return Promise.reject(this.error);\n                }\n                if (this.closed) {\n                    return Promise.resolve({ done: true });\n                }\n                return new Promise((resolve, reject) => {\n                    this.pendingResolve = resolve;\n                    this.pendingReject = reject;\n                });\n            },\n            cancel: () => {\n                this.cancelled = true;\n                this.queue.length = 0;\n                this.queuedBytes = 0;\n                return Promise.resolve();\n            },\n            releaseLock: () => {\n                // 单读者占位实现，无需真正释放锁。\n            },\n        };\n    }\n}\n\n/** 是否已经具备（原生或已安装占位）小程序流式响应所需的 `ReadableStream`。 */\nexport function isStreamingSupported(): boolean {\n    return typeof (globalThis as { ReadableStream?: unknown }).ReadableStream !== 'undefined';\n}\n\n/**\n * 按需安装 `Headers` / `ReadableStream` 占位实现到 `globalThis`。\n *\n * 幂等：已存在同名全局对象时跳过，不覆盖原生实现。\n * 必须在调用 `createWorkBuddyCloud(...)` 之前执行一次。\n */\nexport function ensureMiniProgramPolyfills(): void {\n    const g = globalThis as Record<string, unknown>;\n    if (typeof g.Headers === 'undefined') {\n        g.Headers = MiniProgramHeaders as unknown;\n    }\n    if (typeof g.ReadableStream === 'undefined') {\n        g.ReadableStream = MiniProgramReadableStream as unknown;\n    }\n}\n\nexport { MiniProgramHeaders, MiniProgramReadableStream };\n","/**\n * 小程序 `fetch` 适配（对应核心 SDK `types.ts` 里\n * `WorkBuddyCloudOptions.fetch` 的注入口子）。\n *\n * 用 `wx.request` 实现四模块共用的单一出口（`src/http/fetch.ts`\n * `createCloudFetch` 包出来的那个 fetch）。区分两种模式：\n *\n *  - 普通请求：`wx.request` 一次性拿到完整响应体。\n *  - 流式请求（LLM chat streaming，识别标志是请求头\n *    `Accept: text/event-stream`，见 `modules/llm/chat.ts:122`）：\n *    `enableChunked: true` + `onChunkReceived`，把收到的 chunk 喂进\n *    `polyfills.ts` 里的占位 `ReadableStream`，这样下游\n *    `iterSSEEvents`（`modules/llm/sse.ts`）完全不用改。\n */\n\nimport { ensureMiniProgramPolyfills, MiniProgramReadableStream } from './polyfills.js';\nimport type { MiniProgramWxLike, WxRequestOptions } from './wx-types.js';\n\nfunction headersToPlainObject(headers?: HeadersInit): Record<string, string> {\n    if (!headers) return {};\n    if (headers instanceof Headers) {\n        const out: Record<string, string> = {};\n        headers.forEach((value, key) => {\n            out[key] = value;\n        });\n        return out;\n    }\n    if (Array.isArray(headers)) {\n        return Object.fromEntries(headers);\n    }\n    return { ...(headers as Record<string, string>) };\n}\n\nfunction isStreamingRequest(headers: Record<string, string>): boolean {\n    const accept = headers['Accept'] ?? headers['accept'];\n    return accept === 'text/event-stream';\n}\n\n/** SDK 各模块实际消费的 `Response` 字段面（完整 fetch 签名用类型断言补齐）。 */\ninterface ResponseLike {\n    readonly status: number;\n    readonly statusText: string;\n    readonly ok: boolean;\n    readonly headers: Headers;\n    readonly body: MiniProgramReadableStream | null;\n    text(): Promise<string>;\n    json(): Promise<unknown>;\n    blob(): Promise<Blob>;\n    arrayBuffer(): Promise<ArrayBuffer>;\n}\n\n/**\n * 构造一个满足 SDK 实际用到的字段面的 `Response`-like 对象。\n *\n * 不走 `new Response(...)`：`ensureMiniProgramPolyfills()` 只补 `Headers` /\n * `ReadableStream`，**不**补 `Response` —— 真机小程序基础库没有全局\n * `Response` 时，构造函数路径会在第一个请求上直接 `ReferenceError`\n * （jsdom 自带 Response，单测环境暴露不出来）。SDK 对返回值的实际消费面：\n * auth/llm 的 `ok/status/text()`、database vendor 的\n * `ok/status/statusText/headers/json()`、LLM 流式的 `body.getReader()`。\n *\n * `blob()`/`arrayBuffer()` 目前**没有**真实实现：本适配层用\n * `responseType: 'text'` 拿响应体，天然丢失二进制内容，且小程序运行时\n * 没有全局 `Blob` 可用（`ensureMiniProgramPolyfills` 也没有补）。Storage\n * 模块的文件下载（`vendor/storage/packages/BlobDownloadBuilder.ts` 会\n * `await result.blob()`）在小程序环境下调这两个方法时，**必须**明确\n * reject 出一条可定位的错误，而不是让调用方撞见「result.blob is not a\n * function」这种无法一眼看出根因的 TypeError。真要支持小程序下载，需要\n * 重新设计整条链路（`wx.request({responseType:'arraybuffer'})` + 自制\n * 最小 Blob 替身 + 小程序侧没有 `URL.createObjectURL`/`<a download>`\n * 等浏览器 API，下游怎么消费也要重新设计），不是这里能补的一个方法。\n */\nfunction buildResponse(params: {\n    status: number;\n    statusText?: string;\n    headers: Record<string, string>;\n    bodyText?: string;\n    stream?: MiniProgramReadableStream;\n}): Response {\n    const status = params.status;\n    const ok = status >= 200 && status < 300;\n    const bodyText = params.bodyText ?? '';\n    const unsupportedBinaryBody = (method: string) => (): Promise<never> =>\n        Promise.reject(\n            new Error(\n                `createMiniProgramFetch: Response.${method}() 不受支持 —— 小程序适配层用文本方式取响应体` +\n                    '，没有原始二进制数据，也没有全局 Blob 可用。依赖二进制下载的能力（如 Storage 文件下载）' +\n                    '在小程序运行时暂不可用，需要单独设计后再接入。',\n            ),\n        );\n\n    const response: ResponseLike = {\n        status,\n        statusText: params.statusText ?? '',\n        ok,\n        // 全局 Headers 由 ensureMiniProgramPolyfills 保证存在（原生或占位实现）。\n        headers: new Headers(params.headers),\n        // 非流式路径 SDK 只消费 text()/json()，body 置 null（与原生对无体\n        // 响应的语义一致）；流式必须保留 MiniProgramReadableStream，\n        // 下游 iterSSEEvents 直接对它 getReader()。\n        body: params.stream ?? null,\n        text: () => Promise.resolve(bodyText),\n        // 解析失败要和原生 Response.json() 一致：返回 rejected promise\n        // （SyntaxError），既不同步 throw，也不吞错。\n        json: () =>\n            new Promise<unknown>((resolve, reject) => {\n                try {\n                    resolve(JSON.parse(bodyText));\n                } catch (error) {\n                    // JSON.parse 按规范只抛 SyntaxError，原样透传即可。\n                    reject(error);\n                }\n            }),\n        blob: unsupportedBinaryBody('blob'),\n        arrayBuffer: unsupportedBinaryBody('arrayBuffer'),\n    };\n    return response as unknown as Response;\n}\n\n/**\n * 创建小程序版 fetch，可直接传给 `WorkBuddyCloudOptions.fetch`。\n *\n * @param wxInstance 默认取全局 `wx`；传参主要用于单测注入 mock。\n */\nexport function createMiniProgramFetch(\n    wxInstance: MiniProgramWxLike = (globalThis as { wx?: MiniProgramWxLike }).wx as MiniProgramWxLike,\n): typeof globalThis.fetch {\n    if (!wxInstance) {\n        throw new Error(\n            'createMiniProgramFetch: 未找到全局 wx 对象，请在小程序环境调用，或显式传入 wxInstance。',\n        );\n    }\n\n    ensureMiniProgramPolyfills();\n\n    return async function miniProgramFetch(\n        input: RequestInfo | URL,\n        init?: RequestInit,\n    ): Promise<Response> {\n        if (typeof input !== 'string') {\n            // 核心 SDK 目前只传字符串 URL（见 `http/fetch.ts` 的调用面），\n            // Request/URL 对象输入暂不支持 —— 真出现时再补，先明确报错好定位。\n            throw new Error(\n                'createMiniProgramFetch: 暂不支持非字符串 input，请传 URL 字符串。',\n            );\n        }\n\n        const url = input;\n        const method = (init?.method ?? 'GET').toUpperCase();\n        const reqHeaders = headersToPlainObject(init?.headers);\n        const streaming = isStreamingRequest(reqHeaders);\n\n        let requestBody: string | ArrayBuffer | Record<string, unknown> | undefined;\n        if (typeof init?.body === 'string') {\n            requestBody = init.body;\n        } else if (init?.body !== undefined && init?.body !== null) {\n            // ArrayBuffer/Blob/FormData 等暂不支持 —— 四模块目前请求体都是\n            // JSON.stringify 出来的字符串，真遇到再补（占位）。\n            throw new Error(\n                'createMiniProgramFetch: 暂不支持非字符串 body（ArrayBuffer/FormData 待补）。',\n            );\n        }\n\n        if (init?.signal?.aborted) {\n            const err = new Error('The operation was aborted.');\n            err.name = 'AbortError';\n            throw err;\n        }\n\n        if (!streaming) {\n            return new Promise<Response>((resolve, reject) => {\n                const task = wxInstance.request({\n                    url,\n                    method,\n                    header: reqHeaders,\n                    data: requestBody,\n                    responseType: 'text',\n                    success(result) {\n                        resolve(\n                            buildResponse({\n                                status: result.statusCode,\n                                headers: result.header,\n                                bodyText:\n                                    typeof result.data === 'string'\n                                        ? result.data\n                                        : JSON.stringify(result.data),\n                            }),\n                        );\n                    },\n                    fail(result) {\n                        reject(new Error(`wx.request failed: ${result.errMsg}`));\n                    },\n                });\n\n                init?.signal?.addEventListener(\n                    'abort',\n                    () => {\n                        task.abort();\n                        const err = new Error('The operation was aborted.');\n                        err.name = 'AbortError';\n                        reject(err);\n                    },\n                    { once: true },\n                );\n            });\n        }\n\n        // 流式路径：先拿到 header（通过一次 success 回调里带的 statusCode/header，\n        // 但 wx.request 分块模式下 success 在整个请求结束（流结束）才触发 ——\n        // 这与 fetch 语义不同：fetch 的 Response 应该在收到 header 后立即可用，\n        // body 再逐步可读。\n        //\n        // ⚠️ 占位说明：这是本适配层最大的语义落差，未在真机验证。微信小程序\n        // 官方文档 RequestTask.onHeadersReceived 只带 header、不带\n        // statusCode，因此「首个 chunk 到达时就 resolve Response」这一步无法\n        // 拿到真实状态码，只能先假设 200——如果后续发现真机行为不一致，需要\n        // 重新设计这一段。但这不代表可以对真实的非 2xx 结果视而不见：\n        // success/fail 回调始终会在流结束时真正触发一次，带着准确的\n        // statusCode——如果那时发现不是 2xx，或者 fail 触发，必须让\n        // stream.abort() 而不是 stream.close()，否则调用方会把一段被\n        // 截断的错误响应体误判成正常收完的 SSE 内容。\n        return new Promise<Response>((resolve, reject) => {\n            const stream = new MiniProgramReadableStream();\n            let resolved = false;\n            let receivedHeaders: Record<string, string> = {};\n            const options: WxRequestOptions = {\n                url,\n                method,\n                header: reqHeaders,\n                data: requestBody,\n                enableChunked: true,\n                success(result) {\n                    const isSuccessStatus = result.statusCode >= 200 && result.statusCode < 300;\n                    if (!resolved) {\n                        resolved = true;\n                        resolve(\n                            buildResponse({\n                                status: result.statusCode,\n                                headers: result.header,\n                                stream,\n                            }),\n                        );\n                        stream.close();\n                        return;\n                    }\n                    // 已经用假设的 200 提前 resolve 过 Response：这是唯一能拿到\n                    // 真实 statusCode 的时机。非 2xx 说明整段响应实际是错误，\n                    // 即使已经收到过 chunk，也不能悄悄当正常结束处理。\n                    if (isSuccessStatus) {\n                        stream.close();\n                    } else {\n                        stream.abort(\n                            new Error(`wx.request (chunked) resolved with non-2xx status ${result.statusCode}`),\n                        );\n                    }\n                },\n                fail(result) {\n                    const err = new Error(`wx.request (chunked) failed: ${result.errMsg}`);\n                    if (!resolved) {\n                        resolved = true;\n                        reject(err);\n                        return;\n                    }\n                    // 已经开始流式返回数据后网络异常/请求被终止：必须让 reader\n                    // 感知到错误（abort），而不是当成正常 EOF（close）悄悄结束。\n                    stream.abort(err);\n                },\n            };\n            const task = wxInstance.request(options);\n            task.onHeadersReceived?.((headerResult) => {\n                receivedHeaders = headerResult.header ?? {};\n            });\n\n            task.onChunkReceived((chunk) => {\n                if (!resolved) {\n                    resolved = true;\n                    resolve(\n                        buildResponse({\n                            status: 200,\n                            headers: receivedHeaders,\n                            stream,\n                        }),\n                    );\n                }\n                stream.push(new Uint8Array(chunk.data));\n            });\n\n            init?.signal?.addEventListener(\n                'abort',\n                () => {\n                    task.abort();\n                    const err = new Error('The operation was aborted.');\n                    err.name = 'AbortError';\n                    if (!resolved) {\n                        resolved = true;\n                        reject(err);\n                        return;\n                    }\n                    stream.abort(err);\n                },\n                { once: true },\n            );\n        });\n    };\n}\n","/**\n * 小程序 `CloudAuthStorage` 适配（对应核心 SDK `types.ts` 的\n * \"非浏览器运行时（Node、小程序）里没有 localStorage\" 那条注释）。\n */\n\nimport type { CloudAuthStorage } from '../../modules/auth/types.js';\nimport type { MiniProgramWxLike } from './wx-types.js';\n\n/**\n * 用 `wx.getStorageSync`/`setStorageSync`/`removeStorageSync` 实现 `CloudAuthStorage`。\n *\n * ⚠️ 占位说明：小程序同步存储 API 在容量超限或用户拒绝授权等场景可能抛异常，\n * 这里按\"存储不可用时静默降级、不阻塞登录态读写\"的策略吞掉异常并打印\n * warning——具体降级策略（是否应该报错给上层）留给接入方按真机表现调整，\n * 现在只是先跑通不炸。\n */\nexport function createMiniProgramStorage(\n    wxInstance: MiniProgramWxLike = (globalThis as { wx?: MiniProgramWxLike }).wx as MiniProgramWxLike,\n): CloudAuthStorage {\n    if (!wxInstance) {\n        throw new Error(\n            'createMiniProgramStorage: 未找到全局 wx 对象，请在小程序环境调用，或显式传入 wxInstance。',\n        );\n    }\n\n    return {\n        getItem(key: string): string | null {\n            try {\n                const value = wxInstance.getStorageSync(key);\n                if (value === undefined || value === null || value === '') {\n                    return null;\n                }\n                return typeof value === 'string' ? value : JSON.stringify(value);\n            } catch (err) {\n                console.warn('[MiniProgramStorage] getItem failed', key, err);\n                return null;\n            }\n        },\n        setItem(key: string, value: string): void {\n            try {\n                wxInstance.setStorageSync(key, value);\n            } catch (err) {\n                console.warn('[MiniProgramStorage] setItem failed', key, err);\n            }\n        },\n        removeItem(key: string): void {\n            try {\n                wxInstance.removeStorageSync(key);\n            } catch (err) {\n                console.warn('[MiniProgramStorage] removeItem failed', key, err);\n            }\n        },\n    };\n}\n","/**\n * WorkBuddy Cloud SDK 小程序适配层公开入口。\n *\n * 推荐用法（应用侧）—— 一站式工厂，把 polyfill、wx fetch、wx storage 与根客户端\n * 按固定顺序原子装配：\n *\n * ```ts\n * import { createMiniProgramWorkBuddyCloud } from '@genie/workbuddy-cloud-sdk/miniprogram';\n *\n * const cloud = createMiniProgramWorkBuddyCloud({\n *     endpoint: 'https://app.workbuddy.link', // 小程序没有 location.origin，必须显式传\n *     publishableKey: 'wbpk_xxx',\n * });\n * ```\n *\n * 三个适配件（`ensureMiniProgramPolyfills` / `createMiniProgramFetch` /\n * `createMiniProgramStorage`）也继续单独导出，供确有精细控制需要的场景手动组合\n * （顺序约束见各文件顶部注释）；一般接入直接用上面的工厂。\n *\n * 见 `platform/miniprogram/fetch.ts`、`storage.ts`、`polyfills.ts` 顶部注释\n * 里标注的占位/待验证事项——这一层还没有真机联调过。\n */\n\nimport { createWorkBuddyCloud } from '../../client.js';\nimport type { WorkBuddyCloudClient } from '../../client.js';\nimport { createMiniProgramFetch } from './fetch.js';\nimport { ensureMiniProgramPolyfills } from './polyfills.js';\nimport { createMiniProgramStorage } from './storage.js';\nimport type { MiniProgramWxLike } from './wx-types.js';\n\nexport { createMiniProgramFetch } from './fetch.js';\nexport { createMiniProgramStorage } from './storage.js';\nexport {\n    ensureMiniProgramPolyfills,\n    isStreamingSupported,\n    MiniProgramHeaders,\n    MiniProgramReadableStream,\n} from './polyfills.js';\nexport type {\n    MiniProgramWxLike,\n    WxChunkReceivedResult,\n    WxRequestFailResult,\n    WxRequestOptions,\n    WxRequestSuccessResult,\n    WxRequestTask,\n} from './wx-types.js';\n\n/**\n * `createMiniProgramWorkBuddyCloud` 的入参。\n *\n * 只收 `publicConfig` 那三项公开配置 —— 刻意**不**透传根 `WorkBuddyCloudOptions`\n * 的 `fetch` / `storage` 注入口：那两个口子是给「非浏览器但也非小程序」的运行时\n * 组合用的；在小程序里放开它们，接入方就能绕过 wx 适配器塞进一个浏览器实现，\n * 错误要等到真机上才暴露。\n */\nexport interface MiniProgramWorkBuddyCloudOptions {\n    /**\n     * 数据面基址，来自 `publicConfig.endpoint`。\n     *\n     * 小程序宿主没有 `location.origin`，根 SDK 的同源回落在这里不存在——省略\n     * 会在初始化时直接抛 `WorkBuddyCloudConfigError`。保持可选只为与根\n     * `WorkBuddyCloudOptions` 的类型面对齐，实际接入**永远要传**。\n     */\n    endpoint?: string;\n    /**\n     * 环境中心 OAuth Relay 基址，来自 `publicConfig.oauthRelayBaseUrl`。\n     *\n     * 小程序登录走 `signInWithWechat`（`wx.login` + 第三方平台 code），不经过\n     * Relay，所以这里可以不传。Relay 只有网页扫码登录才用得上。\n     */\n    oauthRelayBaseUrl?: string;\n    /** 应用标识 key（`wbpk_` 前缀），来自 `publicConfig.publishableKey`。 */\n    publishableKey: string;\n    /**\n     * 宿主 `wx` 对象，缺省取全局 `wx`。\n     *\n     * 应用代码不需要传；留这个口子是为了单测注入 mock，以及宿主把 `wx` 挂在\n     * 非全局位置时显式传入。fetch 与 storage 适配器**共用同一个实例**。\n     */\n    wx?: MiniProgramWxLike;\n}\n\n/**\n * 创建小程序版 WorkBuddy Cloud 客户端（小程序接入的推荐入口）。\n *\n * 装配顺序固定，任何一步都不能省：\n *\n *   1. `ensureMiniProgramPolyfills()` —— 根 SDK 的共享出口在请求期直接\n *      `new Headers()`，小程序基础库缺这个全局对象时必须先补上；\n *   2. `createMiniProgramFetch(wx)` + `createMiniProgramStorage(wx)` ——\n *      网络与凭据存储绑定同一个 wx 实例；\n *   3. `createWorkBuddyCloud(...)` —— 返回的 client 与 Web 端同构，\n *      `cloud.auth / database / storage / llm` 用法完全一致。\n *\n * 把这个顺序收进 SDK 是刻意的：三个适配件手动组合时，漏掉 polyfill 或调换顺序，\n * 得到的都是一个「构造能过、第一个请求才炸」的 client，真机上极难归因。\n *\n * 依赖方向说明：这里从 `../../client.js`（而非根 barrel `../../index.js`）取\n * `createWorkBuddyCloud`，返回类型只用 `import type` 引入 —— 保证小程序出口对\n * 核心 SDK 的依赖严格单向（根入口永远不反向 import 本模块），`./miniprogram`\n * 的 ESM/CJS 出口也就不会与根入口形成运行时环。\n *\n * @throws 没有可用 wx 对象、或三项公开配置不合法（复用根 SDK 的\n * `WorkBuddyCloudConfigError`）时立即抛出。\n *\n * ⚠️ `cloud.storage` 的文件下载在小程序运行时**不可用**：本适配层的\n * `fetch` 不支持 `Response.blob()/arrayBuffer()`（小程序没有全局 `Blob`，\n * 详见 `fetch.ts` 里 `buildResponse` 的注释），调用会拿到一条明确报错的\n * rejected promise，而不是静默失败或返回错位的数据；`cloud.auth/database/llm`\n * 不受影响。\n */\nexport function createMiniProgramWorkBuddyCloud<Database = unknown>(\n    options: MiniProgramWorkBuddyCloudOptions,\n): WorkBuddyCloudClient<Database> {\n    const wxInstance = options.wx ?? (globalThis as { wx?: MiniProgramWxLike }).wx;\n    if (!wxInstance) {\n        throw new Error(\n            'createMiniProgramWorkBuddyCloud: 未找到全局 wx 对象，请在小程序环境调用，或显式传入 options.wx。',\n        );\n    }\n\n    ensureMiniProgramPolyfills();\n\n    return createWorkBuddyCloud<Database>({\n        endpoint: options.endpoint,\n        oauthRelayBaseUrl: options.oauthRelayBaseUrl,\n        publishableKey: options.publishableKey,\n        fetch: createMiniProgramFetch(wxInstance),\n        storage: createMiniProgramStorage(wxInstance),\n    });\n}\n"],"mappings":"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","names":["WorkBuddyCloudConfigError","Error","message","name","PUBLISHABLE_KEY_PATTERN","normalizeHttpUrl","value","field","trim","WorkBuddyCloudConfigError","trimmed","parsed","URL","protocol","replace","resolveEndpoint","undefined","origin","globalThis","location","normalizePublishableKey","publishableKey","test","resolveFetch","candidate","fetch","bind","resolveRuntimeConfig","options","Object","freeze","endpoint","oauthRelayBaseUrl","PUBLISHABLE_KEY_HEADER","createCloudFetch","config","getSessionToken","input","init","headers","Headers","set","publishableKey","has","token","fetch","anonymousTokenProvider","Promise","resolve","undefined","CLOUD_PATH_PREFIX","CLOUD_MODULE_PATHS","Object","freeze","auth","database","storage","llm","AUTH_PATHS","signUp","signIn","signInWithProvider","token","loginWechat","loginWechatWeb","signOut","userMe","verification","verificationVerify","resetPassword","sudo","userPassword","parseSession","payload","receivedAt","raw","accessToken","access_token","sessionShapeError","refreshToken","refresh_token","expiresInSec","expires_in","expiresAt","user","userFromSessionPayload","isAnonymous","is_anonymous","id","sub","parseUser","uid","metadata","user_metadata","email","pickString","phone","phone_number","scope","v","undefined","normalizeHttpError","status","code","error","message","error_description","msg","kind","errorKind","cause","normalizeNetworkError","err","Error","String","reason","e","EXPIRY_MARGIN_MS","REFRESH_FAILURE_COOLDOWN_MS","SessionManager","store","refresh","emit","isCredentialsRejected","now","inflight","signOutEpoch","lastFailure","opts","Date","peek","read","ensure","current","isExpiring","refreshToken","abandon","refreshOnce","forceRefresh","ignoreCooldown","commitSignIn","session","write","commitUserUpdate","clear","expiresAt","inCooldown","Promise","resolve","task","doRefresh","finally","f","token","at","epochBefore","handleBefore","next","err","onRefreshFailed","latest","handle","STORAGE_KEY_PREFIX","createMemoryStorage","map","Map","getItem","k","get","setItem","v","set","removeItem","delete","resolveStorage","candidate","probe","globalThis","localStorage","SessionStore","key","storage","publishableKey","read","raw","parsed","JSON","parse","isStoredSession","discard","write","session","stringify","clear","value","s","accessToken","refreshToken","expiresAt","user","OAUTH_ERROR_MESSAGE_MAX","truncateMessage","message","max","chars","Array","from","length","slice","join","oauthProviderRejectMessage","params","error","get","description","AuthModule","baseUrl","sessions","storage","oauthRelayBaseUrl","listeners","Map","nextListenerId","config","fetch","opts","endpoint","CLOUD_MODULE_PATHS","auth","resolveStorage","SessionManager","store","SessionStore","publishableKey","refresh","handle","exchangeRefreshHandle","emit","event","session","notify","isCredentialsRejected","err","isCloudError","rejectedCredentials","getAccessToken","ensure","accessToken","signInWithPassword","credentials","email","password","fail","badRequest","postForSession","AUTH_PATHS","signIn","username","signInWithWechat","code","appid","loginWechat","signUp","phone","verificationToken","body","verification_token","phone_number","normalizePhone","sendOtp","target","usage","emailRedirectTo","email_redirect_to","res","request","verification","method","payload","data","verificationId","verification_id","ok","isExistingUser","is_user","signInWithOtp","sent","undefined","isUser","verify","token","verifyOtp","identifier","verified","verificationVerify","verification_code","vt","signInWithOAuth","options","provider","redirectTo","currentPageUrl","startRelayOAuth","parseCallbackQuery","input","query","test","URL","search","URLSearchParams","handleOAuthCallback","parsed","currentPageSearch","oauthError","kind","status","state","providerId","provider_id","provider_code","provider_params","signInWithProvider","handleWechatWebCallback","loginWechatWeb","resetPasswordForEmail","updateUser","nonce","verifiedPayload","reset","resetPassword","new_password","signedIn","resetPasswordForOld","sudo","oldPassword","sudoToken","sudo_token","updated","userPassword","newPassword","getSession","normalizeNetworkError","refreshSession","forceRefresh","getUser","userMe","clear","parseUser","signOut","peek","onAuthStateChange","callback","id","set","safeInvoke","delete","relay","searchParams","toString","url","grant_type","refresh_token","parseSession","Date","now","path","headers","commitSignIn","init","Authorization","response","JSON","stringify","readBody","normalizeHttpError","cb","values","digits","replace","local","startsWith","v","text","parse","loc","globalThis","location","origin","pathname","DEFAULT_MAX_RETRIES","getRetryDelay","attemptIndex","Math","min","RETRYABLE_STATUS_CODES","RETRYABLE_METHODS","PostgrestError","Error","details","hint","code","context","message","name","toJSON","sleep","ms","signal","Promise","resolve","aborted","id","setTimeout","removeEventListener","onAbort","clearTimeout","addEventListener","shouldRetry","method","status","attemptCount","retryEnabled","DEFAULT_MAX_RETRIES","RETRYABLE_METHODS","includes","RETRYABLE_STATUS_CODES","PostgrestBuilder","url","headers","schema","body","shouldThrowOnError","fetch","isMaybeSingle","shouldStripNulls","urlLengthLimit","builder","Headers","retry","throwOnError","stripNulls","get","Error","setHeader","name","value","set","enabled","then","onfulfilled","onrejected","undefined","currentAccept","_fetch","executeWithRetry","forEach","key","String","res","toString","JSON","stringify","_","fetchError","code","delay","getRetryDelay","retryAfterHeader","Math","max","parseInt","text","processResponse","catch","errorDetails","hint","cause","causeMessage","message","causeCode","stack","urlLength","length","success","error","details","data","count","statusText","ok","parse","PostgrestError","countHeader","match","contentRange","split","Array","isArray","returns","overrideTypes","PostgrestTransformBuilder","PostgrestBuilder","throwOnError","select","columns","quoted","cleanedColumns","split","map","c","test","join","url","searchParams","set","headers","append","order","column","ascending","nullsFirst","foreignTable","referencedTable","key","existingOrder","get","undefined","limit","rows","range","from","to","keyOffset","keyLimit","abortSignal","signal","single","maybeSingle","isMaybeSingle","csv","geojson","explain","analyze","verbose","settings","buffers","wal","format","options","filter","Boolean","forMediatype","rollback","returns","maxAffected","PostgrestReservedCharsRegexp","RegExp","PostgrestFilterBuilder","PostgrestTransformBuilder","throwOnError","eq","column","value","url","searchParams","append","neq","gt","gte","lt","lte","like","pattern","likeAllOf","patterns","join","likeAnyOf","ilike","ilikeAllOf","ilikeAnyOf","regexMatch","regexIMatch","is","isDistinct","in","values","cleanedValues","Array","from","Set","map","s","test","notIn","contains","isArray","JSON","stringify","containedBy","rangeGt","range","rangeGte","rangeLt","rangeLte","rangeAdjacent","overlaps","textSearch","query","config","type","typePart","configPart","undefined","match","Object","entries","filter","_","forEach","not","operator","or","filters","foreignTable","referencedTable","key","PostgrestQueryBuilder","url","headers","schema","signal","fetch","urlLengthLimit","retry","Headers","cloneRequestState","URL","toString","select","columns","options","head","count","method","quoted","cleanedColumns","split","map","c","test","join","searchParams","set","append","PostgrestFilterBuilder","insert","values","defaultToNull","Array","isArray","reduce","acc","x","concat","Object","keys","length","uniqueColumns","Set","column","body","upsert","onConflict","ignoreDuplicates","undefined","update","delete","PostgrestClient","url","headers","schemaName","fetch","urlLengthLimit","retry","schema","timeout","Headers","originalFetch","globalThis","undefined","input","init","controller","AbortController","timeoutId","setTimeout","abort","existingSignal","signal","aborted","clearTimeout","abortHandler","addEventListener","once","finally","removeEventListener","from","relation","trim","Error","URL","PostgrestQueryBuilder","rpc","fn","args","head","get","count","method","body","_isObject","v","Array","isArray","some","_hasObjectArg","Object","values","entries","filter","_","value","map","name","join","forEach","searchParams","append","set","PostgrestFilterBuilder","WorkBuddyDatabaseModule","client","config","fetch","PostgrestClient","endpoint","CLOUD_MODULE_PATHS","database","from","bind","rpc","url","createDatabaseModule","CloudOpenAIError","Error","error","status","requestId","retryAfterMs","init","errorObj","message","type","param","code","name","cause","undefined","Object","defineProperty","value","writable","enumerable","configurable","parseRetryAfter","headerValue","trimmed","trim","asNum","Number","isNaN","isInteger","asDate","Date","parse","diff","now","stringField","values","find","value","length","numberField","Number","isFinite","booleanField","contextWindowField","Array","isArray","normalizeContextWindowObject","undefined","raw","result","key","Object","entries","supportedLengths","filter","item","defaultLength","defineProperty","writable","enumerable","configurable","modalitiesField","input","output","capabilitiesField","enabled","fromEntries","pricingField","pricing","currency","inputPerMillionTokens","outputPerMillionTokens","displayText","keys","reasoningField","effort","defaultEffort","supportedEfforts","rawSummary","summary","canDisable","canDisableThinking","normalizeModel","id","ID","serverEnabled","Enabled","serverDisabled","disabled","Disabled","name","Name","provider","Provider","vendor","Vendor","family","Family","version","Version","description","Description","descriptionZh","DescriptionZh","descriptionEn","DescriptionEn","iconUrl","IconURL","contextWindow","ContextWindow","maxInputTokens","MaxInputTokens","maxOutputTokens","MaxOutputTokens","modalities","Modalities","capabilities","Capabilities","isDefault","IsDefault","sortOrder","SortOrder","Pricing","credits","Credits","maxAllowedSize","MaxAllowedSize","disabledMultimodal","DisabledMultimodal","supportsImages","SupportsImages","supportsToolCall","SupportsToolCall","supportsReasoning","SupportsReasoning","onlyReasoning","OnlyReasoning","reasoning","Reasoning","temperature","Temperature","top_k","Top_K","top_p","Top_P","repetition_penalty","Repetition_Penalty","ModelsAPI","baseUrl","fetch","list","signal","response","method","headers","Accept","err","Error","name","CloudOpenAIError","message","type","param","code","cause","ok","httpError","text","parsed","JSON","parse","rawModels","Array","isArray","data","models","raw","normalized","normalizeModel","push","catch","errorObj","error","e","status","undefined","requestId","get","retryAfterMs","parseRetryAfter","SSEDecoder","event","dataParts","decode","line","l","endsWith","slice","length","ev","data","join","startsWith","colonIdx","indexOf","field","value","rest","push","flush","LineDecoder","buffer","Uint8Array","decoder","TextDecoder","chunk","newData","set","lines","start","i","lineBytes","subarray","stream","remaining","SSE_DONE","iterSSEEvents","body","signal","sseDecoder","lineDecoder","reader","getReader","aborted","onAbort","cancel","catch","addEventListener","once","result","read","err","Error","name","done","finalEv","removeEventListener","releaseLock","extractSSEError","data","requestId","init","parsed","JSON","parse","errorObj","error","CloudOpenAIError","message","type","param","undefined","code","ChatCompletionsAPI","baseUrl","fetch","create","input","stream","createStreaming","signal","conversationId","body","response","method","headers","Accept","stringify","err","Error","name","cause","ok","httpError","get","receivedDone","threw","sseEvent","iterSSEEvents","event","SSE_DONE","chunk","errObj","aborted","LlmModule","baseUrl","models","chat","config","fetch","endpoint","CLOUD_MODULE_PATHS","llm","ModelsAPI","completions","ChatCompletionsAPI","StorageError","Error","__isStorageError","namespace","status","statusCode","message","name","toJSON","isStorageError","error","StorageApiError","code","StorageUnknownError","originalError","setHeader","headers","name","value","result","nameLower","toLowerCase","key","Object","keys","normalizeHeaders","entries","resolveFetch","customFetch","args","fetch","isPlainObject","value","prototype","Object","getPrototypeOf","Symbol","toStringTag","iterator","recursiveToCamel","item","Array","isArray","map","el","result","entries","forEach","key","newKey","replace","c","toUpperCase","encodeStoragePath","path","split","map","encodeURIComponent","join","_getErrorMessage","err","e","msg","message","error_description","error","nested","JSON","stringify","handleError","reject","options","namespace","isResponseLike","json","responseError","status","parseInt","String","Number","isFinite","then","statusCode","code","StorageApiError","catch","statusText","StorageUnknownError","_getRequestParams","method","parameters","body","params","headers","isPlainObject","contentType","key","value","Object","entries","toLowerCase","setHeader","duplex","_handleRequest","fetcher","url","Promise","resolve","result","ok","noResolveJson","get","contentLength","includes","data","createFetchApi","undefined","post","put","head","remove","defaultApi","vectorsApi","BaseApiClient","url","headers","fetch","shouldThrowOnError","namespace","normalizeHeaders","resolveFetch","throwOnError","setHeader","name","value","setHeaderUtil","handleOperation","operation","data","error","isStorageError","StreamDownloadBuilder","Symbol","toStringTag","promise","downloadFn","shouldThrowOnError","then","onfulfilled","onrejected","getPromise","catch","finally","onfinally","execute","result","data","body","error","isStorageError","BlobDownloadBuilder","Symbol","toStringTag","promise","downloadFn","shouldThrowOnError","asStream","StreamDownloadBuilder","then","onfulfilled","onrejected","getPromise","catch","finally","onfinally","execute","result","data","blob","error","isStorageError","DEFAULT_SEARCH_OPTIONS","limit","offset","sortBy","column","order","DEFAULT_FILE_OPTIONS","cacheControl","contentType","upsert","StorageFileApi","BaseApiClient","bucketId","url","headers","fetch","uploadOrUpdate","method","path","fileBody","fileOptions","handleOperation","body","options","String","metadata","Blob","FormData","append","encodeMetadata","has","toBase64","isStream","ReadableStream","pipe","duplex","key","value","Object","entries","setHeader","cleanPath","_removeEmptyFolders","_path","_getFinalPath","data","put","post","id","Id","fullPath","Key","upload","uploadToSignedUrl","token","URL","searchParams","set","toString","createSignedUploadUrl","get","StorageError","signedUrl","update","move","fromPath","toPath","sourceKey","destinationKey","destinationBucket","copy","createSignedUrl","expiresIn","hasTransform","transform","keys","length","query","URLSearchParams","download","cacheNonce","queryString","encodeURI","signedURL","createSignedUrls","paths","map","datum","parameters","wantsTransformation","renderPath","applyTransformOptsToQuery","downloadFn","noResolveJson","BlobDownloadBuilder","shouldThrowOnError","info","recursiveToCamel","exists","head","error","isStorageError","status","StorageApiError","StorageUnknownError","originalError","undefined","includes","getPublicUrl","publicUrl","remove","prefixes","purgeCache","encodeStoragePath","transformations","list","prefix","listV2","JSON","stringify","Buffer","from","btoa","replace","width","height","resize","format","quality","version","DEFAULT_HEADERS","version","RUNTIME_STORAGE_BUCKET","DEFAULT_SIGNED_URL_TTL_SECONDS","MAX_SIGNED_URL_TTL_SECONDS","CloudStoragePathError","Error","message","name","WorkBuddyStorageDownload","Symbol","toStringTag","blob","stream","asStream","then","onfulfilled","onrejected","catch","finally","onfinally","WorkBuddyStorageBucket","fileApi","upload","path","body","options","mapStorageResult","validateObjectPath","update","list","prefix","validateObjectPrefix","listPage","listV2","info","exists","result","error","data","normalizeStorageError","download","builder","remove","paths","length","map","copy","fromPath","toPath","move","createSignedUrl","expiresIn","validateSignedURLTTL","createSignedUrls","createSignedUploadUrl","upsert","uploadToSignedUrl","token","WorkBuddyStorageModule","runtime","client","storageClient","runtimeApi","from","bucketID","userPath","userID","relativePath","scopedPath","sharedPath","ownerID","createStorageModule","config","fetch","StorageFileApi","endpoint","CLOUD_MODULE_PATHS","storage","DEFAULT_HEADERS","scope","owner","validatePathSegment","relative","validatePath","normalized","includes","rest","split","allowTrailingSlash","trim","decoded","index","next","decodeURIComponent","startsWith","endsWith","replace","segments","some","segment","value","label","Number","isInteger","source","status","statusCode","code","cause","String","WorkBuddyCloudClient","database","auth","storage","llm","config","options","AuthModule","createCloudFetch","anonymousTokenProvider","fetch","getAccessToken","createDatabaseModule","createStorageModule","LlmModule","endpoint","oauthRelayBaseUrl","createWorkBuddyCloud","resolveRuntimeConfig","MiniProgramHeaders","map","Map","init","key","value","set","Array","isArray","Headers","forEach","Object","entries","String","normalize","name","toLowerCase","get","has","append","existing","delete","callback","toPlainObject","fromEntries","DEFAULT_MAX_BUFFERED_BYTES","MiniProgramReadableStream","queue","queuedBytes","maxBufferedBytes","closed","error","pendingResolve","pendingReject","cancelled","options","push","chunk","byteLength","abort","Error","resolve","done","close","err","length","reject","getReader","read","Promise","shift","cancel","releaseLock","isStreamingSupported","globalThis","ReadableStream","ensureMiniProgramPolyfills","g","headersToPlainObject","headers","Headers","out","forEach","value","key","Array","isArray","Object","fromEntries","isStreamingRequest","accept","buildResponse","params","status","ok","bodyText","unsupportedBinaryBody","method","Promise","reject","Error","response","statusText","body","stream","text","resolve","json","JSON","parse","error","blob","arrayBuffer","createMiniProgramFetch","wxInstance","globalThis","wx","ensureMiniProgramPolyfills","miniProgramFetch","input","init","url","toUpperCase","reqHeaders","streaming","requestBody","undefined","signal","aborted","err","name","task","request","header","data","responseType","success","result","statusCode","stringify","fail","errMsg","addEventListener","abort","once","MiniProgramReadableStream","resolved","receivedHeaders","options","enableChunked","isSuccessStatus","close","onHeadersReceived","headerResult","onChunkReceived","chunk","push","Uint8Array","createMiniProgramStorage","wxInstance","globalThis","wx","Error","getItem","key","value","getStorageSync","undefined","JSON","stringify","err","console","warn","setItem","setStorageSync","removeItem","removeStorageSync","createMiniProgramWorkBuddyCloud","options","wxInstance","wx","globalThis","Error","ensureMiniProgramPolyfills","createWorkBuddyCloud","endpoint","oauthRelayBaseUrl","publishableKey","fetch","createMiniProgramFetch","storage","createMiniProgramStorage"]}